diff --git a/.gitignore b/.gitignore index a1c2a238..eb093082 100644 --- a/.gitignore +++ b/.gitignore @@ -1,23 +1,3 @@ -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* +/build +/.gradle +.idea \ No newline at end of file diff --git a/README.md b/README.md index a84ca395..78832267 100644 --- a/README.md +++ b/README.md @@ -1 +1,44 @@ -# JavaDoc \ No newline at end of file + +# About + +> :smirk: 该项目主要是通过 JavaDoc API 读取 class 中的信息 (注释、方法名、参数、返回值等),方便大家通过了解 JavaDoc API 并能够实现节省时间、提高效率的工具 + +> 编写该项目主要是提高效率,方便自己工具类项目生成 API 以及检测代码规范、中英字符间距、@param、@return 等容易遗漏且复杂耗时的操作 + +- 生成效果示范 [DevApp - API](https://github.com/afkT/DevUtils/blob/master/lib/DevApp/README.md) + + + +# [JavaDoc](https://github.com/afkT/JavaDoc) + +#### 使用演示类 [JavaDocMain](https://github.com/afkT/JavaDoc/blob/master/src/main/java/javadoc/api/JavaDocMain.java) 介绍了使用方法,以及可获取信息 + +#### 项目类结构 - [包目录](https://github.com/afkT/JavaDoc/blob/master/src/main/java/javadoc/api) + +- Class 信息读取类([JavaDocReader](https://github.com/afkT/JavaDoc/blob/master/src/main/java/javadoc/api/JavaDocReader.java)):核心类,Class 信息都通过该类 API 读取 + + + +# 代码排版 + +> 代码、注释间距规范检测通过第三方类 pangu.java 进行检测 + +- [Github - vinta/pangu.java](https://github.com/vinta/pangu.java) + +- [中文文案排版指北 - 简书](https://www.jianshu.com/p/a05ecfe0fea5#%E4%B8%AD%E8%8B%B1%E6%96%87%E4%B9%8B%E9%97%B4%E9%9C%80%E8%A6%81%E5%A2%9E%E5%8A%A0%E7%A9%BA%E6%A0%BC) + + + +# DevUtils API 生成 + +#### 项目类结构 - [包目录](https://github.com/afkT/JavaDoc/blob/master/src/main/java/javadoc/dev_utils) + +- DevUtils API 生成实现代码([API Generate](https://github.com/afkT/JavaDoc/blob/master/src/main/java/javadoc/dev_utils/assist)):该包下的类,有各自的作用主要用于生成 DevUtils API 文档 + +- DevUtils 代码规范检测([Code Checker](https://github.com/afkT/JavaDoc/blob/master/src/main/java/javadoc/dev_utils/check)):该包下的类,主要检测是否缺少注释、@param、@return、重复换行等代码,并且支持注释间距检测覆盖操作 + +- API 生成配置信息([API Config](https://github.com/afkT/JavaDoc/blob/master/src/main/java/javadoc/dev_utils/ApiConfig.java)):配置生成 API 相关信息,以及忽略指定类、方法的配置等 + +- DevApp API README 生成执行方法([DevApp API README](https://github.com/afkT/JavaDoc/blob/master/src/main/java/javadoc/dev_utils/readme/DevApp_READMEMain.java)):按 API Config 信息生成 API 文档 + +- DevJava API README 生成执行方法([DevJava API README](https://github.com/afkT/JavaDoc/blob/master/src/main/java/javadoc/dev_utils/readme/DevJava_READMEMain.java)):按 API Config 信息生成 API 文档 \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 00000000..2171440c --- /dev/null +++ b/build.gradle @@ -0,0 +1,31 @@ +group 'pro' +version '1.0-SNAPSHOT' + +apply plugin: 'java' + +sourceCompatibility = 1.8 + +repositories { + // bintray maven + maven { url 'https://dl.bintray.com/afkt/maven' } + + mavenCentral() + jcenter() +} + +dependencies { + // 加载 libs 文件夹全部 jar + compile fileTree(dir: 'libs', include: ['*.jar']) + // Gson 解析 + compile 'com.google.code.gson:gson:2.8.2' + // DevJava + compile 'com.afkt:DevJava:1.2.0' + + // tools.jar 的依赖 + compile files(org.gradle.internal.jvm.Jvm.current().toolsJar) +} + +// 全局编码设置 +tasks.withType(JavaCompile) { + options.encoding = "UTF-8" +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 00000000..9f958876 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 00000000..342d8d0b --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Sun Jun 07 02:10:03 CST 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME \ No newline at end of file diff --git a/gradlew b/gradlew new file mode 100644 index 00000000..4453ccea --- /dev/null +++ b/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: 0ドル may be a link +PRG="0ドル" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*'> /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/">/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED">/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "0ドル"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn ( ) { + echo "$*" +} + +die ( ) { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java>/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save ( ) { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "0ドル")" +fi + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 00000000..f9553162 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version>NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/settings.gradle b/settings.gradle new file mode 100644 index 00000000..257822ca --- /dev/null +++ b/settings.gradle @@ -0,0 +1 @@ +rootProject.name = 'JavaDoc' \ No newline at end of file diff --git a/src/main/java/javadoc/Utils.java b/src/main/java/javadoc/Utils.java new file mode 100644 index 00000000..47e9ee58 --- /dev/null +++ b/src/main/java/javadoc/Utils.java @@ -0,0 +1,330 @@ +package javadoc; + +import com.google.gson.GsonBuilder; +import dev.utils.JCLogUtils; +import dev.utils.common.ArrayUtils; +import dev.utils.common.MapUtils; +import dev.utils.common.StringUtils; + +import java.io.File; +import java.util.*; + +/** + * detail: 内部工具类 + * @author Ttt + */ +public final class Utils { + + private Utils() { + } + + static { + JCLogUtils.setPrintLog(true); + JCLogUtils.setControlPrintLog(true); +// JCLogUtils.setPrint(new JCLogUtils.Print() { +// @Override +// public void printLog(int logType, String tag, String message) { +// System.out.println(tag + " : " + message); +// } +// }); + } + + /** + * 获取文件列表 + * @param path 文件路径 + * @return 文件列表 + */ + public static List getFileLists(final String path) { + List lists = new ArrayList(); + // 获取文件路径 + File baseFile = new File(path); + // 获取子文件 + File[] files = baseFile.listFiles(); + for (File file : files) { + // 属于文件才处理 + if (file.isFile()) { + lists.add(file); + } + } + return lists; + } + + /** + * 获取文件目录列表 + * @param path 文件路径 + * @return 文件目录列表 + */ + public static List getFileCatalogLists(final String path) { + List lists = new ArrayList(); + try { + // 获取文件路径 + File baseFile = new File(path); + // 获取子文件 + File[] files = baseFile.listFiles(); + for (File file : files) { + lists.add(file); + } + } catch (Exception e) { + e.printStackTrace(); + } + return lists; + } + + /** + * HashMap 排序 + * @param map {@link Map} + * @return 排序后的 Map + */ + public static Map> sortHashMap(final Map> map) { + Map> sortedMap = new LinkedHashMap(); + List list = new ArrayList(); + Iterator item = map.keySet().iterator(); + while (item.hasNext()) { + list.add(item.next()); + } + Collections.sort(list); + Iterator item2 = list.iterator(); + while (item2.hasNext()) { + String key = item2.next(); + sortedMap.put(key, map.get(key)); + } + return sortedMap; + } + + /** + * HashSet 排序 + * @param set {@link Set} + * @return 排序后的 Set + */ + public static Set sortHashSet(final Set set) { + List list = new ArrayList(); + Iterator item = set.iterator(); + while (item.hasNext()) { + list.add(item.next()); + } + Collections.sort(list); + return new LinkedHashSet(list); + } + + /** + * 生成 Map 字符串 + * @param map {@link HashMap} + * @param mapName map 变量名 + * @return 生成指定格式字符串 + */ + public static String generateMapString(final HashMap> map, final String mapName) { + StringBuilder builder = new StringBuilder(); + // HashMap 排序 + Map> sortHashMap = sortHashMap(map); + // 空格前缀 + String space = " "; + // 格式化字符串 + String format = space + "%s.put(\"%s\", Utils.asListArgs(%s));"; + // 循环处理 + for (String className : sortHashMap.keySet()) { + List lists = sortHashMap.get(className); + // 格式化追加 + builder.append(String.format(format, mapName, className, + ArrayUtils.appendToString(lists.toArray(new String[]{})))); + builder.append(StringUtils.NEW_LINE_STR); + } + // 用于生成 Config 特殊处理 + builder.delete(0, space.length()); + return builder.toString(); + } + + /** + * 生成 Set 字符串 + * @param set {@link HashSet} + * @param mapName map 变量名 + * @return 生成指定格式字符串 + */ + public static String generateSetString(final Set set, final String mapName) { + StringBuilder builder = new StringBuilder(); + // HashMap 排序 + Set sortHashMap = sortHashSet(set); + // 空格前缀 + String space = " "; + // 格式化字符串 + String format = space + "%s.remove(\"%s\");"; + // 循环处理 + for (String className : sortHashMap) { + // 格式化追加 + builder.append(String.format(format, mapName, className)); + builder.append(StringUtils.NEW_LINE_STR); + } + // 用于生成 Config 特殊处理 + builder.delete(0, space.length()); + return builder.toString(); + } + + // ======== + // = Gson = + // ======== + + /** + * 创建 GsonBuilder + * @param serializeNulls 是否序列化null值 + * @return {@link GsonBuilder} + */ + private static GsonBuilder createGson(final boolean serializeNulls) { + final GsonBuilder builder = new GsonBuilder(); + if (serializeNulls) builder.serializeNulls(); + return builder; + } + + /** + * 转换 JSON 格式数据, 并且格式化 + * @param data 待转换对象 + * @param includeNulls 是否序列化null值 + * @return 格式化 JSON 数据 + */ + public static String toJsonFormat(final Object data, final boolean includeNulls) { + if (data != null) { + try { + // 返回 JSON格式数据 - 格式化 + return createGson(includeNulls).setPrettyPrinting().create().toJson(data); + } catch (Exception e) { + e.printStackTrace(); + } + } + return ""; + } + + // ===================== + // = 临时等 DevJava 发包 = + // ===================== + + /** + * 转换数组为集合 + * @param array 数组 + * @param 泛型 + * @return {@link List} + */ + public static List asListArgs(final T... array) { + if (array != null) { + try { + return new ArrayList(Arrays.asList(array)); + } catch (Exception e) { + JCLogUtils.eTag(ArrayUtils.class.getSimpleName(), e, "asListArgs"); + } + } + return null; + } + + /** + * 添加一条数据 + * @param map 待添加 {@link Map} + * @param key key + * @param value value, add to list + * @param key + * @param value type + * @return {@code true} success, {@code false} fail + */ + public static boolean putToList(final Map> map, final K key, final T value) { + return putToList(map, key, value, true); + } + + /** + * 添加一条数据 + * @param map {@link Map} + * @param key key + * @param value value, add to list + * @param isNew 当指定 (key) 的 value 为 null, 是否创建 + * @param key + * @param value type + * @return {@code true} success, {@code false} fail + */ + public static boolean putToList(final Map> map, final K key, final T value, final boolean isNew) { + if (map != null) { + if (map.containsKey(key)) { + List lists = map.get(key); + if (lists != null) { + try { + lists.add(value); + map.put(key, lists); + return true; + } catch (Exception e) { + JCLogUtils.eTag(MapUtils.class.getSimpleName(), e, "putToList"); + } + } + } else { + // 判断是否创建 + if (isNew) { + try { + List lists = new ArrayList(); + lists.add(value); + map.put(key, lists); + return true; + } catch (Exception e) { + JCLogUtils.eTag(MapUtils.class.getSimpleName(), e, "putToList"); + } + } + } + } + return false; + } + + /** + * 移除多条数据 ( 通过 Map 进行移除 ) + * @param map {@link Map} + * @param removeMap {@link Map} 移除对比数据源 + * @param key + * @param value type + * @return {@code true} success, {@code false} fail + */ + public static boolean removeToMap(final Map> map, final Map> removeMap) { + return removeToMap(map, removeMap, true, false); + } + + /** + * 移除多条数据 ( 通过 Map 进行移除 ) + * @param map {@link Map} + * @param removeMap {@link Map} 移除对比数据源 + * @param removeEmpty 是否移除 null、长度为 0 的数据 + * @param isNullRemoveAll 如果待移除的 List 是 null, 是否移除全部 + * @param key + * @param value type + * @return {@code true} success, {@code false} fail + */ + public static boolean removeToMap(final Map> map, final Map> removeMap, + final boolean removeEmpty, final boolean isNullRemoveAll) { + if (map != null && removeMap != null) { + Iterator
    >> iterator = removeMap.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry> entry = iterator.next(); + // 获取 key + K key = entry.getKey(); + // 进行移除处理 + if (map.containsKey(key)) { + List value = entry.getValue(); + try { + if (value != null) { + map.get(key).removeAll(value); + } else { + if (isNullRemoveAll) { + map.remove(key); + } + } + } catch (Exception e) { + JCLogUtils.eTag(MapUtils.class.getSimpleName(), e, "removeToMap - removeAll"); + } + // 判断是否移除 null、长度为 0 的数据 + if (removeEmpty) { + List lists = map.get(key); + try { + // 不存在数据了, 则移除 + if (lists == null || lists.size() == 0) { + map.remove(key); + } + } catch (Exception e) { + JCLogUtils.eTag(MapUtils.class.getSimpleName(), e, "removeToMap"); + } + } + } + } + return true; + } + return false; + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/api/JavaDocMain.java b/src/main/java/javadoc/api/JavaDocMain.java new file mode 100644 index 00000000..a2bc9f36 --- /dev/null +++ b/src/main/java/javadoc/api/JavaDocMain.java @@ -0,0 +1,94 @@ +package javadoc.api; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.MethodDoc; +import com.sun.javadoc.RootDoc; + +import java.util.Arrays; + +/** + * detail: JavaDoc 读取演示 + * @author Ttt + */ +class JavaDocMain { + + public static void main(String[] args) { + // 文件路径 + final String path = "F:/Project/Android/Utils/DevUtils/lib/DevApp/src/main/java/dev/utils/common/assist/search/"; + // 类名 + final String className = "FileBreadthFirstSearchUtils.java"; + // 执行参数 + final String[] executeParams = JavaDocReader.getExecuteParams(true, path, className); + + // 读取文档 + String javaDcoData = JavaDocReader.readDoc(new JavaDocReader.CallBack() { + @Override + public String callback(String path, String className, RootDoc rootDoc, ClassDoc[] classDocs) { + StringBuffer buffer = new StringBuffer(); + buffer.append("\n\n"); + buffer.append("\n================"); + buffer.append("\n= 读取 JavaDoc ="); + buffer.append("\n================"); + buffer.append("\n"); + // 拼接信息 + buffer.append("\n文件路径: ").append(path + className) + .append("\n文件名字: ").append(className) + .append("\n执行参数: ").append(Arrays.toString(executeParams)); + + if (classDocs != null) { + StringBuffer classBuffer = new StringBuffer(); + // 循环 Class Doc 信息 + for (ClassDoc classDoc : classDocs) { + classBuffer.append("\n\n"); + classBuffer.append("\n= " + classDoc.name() + " =\n"); + // 包名.类名 + classBuffer.append("\n包名.类名: ").append(classDoc.toString()); + // 类注释 + classBuffer.append("\n类注释: ").append(classDoc.commentText()); + + // ========== + // = 读取方法 = + // ========== + + StringBuffer methodBuffer = new StringBuffer(); + // 获取方法 Doc 信息数组 + MethodDoc[] methodDocs = classDoc.methods(); + // 防止不存在方法 + if (methodDocs.length != 0) { + methodBuffer.append("\n\n| 方法信息 |"); + } + // 循环读取方法信息 + for (MethodDoc methodDoc : methodDocs) { + methodBuffer.append("\n"); + // 方法名 + methodBuffer.append("\n方法名: " + methodDoc.name()); + // 方法注释 + methodBuffer.append("\n方法注释: " + methodDoc.commentText()); + } + // 保存方法信息 + classBuffer.append(methodBuffer); + } + // 保存类信息 + buffer.append(classBuffer); + } + + buffer.append("\n\n"); + buffer.append("\n====================="); + buffer.append("\n= 读取 JavaDoc 结束 ="); + buffer.append("\n====================="); + buffer.append("\n"); + + // 返回文档信息 + return buffer.toString(); + } + + @Override + public void error(Exception e) { + System.out.println(e); + } + }, path, className, executeParams); + + // 打印文档信息 + System.out.println(javaDcoData); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/api/JavaDocReader.java b/src/main/java/javadoc/api/JavaDocReader.java new file mode 100644 index 00000000..39a6f672 --- /dev/null +++ b/src/main/java/javadoc/api/JavaDocReader.java @@ -0,0 +1,140 @@ +package javadoc.api; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.RootDoc; + +/** + * detail: JavaDoc 读取类 + * @author Ttt + */ +public final class JavaDocReader { + + private JavaDocReader() { + } + + // Doc 信息临时存储 + private static RootDoc mRoot; + + /** + * detail: 一个简单 Doclet, 收到 RootDoc 对象保存起来供后续使用 + * @author Ttt + */ + public static class Doclet { + + public Doclet() { + } + + /** + * Doclet 中, 方法 start 必须为静态 + * @param root {@link RootDoc} + * @return true + */ + public static boolean start(final RootDoc root) { + mRoot = root; + return true; + } + } + + // ============= + // = 回调通知接口 = + // ============= + + /** + * detail: 读取回调 + * @author Ttt + */ + public interface CallBack { + + /** + * 回调通知 + * @param path 文件路径 + * @param className 文件名 ( 类名 ) + * @param rootDoc 根 Doc 信息 + * @param classDocs 类 Doc 信息 + * @return 处理后的文档信息 + */ + String callback(String path, String className, RootDoc rootDoc, ClassDoc[] classDocs); + + /** + * 异常回调 + * @param e 异常信息 + */ + void error(Exception e); + } + + // ========== + // = 读取处理 = + // ========== + + /** + * 读取处理 + * @param callBack 读取回调 + * @param path 文件路径 + * @param className 文件名 ( 类名 ) + * @return 处理后的文档信息 + */ + private static String read(final CallBack callBack, final String path, final String className) { + // 类 Doc 信息 + ClassDoc[] classDocs = null; // 如果有内部类, 则长度大于 1, 否则为 1 ( 指定的 className) + // 防止为 null + if (mRoot != null) { + classDocs = mRoot.classes(); + } + // 触发回调 + if (callBack != null) { + return callBack.callback(path, className, mRoot, classDocs); + } + return null; + } + + // ============= + // = 对外提供方法 = + // ============= + + /** + * 读取文档处理 + * @param callBack 读取回调 + * @param path 文件路径 + * @param className 文件名 ( 类名 ) + * @param executeParams 执行参数 + * @return 处理后的文档信息 + */ + public static String readDoc(final CallBack callBack, final String path, final String className, final String[] executeParams) { + try { + // 调用 com.sun.tools.javadoc.Main 执行 javadoc, 具体参数百度搜索 + com.sun.tools.javadoc.Main.execute(executeParams); + // 进行读取 + return read(callBack, path, className); + } catch (Exception e) { + if (callBack != null) { + callBack.error(e); + } + } + return null; + } + + // = + + /** + * 创建执行参数 + *
    + * 根据自己的需求创建, 对应需要的执行参数
    + * 该方法, 主要是示范, 并且自用
    + * 
    + * @param readAll 是否读取全部 (-private 显示所有类和成员 ) + * @param path 文件路径 + * @param className 文件名 ( 类名 ) + * @return 执行参数 + */ + public static String[] getExecuteParams(final boolean readAll, final String path, final String className) { + if (readAll) { + return new String[]{ + "-private", "-encoding", "utf-8", + "-doclet", Doclet.class.getName(), path + className}; + } else { + return new String[]{ + "-encoding", "utf-8", + "-doclet", Doclet.class.getName(), path + className}; + } + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/ApiConfig.java b/src/main/java/javadoc/dev_utils/ApiConfig.java new file mode 100644 index 00000000..58bb9660 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/ApiConfig.java @@ -0,0 +1,451 @@ +package javadoc.dev_utils; + +import java.io.File; +import java.util.HashMap; + +/** + * detail: 配置信息 + * @author Ttt + */ +public final class ApiConfig { + + private ApiConfig() { + } + + // 项目名 + public static final String PROJECT_NAME = "DevUtils"; + // 文件保存路径 + public static final String FILE_SAVE_PATH = "D:/API/"; + // 本地路径 + public static final String LOCAL_PATH = "F:/Project/Android/Utils"; + // 项目路径 + public static final String PROJECT_PATH = LOCAL_PATH + File.separator + PROJECT_NAME; + + // 包目录名 + public static final String DEV_PACKAGE = "dev.utils"; + // 作者 Github 地址 + public static final String GITHUB_AUTHOR_URL = "https://github.com/afkT"; + // README API 文件名 + public static final String README_FILE_NAME = "README.md"; + // README_API 文件名 + public static final String README_API_FILE_NAME = "README_API.md"; + + // ========== + // = DevApp = + // ========== + + // DevApp API 文件保存路径 + public static final String DEV_APP_API_FILE_SAVE_PATH = FILE_SAVE_PATH + "DevApp/"; + // DevApp 文件路径 + public static final String DEV_APP_PATH = LOCAL_PATH + "/DevUtils/lib/DevApp/src/main/java/dev/"; + // DevApp Utils 文件路径 + public static final String DEV_APP_UTILS_PATH = DEV_APP_PATH + "utils/"; + // DevApp GitHub 项目文件路径 + public static final String DEV_APP_GITHUB_URL = GITHUB_AUTHOR_URL + "/DevUtils/blob/master/lib/DevApp/src/main/java/dev/utils/"; + // DevApp 版本号 + public static final String DEV_APP_VERSION = "2.0.8"; + + // =========== + // = DevJava = + // =========== + + // DevJava API 文件保存路径 + public static final String DEV_JAVA_API_FILE_SAVE_PATH = FILE_SAVE_PATH + "DevJava/"; + // DevJava 文件路径 + public static final String DEV_JAVA_PATH = LOCAL_PATH + "/DevUtils/lib/DevJava/src/main/java/dev/"; + // DevJava Utils 文件路径 + public static final String DEV_JAVA_UTILS_PATH = DEV_JAVA_PATH + "utils/"; + // DevJava GitHub 项目文件路径 + public static final String DEV_JAVA_GITHUB_URL = GITHUB_AUTHOR_URL + "/DevUtils/blob/master/lib/DevJava/src/main/java/dev/utils/"; + // DevJava 版本号 + public static final String DEV_JAVA_VERSION = "1.2.1"; + + // ============= + // = DevAssist = + // ============= + + // 包目录名 + public static final String DEV_ASSIST_PACKAGE = "dev"; + // DevAssist API 文件保存路径 + public static final String DEV_ASSIST_API_FILE_SAVE_PATH = FILE_SAVE_PATH + "DevAssist/"; + // DevAssist 文件路径 + public static final String DEV_ASSIST_PATH = LOCAL_PATH + "/DevUtils/lib/DevAssist/src/main/java/dev/"; + // DevAssist GitHub 项目文件路径 + public static final String DEV_ASSIST_GITHUB_URL = GITHUB_AUTHOR_URL + "/DevUtils/blob/master/lib/DevAssist/src/main/java/dev"; + // DevAssist 版本号 + public static final String DEV_ASSIST_VERSION = "1.0.4"; + + // ============ + // = DevOther = + // ============ + + // 包目录名 + public static final String DEV_OTHER_PACKAGE = "dev"; + // DevOther API 文件保存路径 + public static final String DEV_OTHER_API_FILE_SAVE_PATH = FILE_SAVE_PATH + "DevOther/"; + // DevOther 文件路径 + public static final String DEV_OTHER_PATH = LOCAL_PATH + "/DevUtils/lib/DevOther/src/main/java/dev/"; + // DevOther GitHub 项目文件路径 + public static final String DEV_OTHER_GITHUB_URL = GITHUB_AUTHOR_URL + "/DevUtils/blob/master/lib/DevOther/src/main/java/dev"; + + // ============= + // = DevWidget = + // ============= + + // 包目录名 + public static final String DEV_WIDGET_PACKAGE = "dev"; + // DevWidget API 文件保存路径 + public static final String DEV_WIDGET_API_FILE_SAVE_PATH = FILE_SAVE_PATH + "DevWidget/"; + // DevWidget 文件路径 + public static final String DEV_WIDGET_PATH = LOCAL_PATH + "/DevUtils/lib/DevWidget/src/main/java/dev/"; + // DevWidget GitHub 项目文件路径 + public static final String DEV_WIDGET_GITHUB_URL = GITHUB_AUTHOR_URL + "/DevUtils/blob/master/lib/DevWidget/src/main/java/dev"; + // DevWidget 版本号 + public static final String DEV_WIDGET_VERSION = "1.0.4"; + + // =========== + // = DevBase = + // =========== + + // 包目录名 + public static final String DEV_BASE_PACKAGE = "dev.base"; + // DevBase API 文件保存路径 + public static final String DEV_BASE_API_FILE_SAVE_PATH = FILE_SAVE_PATH + "DevBase/"; + // DevBase 文件路径 + public static final String DEV_BASE_PATH = LOCAL_PATH + "/DevUtils/lib/DevBase/src/main/java/dev/base/"; + // DevBase GitHub 项目文件路径 + public static final String DEV_BASE_GITHUB_URL = GITHUB_AUTHOR_URL + "/DevUtils/blob/master/lib/DevBase/src/main/java/dev/base"; + // DevBase 版本号 + public static final String DEV_BASE_VERSION = "1.0.0"; + + // =============== + // = DevBaseMVVM = + // =============== + + // 包目录名 + public static final String DEV_BASE_MVVM_PACKAGE = "dev.base"; + // DevBaseMVVM API 文件保存路径 + public static final String DEV_BASE_MVVM_API_FILE_SAVE_PATH = FILE_SAVE_PATH + "DevBaseMVVM/"; + // DevBaseMVVM 文件路径 + public static final String DEV_BASE_MVVM_PATH = LOCAL_PATH + "/DevUtils/lib/DevBaseMVVM/src/main/java/dev/base/"; + // DevBaseMVVM GitHub 项目文件路径 + public static final String DEV_BASE_MVVM_GITHUB_URL = GITHUB_AUTHOR_URL + "/DevUtils/blob/master/lib/DevBaseMVVM/src/main/java/dev/base"; + // DevBaseMVVM 版本号 + public static final String DEV_BASE_MVVM_VERSION = "1.0.0"; + + // =============== + // = DevStandard = + // =============== + + // 包目录名 + public static final String DEV_STANDARD_PACKAGE = "dev"; + // DevStandard API 文件保存路径 + public static final String DEV_STANDARD_API_FILE_SAVE_PATH = FILE_SAVE_PATH + "DevStandard/"; + // DevStandard 文件路径 + public static final String DEV_STANDARD_PATH = LOCAL_PATH + "/DevUtils/lib/DevStandard/src/main/java/dev/"; + // DevStandard GitHub 项目文件路径 + public static final String DEV_STANDARD_GITHUB_URL = GITHUB_AUTHOR_URL + "/DevUtils/blob/master/lib/DevStandard/src/main/java/dev"; + + // ======= + // = 其他 = + // ======= + + // 方法名规则 + public static final String sMethodNameRegex = "[A-Za-z]+[2][A-Za-z][A-Za-z0-9]+"; + + // ================== + // = DevApp、DevJava = + // ================== + + // 包名目录注释 + public static final HashMap sCatalogMap = new HashMap(); + // 忽略不保存的类 + public static final HashMap sFilterClassMap = new HashMap(); + // 忽略不保存的方法 + public static final HashMap sFilterMethodMap = new HashMap(); + + // ============= + // = DevAssist = + // ============= + + // 包名目录注释 + public static final HashMap sCatalogMap_Assist = new HashMap(); + // 忽略不保存的类 + public static final HashMap sFilterClassMap_Assist = new HashMap(); + // 忽略不保存的方法 + public static final HashMap sFilterMethodMap_Assist = new HashMap(); + + // ============ + // = DevOther = + // ============ + + // 包名目录注释 + public static final HashMap sCatalogMap_Other = new HashMap(); + // 忽略不保存的类 + public static final HashMap sFilterClassMap_Other = new HashMap(); + // 忽略不保存的方法 + public static final HashMap sFilterMethodMap_Other = new HashMap(); + + // ============ + // = DevOther = + // ============ + + // 包名目录注释 + public static final HashMap sCatalogMap_Base = new HashMap(); + + // ============= + // = DevWidget = + // ============= + + // 包名目录注释 + public static final HashMap sCatalogMap_Widget = new HashMap(); + // 忽略不保存的类 + public static final HashMap sFilterClassMap_Widget = new HashMap(); + // 忽略不保存的方法 + public static final HashMap sFilterMethodMap_Widget = new HashMap(); + + static { + // 初始化 包名目录注释 Map + initCatalogMap(); + // 初始化 忽略不保存的类 Map + initFilterClassMap(); + // 初始化 忽略不保存的方法 Map + initFilterMethodMap(); + // 初始化方法名正则表达式 + initMethodNameRegex(); + } + + // =============== + // = 内部初始化方法 = + // =============== + + /** + * 初始化 包名目录注释 Map + */ + private static void initCatalogMap() { + + // ================== + // = DevApp、DevJava = + // ================== + + sCatalogMap.put("dev.utils", "根目录"); + + // =========== + // = APP 目录 = + // =========== + + sCatalogMap.put(".app", "APP 相关工具类"); + sCatalogMap.put(".app.anim", "动画工具类"); + + sCatalogMap.put(".app.assist", "辅助类"); + sCatalogMap.put(".app.assist.manager", "管理器 如: TimerManager"); + + sCatalogMap.put(".app.cache", "缓存工具类"); + sCatalogMap.put(".app.camera1", "摄像头相关 android.hardware.Camera"); + sCatalogMap.put(".app.helper", "功能 Helper 辅助类"); + sCatalogMap.put(".app.image", "图片相关处理"); + sCatalogMap.put(".app.info", "APP 信息、PackageInfo 等"); + sCatalogMap.put(".app.logger", "日志库 DevLogger"); + sCatalogMap.put(".app.permission", "权限工具类"); + sCatalogMap.put(".app.player", "多媒体 ( 视频、音频 ) 播放封装"); + sCatalogMap.put(".app.share", "SharedPreferences 封装"); + + sCatalogMap.put(".app.toast", "Toast"); + sCatalogMap.put(".app.toast.toaster", "Toaster 处理无通知权限"); + + sCatalogMap.put(".app.wifi", "Wifi、热点工具类"); + + // ============== + // = Common 目录 = + // ============== + + sCatalogMap.put(".common", "Java 工具类, 不依赖 android api"); + sCatalogMap.put(".common.assist", "各种快捷辅助类"); + sCatalogMap.put(".common.assist.search", "搜索相关 ( 文件搜索等 )"); + sCatalogMap.put(".common.cipher", "编 / 解码工具类"); + sCatalogMap.put(".common.encrypt", "加密工具类"); + sCatalogMap.put(".common.file", "文件分片相关"); + sCatalogMap.put(".common.random", "随机概率算法工具类"); + sCatalogMap.put(".common.thread", "线程相关"); + sCatalogMap.put(".common.validator", "数据校验工具类"); + + // ============= + // = DevAssist = + // ============= + + sCatalogMap_Assist.put("dev", "根目录"); + sCatalogMap_Assist.put(".assist", "快捷功能辅助类"); + sCatalogMap_Assist.put(".assist.adapter", "Adapter 相关"); + sCatalogMap_Assist.put(".assist.multiselect", "多选模块"); + sCatalogMap_Assist.put(".assist.multiselect.edit", "多选编辑方法"); + sCatalogMap_Assist.put(".base", "基类相关"); + sCatalogMap_Assist.put(".callback", "回调相关"); + sCatalogMap_Assist.put(".callback.click", "点击回调"); + sCatalogMap_Assist.put(".callback.common", "通用回调"); + sCatalogMap_Assist.put(".callback.result", "操作结果回调"); + sCatalogMap_Assist.put(".engine", "兼容 Engine"); + sCatalogMap_Assist.put(".engine.http", "Http Engine"); + sCatalogMap_Assist.put(".engine.image", "Image Engine"); + sCatalogMap_Assist.put(".engine.json", "JSON Engine"); + sCatalogMap_Assist.put(".engine.log", "Log Engine"); + + // ============ + // = DevOther = + // ============ + + sCatalogMap_Other.put("dev", "根目录"); + sCatalogMap_Other.put(".assist", "常用辅助类封装"); + sCatalogMap_Other.put(".other", "第三方库封装工具类"); + sCatalogMap_Other.put(".other.okgo", "OkGo 网络请求"); + sCatalogMap_Other.put(".other.picture", "PictureSelector 图片选择库"); + sCatalogMap_Other.put(".other.retrofit", "Retrofit 网络请求"); + sCatalogMap_Other.put(".other.retrofit.response", "请求响应解析"); + sCatalogMap_Other.put(".other.retrofit.subscriber", "请求响应处理"); + sCatalogMap_Other.put(".receiver", "BroadcastReceiver 监听相关"); + sCatalogMap_Other.put(".service", "Service 相关"); + sCatalogMap_Other.put(".temp", "临时快捷调用工具类"); + + // ============= + // = DevWidget = + // ============= + + sCatalogMap_Widget.put("dev", "根目录"); + sCatalogMap_Widget.put(".widget", "自定义 View 根目录"); + sCatalogMap_Widget.put(".widget.adjust", "自动调节高度 View"); + sCatalogMap_Widget.put(".widget.assist", "View 辅助类"); + sCatalogMap_Widget.put(".widget.custom", "自定义 View"); + sCatalogMap_Widget.put(".widget.function", "需求功能 View"); + sCatalogMap_Widget.put(".widget.ui", "UI View"); + sCatalogMap_Widget.put(".widget.utils", "工具类目录"); + + // =========== + // = DevBase = + // =========== + + sCatalogMap_Base.put("dev.base", "根目录"); + sCatalogMap_Base.put(".able", "基类库接口相关"); + sCatalogMap_Base.put(".activity", "核心 Base Activity 代码"); + sCatalogMap_Base.put(".expand", "基于 Base Activity、Fragment 扩展包"); + sCatalogMap_Base.put(".expand.content", "Content Layout 基类"); + sCatalogMap_Base.put(".expand.mvp", "MVP 架构基类"); + sCatalogMap_Base.put(".expand.viewbinding", "ViewBinding 基类"); + sCatalogMap_Base.put(".fragment", "核心 Base Fragment 代码"); + sCatalogMap_Base.put(".utils", "依赖工具包"); + sCatalogMap_Base.put(".utils.assist", "功能辅助类 ( 抽取通用代码 )"); + } + + /** + * 初始化 忽略不保存的类 Map + */ + private static void initFilterClassMap() { + + // ================== + // = DevApp、DevJava = + // ================== + + // ======= + // = APP = + // ======= + + sFilterClassMap.put("IPrinter.java", ""); + sFilterClassMap.put("IPreference.java", ""); + sFilterClassMap.put("IToast.java", ""); + sFilterClassMap.put("DefaultToastStyle.java", ""); + sFilterClassMap.put("WifiVo.java", ""); + + // ========== + // = Common = + // ========== + + sFilterClassMap.put("Cipher.java", ""); + sFilterClassMap.put("Decrypt.java", ""); + sFilterClassMap.put("Encrypt.java", ""); + + // ============= + // = DevAssist = + // ============= + } + + /** + * 初始化 忽略不保存的方法 Map + */ + private static void initFilterMethodMap() { + + // ================== + // = DevApp、DevJava = + // ================== + + // ======= + // = APP = + // ======= + + sFilterMethodMap.put("ActivityUtils.java", new String[]{"onStartActivityForResult", "onActivityResult", "start", "onCreate", "onDestroy"}); + sFilterMethodMap.put("PermissionUtils.java", new String[]{"start", "onCreate", "onGranted", "onDenied"}); + sFilterMethodMap.put("WifiHotUtils.java", new String[]{"onStarted", "onStopped", "onFailed"}); + sFilterMethodMap.put("HandlerUtils.java", new String[]{"onEnd"}); + sFilterMethodMap.put("OnLocationChangeListener.java", new String[]{"getLastKnownLocation", "onLocationChanged", "onStatusChanged"}); + sFilterMethodMap.put("SizeUtils.java", new String[]{"onGetSize"}); + sFilterMethodMap.put("KeyBoardUtils.java", new String[]{"onSoftInputChanged"}); + sFilterMethodMap.put("DevMediaManager.java", new String[]{"onPrepared", "onCompletion", "onBufferingUpdate", "onSeekComplete", "onError", "onVideoSizeChanged", "isLooping", "setMediaConfig"}); + sFilterMethodMap.put("DevVideoPlayerControl.java", new String[]{"onPrepared", "onCompletion", "onBufferingUpdate", "onSeekComplete", "onError", "onVideoSizeChanged", "isLooping", "setMediaConfig", "surfaceChanged", "surfaceCreated", "surfaceDestroyed"}); + sFilterMethodMap.put("CameraAssist.java", new String[]{"stopPreviewNotify", "startPreviewNotify"}); + sFilterMethodMap.put("ImageUtils.java", new String[]{"getValue"}); + sFilterMethodMap.put("ToastUtils.java", new String[]{"filter", "handlerContent"}); + sFilterMethodMap.put("AnalysisRecordUtils.java", new String[]{"callback"}); + sFilterMethodMap.put("AsyncExecutor.java", new String[]{"doInBackground", "onPostExecute", "onCanceled", "abort"}); + sFilterMethodMap.put("ToastTintUtils.java", new String[]{"getTextColor", "getTextSize", "getBackgroundTintColor", "getBackground", "getMaxLines", "getEllipsize", "getTypeface", "getTintIconColor", "isTintIcon", "filter", "handlerContent"}); + sFilterMethodMap.put("EditTextUtils.java", new String[]{"getMarkId", "isOperate", "setOperate", "getOperateState", "setOperateState", "getType", "setType", "beforeTextChanged", "onTextChanged", "afterTextChanged"}); + sFilterMethodMap.put("AutoFocusAssist.java", new String[]{"onAutoFocus"}); + sFilterMethodMap.put("PhoneUtils.java", new String[]{"printInfo"}); + sFilterMethodMap.put("ROMUtils.java", new String[]{"getName", "getVersion", "toString"}); + sFilterMethodMap.put("DialogUtils.java", new String[]{"onLeftButton", "onRightButton", "onDismiss", "onSingleChoiceItems", "onPositiveButton", "onCancel", "onMultiChoiceItems"}); + sFilterMethodMap.put("SnackbarUtils.java", new String[]{"getRootGravity", "setRootGravity", "getRootCornerRadius", "setRootCornerRadius", "getRootBackgroundTintColor", "setRootBackgroundTintColor", "getRootBackground", "setRootBackground", "getRootMargin", "setRootMargin", "getRootAlpha", "setRootAlpha", "getTextGravity", "setTextGravity", "getTextColor", "setTextColor", "getTextSize", "setTextSize", "getTextMaxLines", "setTextMaxLines", "getTextEllipsize", "setTextEllipsize", "getTextTypeface", "setTextTypeface", "getTextPadding", "setTextPadding", "getActionGravity", "setActionGravity", "getActionColor", "setActionColor", "getActionSize", "setActionSize", "getActionPadding", "setActionPadding", "getActionCornerRadius", "setActionCornerRadius", "getActionBackgroundTintColor", "setActionBackgroundTintColor", "getActionBackground", "setActionBackground"}); + sFilterMethodMap.put("ClickUtils.java", new String[]{"onClick", "doClick", "doInvalidClick", "getCount", "getInvalidCount", "getInvalidCycleNumber"}); + sFilterMethodMap.put("ScreenshotUtils.java", new String[]{"onScreenshot", "onChange", "onChecker"}); + + // ========== + // = Common = + // ========== + + sFilterMethodMap.put("FileBreadthFirstSearchUtils.java", new String[]{"isHandlerFile", "isAddToList", "OnEndListener"}); + sFilterMethodMap.put("FileDepthFirstSearchUtils.java", new String[]{"isHandlerFile", "isAddToList", "OnEndListener"}); + sFilterMethodMap.put("FileUtils.java", new String[]{"onReplace", "getSubFiles"}); + sFilterMethodMap.put("FileRecordUtils.java", new String[]{"callback"}); + sFilterMethodMap.put("HttpURLConnectionUtils.java", new String[]{"onResponse", "onFail"}); + sFilterMethodMap.put("TimeKeeper.java", new String[]{"onEnd"}); + sFilterMethodMap.put("TypeUtils.java", new String[]{"getActualTypeArguments", "getOwnerType", "getRawType", "equals", "hashCode"}); + sFilterMethodMap.put("CollectionUtils.java", new String[]{"put", "create"}); + sFilterMethodMap.put("ScaleUtils.java", new String[]{"getXYx", "getXY", "compareTo"}); + sFilterMethodMap.put("ColorUtils.java", new String[]{"toString"}); + sFilterMethodMap.put("KeyValueBean.java", new String[]{"toString"}); + sFilterMethodMap.put("CalendarUtils.java", new String[]{"compareTo", "toString", "hook"}); + + // ============= + // = DevAssist = + // ============= + + sFilterMethodMap_Assist.put("EditTextWatcherAssist.java", new String[]{"onTextChanged"}); + sFilterMethodMap_Assist.put("NumberControlAssist.java", new String[]{"onPrepareChanged", "onNumberChanged"}); + + // ============= + // = DevWidget = + // ============= + + sFilterMethodMap_Widget.put("ViewAssist.java", new String[]{"onRemove", "onNotFound", "onChange", "onCreateView", "onBindView"}); + sFilterMethodMap_Widget.put("StateLayout.java", new String[]{"onRemove", "onNotFound", "onChange", "onCreateView", "onBindView"}); + } + + /** + * 初始化方法名正则表达式 + */ + private static void initMethodNameRegex() { +// // 中间包含数字 2 +// sMethodNameRegex = ".*2+.*"; +// // 属于 xxx数字xxx +// sMethodNameRegex = "[A-Za-z]+[0-9][A-Za-z]+"; +// // 属于 xxx2(xxx数字) +// sMethodNameRegex = "[A-Za-z]+[2][A-Za-z0-9]+"; +// // 属于 xxx2x xx数字 +// sMethodNameRegex = "[A-Za-z]+[2][A-Za-z][A-Za-z0-9]+"; + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/assist/APIGenerate.java b/src/main/java/javadoc/dev_utils/assist/APIGenerate.java new file mode 100644 index 00000000..b2df8f44 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/assist/APIGenerate.java @@ -0,0 +1,80 @@ +package javadoc.dev_utils.assist; + +import dev.utils.common.StringUtils; +import javadoc.Utils; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +/** + * detail: Api 生成 + * @author Ttt + */ +public class APIGenerate { + + /** + * 快捷生成方法 + * @param module 模块名 + * @param path 文件路径 + * @param packageName 包名 + * @param githubUrl Github 链接地址 + * @param filterClassMap 忽略不保存的类 Map + * @param filterMethodMap 忽略不保存方法 Map + * @param methodNameRegex 方法名匹配正则表达式 + * @param methodNameMatchesMap 方法名匹配存储 Map + * @param methodRepeatBuffer 方法名重复记录存储 Buffer + * @param methodNotAnnotateBuffer 方法没有注释记录存储 Buffer + * @param notMethodBuffer 类不存在方法记录存储 Buffer + * @return API 生成信息 + */ + public static String apiGenerate(final String module, final String path, final String packageName, final String githubUrl, + final HashMap filterClassMap, + final HashMap filterMethodMap, + final String methodNameRegex, + final HashMap> methodNameMatchesMap, + final StringBuffer methodRepeatBuffer, + final StringBuffer methodNotAnnotateBuffer, + final StringBuffer notMethodBuffer) { + // 文件路径 + String apiPath = path + module + "/"; + // 包名 + String apiPackageName = packageName + "." + module; + // Github 链接地址 + String apiGitHubUrl = githubUrl + module + "/"; + + // 特殊处理 + if (StringUtils.isEmpty(module)) { + apiPackageName = packageName; + } + + // 拼接对象 + StringBuffer buffer = new StringBuffer(); + // 设置锚链接标记 => ## **`包名`** + buffer.append("\n## **`" + apiPackageName + "`**"); + + // 获取全部文件夹 + List lists = Utils.getFileLists(apiPath); + // 循环子文件 + for (File file : lists) { + // 获取类名 + String className = file.getName(); + // 等于 null 才处理 => 不为 null, 则表示需要忽略 + if (filterClassMap.get(className) == null) { + // 原始路径 + String root = apiPath; + // 获取 MarkDown 格式 dev.utils + String apiMarkDown = APIReader.readDoc(root, className, apiGitHubUrl + className, filterMethodMap, + methodNameRegex, methodNameMatchesMap, methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + // 拼接保存 + buffer.append(apiMarkDown); + } + } + // 保存 module 目录下的文件夹子节点 + buffer.append(APIGenerateByModule.apiGenerate(apiPath, apiPackageName, apiGitHubUrl, + filterClassMap, filterMethodMap, methodNameRegex, methodNameMatchesMap, + methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer)); + // 返回对应模块的 API 信息 + return buffer.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/assist/APIGenerateByModule.java b/src/main/java/javadoc/dev_utils/assist/APIGenerateByModule.java new file mode 100644 index 00000000..6222ae00 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/assist/APIGenerateByModule.java @@ -0,0 +1,194 @@ +package javadoc.dev_utils.assist; + +import javadoc.Utils; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 功能模块 API 生成 + * @author Ttt + */ +final class APIGenerateByModule { + + private APIGenerateByModule() { + } + + // ================== + // = 文件目录遍历实体类 = + // ================== + + /** + * detail: 子级节点实体类 + * @author Ttt + */ + private static class Subnode { + + // 文件夹对象 + private File subFile; + // 文件夹内的子文件列表 + private List listSubs; + + /** + * 构造函数 + * @param file 文件夹对象 + * @param lists 文件夹内的子文件列表 + */ + public Subnode(File file, List lists) { + this.subFile = file; + this.listSubs = lists; + } + + /** + * 获取文件夹对象 + * @return {@link File} + */ + public File getSubFile() { + return subFile; + } + + /** + * 获取文件夹内的子文件列表 + * @return {@link List} + */ + public List getListSubs() { + return listSubs; + } + } + + /** + * 获取文件夹目录列表 + * @param path 文件路径 + * @return 文件夹目录列表集合 + */ + private static List getFolderLists(final String path) { + List lists = new ArrayList(); + // 获取文件路径 + File baseFile = new File(path); + // 获取子文件 + File[] files = baseFile.listFiles(); + for (File file : files) { + // 属于文件夹才处理 + if (file.isDirectory()) { + Subnode subnode = new Subnode(file, getFolderLists(file.getAbsolutePath())); + lists.add(subnode); + } + } + return lists; + } + + // ========== + // = 内部方法 = + // ========== + + /** + * 递归循环子节点 + * @param buffer 拼接 Buffer + * @param lists 子级节点列表 + * @param path 文件路径 + * @param packageName 包名 + * @param githubUrl Github 链接地址 + * @param filterClassMap 忽略不保存的类 Map + * @param filterMethodMap 忽略不保存方法 Map + * @param methodNameRegex 方法名匹配正则表达式 + * @param methodNameMatchesMap 方法名匹配存储 Map + * @param methodRepeatBuffer 方法名重复记录存储 Buffer + * @param methodNotAnnotateBuffer 方法没有注释记录存储 Buffer + * @param notMethodBuffer 类不存在方法记录存储 Buffer + */ + private static void forSubnode(final StringBuffer buffer, final List lists, + final String path, final String packageName, final String githubUrl, + final HashMap filterClassMap, + final HashMap filterMethodMap, + final String methodNameRegex, + final HashMap> methodNameMatchesMap, + final StringBuffer methodRepeatBuffer, + final StringBuffer methodNotAnnotateBuffer, + final StringBuffer notMethodBuffer) { + // 循环遍历 + for (int i = 0, len = lists.size(); i < len; i++) { + // 获取子节点 + Subnode subnode = lists.get(i); + // 获取目录名 + String name = subnode.getSubFile().getName(); + + // 设置锚链接标记 => ## **`包名`** + buffer.append("\n\n\n## **`" + (packageName + "." + name) + "`**"); + + // 获取全部文件夹 + List listFiles = Utils.getFileLists((path + "/" + name)); + // 循环子节点文件 + for (File file : listFiles) { + // 获取类名 + String className = file.getName(); + // 等于 null 才处理 => 不为 null, 则表示需要忽略 + if (filterClassMap.get(className) == null) { + // 原始路径 + String root = (path + "/" + name) + "/"; + // 拼接最后点击 url + String clickUrl = githubUrl + "/" + name + "/" + className; + // 防止有多余的 / + if (clickUrl.lastIndexOf("//")> 6) { // https:// 大于 6 位表示还有除 https:// 外的 // + // 保存替换后的内容 + clickUrl = clickUrl.replaceAll("//", "/"); + // 进行处理 + StringBuffer urlBuffer = new StringBuffer(clickUrl); + urlBuffer.insert(6, "/"); + clickUrl = urlBuffer.toString(); + } + // 获取 MarkDown 格式 dev.utils + String apiMarkDown = APIReader.readDoc(root, className, clickUrl, filterMethodMap, + methodNameRegex, methodNameMatchesMap, methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + // 拼接保存数据 + buffer.append(apiMarkDown); + } + } + + // 判断是否存在子文件夹 + if (subnode.getListSubs().size() != 0) { + forSubnode(buffer, subnode.getListSubs(), + path + "/" + name, packageName + "." + name, githubUrl + "/" + name, + filterClassMap, filterMethodMap, methodNameRegex, methodNameMatchesMap, + methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + } + } + } + + // ============= + // = 对外公开方法 = + // ============= + + /** + * 生成指定模块 API 数据 + * @param path 文件路径 + * @param packageName 包名 + * @param githubUrl Github 链接地址 + * @param filterClassMap 忽略不保存的类 Map + * @param filterMethodMap 忽略不保存方法 Map + * @param methodNameRegex 方法名匹配正则表达式 + * @param methodNameMatchesMap 方法名匹配存储 Map + * @param methodRepeatBuffer 方法名重复记录存储 Buffer + * @param methodNotAnnotateBuffer 方法没有注释记录存储 Buffer + * @param notMethodBuffer 类不存在方法记录存储 Buffer + * @return 指定模块 API 数据 + */ + public static String apiGenerate(final String path, final String packageName, final String githubUrl, + final HashMap filterClassMap, + final HashMap filterMethodMap, + final String methodNameRegex, + final HashMap> methodNameMatchesMap, + final StringBuffer methodRepeatBuffer, + final StringBuffer methodNotAnnotateBuffer, + final StringBuffer notMethodBuffer) { + // 拼接信息 + StringBuffer buffer = new StringBuffer(); + // 递归循环子节点 + forSubnode(buffer, getFolderLists(path), path, packageName, githubUrl, + filterClassMap, filterMethodMap, methodNameRegex, methodNameMatchesMap, + methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + // 返回数据 + return buffer.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/assist/APIReader.java b/src/main/java/javadoc/dev_utils/assist/APIReader.java new file mode 100644 index 00000000..e94ac6b3 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/assist/APIReader.java @@ -0,0 +1,250 @@ +package javadoc.dev_utils.assist; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.MethodDoc; +import com.sun.javadoc.RootDoc; +import dev.utils.common.ArrayUtils; +import dev.utils.common.StringUtils; +import dev.utils.common.validator.ValidatorUtils; +import javadoc.api.JavaDocReader; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * detail: API(JavaDoc) 读取类 + * @author Ttt + */ +public final class APIReader implements JavaDocReader.CallBack { + + // 对应的类 Github 链接地址 + private String mClassGithubUrl; + // 忽略不保存的方法 + private HashMap mFilterMethodMap; + // 方法名匹配正则表达式 + private String mMethodNameRegex; + // 方法名匹配存储 Map<类名, List<方法名>> + private HashMap> mMethodNameMatchesMap; + // 方法名重复记录存储 + private StringBuffer mMethodRepeatBuffer; + // 方法没有注释记录存储 + private StringBuffer mMethodNotAnnotateBuffer; + // 类不存在方法记录存储 + private StringBuffer mNotMethodBuffer; + + /** + * 构造函数 + * @param classGithubUrl 类 Github 链接地址 + */ + private APIReader(String classGithubUrl) { + this.mClassGithubUrl = classGithubUrl; + } + + /** + * 初始化处理 + */ + private void init() { + if (mFilterMethodMap == null) mFilterMethodMap = new HashMap(); + if (mMethodNameMatchesMap == null) mMethodNameMatchesMap = new HashMap(); + if (mMethodRepeatBuffer == null) mMethodRepeatBuffer = new StringBuffer(); + if (mMethodNotAnnotateBuffer == null) mMethodNotAnnotateBuffer = new StringBuffer(); + if (mNotMethodBuffer == null) mNotMethodBuffer = new StringBuffer(); + } + + // ============= + // = 对外公开方法 = + // ============= + + /** + * 读取文档处理 + * @param path 文件路径 + * @param className 文件名 ( 类名 ) + * @param classGithubUrl 对应的类 Github 链接地址 + * @param filterMethodMap 忽略不保存方法 Map + * @param methodNameRegex 方法名匹配正则表达式 + * @param methodNameMatchesMap 方法名匹配存储 Map + * @param methodRepeatBuffer 方法名重复记录存储 Buffer + * @param methodNotAnnotateBuffer 方法没有注释记录存储 Buffer + * @param notMethodBuffer 类不存在方法记录存储 Buffer + * @return 处理后的文档信息 + */ + public static String readDoc(final String path, final String className, final String classGithubUrl, + final HashMap filterMethodMap, + final String methodNameRegex, + final HashMap> methodNameMatchesMap, + final StringBuffer methodRepeatBuffer, + final StringBuffer methodNotAnnotateBuffer, + final StringBuffer notMethodBuffer) { + // API 读取配置处理 + APIReader apiReader = new APIReader(classGithubUrl); + apiReader.mFilterMethodMap = filterMethodMap; + apiReader.mMethodNameRegex = methodNameRegex; + apiReader.mMethodNameMatchesMap = methodNameMatchesMap; + apiReader.mMethodRepeatBuffer = methodRepeatBuffer; + apiReader.mMethodNotAnnotateBuffer = methodNotAnnotateBuffer; + apiReader.mNotMethodBuffer = notMethodBuffer; + apiReader.init(); // 初始化防止为 null + // 执行参数, 生成 API readAll 设置为 false, 不读取 private、protected 等修饰符方法 + String[] executeParams = JavaDocReader.getExecuteParams(false, path, className); + // 读取 class javaDoc 并返回文档信息 + return JavaDocReader.readDoc(apiReader, path, className, executeParams); + } + + // ========================== + // = JavaDocReader.CallBack = + // ========================== + + /** + * 回调通知 + * @param path 文件路径 + * @param className 文件名 ( 类名 ) + * @param rootDoc 根 Doc 信息 + * @param classDocs 类 Doc 信息 + * @return 处理后的文档信息 + */ + @Override + public String callback(String path, String className, RootDoc rootDoc, ClassDoc[] classDocs) { + // 长度为 0, 则不处理 + if (classDocs.length == 0) return ""; + + // 最终返回数据 + StringBuffer finalBuffer = new StringBuffer(); + finalBuffer.append("\n\n"); + + // 判断是否存在重复的方法名 + boolean isMethodRepeat = false; + // 方法去重 Map + HashMap methodNameMap = new HashMap(); + // 获取需要过滤的方法 + String[] filterMethods = mFilterMethodMap.get(className); + + // ======================== + // 拼接标题 => * **类注释 ->** [类名](该类 Github 链接地址) + String title = "\n* **%s ->** [" + className + "](" + mClassGithubUrl + ")"; + // 获取类注释 + String classAnnotate = classDocs[0].commentText(); + try { + int ln = classAnnotate.indexOf("\n"); + // 进行拆分处理 + classAnnotate = classAnnotate.substring("detail:".length(), ln == -1 ? classAnnotate.length() : ln); + // 去掉前后空格 + classAnnotate = StringUtils.clearSpaceTrim(classAnnotate); + } catch (Exception e) { + } + // 格式化标题 - 替换 %s 为类注释 + finalBuffer.append(String.format(title, classAnnotate)); + // 拼接方法、注释 Table 语法 + finalBuffer.append("\n\n| 方法 | 注释 |"); + //finalBuffer.append("\n| :-: | :-: |"); // 居中 + finalBuffer.append("\n| :- | :- |"); // 左对齐 + // ======================== + + // 临时存储 Buffer + StringBuffer tempBuffer = new StringBuffer(); + // 保存开头 + tempBuffer.append(finalBuffer); + + // 循环 Class Doc 信息 + for (int i = 0, len = classDocs.length; i < len; ++i) { + // 循环 Method Doc 信息 + for (MethodDoc method : classDocs[i].methods()) { + // 属于枚举的 values 、valueOf 不处理 + if (method.name().equals("values") || + method.name().equals("valueOf")) { + continue; + } + + // 获取方法名 + String methodName = method.name(); + // 获取方法注释 + String methodAnnotate = method.commentText(); + + // 如果方法没有注释, 则进行记录 + if (StringUtils.isEmpty(methodAnnotate)) { + mMethodNotAnnotateBuffer.append("\n" + className + " - " + methodName); + } + + // ======================== + // 方法名正则表达式匹配处理 + if (ValidatorUtils.match(mMethodNameRegex, methodName)) { + List listMatchs = mMethodNameMatchesMap.get(className); + if (listMatchs == null) { + listMatchs = new ArrayList(); + mMethodNameMatchesMap.put(className, listMatchs); + } + // 追加匹配的方法名数据 + listMatchs.add(methodName); + } + // ======================== + + // ======================== + // 判断是否过滤方法 + boolean isFilterMethod = false; + // 获取过滤方法数组长度 + int filterMethodAryLength = ArrayUtils.length(filterMethods, 0); + // 判断是否过滤 + if (filterMethodAryLength != 0) { + for (int index = 0; index < filterMethodAryLength; index++) { + // 进行判断处理 + if (ArrayUtils.equals(filterMethods[index], methodName)) { + // 表示需要过滤 + isFilterMethod = true; + break; + } + } + } + // ======================== + + // ======================== + // 不过滤才处理该方法 + if (!isFilterMethod) { + if (methodNameMap.get(methodName) == null) { + // 如果注释为 null, 则设置方法名为注释 + if (StringUtils.isEmpty(methodAnnotate)) { + methodAnnotate = methodName; + } else { + // 判断方法注释是否存在换行 + int annotateln = methodAnnotate.indexOf("\n"); + // 如果存在换行 + if (annotateln != -1) { // 把注释换行的直接不要 + methodAnnotate = methodAnnotate.split("\n")[0]; + } + } + // 保存方法名、方法注释 + finalBuffer.append("\n| " + methodName + " | " + methodAnnotate + " |"); + // 进行保存过滤字段 + methodNameMap.put(methodName, methodName); + } else { + // 表示方法存在重复的 + isMethodRepeat = true; + // 保存重复的数据 + tempBuffer.append("\n| " + methodName + " | " + methodAnnotate + " |"); + } + } + // ======================== + } + } + + // 判断是否存在方法 + if (methodNameMap.size() != 0) { + // 存在重复的数据才处理 + if (isMethodRepeat) mMethodRepeatBuffer.append(tempBuffer); + } else { // 该类没有任何方法 + mNotMethodBuffer.append(tempBuffer); + // 不存在方法数据, 则不处理 + return ""; + } + // 返回数据 + return finalBuffer.toString(); + } + + /** + * 异常回调 + * @param e 异常信息 + */ + @Override + public void error(Exception e) { + System.out.println(e); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/assist/PackageCatalog.java b/src/main/java/javadoc/dev_utils/assist/PackageCatalog.java new file mode 100644 index 00000000..99eef3c4 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/assist/PackageCatalog.java @@ -0,0 +1,297 @@ +package javadoc.dev_utils.assist; + +import dev.utils.common.StringUtils; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 包目录结构生成 + * @author Ttt + */ +public final class PackageCatalog { + + private PackageCatalog() { + } + +// 生成参考如下 +//``` +//- dev.utils | 根目录 +// - app | APP 相关工具类 +// - anim | 动画工具类 +// - assist | 辅助类 +// - manager | 管理器 如: TimerManager +// - cache | 缓存工具类 +// - camera1 | 摄像头相关 android.hardware.Camera +// - image | 图片相关处理 +// - info | APP 信息、PackageInfo 等 +// - logger | 日志库 DevLogger +// - permission | 权限工具类 +// - player | 多媒体 ( 视频、音频 ) 播放封装 +// - share | SharedPreferences 封装 +// - toast | Toast +// - toaster | Toaster 处理无通知权限 +// - wifi | Wifi、热点工具类 +// - common | Java 工具类, 不依赖 android api +// - assist | 各种快捷辅助类 +// - search | 搜索相关 ( 文件搜索等 ) +// - cipher | 编 / 解码工具类 +// - encrypt | 加密工具类 +// - random | 随机概率算法工具类 +// - thread | 线程相关 +// - validator | 数据校验工具类 +//``` + + // ================= + // = 目录层级计算回调 = + // ================= + + /** + * detail: 文件目录层级回调 + * @author Ttt + */ + private interface CatalogCallback { + + /** + * 回调通知 + * @param name 目录名 + * @param lineNumber 行数 + * @param linkTag 锚链接 TAG 标记 + */ + void callback(String name, int lineNumber, String linkTag); + } + + // ================== + // = 文件目录遍历实体类 = + // ================== + + /** + * detail: 目录实体类 + * @author Ttt + */ + private static class Catalog { + + // 文件夹对象 + private File file; + // 文件夹内的子文件列表 + private List listCatalogs; + + /** + * 构造函数 + * @param file 文件夹对象 + * @param lists 文件夹内的子文件列表 + */ + public Catalog(File file, List lists) { + this.file = file; + this.listCatalogs = lists; + } + + /** + * 获取文件夹对象 + * @return {@link File} + */ + public File getFile() { + return file; + } + + /** + * 获取文件夹内的子文件列表 + * @return {@link List} + */ + public List getListCatalogs() { + return listCatalogs; + } + } + + /** + * 获取文件夹目录列表 + * @param path 文件路径 + * @param catalogCallback 目录回调通知 + * @return 文件夹目录列表集合 + */ + private static List getFolderLists(final String path, final CatalogCallback catalogCallback) { + List lists = new ArrayList(); + // 获取文件路径 + File baseFile = new File(path); + // 获取子文件 + File[] files = baseFile.listFiles(); + for (File file : files) { + // 获取文件名 + String name = file.getName(); + // 属于文件夹才处理 + if (file.isDirectory()) { + Catalog catalog = new Catalog(file, getFolderLists(file.getAbsolutePath(), catalogCallback)); + lists.add(catalog); + + // 触发回调 + if (catalogCallback != null) { + // lineNumber 固定传 1 只是为了增加默认空格间距 + catalogCallback.callback(name, 1, name + "." + name); + } + } + } + return lists; + } + + // ========== + // = 内部方法 = + // ========== + + // 目录信息最大长度 + private static int sMaxLength = 0; + + /** + * 计算目录最大长度 + * @param isAnchor 是否增加锚链接 + * @param packageName 包名 + * @param name 目录名 + * @param lineNumber 行数 + * @param linkTag 锚链接 TAG 标记 + */ + private static void calculateMaxLength(final boolean isAnchor, final String packageName, + final String name, final int lineNumber, final String linkTag) { + StringBuffer buffer = new StringBuffer(); + // 添加目录 + buffer.append(createCatalog(isAnchor, packageName, name, lineNumber, linkTag)); + // 获取长度 + int length = buffer.toString().length(); + // 判断长度 => 大于最大长度, 则重新设置 + if ((length + 6)>= sMaxLength) { + sMaxLength = length + 6; + } + } + + /** + * 创建目录信息 + * @param isAnchor 是否增加锚链接 + * @param packageName 包名 + * @param name 目录名 + * @param lineNumber 行数 + * @param linkTag 锚链接 TAG 标记 + * @return 目录信息 + */ + private static String createCatalog(final boolean isAnchor, final String packageName, + final String name, final int lineNumber, final String linkTag) { + StringBuffer buffer = new StringBuffer(); + if (isAnchor) { + // 添加空格 + buffer.append(StringUtils.appendSpace(lineNumber * 3)); + // 打印目录 + buffer.append("- [" + name + "]"); + // 增加锚 + buffer.append("(#" + (packageName + linkTag).replaceAll("\\.", "") + ")"); + } else { + // 添加空格 + buffer.append(StringUtils.appendSpace(lineNumber * 3)); + // 打印目录 + buffer.append("- " + name); + } + return buffer.toString(); + } + + /** + * 创建目录行 + * @param isAnchor 是否增加锚链接 + * @param packageName 包名 + * @param name 目录名 + * @param lineNumber 行数 + * @param linkTag 锚链接 TAG 标记 + * @param mapCatalog 对应目录的注释 + * @return 目录行信息 + */ + private static String createCatalogLine(final boolean isAnchor, final String packageName, + final String name, final int lineNumber, final String linkTag, + final HashMap mapCatalog) { + StringBuffer buffer = new StringBuffer(); + // 添加目录 + buffer.append(createCatalog(isAnchor, packageName, name, lineNumber, linkTag)); + // 设置间隔长度 + buffer.append(StringUtils.appendSpace(sMaxLength - buffer.toString().length())); + // 添加 间隔 | + buffer.append("| " + mapCatalog.get(linkTag)); + // 返回处理后的目录行 + return buffer.toString(); + } + + /** + * 递归目录拼接目录列表信息 + * @param buffer 拼接 Buffer + * @param lists 目录列表 + * @param isAnchor 是否增加锚链接 + * @param packageName 包名 + * @param lineNumber 行数 + * @param linkTag 锚链接 TAG 标记 + * @param mapCatalog 对应目录的注释 + */ + private static void forCatalog(final StringBuffer buffer, final List lists, + final boolean isAnchor, final String packageName, + final int lineNumber, final String linkTag, + final HashMap mapCatalog) { + // 循环遍历 + for (int i = 0, len = lists.size(); i < len; i++) { + // 获取目录 + Catalog catalog = lists.get(i); + // 获取目录名 + String name = catalog.getFile().getName(); + // 进行换行 + buffer.append("\n"); + // 添加目录行 + buffer.append(createCatalogLine(isAnchor, packageName, name, lineNumber, + linkTag + "." + name, mapCatalog)); + // 判断是否存在子文件夹 + if (catalog.getListCatalogs().size() != 0) { + forCatalog(buffer, catalog.getListCatalogs(), isAnchor, packageName, + lineNumber + 1, linkTag + "." + name, mapCatalog); + } + } + } + + // ============= + // = 对外公开方法 = + // ============= + + /** + * 创建目录信息 + * @param isAnchor 是否增加锚链接 + * @param path 文件路径 + * @param packageName 包名 + * @param mapCatalog 对应目录的注释 + * @return 目录信息 + */ + public static String apiCatalog(final boolean isAnchor, final String path, final String packageName, + final HashMap mapCatalog) { + + // 拼接信息 + StringBuffer buffer = new StringBuffer(); + // 获取文件夹列表 + List lists = getFolderLists(path, new CatalogCallback() { + @Override + public void callback(String name, int lineNumber, String linkTag) { + // 计算目录最大长度 + calculateMaxLength(isAnchor, packageName, name, lineNumber, linkTag); + } + }); + // 默认头部 + String head = "- " + packageName; + // 判断是否增加锚链接处理 + if (isAnchor) { + buffer.append("\n"); + } else { + buffer.append("```\n"); + } + // 增加根目录 + buffer.append(head + StringUtils.appendSpace(sMaxLength - head.length()) + "| " + mapCatalog.get(packageName)); + // 递归循环目录 + forCatalog(buffer, lists, isAnchor, packageName, 1, "", mapCatalog); + // 判断是否增加锚链接处理 + if (isAnchor) { + buffer.append("\n\n"); + } else { + buffer.append("\n```\n"); + } + // 返回数据 + return buffer.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/CodeAnalyzeReader.java b/src/main/java/javadoc/dev_utils/check/CodeAnalyzeReader.java new file mode 100644 index 00000000..609ef9c6 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/CodeAnalyzeReader.java @@ -0,0 +1,585 @@ +package javadoc.dev_utils.check; + +import com.sun.javadoc.ClassDoc; +import com.sun.javadoc.MethodDoc; +import com.sun.javadoc.RootDoc; +import com.sun.tools.javac.tree.JCTree; +import dev.utils.common.ArrayUtils; +import dev.utils.common.CollectionUtils; +import dev.utils.common.Reflect2Utils; +import dev.utils.common.StringUtils; +import dev.utils.common.validator.ValidatorUtils; +import javadoc.Utils; +import javadoc.api.JavaDocReader; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 代码读取检测分析 + * @author Ttt + */ +public final class CodeAnalyzeReader { + + private CodeAnalyzeReader() { + } + + // ========================= + // = Map<类名, List<方法名>> = + // ========================= + + /** + * detail: Map 配置 + * @author Ttt + */ + public static class MapConfig { + + // 方法注释缺少注释记录 + public final HashMap> sMethodUnAnnotateMap = new HashMap(); + + // 方法中参数未添加 final 记录 + public final HashMap> sParamUnFinalMap = new HashMap(); + + // 方法非 static 记录 + public final HashMap> sMethodUnStaticMap = new HashMap(); + + // 方法注释缺少 @param 记录 + public final HashMap> sMethodLackParamMap = new HashMap(); + + // 方法注释缺少 @return 记录 + public final HashMap> sMethodLackReturnMap = new HashMap(); + + // = + + // 方法存在 @param 但缺少注释记录 + public final HashMap> sMethodUnAnnotateParamMap = new HashMap(); + + // 方法存在 @return 但缺少注释记录 + public final HashMap> sMethodUnAnnotateReturnMap = new HashMap(); + + // = + + // 非 public 方法记录 + public final HashMap> sMethodUnPublicMap = new HashMap(); + + // 无修饰符变量 记录 + public final HashMap> sNoModifierVariableMap = new HashMap(); + + // 方法返回值 void 记录 + public final HashMap> sMethodReturnVoidMap = new HashMap(); + } + + /** + * 代码分析检测 + * @param path 文件夹路径 + * @return 返回分析检测后的记录 Map 集合 + */ + public static List>> codeAnalyze(final String path) { + return codeAnalyze(Utils.getFileCatalogLists(path)); + } + + /** + * 代码分析检测 + * @param listFiles 文件集合 + * @return 返回分析检测后的记录 Map 集合 + */ + public static List>> codeAnalyze(final List listFiles) { + MapConfig mapConfig = new MapConfig(); + // 循环读取 + forReader(listFiles, mapConfig); + // 返回结果 + List>> lists = new ArrayList(); + lists.add(mapConfig.sMethodUnAnnotateMap); // 方法注释缺少注释记录 + lists.add(mapConfig.sParamUnFinalMap); // 方法中参数未添加 final 记录 + lists.add(mapConfig.sMethodUnStaticMap); // 方法非 static 记录 + lists.add(mapConfig.sMethodLackParamMap); // 方法注释缺少 @param 记录 + lists.add(mapConfig.sMethodLackReturnMap); // 方法注释缺少 @return 记录 + lists.add(mapConfig.sMethodUnAnnotateParamMap); // 方法存在 @param 但缺少注释记录 + lists.add(mapConfig.sMethodUnAnnotateReturnMap); // 方法存在 @return 但缺少注释记录 + lists.add(mapConfig.sMethodUnPublicMap); // 非 public 方法记录 + lists.add(mapConfig.sNoModifierVariableMap); // 无修饰符变量 记录 + lists.add(mapConfig.sMethodReturnVoidMap); // 方法返回值 void 记录 + return lists; + } + + // ============= + // = 内部处理方法 = + // ============= + + /** + * 循环读取处理 + * @param lists 文件列表 + * @param mapConfig Map 配置 + */ + private static void forReader(final List lists, final MapConfig mapConfig) { + // 循环子文件 + for (File file : lists) { + if (file.isDirectory()) { + forReader(Utils.getFileCatalogLists(file.getAbsolutePath() + "/"), mapConfig); + } else { + CodeReader.readDoc(file.getAbsolutePath(), "", mapConfig); + } + } + } + + // ============ + // = 内部实现类 = + // ============ + + /** + * detail: 代码读取 + * @author Ttt + */ + private static class CodeReader implements JavaDocReader.CallBack { + + MapConfig mapConfig; + + public CodeReader(MapConfig mapConfig) { + this.mapConfig = mapConfig; + } + + // ============= + // = 对外公开方法 = + // ============= + + /** + * 读取文档处理 + * @param path 文件路径 + * @param className 文件名 ( 类名 ) + * @param mapConfig Map 配置 + * @return 处理后的文档信息 + */ + public static String readDoc(final String path, final String className, final MapConfig mapConfig) { + // 执行参数, 生成 API readAll 设置为 false, 不读取 private、protected 等修饰符方法 + String[] executeParams = JavaDocReader.getExecuteParams(true, path, className); + // 读取 class javaDoc 并返回文档信息 + return JavaDocReader.readDoc(new CodeReader(mapConfig), path, className, executeParams); + } + + // ========================== + // = JavaDocReader.CallBack = + // ========================== + + /** + * 回调通知 + * @param path 文件路径 + * @param className 文件名 ( 类名 ) + * @param rootDoc 根 Doc 信息 + * @param classDocs 类 Doc 信息 + * @return 处理后的文档信息 + */ + @Override + public String callback(String path, String className, RootDoc rootDoc, ClassDoc[] classDocs) { + if (classDocs != null) { + // 循环 Class Doc 信息 + for (ClassDoc classDoc : classDocs) { + // 保存新的类名 + className = classDoc.name(); + + // 专门用于忽略 接口、抽象类 + // ======================== + // 判断是否忽略该类 + boolean isIgnoreClass = false; + // 类标记 + String classTag = ""; + // 反射获取 tree 变量 + JCTree.JCClassDecl jcClassDecl = (JCTree.JCClassDecl) Reflect2Utils.getPropertyByParent(classDoc, "tree"); + JCTree.JCModifiers jcModifiers = jcClassDecl.getModifiers(); + if (jcModifiers != null) { + // 属于接口的则跳过 + if (jcModifiers.toString().endsWith("interface ")) { + classTag = " [interface]"; + isIgnoreClass = true; + } else if (jcModifiers.toString().endsWith("abstract ")) { // 属于抽象类的跳过 + classTag = " [abstract]"; + isIgnoreClass = true; + } + } + // ======================== + + // 判断是否存在无修饰符变量 + String jcClassDeclStrings = jcClassDecl.toString(); + if (jcClassDeclStrings != null) { + // 拆分处理 + String[] splits = jcClassDeclStrings.split("\r\n"); + // 进行判断处理 + for (String str : splits) { + if (!StringUtils.isSpace(str)) { + if (ValidatorUtils.match("[ ]*[A-Za-z0-9\\<\\>\\[\\]]+ [A-Za-z0-9]+;", str)) { + Utils.putToList(mapConfig.sNoModifierVariableMap, className, str); + } + } + } + } + +// // 方便排查新的接口、抽象类处理 +// isIgnoreClass = false; + + // 循环读取方法信息 + for (MethodDoc methodDoc : classDoc.methods()) { + // 属于枚举的 values 、valueOf 不处理 + if (methodDoc.name().equals("values") || + methodDoc.name().equals("valueOf")) { + continue; + } + // 获取方法名 + String methodName = methodDoc.name(); + // 获取方法注释 + String methodAnnotate = methodDoc.commentText(); + + // 反射获取 tree 变量 + JCTree.JCMethodDecl jcMethodDecl = (JCTree.JCMethodDecl) Reflect2Utils.getPropertyByParent(methodDoc, "tree"); + // 反射获取方法参数 + List listJCVariableDecls = (List) Reflect2Utils.getPropertyByParent(jcMethodDecl, "params"); + // 获取方法全部注释 (含 @param) + String methodDocumentation = (String) Reflect2Utils.getPropertyByParent(methodDoc, "documentation"); + + // 获取方法代码 + String methodCode = jcMethodDecl.toString(); + // 判断是否 public 开头 + boolean isPublic = methodCode.startsWith("public "); + + // 如果方法名存在换行(注解) + if (methodCode.indexOf("\r\n") != -1) { + String[] methodCodeSplit = methodCode.split("\r\n"); + for (String methodCodeStr : methodCodeSplit) { + if (methodCodeStr.indexOf(methodName) != -1) { + if (methodCodeStr.startsWith("public ")) { + isPublic = true; + } + } + } + } + // 不属于 public 修饰符则记录 + if (!isPublic) { + Utils.putToList(mapConfig.sMethodUnPublicMap, className, methodName); + } + + // 专门用于判断方法是否 static 修饰 + // ======================== + // 不忽略才处理进行方法参数判断 + if (!isIgnoreClass) { + // 判断方法是否存在 static 修饰符 + if (jcMethodDecl != null) { + // 不存在则保存 + if (jcMethodDecl.toString().indexOf("static ") == -1) { + Utils.putToList(mapConfig.sMethodUnStaticMap, className + classTag, methodName); + } + } + } + // ======================== + + // 专门用于判断方法参数是否 final 修饰 + // ======================== + // 不忽略才处理进行方法参数判断 + if (!isIgnoreClass) { + // 防止为 null + if (!CollectionUtils.isEmpty(listJCVariableDecls)) { + for (JCTree.JCVariableDecl jcVariableDecl : listJCVariableDecls) { + jcModifiers = jcVariableDecl.getModifiers(); + if (jcModifiers != null) { + if (jcModifiers.toString().endsWith("final ")) { + // 存在 final 修饰 + } else { + Utils.putToList(mapConfig.sParamUnFinalMap, className + classTag, methodName); + break; + } + } + } + } + } + // ======================== + + // 判断是否添加到 无注释 Map 中 + boolean isUnAnnotate = false; + if (StringUtils.isEmpty(methodAnnotate)) { + Utils.putToList(mapConfig.sMethodUnAnnotateMap, className, methodName); + // 表示已经添加到 Map 中 + isUnAnnotate = true; + } + + // 专门用于判断方法参数是否都加了 @param、@return + // ======================== + // 判断注释是否为 null + if (StringUtils.isEmpty(methodDocumentation)) { // 为 null, 表示没有注释, 需要特殊处理 + // 没有添加, 才进行添加, 防止多次保存 + if (!isUnAnnotate) { + Utils.putToList(mapConfig.sMethodUnAnnotateMap, className, methodName); + } + } else { + // 不存在 void, 表示有返回值 + if (jcMethodDecl.toString().indexOf("void ") == -1) { + // 判断是否存在 @return, 不存在则记录 + if (methodDocumentation.indexOf("@return") == -1) { + Utils.putToList(mapConfig.sMethodLackReturnMap, className, methodName); + } else { // 存在则判断数量 + // 判断存在的数量 + int returnNumber = StringUtils.countMatches(methodDocumentation, "@return"); + if (returnNumber>= 2) { + Utils.putToList(mapConfig.sMethodLackReturnMap, className, methodName + " - 多个 @return"); + } else { + String[] splitReturn = methodDocumentation.replaceAll("\r\n", "").split("@return "); + if (splitReturn.length == 1) { + Utils.putToList(mapConfig.sMethodUnAnnotateReturnMap, className, methodName); + } + } + } + } else { // 无返回值 + // 判断是否存在 @return, 存在则记录 => 属于 void 并不需要增加 @return + if (methodDocumentation.indexOf("@return") != -1) { + Utils.putToList(mapConfig.sMethodLackReturnMap, className, methodName + " - 多余 @return"); + } else { // 方法为 void + Utils.putToList(mapConfig.sMethodReturnVoidMap, className, methodName + " - void"); + } + } + } + // = + // 获取参数数量 + int paramNumber = CollectionUtils.length(listJCVariableDecls); + // 判断注释是否为 null + if (StringUtils.isEmpty(methodDocumentation)) { + // 如果数量不为 0, 表示有参数 + if (paramNumber != 0) { + Utils.putToList(mapConfig.sMethodLackParamMap, className, methodName); + } + } else { + // 参数校验处理 + paramCheckHandler(mapConfig.sMethodLackParamMap, methodDocumentation, + className, methodName, jcMethodDecl, listJCVariableDecls, mapConfig); + } + // ======================== + } + } + } + return null; + } + + /** + * 异常回调 + * @param e 异常信息 + */ + @Override + public void error(Exception e) { + System.out.println(e); + } + } + + // ==================== + // = 特殊处理 - 校验参数 = + // ==================== + + /** + * 参数校验处理 + * @param map 保存的 Map + * @param methodDocumentation 方法注释 + * @param className 类名 + * @param methodName 方法名 + * @param jcMethodDecl 方法信息实体类 + * @param listJCVariableDecls 方法参数 List + * @param mapConfig Map 配置 + */ + private static void paramCheckHandler(final HashMap> map, + final String methodDocumentation, + final String className, + final String methodName, + final JCTree.JCMethodDecl jcMethodDecl, + final List listJCVariableDecls, + final MapConfig mapConfig) { + // 泛型类型数组 + String[] genericityTypes = null; + // 参数名 + String[] paramNames = null; + + // 获取方法代码 + String methodCode = jcMethodDecl.toString(); + // 判断是否 @ 开头, 表示存在注解 + if (methodCode.startsWith("\r\n@")) { + String[] mods = jcMethodDecl.getModifiers().toString().split("\r\n"); + for (String mod : mods) { + if (!StringUtils.isEmpty(mod) && mod.startsWith("@")) { + methodCode = methodCode.replace(mod, ""); + } + } + } + // 去除换行代码 + methodCode = methodCode.replaceAll("\r\n", "").replaceAll("\n", ""); + // 获取 < 开始位置 + int startIndex = methodCode.indexOf("<"); + // 获取> 结束位置 + int endIndex = methodCode.indexOf(">"); + // 获取方法 ( 位置 + int methodIndex = methodCode.indexOf("("); + + // 泛型处理 + // ======================== + // 判断是否可能存在泛型 + if (startIndex < endIndex && endIndex < methodIndex) { // < 位置小于> 位置, 并且> 位置小于 ( + // 进行裁剪获取类型 + String typeStr = methodCode.substring(startIndex + 1, endIndex); + // 进行拆分处理 + genericityTypes = typeStr.split(","); + + // 防止泛型 extend 等处理 + for (int i = 0, len = ArrayUtils.length(genericityTypes); i < len; i++) { + String genericity = genericityTypes[i]; + // 清空空格 + genericity = StringUtils.clearSpaceTrim(genericity); + // 进行空格拆分 + String[] genericityArys = genericity.split(" "); + // 保存新的内容 + genericityTypes[i] = genericityArys[0]; + } + + // = + // 判断长度都是否为 1 + for (String type : genericityTypes) { + if (type.length() != 1) { // 统一规范, 泛型一个字母标记, 长度不为 1 则重置为 null + genericityTypes = null; + break; + } + } + } + + // 参数处理 + // ======================== + // 获取参数数量 + int paramNumber = CollectionUtils.length(listJCVariableDecls); + // 防止数据为 null + if (paramNumber != 0) { + // 创建对应的数组 + paramNames = new String[paramNumber]; + // 循环遍历 + for (int i = 0; i < paramNumber; i++) { + // 获取拆分后的数据 + String[] splits = listJCVariableDecls.get(i).toString().split(" "); + // 获取最后一位 + paramNames[i] = splits[ArrayUtils.length(splits) - 1]; + } + } + + // 处理泛型参数 + for (int i = 0, len = ArrayUtils.length(genericityTypes); i < len; i++) { + genericityTypes[i] = "<" + genericityTypes[i] + ">"; + } + + // 最简单的对比处理, 就是直接拼接判断 @param xxx @param xxx + // 既能判断参数顺序, 又能判断参数数量、参数字段名、泛型参数等 + + StringBuffer buffer = new StringBuffer(); + // 合并参数 + String[] arrays = ArrayUtils.arraycopy(paramNames, genericityTypes); + if (arrays != null) { + // 循环拼接 + for (String param : arrays) { + if (!StringUtils.isEmpty(param)) { + buffer.append("@param " + param + " "); + } + } + } + + // 方法注释替换处理 + String documentation = methodDocumentation.replaceAll("\r\n", "") + .replaceAll("\n", ""); + + // 获取索引位置 + int paramStart = documentation.indexOf("@param "); + // 进行裁剪处理 + if (paramStart != -1) { + // 裁剪字符串 => @param xx 注释 @param xx 注释 + documentation = documentation.substring(paramStart, documentation.length()); + // 裁剪拼接后的数据 + String subParam = subParam(documentation).trim(); + // 判断是否存在 + String paramBuffer = buffer.toString().trim(); + // 注释拼接参数长度 + int subParamLen = subParam.length(); + // 拼接参数参数 + int paramBufferLen = paramBuffer.length(); + // 防止各自缺失、增多 - 自己计算的参数拼接 等于 通过注释拆分拼接的参数长度, 才符合条件 + if (subParamLen == paramBufferLen && paramBuffer.equals(subParam)) { + // 数据一样, 才检测是否注释 + if (!subParamToCheckAnnotate(documentation)) { + // @param 不存在注释则保存 + Utils.putToList(mapConfig.sMethodUnAnnotateParamMap, className, methodName); + } + } else { + Utils.putToList(map, className, methodName); + } + } else { // 不存在注释, 那么参数也不存在才正常 + if (paramNumber != 0) { // 存在参数, 但没有注释 + Utils.putToList(map, className, methodName); + } + } + } + + /** + * 裁剪参数 + * @param documentation 注释内容 + * @return 返回裁剪字符串 + */ + private static String subParam(final String documentation) { + StringBuilder builder = new StringBuilder(); + // 进行拆分处理 + String[] splits = documentation.split(" "); + // 判断是否添加 + boolean isAdd = false; + // 进行循环处理 + for (String str : splits) { + if (!StringUtils.isEmpty(str)) { + if (str.equals("@param")) { + builder.append("@param "); + isAdd = true; + } else if (isAdd) { + builder.append(str + " "); + isAdd = false; + } + } + } + return builder.toString(); + } + + /** + * 裁剪参数, 判断是否存在注释 + * @param documentation 注释内容 + * @return {@code true} yes, {@code false} no + */ + private static boolean subParamToCheckAnnotate(String documentation) { + StringBuilder builder = new StringBuilder(); + // 判断是否存在 返回值 + int index = documentation.indexOf("@return "); + if (index != -1) { + // 进行裁剪处理 + documentation = documentation.substring(0, index); + } + // 进行拆分处理 + String[] splits = documentation.split(" "); + // 判断是否添加 + boolean isAdd = false; + // 判断是否需要检测 + boolean isCheck = false; + // 进行循环处理 + for (String str : splits) { + if (!StringUtils.isEmpty(str)) { + if (str.equals("@param")) { + builder.append("@param "); + isAdd = true; + if (isCheck) { + return false; + } + } else if (isAdd) { + builder.append(str + " "); + isAdd = false; + isCheck = true; + } else { + isCheck = false; + } + } + } + if (isCheck) { + return false; + } + return true; + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/CodeAnnotationAnalyzeRecord.java b/src/main/java/javadoc/dev_utils/check/CodeAnnotationAnalyzeRecord.java new file mode 100644 index 00000000..8a9e6d44 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/CodeAnnotationAnalyzeRecord.java @@ -0,0 +1,135 @@ +package javadoc.dev_utils.check; + +import dev.utils.common.FileIOUtils; +import dev.utils.common.FileUtils; +import dev.utils.common.StringUtils; +import javadoc.Utils; +import other.Pangu; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 代码注释读取检测分析 + * @author Ttt + */ +public final class CodeAnnotationAnalyzeRecord { + + private CodeAnnotationAnalyzeRecord() { + } + + // 代码间距等规范处理 + private static final Pangu sPangu = new Pangu(); + // 判断是否覆盖文件内容 + private static boolean sCoverText; + + // =================== + // = Map<类名, 类代码> = + // =================== + + // 代码注释空格间距异常记录 + private static HashMap sAnnotationSpaceMap = new HashMap(); + + // 代码注释重复换行记录 + private static HashMap> sAnnotationRepeatLineMap = new HashMap(); + + /** + * 代码分析检测 + * @param path 文件夹路径 + * @param coverText 是否覆盖内容 + * @return 返回分析检测后的记录 Map 集合 + */ + public static HashMap codeAnalyze(final String path, final boolean coverText) { + return codeAnalyze(Utils.getFileCatalogLists(path), coverText); + } + + /** + * 代码分析检测 + * @param listFiles 文件集合 + * @param coverText 是否覆盖内容 + * @return 返回分析检测后的记录 Map 集合 + */ + public static HashMap codeAnalyze(final List listFiles, final boolean coverText) { + sCoverText = coverText; + forReader(listFiles); + return sAnnotationSpaceMap; + } + + // ============= + // = 内部处理方法 = + // ============= + + /** + * 循环读取处理 + * @param lists 文件列表 + */ + private static void forReader(final List lists) { + // 循环子文件 + for (File file : lists) { + if (file.isDirectory()) { + forReader(Utils.getFileCatalogLists(file.getAbsolutePath() + "/")); + } else { + // = 慎用, 需要仔细对比部分代码差异化, 如 " " 会被替换成 "" 等 = + // 读取文件内容 + String text = FileIOUtils.readFileToString(file, null); + // 处理后的代码 + String newText = sPangu.spacingText(text); + newText = sPangu.spacingText(newText); // 多次处理 + // 判断一样 + if (!newText.equals(text)) { + sAnnotationSpaceMap.put(file.getName(), newText); + // 不一样才覆盖 + if (sCoverText) { + FileUtils.saveFile(file.getAbsolutePath(), newText.getBytes()); + } + } + // = + + // 读取文件 + readFile(file); + } + } + } + + /** + * 读取文件 + * @param file 文件 + */ + private static void readFile(final File file) { + // 读取文件内容 + List lists = FileIOUtils.readFileToList(file, 0, Integer.MAX_VALUE); + + // 判断是否需要判断 重复出现情况 + boolean repeat = false; + // 循环判断 + for (int i = 0, len = lists.size(); i < len; i++) { + // 获取每一行代码 + String code = lists.get(i); + // 判断是否 null + boolean isSpace = StringUtils.isSpace(code); + // 防止为 null + if (!isSpace) { + repeat = false; // 不需要判断重复 + } else { + if (code != null && repeat) { + Utils.putToList(sAnnotationRepeatLineMap, file.getName(), (i + 1) + ""); + } + // 表示需要检测重复 + repeat = true; + } + } + } + + // ============= + // = 外部获取方法 = + // ============= + + /** + * 代码注释重复换行记录 + * @return {@link HashMap} + */ + public static HashMap> getAnnotationRepeatLineMap() { + return sAnnotationRepeatLineMap; + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/DevMain.java b/src/main/java/javadoc/dev_utils/check/DevMain.java new file mode 100644 index 00000000..71604577 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/DevMain.java @@ -0,0 +1,28 @@ +package javadoc.dev_utils.check; + +import javadoc.dev_utils.check.dev_app.DevAppMain; +import javadoc.dev_utils.check.dev_assist.DevAssistMain; +import javadoc.dev_utils.check.dev_base.DevBaseMain; +import javadoc.dev_utils.check.dev_other.DevOtherMain; +import javadoc.dev_utils.check.dev_standard.DevStandardMain; +import javadoc.dev_utils.check.dev_widget.DevWidgetMain; + +/** + * detail: 统一检测 Dev 模块 + * @author Ttt + */ +public class DevMain { + + public static void main(String[] args) { + + boolean coverText = false; + boolean generateConfig = true; + + DevAppMain.main(new String[]{coverText + "", generateConfig + ""}); + DevAssistMain.main(new String[]{coverText + "", generateConfig + ""}); + DevBaseMain.main(new String[]{coverText + "", generateConfig + ""}); + DevOtherMain.main(new String[]{coverText + "", generateConfig + ""}); + DevStandardMain.main(new String[]{coverText + "", generateConfig + ""}); + DevWidgetMain.main(new String[]{coverText + "", generateConfig + ""}); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev/BlankCheckConfig.java b/src/main/java/javadoc/dev_utils/check/dev/BlankCheckConfig.java new file mode 100644 index 00000000..2b985a56 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev/BlankCheckConfig.java @@ -0,0 +1,56 @@ +package javadoc.dev_utils.check.dev; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * detail: 空白实现类 + * @author Ttt + */ +public class BlankCheckConfig implements ICheckConfig { + + @Override + public Map> getIgnoreAnnotateMap() { + return new HashMap(); + } + + @Override + public Map> getIgnoreFinalMap() { + return new HashMap(); + } + + @Override + public Map> getIgnoreStaticMap() { + return new HashMap(); + } + + @Override + public Map> getIgnoreParamMap() { + return new HashMap(); + } + + @Override + public Map> getIgnoreReturnMap() { + return new HashMap(); + } + + @Override + public Map> getIgnoreUnPublicMap() { + return new HashMap(); + } + + @Override + public Map> getIgnoreModifierVariableMap() { + return new HashMap(); + } + + @Override + public Map> getIgnoreReturnVoidMap() { + return new HashMap(); + } + + @Override + public void ignoreAnnotationSpaceMap(Map map) { + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev/CheckConfigGenerate.java b/src/main/java/javadoc/dev_utils/check/dev/CheckConfigGenerate.java new file mode 100644 index 00000000..072a834e --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev/CheckConfigGenerate.java @@ -0,0 +1,70 @@ +package javadoc.dev_utils.check.dev; + +import dev.utils.common.ArrayUtils; +import dev.utils.common.FileUtils; +import dev.utils.common.StringUtils; +import javadoc.Utils; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +/** + * detail: CheckConfig 文件生成 + * @author Ttt + */ +public class CheckConfigGenerate { + + // 格式化内容 + private static final String FORMAT_STR; + // 项目目录 + private static final String USER_DIR = System.getProperty("user.dir"); + // 包目录 + private static final String PAGE_DIP = USER_DIR + "\\src\\main\\java\\javadoc\\dev_utils\\check\\"; + // 当前文件目录 + private static final String FILE_DIP = PAGE_DIP + "dev\\"; + + static { + byte[] bytes = FileUtils.readFileBytes(FILE_DIP + "\\format.txt"); + FORMAT_STR = new String(bytes); + } + + /** + * 格式化处理 + * @param clazz {@link Class} + * @param mapStr map 校验字符串 + * @param ignoreAnnotationSpaceSet 忽略注释间距异常文件 Set + */ + public static void format(final Class clazz, final String[] mapStr, + final Set ignoreAnnotationSpaceSet) { + String className = clazz.getSimpleName(); + // 类名 + className = className.substring(0, className.indexOf("Main")); + // 包名 + String packageName = "dev_" + className.substring(3, className.length()).toLowerCase(); + // 格式化处理 + format(packageName, className, mapStr, ignoreAnnotationSpaceSet); + } + + /** + * 格式化处理 + * @param packageName 包名 + * @param className 类名 + * @param mapStr map 校验字符串 + * @param ignoreAnnotationSpaceSet 忽略注释间距异常文件 Set + */ + private static void format(final String packageName, final String className, final String[] mapStr, + final Set ignoreAnnotationSpaceSet) { + List lists = new ArrayList(); + lists.add(packageName); + lists.add(className + "Config"); + lists.add(className + "Config"); + lists.addAll(ArrayUtils.asList(mapStr)); + lists.add(Utils.generateSetString(ignoreAnnotationSpaceSet, "map")); + String format = StringUtils.getFormatString(FORMAT_STR, lists.toArray()); + // 生成 Config + FileUtils.saveFile(new File(PAGE_DIP + "\\" + packageName, + className + "Config.java").getAbsolutePath(), format.getBytes()); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev/CheckInfo.java b/src/main/java/javadoc/dev_utils/check/dev/CheckInfo.java new file mode 100644 index 00000000..b5e2d88c --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev/CheckInfo.java @@ -0,0 +1,134 @@ +package javadoc.dev_utils.check.dev; + +import dev.utils.common.ArrayUtils; + +import java.io.File; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * detail: 检测信息实体类 + * @author Ttt + */ +public final class CheckInfo { + + // 检测路径 + public String mPath; + // 代码检测分析配置接口 + public ICheckConfig mICheckConfig; + // 是否覆盖文件内容 + public boolean mCoverText = true; + // 是否使用 List + public boolean mIsLists = false; + // 检测指定文件集合 + public List mListFiles; + // 是否打印方法返回值 void 记录 + public boolean mIsPrintVoid = false; + // 是否需要生成 Config + public boolean isGenerateConfig; + // 忽略注释间距异常文件 + public Set ignoreAnnotationSpaceSet = new HashSet(); + + public CheckInfo(String path, ICheckConfig iCheckConfig) { + this.mPath = path; + this.mICheckConfig = iCheckConfig; + } + + // ============= + // = 对外公开方法 = + // ============= + + /** + * 设置检测路径 + * @param path 检测路径 + * @return {@link CheckInfo} + */ + public CheckInfo setPath(String path) { + this.mPath = path; + return this; + } + + /** + * 设置代码检测分析配置接口 + * @param iCheckConfig {@link ICheckConfig} + * @return {@link CheckInfo} + */ + public CheckInfo setCheckConfig(ICheckConfig iCheckConfig) { + this.mICheckConfig = iCheckConfig; + return this; + } + + /** + * 设置是否覆盖文件内容 + * @param coverText {@code true} yes, {@code false} no + * @return {@link CheckInfo} + */ + public CheckInfo setCoverText(boolean coverText) { + this.mCoverText = coverText; + return this; + } + + /** + * 设置是否使用 List + * @param lists {@code true} yes, {@code false} no + * @return {@link CheckInfo} + */ + public CheckInfo setLists(boolean lists) { + this.mIsLists = lists; + return this; + } + + /** + * 设置检测指定文件集合 + * @param listFiles 检测指定文件集合 + * @return {@link CheckInfo} + */ + public CheckInfo setListFiles(List listFiles) { + this.mListFiles = listFiles; + return this; + } + + /** + * 设置是否打印方法返回值 void 记录 + * @param printVoid {@code true} yes, {@code false} no + * @return {@link CheckInfo} + */ + public CheckInfo setPrintVoid(boolean printVoid) { + this.mIsPrintVoid = printVoid; + return this; + } + + /** + * 设置是否需要生成 Config + * @param generateConfig {@code true} yes, {@code false} no + * @return {@link CheckInfo} + */ + public CheckInfo setGenerateConfig(boolean generateConfig) { + this.isGenerateConfig = generateConfig; + if (this.isGenerateConfig) { + mICheckConfig = new BlankCheckConfig(); + } + return this; + } + + /** + * 设置忽略注释间距异常文件 Set + * @param ignoreAnnotationSpaceSet 忽略注释间距异常文件 Set + * @return {@link CheckInfo} + */ + public CheckInfo setIgnoreAnnotationSpaceSet(Set ignoreAnnotationSpaceSet) { + this.ignoreAnnotationSpaceSet.addAll(ignoreAnnotationSpaceSet); + return this; + } + + /** + * 设置忽略注释间距异常文件 Set + * @param strs 忽略注释间距异常文件配置 + * @return {@link CheckInfo} + */ + public CheckInfo setIgnoreAnnotationSpaceSet(String... strs) { + this.ignoreAnnotationSpaceSet.addAll(ArrayUtils.asList(strs)); + return this; + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev/CheckMain.java b/src/main/java/javadoc/dev_utils/check/dev/CheckMain.java new file mode 100644 index 00000000..13cfd40b --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev/CheckMain.java @@ -0,0 +1,217 @@ +package javadoc.dev_utils.check.dev; + +import javadoc.Utils; +import javadoc.dev_utils.check.CodeAnalyzeReader; +import javadoc.dev_utils.check.CodeAnnotationAnalyzeRecord; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; + +/** + * detail: 代码读取检测分析入口方法 + * @author Ttt + */ +public final class CheckMain { + + private CheckMain() { + } + + /** + * 执行检测方法 + * @param clazz 执法该方法的类 ( 用于生成 xxxConfig ) + * @param checkInfo 检测信息实体类 + * @return 检测结果 JSON String + */ + public static String execute(final Class clazz, final CheckInfo checkInfo) { + // 代码检测分析配置接口 + ICheckConfig checkConfig = checkInfo.mICheckConfig; + // 本地文件路径 + String path = checkInfo.mPath; + // 检测代码规范 + final List>> lists; + // 代码注释间距检测 + final HashMap sAnnotationSpaceMap; + + if (checkInfo.mIsLists) { + final List listFiles = new ArrayList(); + // 保存指定文件集合 + if (checkInfo.mListFiles != null) { + listFiles.addAll(checkInfo.mListFiles); + } + // 检测代码规范 + lists = CodeAnalyzeReader.codeAnalyze(listFiles); + // 代码注释间距检测记录 + sAnnotationSpaceMap = CodeAnnotationAnalyzeRecord.codeAnalyze(listFiles, checkInfo.mCoverText); + } else { + // 检测代码规范 + lists = CodeAnalyzeReader.codeAnalyze(path); + // 代码注释间距检测 + sAnnotationSpaceMap = CodeAnnotationAnalyzeRecord.codeAnalyze(path, checkInfo.mCoverText); + } + + // ========== + // = 代码间距 = + // ========== + + // 代码注释重复换行记录 + final HashMap> sAnnotationRepeatLineMap = CodeAnnotationAnalyzeRecord.getAnnotationRepeatLineMap(); + + // 忽略处理 + checkConfig.ignoreAnnotationSpaceMap(sAnnotationSpaceMap); + + // 转换 JSON 数据 - 代码注释间距检测记录 + String annotationSpaceJSON = Utils.toJsonFormat(sAnnotationSpaceMap, true); + + // 转换 JSON 数据 - 代码注释重复换行记录 + String annotationRepeatLineJSON = Utils.toJsonFormat(sAnnotationRepeatLineMap, true); + + // ========== + // = 结果处理 = + // ========== + + // 方法注释缺少注释记录 + final HashMap> sMethodUnAnnotateMap = lists.get(0); + // 方法中参数未添加 final 记录 + final HashMap> sParamUnFinalMap = lists.get(1); + // 方法非 static 记录 + final HashMap> sMethodUnStaticMap = lists.get(2); + // 方法注释缺少 @param 记录 + final HashMap> sMethodLackParamMap = lists.get(3); + // 方法注释缺少 @return 记录 + final HashMap> sMethodLackReturnMap = lists.get(4); + // 方法存在 @param 但缺少注释记录 + final HashMap> sMethodUnAnnotateParamMap = lists.get(5); + // 方法存在 @return 但缺少注释记录 + final HashMap> sMethodUnAnnotateReturnMap = lists.get(6); + // 非 public 方法记录 + final HashMap> sMethodUnPublicMap = lists.get(7); + // 无修饰符变量 记录 + final HashMap> sNoModifierVariableMap = lists.get(8); + // 方法返回值 void 记录 + final HashMap> sMethodReturnVoidMap = lists.get(9); + + // = + + // 忽略处理 + Utils.removeToMap(sMethodUnAnnotateMap, checkConfig.getIgnoreAnnotateMap()); + // 转换 JSON 数据 - 缺少注释的方法 + String unAnnotateJSON = Utils.toJsonFormat(sMethodUnAnnotateMap, true); + // 转换 Map 字符串 + String unAnnotateGenerateMapString = Utils.generateMapString(sMethodUnAnnotateMap, "ignoreAnnotateMap"); + + // = + + // 忽略处理 + Utils.removeToMap(sParamUnFinalMap, checkConfig.getIgnoreFinalMap()); + // 转换 JSON 数据 - 缺少 final 修饰的方法(参数) + String unFinalJSON = Utils.toJsonFormat(sParamUnFinalMap, true); + // 转换 Map 字符串 + String unFinalGenerateMapString = Utils.generateMapString(sParamUnFinalMap, "ignoreFinalMap"); + + // = + + // 忽略处理 + Utils.removeToMap(sMethodUnStaticMap, checkConfig.getIgnoreStaticMap()); + // 转换 JSON 数据 - 缺少 static 修饰的方法 + String unStaticJSON = Utils.toJsonFormat(sMethodUnStaticMap, true); + // 转换 Map 字符串 + String unStaticGenerateMapString = Utils.generateMapString(sMethodUnStaticMap, "ignoreStaticMap"); + + // = + + // 忽略处理 + Utils.removeToMap(sMethodLackParamMap, checkConfig.getIgnoreParamMap()); + // 转换 JSON 数据 - 缺少 @param 的方法 + String lackParamJSON = Utils.toJsonFormat(sMethodLackParamMap, true); + // 转换 Map 字符串 + String lackParamGenerateMapString = Utils.generateMapString(sMethodLackParamMap, "ignoreParamMap"); + + // = + + // 忽略处理 + Utils.removeToMap(sMethodLackReturnMap, checkConfig.getIgnoreReturnMap()); + // 转换 JSON 数据 - 缺少 @return 的方法 + String lackReturnJSON = Utils.toJsonFormat(sMethodLackReturnMap, true); + // 转换 Map 字符串 + String lackReturnGenerateMapString = Utils.generateMapString(sMethodLackReturnMap, "ignoreReturnMap"); + + // = + + // 转换 JSON 数据 - 存在 @param 但缺少注释的方法 + String unAnnotateParamJSON = Utils.toJsonFormat(sMethodUnAnnotateParamMap, true); + + // = + + // 转换 JSON 数据 - 存在 @return 但缺少注释的方法 + String unAnnotateReturnJSON = Utils.toJsonFormat(sMethodUnAnnotateReturnMap, true); + + // = + + // 忽略处理 + Utils.removeToMap(sMethodUnPublicMap, checkConfig.getIgnoreUnPublicMap()); + // 转换 JSON 数据 - 非 public 方法记录 + String methodUnPublicJSON = Utils.toJsonFormat(sMethodUnPublicMap, true); + // 转换 Map 字符串 + String methodUnPublicGenerateMapString = Utils.generateMapString(sMethodUnPublicMap, "ignoreUnPublicMap"); + + // = + + // 忽略处理 + Utils.removeToMap(sNoModifierVariableMap, checkConfig.getIgnoreModifierVariableMap()); + // 转换 JSON 数据 - 无修饰符变量 记录 + String noModifierVariableJSON = Utils.toJsonFormat(sNoModifierVariableMap, true); + // 转换 Map 字符串 + String noModifierVariableGenerateMapString = Utils.generateMapString(sNoModifierVariableMap, "ignoreModifierVariableMap"); + + // = + + // 忽略处理 + Utils.removeToMap(sMethodReturnVoidMap, checkConfig.getIgnoreReturnVoidMap()); + // 转换 JSON 数据 - 方法返回值 void 记录 + String methodReturnVoidJSON = Utils.toJsonFormat(sMethodReturnVoidMap, true); + // 转换 Map 字符串 + String methodReturnVoidGenerateMapString = Utils.generateMapString(sMethodReturnVoidMap, "ignoreReturnVoidMap"); + + // = + + // 统一拼接打印数据 + LinkedHashMap>> printMap = new LinkedHashMap(); + printMap.put("1.缺少注释的方法", sMethodUnAnnotateMap); + printMap.put("2.缺少 final 修饰的方法(参数)", sParamUnFinalMap); + printMap.put("3.缺少 static 修饰的方法", sMethodUnStaticMap); + printMap.put("4.缺少 @param 的方法", sMethodLackParamMap); + printMap.put("5.缺少 @return 的方法", sMethodLackReturnMap); + printMap.put("6.存在 @param 但缺少注释的方法", sMethodUnAnnotateParamMap); + printMap.put("7.存在 @return 但缺少注释的方法", sMethodUnAnnotateReturnMap); + printMap.put("8.非 public 方法记录", sMethodUnPublicMap); + printMap.put("8.无修饰符变量记录", sNoModifierVariableMap); + printMap.put("9.代码注释重复换行记录", sAnnotationRepeatLineMap); + + // 判断是否打印 + if (checkInfo.mIsPrintVoid) { + printMap.put("10.方法返回值 void 记录", sMethodReturnVoidMap); + } + + // 转换 JSON 数据 + String mapJSON = Utils.toJsonFormat(printMap, true); + System.out.println(mapJSON); + + // 判断是否需要生成 Config 文件 + if (checkInfo.isGenerateConfig) { + CheckConfigGenerate.format(clazz, new String[]{ + unAnnotateGenerateMapString, + unFinalGenerateMapString, + unStaticGenerateMapString, + lackParamGenerateMapString, + lackReturnGenerateMapString, + methodUnPublicGenerateMapString, + noModifierVariableGenerateMapString, + methodReturnVoidGenerateMapString, + }, checkInfo.ignoreAnnotationSpaceSet); + } + return mapJSON; + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev/ICheckConfig.java b/src/main/java/javadoc/dev_utils/check/dev/ICheckConfig.java new file mode 100644 index 00000000..0b499e29 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev/ICheckConfig.java @@ -0,0 +1,66 @@ +package javadoc.dev_utils.check.dev; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * detail: 代码检测分析配置接口 + * @author Ttt + */ +public interface ICheckConfig { + + /** + * 获取忽略指定方法注释配置 + * @return 忽略配置 Map + */ + Map> getIgnoreAnnotateMap(); + + /** + * 获取忽略指定方法参数 final 修饰符配置 + * @return 忽略配置 Map + */ + Map> getIgnoreFinalMap(); + + /** + * 获取忽略指定方法 static 修饰符配置 + * @return 忽略配置 Map + */ + Map> getIgnoreStaticMap(); + + /** + * 获取忽略指定方法 @param 处理配置 + * @return 忽略配置 Map + */ + Map> getIgnoreParamMap(); + + /** + * 获取忽略指定方法 @return 处理配置 + * @return 忽略配置 Map + */ + Map> getIgnoreReturnMap(); + + /** + * 获取忽略指定方法非 public 处理配置 + * @return 忽略配置 Map + */ + Map> getIgnoreUnPublicMap(); + + /** + * 获取忽略无修饰符变量处理配置 + * @return 忽略配置 Map + */ + Map> getIgnoreModifierVariableMap(); + + /** + * 获取忽略指定方法 return void 处理配置 + * @return 忽略配置 Map + */ + Map> getIgnoreReturnVoidMap(); + + /** + * 忽略注释间距异常文件 + * @param map {@link HashMap} + */ + void ignoreAnnotationSpaceMap(Map map); +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev/format.txt b/src/main/java/javadoc/dev_utils/check/dev/format.txt new file mode 100644 index 00000000..5f90e38e --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev/format.txt @@ -0,0 +1,112 @@ +package javadoc.dev_utils.check.%s; + +import javadoc.Utils; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * detail: %s 代码检测分析配置 + * @author Ttt + */ +final class %s implements ICheckConfig { + + /** + * 获取忽略指定方法注释配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreAnnotateMap() { + Map> ignoreAnnotateMap = new HashMap(); + %s + return ignoreAnnotateMap; + } + + /** + * 获取忽略指定方法参数 final 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreFinalMap() { + Map> ignoreFinalMap = new HashMap(); + %s + return ignoreFinalMap; + } + + /** + * 获取忽略指定方法 static 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreStaticMap() { + Map> ignoreStaticMap = new HashMap(); + %s + return ignoreStaticMap; + } + + /** + * 获取忽略指定方法 @param 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreParamMap() { + Map> ignoreParamMap = new HashMap(); + %s + return ignoreParamMap; + } + + /** + * 获取忽略指定方法 @return 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnMap() { + Map> ignoreReturnMap = new HashMap(); + %s + return ignoreReturnMap; + } + + /** + * 获取忽略指定方法非 public 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreUnPublicMap() { + Map> ignoreUnPublicMap = new HashMap(); + %s + return ignoreUnPublicMap; + } + + /** + * 获取忽略无修饰符变量处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreModifierVariableMap() { + Map> ignoreModifierVariableMap = new HashMap(); + %s + return ignoreModifierVariableMap; + } + + /** + * 获取忽略指定方法 return void 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnVoidMap() { + Map> ignoreReturnVoidMap = new HashMap(); + %s + return ignoreReturnVoidMap; + } + + /** + * 忽略注释间距异常文件 + * @param map {@link HashMap} + */ + @Override + public void ignoreAnnotationSpaceMap(Map map) { + %s + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_app/DevAppConfig.java b/src/main/java/javadoc/dev_utils/check/dev_app/DevAppConfig.java new file mode 100644 index 00000000..790816c6 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_app/DevAppConfig.java @@ -0,0 +1,545 @@ +package javadoc.dev_utils.check.dev_app; + +import javadoc.Utils; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * detail: DevAppConfig 代码检测分析配置 + * @author Ttt + */ +final class DevAppConfig implements ICheckConfig { + + /** + * 获取忽略指定方法注释配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreAnnotateMap() { + Map> ignoreAnnotateMap = new HashMap(); + ignoreAnnotateMap.put("ActivityUtils.ResultActivity", Utils.asListArgs("onCreate","onActivityResult","onDestroy")); + ignoreAnnotateMap.put("AutoFocusAssist.AutoFocusTask", Utils.asListArgs("doInBackground")); + ignoreAnnotateMap.put("Base64.Coder", Utils.asListArgs("maxOutputSize")); + ignoreAnnotateMap.put("Base64.Decoder", Utils.asListArgs("maxOutputSize")); + ignoreAnnotateMap.put("Base64.Encoder", Utils.asListArgs("maxOutputSize","process")); + ignoreAnnotateMap.put("CalendarUtils", Utils.asListArgs("getBitInt","solarToInt","solarFromInt")); + ignoreAnnotateMap.put("CalendarUtils.Festival", Utils.asListArgs("compareTo","toString")); + ignoreAnnotateMap.put("ClickUtils.OnCountClickListener", Utils.asListArgs("onClick")); + ignoreAnnotateMap.put("ClickUtils.OnDebouncingClickListener", Utils.asListArgs("onClick")); + ignoreAnnotateMap.put("ColorUtils.ColorInfo", Utils.asListArgs("toString")); + ignoreAnnotateMap.put("ColorUtils.ColorInfo.ColorParser", Utils.asListArgs("handleColor")); + ignoreAnnotateMap.put("ContentResolverUtils.MediaQueryInfo", Utils.asListArgs("getResult","getProjection","getSelection","getSelectionArgs")); + ignoreAnnotateMap.put("ContentResolverUtils.MediaQueryInfoUri", Utils.asListArgs("getSelection","getSelectionArgs")); + ignoreAnnotateMap.put("ContentResolverUtils.MediaQueryUri", Utils.asListArgs("getResult","getProjection","getSelection","getSelectionArgs")); + ignoreAnnotateMap.put("DevCache.xFileOutputStream", Utils.asListArgs("close")); + ignoreAnnotateMap.put("InactivityTimerAssist.InactivityAsyncTask", Utils.asListArgs("doInBackground")); + ignoreAnnotateMap.put("InactivityTimerAssist.PowerStateReceiver", Utils.asListArgs("onReceive")); + ignoreAnnotateMap.put("JCLogUtils", Utils.asListArgs("d","e","e","e","i","xml","dTag","eTag","eTag","eTag","iTag","xmlTag")); + ignoreAnnotateMap.put("KeyValueBean", Utils.asListArgs("toString")); + ignoreAnnotateMap.put("LogPrintUtils", Utils.asListArgs("d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag")); + ignoreAnnotateMap.put("PreferenceImpl.ComparatorImpl", Utils.asListArgs("compare")); + ignoreAnnotateMap.put("ROMUtils.RomInfo", Utils.asListArgs("toString")); + ignoreAnnotateMap.put("ScaleUtils.XY", Utils.asListArgs("getXYx","getXY","getXY","compareTo")); + ignoreAnnotateMap.put("ScreenSensorAssist.OrientationSensorChangeListener", Utils.asListArgs("onAccuracyChanged","onSensorChanged")); + ignoreAnnotateMap.put("ScreenSensorAssist.OrientationSensorListener", Utils.asListArgs("onAccuracyChanged","onSensorChanged")); + ignoreAnnotateMap.put("ScreenshotUtils.MediaContentObserver", Utils.asListArgs("onChange")); + ignoreAnnotateMap.put("SpanUtils.CustomBulletSpan", Utils.asListArgs("getLeadingMargin","drawLeadingMargin")); + ignoreAnnotateMap.put("SpanUtils.CustomDynamicDrawableSpan", Utils.asListArgs("getDrawable","getSize","draw","getCachedDrawable")); + ignoreAnnotateMap.put("SpanUtils.CustomImageSpan", Utils.asListArgs("getDrawable")); + ignoreAnnotateMap.put("SpanUtils.CustomLineHeightSpan", Utils.asListArgs("chooseHeight")); + ignoreAnnotateMap.put("SpanUtils.CustomQuoteSpan", Utils.asListArgs("getLeadingMargin","drawLeadingMargin")); + ignoreAnnotateMap.put("SpanUtils.CustomTypefaceSpan", Utils.asListArgs("updateDrawState","updateMeasureState","apply")); + ignoreAnnotateMap.put("SpanUtils.ShaderSpan", Utils.asListArgs("updateDrawState")); + ignoreAnnotateMap.put("SpanUtils.ShadowSpan", Utils.asListArgs("updateDrawState")); + ignoreAnnotateMap.put("SpanUtils.SpaceSpan", Utils.asListArgs("getSize","draw")); + ignoreAnnotateMap.put("SpanUtils.VerticalAlignSpan", Utils.asListArgs("getSize","draw")); + ignoreAnnotateMap.put("ToastFactory.BaseToast", Utils.asListArgs("setView","setText")); + ignoreAnnotateMap.put("ToastFactory.NotificationToast", Utils.asListArgs("show","cancel")); + ignoreAnnotateMap.put("ToastFactory.SafeToast.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreAnnotateMap.put("ToastFactory.ToastHelper", Utils.asListArgs("handleMessage")); + ignoreAnnotateMap.put("ToastTintUtils.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreAnnotateMap.put("ToastUtils.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreAnnotateMap.put("TypeUtils.ParameterizedTypeImpl", Utils.asListArgs("getActualTypeArguments","getOwnerType","getRawType","equals","hashCode")); + ignoreAnnotateMap.put("WifiVo", Utils.asListArgs("describeContents","writeToParcel")); + + return ignoreAnnotateMap; + } + + /** + * 获取忽略指定方法参数 final 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreFinalMap() { + Map> ignoreFinalMap = new HashMap(); + ignoreFinalMap.put("ActivityUtils.ResultActivity", Utils.asListArgs("onCreate","onActivityResult")); + ignoreFinalMap.put("AutoFocusAssist", Utils.asListArgs("onAutoFocus")); + ignoreFinalMap.put("AutoFocusAssist.AutoFocusTask", Utils.asListArgs("doInBackground")); + ignoreFinalMap.put("Base64", Utils.asListArgs("decode","decode","decode","encodeToString","encodeToString","encode","encode")); + ignoreFinalMap.put("Base64.Decoder", Utils.asListArgs("maxOutputSize","process")); + ignoreFinalMap.put("Base64.Encoder", Utils.asListArgs("maxOutputSize","process")); + ignoreFinalMap.put("Base64Cipher", Utils.asListArgs("decrypt","encrypt")); + ignoreFinalMap.put("BitmapUtils", Utils.asListArgs("combineToCenter","combineToSameSize","combineToSameSize")); + ignoreFinalMap.put("CalendarUtils", Utils.asListArgs("getBitInt","solarToInt","solarFromInt")); + ignoreFinalMap.put("CalendarUtils.Festival", Utils.asListArgs("compareTo")); + ignoreFinalMap.put("CameraSizeAssist", Utils.asListArgs("setPreviewSize","setPictureSize","calcPreviewSize","calcPictureSize","calcVideoSize")); + ignoreFinalMap.put("CameraUtils", Utils.asListArgs("initCamera","open")); + ignoreFinalMap.put("ColorUtils.ColorInfo", Utils.asListArgs("RGBtoHSB")); + ignoreFinalMap.put("ColorUtils.ColorInfo.ColorParser", Utils.asListArgs("handleColor")); + ignoreFinalMap.put("ContentResolverUtils.MediaQueryInfo", Utils.asListArgs("getResult","getProjection","getSelection","getSelectionArgs")); + ignoreFinalMap.put("ContentResolverUtils.MediaQueryInfoUri", Utils.asListArgs("getSelection","getSelectionArgs")); + ignoreFinalMap.put("ContentResolverUtils.MediaQueryUri", Utils.asListArgs("getResult","getProjection","getSelection","getSelectionArgs")); + ignoreFinalMap.put("CrashUtils", Utils.asListArgs("init","uncaughtException","handleException")); + ignoreFinalMap.put("DevMediaManager", Utils.asListArgs("onError","onVideoSizeChanged","onPrepared","onCompletion","onBufferingUpdate","onSeekComplete")); + ignoreFinalMap.put("DevVideoPlayerControl", Utils.asListArgs("surfaceChanged","surfaceCreated","surfaceDestroyed","onBufferingUpdate","onError","onVideoSizeChanged")); + ignoreFinalMap.put("IToastImpl", Utils.asListArgs("filter","handlerContent")); + ignoreFinalMap.put("InactivityTimerAssist.InactivityAsyncTask", Utils.asListArgs("doInBackground")); + ignoreFinalMap.put("InactivityTimerAssist.PowerStateReceiver", Utils.asListArgs("onReceive")); + ignoreFinalMap.put("LocationUtils.CustomLocationListener", Utils.asListArgs("onLocationChanged","onStatusChanged","onProviderEnabled","onProviderDisabled")); + ignoreFinalMap.put("LogConfig", Utils.asListArgs("methodCount","methodOffset","outputMethodAll","displayThreadInfo","sortLog","logLevel","tag")); + ignoreFinalMap.put("LoggerPrinter", Utils.asListArgs("logHeaderContent")); + ignoreFinalMap.put("NetWorkUtils", Utils.asListArgs("isAvailableByPing")); + ignoreFinalMap.put("PermissionUtils.PermissionActivity", Utils.asListArgs("onCreate","onRequestPermissionsResult")); + ignoreFinalMap.put("PreferenceImpl.ComparatorImpl", Utils.asListArgs("compare")); + ignoreFinalMap.put("ScaleUtils.XY", Utils.asListArgs("getXY","compareTo")); + ignoreFinalMap.put("ScreenSensorAssist.OrientationSensorChangeListener", Utils.asListArgs("onAccuracyChanged","onSensorChanged")); + ignoreFinalMap.put("ScreenSensorAssist.OrientationSensorListener", Utils.asListArgs("onAccuracyChanged","onSensorChanged")); + ignoreFinalMap.put("ScreenshotUtils.MediaContentObserver", Utils.asListArgs("onChange")); + ignoreFinalMap.put("SnackbarUtils.StyleBuilder", Utils.asListArgs("setRootGravity","setRootCornerRadius","setRootBackgroundTintColor","setRootBackground","setRootMargin","setRootAlpha","setTextGravity","setTextColor","setTextSize","setTextMaxLines","setTextEllipsize","setTextTypeface","setTextPadding","setActionGravity","setActionColor","setActionSize","setActionPadding","setActionCornerRadius","setActionBackgroundTintColor","setActionBackground")); + ignoreFinalMap.put("SpanUtils.VerticalAlignSpan", Utils.asListArgs("getSize","draw")); + ignoreFinalMap.put("ToastFactory.BaseToast", Utils.asListArgs("setView","setText")); + ignoreFinalMap.put("ToastFactory.SafeToast.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreFinalMap.put("ToastFactory.ToastHelper", Utils.asListArgs("handleMessage")); + ignoreFinalMap.put("ToastTintUtils", Utils.asListArgs("newToastView","inflaterView")); + ignoreFinalMap.put("ToastTintUtils.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreFinalMap.put("ToastUtils", Utils.asListArgs("newToastText","newToastView","handlerToastRes","handlerToastStr")); + ignoreFinalMap.put("ToastUtils.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreFinalMap.put("TypeUtils.ParameterizedTypeImpl", Utils.asListArgs("equals")); + + return ignoreFinalMap; + } + + /** + * 获取忽略指定方法 static 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreStaticMap() { + Map> ignoreStaticMap = new HashMap(); + ignoreStaticMap.put("ActivityUtils", Utils.asListArgs("getActivityStacks","addActivity","removeActivity","removeActivity","currentActivity","finishActivity","existActivitys","finishActivity","finishActivity","finishAllActivityToIgnore","finishAllActivityToIgnore","finishAllActivity","exitApplication","restartApplication")); + ignoreStaticMap.put("ActivityUtils.ResultActivity", Utils.asListArgs("onCreate","onActivityResult","onDestroy")); + ignoreStaticMap.put("AliasMethod", Utils.asListArgs("next")); + ignoreStaticMap.put("AnalysisRecordUtils.FileInfo", Utils.asListArgs("getStoragePath","getFileName","getFileFunction","getFileIntervalTime","getFolderName","isHandler","setHandler","getLogPath","getIntervalTimeFolder")); + ignoreStaticMap.put("ApkInfoItem", Utils.asListArgs("getAppInfoBean","getListKeyValues","getAppMD5","getAppSHA1","getAppSHA256","getMinSdkVersion","getTargetSdkVersion","getApkLength","getX509Certificate","getNotBefore","getNotAfter","isEffective","getCertPrincipal","getCertVersion","getCertSigalgname","getCertSigalgoid","getCertSerialnumber","getCertDercode")); + ignoreStaticMap.put("AppInfoBean", Utils.asListArgs("getAppPackName","getAppName","getAppIcon","getAppType","getVersionCode","getVersionName","getFirstInstallTime","getLastUpdateTime","getSourceDir","getApkSize")); + ignoreStaticMap.put("AppInfoItem", Utils.asListArgs("getAppInfoBean","getListKeyValues","getAppMD5","getAppSHA1","getAppSHA256","getMinSdkVersion","getTargetSdkVersion","getApkLength","getX509Certificate","getNotBefore","getNotAfter","isEffective","getCertPrincipal","getCertVersion","getCertSigalgname","getCertSigalgoid","getCertSerialnumber","getCertDercode")); + ignoreStaticMap.put("AutoFocusAssist", Utils.asListArgs("isAutoFocus","setAutoFocus","onAutoFocus","autoFocusAgainLater","start","stop","cancelOutstandingTask")); + ignoreStaticMap.put("AutoFocusAssist.AutoFocusTask", Utils.asListArgs("doInBackground")); + ignoreStaticMap.put("Averager", Utils.asListArgs("add","clear","size","getAverage","print")); + ignoreStaticMap.put("Base64.Decoder", Utils.asListArgs("maxOutputSize","process")); + ignoreStaticMap.put("Base64.Encoder", Utils.asListArgs("maxOutputSize","process")); + ignoreStaticMap.put("Base64Cipher", Utils.asListArgs("decrypt","encrypt")); + ignoreStaticMap.put("BeepVibrateAssist", Utils.asListArgs("shouldBeep","streamUpdate","isPlayBeep","isVibrate","setVibrate","setVibrate","setMediaPlayer","playBeepSoundAndVibrate","close")); + ignoreStaticMap.put("CalendarUtils.Festival", Utils.asListArgs("isFestival","isFestival","isFestival","compareTo","toString")); + ignoreStaticMap.put("CalendarUtils.SolarLunar", Utils.asListArgs("getLunarYearDays","getLunarLeapDays","getLunarLeapMonth","getLunarMonthDays","getLunarGanZhi","getLunarMonthChinese","getLunarDayChinese","getSolarTermsIndex","getSolarTerms","getSolarTermsDate")); + ignoreStaticMap.put("CameraAssist", Utils.asListArgs("openDriver","closeDriver","startPreview","stopPreview","freeCameraResource","getCameraResolution","getPreviewSize","getCameraSizeAssist","getCamera","setCamera","setPreviewNotify","setAutoFocus","isPreviewing","setAutoInterval","setFlashlightOn","setFlashlightOff","isFlashlightOn")); + ignoreStaticMap.put("CameraSizeAssist", Utils.asListArgs("getCamera","setPreviewSize","setPreviewSize","getPreviewSize","getPreviewSize","getPreviewSize","getPreviewSize","setPictureSize","setPictureSize","getPictureSize","getPictureSize","getPictureSize","getPictureSize","getPictureSize","getPictureSize","getVideoSize","getVideoSize","getVideoSize","getVideoSize","getVideoSize","getVideoSize","calcPreviewSize","calcPictureSize","calcVideoSize")); + ignoreStaticMap.put("ClickUtils.ClickAssist", Utils.asListArgs("isFastDoubleClick","isFastDoubleClick","isFastDoubleClick","isFastDoubleClick","isFastDoubleClick","initConfig","putConfig","removeConfig","getConfigTime","removeRecord","clearRecord","setIntervalTime","reset")); + ignoreStaticMap.put("CollectionUtils.ArrayWithTypeToken", Utils.asListArgs("put","get","create","newInstance","newInstance")); + ignoreStaticMap.put("ColorUtils.ColorInfo", Utils.asListArgs("getKey","getValue","getValueParser","getValueColor","getAlpha","getRed","getGreen","getBlue","getGrayLevel","getHue","getSaturation","getBrightness","toString","priConvert")); + ignoreStaticMap.put("ColorUtils.ColorInfo.ColorParser", Utils.asListArgs("handleColor")); + ignoreStaticMap.put("ContentResolverUtils.MediaQueryInfo", Utils.asListArgs("getResult","getProjection","getSelection","getSelectionArgs")); + ignoreStaticMap.put("ContentResolverUtils.MediaQueryInfoUri", Utils.asListArgs("getSelection","getSelectionArgs")); + ignoreStaticMap.put("ContentResolverUtils.MediaQueryUri", Utils.asListArgs("getResult","getProjection","getSelection","getSelectionArgs")); + ignoreStaticMap.put("CoordinateUtils.Direction", Utils.asListArgs("getValue")); + ignoreStaticMap.put("CrashUtils", Utils.asListArgs("init","uncaughtException","handleException")); + ignoreStaticMap.put("DefaultToastStyle", Utils.asListArgs("getGravity","getXOffset","getYOffset","getHorizontalMargin","getVerticalMargin","getZ","getCornerRadius","getBackgroundTintColor","getBackground","getTextColor","getTextSize","getMaxLines","getEllipsize","getTypeface","getPadding")); + ignoreStaticMap.put("DevCache", Utils.asListArgs("put","put","getAsString","put","put","getAsJSONObject","put","put","getAsJSONArray","put","get","getAsBinary","getAsObject","put","put","getAsBitmap","put","put","getAsDrawable","file","remove","clear")); + ignoreStaticMap.put("DevCache.xFileOutputStream", Utils.asListArgs("close")); + ignoreStaticMap.put("DevCacheManager", Utils.asListArgs("calculateCacheSizeAndCacheCount","put","get","newFile","remove","clear","removeNext","calculateSize")); + ignoreStaticMap.put("DevHelper", Utils.asListArgs("viewHelper","devHelper","quickHelper","postRunnable","postRunnable","postRunnable","postRunnable","removeRunnable","startTimer","closeTimer","recycle","saveBitmapToSDCardJPEG","saveBitmapToSDCardJPEG","saveBitmapToSDCardJPEG","saveBitmapToSDCardJPEG","saveBitmapToSDCardPNG","saveBitmapToSDCardPNG","saveBitmapToSDCardPNG","saveBitmapToSDCardPNG","saveBitmapToSDCardWEBP","saveBitmapToSDCardWEBP","saveBitmapToSDCardWEBP","saveBitmapToSDCardWEBP","saveBitmapToSDCard","saveBitmapToSDCard","addTextChangedListener","removeTextChangedListener","setKeyListener","setKeyListener","setKeyListener","record","cleanAppCache","cleanAppFiles","cleanAppDbs","cleanAppDbByName","cleanAppSp","cleanAppSp","cleanCache","cleanCustomDir","cleanCustomDir","cleanApplicationData","copyText","copyUri","copyIntent","notifyMediaStore","notifyMediaStore","showDialog","closeDialog","closeDialogs","closeDialog","closeDialogs","closePopupWindow","closePopupWindows","autoCloseDialog","autoCloseDialog","autoClosePopupWindow","openKeyboard","openKeyboard","openKeyboard","openKeyboard","openKeyboard","openKeyboard","closeKeyboard","closeKeyboard","closeKeyboard","closeKeyboard","closeKeyBoardSpecial","closeKeyBoardSpecial","closeKeyBoardSpecial","closeKeyboard","closeKeyboard","closeKeyboard","closeKeyboard","closeKeyboard","closeKeyboard","closeKeyboard","closeKeyboard","judgeView","registerSoftInputChangedListener","registerSoftInputChangedListener2","applyLanguage","applyLanguage","setOnClicks","setOnLongClicks","setOnTouchs","addTouchArea","addTouchArea","cancelAllNotification","cancelNotification","cancelNotification","notifyNotification","notifyNotification","saveAssetsFormFile","saveRawFormFile","setWindowSecure","setFullScreen","setFullScreenNoTitle","setLandscape","setPortrait","toggleScreenOrientation","forceGetViewSize","vibrate","vibrate","cancel","closeIO","closeIOQuietly","flush","flushQuietly","flushCloseIO","flushCloseIOQuietly","flushCloseIO","flushCloseIOQuietly","getNetTime","getNetTime","waitForEndAsyn","waitForEnd","setAnimationListener")); + ignoreStaticMap.put("DevMediaManager", Utils.asListArgs("createMedia","destroyMedia","bindListener","setAudioStreamType","playPrepareRaw","playPrepareRaw","playPrepareAssets","playPrepareAssets","playPrepare","playPrepare","playPrepare","isPlaying","pause","stop","onError","onVideoSizeChanged","onPrepared","onCompletion","onBufferingUpdate","onSeekComplete","setMeidaListener","isNullMediaPlayer","isNotNullMediaPlayer","getMediaPlayer","setMediaPlayer","setTAG","getVolume","setVolume","clearMediaPlayerData","getPlayRawId","getPlayUri","getVideoWidth","getVideoHeight","getCurrentPosition","getDuration","getPlayPercent")); + ignoreStaticMap.put("DevThreadPool", Utils.asListArgs("getThreads","getCalcThreads","execute","execute","execute","shutdown","shutdownNow","isShutdown","isTerminated","awaitTermination","submit","submit","submit","invokeAll","invokeAll","invokeAny","invokeAny","schedule","schedule","scheduleWithFixedRate","scheduleWithFixedDelay")); + ignoreStaticMap.put("DevVideoPlayerControl", Utils.asListArgs("resetOperate","surfaceChanged","surfaceCreated","surfaceDestroyed","onPrepared","onCompletion","onBufferingUpdate","onSeekComplete","onError","onVideoSizeChanged","setMediaListener","pausePlayer","stopPlayer","startPlayer","startPlayer","startPlayer","getSurfaceview","isPlaying","isPlaying","isAutoPlay","setAutoPlay","getPlayUri","getVideoWidth","getVideoHeight","getCurrentPosition","getDuration","getPlayPercent")); + ignoreStaticMap.put("FileBreadthFirstSearchUtils", Utils.asListArgs("setSearchHandler","getQueueSameTimeNumber","setQueueSameTimeNumber","isRunning","stop","isStop","getStartTime","getEndTime","getDelayTime","setDelayTime","query","queryFile","whileQueue")); + ignoreStaticMap.put("FileBreadthFirstSearchUtils.FileItem", Utils.asListArgs("put")); + ignoreStaticMap.put("FileDepthFirstSearchUtils", Utils.asListArgs("setSearchHandler","isRunning","stop","isStop","getStartTime","getEndTime","query","queryFile")); + ignoreStaticMap.put("FilePartAssist", Utils.asListArgs("getFile","getFileName","getFilePartItems","getFilePartItem","getPartCount","existsPart","isOnlyOne","getPartName")); + ignoreStaticMap.put("FilePartItem", Utils.asListArgs("isFirstItem","isLastItem","existsPart","isOnlyOne","getPartName")); + ignoreStaticMap.put("FileUtils.FileList", Utils.asListArgs("getFile","getSubFiles")); + ignoreStaticMap.put("FlashlightUtils", Utils.asListArgs("register","unregister","setFlashlightOn","setFlashlightOn","setFlashlightOff","setFlashlightOff","isFlashlightOn","isFlashlightOn")); + ignoreStaticMap.put("IToastImpl", Utils.asListArgs("reset","setIsHandler","setNullText","setTextLength","init","style","defaultStyle","getToastStyle","initStyle","initToastFilter","setView","show","show","show","show","cancel","filter","handlerContent","getThreadToastStyle","createView","priShowToastText","newToastText","priShowToastView","newToastView")); + ignoreStaticMap.put("ImageUtils.ImageType", Utils.asListArgs("getValue")); + ignoreStaticMap.put("InactivityTimerAssist", Utils.asListArgs("onPause","onResume","onDestroy","start","cancel")); + ignoreStaticMap.put("InactivityTimerAssist.InactivityAsyncTask", Utils.asListArgs("doInBackground")); + ignoreStaticMap.put("InactivityTimerAssist.PowerStateReceiver", Utils.asListArgs("onReceive")); + ignoreStaticMap.put("KeyValueBean", Utils.asListArgs("getKey","getValue","toString")); + ignoreStaticMap.put("KeyguardUtils", Utils.asListArgs("isKeyguardLocked","isKeyguardSecure","inKeyguardRestrictedInputMode","getKeyguardManager","setKeyguardManager","disableKeyguard","reenableKeyguard","release","getKeyguardLock","setKeyguardLock")); + ignoreStaticMap.put("LocationUtils.CustomLocationListener", Utils.asListArgs("onLocationChanged","onStatusChanged","onProviderEnabled","onProviderDisabled")); + ignoreStaticMap.put("LogConfig", Utils.asListArgs("methodCount","methodOffset","outputMethodAll","displayThreadInfo","sortLog","logLevel","tag")); + ignoreStaticMap.put("LoggerPrinter", Utils.asListArgs("other","getLogConfig","init","init","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","checkLogLevel","finalLogPrinter","logHandle","logHandle","logHandle","logHeaderContent","logTopBorder","logBottomBorder","logDivider","logContent","createMessage","getSimpleClassName","getStackOffset","getThreadLogConfig")); + ignoreStaticMap.put("NotificationUtils.VibratePattern", Utils.asListArgs("isEmpty")); + ignoreStaticMap.put("PathUtils.AppExternalPath", Utils.asListArgs("getAppDataPath","getAppDataDir","getAppDataPath","getAppDataDir","getAppCachePath","getAppCacheDir","getAppCachePath","getAppCacheDir","getExternalFilesPath","getExternalFilesDir","getAppFilesPath","getAppFilesDir","getAppFilesPath","getAppFilesDir","getAppMusicPath","getAppMusicDir","getAppPodcastsPath","getAppPodcastsDir","getAppRingtonesPath","getAppRingtonesDir","getAppAlarmsPath","getAppAlarmsDir","getAppNotificationsPath","getAppNotificationsDir","getAppPicturesPath","getAppPicturesDir","getAppMoviesPath","getAppMoviesDir","getAppDownloadPath","getAppDownloadDir","getAppDCIMPath","getAppDCIMDir","getAppDocumentsPath","getAppDocumentsDir","getAppAudiobooksPath","getAppAudiobooksDir","getAppObbPath","getAppObbDir")); + ignoreStaticMap.put("PathUtils.InternalPath", Utils.asListArgs("getRootPath","getRootDirectory","getDataPath","getDataDirectory","getDownloadCachePath","getDownloadCacheDirectory","getAppDataPath","getAppDataDir","getAppDataPath","getAppDataDir","getAppCachePath","getAppCacheDir","getAppCachePath","getAppCacheDir","getAppCodeCachePath","getAppCodeCacheDir","getAppDbsPath","getAppDbsDir","getAppDbPath","getAppDbFile","getAppFilesPath","getAppFilesDir","getAppFilesPath","getAppFilesDir","getAppSpPath","getAppSpDir","getAppSpPath","getAppSpFile","getAppNoBackupFilesPath","getAppNoBackupFilesDir","getAppMusicPath","getAppMusicDir","getAppPodcastsPath","getAppPodcastsDir","getAppRingtonesPath","getAppRingtonesDir","getAppAlarmsPath","getAppAlarmsDir","getAppNotificationsPath","getAppNotificationsDir","getAppPicturesPath","getAppPicturesDir","getAppMoviesPath","getAppMoviesDir","getAppDownloadPath","getAppDownloadDir","getAppDCIMPath","getAppDCIMDir","getAppDocumentsPath","getAppDocumentsDir","getAppAudiobooksPath","getAppAudiobooksDir")); + ignoreStaticMap.put("PathUtils.SDCardPath", Utils.asListArgs("isSDCardEnable","getSDCardFile","getSDCardPath","getSDCardFile","getSDCardPath","getExternalStoragePublicPath","getExternalStoragePublicDir","getMusicPath","getMusicDir","getPodcastsPath","getPodcastsDir","getRingtonesPath","getRingtonesDir","getAlarmsPath","getAlarmsDir","getNotificationsPath","getNotificationsDir","getPicturesPath","getPicturesDir","getMoviesPath","getMoviesDir","getDownloadPath","getDownloadDir","getDCIMPath","getDCIMDir","getDocumentsPath","getDocumentsDir","getAudiobooksPath","getAudiobooksDir")); + ignoreStaticMap.put("PermissionUtils", Utils.asListArgs("callBack","setRequestPermissionsResult","request","request","onRequestPermissionsResultCommon","checkPermissions","requestCallback","getPermissionsStatus")); + ignoreStaticMap.put("PermissionUtils.PermissionActivity", Utils.asListArgs("onCreate","onRequestPermissionsResult")); + ignoreStaticMap.put("PowerManagerUtils", Utils.asListArgs("isScreenOn","turnScreenOn","turnScreenOff","getWakeLock","setWakeLock","getPowerManager","setPowerManager")); + ignoreStaticMap.put("PreferenceImpl", Utils.asListArgs("put","getValue","put","putAll","putAll","putAll","get","getAll","getAll","remove","removeAll","removeAll","contains","clear","getInt","getFloat","getLong","getBoolean","getString","getSet")); + ignoreStaticMap.put("PreferenceImpl.ComparatorImpl", Utils.asListArgs("compare")); + ignoreStaticMap.put("QuickHelper", Utils.asListArgs("getView","targetView","targetViewGroup","targetImageView","targetTextView","targetEditText","viewHelper","devHelper","quickHelper","postRunnable","postRunnable","postRunnable","postRunnable","removeRunnable","setHint","setText","setHtmlText","setHintTextColor","setHintTextColor","setTextColor","setTextColor","setTypeface","setTextSizeByPx","setTextSizeBySp","setTextSizeByDp","setTextSizeByIn","setTextSize","clearFlags","setPaintFlags","setAntiAliasFlag","setBold","setBold","setBold","setUnderlineText","setUnderlineText","setStrikeThruText","setStrikeThruText","setLetterSpacing","setLineSpacing","setLineSpacingAndMultiplier","setTextScaleX","setIncludeFontPadding","setInputType","setImeOptions","setLines","setMaxLines","setMinLines","setMaxEms","setMinEms","setEms","setEllipsize","setAutoLinkMask","setAllCaps","setTextGravity","setText","insert","insert","setMaxLength","setMaxLengthAndText","setCursorVisible","setSelectionToTop","setSelectionToBottom","setSelection","setTransformationMethod","setTransformationMethod","addTextChangedListener","removeTextChangedListener","setKeyListener","setAdjustViewBounds","setMaxHeight","setMaxWidth","setBackground","setBackgroundColor","setBackgroundResource","setBackgroundTintList","setBackgroundTintMode","setForeground","setForegroundGravity","setForegroundTintList","setForegroundTintMode","setImageBitmap","setImageDrawable","setImageResource","setImageMatrix","setImageTintList","setImageTintMode","setScaleType","setColorFilter","setColorFilter","setColorFilter","setColorFilter","setBackgroundResources","setBackgroundResources","setImageResources","setImageResources","setImageBitmaps","setImageBitmaps","setImageDrawables","setImageDrawables","setScaleTypes","setScaleTypes","setWidthHeight","setWidthHeight","setWidth","setWidth","setHeight","setHeight","setMinimumHeight","setMinimumWidth","setAlpha","setTag","scrollTo","scrollBy","setDescendantFocusability","setOverScrollMode","setHorizontalScrollBarEnabled","setVerticalScrollBarEnabled","setScrollContainer","setNextFocusForwardId","setNextFocusDownId","setNextFocusLeftId","setNextFocusRightId","setNextFocusUpId","setRotation","setRotationX","setRotationY","setScaleX","setScaleY","setTextAlignment","setTextDirection","setPivotX","setPivotY","setTranslationX","setTranslationY","setLayerType","requestLayout","requestFocus","clearFocus","requestLayoutParent","setClipChildren","setLayoutParams","setFocusableInTouchMode","setFocusable","toggleFocusable","setSelected","toggleSelected","setEnabled","toggleEnabled","setClickable","toggleClickable","setLongClickable","toggleLongClickable","setVisibility","setVisibility","toggleVisibilitys","reverseVisibilitys","reverseVisibilitys","removeSelfFromParent","setLayoutGravity","setLayoutGravity","setMarginLeft","setMarginLeft","setMarginTop","setMarginTop","setMarginRight","setMarginRight","setMarginBottom","setMarginBottom","setMargin","setMargin","setMargin","setPaddingLeft","setPaddingLeft","setPaddingTop","setPaddingTop","setPaddingRight","setPaddingRight","setPaddingBottom","setPaddingBottom","setPadding","setPadding","setPadding","setCompoundDrawablePadding","setCompoundDrawablesByLeft","setCompoundDrawablesByTop","setCompoundDrawablesByRight","setCompoundDrawablesByBottom","setCompoundDrawables","setCompoundDrawablesWithIntrinsicBoundsByLeft","setCompoundDrawablesWithIntrinsicBoundsByTop","setCompoundDrawablesWithIntrinsicBoundsByRight","setCompoundDrawablesWithIntrinsicBoundsByBottom","setCompoundDrawablesWithIntrinsicBounds","addRule","addRule","removeRule","setAnimation","clearAnimation","startAnimation","cancelAnimation","setOnClicks","setOnLongClicks","setOnTouchs","addTouchArea","addTouchArea","smoothScrollToPosition","scrollToPosition","smoothScrollToTop","scrollToTop","smoothScrollToBottom","scrollToBottom","smoothScrollTo","smoothScrollBy","fullScroll","openKeyboard","openKeyboard","openKeyboard","closeKeyboard","closeKeyBoardSpecial","closeKeyBoardSpecial","closeKeyBoardSpecial","forceGetViewSize")); + ignoreStaticMap.put("ROMUtils.RomInfo", Utils.asListArgs("getName","getVersion","toString")); + ignoreStaticMap.put("ReflectUtils", Utils.asListArgs("newInstance","newInstance","getArgsType","sortConstructors","newInstance","field","field","getField","getAccessibleField","unwrap","setEnumVal","method","method","method","exactMethod","similarMethod","sortMethods","isSimilarSignature","match","accessible","proxy","property","type","wrapper","get","hashCode","equals","toString")); + ignoreStaticMap.put("ResourceAssist", Utils.asListArgs("reset","getPackageName","getResources","getDisplayMetrics","getConfiguration","getAssets","getIdentifier","getResourceName","getStringId","getString","getString","getString","getString","getDimenId","getDimension","getDimensionInt","getDimension","getDimensionInt","getColorId","getColor","getColor","getDrawableId","getDrawable","getNinePatchDrawable","getDrawable","getNinePatchDrawable","getBitmap","getBitmap","getBitmap","getBitmap","getMipmapId","getDrawableMipmap","getNinePatchDrawableMipmap","getBitmapMipmap","getBitmapMipmap","getAnimId","getAnimationXml","getAnimationXml","getAnimation","getAnimation","getAnimation","getAnimation","getBooleanId","getBoolean","getBoolean","getIntegerId","getInteger","getInteger","getArrayId","getIntArray","getStringArray","getTextArray","getIntArray","getStringArray","getTextArray","getId","getLayoutId","getMenuId","getRawId","getAttrId","getStyleId","getStyleableId","getAnimatorId","getXmlId","getInterpolatorId","getPluralsId","getColorStateList","getColorStateList","getColorDrawable","getColorDrawable","openInputStream","openInputStream","openOutputStream","openOutputStream","openOutputStream","openOutputStream","openFileDescriptor","openFileDescriptor","openAssetFileDescriptor","openAssetFileDescriptor","open","openFd","openNonAssetFd","openRawResource","openRawResourceFd","readBytesFromAssets","readStringFromAssets","readBytesFromRaw","readStringFromRaw","geFileToListFromAssets","geFileToListFromRaw","saveAssetsFormFile","saveRawFormFile")); + ignoreStaticMap.put("ResourcePluginUtils", Utils.asListArgs("getResourceAssist","getResources","getPackageName","getAPKPath","getApkInfoItem","getDisplayMetrics","getConfiguration","getAssets","getIdentifier","getResourceName","getStringId","getString","getString","getString","getString","getDimenId","getDimension","getDimensionInt","getDimension","getDimensionInt","getColorId","getColor","getColor","getDrawableId","getDrawable","getNinePatchDrawable","getDrawable","getNinePatchDrawable","getBitmap","getBitmap","getBitmap","getBitmap","getMipmapId","getDrawableMipmap","getNinePatchDrawableMipmap","getBitmapMipmap","getBitmapMipmap","getAnimId","getAnimationXml","getAnimationXml","getAnimation","getAnimation","getAnimation","getAnimation","getBooleanId","getBoolean","getBoolean","getIntegerId","getInteger","getInteger","getArrayId","getIntArray","getStringArray","getTextArray","getIntArray","getStringArray","getTextArray","getId","getLayoutId","getMenuId","getRawId","getAttrId","getStyleId","getStyleableId","getAnimatorId","getXmlId","getInterpolatorId","getPluralsId","getColorStateList","getColorStateList","getColorDrawable","getColorDrawable","open","openFd","openNonAssetFd","openRawResource","openRawResourceFd","readBytesFromAssets","readStringFromAssets","readBytesFromRaw","readStringFromRaw","geFileToListFromAssets","geFileToListFromRaw","saveAssetsFormFile","saveRawFormFile")); + ignoreStaticMap.put("ScaleUtils.XY", Utils.asListArgs("getXYx","getXY","getXY","compareTo")); + ignoreStaticMap.put("ScreenSensorAssist", Utils.asListArgs("init","start","stop","isPortrait","isAllowChange")); + ignoreStaticMap.put("ScreenSensorAssist.OrientationSensorChangeListener", Utils.asListArgs("onAccuracyChanged","onSensorChanged")); + ignoreStaticMap.put("ScreenSensorAssist.OrientationSensorListener", Utils.asListArgs("onAccuracyChanged","onSensorChanged")); + ignoreStaticMap.put("ScreenshotUtils", Utils.asListArgs("registerContentObserver","unregisterContentObserver","getStartListenTime","isCheckPrefix","setCheckPrefix","getScreenshotChecker","setScreenshotChecker","getListener","setListener","startListen","startListen","startListen","stopListen")); + ignoreStaticMap.put("ScreenshotUtils.MediaContentObserver", Utils.asListArgs("onChange")); + ignoreStaticMap.put("ShapeUtils", Utils.asListArgs("getDrawable","setDrawable","setAlpha","setShape","setInnerRadius","setInnerRadiusRatio","setThickness","setThicknessRatio","setColor","setColor","setStroke","setStroke","setStroke","setStroke","setCornerRadius","setCornerRadius","setCornerRadiusLeft","setCornerRadiusRight","setCornerRadiusTop","setCornerRadiusBottom","setColors","setGradientType","setOrientation","setGradientCenter","setGradientRadius","setUseLevel","setPadding","setPadding","setSize")); + ignoreStaticMap.put("ShellUtils.CommandResult", Utils.asListArgs("isSuccess","isSuccess2","isSuccess3","isSuccess4")); + ignoreStaticMap.put("SnackbarUtils", Utils.asListArgs("getStyle","setStyle","getSnackbar","getSnackbarView","getTextView","getActionButton","getSnackbarLayout","getSnackbarContentLayout","addView","addView","setCallback","setAction","setAction","setAction","setAction","dismiss","dismiss","showShort","showLong","showIndefinite","showShort","showLong","showIndefinite","priShow","setSnackbarStyle","setSnackbarStyle","getShadowMargin","setShadowMargin","isAutoCalc","setAutoCalc","clearLocations","above","bellow","setSnackbarLocation","setLayoutGravity","setMargin")); + ignoreStaticMap.put("SnackbarUtils.StyleBuilder", Utils.asListArgs("getRootGravity","setRootGravity","getRootCornerRadius","setRootCornerRadius","getRootBackgroundTintColor","setRootBackgroundTintColor","getRootBackground","setRootBackground","getRootMargin","setRootMargin","getRootAlpha","setRootAlpha","getTextGravity","setTextGravity","getTextColor","setTextColor","getTextSize","setTextSize","getTextMaxLines","setTextMaxLines","getTextEllipsize","setTextEllipsize","getTextTypeface","setTextTypeface","getTextPadding","setTextPadding","getActionGravity","setActionGravity","getActionColor","setActionColor","getActionSize","setActionSize","getActionPadding","setActionPadding","getActionCornerRadius","setActionCornerRadius","getActionBackgroundTintColor","setActionBackgroundTintColor","getActionBackground","setActionBackground")); + ignoreStaticMap.put("SpanUtils", Utils.asListArgs("setFlag","setForegroundColor","setBackgroundColor","setLineHeight","setLineHeight","setQuoteColor","setQuoteColor","setLeadingMargin","setBullet","setBullet","setFontSize","setFontSize","setFontProportion","setFontXProportion","setStrikethrough","setUnderline","setSuperscript","setSubscript","setBold","setItalic","setBoldItalic","setFontFamily","setTypeface","setHorizontalAlign","setVerticalAlign","setClickSpan","setUrl","setBlur","setShader","setShadow","setSpans","append","appendLine","appendLine","appendImage","appendImage","appendImage","appendImage","appendImage","appendImage","appendSpace","appendSpace","get","create","apply","applyLast","updateCharCharSequence","updateImage","updateSpace","setDefault")); + ignoreStaticMap.put("SpanUtils.CustomBulletSpan", Utils.asListArgs("getLeadingMargin","drawLeadingMargin")); + ignoreStaticMap.put("SpanUtils.CustomImageSpan", Utils.asListArgs("getDrawable")); + ignoreStaticMap.put("SpanUtils.CustomLineHeightSpan", Utils.asListArgs("chooseHeight")); + ignoreStaticMap.put("SpanUtils.CustomQuoteSpan", Utils.asListArgs("getLeadingMargin","drawLeadingMargin")); + ignoreStaticMap.put("SpanUtils.CustomTypefaceSpan", Utils.asListArgs("updateDrawState","updateMeasureState","apply")); + ignoreStaticMap.put("SpanUtils.ShaderSpan", Utils.asListArgs("updateDrawState")); + ignoreStaticMap.put("SpanUtils.ShadowSpan", Utils.asListArgs("updateDrawState")); + ignoreStaticMap.put("SpanUtils.SpaceSpan", Utils.asListArgs("getSize","draw")); + ignoreStaticMap.put("SpanUtils.VerticalAlignSpan", Utils.asListArgs("getSize","draw")); + ignoreStaticMap.put("TimeAverager", Utils.asListArgs("start","end","endAndRestart","average","print","clear")); + ignoreStaticMap.put("TimeCounter", Utils.asListArgs("start","durationRestart","duration","getStartTime")); + ignoreStaticMap.put("TimeKeeper", Utils.asListArgs("waitForEndAsyn","waitForEnd")); + ignoreStaticMap.put("TimerManager.TimerTask", Utils.asListArgs("start","close","startTimer","closeTimer","isRunTimer","getTriggerNumber","getTriggerLimit","isTriggerEnd","isInfinite","setHandler","setNotifyWhat","setNotifyObject","setTime","setTriggerLimit")); + ignoreStaticMap.put("ToastFactory.BaseToast", Utils.asListArgs("setView","setText","findTextView","isEmptyMessageView","getMessageView")); + ignoreStaticMap.put("ToastFactory.NotificationToast", Utils.asListArgs("show","cancel")); + ignoreStaticMap.put("ToastFactory.SafeToast.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreStaticMap.put("ToastFactory.ToastHelper", Utils.asListArgs("handleMessage","show","cancel")); + ignoreStaticMap.put("ToastTintUtils.DefaultStyle", Utils.asListArgs("getTextColor","getTextSize","getBackgroundTintColor","getBackground","getMaxLines","getEllipsize","getTypeface","getTintIconColor","isTintIcon")); + ignoreStaticMap.put("ToastTintUtils.ErrorStyle", Utils.asListArgs("getBackgroundTintColor","isTintIcon")); + ignoreStaticMap.put("ToastTintUtils.InfoStyle", Utils.asListArgs("getBackgroundTintColor","isTintIcon")); + ignoreStaticMap.put("ToastTintUtils.NormalStyle", Utils.asListArgs("getBackgroundTintColor","isTintIcon")); + ignoreStaticMap.put("ToastTintUtils.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreStaticMap.put("ToastTintUtils.SuccessStyle", Utils.asListArgs("getBackgroundTintColor","isTintIcon")); + ignoreStaticMap.put("ToastTintUtils.WarningStyle", Utils.asListArgs("getBackgroundTintColor","isTintIcon")); + ignoreStaticMap.put("ToastUtils.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreStaticMap.put("TypeUtils.ParameterizedTypeImpl", Utils.asListArgs("getActualTypeArguments","getOwnerType","getRawType","equals","hashCode")); + ignoreStaticMap.put("ViewHelper", Utils.asListArgs("viewHelper","devHelper","quickHelper","postRunnable","postRunnable","postRunnable","postRunnable","removeRunnable","setHint","setText","setTexts","setHtmlText","setHtmlTexts","setHintTextColor","setHintTextColor","setHintTextColors","setHintTextColors","setTextColor","setTextColor","setTextColors","setTextColors","setTypeface","setTextSizeByPx","setTextSizeBySp","setTextSizeByDp","setTextSizeByIn","setTextSize","setTextSizes","clearFlags","setPaintFlags","setAntiAliasFlag","setBold","setBold","setBold","setUnderlineText","setUnderlineText","setStrikeThruText","setStrikeThruText","setLetterSpacing","setLineSpacing","setLineSpacingAndMultiplier","setTextScaleX","setIncludeFontPadding","setInputType","setImeOptions","setLines","setMaxLines","setMinLines","setMaxEms","setMinEms","setEms","setEllipsize","setAutoLinkMask","setAllCaps","setTextGravity","setText","insert","insert","setMaxLength","setMaxLengthAndText","setCursorVisible","setSelectionToTop","setSelectionToBottom","setSelection","setTransformationMethod","setTransformationMethod","setTransformationMethod","addTextChangedListener","removeTextChangedListener","setKeyListener","setKeyListener","setKeyListener","setAdjustViewBounds","setMaxHeight","setMaxWidth","setBackground","setBackgroundColor","setBackgroundResource","setBackgroundTintList","setBackgroundTintMode","setForeground","setForegroundGravity","setForegroundTintList","setForegroundTintMode","setImageBitmap","setImageDrawable","setImageResource","setImageMatrix","setImageTintList","setImageTintMode","setScaleType","setColorFilter","setColorFilter","setColorFilter","setColorFilter","setBackgroundResources","setBackgroundResources","setImageResources","setImageResources","setImageBitmaps","setImageBitmaps","setImageDrawables","setImageDrawables","setScaleTypes","setScaleTypes","setWidthHeight","setWidthHeight","setWidth","setWidth","setHeight","setHeight","setMinimumHeight","setMinimumWidth","setAlpha","setTag","scrollTo","scrollBy","setDescendantFocusability","setOverScrollMode","setHorizontalScrollBarEnabled","setVerticalScrollBarEnabled","setScrollContainer","setNextFocusForwardId","setNextFocusDownId","setNextFocusLeftId","setNextFocusRightId","setNextFocusUpId","setRotation","setRotationX","setRotationY","setScaleX","setScaleY","setTextAlignment","setTextDirection","setPivotX","setPivotY","setTranslationX","setTranslationY","setLayerType","requestLayout","requestFocus","clearFocus","requestLayoutParent","setClipChildren","setLayoutParams","setFocusableInTouchMode","setFocusable","toggleFocusable","setSelected","toggleSelected","setEnabled","toggleEnabled","setClickable","toggleClickable","setLongClickable","toggleLongClickable","setVisibility","setVisibility","setVisibilitys","setVisibilitys","toggleVisibilitys","toggleVisibilitys","toggleVisibilitys","reverseVisibilitys","reverseVisibilitys","reverseVisibilitys","reverseVisibilitys","removeSelfFromParent","setLayoutGravity","setLayoutGravity","setMarginLeft","setMarginLeft","setMarginTop","setMarginTop","setMarginRight","setMarginRight","setMarginBottom","setMarginBottom","setMargin","setMargin","setMargin","setMargin","setMargin","setMargin","setPaddingLeft","setPaddingLeft","setPaddingTop","setPaddingTop","setPaddingRight","setPaddingRight","setPaddingBottom","setPaddingBottom","setPadding","setPadding","setPadding","setPadding","setPadding","setPadding","setCompoundDrawablePadding","setCompoundDrawablesByLeft","setCompoundDrawablesByTop","setCompoundDrawablesByRight","setCompoundDrawablesByBottom","setCompoundDrawables","setCompoundDrawablesWithIntrinsicBoundsByLeft","setCompoundDrawablesWithIntrinsicBoundsByTop","setCompoundDrawablesWithIntrinsicBoundsByRight","setCompoundDrawablesWithIntrinsicBoundsByBottom","setCompoundDrawablesWithIntrinsicBounds","addRule","addRule","removeRule","addRules","addRules","removeRules","setAnimation","clearAnimation","startAnimation","cancelAnimation","setOnClicks","setOnLongClicks","setOnTouchs","addTouchArea","addTouchArea","smoothScrollToPosition","scrollToPosition","smoothScrollToTop","scrollToTop","smoothScrollToBottom","scrollToBottom","smoothScrollTo","smoothScrollBy","fullScroll")); + ignoreStaticMap.put("WifiHotUtils", Utils.asListArgs("stratWifiAp","closeWifiAp","getWifiApState","getWifiApConfiguration","setWifiApConfiguration","isOpenWifiAp","closeWifiApCheck","isConnectHot","getHotspotServiceIp","getHotspotAllotIp","getConnectHotspotMsg","getHotspotSplitIpMask","intToString","getApWifiSSID","getApWifiPwd","setOnWifiAPListener")); + ignoreStaticMap.put("WifiUtils", Utils.asListArgs("isOpenWifi","openWifi","closeWifi","toggleWifiEnabled","getWifiState","startScan","getConfiguration","getWifiList","getWifiInfo","isExists","isExists","quickConnWifi","quickConnWifi","removeWifiConfig","disconnectWifi","setStaticWifiConfig","setStaticWifiConfig","inetAddressToInt","setDNS","setGateway","setIpAddress","setStaticIpConfig","getField","getDeclaredField","setEnumField","setValueField")); + ignoreStaticMap.put("WifiVo", Utils.asListArgs("describeContents","writeToParcel")); + + return ignoreStaticMap; + } + + /** + * 获取忽略指定方法 @param 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreParamMap() { + Map> ignoreParamMap = new HashMap(); + ignoreParamMap.put("ActivityUtils.ResultActivity", Utils.asListArgs("onCreate","onActivityResult")); + ignoreParamMap.put("AutoFocusAssist.AutoFocusTask", Utils.asListArgs("doInBackground")); + ignoreParamMap.put("Base64.Coder", Utils.asListArgs("process","maxOutputSize")); + ignoreParamMap.put("Base64.Decoder", Utils.asListArgs("maxOutputSize","process")); + ignoreParamMap.put("Base64.Encoder", Utils.asListArgs("maxOutputSize","process")); + ignoreParamMap.put("CalendarUtils", Utils.asListArgs("getBitInt","solarToInt","solarFromInt")); + ignoreParamMap.put("CalendarUtils.Festival", Utils.asListArgs("compareTo")); + ignoreParamMap.put("ClassUtils", Utils.asListArgs("getClass","getClass")); + ignoreParamMap.put("ClickUtils.OnCountClickListener", Utils.asListArgs("onClick")); + ignoreParamMap.put("ClickUtils.OnDebouncingClickListener", Utils.asListArgs("onClick")); + ignoreParamMap.put("ColorUtils.ColorInfo.ColorParser", Utils.asListArgs("handleColor")); + ignoreParamMap.put("ContentResolverUtils.MediaQueryInfo", Utils.asListArgs("getResult","getProjection","getSelection","getSelectionArgs")); + ignoreParamMap.put("ContentResolverUtils.MediaQueryInfoUri", Utils.asListArgs("getSelection","getSelectionArgs")); + ignoreParamMap.put("ContentResolverUtils.MediaQueryUri", Utils.asListArgs("getResult","getProjection","getSelection","getSelectionArgs")); + ignoreParamMap.put("InactivityTimerAssist.InactivityAsyncTask", Utils.asListArgs("doInBackground")); + ignoreParamMap.put("InactivityTimerAssist.PowerStateReceiver", Utils.asListArgs("onReceive")); + ignoreParamMap.put("JCLogUtils", Utils.asListArgs("d","e","e","e","i","xml","dTag","eTag","eTag","eTag","iTag","xmlTag")); + ignoreParamMap.put("LogPrintUtils", Utils.asListArgs("d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag")); + ignoreParamMap.put("PreferenceImpl.ComparatorImpl", Utils.asListArgs("compare")); + ignoreParamMap.put("ScaleUtils.XY", Utils.asListArgs("getXY","compareTo")); + ignoreParamMap.put("ScreenSensorAssist.OrientationSensorChangeListener", Utils.asListArgs("onAccuracyChanged","onSensorChanged")); + ignoreParamMap.put("ScreenSensorAssist.OrientationSensorListener", Utils.asListArgs("onAccuracyChanged","onSensorChanged")); + ignoreParamMap.put("ScreenshotUtils.MediaContentObserver", Utils.asListArgs("onChange")); + ignoreParamMap.put("SpanUtils.CustomBulletSpan", Utils.asListArgs("getLeadingMargin","drawLeadingMargin")); + ignoreParamMap.put("SpanUtils.CustomDynamicDrawableSpan", Utils.asListArgs("getSize","draw")); + ignoreParamMap.put("SpanUtils.CustomLineHeightSpan", Utils.asListArgs("chooseHeight")); + ignoreParamMap.put("SpanUtils.CustomQuoteSpan", Utils.asListArgs("getLeadingMargin","drawLeadingMargin")); + ignoreParamMap.put("SpanUtils.CustomTypefaceSpan", Utils.asListArgs("updateDrawState","updateMeasureState","apply")); + ignoreParamMap.put("SpanUtils.ShaderSpan", Utils.asListArgs("updateDrawState")); + ignoreParamMap.put("SpanUtils.ShadowSpan", Utils.asListArgs("updateDrawState")); + ignoreParamMap.put("SpanUtils.SpaceSpan", Utils.asListArgs("getSize","draw")); + ignoreParamMap.put("SpanUtils.VerticalAlignSpan", Utils.asListArgs("getSize","draw")); + ignoreParamMap.put("ToastFactory.BaseToast", Utils.asListArgs("setView","setText")); + ignoreParamMap.put("ToastFactory.SafeToast.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreParamMap.put("ToastFactory.ToastHelper", Utils.asListArgs("handleMessage")); + ignoreParamMap.put("ToastTintUtils.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreParamMap.put("ToastUtils.SafeHandler", Utils.asListArgs("handleMessage","dispatchMessage")); + ignoreParamMap.put("TypeUtils.ParameterizedTypeImpl", Utils.asListArgs("equals")); + ignoreParamMap.put("WifiVo", Utils.asListArgs("writeToParcel")); + + return ignoreParamMap; + } + + /** + * 获取忽略指定方法 @return 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnMap() { + Map> ignoreReturnMap = new HashMap(); + ignoreReturnMap.put("BarUtils", Utils.asListArgs("setStatusBarColor","setStatusBarColor","setStatusBarColor","setStatusBarColor")); + ignoreReturnMap.put("Base64", Utils.asListArgs("decode","decode","decode","encodeToString","encodeToString","encode","encode")); + + return ignoreReturnMap; + } + + /** + * 获取忽略指定方法非 public 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreUnPublicMap() { + Map> ignoreUnPublicMap = new HashMap(); + ignoreUnPublicMap.put("ActivityUtils.ResultActivity", Utils.asListArgs("start","onCreate","onActivityResult","onDestroy")); + ignoreUnPublicMap.put("ActivityUtils.ResultCallback", Utils.asListArgs("onStartActivityForResult","onActivityResult")); + ignoreUnPublicMap.put("AnalysisRecordUtils", Utils.asListArgs("saveLogRecord","splitLog","handlerDeviceInfo")); + ignoreUnPublicMap.put("AnalysisRecordUtils.CallBack", Utils.asListArgs("callback")); + ignoreUnPublicMap.put("ApkInfoItem", Utils.asListArgs("get")); + ignoreUnPublicMap.put("AppInfoBean", Utils.asListArgs("get")); + ignoreUnPublicMap.put("AppInfoItem", Utils.asListArgs("get")); + ignoreUnPublicMap.put("AutoFocusAssist", Utils.asListArgs("autoFocusAgainLater","cancelOutstandingTask")); + ignoreUnPublicMap.put("AutoFocusAssist.AutoFocusTask", Utils.asListArgs("doInBackground")); + ignoreUnPublicMap.put("BarUtils", Utils.asListArgs("addMarginTopEqualStatusBarHeight","subtractMarginTopEqualStatusBarHeight","applyStatusBarColor","applyStatusBarColor","hideStatusBarView","hideStatusBarView","showStatusBarView","createStatusBarView")); + ignoreUnPublicMap.put("BeepVibrateAssist", Utils.asListArgs("shouldBeep","streamUpdate")); + ignoreUnPublicMap.put("CalendarUtils", Utils.asListArgs("getBitInt","solarToInt","solarFromInt","solarTermsDateSplit")); + ignoreUnPublicMap.put("CalendarUtils.FestivalHook", Utils.asListArgs("hook")); + ignoreUnPublicMap.put("CameraAssist", Utils.asListArgs("freeCameraResource")); + ignoreUnPublicMap.put("CameraAssist.PreviewNotify", Utils.asListArgs("stopPreviewNotify","startPreviewNotify")); + ignoreUnPublicMap.put("CameraSizeAssist", Utils.asListArgs("calcPreviewSize","calcPictureSize","calcVideoSize")); + ignoreUnPublicMap.put("CapturePictureUtils", Utils.asListArgs("snapshotByRecyclerView_GridLayoutManager","snapshotByRecyclerView_LinearLayoutManager","snapshotByRecyclerView_StaggeredGridLayoutManager","canvasBitmap")); + ignoreUnPublicMap.put("ChineseUtils", Utils.asListArgs("numberToCHNNumber","thousandConvertCHN")); + ignoreUnPublicMap.put("CollectionUtils.ArrayWithTypeToken", Utils.asListArgs("newInstance","newInstance")); + ignoreUnPublicMap.put("ColorUtils", Utils.asListArgs("priParseColor")); + ignoreUnPublicMap.put("ColorUtils.ColorInfo", Utils.asListArgs("priConvert","RGBtoHSB")); + ignoreUnPublicMap.put("ColorUtils.ColorInfo.Parser", Utils.asListArgs("handleColor")); + ignoreUnPublicMap.put("ConvertUtils", Utils.asListArgs("toDigit","toHexChars","toHexString")); + ignoreUnPublicMap.put("CoordinateUtils", Utils.asListArgs("transformLat","transformLng","rad")); + ignoreUnPublicMap.put("CrashUtils", Utils.asListArgs("handleException")); + ignoreUnPublicMap.put("CrashUtils.CrashCatchListener", Utils.asListArgs("handleException","uncaughtException")); + ignoreUnPublicMap.put("Decrypt", Utils.asListArgs("decrypt")); + ignoreUnPublicMap.put("DevCache", Utils.asListArgs("myPid","getCachePath")); + ignoreUnPublicMap.put("DevCacheManager", Utils.asListArgs("calculateCacheSizeAndCacheCount","put","get","newFile","remove","clear","removeNext","calculateSize")); + ignoreUnPublicMap.put("DevCacheUtils", Utils.asListArgs("isDue","isDue","newStringWithDateInfo","newByteArrayWithDateInfo","createDateInfo","clearDateInfo","clearDateInfo","hasDateInfo","getDateInfoFromDate","indexOf","copyOfRange","bitmapToByte","byteToBitmap","drawableToBitmap","bitmapToDrawable")); + ignoreUnPublicMap.put("DevLogger.Print", Utils.asListArgs("printLog")); + ignoreUnPublicMap.put("DevMediaManager", Utils.asListArgs("createMedia","destroyMedia","bindListener","clearMediaPlayerData")); + ignoreUnPublicMap.put("DevMediaManager.MediaListener", Utils.asListArgs("onPrepared","onCompletion","onBufferingUpdate","onSeekComplete","onError","onVideoSizeChanged")); + ignoreUnPublicMap.put("DevVideoPlayerControl", Utils.asListArgs("resetOperate")); + ignoreUnPublicMap.put("DeviceUtils", Utils.asListArgs("getMacAddressByWifiInfo","getMacAddressByNetworkInterface","getMacAddressByInetAddress","getInetAddress","getMacAddressByFile")); + ignoreUnPublicMap.put("Encrypt", Utils.asListArgs("encrypt")); + ignoreUnPublicMap.put("EncryptUtils", Utils.asListArgs("base64Encode","base64Decode")); + ignoreUnPublicMap.put("FileBreadthFirstSearchUtils", Utils.asListArgs("queryFile","whileQueue")); + ignoreUnPublicMap.put("FileBreadthFirstSearchUtils.FileItem", Utils.asListArgs("put")); + ignoreUnPublicMap.put("FileBreadthFirstSearchUtils.SearchHandler", Utils.asListArgs("isHandlerFile","isAddToList","OnEndListener")); + ignoreUnPublicMap.put("FileDepthFirstSearchUtils", Utils.asListArgs("queryFile")); + ignoreUnPublicMap.put("FileDepthFirstSearchUtils.SearchHandler", Utils.asListArgs("isHandlerFile","isAddToList","OnEndListener")); + ignoreUnPublicMap.put("FileRecordUtils.CallBack", Utils.asListArgs("callback")); + ignoreUnPublicMap.put("FileUtils", Utils.asListArgs("copyFolder")); + ignoreUnPublicMap.put("FileUtils.OnReplaceListener", Utils.asListArgs("onReplace")); + ignoreUnPublicMap.put("HandlerUtils.OnEndListener", Utils.asListArgs("onEnd")); + ignoreUnPublicMap.put("HttpURLConnectionUtils", Utils.asListArgs("reqNetTime")); + ignoreUnPublicMap.put("HttpURLConnectionUtils.CallBack", Utils.asListArgs("onResponse","onFail")); + ignoreUnPublicMap.put("HttpURLConnectionUtils.TimeCallBack", Utils.asListArgs("onResponse","onFail")); + ignoreUnPublicMap.put("IDCardUtils", Utils.asListArgs("convertCharToInt","validateDateSmllerThenNow","isNumber")); + ignoreUnPublicMap.put("IPreference", Utils.asListArgs("put","putAll","putAll","putAll","get","getAll","getAll","remove","removeAll","removeAll","contains","clear","getInt","getFloat","getLong","getBoolean","getString","getSet")); + ignoreUnPublicMap.put("IPrinter", Utils.asListArgs("other","getLogConfig","init","init","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag")); + ignoreUnPublicMap.put("IToast.Filter", Utils.asListArgs("filter","handlerContent")); + ignoreUnPublicMap.put("IToast.Operate", Utils.asListArgs("reset","setIsHandler","setNullText","setTextLength","init","style","defaultStyle","getToastStyle","initStyle","initToastFilter","setView","show","show","show","show","cancel")); + ignoreUnPublicMap.put("IToast.Style", Utils.asListArgs("getGravity","getXOffset","getYOffset","getHorizontalMargin","getVerticalMargin","getZ","getCornerRadius","getBackgroundTintColor","getBackground","getTextColor","getTextSize","getMaxLines","getEllipsize","getTypeface","getPadding")); + ignoreUnPublicMap.put("IToastImpl", Utils.asListArgs("getThreadToastStyle","createView","priShowToastText","newToastText","priShowToastView","newToastView")); + ignoreUnPublicMap.put("ImageConvertUtils.BMP", Utils.asListArgs("addBMPImageHeader","addBMPImageInfosHeader","addBMP_ARGB_8888")); + ignoreUnPublicMap.put("ImageViewUtils", Utils.asListArgs("getImageViewFieldValue")); + ignoreUnPublicMap.put("InactivityTimerAssist", Utils.asListArgs("start","cancel")); + ignoreUnPublicMap.put("InactivityTimerAssist.InactivityAsyncTask", Utils.asListArgs("doInBackground")); + ignoreUnPublicMap.put("JCLogUtils", Utils.asListArgs("isEmpty","printLog","createMessage","splitErrorMessage")); + ignoreUnPublicMap.put("JCLogUtils.Print", Utils.asListArgs("printLog")); + ignoreUnPublicMap.put("KeyBoardUtils", Utils.asListArgs("getContentViewInvisibleHeight")); + ignoreUnPublicMap.put("KeyBoardUtils.OnSoftInputChangedListener", Utils.asListArgs("onSoftInputChanged")); + ignoreUnPublicMap.put("LocationUtils", Utils.asListArgs("getCriteria")); + ignoreUnPublicMap.put("LocationUtils.OnLocationChangeListener", Utils.asListArgs("getLastKnownLocation","onLocationChanged","onStatusChanged")); + ignoreUnPublicMap.put("LogPrintUtils", Utils.asListArgs("isEmpty","printLog","createMessage","splitErrorMessage")); + ignoreUnPublicMap.put("LogPrintUtils.Print", Utils.asListArgs("printLog")); + ignoreUnPublicMap.put("LoggerPrinter", Utils.asListArgs("isPrintLog","checkLogLevel","finalLogPrinter","logHandle","logHandle","logHandle","logHeaderContent","logTopBorder","logBottomBorder","logDivider","logContent","createMessage","getSimpleClassName","getStackOffset","getThreadLogConfig")); + ignoreUnPublicMap.put("PermissionUtils", Utils.asListArgs("onRequestPermissionsResultCommon","isGranted","checkPermissions","requestCallback","getPermissionsStatus")); + ignoreUnPublicMap.put("PermissionUtils.PermissionActivity", Utils.asListArgs("start","onCreate")); + ignoreUnPublicMap.put("PermissionUtils.PermissionCallBack", Utils.asListArgs("onGranted","onDenied")); + ignoreUnPublicMap.put("PreferenceImpl", Utils.asListArgs("put","getValue")); + ignoreUnPublicMap.put("QuickHelper", Utils.asListArgs("targetView","targetViewGroup","targetImageView","targetTextView","targetEditText")); + ignoreUnPublicMap.put("ROMUtils", Utils.asListArgs("isRightRom","getManufacturer","getBrand","getRomVersion","getSystemProperty","getSystemPropertyByShell","getSystemPropertyByStream","getSystemPropertyByReflect","_getRomInfo")); + ignoreUnPublicMap.put("ReflectUtils", Utils.asListArgs("forName","forName","getArgsType","sortConstructors","newInstance","getField","getAccessibleField","unwrap","method","exactMethod","similarMethod","sortMethods","isSimilarSignature","match","accessible","property","wrapper")); + ignoreUnPublicMap.put("ScreenSensorAssist", Utils.asListArgs("init")); + ignoreUnPublicMap.put("ScreenshotUtils", Utils.asListArgs("registerContentObserver","unregisterContentObserver")); + ignoreUnPublicMap.put("ScreenshotUtils.OnScreenshotListener", Utils.asListArgs("onScreenshot")); + ignoreUnPublicMap.put("ScreenshotUtils.ScreenshotChecker", Utils.asListArgs("onChange","onChecker")); + ignoreUnPublicMap.put("ShellUtils", Utils.asListArgs("consumeInputStream")); + ignoreUnPublicMap.put("ShortCutUtils", Utils.asListArgs("getAuthority","getAuthorityFromPermission","getAuthorityFromPermission")); + ignoreUnPublicMap.put("SignaturesUtils", Utils.asListArgs("loadCertificates")); + ignoreUnPublicMap.put("SizeUtils.onGetSizeListener", Utils.asListArgs("onGetSize")); + ignoreUnPublicMap.put("SnackbarUtils", Utils.asListArgs("priShow","clearLocations","setSnackbarLocation","setLayoutGravity","setMargin")); + ignoreUnPublicMap.put("SpanUtils", Utils.asListArgs("apply","applyLast","updateCharCharSequence","updateImage","updateSpace","setDefault","getContext")); + ignoreUnPublicMap.put("SpanUtils.CustomDynamicDrawableSpan", Utils.asListArgs("getCachedDrawable")); + ignoreUnPublicMap.put("SpanUtils.CustomTypefaceSpan", Utils.asListArgs("apply")); + ignoreUnPublicMap.put("TimeKeeper.OnEndCallback", Utils.asListArgs("onEnd")); + ignoreUnPublicMap.put("TimerManager.TimerTask", Utils.asListArgs("start","close")); + ignoreUnPublicMap.put("ToastFactory", Utils.asListArgs("getWindowManager")); + ignoreUnPublicMap.put("ToastFactory.BaseToast", Utils.asListArgs("findTextView")); + ignoreUnPublicMap.put("ToastFactory.ToastHelper", Utils.asListArgs("show","cancel")); + ignoreUnPublicMap.put("ToastTintUtils", Utils.asListArgs("showToastView","newToastView","inflaterView","reflectToastHandler")); + ignoreUnPublicMap.put("ToastTintUtils.Filter", Utils.asListArgs("filter","handlerContent")); + ignoreUnPublicMap.put("ToastTintUtils.Style", Utils.asListArgs("getTextColor","getTextSize","getBackgroundTintColor","getBackground","getMaxLines","getEllipsize","getTypeface","getTintIconColor","isTintIcon")); + ignoreUnPublicMap.put("ToastUtils", Utils.asListArgs("priShowToastText","handlerToastRes","handlerToastStr","reflectToastHandler")); + ignoreUnPublicMap.put("ToastUtils.Filter", Utils.asListArgs("filter","handlerContent")); + ignoreUnPublicMap.put("UriUtils", Utils.asListArgs("getFilePathByUri")); + ignoreUnPublicMap.put("WifiHotUtils", Utils.asListArgs("intToString")); + ignoreUnPublicMap.put("WifiHotUtils.OnWifiAPListener", Utils.asListArgs("onStarted","onStopped","onFailed")); + ignoreUnPublicMap.put("WifiUtils", Utils.asListArgs("setStaticWifiConfig","setStaticWifiConfig","inetAddressToInt","setDNS","setGateway","setIpAddress","setStaticIpConfig","getField","getDeclaredField","setEnumField","setValueField")); + ignoreUnPublicMap.put("ZipUtils", Utils.asListArgs("zipFile","unzipChildFile")); + + return ignoreUnPublicMap; + } + + /** + * 获取忽略无修饰符变量处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreModifierVariableMap() { + Map> ignoreModifierVariableMap = new HashMap(); + ignoreModifierVariableMap.put("Base64", Utils.asListArgs(" int tailLen;")); + ignoreModifierVariableMap.put("Base64.Encoder", Utils.asListArgs(" int tailLen;")); + + return ignoreModifierVariableMap; + } + + /** + * 获取忽略指定方法 return void 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnVoidMap() { + Map> ignoreReturnVoidMap = new HashMap(); + ignoreReturnVoidMap.put("ADBUtils", Utils.asListArgs("sendEventSlide - void")); + ignoreReturnVoidMap.put("AccessibilityUtils", Utils.asListArgs("setService - void","printAccessibilityEvent - void","printAccessibilityEvent - void")); + ignoreReturnVoidMap.put("ActivityUtils.ResultCallback", Utils.asListArgs("onActivityResult - void")); + ignoreReturnVoidMap.put("AnalysisRecordUtils", Utils.asListArgs("init - void","setCallBack - void","setHandler - void","setAppendSpace - void","setLogFolderName - void","setLogStoragePath - void")); + ignoreReturnVoidMap.put("AnalysisRecordUtils.CallBack", Utils.asListArgs("callback - void")); + ignoreReturnVoidMap.put("AppInfoUtils", Utils.asListArgs("printAppPermission - void")); + ignoreReturnVoidMap.put("AutoFocusAssist", Utils.asListArgs("setFocusModes - void","setAutoFocus - void","onAutoFocus - void","autoFocusAgainLater - void","start - void","stop - void","cancelOutstandingTask - void")); + ignoreReturnVoidMap.put("BarUtils", Utils.asListArgs("addMarginTopEqualStatusBarHeight - void","subtractMarginTopEqualStatusBarHeight - void","hideStatusBarView - void","hideStatusBarView - void","showStatusBarView - void")); + ignoreReturnVoidMap.put("BeepVibrateAssist", Utils.asListArgs("streamUpdate - void","close - void")); + ignoreReturnVoidMap.put("BigDecimalUtils", Utils.asListArgs("setScale - void","setRoundingMode - void")); + ignoreReturnVoidMap.put("CalendarUtils", Utils.asListArgs("setFestivalHook - void")); + ignoreReturnVoidMap.put("CameraAssist", Utils.asListArgs("closeDriver - void","startPreview - void","stopPreview - void","freeCameraResource - void")); + ignoreReturnVoidMap.put("CameraAssist.PreviewNotify", Utils.asListArgs("stopPreviewNotify - void","startPreviewNotify - void")); + ignoreReturnVoidMap.put("CameraUtils", Utils.asListArgs("freeCameraResource - void")); + ignoreReturnVoidMap.put("CapturePictureUtils", Utils.asListArgs("setBitmapConfig - void","setBackgroundColor - void","setPaint - void","enableSlowWholeDocumentDraw - void")); + ignoreReturnVoidMap.put("ClickUtils", Utils.asListArgs("setCheckViewId - void","setGlobalIntervalTime - void","remove - void")); + ignoreReturnVoidMap.put("ClickUtils.OnCountClickListener", Utils.asListArgs("doClick - void","doInvalidClick - void")); + ignoreReturnVoidMap.put("ClickUtils.OnDebouncingClickListener", Utils.asListArgs("doClick - void","doInvalidClick - void")); + ignoreReturnVoidMap.put("CloseUtils", Utils.asListArgs("closeIO - void","closeIOQuietly - void","flush - void","flushQuietly - void","flushCloseIO - void","flushCloseIOQuietly - void","flushCloseIO - void","flushCloseIOQuietly - void")); + ignoreReturnVoidMap.put("CollectionUtils.ArrayWithTypeToken", Utils.asListArgs("put - void","newInstance - void","newInstance - void")); + ignoreReturnVoidMap.put("ColorUtils", Utils.asListArgs("setParser - void","sortGray - void","sortHSB - void")); + ignoreReturnVoidMap.put("ColorUtils.ColorInfo", Utils.asListArgs("priConvert - void")); + ignoreReturnVoidMap.put("ConvertUtils", Utils.asListArgs("bytesBitwiseAND - void")); + ignoreReturnVoidMap.put("CrashUtils", Utils.asListArgs("init - void","uncaughtException - void")); + ignoreReturnVoidMap.put("CrashUtils.CrashCatchListener", Utils.asListArgs("handleException - void","uncaughtException - void")); + ignoreReturnVoidMap.put("DevCache", Utils.asListArgs("clear - void")); + ignoreReturnVoidMap.put("DevCacheManager", Utils.asListArgs("calculateCacheSizeAndCacheCount - void","put - void","clear - void")); + ignoreReturnVoidMap.put("DevCommonUtils", Utils.asListArgs("sleepOperate - void","sleepOperate - void")); + ignoreReturnVoidMap.put("DevLogger", Utils.asListArgs("init - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","setPrint - void")); + ignoreReturnVoidMap.put("DevLogger.Print", Utils.asListArgs("printLog - void")); + ignoreReturnVoidMap.put("DevMediaManager", Utils.asListArgs("createMedia - void","destroyMedia - void","pause - void","stop - void","onVideoSizeChanged - void","onPrepared - void","onCompletion - void","onBufferingUpdate - void","onSeekComplete - void","clearMediaPlayerData - void")); + ignoreReturnVoidMap.put("DevMediaManager.MediaListener", Utils.asListArgs("onPrepared - void","onCompletion - void","onBufferingUpdate - void","onSeekComplete - void","onVideoSizeChanged - void")); + ignoreReturnVoidMap.put("DevMediaManager.MediaSet", Utils.asListArgs("setMediaConfig - void")); + ignoreReturnVoidMap.put("DevThreadManager", Utils.asListArgs("initConfig - void","putConfig - void","removeConfig - void")); + ignoreReturnVoidMap.put("DevThreadPool", Utils.asListArgs("execute - void","execute - void","execute - void","shutdown - void")); + ignoreReturnVoidMap.put("DevToast", Utils.asListArgs("reset - void","setIsHandler - void","setNullText - void","setTextLength - void","init - void","initStyle - void","initToastFilter - void","setView - void","show - void","show - void","show - void","show - void","cancel - void")); + ignoreReturnVoidMap.put("DevVideoPlayerControl", Utils.asListArgs("resetOperate - void","surfaceChanged - void","surfaceCreated - void","surfaceDestroyed - void","onPrepared - void","onCompletion - void","onBufferingUpdate - void","onSeekComplete - void","onVideoSizeChanged - void","pausePlayer - void","stopPlayer - void","startPlayer - void","startPlayer - void","startPlayer - void")); + ignoreReturnVoidMap.put("DialogUtils.DialogListener", Utils.asListArgs("onLeftButton - void","onRightButton - void","onDismiss - void")); + ignoreReturnVoidMap.put("DialogUtils.MultiChoiceListener", Utils.asListArgs("onMultiChoiceItems - void","onPositiveButton - void","onCancel - void","onDismiss - void")); + ignoreReturnVoidMap.put("DialogUtils.SingleChoiceListener", Utils.asListArgs("onSingleChoiceItems - void","onPositiveButton - void","onCancel - void","onDismiss - void")); + ignoreReturnVoidMap.put("DialogUtils.ViewDialogListener", Utils.asListArgs("onPositiveButton - void","onCancel - void","onDismiss - void")); + ignoreReturnVoidMap.put("EditTextUtils.DevTextWatcher", Utils.asListArgs("beforeTextChanged - void","onTextChanged - void","afterTextChanged - void")); + ignoreReturnVoidMap.put("FileBreadthFirstSearchUtils", Utils.asListArgs("stop - void","query - void","queryFile - void","whileQueue - void")); + ignoreReturnVoidMap.put("FileBreadthFirstSearchUtils.SearchHandler", Utils.asListArgs("OnEndListener - void")); + ignoreReturnVoidMap.put("FileDepthFirstSearchUtils", Utils.asListArgs("stop - void","query - void","queryFile - void")); + ignoreReturnVoidMap.put("FileDepthFirstSearchUtils.SearchHandler", Utils.asListArgs("OnEndListener - void")); + ignoreReturnVoidMap.put("FileIOUtils", Utils.asListArgs("setBufferSize - void")); + ignoreReturnVoidMap.put("FileRecordUtils", Utils.asListArgs("setInsertInfo - void","setCallBack - void")); + ignoreReturnVoidMap.put("FileRecordUtils.CallBack", Utils.asListArgs("callback - void")); + ignoreReturnVoidMap.put("HandlerUtils", Utils.asListArgs("postRunnable - void","postRunnable - void","postRunnable - void","postRunnable - void","removeRunnable - void","clearRunnableMaps - void","postRunnable - void","removeRunnable - void")); + ignoreReturnVoidMap.put("HandlerUtils.OnEndListener", Utils.asListArgs("onEnd - void")); + ignoreReturnVoidMap.put("HttpURLConnectionUtils", Utils.asListArgs("doGetAsyn - void","doPostAsyn - void","request - void","getNetTime - void","getNetTime - void","reqNetTime - void")); + ignoreReturnVoidMap.put("HttpURLConnectionUtils.CallBack", Utils.asListArgs("onResponse - void","onFail - void")); + ignoreReturnVoidMap.put("HttpURLConnectionUtils.TimeCallBack", Utils.asListArgs("onResponse - void","onFail - void")); + ignoreReturnVoidMap.put("IPreference", Utils.asListArgs("put - void","putAll - void","putAll - void","putAll - void","remove - void","removeAll - void","removeAll - void","clear - void")); + ignoreReturnVoidMap.put("IPrinter", Utils.asListArgs("init - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void")); + ignoreReturnVoidMap.put("IToast.Operate", Utils.asListArgs("reset - void","setIsHandler - void","setNullText - void","setTextLength - void","init - void","initStyle - void","initToastFilter - void","setView - void","show - void","show - void","show - void","show - void","cancel - void")); + ignoreReturnVoidMap.put("IToastImpl", Utils.asListArgs("reset - void","setIsHandler - void","setNullText - void","setTextLength - void","init - void","initStyle - void","initToastFilter - void","setView - void","show - void","show - void","show - void","show - void","cancel - void","priShowToastText - void","priShowToastView - void")); + ignoreReturnVoidMap.put("InactivityTimerAssist", Utils.asListArgs("onPause - void","onResume - void","onDestroy - void","start - void","cancel - void")); + ignoreReturnVoidMap.put("JCLogUtils", Utils.asListArgs("setPrintLog - void","setControlPrintLog - void","printLog - void","setPrint - void")); + ignoreReturnVoidMap.put("JCLogUtils.Print", Utils.asListArgs("printLog - void")); + ignoreReturnVoidMap.put("KeyBoardUtils", Utils.asListArgs("setDelayMillis - void","judgeView - void","fixSoftInputLeaks - void")); + ignoreReturnVoidMap.put("KeyBoardUtils.OnSoftInputChangedListener", Utils.asListArgs("onSoftInputChanged - void")); + ignoreReturnVoidMap.put("LanguageUtils", Utils.asListArgs("putSupportLanguage - void","removeSupportLanguage - void")); + ignoreReturnVoidMap.put("LocationUtils.CustomLocationListener", Utils.asListArgs("onLocationChanged - void","onStatusChanged - void","onProviderEnabled - void","onProviderDisabled - void")); + ignoreReturnVoidMap.put("LocationUtils.OnLocationChangeListener", Utils.asListArgs("getLastKnownLocation - void","onLocationChanged - void","onStatusChanged - void")); + ignoreReturnVoidMap.put("LogPrintUtils", Utils.asListArgs("setPrintLog - void","printLog - void","setPrint - void")); + ignoreReturnVoidMap.put("LogPrintUtils.Print", Utils.asListArgs("printLog - void")); + ignoreReturnVoidMap.put("LoggerPrinter", Utils.asListArgs("init - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","finalLogPrinter - void","logHandle - void","logHandle - void","logHandle - void","logHeaderContent - void","logTopBorder - void","logBottomBorder - void","logDivider - void","logContent - void")); + ignoreReturnVoidMap.put("PermissionUtils", Utils.asListArgs("request - void","request - void","onRequestPermissionsResultCommon - void","onRequestPermissionsResult - void","notifyPermissionsChange - void","requestCallback - void","getPermissionsStatus - void")); + ignoreReturnVoidMap.put("PermissionUtils.PermissionActivity", Utils.asListArgs("start - void","onCreate - void","onRequestPermissionsResult - void")); + ignoreReturnVoidMap.put("PermissionUtils.PermissionCallBack", Utils.asListArgs("onGranted - void","onDenied - void")); + ignoreReturnVoidMap.put("PreferenceImpl", Utils.asListArgs("put - void","put - void","putAll - void","putAll - void","putAll - void","remove - void","removeAll - void","removeAll - void","clear - void")); + ignoreReturnVoidMap.put("ProcessUtils", Utils.asListArgs("kill - void","kill - void")); + ignoreReturnVoidMap.put("ReflectUtils", Utils.asListArgs("sortConstructors - void","sortMethods - void")); + ignoreReturnVoidMap.put("ScreenSensorAssist", Utils.asListArgs("init - void")); + ignoreReturnVoidMap.put("ScreenshotUtils", Utils.asListArgs("handleMediaContentChange - void")); + ignoreReturnVoidMap.put("ScreenshotUtils.OnScreenshotListener", Utils.asListArgs("onScreenshot - void")); + ignoreReturnVoidMap.put("ScreenshotUtils.ScreenshotChecker", Utils.asListArgs("onChange - void","onChecker - void")); + ignoreReturnVoidMap.put("SharedUtils", Utils.asListArgs("put - void","putAll - void","putAll - void","putAll - void","remove - void","removeAll - void","removeAll - void","clear - void")); + ignoreReturnVoidMap.put("SizeUtils.onGetSizeListener", Utils.asListArgs("onGetSize - void")); + ignoreReturnVoidMap.put("SnackbarUtils", Utils.asListArgs("dismiss - void","dismiss - void","showShort - void","showLong - void","showIndefinite - void","showShort - void","showLong - void","showIndefinite - void","priShow - void","clearLocations - void","setSnackbarLocation - void")); + ignoreReturnVoidMap.put("SpanUtils", Utils.asListArgs("apply - void","applyLast - void","updateCharCharSequence - void","updateImage - void","updateSpace - void","setDefault - void")); + ignoreReturnVoidMap.put("TimeKeeper", Utils.asListArgs("waitForEndAsyn - void","waitForEnd - void")); + ignoreReturnVoidMap.put("TimeKeeper.OnEndCallback", Utils.asListArgs("onEnd - void")); + ignoreReturnVoidMap.put("TimerManager.TimerTask", Utils.asListArgs("start - void","close - void")); + ignoreReturnVoidMap.put("ToastFactory.ToastHelper", Utils.asListArgs("show - void","cancel - void")); + ignoreReturnVoidMap.put("ToastTintUtils", Utils.asListArgs("reset - void","setToastFilter - void","setIsHandler - void","setNullText - void","setUseConfig - void","setGravity - void","setMargin - void","setNormalStyle - void","setInfoStyle - void","setWarningStyle - void","setErrorStyle - void","setSuccessStyle - void","normal - void","normal - void","normal - void","normal - void","normal - void","normal - void","normal - void","normal - void","info - void","info - void","info - void","info - void","info - void","info - void","info - void","info - void","warning - void","warning - void","warning - void","warning - void","warning - void","warning - void","warning - void","warning - void","error - void","error - void","error - void","error - void","error - void","error - void","error - void","error - void","success - void","success - void","success - void","success - void","success - void","success - void","success - void","success - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","custom - void","showToastView - void","reflectToastHandler - void")); + ignoreReturnVoidMap.put("ToastUtils", Utils.asListArgs("reset - void","setToastFilter - void","setIsHandler - void","setNullText - void","setUseConfig - void","setGravity - void","setMargin - void","showShort - void","showShort - void","showShort - void","showShort - void","showLong - void","showLong - void","showLong - void","showLong - void","showToast - void","showToast - void","showToast - void","showToast - void","showShortNew - void","showShortNew - void","showShortNew - void","showShortNew - void","showLongNew - void","showLongNew - void","showLongNew - void","showLongNew - void","showToastNew - void","showToastNew - void","showToastNew - void","showToastNew - void","priShowToastText - void","showToastView - void","showToastView - void","showToastView - void","showToastView - void","showToastView - void","handlerToastRes - void","handlerToastStr - void","reflectToastHandler - void")); + ignoreReturnVoidMap.put("WifiHotUtils.OnWifiAPListener", Utils.asListArgs("onStarted - void","onStopped - void","onFailed - void")); + ignoreReturnVoidMap.put("WifiUtils", Utils.asListArgs("setDNS - void","setGateway - void","setIpAddress - void","setStaticIpConfig - void","setEnumField - void","setValueField - void")); + + return ignoreReturnVoidMap; + } + + /** + * 忽略注释间距异常文件 + * @param map {@link HashMap} + */ + @Override + public void ignoreAnnotationSpaceMap(Map map) { + map.remove("AliasMethod.java"); + map.remove("Base64.java"); + + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_app/DevAppMain.java b/src/main/java/javadoc/dev_utils/check/dev_app/DevAppMain.java new file mode 100644 index 00000000..61ea71c9 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_app/DevAppMain.java @@ -0,0 +1,46 @@ +package javadoc.dev_utils.check.dev_app; + +import dev.utils.common.ArrayUtils; +import dev.utils.common.ConvertUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.check.dev.CheckInfo; +import javadoc.dev_utils.check.dev.CheckMain; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * detail: 代码读取检测分析 Main 方法 + * @author Ttt + */ +public class DevAppMain { + + public static void main(String[] args) { + // 检测路径 + String path = ApiConfig.DEV_APP_PATH + "utils/"; + // 代码检测分析配置接口 + ICheckConfig iCheckConfig = new DevAppConfig(); + // 是否覆盖文件内容 + boolean coverText = ConvertUtils.toBoolean(ArrayUtils.get(args, 0), true); + // 是否使用 List + boolean isLists = false; + // 检测指定文件集合 + List listFiles = new ArrayList(); + // 是否打印方法返回值 void 记录 + boolean isPrintVoid = false; + // 是否需要生成 Config + boolean generateConfig = ConvertUtils.toBoolean(ArrayUtils.get(args, 1)); + + // 执行检测 + CheckMain.execute(DevAppMain.class, new CheckInfo(path, iCheckConfig) + .setCoverText(coverText) + .setLists(isLists) + .setListFiles(listFiles) + .setPrintVoid(isPrintVoid) + .setGenerateConfig(generateConfig) + .setIgnoreAnnotationSpaceSet("AliasMethod.java", "Base64.java") + ); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_assist/DevAssistConfig.java b/src/main/java/javadoc/dev_utils/check/dev_assist/DevAssistConfig.java new file mode 100644 index 00000000..74d9f364 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_assist/DevAssistConfig.java @@ -0,0 +1,197 @@ +package javadoc.dev_utils.check.dev_assist; + +import javadoc.Utils; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * detail: DevAssistConfig 代码检测分析配置 + * @author Ttt + */ +final class DevAssistConfig implements ICheckConfig { + + /** + * 获取忽略指定方法注释配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreAnnotateMap() { + Map> ignoreAnnotateMap = new HashMap(); + ignoreAnnotateMap.put("EditTextWatcherAssist.FocusListener", Utils.asListArgs("onFocusChange")); + ignoreAnnotateMap.put("IImageEngine.BitmapCallBack", Utils.asListArgs("getTranscodeType","onResponse","onFailure")); + ignoreAnnotateMap.put("IImageEngine.DrawableCallBack", Utils.asListArgs("getTranscodeType","onResponse","onFailure")); + + return ignoreAnnotateMap; + } + + /** + * 获取忽略指定方法参数 final 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreFinalMap() { + Map> ignoreFinalMap = new HashMap(); + ignoreFinalMap.put("DevCallBack", Utils.asListArgs("callback","callback","callback")); + ignoreFinalMap.put("DevClickCallBack", Utils.asListArgs("onClick","onLongClick","onClick","onLongClick","onClick","onLongClick")); + ignoreFinalMap.put("DevFilterCallback", Utils.asListArgs("filter","filter","isFilter","isFilter","compare","compare")); + ignoreFinalMap.put("DevItemClickCallBack", Utils.asListArgs("onItemClick","onItemLongClick","onItemClick","onItemLongClick","onItemClick","onItemLongClick")); + ignoreFinalMap.put("EditTextWatcherAssist.FocusListener", Utils.asListArgs("onFocusChange")); + + return ignoreFinalMap; + } + + /** + * 获取忽略指定方法 static 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreStaticMap() { + Map> ignoreStaticMap = new HashMap(); + ignoreStaticMap.put("AdapterDataAssist", Utils.asListArgs("setAdapterNotify","getDataList","getDataArrayList","getDataCount","getDataItem","getDataItemPosition","getDataFirstItem","getDataLastItem","isFirstItem","isLastItem","isLastItem","clearDataList","clearDataList","addData","addData","addAllData","addAllData","removeData","removeData","removeData","setDataList","setDataList","adapterNotifyDataSetChanged")); + ignoreStaticMap.put("DevBaseEntry", Utils.asListArgs("getEntryKey","setEntryKey","getEntryValue","setEntryValue","isCorrect")); + ignoreStaticMap.put("DevBaseEvent", Utils.asListArgs("getCode","setCode","getCodeStr","setCodeStr","getValue","setValue","getObject","setObject","equalsCode","equalsCode","equalsValue","equalsObject")); + ignoreStaticMap.put("DevBaseVariable", Utils.asListArgs("getVariables","clearVariables","putVariables","getVariablesSize","isVariables","isVariableValue","removeVariableValue","removeVariableValueAll","isVariable","isVariable","putVariable","putVariable","removeVariable","toggle","getVariableValue","getVariableValueConvert","getVariableValues","getVariableValuesToReverse","getVariableKey","getVariableKeys","getVariableKeysToReverse")); + ignoreStaticMap.put("DevCallBack", Utils.asListArgs("callback","callback","callback","callback")); + ignoreStaticMap.put("DevClickCallBack", Utils.asListArgs("onClick","onLongClick","onClick","onLongClick","onClick","onLongClick","onClick","onLongClick")); + ignoreStaticMap.put("DevDialogCallBack", Utils.asListArgs("onDialogNotify","onDialogShow","onDialogDismiss","onDialogStart","onDialogResume","onDialogPause","onDialogStop","onDialogDestroy")); + ignoreStaticMap.put("DevFilterCallback", Utils.asListArgs("filter","filter","isFilter","isFilter","compare","compare")); + ignoreStaticMap.put("DevItemClickCallBack", Utils.asListArgs("onItemClick","onItemLongClick","onItemClick","onItemLongClick","onItemClick","onItemLongClick","onItemClick","onItemLongClick")); + ignoreStaticMap.put("EditTextWatcherAssist", Utils.asListArgs("bindListener","bindListener","focusChange")); + ignoreStaticMap.put("EditTextWatcherAssist.FocusListener", Utils.asListArgs("onFocusChange")); + ignoreStaticMap.put("IHttpEngine.Response", Utils.asListArgs("getRequest","getSentRequestAtMillis","getReceivedResponseAtMillis")); + ignoreStaticMap.put("MultiSelectListAssist", Utils.asListArgs("clearSelects","getSelectSize","getSelects","putSelects","putSelects","isSelect","isSelectValue","unselectValue","unselectValueAll","isSelect","select","select","select","unselect","unselect","toggle","getSelectValues","getSelectValuesToReverse","getSelectValue","getSelectValueToPosition")); + ignoreStaticMap.put("MultiSelectMapAssist", Utils.asListArgs("clearSelects","getSelectSize","getSelects","putSelects","putSelects","isSelect","isSelectValue","unselectValue","unselectValueAll","isSelect","isSelectKey","select","select","unselect","toggle","getSelectValue","getSelectValues","getSelectValuesToReverse","getSelectKey","getSelectKeys","getSelectKeysToReverse")); + ignoreStaticMap.put("NumberControlAssist", Utils.asListArgs("isMinNumber","isMinNumber","isLessThanMinNumber","isGreaterThanMinNumber","isMaxNumber","isMaxNumber","isLessThanMaxNumber","isGreaterThanMaxNumber","getObject","setObject","getMinNumber","setMinNumber","getMaxNumber","setMaxNumber","setMinMaxNumber","getCurrentNumber","setCurrentNumber","setCurrentNumber","getResetNumber","setResetNumber","isAllowNegative","setAllowNegative","numberChange","addNumber","subtractionNumber","checkUpdate","getNumberListener","setNumberListener")); + ignoreStaticMap.put("PageAssist", Utils.asListArgs("getPageNum","getPageNum","setPageNum","getPageSize","getPageSize","setPageSize","getTotalRow","getTotalRow","setTotalRow","isLastPage","isLastPage","setLastPage","isFirstPage","isFirstPage","isAllowNextPage","getNextPage","nextPage","isLessThanPageSize","reset")); + ignoreStaticMap.put("RequestStateAssist", Utils.asListArgs("getRequestType","getRequestType","setRequestType","equalsRequestType","getRequestHashCode","getRequestHashCodeRandom","equalsHashCode","getRequestState","getRequestState","setRequestState","isRequestNormal","isRequestNever","isRequestIng","isRequestSuccess","isRequestFail","isRequestError","setRequestNormal","setRequestNever","setRequestIng","setRequestSuccess","setRequestFail","setRequestError")); + ignoreStaticMap.put("VariableAssist", Utils.asListArgs("getBooleanVariable","getObjectVariable")); + + return ignoreStaticMap; + } + + /** + * 获取忽略指定方法 @param 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreParamMap() { + Map> ignoreParamMap = new HashMap(); + ignoreParamMap.put("AbstractCallBack", Utils.asListArgs("setTag","setValue","setObject")); + ignoreParamMap.put("AdapterDataAssist", Utils.asListArgs("setAdapterNotify")); + ignoreParamMap.put("DevBaseEntry", Utils.asListArgs("setEntryKey","setEntryValue")); + ignoreParamMap.put("DevBaseEvent", Utils.asListArgs("setCode","setCodeStr","setValue","setObject")); + ignoreParamMap.put("DevBaseVariable", Utils.asListArgs("putVariables","removeVariableValue","removeVariableValueAll","putVariable","putVariable","removeVariable","toggle")); + ignoreParamMap.put("DevExResultCallback", Utils.asListArgs("setExpandResult")); + ignoreParamMap.put("EditTextWatcherAssist.FocusListener", Utils.asListArgs("onFocusChange")); + ignoreParamMap.put("IImageEngine.BitmapCallBack", Utils.asListArgs("onResponse","onFailure")); + ignoreParamMap.put("IImageEngine.DrawableCallBack", Utils.asListArgs("onResponse","onFailure")); + ignoreParamMap.put("PageAssist", Utils.asListArgs("setPageNum","setPageSize","setTotalRow","setLastPage")); + ignoreParamMap.put("RequestStateAssist", Utils.asListArgs("setRequestType","setRequestState")); + + return ignoreParamMap; + } + + /** + * 获取忽略指定方法 @return 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnMap() { + Map> ignoreReturnMap = new HashMap(); + + return ignoreReturnMap; + } + + /** + * 获取忽略指定方法非 public 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreUnPublicMap() { + Map> ignoreUnPublicMap = new HashMap(); + ignoreUnPublicMap.put("DevBaseModel", Utils.asListArgs("isCorrect")); + ignoreUnPublicMap.put("EditTextWatcherAssist", Utils.asListArgs("focusChange")); + ignoreUnPublicMap.put("EditTextWatcherAssist.InputListener", Utils.asListArgs("onTextChanged")); + ignoreUnPublicMap.put("IAdapterData", Utils.asListArgs("getDataList","getDataArrayList","getDataCount","getDataItem","getDataItemPosition","getDataFirstItem","getDataLastItem","isFirstItem","isLastItem","isLastItem","clearDataList","clearDataList","addData","addData","addAllData","addAllData","removeData","removeData","removeData","setDataList","setDataList")); + ignoreUnPublicMap.put("IAdapterNotify", Utils.asListArgs("adapterNotifyDataSetChanged")); + ignoreUnPublicMap.put("IBaseMultiSelect", Utils.asListArgs("clearSelects","getSelectSize","getSelects","putSelects","putSelects","isSelect","isSelectValue","unselectValue","unselectValueAll")); + ignoreUnPublicMap.put("IHttpEngine", Utils.asListArgs("newCall","cancelAll","cancelCall","cancelUrl","cancelTag")); + ignoreUnPublicMap.put("IHttpEngine.Call", Utils.asListArgs("getRequest","isCanceled","isExecuted","isEnd","cancel","start","startAync")); + ignoreUnPublicMap.put("IImageEngine", Utils.asListArgs("displayImage","displayImage","displayImage","displayImage","loadImage","loadImage","clearDiskCache","clearMemoryCache")); + ignoreUnPublicMap.put("IImageEngine.ImageCallBack", Utils.asListArgs("getTranscodeType","onResponse","onFailure")); + ignoreUnPublicMap.put("IJSONEngine", Utils.asListArgs("toJson","toJson","fromJson","fromJson","fromJson","fromJson","isJSON","isJSONObject","isJSONArray","toJsonIndent","toJsonIndent","toJsonIndent","toJsonIndent")); + ignoreUnPublicMap.put("ILogEngine", Utils.asListArgs("isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag")); + ignoreUnPublicMap.put("IMultiSelectEdit", Utils.asListArgs("isEditState","setEditState","toggleEditState","selectAll","clearSelectAll","inverseSelect","isSelectAll","isSelect","isNotSelect","getSelectSize","getDataCount")); + ignoreUnPublicMap.put("IMultiSelectToList", Utils.asListArgs("isSelect","select","select","select","unselect","unselect","toggle","getSelectValues","getSelectValuesToReverse","getSelectValue","getSelectValueToPosition")); + ignoreUnPublicMap.put("IMultiSelectToMap", Utils.asListArgs("isSelect","isSelectKey","select","select","unselect","toggle","getSelectValue","getSelectValues","getSelectValuesToReverse","getSelectKey","getSelectKeys","getSelectKeysToReverse")); + ignoreUnPublicMap.put("NumberControlAssist", Utils.asListArgs("checkUpdate")); + ignoreUnPublicMap.put("NumberControlAssist.INumberListener", Utils.asListArgs("onPrepareChanged","onNumberChanged")); + ignoreUnPublicMap.put("NumberControlAssist.INumberOperate", Utils.asListArgs("isMinNumber","isMinNumber","isLessThanMinNumber","isGreaterThanMinNumber","isMaxNumber","isMaxNumber","isLessThanMaxNumber","isGreaterThanMaxNumber","getObject","setObject","getMinNumber","setMinNumber","getMaxNumber","setMaxNumber","setMinMaxNumber","getCurrentNumber","setCurrentNumber","setCurrentNumber","getResetNumber","setResetNumber","isAllowNegative","setAllowNegative","numberChange","addNumber","subtractionNumber","getNumberListener","setNumberListener")); + + return ignoreUnPublicMap; + } + + /** + * 获取忽略无修饰符变量处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreModifierVariableMap() { + Map> ignoreModifierVariableMap = new HashMap(); + + return ignoreModifierVariableMap; + } + + /** + * 获取忽略指定方法 return void 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnVoidMap() { + Map> ignoreReturnVoidMap = new HashMap(); + ignoreReturnVoidMap.put("AbstractCommonCallBack", Utils.asListArgs("onResult - void","onError - void","onFailure - void")); + ignoreReturnVoidMap.put("AdapterDataAssist", Utils.asListArgs("clearDataList - void","clearDataList - void","addData - void","addData - void","addAllData - void","addAllData - void","removeData - void","setDataList - void","setDataList - void","adapterNotifyDataSetChanged - void")); + ignoreReturnVoidMap.put("DevCallBack", Utils.asListArgs("callback - void","callback - void","callback - void","callback - void")); + ignoreReturnVoidMap.put("DevClickCallBack", Utils.asListArgs("onClick - void","onLongClick - void","onClick - void","onLongClick - void","onClick - void","onLongClick - void","onClick - void","onLongClick - void")); + ignoreReturnVoidMap.put("DevDialogCallBack", Utils.asListArgs("onDialogNotify - void","onDialogShow - void","onDialogDismiss - void","onDialogStart - void","onDialogResume - void","onDialogPause - void","onDialogStop - void","onDialogDestroy - void")); + ignoreReturnVoidMap.put("DevExResultCallback", Utils.asListArgs("onResult - void","onResult - void","onError - void","onFailure - void")); + ignoreReturnVoidMap.put("DevHttpEngine", Utils.asListArgs("initEngine - void","cancelAll - void","cancelCall - void","cancelUrl - void","cancelTag - void")); + ignoreReturnVoidMap.put("DevImageEngine", Utils.asListArgs("initEngine - void","displayImage - void","displayImage - void","displayImage - void","displayImage - void","loadImage - void","loadImage - void","clearDiskCache - void","clearMemoryCache - void")); + ignoreReturnVoidMap.put("DevItemClickCallBack", Utils.asListArgs("onItemClick - void","onItemLongClick - void","onItemClick - void","onItemLongClick - void","onItemClick - void","onItemLongClick - void","onItemClick - void","onItemLongClick - void")); + ignoreReturnVoidMap.put("DevJSONEngine", Utils.asListArgs("initEngine - void")); + ignoreReturnVoidMap.put("DevLogEngine", Utils.asListArgs("initEngine - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void")); + ignoreReturnVoidMap.put("DevResultCallback", Utils.asListArgs("onResult - void")); + ignoreReturnVoidMap.put("EditTextWatcherAssist", Utils.asListArgs("bindListener - void","bindListener - void","focusChange - void")); + ignoreReturnVoidMap.put("EditTextWatcherAssist.InputListener", Utils.asListArgs("onTextChanged - void")); + ignoreReturnVoidMap.put("IAdapterData", Utils.asListArgs("clearDataList - void","clearDataList - void","addData - void","addData - void","addAllData - void","addAllData - void","removeData - void","setDataList - void","setDataList - void")); + ignoreReturnVoidMap.put("IAdapterNotify", Utils.asListArgs("adapterNotifyDataSetChanged - void")); + ignoreReturnVoidMap.put("IBaseMultiSelect", Utils.asListArgs("clearSelects - void","putSelects - void","putSelects - void","unselectValue - void","unselectValueAll - void")); + ignoreReturnVoidMap.put("IHttpEngine", Utils.asListArgs("cancelAll - void","cancelCall - void","cancelUrl - void","cancelTag - void")); + ignoreReturnVoidMap.put("IHttpEngine.Call", Utils.asListArgs("cancel - void")); + ignoreReturnVoidMap.put("IHttpEngine.RequestCallBack", Utils.asListArgs("onStart - void","onCancel - void","onResponse - void","onFailure - void")); + ignoreReturnVoidMap.put("IImageEngine", Utils.asListArgs("displayImage - void","displayImage - void","displayImage - void","displayImage - void","loadImage - void","loadImage - void","clearDiskCache - void","clearMemoryCache - void")); + ignoreReturnVoidMap.put("IImageEngine.ImageCallBack", Utils.asListArgs("onResponse - void","onFailure - void")); + ignoreReturnVoidMap.put("ILogEngine", Utils.asListArgs("d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void")); + ignoreReturnVoidMap.put("IMultiSelectToList", Utils.asListArgs("select - void","select - void","select - void","unselect - void","toggle - void")); + ignoreReturnVoidMap.put("IMultiSelectToMap", Utils.asListArgs("select - void","select - void","unselect - void","toggle - void")); + ignoreReturnVoidMap.put("MultiSelectListAssist", Utils.asListArgs("clearSelects - void","putSelects - void","putSelects - void","unselectValue - void","unselectValueAll - void","select - void","select - void","select - void","unselect - void","toggle - void")); + ignoreReturnVoidMap.put("MultiSelectMapAssist", Utils.asListArgs("clearSelects - void","putSelects - void","putSelects - void","unselectValue - void","unselectValueAll - void","select - void","select - void","unselect - void","toggle - void")); + ignoreReturnVoidMap.put("NumberControlAssist", Utils.asListArgs("checkUpdate - void")); + ignoreReturnVoidMap.put("NumberControlAssist.INumberListener", Utils.asListArgs("onNumberChanged - void")); + ignoreReturnVoidMap.put("PageAssist", Utils.asListArgs("initPageConfig - void")); + + return ignoreReturnVoidMap; + } + + /** + * 忽略注释间距异常文件 + * @param map {@link HashMap} + */ + @Override + public void ignoreAnnotationSpaceMap(Map map) { + + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_assist/DevAssistMain.java b/src/main/java/javadoc/dev_utils/check/dev_assist/DevAssistMain.java new file mode 100644 index 00000000..af67e417 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_assist/DevAssistMain.java @@ -0,0 +1,45 @@ +package javadoc.dev_utils.check.dev_assist; + +import dev.utils.common.ArrayUtils; +import dev.utils.common.ConvertUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.check.dev.CheckInfo; +import javadoc.dev_utils.check.dev.CheckMain; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * detail: 代码读取检测分析 Main 方法 + * @author Ttt + */ +public class DevAssistMain { + + public static void main(String[] args) { + // 检测路径 + String path = ApiConfig.DEV_ASSIST_PATH; + // 代码检测分析配置接口 + ICheckConfig iCheckConfig = new DevAssistConfig(); + // 是否覆盖文件内容 + boolean coverText = ConvertUtils.toBoolean(ArrayUtils.get(args, 0), true); + // 是否使用 List + boolean isLists = false; + // 检测指定文件集合 + List listFiles = new ArrayList(); + // 是否打印方法返回值 void 记录 + boolean isPrintVoid = false; + // 是否需要生成 Config + boolean generateConfig = ConvertUtils.toBoolean(ArrayUtils.get(args, 1)); + + // 执行检测 + CheckMain.execute(DevAssistMain.class, new CheckInfo(path, iCheckConfig) + .setCoverText(coverText) + .setLists(isLists) + .setListFiles(listFiles) + .setPrintVoid(isPrintVoid) + .setGenerateConfig(generateConfig) + ); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_base/DevBaseConfig.java b/src/main/java/javadoc/dev_utils/check/dev_base/DevBaseConfig.java new file mode 100644 index 00000000..93ac8ee2 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_base/DevBaseConfig.java @@ -0,0 +1,114 @@ +package javadoc.dev_utils.check.dev_base; + +import javadoc.Utils; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * detail: DevBaseConfig 代码检测分析配置 + * @author Ttt + */ +final class DevBaseConfig implements ICheckConfig { + + /** + * 获取忽略指定方法注释配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreAnnotateMap() { + Map> ignoreAnnotateMap = new HashMap(); + + return ignoreAnnotateMap; + } + + /** + * 获取忽略指定方法参数 final 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreFinalMap() { + Map> ignoreFinalMap = new HashMap(); + + return ignoreFinalMap; + } + + /** + * 获取忽略指定方法 static 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreStaticMap() { + Map> ignoreStaticMap = new HashMap(); + + return ignoreStaticMap; + } + + /** + * 获取忽略指定方法 @param 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreParamMap() { + Map> ignoreParamMap = new HashMap(); + + return ignoreParamMap; + } + + /** + * 获取忽略指定方法 @return 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnMap() { + Map> ignoreReturnMap = new HashMap(); + + return ignoreReturnMap; + } + + /** + * 获取忽略指定方法非 public 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreUnPublicMap() { + Map> ignoreUnPublicMap = new HashMap(); + ignoreUnPublicMap.put("ILogEngine", Utils.asListArgs("isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag","isPrintLog","d","e","e","e","w","i","v","wtf","json","xml","dTag","eTag","eTag","eTag","wTag","iTag","vTag","wtfTag","jsonTag","xmlTag")); + + return ignoreUnPublicMap; + } + + /** + * 获取忽略无修饰符变量处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreModifierVariableMap() { + Map> ignoreModifierVariableMap = new HashMap(); + + return ignoreModifierVariableMap; + } + + /** + * 获取忽略指定方法 return void 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnVoidMap() { + Map> ignoreReturnVoidMap = new HashMap(); + ignoreReturnVoidMap.put("ILogEngine", Utils.asListArgs("d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void","d - void","e - void","e - void","e - void","w - void","i - void","v - void","wtf - void","json - void","xml - void","dTag - void","eTag - void","eTag - void","eTag - void","wTag - void","iTag - void","vTag - void","wtfTag - void","jsonTag - void","xmlTag - void")); + + return ignoreReturnVoidMap; + } + + /** + * 忽略注释间距异常文件 + * @param map {@link HashMap} + */ + @Override + public void ignoreAnnotationSpaceMap(Map map) { + + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_base/DevBaseMain.java b/src/main/java/javadoc/dev_utils/check/dev_base/DevBaseMain.java new file mode 100644 index 00000000..fa25e9f7 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_base/DevBaseMain.java @@ -0,0 +1,45 @@ +package javadoc.dev_utils.check.dev_base; + +import dev.utils.common.ArrayUtils; +import dev.utils.common.ConvertUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.check.dev.CheckInfo; +import javadoc.dev_utils.check.dev.CheckMain; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * detail: 代码读取检测分析 Main 方法 + * @author Ttt + */ +public class DevBaseMain { + + public static void main(String[] args) { + // 检测路径 + String path = ApiConfig.DEV_BASE_PATH; + // 代码检测分析配置接口 + ICheckConfig iCheckConfig = new DevBaseConfig(); + // 是否覆盖文件内容 + boolean coverText = ConvertUtils.toBoolean(ArrayUtils.get(args, 0), true); + // 是否使用 List + boolean isLists = false; + // 检测指定文件集合 + List listFiles = new ArrayList(); + // 是否打印方法返回值 void 记录 + boolean isPrintVoid = false; + // 是否需要生成 Config + boolean generateConfig = ConvertUtils.toBoolean(ArrayUtils.get(args, 1)); + + // 执行检测 + CheckMain.execute(DevBaseMain.class, new CheckInfo(path, iCheckConfig) + .setCoverText(coverText) + .setLists(isLists) + .setListFiles(listFiles) + .setPrintVoid(isPrintVoid) + .setGenerateConfig(generateConfig) + ); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_other/DevOtherConfig.java b/src/main/java/javadoc/dev_utils/check/dev_other/DevOtherConfig.java new file mode 100644 index 00000000..ca48c809 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_other/DevOtherConfig.java @@ -0,0 +1,265 @@ +package javadoc.dev_utils.check.dev_other; + +import javadoc.Utils; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * detail: DevOtherConfig 代码检测分析配置 + * @author Ttt + */ +final class DevOtherConfig implements ICheckConfig { + + /** + * 获取忽略指定方法注释配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreAnnotateMap() { + Map> ignoreAnnotateMap = new HashMap(); + ignoreAnnotateMap.put("AccessibilityListenerService", Utils.asListArgs("onCreate","onDestroy")); + ignoreAnnotateMap.put("AppStateReceiver", Utils.asListArgs("onReceive")); + ignoreAnnotateMap.put("BaseBeanSubscriber", Utils.asListArgs("onNext","onError","onStart","onComplete")); + ignoreAnnotateMap.put("BaseResponse", Utils.asListArgs("getOriginal")); + ignoreAnnotateMap.put("BaseResponseSubscriber", Utils.asListArgs("onNext","onError","onStart","onComplete")); + ignoreAnnotateMap.put("BatteryReceiver", Utils.asListArgs("onReceive")); + ignoreAnnotateMap.put("GlideEngine", Utils.asListArgs("createGlideEngine")); + ignoreAnnotateMap.put("GlideTransformUtils.GlideBlurformation", Utils.asListArgs("transform","updateDiskCacheKey")); + ignoreAnnotateMap.put("GlideTransformUtils.GlideCircleTransform", Utils.asListArgs("transform","circleCrop","updateDiskCacheKey")); + ignoreAnnotateMap.put("GlideTransformUtils.GlideRoundTransform", Utils.asListArgs("transform","roundCrop","updateDiskCacheKey")); + ignoreAnnotateMap.put("GlideTransformUtils.RotateTransformation", Utils.asListArgs("transform","updateDiskCacheKey")); + ignoreAnnotateMap.put("GlideUtils", Utils.asListArgs("with","with","with","with","with","with")); + ignoreAnnotateMap.put("HttpLoggingInterceptor", Utils.asListArgs("intercept","isPlaintext","bodyEncoded")); + ignoreAnnotateMap.put("NetWorkReceiver", Utils.asListArgs("onReceive")); + ignoreAnnotateMap.put("NotificationService", Utils.asListArgs("onCreate","onDestroy","onStartCommand")); + ignoreAnnotateMap.put("OkGoResponse.Builder", Utils.asListArgs("setData","setMessage","setCode","setToast","setResult","setOriginal","setException")); + ignoreAnnotateMap.put("PhoneReceiver", Utils.asListArgs("onReceive")); + ignoreAnnotateMap.put("RetrofitManager", Utils.asListArgs("getInstance")); + ignoreAnnotateMap.put("RxJavaManager", Utils.asListArgs("getInstance")); + ignoreAnnotateMap.put("ScreenReceiver", Utils.asListArgs("onReceive")); + ignoreAnnotateMap.put("SmsReceiver", Utils.asListArgs("onReceive")); + ignoreAnnotateMap.put("TimeReceiver", Utils.asListArgs("onReceive")); + ignoreAnnotateMap.put("WifiReceiver", Utils.asListArgs("onReceive")); + + return ignoreAnnotateMap; + } + + /** + * 获取忽略指定方法参数 final 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreFinalMap() { + Map> ignoreFinalMap = new HashMap(); + ignoreFinalMap.put("AccessibilityListenerService", Utils.asListArgs("onAccessibilityEvent")); + ignoreFinalMap.put("AppStateReceiver", Utils.asListArgs("onReceive")); + ignoreFinalMap.put("BatteryReceiver", Utils.asListArgs("onReceive")); + ignoreFinalMap.put("GlideEngine", Utils.asListArgs("loadImage","loadImage","loadImage","loadFolderImage","loadAsGifImage","loadGridImage")); + ignoreFinalMap.put("GlideTransformUtils.GlideBlurformation", Utils.asListArgs("transform","updateDiskCacheKey","blurBitmap")); + ignoreFinalMap.put("GlideTransformUtils.GlideCircleTransform", Utils.asListArgs("transform","circleCrop","updateDiskCacheKey")); + ignoreFinalMap.put("GlideTransformUtils.GlideRoundTransform", Utils.asListArgs("transform","roundCrop","updateDiskCacheKey")); + ignoreFinalMap.put("GlideTransformUtils.RotateTransformation", Utils.asListArgs("transform","updateDiskCacheKey")); + ignoreFinalMap.put("GlideUtils", Utils.asListArgs("with","with","with","with","with","with")); + ignoreFinalMap.put("HttpLoggingInterceptor", Utils.asListArgs("intercept","_finalPrintLog","isPlaintext","bodyEncoded")); + ignoreFinalMap.put("LubanUtils", Utils.asListArgs("compress","compress","compress","compress","compress","compress","compress")); + ignoreFinalMap.put("NetWorkReceiver", Utils.asListArgs("onReceive")); + ignoreFinalMap.put("NotificationService", Utils.asListArgs("onNotificationPosted","onNotificationRemoved","onStartCommand")); + ignoreFinalMap.put("OkGoDemo", Utils.asListArgs("getUserInfo","getUserList","uploadImage","uploadImages")); + ignoreFinalMap.put("OkGoResponse.Builder", Utils.asListArgs("setData","setMessage","setCode","setToast","setResult","setOriginal","setException")); + ignoreFinalMap.put("OkGoUtils", Utils.asListArgs("initOkGo","execute","execute")); + ignoreFinalMap.put("PhoneReceiver", Utils.asListArgs("onReceive")); + ignoreFinalMap.put("ScreenReceiver", Utils.asListArgs("onReceive")); + ignoreFinalMap.put("SmsReceiver", Utils.asListArgs("onReceive")); + ignoreFinalMap.put("TimeReceiver", Utils.asListArgs("onReceive")); + ignoreFinalMap.put("WifiReceiver", Utils.asListArgs("onReceive")); + + return ignoreFinalMap; + } + + /** + * 获取忽略指定方法 static 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreStaticMap() { + Map> ignoreStaticMap = new HashMap(); + ignoreStaticMap.put("AccessibilityListenerService", Utils.asListArgs("onAccessibilityEvent","onInterrupt","onServiceConnected","onCreate","onDestroy")); + ignoreStaticMap.put("AppStateReceiver", Utils.asListArgs("onReceive")); + ignoreStaticMap.put("BaseResponse", Utils.asListArgs("getOriginal")); + ignoreStaticMap.put("BatteryReceiver", Utils.asListArgs("onReceive")); + ignoreStaticMap.put("GlideEngine", Utils.asListArgs("loadImage","loadImage","loadImage","loadFolderImage","loadAsGifImage","loadGridImage")); + ignoreStaticMap.put("GlideTransformUtils.GlideBlurformation", Utils.asListArgs("transform","updateDiskCacheKey","blurBitmap")); + ignoreStaticMap.put("GlideTransformUtils.GlideCircleTransform", Utils.asListArgs("transform","circleCrop","updateDiskCacheKey")); + ignoreStaticMap.put("GlideTransformUtils.GlideRoundTransform", Utils.asListArgs("transform","roundCrop","updateDiskCacheKey")); + ignoreStaticMap.put("GlideTransformUtils.RotateTransformation", Utils.asListArgs("transform","updateDiskCacheKey")); + ignoreStaticMap.put("GlideUtils.GlideLoader", Utils.asListArgs("preload","preload","displayImage","displayImage","displayImage","displayImage","displayImageToGif","displayImageToGif","displayImageToGif","displayImageToGif","displayImageToDrawable","displayImageToDrawable","displayImageToDrawable","displayImageToDrawable","displayImageToFile","displayImageToFile","displayImageToFile","displayImageToFile","loadImageBitmap","loadImageBitmap","loadImageDrawable","loadImageDrawable","loadImageFile","loadImageFile","loadImageGif","loadImageGif","cancelDisplayTask","cancelDisplayTask","destroy","pause","resume","stop","start")); + ignoreStaticMap.put("HttpLoggingInterceptor", Utils.asListArgs("intercept","_finalPrintLog","isPlaintext","bodyEncoded")); + ignoreStaticMap.put("NetWorkReceiver", Utils.asListArgs("onReceive")); + ignoreStaticMap.put("NotificationService", Utils.asListArgs("onNotificationPosted","onNotificationRemoved","onCreate","onDestroy","onStartCommand","cancelNotification")); + ignoreStaticMap.put("OkGoResponse", Utils.asListArgs("getDataString")); + ignoreStaticMap.put("OkGoResponse.Builder", Utils.asListArgs("build","setData","setMessage","setCode","setToast","setResult","setOriginal","setException")); + ignoreStaticMap.put("PhoneReceiver", Utils.asListArgs("onReceive")); + ignoreStaticMap.put("PictureSelectorUtils.PicConfig", Utils.asListArgs("getMimeType","setMimeType","getSelectionMode","setSelectionMode","isCamera","setCamera","isCrop","setCrop","isCircleCrop","setCircleCrop","isCompress","setCompress","getMinimumCompressSize","setMinimumCompressSize","getWithAspectRatio","setWithAspectRatio","isGif","setGif","getImageSpanCount","setImageSpanCount","getMinSelectNum","setMinSelectNum","getMaxSelectNum","setMaxSelectNum","getLocalMedia","setLocalMedia","getCameraSavePath","setCameraSavePath","getCompressSavePath","setCompressSavePath","clone","set")); + ignoreStaticMap.put("RetrofitManager", Utils.asListArgs("get","put","remove","contains","getRetrofitMap","create")); + ignoreStaticMap.put("RxJavaManager", Utils.asListArgs("add","remove","contains","getManagerMap")); + ignoreStaticMap.put("ScreenReceiver", Utils.asListArgs("onReceive")); + ignoreStaticMap.put("SmsReceiver", Utils.asListArgs("onReceive")); + ignoreStaticMap.put("TimeReceiver", Utils.asListArgs("onReceive")); + ignoreStaticMap.put("WebViewAssist", Utils.asListArgs("setWebView","getWebView","isWebViewNotEmpty","setBuilder","setBuilder","getBuilder","apply","loadUrl","loadUrl","loadData","loadDataWithBaseURL","postUrl","loadDataWithBaseURL","loadDataWithBaseURL","getSettings","getUserAgentString","setUserAgentString","addJavascriptInterface","removeJavascriptInterface","evaluateJavascript","setWebViewClient","getWebViewClient","setWebChromeClient","getWebChromeClient","destroy","canGoBack","goBack","canGoForward","goForward","canGoBackOrForward","goBackOrForward","reload","stopLoading","clearCache","clearHistory","clearFormData","getScale","getScrollY","getScrollX","getContentHeight","getScaleHeight","getScaleHeight","getHeight","pageDown","pageUp","handlerKeyDown","setLayerTypeSoftware","setLayerType","getUrl","getOriginalUrl","getHitTestResult")); + ignoreStaticMap.put("WebViewAssist.Builder", Utils.asListArgs("setWebViewAssist","apply","setOnApplyListener","getApplyListener","clone","reset","applyPri","isJavaScriptEnabled","setJavaScriptEnabled","getRenderPriority","setRenderPriority","isUseWideViewPort","setUseWideViewPort","isLoadWithOverviewMode","setLoadWithOverviewMode","getLayoutAlgorithm","setLayoutAlgorithm","isSupportZoom","setSupportZoom","isBuiltInZoomControls","setBuiltInZoomControls","isDisplayZoomControls","setDisplayZoomControls","getTextZoom","setTextZoom","getStandardFontFamily","setStandardFontFamily","getDefaultFontSize","setDefaultFontSize","getMinimumFontSize","setMinimumFontSize","getMixedContentMode","setMixedContentMode","isLoadsImagesAutomatically","setLoadsImagesAutomatically","isJavaScriptCanOpenWindowsAutomatically","setJavaScriptCanOpenWindowsAutomatically","getDefaultTextEncodingName","setDefaultTextEncodingName","isGeolocationEnabled","setGeolocationEnabled","getUserAgentString","setUserAgentString","isAllowFileAccess","setAllowFileAccess","isAllowFileAccessFromFileURLs","setAllowFileAccessFromFileURLs","isAllowUniversalAccessFromFileURLs","setAllowUniversalAccessFromFileURLs","getCacheMode","setCacheMode","isDomStorageEnabled","setDomStorageEnabled","isAppCacheEnabled","setAppCacheEnabled","getAppCachePath","setAppCachePath","getAppCacheMaxSize","setAppCacheMaxSize","isDatabaseEnabled","setDatabaseEnabled","getDatabasePath","setDatabasePath")); + ignoreStaticMap.put("WifiReceiver", Utils.asListArgs("onReceive")); + + return ignoreStaticMap; + } + + /** + * 获取忽略指定方法 @param 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreParamMap() { + Map> ignoreParamMap = new HashMap(); + ignoreParamMap.put("AppStateReceiver", Utils.asListArgs("onReceive")); + ignoreParamMap.put("BaseBeanSubscriber", Utils.asListArgs("onNext","onError")); + ignoreParamMap.put("BaseResponseSubscriber", Utils.asListArgs("onNext","onError")); + ignoreParamMap.put("BatteryReceiver", Utils.asListArgs("onReceive")); + ignoreParamMap.put("GlideTransformUtils.GlideBlurformation", Utils.asListArgs("transform","updateDiskCacheKey","blurBitmap")); + ignoreParamMap.put("GlideTransformUtils.GlideCircleTransform", Utils.asListArgs("transform","circleCrop","updateDiskCacheKey")); + ignoreParamMap.put("GlideTransformUtils.GlideRoundTransform", Utils.asListArgs("transform","roundCrop","updateDiskCacheKey")); + ignoreParamMap.put("GlideTransformUtils.RotateTransformation", Utils.asListArgs("transform","updateDiskCacheKey")); + ignoreParamMap.put("GlideUtils", Utils.asListArgs("with","with","with","with","with","with")); + ignoreParamMap.put("HttpLoggingInterceptor", Utils.asListArgs("intercept","isPlaintext","bodyEncoded")); + ignoreParamMap.put("LubanUtils", Utils.asListArgs("compress","compress","compress","compress","compress","compress","compress")); + ignoreParamMap.put("NetWorkReceiver", Utils.asListArgs("onReceive")); + ignoreParamMap.put("NotificationService", Utils.asListArgs("onStartCommand")); + ignoreParamMap.put("OkGoCallback", Utils.asListArgs("onStart","uploadProgress","downloadProgress","onCacheSuccess","onError","onSuccess","convertResponse")); + ignoreParamMap.put("OkGoResponse.Builder", Utils.asListArgs("setData","setMessage","setCode","setToast","setResult","setOriginal","setException")); + ignoreParamMap.put("PhoneReceiver", Utils.asListArgs("onReceive")); + ignoreParamMap.put("ScreenReceiver", Utils.asListArgs("onReceive")); + ignoreParamMap.put("SmsReceiver", Utils.asListArgs("onReceive")); + ignoreParamMap.put("TimeReceiver", Utils.asListArgs("onReceive")); + ignoreParamMap.put("WifiReceiver", Utils.asListArgs("onReceive")); + + return ignoreParamMap; + } + + /** + * 获取忽略指定方法 @return 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnMap() { + Map> ignoreReturnMap = new HashMap(); + ignoreReturnMap.put("OkGoCallback", Utils.asListArgs("convertResponse")); + + return ignoreReturnMap; + } + + /** + * 获取忽略指定方法非 public 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreUnPublicMap() { + Map> ignoreUnPublicMap = new HashMap(); + ignoreUnPublicMap.put("AccessibilityListenerService", Utils.asListArgs("onServiceConnected")); + ignoreUnPublicMap.put("AppStateReceiver.AppStateListener", Utils.asListArgs("onAdded","onReplaced","onRemoved")); + ignoreUnPublicMap.put("BaseBeanSubscriber", Utils.asListArgs("onStart","getErrorMessage")); + ignoreUnPublicMap.put("BaseResponseSubscriber", Utils.asListArgs("onStart","getErrorMessage","isSuccess")); + ignoreUnPublicMap.put("BatteryReceiver.BatteryListener", Utils.asListArgs("onBatteryChanged","onBatteryLow","onBatteryOkay","onPowerConnected","onPowerUsageSummary")); + ignoreUnPublicMap.put("GlideTransformUtils.GlideBlurformation", Utils.asListArgs("transform")); + ignoreUnPublicMap.put("GlideTransformUtils.GlideCircleTransform", Utils.asListArgs("transform","circleCrop")); + ignoreUnPublicMap.put("GlideTransformUtils.GlideRoundTransform", Utils.asListArgs("transform","roundCrop")); + ignoreUnPublicMap.put("GlideTransformUtils.RotateTransformation", Utils.asListArgs("transform")); + ignoreUnPublicMap.put("HttpLoggingInterceptor", Utils.asListArgs("_finalPrintLog","isPlaintext","bodyEncoded")); + ignoreUnPublicMap.put("LubanUtils", Utils.asListArgs("getContext")); + ignoreUnPublicMap.put("LubanUtils.OnCompressListener", Utils.asListArgs("onStart","onSuccess","onError","onComplete")); + ignoreUnPublicMap.put("NetWorkReceiver.NetwordStateListener", Utils.asListArgs("onNetworkState")); + ignoreUnPublicMap.put("NotificationService.NotificationListener", Utils.asListArgs("onServiceCreated","onServiceDestroy","onStartCommand","onNotificationPosted","onNotificationRemoved")); + ignoreUnPublicMap.put("OkGoCallback", Utils.asListArgs("_response","isSuccess")); + ignoreUnPublicMap.put("OkGoDemo", Utils.asListArgs("demo")); + ignoreUnPublicMap.put("PhoneReceiver.PhoneListener", Utils.asListArgs("onPhoneStateChanged")); + ignoreUnPublicMap.put("ScreenReceiver.ScreenListener", Utils.asListArgs("screenOn","screenOff","userPresent")); + ignoreUnPublicMap.put("TimeReceiver.TimeListener", Utils.asListArgs("onTimeZoneChanged","onTimeChanged","onTimeTick")); + ignoreUnPublicMap.put("WebViewAssist.Builder", Utils.asListArgs("setWebViewAssist","applyPri")); + ignoreUnPublicMap.put("WebViewAssist.Builder.OnApplyListener", Utils.asListArgs("onApply")); + ignoreUnPublicMap.put("ZXingQRCodeUtils.QRResultCallBack", Utils.asListArgs("onResult")); + ignoreUnPublicMap.put("ZXingQRCodeUtils.QRScanCallBack", Utils.asListArgs("onResult")); + + return ignoreUnPublicMap; + } + + /** + * 获取忽略无修饰符变量处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreModifierVariableMap() { + Map> ignoreModifierVariableMap = new HashMap(); + + return ignoreModifierVariableMap; + } + + /** + * 获取忽略指定方法 return void 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnVoidMap() { + Map> ignoreReturnVoidMap = new HashMap(); + ignoreReturnVoidMap.put("AccessibilityListenerService", Utils.asListArgs("onAccessibilityEvent - void","onInterrupt - void","onServiceConnected - void","startService - void","stopService - void","setAccessibilityListener - void")); + ignoreReturnVoidMap.put("AccessibilityListenerService.AccessibilityListener", Utils.asListArgs("onAccessibilityEvent - void","onInterrupt - void","onServiceCreated - void","onServiceDestroy - void")); + ignoreReturnVoidMap.put("AppStateReceiver", Utils.asListArgs("registerReceiver - void","unregisterReceiver - void")); + ignoreReturnVoidMap.put("AppStateReceiver.AppStateListener", Utils.asListArgs("onAdded - void","onReplaced - void","onRemoved - void")); + ignoreReturnVoidMap.put("BaseBeanSubscriber", Utils.asListArgs("onSuccessResponse - void","onErrorResponse - void")); + ignoreReturnVoidMap.put("BaseResponseSubscriber", Utils.asListArgs("onSuccessResponse - void","onErrorResponse - void")); + ignoreReturnVoidMap.put("BatteryReceiver", Utils.asListArgs("registerReceiver - void","unregisterReceiver - void")); + ignoreReturnVoidMap.put("BatteryReceiver.BatteryListener", Utils.asListArgs("onBatteryChanged - void","onBatteryLow - void","onBatteryOkay - void","onPowerConnected - void","onPowerUsageSummary - void")); + ignoreReturnVoidMap.put("EventBusUtils", Utils.asListArgs("register - void","unregister - void","post - void","cancelEventDelivery - void","postSticky - void","removeStickyEvent - void","removeAllStickyEvents - void")); + ignoreReturnVoidMap.put("GlideEngine", Utils.asListArgs("loadImage - void","loadImage - void","loadImage - void","loadFolderImage - void","loadAsGifImage - void","loadGridImage - void")); + ignoreReturnVoidMap.put("GlideUtils", Utils.asListArgs("init - void","clearDiskCache - void","clearMemoryCache - void","onLowMemory - void")); + ignoreReturnVoidMap.put("GlideUtils.GlideLoader", Utils.asListArgs("preload - void","preload - void","displayImage - void","displayImage - void","displayImage - void","displayImage - void","displayImageToGif - void","displayImageToGif - void","displayImageToGif - void","displayImageToGif - void","displayImageToDrawable - void","displayImageToDrawable - void","displayImageToDrawable - void","displayImageToDrawable - void","displayImageToFile - void","displayImageToFile - void","displayImageToFile - void","displayImageToFile - void","loadImageBitmap - void","loadImageBitmap - void","loadImageDrawable - void","loadImageDrawable - void","loadImageFile - void","loadImageFile - void","loadImageGif - void","loadImageGif - void","cancelDisplayTask - void","cancelDisplayTask - void","destroy - void","pause - void","resume - void","stop - void","start - void")); + ignoreReturnVoidMap.put("HttpLoggingInterceptor", Utils.asListArgs("_finalPrintLog - void")); + ignoreReturnVoidMap.put("ImageLoaderUtils", Utils.asListArgs("init - void","displayImage - void","displayImage - void","displayImage - void","displayImage - void","displayImage - void","displayImage - void","displayImage - void","displayImage - void","loadImage - void","loadImage - void","loadImage - void","loadImage - void","loadImage - void","loadImage - void","clearDiskCache - void","clearMemoryCache - void","handleSlowNetwork - void","denyNetworkDownloads - void","cancelDisplayTask - void","setDefaultLoadingListener - void","destroy - void","pause - void","resume - void","stop - void")); + ignoreReturnVoidMap.put("LubanUtils", Utils.asListArgs("setConfig - void")); + ignoreReturnVoidMap.put("LubanUtils.OnCompressListener", Utils.asListArgs("onStart - void","onSuccess - void","onError - void","onComplete - void")); + ignoreReturnVoidMap.put("NetWorkReceiver", Utils.asListArgs("registerReceiver - void","unregisterReceiver - void")); + ignoreReturnVoidMap.put("NetWorkReceiver.NetwordStateListener", Utils.asListArgs("onNetworkState - void")); + ignoreReturnVoidMap.put("NotificationService", Utils.asListArgs("onNotificationPosted - void","onNotificationRemoved - void","startService - void","stopService - void","startNotificationListenSettings - void","cancelNotification - void","setNotificationListener - void")); + ignoreReturnVoidMap.put("NotificationService.NotificationListener", Utils.asListArgs("onServiceCreated - void","onServiceDestroy - void","onNotificationPosted - void","onNotificationRemoved - void")); + ignoreReturnVoidMap.put("OkGoCallback", Utils.asListArgs("onStart - void","onFinish - void","uploadProgress - void","downloadProgress - void","onCacheSuccess - void","onError - void","onSuccess - void","onSuccessResponse - void","onErrorResponse - void","_response - void")); + ignoreReturnVoidMap.put("OkGoDemo", Utils.asListArgs("getUserInfo - void","getUserList - void","uploadImage - void","uploadImages - void","demo - void")); + ignoreReturnVoidMap.put("OkGoUtils", Utils.asListArgs("initOkGo - void","execute - void","execute - void")); + ignoreReturnVoidMap.put("PhoneReceiver", Utils.asListArgs("registerReceiver - void","unregisterReceiver - void")); + ignoreReturnVoidMap.put("PhoneReceiver.PhoneListener", Utils.asListArgs("onPhoneStateChanged - void")); + ignoreReturnVoidMap.put("PictureSelectorUtils", Utils.asListArgs("setPicConfig - void","setSavePath - void","setMinimumCompressSize - void","deleteCacheDirFile - void")); + ignoreReturnVoidMap.put("RxJavaManager", Utils.asListArgs("add - void","remove - void")); + ignoreReturnVoidMap.put("ScreenReceiver", Utils.asListArgs("registerReceiver - void","unregisterReceiver - void")); + ignoreReturnVoidMap.put("ScreenReceiver.ScreenListener", Utils.asListArgs("screenOn - void","screenOff - void","userPresent - void")); + ignoreReturnVoidMap.put("SmsReceiver", Utils.asListArgs("registerReceiver - void","unregisterReceiver - void")); + ignoreReturnVoidMap.put("SmsReceiver.SmsListener", Utils.asListArgs("onMessage - void","onMessage - void")); + ignoreReturnVoidMap.put("TimeReceiver", Utils.asListArgs("registerReceiver - void","unregisterReceiver - void")); + ignoreReturnVoidMap.put("TimeReceiver.TimeListener", Utils.asListArgs("onTimeZoneChanged - void","onTimeChanged - void","onTimeTick - void")); + ignoreReturnVoidMap.put("WebViewAssist", Utils.asListArgs("setGlobalBuilder - void","removeCookie - void")); + ignoreReturnVoidMap.put("WebViewAssist.Builder.OnApplyListener", Utils.asListArgs("onApply - void")); + ignoreReturnVoidMap.put("WifiReceiver", Utils.asListArgs("registerReceiver - void","unregisterReceiver - void")); + ignoreReturnVoidMap.put("WifiReceiver.WifiListener", Utils.asListArgs("onIntoTrigger - void","onTrigger - void","onTrigger - void","onWifiSwitch - void")); + ignoreReturnVoidMap.put("ZXingQRCodeUtils", Utils.asListArgs("createQRCodeImage - void","createQRCodeImage - void","createQRCodeImage - void","decodeQRCode - void")); + ignoreReturnVoidMap.put("ZXingQRCodeUtils.QRResultCallBack", Utils.asListArgs("onResult - void")); + ignoreReturnVoidMap.put("ZXingQRCodeUtils.QRScanCallBack", Utils.asListArgs("onResult - void")); + + return ignoreReturnVoidMap; + } + + /** + * 忽略注释间距异常文件 + * @param map {@link HashMap} + */ + @Override + public void ignoreAnnotationSpaceMap(Map map) { + + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_other/DevOtherMain.java b/src/main/java/javadoc/dev_utils/check/dev_other/DevOtherMain.java new file mode 100644 index 00000000..59a6cb9f --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_other/DevOtherMain.java @@ -0,0 +1,45 @@ +package javadoc.dev_utils.check.dev_other; + +import dev.utils.common.ArrayUtils; +import dev.utils.common.ConvertUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.check.dev.CheckInfo; +import javadoc.dev_utils.check.dev.CheckMain; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * detail: 代码读取检测分析 Main 方法 + * @author Ttt + */ +public class DevOtherMain { + + public static void main(String[] args) { + // 检测路径 + String path = ApiConfig.DEV_OTHER_PATH; + // 代码检测分析配置接口 + ICheckConfig iCheckConfig = new DevOtherConfig(); + // 是否覆盖文件内容 + boolean coverText = ConvertUtils.toBoolean(ArrayUtils.get(args, 0), true); + // 是否使用 List + boolean isLists = false; + // 检测指定文件集合 + List listFiles = new ArrayList(); + // 是否打印方法返回值 void 记录 + boolean isPrintVoid = false; + // 是否需要生成 Config + boolean generateConfig = ConvertUtils.toBoolean(ArrayUtils.get(args, 1)); + + // 执行检测 + CheckMain.execute(DevOtherMain.class, new CheckInfo(path, iCheckConfig) + .setCoverText(coverText) + .setLists(isLists) + .setListFiles(listFiles) + .setPrintVoid(isPrintVoid) + .setGenerateConfig(generateConfig) + ); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_standard/DevStandardConfig.java b/src/main/java/javadoc/dev_utils/check/dev_standard/DevStandardConfig.java new file mode 100644 index 00000000..12d3675b --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_standard/DevStandardConfig.java @@ -0,0 +1,145 @@ +package javadoc.dev_utils.check.dev_standard; + +import javadoc.Utils; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * detail: DevStandardConfig 代码检测分析配置 + * @author Ttt + */ +final class DevStandardConfig implements ICheckConfig { + + /** + * 获取忽略指定方法注释配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreAnnotateMap() { + Map> ignoreAnnotateMap = new HashMap(); + ignoreAnnotateMap.put("CatalogMain", Utils.asListArgs("main")); + ignoreAnnotateMap.put("ColorSortMain", Utils.asListArgs("main")); + ignoreAnnotateMap.put("ColorSortMain.SAXXml.SAXDemoHandel", Utils.asListArgs("startDocument","endDocument","startElement","endElement","characters")); + ignoreAnnotateMap.put("ConfigMain", Utils.asListArgs("main")); + ignoreAnnotateMap.put("PanguAnalyzeMain", Utils.asListArgs("main")); + + return ignoreAnnotateMap; + } + + /** + * 获取忽略指定方法参数 final 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreFinalMap() { + Map> ignoreFinalMap = new HashMap(); + ignoreFinalMap.put("CatalogMain", Utils.asListArgs("main")); + ignoreFinalMap.put("ColorSortMain", Utils.asListArgs("main")); + ignoreFinalMap.put("ColorSortMain.SAXXml.SAXDemoHandel", Utils.asListArgs("startElement","endElement","characters")); + ignoreFinalMap.put("ConfigMain", Utils.asListArgs("main")); + ignoreFinalMap.put("Pangu", Utils.asListArgs("spacingText","spacingFile")); + ignoreFinalMap.put("PanguAnalyzeMain", Utils.asListArgs("main")); + + return ignoreFinalMap; + } + + /** + * 获取忽略指定方法 static 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreStaticMap() { + Map> ignoreStaticMap = new HashMap(); + ignoreStaticMap.put("ColorSortMain.SAXXml", Utils.asListArgs("analysisColorsXml")); + ignoreStaticMap.put("ColorSortMain.SAXXml.SAXDemoHandel", Utils.asListArgs("startDocument","endDocument","startElement","endElement","characters")); + ignoreStaticMap.put("DepsJsonBean", Utils.asListArgs("map","getDependencies","getAllDependencies","getAllDependencies")); + ignoreStaticMap.put("Pangu", Utils.asListArgs("spacingText","spacingFile")); + + return ignoreStaticMap; + } + + /** + * 获取忽略指定方法 @param 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreParamMap() { + Map> ignoreParamMap = new HashMap(); + ignoreParamMap.put("CatalogMain", Utils.asListArgs("main")); + ignoreParamMap.put("ColorSortMain", Utils.asListArgs("main")); + ignoreParamMap.put("ColorSortMain.SAXXml.SAXDemoHandel", Utils.asListArgs("startElement","endElement","characters")); + ignoreParamMap.put("ConfigMain", Utils.asListArgs("main")); + ignoreParamMap.put("PanguAnalyzeMain", Utils.asListArgs("main")); + + return ignoreParamMap; + } + + /** + * 获取忽略指定方法 @return 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnMap() { + Map> ignoreReturnMap = new HashMap(); + + return ignoreReturnMap; + } + + /** + * 获取忽略指定方法非 public 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreUnPublicMap() { + Map> ignoreUnPublicMap = new HashMap(); + ignoreUnPublicMap.put("CatalogGenerate", Utils.asListArgs("getFolderLists","getFolderLists","calculateMaxLength","createCatalog","createCatalogLine","forCatalog")); + ignoreUnPublicMap.put("CatalogGenerate.CatalogCallback", Utils.asListArgs("callback")); + ignoreUnPublicMap.put("CatalogMain", Utils.asListArgs("print")); + ignoreUnPublicMap.put("ColorSortMain.SAXXml.DocumentListener", Utils.asListArgs("OnEnd")); + ignoreUnPublicMap.put("PanguAnalyzeMain", Utils.asListArgs("getFileCatalogLists","forReader","readFile","createGson","toJsonFormat")); + ignoreUnPublicMap.put("PanguAnalyzeMain.Filter", Utils.asListArgs("filter")); + + return ignoreUnPublicMap; + } + + /** + * 获取忽略无修饰符变量处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreModifierVariableMap() { + Map> ignoreModifierVariableMap = new HashMap(); + + return ignoreModifierVariableMap; + } + + /** + * 获取忽略指定方法 return void 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnVoidMap() { + Map> ignoreReturnVoidMap = new HashMap(); + ignoreReturnVoidMap.put("CatalogGenerate", Utils.asListArgs("calculateMaxLength - void","forCatalog - void")); + ignoreReturnVoidMap.put("CatalogGenerate.CatalogCallback", Utils.asListArgs("callback - void")); + ignoreReturnVoidMap.put("CatalogMain", Utils.asListArgs("print - void")); + ignoreReturnVoidMap.put("ColorSortMain.SAXXml", Utils.asListArgs("analysisColorsXml - void")); + ignoreReturnVoidMap.put("ColorSortMain.SAXXml.DocumentListener", Utils.asListArgs("OnEnd - void")); + ignoreReturnVoidMap.put("Pangu", Utils.asListArgs("spacingFile - void")); + ignoreReturnVoidMap.put("PanguAnalyzeMain", Utils.asListArgs("forReader - void","readFile - void")); + + return ignoreReturnVoidMap; + } + + /** + * 忽略注释间距异常文件 + * @param map {@link HashMap} + */ + @Override + public void ignoreAnnotationSpaceMap(Map map) { + + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_standard/DevStandardMain.java b/src/main/java/javadoc/dev_utils/check/dev_standard/DevStandardMain.java new file mode 100644 index 00000000..0613f5dc --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_standard/DevStandardMain.java @@ -0,0 +1,45 @@ +package javadoc.dev_utils.check.dev_standard; + +import dev.utils.common.ArrayUtils; +import dev.utils.common.ConvertUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.check.dev.CheckInfo; +import javadoc.dev_utils.check.dev.CheckMain; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * detail: 代码读取检测分析 Main 方法 + * @author Ttt + */ +public class DevStandardMain { + + public static void main(String[] args) { + // 检测路径 + String path = ApiConfig.DEV_STANDARD_PATH; + // 代码检测分析配置接口 + ICheckConfig iCheckConfig = new DevStandardConfig(); + // 是否覆盖文件内容 + boolean coverText = ConvertUtils.toBoolean(ArrayUtils.get(args, 0), true); + // 是否使用 List + boolean isLists = false; + // 检测指定文件集合 + List listFiles = new ArrayList(); + // 是否打印方法返回值 void 记录 + boolean isPrintVoid = false; + // 是否需要生成 Config + boolean generateConfig = ConvertUtils.toBoolean(ArrayUtils.get(args, 1)); + + // 执行检测 + CheckMain.execute(DevStandardMain.class, new CheckInfo(path, iCheckConfig) + .setCoverText(coverText) + .setLists(isLists) + .setListFiles(listFiles) + .setPrintVoid(isPrintVoid) + .setGenerateConfig(generateConfig) + ); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_widget/DevWidgetConfig.java b/src/main/java/javadoc/dev_utils/check/dev_widget/DevWidgetConfig.java new file mode 100644 index 00000000..f71233fb --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_widget/DevWidgetConfig.java @@ -0,0 +1,298 @@ +package javadoc.dev_utils.check.dev_widget; + +import javadoc.Utils; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * detail: DevWidgetConfig 代码检测分析配置 + * @author Ttt + */ +final class DevWidgetConfig implements ICheckConfig { + + /** + * 获取忽略指定方法注释配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreAnnotateMap() { + Map> ignoreAnnotateMap = new HashMap(); + ignoreAnnotateMap.put("AdjustHeightGridView", Utils.asListArgs("onMeasure")); + ignoreAnnotateMap.put("AdjustHeightListView", Utils.asListArgs("onMeasure")); + ignoreAnnotateMap.put("AdjustHeightRecyclerView", Utils.asListArgs("onMeasure")); + ignoreAnnotateMap.put("AdjustHeightWebView", Utils.asListArgs("onMeasure")); + ignoreAnnotateMap.put("CornerLabelView", Utils.asListArgs("onMeasure","onDraw")); + ignoreAnnotateMap.put("CustomGallery", Utils.asListArgs("onMeasure","onFling","onTouchEvent","onInterceptTouchEvent")); + ignoreAnnotateMap.put("CustomHorizontalScrollView", Utils.asListArgs("onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent")); + ignoreAnnotateMap.put("CustomNestedScrollView", Utils.asListArgs("onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent")); + ignoreAnnotateMap.put("CustomRecyclerView", Utils.asListArgs("onMeasure","onScrolled","onScrollStateChanged","onTouchEvent","onInterceptTouchEvent")); + ignoreAnnotateMap.put("CustomScrollView", Utils.asListArgs("onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent")); + ignoreAnnotateMap.put("CustomViewPager", Utils.asListArgs("onMeasure","onTouchEvent","onInterceptTouchEvent")); + ignoreAnnotateMap.put("CustomViewPager.OnDirectionListener", Utils.asListArgs("onPageScrolled","onPageScrollStateChanged")); + ignoreAnnotateMap.put("CustomWebView", Utils.asListArgs("onMeasure","onScrollChanged","onTouchEvent","onInterceptTouchEvent")); + ignoreAnnotateMap.put("FlowLikeView", Utils.asListArgs("onMeasure","onSizeChanged")); + ignoreAnnotateMap.put("FlowLikeView.AnimationEndListener", Utils.asListArgs("onAnimationEnd")); + ignoreAnnotateMap.put("FlowLikeView.CurveEvaluator", Utils.asListArgs("evaluate")); + ignoreAnnotateMap.put("FlowLikeView.CurveUpdateLister", Utils.asListArgs("onAnimationUpdate")); + ignoreAnnotateMap.put("LimitLayout", Utils.asListArgs("onMeasure")); + ignoreAnnotateMap.put("LineTextView", Utils.asListArgs("onDraw")); + ignoreAnnotateMap.put("LoadProgressBar", Utils.asListArgs("onDraw")); + ignoreAnnotateMap.put("RadiusAttrs", Utils.asListArgs("onSaveInstanceState","onRestoreInstanceState")); + ignoreAnnotateMap.put("RadiusLayout", Utils.asListArgs("onSizeChanged","draw","onSaveInstanceState","onRestoreInstanceState")); + ignoreAnnotateMap.put("RightIconEditText", Utils.asListArgs("setCompoundDrawables","onTouchEvent","finalize")); + ignoreAnnotateMap.put("ScanShapeView", Utils.asListArgs("onDraw")); + ignoreAnnotateMap.put("ScanShapeView.CornerEffect", Utils.asListArgs("getRadius")); + ignoreAnnotateMap.put("SignView", Utils.asListArgs("onDraw","onTouchEvent")); + ignoreAnnotateMap.put("StateLayout", Utils.asListArgs("setGlobal","setListener","showIng","showFailed","showSuccess","showEmptyData","showType","notifyDataSetChanged","gone","visible","getTag","setTag","getData","setData","getData","setData","getView","getCurrentType","getCurrentView")); + ignoreAnnotateMap.put("StateLayout.Listener", Utils.asListArgs("onRemove","onNotFound","onChange")); + ignoreAnnotateMap.put("StateLayout.TypeAdapter", Utils.asListArgs("onCreateView","onBindView")); + ignoreAnnotateMap.put("ViewAssist", Utils.asListArgs("showIng","showFailed","showSuccess","showEmptyData","notifyDataSetChanged","gone","visible","getWrapper","getTag","setTag","getData","setData","getData","setData","getAdapter","getView","getCurrentType","getCurrentView","setListener")); + ignoreAnnotateMap.put("ViewAssist.Adapter", Utils.asListArgs("onCreateView","onBindView")); + ignoreAnnotateMap.put("ViewAssist.Listener", Utils.asListArgs("onRemove","onNotFound","onChange")); + ignoreAnnotateMap.put("WrapView", Utils.asListArgs("onMeasure","onLayout")); + + return ignoreAnnotateMap; + } + + /** + * 获取忽略指定方法参数 final 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreFinalMap() { + Map> ignoreFinalMap = new HashMap(); + ignoreFinalMap.put("AdjustHeightGridView", Utils.asListArgs("onMeasure")); + ignoreFinalMap.put("AdjustHeightListView", Utils.asListArgs("onMeasure")); + ignoreFinalMap.put("AdjustHeightRecyclerView", Utils.asListArgs("onMeasure")); + ignoreFinalMap.put("AdjustHeightWebView", Utils.asListArgs("onMeasure")); + ignoreFinalMap.put("CornerLabelView", Utils.asListArgs("initAttrs","onMeasure","onDraw","setPaddingTop","setPaddingCenter","setPaddingBottom","setFillColor","setFillShader","triangle","setText1","setTextColor1","setTextHeight1","setTextBold1","setText2","setTextColor2","setTextHeight2","setTextBold2")); + ignoreFinalMap.put("CornerLabelView.Painter", Utils.asListArgs("draw")); + ignoreFinalMap.put("CustomGallery", Utils.asListArgs("initAttrs","onMeasure","onFling","onTouchEvent","onInterceptTouchEvent","isScrollingLeft","setMaxWidth","setMaxHeight","setSlide")); + ignoreFinalMap.put("CustomHorizontalScrollView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent","setMaxWidth","setMaxHeight","setSlide","setScrollCallBack")); + ignoreFinalMap.put("CustomNestedScrollView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent","setMaxWidth","setMaxHeight","setSlide","setScrollCallBack")); + ignoreFinalMap.put("CustomRecyclerView", Utils.asListArgs("initAttrs","onMeasure","onScrolled","onScrollStateChanged","onTouchEvent","onInterceptTouchEvent","setMaxWidth","setMaxHeight","setSlide","setScrollCallBack")); + ignoreFinalMap.put("CustomScrollView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent","setMaxWidth","setMaxHeight","setSlide","setScrollCallBack")); + ignoreFinalMap.put("CustomViewPager", Utils.asListArgs("initAttrs","onMeasure","onTouchEvent","onInterceptTouchEvent","setMaxWidth","setMaxHeight","setSlide")); + ignoreFinalMap.put("CustomWebView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","onTouchEvent","onInterceptTouchEvent","setMaxWidth","setMaxHeight","setSlide","setScrollCallBack")); + ignoreFinalMap.put("FlowLikeView", Utils.asListArgs("initAttrs","onMeasure","onSizeChanged","generateCTRLPointF","generateCurveAnimation","generateEnterAnimation","startAnimation","setDrawables","setIconWidth","setIconHeight","setAnimDuration")); + ignoreFinalMap.put("FlowLikeView.AnimationEndListener", Utils.asListArgs("onAnimationEnd")); + ignoreFinalMap.put("FlowLikeView.CurveEvaluator", Utils.asListArgs("evaluate")); + ignoreFinalMap.put("FlowLikeView.CurveUpdateLister", Utils.asListArgs("onAnimationUpdate")); + ignoreFinalMap.put("LimitLayout", Utils.asListArgs("initAttrs","onMeasure","setMaxWidth","setMaxHeight")); + ignoreFinalMap.put("LineTextView", Utils.asListArgs("onDraw","setNewLineCallBack")); + ignoreFinalMap.put("LoadProgressBar", Utils.asListArgs("initAttrs","onDraw","drawProgressText","drawProgressText","setMax","setProgress","setProgressColor","setOuterRingColor","setInsideCircleWidth","setOuterRingWidth","setCanvasNumber","setNumberTextSize","setNumberTextColor","setProgressStyle")); + ignoreFinalMap.put("RadiusAttrs", Utils.asListArgs("onSizeChanged","setRadius","setRadiusLeftTop","setRadiusLeftBottom","setRadiusRightTop","setRadiusRightBottom","setRadiusLeft","setRadiusRight","setRadiusTop","setRadiusBottom","onSaveInstanceState","onRestoreInstanceState")); + ignoreFinalMap.put("RadiusLayout", Utils.asListArgs("initAttrs","onSizeChanged","draw","onRestoreInstanceState","setRadius","setRadiusLeftTop","setRadiusLeftBottom","setRadiusRightTop","setRadiusRightBottom","setRadiusLeft","setRadiusRight","setRadiusTop","setRadiusBottom")); + ignoreFinalMap.put("RightIconEditText", Utils.asListArgs("setCompoundDrawables","onTouchEvent","setRangeMultiple","setDrawRightIcon","setRightIcon","setTextWatcher","init")); + ignoreFinalMap.put("ScanShapeView", Utils.asListArgs("onDraw","setShapeType","setCornerEffect","setRegion","setRegion","setRegion","getRegion","setBorderMargin","setBorderColor","setBorderWidth","setDrawBorder","setDrawBackground","setBGColor","setDrawAnim","setAutoAnim","setBorderToSquare","setBorderWidthToSquare","setTriAngleLength","setSpecialToSquare","setLineDurationToSquare","setBitmapToSquare","setLineMarginTopToSquare","setLineMarginLeftToSquare","setLineColorToSquare","setLineWidthToHexagon","setLineMarginToHexagon","setLineAnimDirection","setLineColorToHexagon","setBitmapToAnnulus","setLineColorToAnnulus","setLineOffsetSpeedToAnnulus","setAnnulusDraws","setAnnulusColors","setAnnulusLengths","setAnnulusWidths","setAnnulusMargins","sin","calcShapeRegion","makeShape","makeBackground","makeAnim","drawAnim","resetAnim","animSwitch")); + ignoreFinalMap.put("SignView", Utils.asListArgs("onDraw","onTouchEvent","_resetCanvas","setPath","setPaint","setDrawCallBack")); + ignoreFinalMap.put("StateLayout", Utils.asListArgs("setGlobal","setListener","showType","register","unregister","unregister","setTag","setData","getData","setData","getView")); + ignoreFinalMap.put("StateLayout.Global", Utils.asListArgs("register","unregister")); + ignoreFinalMap.put("StateLayout.TypeAdapter", Utils.asListArgs("onCreateView","onBindView")); + ignoreFinalMap.put("ViewAssist", Utils.asListArgs("wrap","wrap","showType","register","unregister","unregister","setTag","setData","getData","setData","getAdapter","getView","setListener")); + ignoreFinalMap.put("WrapView", Utils.asListArgs("initAttrs","onMeasure","onLayout","setMaxLine","setRowTopMargin","setViewLeftMargin","setRowViewMargin")); + + return ignoreFinalMap; + } + + /** + * 获取忽略指定方法 static 修饰符配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreStaticMap() { + Map> ignoreStaticMap = new HashMap(); + ignoreStaticMap.put("AdjustHeightGridView", Utils.asListArgs("onMeasure")); + ignoreStaticMap.put("AdjustHeightListView", Utils.asListArgs("onMeasure")); + ignoreStaticMap.put("AdjustHeightRecyclerView", Utils.asListArgs("onMeasure")); + ignoreStaticMap.put("AdjustHeightWebView", Utils.asListArgs("onMeasure")); + ignoreStaticMap.put("CornerLabelView", Utils.asListArgs("initAttrs","onMeasure","onDraw","calcPath","getPainter1","getPainter2","setPaddingTop","setPaddingCenter","setPaddingBottom","setFillColor","setFillShader","left","right","top","bottom","triangle","setText1","setTextColor1","setTextHeight1","setTextBold1","setText2","setTextColor2","setTextHeight2","setTextBold2","refresh")); + ignoreStaticMap.put("CornerLabelView.Painter", Utils.asListArgs("init","draw","getPaint","getText","getTextColor","getTextHeight","isTextBold")); + ignoreStaticMap.put("CustomGallery", Utils.asListArgs("initAttrs","onMeasure","onFling","onTouchEvent","onInterceptTouchEvent","isScrollingLeft","getMaxWidth","setMaxWidth","getMaxHeight","setMaxHeight","isSlide","setSlide","toggleSlide")); + ignoreStaticMap.put("CustomHorizontalScrollView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent","getMaxWidth","setMaxWidth","getMaxHeight","setMaxHeight","isSlide","setSlide","toggleSlide","setScrollCallBack")); + ignoreStaticMap.put("CustomNestedScrollView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent","getMaxWidth","setMaxWidth","getMaxHeight","setMaxHeight","isSlide","setSlide","toggleSlide","setScrollCallBack")); + ignoreStaticMap.put("CustomRecyclerView", Utils.asListArgs("initAttrs","onMeasure","onScrolled","onScrollStateChanged","onTouchEvent","onInterceptTouchEvent","getMaxWidth","setMaxWidth","getMaxHeight","setMaxHeight","isSlide","setSlide","toggleSlide","setScrollCallBack")); + ignoreStaticMap.put("CustomScrollView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent","getMaxWidth","setMaxWidth","getMaxHeight","setMaxHeight","isSlide","setSlide","toggleSlide","setScrollCallBack")); + ignoreStaticMap.put("CustomViewPager", Utils.asListArgs("initAttrs","onMeasure","onTouchEvent","onInterceptTouchEvent","getMaxWidth","setMaxWidth","getMaxHeight","setMaxHeight","isSlide","setSlide","toggleSlide")); + ignoreStaticMap.put("CustomWebView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","onTouchEvent","onInterceptTouchEvent","getMaxWidth","setMaxWidth","getMaxHeight","setMaxHeight","isSlide","setSlide","toggleSlide","setScrollCallBack")); + ignoreStaticMap.put("FlowLikeView", Utils.asListArgs("initAttrs","onMeasure","onSizeChanged","generateCTRLPointF","generateCurveAnimation","generateEnterAnimation","startAnimation","resetLayoutParams","like","getDrawables","setDrawables","setDrawablesById","getIconWidth","setIconWidth","getIconHeight","setIconHeight","getAnimDuration","setAnimDuration")); + ignoreStaticMap.put("FlowLikeView.AnimationEndListener", Utils.asListArgs("onAnimationEnd")); + ignoreStaticMap.put("FlowLikeView.CurveEvaluator", Utils.asListArgs("evaluate")); + ignoreStaticMap.put("FlowLikeView.CurveUpdateLister", Utils.asListArgs("onAnimationUpdate")); + ignoreStaticMap.put("LimitLayout", Utils.asListArgs("initAttrs","onMeasure","getMaxWidth","setMaxWidth","getMaxHeight","setMaxHeight")); + ignoreStaticMap.put("LineTextView", Utils.asListArgs("onDraw","isNewLine","setNewLineCallBack")); + ignoreStaticMap.put("LoadProgressBar", Utils.asListArgs("initAttrs","init","onDraw","drawProgressText","drawProgressText","reset","getMax","setMax","getProgress","setProgress","getProgressColor","setProgressColor","getOuterRingColor","setOuterRingColor","getInsideCircleWidth","setInsideCircleWidth","getOuterRingWidth","setOuterRingWidth","isCanvasNumber","setCanvasNumber","getNumberTextSize","setNumberTextSize","getNumberTextColor","setNumberTextColor","getProgressStyle","setProgressStyle")); + ignoreStaticMap.put("RadiusAttrs", Utils.asListArgs("resetRadius","onSizeChanged","getPath","setRadius","setRadiusLeftTop","setRadiusLeftBottom","setRadiusRightTop","setRadiusRightBottom","setRadiusLeft","setRadiusRight","setRadiusTop","setRadiusBottom","getRadius","getRadiusLeftTop","getRadiusLeftBottom","getRadiusRightTop","getRadiusRightBottom","onSaveInstanceState","onRestoreInstanceState")); + ignoreStaticMap.put("RadiusLayout", Utils.asListArgs("initAttrs","onSizeChanged","draw","onSaveInstanceState","onRestoreInstanceState","setRadius","setRadiusLeftTop","setRadiusLeftBottom","setRadiusRightTop","setRadiusRightBottom","setRadiusLeft","setRadiusRight","setRadiusTop","setRadiusBottom","getRadius","getRadiusLeftTop","getRadiusLeftBottom","getRadiusRightTop","getRadiusRightBottom")); + ignoreStaticMap.put("RightIconEditText", Utils.asListArgs("setCompoundDrawables","onTouchEvent","finalize","getRangeMultiple","setRangeMultiple","isDrawRightIcon","setDrawRightIcon","getRightIcon","setRightIcon","setTextWatcher","init","drawOperate")); + ignoreStaticMap.put("ScanShapeView", Utils.asListArgs("init","handlerCornerPathEffect","onDraw","destroy","getShapeType","setShapeType","getCornerRadius","setCornerEffect","setRegion","setRegion","setRegion","getRegionLeft","getRegionTop","getRegionWidth","getRegionHeight","getRegion","getRegion","getRegionParent","getBorderMargin","setBorderMargin","getBorderColor","setBorderColor","getBorderWidth","setBorderWidth","isDrawBorder","setDrawBorder","isDrawBackground","setDrawBackground","getBGColor","setBGColor","isDrawAnim","setDrawAnim","isAutoAnim","setAutoAnim","getBorderToSquare","setBorderToSquare","getBorderWidthToSquare","setBorderWidthToSquare","getTriAngleLength","setTriAngleLength","isSpecialToSquare","setSpecialToSquare","getLineDurationToSquare","setLineDurationToSquare","getBitmapToSquare","setBitmapToSquare","getLineMarginTopToSquare","setLineMarginTopToSquare","getLineMarginLeftToSquare","setLineMarginLeftToSquare","getLineColorToSquare","setLineColorToSquare","getLineWidthToHexagon","setLineWidthToHexagon","getLineMarginToHexagon","setLineMarginToHexagon","isLineAnimDirection","setLineAnimDirection","getLineColorToHexagon","setLineColorToHexagon","getBitmapToAnnulus","setBitmapToAnnulus","getLineColorToAnnulus","setLineColorToAnnulus","getLineOffsetSpeedToAnnulus","setLineOffsetSpeedToAnnulus","getAnnulusDraws","setAnnulusDraws","getAnnulusColors","setAnnulusColors","getAnnulusLengths","setAnnulusLengths","getAnnulusWidths","setAnnulusWidths","getAnnulusMargins","setAnnulusMargins","refPaintToAnnulus","sin","getRegionMarginLeft","getRegionMarginTop","calcShapeRegion","calcShapeRegion","makeShape","makeBackground","makeAnim","drawAnim","resetAnim","startAnim","stopAnim","animSwitch","isAnimRunning","refLineColorToSquare","refLineColorToHexagon","refLineColorToAnnulus","initAnim")); + ignoreStaticMap.put("ScanShapeView.CornerEffect", Utils.asListArgs("getRadius")); + ignoreStaticMap.put("SignView", Utils.asListArgs("onDraw","onTouchEvent","_resetCanvas","clearCanvas","snapshotByView","getPath","setPath","getPaint","setPaint","setDrawCallBack")); + ignoreStaticMap.put("StateLayout", Utils.asListArgs("reset","init","setListener","showIng","showFailed","showSuccess","showEmptyData","showType","notifyDataSetChanged","gone","visible","register","unregister","unregister","getTag","setTag","getData","setData","getData","setData","getView","getCurrentType","getCurrentView")); + ignoreStaticMap.put("StateLayout.Global", Utils.asListArgs("register","unregister")); + ignoreStaticMap.put("StateLayout.TypeAdapter", Utils.asListArgs("onCreateView","onBindView")); + ignoreStaticMap.put("ViewAssist", Utils.asListArgs("showIng","showFailed","showSuccess","showEmptyData","showType","notifyDataSetChanged","gone","visible","register","unregister","unregister","reset","getWrapper","getTag","setTag","getData","setData","getData","setData","getAdapter","getView","getCurrentType","getCurrentView","setListener")); + ignoreStaticMap.put("WrapView", Utils.asListArgs("initAttrs","onMeasure","onLayout","calc","refreshDraw","getRowLine","getMaxLine","setMaxLine","getRowTopMargin","setRowTopMargin","getViewLeftMargin","setViewLeftMargin","setRowViewMargin")); + + return ignoreStaticMap; + } + + /** + * 获取忽略指定方法 @param 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreParamMap() { + Map> ignoreParamMap = new HashMap(); + ignoreParamMap.put("AdjustHeightGridView", Utils.asListArgs("onMeasure")); + ignoreParamMap.put("AdjustHeightListView", Utils.asListArgs("onMeasure")); + ignoreParamMap.put("AdjustHeightRecyclerView", Utils.asListArgs("onMeasure")); + ignoreParamMap.put("AdjustHeightWebView", Utils.asListArgs("onMeasure")); + ignoreParamMap.put("CornerLabelView", Utils.asListArgs("onMeasure","onDraw")); + ignoreParamMap.put("CustomGallery", Utils.asListArgs("onMeasure","onFling","onTouchEvent","onInterceptTouchEvent")); + ignoreParamMap.put("CustomHorizontalScrollView", Utils.asListArgs("onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent")); + ignoreParamMap.put("CustomNestedScrollView", Utils.asListArgs("onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent")); + ignoreParamMap.put("CustomRecyclerView", Utils.asListArgs("onMeasure","onScrolled","onScrollStateChanged","onTouchEvent","onInterceptTouchEvent")); + ignoreParamMap.put("CustomScrollView", Utils.asListArgs("onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen","onTouchEvent","onInterceptTouchEvent")); + ignoreParamMap.put("CustomViewPager", Utils.asListArgs("onMeasure","onTouchEvent","onInterceptTouchEvent")); + ignoreParamMap.put("CustomViewPager.OnDirectionListener", Utils.asListArgs("onPageScrolled","onPageScrollStateChanged")); + ignoreParamMap.put("CustomWebView", Utils.asListArgs("onMeasure","onScrollChanged","onTouchEvent","onInterceptTouchEvent")); + ignoreParamMap.put("FlowLikeView", Utils.asListArgs("onMeasure","onSizeChanged")); + ignoreParamMap.put("FlowLikeView.AnimationEndListener", Utils.asListArgs("onAnimationEnd")); + ignoreParamMap.put("FlowLikeView.CurveEvaluator", Utils.asListArgs("evaluate")); + ignoreParamMap.put("FlowLikeView.CurveUpdateLister", Utils.asListArgs("onAnimationUpdate")); + ignoreParamMap.put("LimitLayout", Utils.asListArgs("onMeasure")); + ignoreParamMap.put("LineTextView", Utils.asListArgs("onDraw")); + ignoreParamMap.put("LoadProgressBar", Utils.asListArgs("onDraw")); + ignoreParamMap.put("RadiusAttrs", Utils.asListArgs("onSaveInstanceState","onRestoreInstanceState")); + ignoreParamMap.put("RadiusLayout", Utils.asListArgs("onSizeChanged","draw","onRestoreInstanceState")); + ignoreParamMap.put("RightIconEditText", Utils.asListArgs("setCompoundDrawables","onTouchEvent")); + ignoreParamMap.put("ScanShapeView", Utils.asListArgs("onDraw")); + ignoreParamMap.put("SignView", Utils.asListArgs("onDraw","onTouchEvent")); + ignoreParamMap.put("StateLayout", Utils.asListArgs("setGlobal","setListener","showType","setTag","setData","getData","setData","getView")); + ignoreParamMap.put("StateLayout.Listener", Utils.asListArgs("onRemove","onNotFound","onChange")); + ignoreParamMap.put("StateLayout.TypeAdapter", Utils.asListArgs("onCreateView","onBindView")); + ignoreParamMap.put("ViewAssist", Utils.asListArgs("setTag","setData","getData","setData","getAdapter","getView","setListener")); + ignoreParamMap.put("ViewAssist.Adapter", Utils.asListArgs("onCreateView","onBindView")); + ignoreParamMap.put("ViewAssist.Listener", Utils.asListArgs("onRemove","onNotFound","onChange")); + ignoreParamMap.put("WrapView", Utils.asListArgs("onMeasure","onLayout")); + + return ignoreParamMap; + } + + /** + * 获取忽略指定方法 @return 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnMap() { + Map> ignoreReturnMap = new HashMap(); + + return ignoreReturnMap; + } + + /** + * 获取忽略指定方法非 public 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreUnPublicMap() { + Map> ignoreUnPublicMap = new HashMap(); + ignoreUnPublicMap.put("AdjustHeightGridView", Utils.asListArgs("onMeasure")); + ignoreUnPublicMap.put("AdjustHeightListView", Utils.asListArgs("onMeasure")); + ignoreUnPublicMap.put("AdjustHeightRecyclerView", Utils.asListArgs("onMeasure")); + ignoreUnPublicMap.put("AdjustHeightWebView", Utils.asListArgs("onMeasure")); + ignoreUnPublicMap.put("CornerLabelView", Utils.asListArgs("initAttrs","onMeasure","onDraw","calcPath")); + ignoreUnPublicMap.put("CornerLabelView.Painter", Utils.asListArgs("init","draw")); + ignoreUnPublicMap.put("CustomGallery", Utils.asListArgs("initAttrs","onMeasure","isScrollingLeft")); + ignoreUnPublicMap.put("CustomHorizontalScrollView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen")); + ignoreUnPublicMap.put("CustomHorizontalScrollView.ScrollCallBack", Utils.asListArgs("onScrollChanged")); + ignoreUnPublicMap.put("CustomNestedScrollView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen")); + ignoreUnPublicMap.put("CustomNestedScrollView.ScrollCallBack", Utils.asListArgs("onScrollChanged")); + ignoreUnPublicMap.put("CustomRecyclerView", Utils.asListArgs("initAttrs","onMeasure")); + ignoreUnPublicMap.put("CustomRecyclerView.ScrollCallBack", Utils.asListArgs("onScrollStateChanged","onScrollChanged")); + ignoreUnPublicMap.put("CustomScrollView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged","computeScrollDeltaToGetChildRectOnScreen")); + ignoreUnPublicMap.put("CustomScrollView.ScrollCallBack", Utils.asListArgs("onScrollChanged")); + ignoreUnPublicMap.put("CustomViewPager", Utils.asListArgs("initAttrs","onMeasure")); + ignoreUnPublicMap.put("CustomWebView", Utils.asListArgs("initAttrs","onMeasure","onScrollChanged")); + ignoreUnPublicMap.put("CustomWebView.ScrollCallBack", Utils.asListArgs("onScrollChanged")); + ignoreUnPublicMap.put("FlowLikeView", Utils.asListArgs("initAttrs","onMeasure","onSizeChanged","generateCTRLPointF","generateCurveAnimation","generateEnterAnimation","startAnimation","resetLayoutParams")); + ignoreUnPublicMap.put("LimitLayout", Utils.asListArgs("initAttrs","onMeasure")); + ignoreUnPublicMap.put("LineTextView", Utils.asListArgs("onDraw")); + ignoreUnPublicMap.put("LineTextView.OnNewLineCallBack", Utils.asListArgs("onNewLine")); + ignoreUnPublicMap.put("LoadProgressBar", Utils.asListArgs("initAttrs","init","onDraw","drawProgressText","drawProgressText")); + ignoreUnPublicMap.put("RadiusAttrs", Utils.asListArgs("resetRadius")); + ignoreUnPublicMap.put("RadiusLayout", Utils.asListArgs("initAttrs","onSizeChanged","onSaveInstanceState","onRestoreInstanceState")); + ignoreUnPublicMap.put("RightIconEditText", Utils.asListArgs("finalize","init","drawOperate")); + ignoreUnPublicMap.put("ScanShapeView", Utils.asListArgs("init","handlerCornerPathEffect","onDraw","refPaintToAnnulus","sin","getRegionMarginLeft","getRegionMarginTop","calcShapeRegion","calcShapeRegion","makeShape","makeBackground","makeAnim","drawAnim","resetAnim","animSwitch","refLineColorToSquare","refLineColorToHexagon","refLineColorToAnnulus","initAnim")); + ignoreUnPublicMap.put("SignView", Utils.asListArgs("onDraw","_resetCanvas")); + ignoreUnPublicMap.put("StateLayout", Utils.asListArgs("init")); + ignoreUnPublicMap.put("StateLayout.Listener", Utils.asListArgs("onRemove","onNotFound","onChange")); + ignoreUnPublicMap.put("ViewAssist.Adapter", Utils.asListArgs("onCreateView","onBindView")); + ignoreUnPublicMap.put("ViewAssist.Listener", Utils.asListArgs("onRemove","onNotFound","onChange")); + ignoreUnPublicMap.put("WrapView", Utils.asListArgs("initAttrs","onMeasure","onLayout","calc")); + + return ignoreUnPublicMap; + } + + /** + * 获取忽略无修饰符变量处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreModifierVariableMap() { + Map> ignoreModifierVariableMap = new HashMap(); + + return ignoreModifierVariableMap; + } + + /** + * 获取忽略指定方法 return void 处理配置 + * @return 忽略配置 Map + */ + @Override + public Map> getIgnoreReturnVoidMap() { + Map> ignoreReturnVoidMap = new HashMap(); + ignoreReturnVoidMap.put("CornerLabelView", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("CornerLabelView.Painter", Utils.asListArgs("init - void","draw - void")); + ignoreReturnVoidMap.put("CustomGallery", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("CustomHorizontalScrollView", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("CustomHorizontalScrollView.ScrollCallBack", Utils.asListArgs("onScrollChanged - void")); + ignoreReturnVoidMap.put("CustomNestedScrollView", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("CustomNestedScrollView.ScrollCallBack", Utils.asListArgs("onScrollChanged - void")); + ignoreReturnVoidMap.put("CustomRecyclerView", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("CustomRecyclerView.ScrollCallBack", Utils.asListArgs("onScrollStateChanged - void","onScrollChanged - void")); + ignoreReturnVoidMap.put("CustomScrollView", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("CustomScrollView.ScrollCallBack", Utils.asListArgs("onScrollChanged - void")); + ignoreReturnVoidMap.put("CustomViewPager", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("CustomViewPager.OnDirectionListener", Utils.asListArgs("onSlideDirection - void")); + ignoreReturnVoidMap.put("CustomWebView", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("CustomWebView.ScrollCallBack", Utils.asListArgs("onScrollChanged - void")); + ignoreReturnVoidMap.put("FlowLikeView", Utils.asListArgs("initAttrs - void","startAnimation - void","resetLayoutParams - void","like - void")); + ignoreReturnVoidMap.put("LimitLayout", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("LineTextView.OnNewLineCallBack", Utils.asListArgs("onNewLine - void")); + ignoreReturnVoidMap.put("LoadProgressBar", Utils.asListArgs("initAttrs - void","drawProgressText - void","drawProgressText - void")); + ignoreReturnVoidMap.put("RadiusAttrs", Utils.asListArgs("resetRadius - void","onSizeChanged - void","setRadius - void","setRadiusLeftTop - void","setRadiusLeftBottom - void","setRadiusRightTop - void","setRadiusRightBottom - void","setRadiusLeft - void","setRadiusRight - void","setRadiusTop - void","setRadiusBottom - void")); + ignoreReturnVoidMap.put("RadiusLayout", Utils.asListArgs("initAttrs - void")); + ignoreReturnVoidMap.put("RightIconEditText", Utils.asListArgs("init - void","drawOperate - void")); + ignoreReturnVoidMap.put("ScanShapeView", Utils.asListArgs("init - void","handlerCornerPathEffect - void","destroy - void","refPaintToAnnulus - void","makeBackground - void","makeAnim - void","drawAnim - void","resetAnim - void","startAnim - void","stopAnim - void","animSwitch - void","refLineColorToSquare - void","refLineColorToHexagon - void","refLineColorToAnnulus - void","initAnim - void")); + ignoreReturnVoidMap.put("SignView", Utils.asListArgs("_resetCanvas - void")); + ignoreReturnVoidMap.put("StateLayout", Utils.asListArgs("init - void")); + ignoreReturnVoidMap.put("ViewAssist", Utils.asListArgs("showType - void")); + ignoreReturnVoidMap.put("WrapView", Utils.asListArgs("initAttrs - void","refreshDraw - void")); + + return ignoreReturnVoidMap; + } + + /** + * 忽略注释间距异常文件 + * @param map {@link HashMap} + */ + @Override + public void ignoreAnnotationSpaceMap(Map map) { + + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/dev_widget/DevWidgetMain.java b/src/main/java/javadoc/dev_utils/check/dev_widget/DevWidgetMain.java new file mode 100644 index 00000000..f736e094 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/dev_widget/DevWidgetMain.java @@ -0,0 +1,45 @@ +package javadoc.dev_utils.check.dev_widget; + +import dev.utils.common.ArrayUtils; +import dev.utils.common.ConvertUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.check.dev.CheckInfo; +import javadoc.dev_utils.check.dev.CheckMain; +import javadoc.dev_utils.check.dev.ICheckConfig; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +/** + * detail: 代码读取检测分析 Main 方法 + * @author Ttt + */ +public class DevWidgetMain { + + public static void main(String[] args) { + // 检测路径 + String path = ApiConfig.DEV_WIDGET_PATH; + // 代码检测分析配置接口 + ICheckConfig iCheckConfig = new DevWidgetConfig(); + // 是否覆盖文件内容 + boolean coverText = ConvertUtils.toBoolean(ArrayUtils.get(args, 0), true); + // 是否使用 List + boolean isLists = false; + // 检测指定文件集合 + List listFiles = new ArrayList(); + // 是否打印方法返回值 void 记录 + boolean isPrintVoid = false; + // 是否需要生成 Config + boolean generateConfig = ConvertUtils.toBoolean(ArrayUtils.get(args, 1)); + + // 执行检测 + CheckMain.execute(DevWidgetMain.class, new CheckInfo(path, iCheckConfig) + .setCoverText(coverText) + .setLists(isLists) + .setListFiles(listFiles) + .setPrintVoid(isPrintVoid) + .setGenerateConfig(generateConfig) + ); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/function/CodeEndNewLineRemove.java b/src/main/java/javadoc/dev_utils/check/function/CodeEndNewLineRemove.java new file mode 100644 index 00000000..e546284e --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/function/CodeEndNewLineRemove.java @@ -0,0 +1,70 @@ +package javadoc.dev_utils.check.function; + +import dev.utils.common.FileUtils; +import dev.utils.common.StringUtils; +import dev.utils.common.assist.search.FileDepthFirstSearchUtils; +import javadoc.dev_utils.ApiConfig; + +import java.io.File; +import java.util.LinkedHashSet; +import java.util.List; + +/** + * detail: 代码结尾换行移除 + * @author Ttt + */ +public final class CodeEndNewLineRemove { + + private static LinkedHashSet sSets = new LinkedHashSet(); + // 结尾符合 + private static final String SYMBOL = ""; // } + // 检查 Key + private static final String END_KEY = SYMBOL + StringUtils.NEW_LINE_STR; + // 追加内容 + private static final String APPEND = SYMBOL; + // 忽略文件后缀 + private static final String[] IGNORE_SUFFIX = {"md", "txt", "bat"}; + // 是否忽略后缀 + private static final boolean IS_IGNORE_SUFFIX = false; + + public static void main(String[] args) { + new FileDepthFirstSearchUtils() + .setSearchHandler(new FileDepthFirstSearchUtils.SearchHandler() { + @Override + public boolean isHandlerFile(File file) { + return true; + } + + @Override + public boolean isAddToList(File file) { + if (file.getAbsolutePath().indexOf("\\.") != -1) return false; + + String fileSuffix = FileUtils.getFileSuffix(file); + if (!IS_IGNORE_SUFFIX && StringUtils.isOrEquals(fileSuffix, IGNORE_SUFFIX)) { + return true; + } + + String data = new String(FileUtils.readFileBytes(file)); + if (data != null) { + if (data.endsWith(END_KEY)) { + // 删减内容 + data = data.substring(0, data.length() - END_KEY.length()) + APPEND; + // 替换内容 + FileUtils.saveFile(file.getAbsolutePath(), data.getBytes()); + // 存储路径 + sSets.add(FileUtils.getAbsolutePath(file)); + } + } + return true; + } + + @Override + public void OnEndListener(List lists, long startTime, long endTime) { + for (String path : sSets) { + System.out.println(path); + } + System.out.println("搜索结束"); + } + }).query(ApiConfig.PROJECT_PATH, true); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/function/CodeRepeatNewLineRemove.java b/src/main/java/javadoc/dev_utils/check/function/CodeRepeatNewLineRemove.java new file mode 100644 index 00000000..efe0be72 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/function/CodeRepeatNewLineRemove.java @@ -0,0 +1,78 @@ +package javadoc.dev_utils.check.function; + +import dev.utils.common.FileIOUtils; +import dev.utils.common.FileUtils; +import dev.utils.common.StringUtils; +import javadoc.Utils; +import javadoc.dev_utils.ApiConfig; + +import java.io.File; +import java.io.FileFilter; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 代码重复换行检测 + * @author Ttt + */ +public final class CodeRepeatNewLineRemove { + + // 代码注释重复换行记录 + private static HashMap> sAnnotationRepeatLineMap = new HashMap(); + + // 忽略文件后缀 + private static final String[] SUFFIX = {"kt", "xml", "java", "gradle",}; + + public static void main(String[] args) { + // 获取文件列表 + List lists = FileUtils.listFilesInDirWithFilter(ApiConfig.PROJECT_PATH, new FileFilter() { + @Override + public boolean accept(File file) { + if (file.getAbsolutePath().indexOf("\\.") != -1) return false; + if (file.getAbsolutePath().indexOf("\\build\\") != -1) return false; + if (file.isDirectory()) return false; + + String fileSuffix = FileUtils.getFileSuffix(file); + if (!StringUtils.isOrEquals(fileSuffix, SUFFIX)) return false; + return true; + } + }, true); + + for (File file : lists) { + readFile(file); + } + + String json = Utils.toJsonFormat(sAnnotationRepeatLineMap, true); + // 打印文件多余换行信息 + System.out.println(json); + } + + /** + * 读取文件 + * @param file 文件 + */ + private static void readFile(final File file) { + // 读取文件内容 + List lists = FileIOUtils.readFileToList(file, 0, Integer.MAX_VALUE); + + // 判断是否需要判断 重复出现情况 + boolean repeat = false; + // 循环判断 + for (int i = 0, len = lists.size(); i < len; i++) { + // 获取每一行代码 + String code = lists.get(i); + // 判断是否 null + boolean isSpace = StringUtils.isSpace(code); + // 防止为 null + if (!isSpace) { + repeat = false; // 不需要判断重复 + } else { + if (code != null && repeat) { + Utils.putToList(sAnnotationRepeatLineMap, file.getName(), (i + 1) + ""); + } + // 表示需要检测重复 + repeat = true; + } + } + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/check/function/CodeXmlEncoding.java b/src/main/java/javadoc/dev_utils/check/function/CodeXmlEncoding.java new file mode 100644 index 00000000..e1e4ba94 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/check/function/CodeXmlEncoding.java @@ -0,0 +1,66 @@ +package javadoc.dev_utils.check.function; + +import dev.utils.common.FileUtils; +import dev.utils.common.StringUtils; +import dev.utils.common.assist.search.FileDepthFirstSearchUtils; +import javadoc.dev_utils.ApiConfig; + +import java.io.File; +import java.util.LinkedHashSet; +import java.util.List; + +/** + * detail: Xml Encoding 追加处理 + * @author Ttt + */ +public final class CodeXmlEncoding { + + private static LinkedHashSet sSets = new LinkedHashSet(); + // 开头 + private static final String STARTS_WITH = ""; + // 追加内容 + private static final String APPEND = STARTS_WITH + StringUtils.NEW_LINE_STR; + // 文件后缀 + private static final String[] SUFFIX = {"xml"}; + + public static void main(String[] args) { + new FileDepthFirstSearchUtils() + .setSearchHandler(new FileDepthFirstSearchUtils.SearchHandler() { + @Override + public boolean isHandlerFile(File file) { + return true; + } + + @Override + public boolean isAddToList(File file) { + if (file.getAbsolutePath().indexOf("\\.") != -1) return false; + + String fileSuffix = FileUtils.getFileSuffix(file); + if (!StringUtils.isOrEquals(fileSuffix, SUFFIX)) { + return true; + } + + String data = new String(FileUtils.readFileBytes(file)); + if (data != null) { + if (!data.startsWith(STARTS_WITH)) { + // 删减内容 + data = APPEND + data; + // 替换内容 + FileUtils.saveFile(file.getAbsolutePath(), data.getBytes()); + // 存储路径 + sSets.add(FileUtils.getAbsolutePath(file)); + } + } + return true; + } + + @Override + public void OnEndListener(List lists, long startTime, long endTime) { + for (String path : sSets) { + System.out.println(path); + } + System.out.println("搜索结束"); + } + }).query(ApiConfig.PROJECT_PATH, true); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/readme/DevApp_READMEMain.java b/src/main/java/javadoc/dev_utils/readme/DevApp_READMEMain.java new file mode 100644 index 00000000..033d3cdf --- /dev/null +++ b/src/main/java/javadoc/dev_utils/readme/DevApp_READMEMain.java @@ -0,0 +1,213 @@ +package javadoc.dev_utils.readme; + +import dev.utils.common.FileUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.assist.APIGenerate; +import javadoc.dev_utils.assist.PackageCatalog; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 创建 README Main 方法 + * @author Ttt + */ +final class DevApp_READMEMain { + + private DevApp_READMEMain() { + } + + /** + * 创建 DevUtils - README 头部前缀 + * @param buffer 拼接 Buffer + * @param path 文件路径 + * @param packageName 包名 + * @param mapCatalog 对应目录的注释 + */ + private static void createREADMEHead(final StringBuffer buffer, final String path, final String packageName, + final HashMap mapCatalog) { + buffer.append("\n"); + buffer.append("## Gradle"); + + buffer.append("\n\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("// Android ( 1.9.4 以后只更新 AndroidX )"); + buffer.append("\n"); + buffer.append("//implementation 'com.afkt:DevApp:1.9.4'"); + buffer.append("\n\n"); + buffer.append("// AndroidX"); + buffer.append("\n"); + buffer.append("implementation 'com.afkt:DevAppX:" + ApiConfig.DEV_APP_VERSION + "'"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("## 目录结构"); + + buffer.append("\n\n"); + // 不增加锚链接 -> 一级目录 + buffer.append(PackageCatalog.apiCatalog(false, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + buffer.append("## 使用"); + + buffer.append("\n\n"); + buffer.append("> ##### ~~只需要在 Application 中调用 `DevUtils.init()` 进行初始化~~ , 在 DevUtils FileProviderDevApp 中已初始化 , 无需主动调用"); + + buffer.append("\n\n"); + buffer.append("## 事项"); + + buffer.append("\n\n"); + buffer.append("- 内部存在两个日志工具类 ( 工具类内部调用 ),对外使用 [DevLogger](https://github.com/afkT/DevUtils/blob/master/lib/DevApp/utils_readme/logger/DevLogger.md)"); + + buffer.append("\n\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("// 整个工具类内部日志信息,都通过以下两个工具类输出打印,并且通过 DevUtils.openLog() 控制开关"); + buffer.append("\n"); + buffer.append("\n"); + buffer.append("// dev.utils.app - APP 日志打印工具类"); + buffer.append("\n"); + buffer.append("LogPrintUtils"); + buffer.append("\n"); + buffer.append("// dev.utils.common - Java Common 日志打印工具类"); + buffer.append("\n"); + buffer.append("JCLogUtils"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("- 开启日志"); + buffer.append("\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("// 打开 lib 内部日志 - 线上 (release) 环境,不调用方法"); + buffer.append("\n"); + buffer.append("DevUtils.openLog();"); + buffer.append("\n"); + buffer.append("// 标示 debug 模式"); + buffer.append("\n"); + buffer.append("DevUtils.openDebug();"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("- 如果出现 ```Failed to resolve: DevAppX-x.x.x``` 可在根目录 build.gradle 添加"); + buffer.append("\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("allprojects {"); + buffer.append("\n"); + buffer.append(" repositories {"); + buffer.append("\n"); + buffer.append(" // bintray maven 出现 Failed to resolve: DevAppX-x.x.x 可考虑加上这句"); + buffer.append("\n"); + buffer.append(" maven { url 'https://dl.bintray.com/afkt/maven' }"); + buffer.append("\n"); + buffer.append(" }"); + buffer.append("\n"); + buffer.append("}"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("- 工具类部分模块配置与使用 - [Use and Config](https://github.com/afkT/DevUtils/blob/master/lib/DevApp/utils_readme/USE_CONFIG.md)"); + + buffer.append("\n\n"); + buffer.append("- 部分 API 更新不及时或有遗漏等,`具体以对应的工具类为准`"); + + buffer.append("\n\n"); + buffer.append("- [检测代码规范、注释内容排版,API 文档生成](https://github.com/afkT/JavaDoc)"); + + buffer.append("\n\n"); + buffer.append("- [Change Log](https://github.com/afkT/DevUtils/blob/master/lib/DevApp/CHANGELOG.md)"); + + buffer.append("\n\n"); + buffer.append("- [View 链式调用快捷设置 Helper 类](https://github.com/afkT/DevUtils/blob/master/lib/DevApp/src/main/java/dev/utils/app/helper/ViewHelper.java)"); + + buffer.append("\n\n"); + buffer.append("- [Dev 工具类链式调用 Helper 类](https://github.com/afkT/DevUtils/blob/master/lib/DevApp/src/main/java/dev/utils/app/helper/DevHelper.java)"); + + buffer.append("\n\n"); + buffer.append("## API"); + + buffer.append("\n\n"); + // 增加锚链接 -> 二级目录 + buffer.append(PackageCatalog.apiCatalog(true, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + } + + /** + * 创建 REAMDE 文件 + * @return Create Result + */ + public static String createREADME() { + // 包名 + final String packageName = ApiConfig.DEV_PACKAGE; + // 本地文件路径 + final String path = ApiConfig.DEV_APP_UTILS_PATH; + // Github 链接地址 + final String githubUrl = ApiConfig.DEV_APP_GITHUB_URL; + + // 方法名匹配存储 Map<类名, List<方法名>> + final HashMap> methodNameMatchesMap = new HashMap(); + // 方法名重复记录存储 + final StringBuffer methodRepeatBuffer = new StringBuffer(); + // 方法没有注释记录存储 + final StringBuffer methodNotAnnotateBuffer = new StringBuffer(); + // 类不存在方法记录存储 + final StringBuffer notMethodBuffer = new StringBuffer(); + + // =========== + // = 生成 API = + // =========== + + // 最终的数据 + StringBuffer buffer = new StringBuffer(); + // 添加头部信息 + createREADMEHead(buffer, path, packageName, ApiConfig.sCatalogMap); + + // 生成 dev.utils.app 包下 dev.utils + String appAPI = APIGenerate.apiGenerate("app", path, packageName, githubUrl, + ApiConfig.sFilterClassMap, ApiConfig.sFilterMethodMap, ApiConfig.sMethodNameRegex, + methodNameMatchesMap, methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + + // 生成 dev.utils.common 包下 dev.utils + String commonAPI = APIGenerate.apiGenerate("common", path, packageName, githubUrl, + ApiConfig.sFilterClassMap, ApiConfig.sFilterMethodMap, ApiConfig.sMethodNameRegex, + methodNameMatchesMap, methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + + buffer.append(appAPI); + buffer.append("\n\n"); + buffer.append(commonAPI); + + // 保存合成后的 API REAMDE + FileUtils.saveFile(new File(ApiConfig.DEV_APP_API_FILE_SAVE_PATH, ApiConfig.README_FILE_NAME).getAbsolutePath(), + buffer.toString().getBytes()); + +// // 方法名重复记录存储 +// Utils.saveFile(ApiConfig.DEV_APP_API_FILE_SAVE_PATH, "readme_method_repeat_api.md", methodRepeatBuffer.toString()); +// // 方法没有注释记录存储 +// Utils.saveFile(ApiConfig.DEV_APP_API_FILE_SAVE_PATH, "readme_method_not_annotate_api.md", methodNotAnnotateBuffer.toString()); +// // 类不存在方法记录存储 +// Utils.saveFile(ApiConfig.DEV_APP_API_FILE_SAVE_PATH, "readme_not_method_api.md", notMethodBuffer.toString()); + + StringBuffer resultBuffer = new StringBuffer(); + resultBuffer.append("\n\n"); + resultBuffer.append("\n====================="); + resultBuffer.append("\n= 保存 JavaDoc 成功 ="); + resultBuffer.append("\n====================="); + resultBuffer.append("\n"); + resultBuffer.append("\n"); + resultBuffer.append("保存地址: " + ApiConfig.DEV_APP_API_FILE_SAVE_PATH + ApiConfig.README_FILE_NAME); + resultBuffer.append("\n"); + return resultBuffer.toString(); + } + + public static void main(String[] args) { + System.out.println(DevApp_READMEMain.createREADME()); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/readme/DevAssist_READMEMain.java b/src/main/java/javadoc/dev_utils/readme/DevAssist_READMEMain.java new file mode 100644 index 00000000..c426936b --- /dev/null +++ b/src/main/java/javadoc/dev_utils/readme/DevAssist_READMEMain.java @@ -0,0 +1,129 @@ +package javadoc.dev_utils.readme; + +import dev.utils.common.FileUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.assist.APIGenerate; +import javadoc.dev_utils.assist.PackageCatalog; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 创建 README Main 方法 + * @author Ttt + */ +final class DevAssist_READMEMain { + + private DevAssist_READMEMain() { + } + + /** + * 创建 DevUtils - README 头部前缀 + * @param buffer 拼接 Buffer + * @param path 文件路径 + * @param packageName 包名 + * @param mapCatalog 对应目录的注释 + */ + private static void createREADMEHead(final StringBuffer buffer, final String path, final String packageName, + final HashMap mapCatalog) { + buffer.append("\n"); + buffer.append("## Gradle"); + + buffer.append("\n\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("implementation 'com.afkt:DevAssist:" + ApiConfig.DEV_ASSIST_VERSION + "'"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("## 目录结构"); + + buffer.append("\n\n"); + // 不增加锚链接 -> 一级目录 + buffer.append(PackageCatalog.apiCatalog(false, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + buffer.append("## 事项"); + + buffer.append("\n\n"); + buffer.append("- 部分 API 更新不及时或有遗漏等,`具体以对应的工具类为准`"); + + buffer.append("\n\n"); + buffer.append("- [检测代码规范、注释内容排版,API 文档生成](https://github.com/afkT/JavaDoc)"); + + buffer.append("\n\n"); + buffer.append("## API"); + + buffer.append("\n\n"); + // 增加锚链接 -> 二级目录 + buffer.append(PackageCatalog.apiCatalog(true, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + } + + /** + * 创建 REAMDE 文件 + * @return Create Result + */ + public static String createREADME() { + // 包名 + final String packageName = ApiConfig.DEV_ASSIST_PACKAGE; + // 本地文件路径 + final String path = ApiConfig.DEV_ASSIST_PATH; + // Github 链接地址 + final String githubUrl = ApiConfig.DEV_ASSIST_GITHUB_URL; + + // 方法名匹配存储 Map<类名, List<方法名>> + final HashMap> methodNameMatchesMap = new HashMap(); + // 方法名重复记录存储 + final StringBuffer methodRepeatBuffer = new StringBuffer(); + // 方法没有注释记录存储 + final StringBuffer methodNotAnnotateBuffer = new StringBuffer(); + // 类不存在方法记录存储 + final StringBuffer notMethodBuffer = new StringBuffer(); + + // =========== + // = 生成 API = + // =========== + + // 最终的数据 + StringBuffer buffer = new StringBuffer(); + // 添加头部信息 + createREADMEHead(buffer, path, packageName, ApiConfig.sCatalogMap_Assist); + + // 生成 dev 包下 + String assistAPI = APIGenerate.apiGenerate("", path, packageName, githubUrl, + ApiConfig.sFilterClassMap_Assist, ApiConfig.sFilterMethodMap_Assist, ApiConfig.sMethodNameRegex, + methodNameMatchesMap, methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + + buffer.append(assistAPI); + + // 保存合成后的 API REAMDE + FileUtils.saveFile(new File(ApiConfig.DEV_ASSIST_API_FILE_SAVE_PATH, ApiConfig.README_FILE_NAME).getAbsolutePath(), + buffer.toString().getBytes()); + +// // 方法名重复记录存储 +// Utils.saveFile(ApiConfig.DEV_ASSIST_API_FILE_SAVE_PATH, "readme_method_repeat_api.md", methodRepeatBuffer.toString()); +// // 方法没有注释记录存储 +// Utils.saveFile(ApiConfig.DEV_ASSIST_API_FILE_SAVE_PATH, "readme_method_not_annotate_api.md", methodNotAnnotateBuffer.toString()); +// // 类不存在方法记录存储 +// Utils.saveFile(ApiConfig.DEV_ASSIST_API_FILE_SAVE_PATH, "readme_not_method_api.md", notMethodBuffer.toString()); + + StringBuffer resultBuffer = new StringBuffer(); + resultBuffer.append("\n\n"); + resultBuffer.append("\n====================="); + resultBuffer.append("\n= 保存 JavaDoc 成功 ="); + resultBuffer.append("\n====================="); + resultBuffer.append("\n"); + resultBuffer.append("\n"); + resultBuffer.append("保存地址: " + ApiConfig.DEV_ASSIST_API_FILE_SAVE_PATH + ApiConfig.README_FILE_NAME); + resultBuffer.append("\n"); + return resultBuffer.toString(); + } + + public static void main(String[] args) { + System.out.println(DevAssist_READMEMain.createREADME()); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/readme/DevBaseMVVM_READMEMain.java b/src/main/java/javadoc/dev_utils/readme/DevBaseMVVM_READMEMain.java new file mode 100644 index 00000000..51e1ca60 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/readme/DevBaseMVVM_READMEMain.java @@ -0,0 +1,161 @@ +package javadoc.dev_utils.readme; + +import dev.utils.common.FileUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.assist.PackageCatalog; + +import java.io.File; +import java.util.HashMap; + +/** + * detail: 创建 README Main 方法 + * @author Ttt + */ +final class DevBaseMVVM_READMEMain { + + private DevBaseMVVM_READMEMain() { + } + + /** + * 创建 DevUtils - README 头部前缀 + * @param buffer 拼接 Buffer + * @param path 文件路径 + * @param packageName 包名 + * @param mapCatalog 对应目录的注释 + * @param githubUrl 项目 github 链接 + */ + private static void createREADMEHead(final StringBuffer buffer, final String path, final String packageName, + final HashMap mapCatalog, final String githubUrl) { + buffer.append("\n"); + buffer.append("## Gradle"); + + buffer.append("\n\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("implementation 'com.afkt:DevBase:" + ApiConfig.DEV_BASE_MVVM_VERSION + "'"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("## 目录结构"); + + buffer.append("\n\n"); + // 不增加锚链接 -> 一级目录 + buffer.append(PackageCatalog.apiCatalog(false, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + buffer.append("## 项目类结构 - [包目录](" + githubUrl + ")"); + buffer.append("\n\n"); + buffer.append("### 核心代码"); + buffer.append("\n\n"); + buffer.append("* 核心 Base Activity([activity](" + githubUrl + "/activity)):整个库 Activity 基类都基于该模块代码"); + buffer.append("\n\n"); + buffer.append("* 核心 Base Fragment([fragment](" + githubUrl + "/fragment)):整个库 Fragment 基类都基于该模块代码"); + buffer.append("\n\n"); + buffer.append("### 其他代码"); + buffer.append("\n\n"); + buffer.append("* 接口相关([able](" + githubUrl + "/able)):对外提供开放方法接口,用于基类可选配置及获取操作"); + buffer.append("\n\n"); + buffer.append("* 库依赖工具包([utils、assist](" + githubUrl + "/utils)):抽取通用代码工具类、封装相同逻辑代码辅助类"); + buffer.append("\n\n"); + buffer.append("### 基于 Base Activity、Fragment 扩展包([expand](" + githubUrl + "/expand))"); + buffer.append("\n\n"); + buffer.append("* Content Layout 基类([content](" + githubUrl + "/expand/content)):通过内置 Layout 作为根布局,方便对全局进行增删 View 控制处理"); + buffer.append("\n\n"); + buffer.append("* MVP 架构基类([mvp](" + githubUrl + "/expand/mvp)):MVP Contract Lifecycle 架构基类"); + buffer.append("\n\n"); + buffer.append("* ViewBinding 基类([viewbinding](" + githubUrl + "/expand/viewbinding)):使用 ViewBinding 实现对 View 进行 bind 基类"); + + buffer.append("\n\n"); + buffer.append("## 设计思路"); + buffer.append("\n\n"); + buffer.append("首先整个库 Activity、Fragment 最终实现都是继承"); + buffer.append(" [AbstractDevBaseActivity](" + githubUrl + "/activity/AbstractDevBaseActivity.kt)、"); + buffer.append("[AbstractDevBaseFragment](" + githubUrl + "/fragment/AbstractDevBaseFragment.kt)"); + buffer.append(" 方便对核心代码设计理解及管理控制,并在此基础上实现三个扩展基类 MVP、ViewBinding、Content Layout"); + buffer.append("\n\n"); + buffer.append("* **ViewBinding 基类**"); + buffer.append("\n\n"); + buffer.append("> 使用 ViewBinding 代替频繁 findViewById,或替换"); + buffer.append(" [Butter Knife](https://github.com/JakeWharton/butterknife)"); + buffer.append("\n"); + buffer.append(">"); + buffer.append("\n"); + buffer.append("> **Butter Knife Attention**: This tool is now deprecated. Please switch to"); + buffer.append(" [view binding](https://developer.android.com/topic/libraries/view-binding)"); + buffer.append("\n\n"); + buffer.append("* **MVP 架构基类**"); + buffer.append("\n\n"); + buffer.append("> 使用 MVP Contract 来进行管理,优化代码结构并使用"); + buffer.append(" [Lifecycle](https://developer.android.com/topic/libraries/architecture/lifecycle)"); + buffer.append(" 解决 MVP 内存泄漏问题"); + buffer.append("\n\n"); + buffer.append("* **Content Layout 基类**"); + buffer.append("\n\n"); + buffer.append("> **核心实现:内置 R.layout.base_content_view 作为 contentView 根布局进行显示**"); + buffer.append("\n"); + buffer.append(">"); + buffer.append("\n"); + buffer.append("> 并进行动态添加 title、body 等布局 View,以达到能够对全局进行 View 增删显隐控制处理"); + buffer.append(",以及后续需求迭代、维护全局操作"); + buffer.append("\n\n"); + buffer.append("各个拓展基类都有实现 MVP、ViewBinding 组合功能,如:"); + buffer.append("`MVPViewBinding`、`ContentMVP`、`ContentViewBinding`、`ContentMVPViewBinding` 组合基类"); + + buffer.append("\n\n"); + buffer.append("## 其他"); + buffer.append("\n\n"); + buffer.append("* 为什么没添加 MVVM 架构基类"); + buffer.append("\n\n"); + buffer.append("> 因 MVVM 需要依赖较多库,可能部分项目并不使用 MVVM 作为基础架构,为此新增"); + buffer.append(" [DevBaseMVVM](https://github.com/afkT/DevUtils/blob/master/lib/DevBaseMVVM/README.md)"); + buffer.append(" 库进行区分,减少库依赖数量,以及 MVVM 架构代码实现设计理解"); + buffer.append("\n\n"); + buffer.append("架构只是一种思维方式,不管是 MVC、MVP 还是 MVVM,都只是一种思考问题、解决问题的思维"); + buffer.append("\n\n"); + buffer.append("其目的是要解决编程过程中,模块内部高内聚、模块与模块之间低耦合、可维护性、易测试等问题"); + + buffer.append("\n\n"); + } + + /** + * 创建 REAMDE 文件 + * @return Create Result + */ + public static String createREADME() { + // 包名 + final String packageName = ApiConfig.DEV_BASE_MVVM_PACKAGE; + // 本地文件路径 + final String path = ApiConfig.DEV_BASE_MVVM_PATH; + // Github 链接地址 + final String githubUrl = ApiConfig.DEV_BASE_MVVM_GITHUB_URL; + + // =========== + // = 生成 API = + // =========== + + // 最终的数据 + StringBuffer buffer = new StringBuffer(); + // 添加头部信息 + createREADMEHead(buffer, path, packageName, ApiConfig.sCatalogMap_Base, githubUrl); + + // 保存合成后的 API REAMDE + FileUtils.saveFile(new File(ApiConfig.DEV_BASE_MVVM_API_FILE_SAVE_PATH, ApiConfig.README_FILE_NAME).getAbsolutePath(), + buffer.toString().getBytes()); + + StringBuffer resultBuffer = new StringBuffer(); + resultBuffer.append("\n\n"); + resultBuffer.append("\n====================="); + resultBuffer.append("\n= 保存 JavaDoc 成功 ="); + resultBuffer.append("\n====================="); + resultBuffer.append("\n"); + resultBuffer.append("\n"); + resultBuffer.append("保存地址: " + ApiConfig.DEV_BASE_MVVM_API_FILE_SAVE_PATH + ApiConfig.README_FILE_NAME); + resultBuffer.append("\n"); + return resultBuffer.toString(); + } + + public static void main(String[] args) { + System.out.println(DevBaseMVVM_READMEMain.createREADME()); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/readme/DevBase_READMEMain.java b/src/main/java/javadoc/dev_utils/readme/DevBase_READMEMain.java new file mode 100644 index 00000000..1ab3d505 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/readme/DevBase_READMEMain.java @@ -0,0 +1,161 @@ +package javadoc.dev_utils.readme; + +import dev.utils.common.FileUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.assist.PackageCatalog; + +import java.io.File; +import java.util.HashMap; + +/** + * detail: 创建 README Main 方法 + * @author Ttt + */ +final class DevBase_READMEMain { + + private DevBase_READMEMain() { + } + + /** + * 创建 DevUtils - README 头部前缀 + * @param buffer 拼接 Buffer + * @param path 文件路径 + * @param packageName 包名 + * @param mapCatalog 对应目录的注释 + * @param githubUrl 项目 github 链接 + */ + private static void createREADMEHead(final StringBuffer buffer, final String path, final String packageName, + final HashMap mapCatalog, final String githubUrl) { + buffer.append("\n"); + buffer.append("## Gradle"); + + buffer.append("\n\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("implementation 'com.afkt:DevBase:" + ApiConfig.DEV_BASE_VERSION + "'"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("## 目录结构"); + + buffer.append("\n\n"); + // 不增加锚链接 -> 一级目录 + buffer.append(PackageCatalog.apiCatalog(false, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + buffer.append("## 项目类结构 - [包目录](" + githubUrl + ")"); + buffer.append("\n\n"); + buffer.append("### 核心代码"); + buffer.append("\n\n"); + buffer.append("* 核心 Base Activity([activity](" + githubUrl + "/activity)):整个库 Activity 基类都基于该模块代码"); + buffer.append("\n\n"); + buffer.append("* 核心 Base Fragment([fragment](" + githubUrl + "/fragment)):整个库 Fragment 基类都基于该模块代码"); + buffer.append("\n\n"); + buffer.append("### 其他代码"); + buffer.append("\n\n"); + buffer.append("* 接口相关([able](" + githubUrl + "/able)):对外提供开放方法接口,用于基类可选配置及获取操作"); + buffer.append("\n\n"); + buffer.append("* 库依赖工具包([utils、assist](" + githubUrl + "/utils)):抽取通用代码工具类、封装相同逻辑代码辅助类"); + buffer.append("\n\n"); + buffer.append("### 基于 Base Activity、Fragment 扩展包([expand](" + githubUrl + "/expand))"); + buffer.append("\n\n"); + buffer.append("* Content Layout 基类([content](" + githubUrl + "/expand/content)):通过内置 Layout 作为根布局,方便对全局进行增删 View 控制处理"); + buffer.append("\n\n"); + buffer.append("* MVP 架构基类([mvp](" + githubUrl + "/expand/mvp)):MVP Contract Lifecycle 架构基类"); + buffer.append("\n\n"); + buffer.append("* ViewBinding 基类([viewbinding](" + githubUrl + "/expand/viewbinding)):使用 ViewBinding 实现对 View 进行 bind 基类"); + + buffer.append("\n\n"); + buffer.append("## 设计思路"); + buffer.append("\n\n"); + buffer.append("首先整个库 Activity、Fragment 最终实现都是继承"); + buffer.append(" [AbstractDevBaseActivity](" + githubUrl + "/activity/AbstractDevBaseActivity.kt)、"); + buffer.append("[AbstractDevBaseFragment](" + githubUrl + "/fragment/AbstractDevBaseFragment.kt)"); + buffer.append(" 方便对核心代码设计理解及管理控制,并在此基础上实现三个扩展基类 MVP、ViewBinding、Content Layout"); + buffer.append("\n\n"); + buffer.append("* **ViewBinding 基类**"); + buffer.append("\n\n"); + buffer.append("> 使用 ViewBinding 代替频繁 findViewById,或替换"); + buffer.append(" [Butter Knife](https://github.com/JakeWharton/butterknife)"); + buffer.append("\n"); + buffer.append(">"); + buffer.append("\n"); + buffer.append("> **Butter Knife Attention**: This tool is now deprecated. Please switch to"); + buffer.append(" [view binding](https://developer.android.com/topic/libraries/view-binding)"); + buffer.append("\n\n"); + buffer.append("* **MVP 架构基类**"); + buffer.append("\n\n"); + buffer.append("> 使用 MVP Contract 来进行管理,优化代码结构并使用"); + buffer.append(" [Lifecycle](https://developer.android.com/topic/libraries/architecture/lifecycle)"); + buffer.append(" 解决 MVP 内存泄漏问题"); + buffer.append("\n\n"); + buffer.append("* **Content Layout 基类**"); + buffer.append("\n\n"); + buffer.append("> **核心实现:内置 R.layout.base_content_view 作为 contentView 根布局进行显示**"); + buffer.append("\n"); + buffer.append(">"); + buffer.append("\n"); + buffer.append("> 并进行动态添加 title、body 等布局 View,以达到能够对全局进行 View 增删显隐控制处理"); + buffer.append(",以及后续需求迭代、维护全局操作"); + buffer.append("\n\n"); + buffer.append("各个拓展基类都有实现 MVP、ViewBinding 组合功能,如:"); + buffer.append("`MVPViewBinding`、`ContentMVP`、`ContentViewBinding`、`ContentMVPViewBinding` 组合基类"); + + buffer.append("\n\n"); + buffer.append("## 其他"); + buffer.append("\n\n"); + buffer.append("* 为什么没添加 MVVM 架构基类"); + buffer.append("\n\n"); + buffer.append("> 因 MVVM 需要依赖较多库,可能部分项目并不使用 MVVM 作为基础架构,为此新增"); + buffer.append(" [DevBaseMVVM](https://github.com/afkT/DevUtils/blob/master/lib/DevBaseMVVM/README.md)"); + buffer.append(" 库进行区分,减少库依赖数量,以及 MVVM 架构代码实现设计理解"); + buffer.append("\n\n"); + buffer.append("架构只是一种思维方式,不管是 MVC、MVP 还是 MVVM,都只是一种思考问题、解决问题的思维"); + buffer.append("\n\n"); + buffer.append("其目的是要解决编程过程中,模块内部高内聚、模块与模块之间低耦合、可维护性、易测试等问题"); + + buffer.append("\n\n"); + } + + /** + * 创建 REAMDE 文件 + * @return Create Result + */ + public static String createREADME() { + // 包名 + final String packageName = ApiConfig.DEV_BASE_PACKAGE; + // 本地文件路径 + final String path = ApiConfig.DEV_BASE_PATH; + // Github 链接地址 + final String githubUrl = ApiConfig.DEV_BASE_GITHUB_URL; + + // =========== + // = 生成 API = + // =========== + + // 最终的数据 + StringBuffer buffer = new StringBuffer(); + // 添加头部信息 + createREADMEHead(buffer, path, packageName, ApiConfig.sCatalogMap_Base, githubUrl); + + // 保存合成后的 API REAMDE + FileUtils.saveFile(new File(ApiConfig.DEV_BASE_API_FILE_SAVE_PATH, ApiConfig.README_FILE_NAME).getAbsolutePath(), + buffer.toString().getBytes()); + + StringBuffer resultBuffer = new StringBuffer(); + resultBuffer.append("\n\n"); + resultBuffer.append("\n====================="); + resultBuffer.append("\n= 保存 JavaDoc 成功 ="); + resultBuffer.append("\n====================="); + resultBuffer.append("\n"); + resultBuffer.append("\n"); + resultBuffer.append("保存地址: " + ApiConfig.DEV_BASE_API_FILE_SAVE_PATH + ApiConfig.README_FILE_NAME); + resultBuffer.append("\n"); + return resultBuffer.toString(); + } + + public static void main(String[] args) { + System.out.println(DevBase_READMEMain.createREADME()); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/readme/DevJava_READMEMain.java b/src/main/java/javadoc/dev_utils/readme/DevJava_READMEMain.java new file mode 100644 index 00000000..62279adf --- /dev/null +++ b/src/main/java/javadoc/dev_utils/readme/DevJava_READMEMain.java @@ -0,0 +1,151 @@ +package javadoc.dev_utils.readme; + +import dev.utils.common.FileUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.assist.APIGenerate; +import javadoc.dev_utils.assist.PackageCatalog; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 创建 README Main 方法 + * @author Ttt + */ +final class DevJava_READMEMain { + + private DevJava_READMEMain() { + } + + /** + * 创建 DevUtils - README 头部前缀 + * @param buffer 拼接 Buffer + * @param path 文件路径 + * @param packageName 包名 + * @param mapCatalog 对应目录的注释 + */ + private static void createREADMEHead(final StringBuffer buffer, final String path, final String packageName, + final HashMap mapCatalog) { + buffer.append("\n"); + buffer.append("## Gradle"); + + buffer.append("\n\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("implementation 'com.afkt:DevJava:" + ApiConfig.DEV_JAVA_VERSION + "'"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("## 目录结构"); + + buffer.append("\n\n"); + // 不增加锚链接 -> 一级目录 + buffer.append(PackageCatalog.apiCatalog(false, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + buffer.append("## 事项"); + + buffer.append("\n\n"); + buffer.append("- 该工具类不依赖 android api,属于 Java 工具类库"); + + buffer.append("\n\n"); + buffer.append("- 开启日志"); + buffer.append("\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("// 打开 lib 内部日志 - 线上 (release) 环境,不调用方法"); + buffer.append("\n"); + buffer.append("JCLogUtils.setPrintLog(true);"); + buffer.append("\n"); + buffer.append("// 控制台打印日志"); + buffer.append("\n"); + buffer.append("JCLogUtils.setControlPrintLog(true);"); + buffer.append("\n"); + buffer.append("// 设置 Java 模块日志信息监听"); + buffer.append("\n"); + buffer.append("JCLogUtils.setPrint(new JCLogUtils.Print() {});"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("- 部分 API 更新不及时或有遗漏等,`具体以对应的工具类为准`"); + + buffer.append("\n\n"); + buffer.append("- [检测代码规范、注释内容排版,API 文档生成](https://github.com/afkT/JavaDoc)"); + + buffer.append("\n\n"); + buffer.append("## API"); + + buffer.append("\n\n"); + // 增加锚链接 -> 二级目录 + buffer.append(PackageCatalog.apiCatalog(true, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + } + + /** + * 创建 REAMDE 文件 + * @return Create Result + */ + public static String createREADME() { + // 包名 + final String packageName = ApiConfig.DEV_PACKAGE; + // 本地文件路径 + final String path = ApiConfig.DEV_JAVA_UTILS_PATH; + // Github 链接地址 + final String githubUrl = ApiConfig.DEV_JAVA_GITHUB_URL; + + // 方法名匹配存储 Map<类名, List<方法名>> + final HashMap> methodNameMatchesMap = new HashMap(); + // 方法名重复记录存储 + final StringBuffer methodRepeatBuffer = new StringBuffer(); + // 方法没有注释记录存储 + final StringBuffer methodNotAnnotateBuffer = new StringBuffer(); + // 类不存在方法记录存储 + final StringBuffer notMethodBuffer = new StringBuffer(); + + // =========== + // = 生成 API = + // =========== + + // 最终的数据 + StringBuffer buffer = new StringBuffer(); + // 添加头部信息 + createREADMEHead(buffer, path, packageName, ApiConfig.sCatalogMap); + + // 生成 dev.utils.common 包下 dev.utils + String commonAPI = APIGenerate.apiGenerate("common", path, packageName, githubUrl, + ApiConfig.sFilterClassMap, ApiConfig.sFilterMethodMap, ApiConfig.sMethodNameRegex, + methodNameMatchesMap, methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + + buffer.append(commonAPI); + + // 保存合成后的 API REAMDE + FileUtils.saveFile(new File(ApiConfig.DEV_JAVA_API_FILE_SAVE_PATH, ApiConfig.README_FILE_NAME).getAbsolutePath(), + buffer.toString().getBytes()); + +// // 方法名重复记录存储 +// Utils.saveFile(ApiConfig.DEV_JAVA_API_FILE_SAVE_PATH, "readme_method_repeat_api.md", methodRepeatBuffer.toString()); +// // 方法没有注释记录存储 +// Utils.saveFile(ApiConfig.DEV_JAVA_API_FILE_SAVE_PATH, "readme_method_not_annotate_api.md", methodNotAnnotateBuffer.toString()); +// // 类不存在方法记录存储 +// Utils.saveFile(ApiConfig.DEV_JAVA_API_FILE_SAVE_PATH, "readme_not_method_api.md", notMethodBuffer.toString()); + + StringBuffer resultBuffer = new StringBuffer(); + resultBuffer.append("\n\n"); + resultBuffer.append("\n====================="); + resultBuffer.append("\n= 保存 JavaDoc 成功 ="); + resultBuffer.append("\n====================="); + resultBuffer.append("\n"); + resultBuffer.append("\n"); + resultBuffer.append("保存地址: " + ApiConfig.DEV_JAVA_API_FILE_SAVE_PATH + ApiConfig.README_FILE_NAME); + resultBuffer.append("\n"); + return resultBuffer.toString(); + } + + public static void main(String[] args) { + System.out.println(DevJava_READMEMain.createREADME()); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/readme/DevOther_READMEMain.java b/src/main/java/javadoc/dev_utils/readme/DevOther_READMEMain.java new file mode 100644 index 00000000..7c975e20 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/readme/DevOther_READMEMain.java @@ -0,0 +1,117 @@ +package javadoc.dev_utils.readme; + +import dev.utils.common.FileUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.assist.APIGenerate; +import javadoc.dev_utils.assist.PackageCatalog; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 创建 README Main 方法 + * @author Ttt + */ +final class DevOther_READMEMain { + + private DevOther_READMEMain() { + } + + /** + * 创建 DevUtils - README 头部前缀 + * @param buffer 拼接 Buffer + * @param path 文件路径 + * @param packageName 包名 + * @param mapCatalog 对应目录的注释 + */ + private static void createREADMEHead(final StringBuffer buffer, final String path, final String packageName, + final HashMap mapCatalog) { + buffer.append("\n\n"); + buffer.append("## 目录结构"); + + buffer.append("\n\n"); + // 不增加锚链接 -> 一级目录 + buffer.append(PackageCatalog.apiCatalog(false, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + buffer.append("## Use"); + + buffer.append("\n\n"); + buffer.append("> 直接 copy 所需要的类到项目中使用"); + buffer.append("\n"); + + buffer.append("\n\n"); + buffer.append("## API"); + + buffer.append("\n\n"); + // 增加锚链接 -> 二级目录 + buffer.append(PackageCatalog.apiCatalog(true, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + } + + /** + * 创建 REAMDE 文件 + * @return Create Result + */ + public static String createREADME() { + // 包名 + final String packageName = ApiConfig.DEV_OTHER_PACKAGE; + // 本地文件路径 + final String path = ApiConfig.DEV_OTHER_PATH; + // Github 链接地址 + final String githubUrl = ApiConfig.DEV_OTHER_GITHUB_URL; + + // 方法名匹配存储 Map<类名, List<方法名>> + final HashMap> methodNameMatchesMap = new HashMap(); + // 方法名重复记录存储 + final StringBuffer methodRepeatBuffer = new StringBuffer(); + // 方法没有注释记录存储 + final StringBuffer methodNotAnnotateBuffer = new StringBuffer(); + // 类不存在方法记录存储 + final StringBuffer notMethodBuffer = new StringBuffer(); + + // =========== + // = 生成 API = + // =========== + + // 最终的数据 + StringBuffer buffer = new StringBuffer(); + // 添加头部信息 + createREADMEHead(buffer, path, packageName, ApiConfig.sCatalogMap_Other); + + // 生成 dev 包下 + String otherAPI = APIGenerate.apiGenerate("", path, packageName, githubUrl, + ApiConfig.sFilterClassMap_Other, ApiConfig.sFilterMethodMap_Other, ApiConfig.sMethodNameRegex, + methodNameMatchesMap, methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + + buffer.append(otherAPI); + + // 保存合成后的 API REAMDE + FileUtils.saveFile(new File(ApiConfig.DEV_OTHER_API_FILE_SAVE_PATH, ApiConfig.README_FILE_NAME).getAbsolutePath(), + buffer.toString().getBytes()); + +// // 方法名重复记录存储 +// Utils.saveFile(ApiConfig.DEV_OTHER_API_FILE_SAVE_PATH, "readme_method_repeat_api.md", methodRepeatBuffer.toString()); +// // 方法没有注释记录存储 +// Utils.saveFile(ApiConfig.DEV_OTHER_API_FILE_SAVE_PATH, "readme_method_not_annotate_api.md", methodNotAnnotateBuffer.toString()); +// // 类不存在方法记录存储 +// Utils.saveFile(ApiConfig.DEV_OTHER_API_FILE_SAVE_PATH, "readme_not_method_api.md", notMethodBuffer.toString()); + + StringBuffer resultBuffer = new StringBuffer(); + resultBuffer.append("\n\n"); + resultBuffer.append("\n====================="); + resultBuffer.append("\n= 保存 JavaDoc 成功 ="); + resultBuffer.append("\n====================="); + resultBuffer.append("\n"); + resultBuffer.append("\n"); + resultBuffer.append("保存地址: " + ApiConfig.DEV_OTHER_API_FILE_SAVE_PATH + ApiConfig.README_FILE_NAME); + resultBuffer.append("\n"); + return resultBuffer.toString(); + } + + public static void main(String[] args) { + System.out.println(DevOther_READMEMain.createREADME()); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/readme/DevWidget_READMEMain.java b/src/main/java/javadoc/dev_utils/readme/DevWidget_READMEMain.java new file mode 100644 index 00000000..6adfb543 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/readme/DevWidget_READMEMain.java @@ -0,0 +1,135 @@ +package javadoc.dev_utils.readme; + +import dev.utils.common.FileUtils; +import javadoc.dev_utils.ApiConfig; +import javadoc.dev_utils.assist.APIGenerate; +import javadoc.dev_utils.assist.PackageCatalog; + +import java.io.File; +import java.util.HashMap; +import java.util.List; + +/** + * detail: 创建 README Main 方法 + * @author Ttt + */ +final class DevWidget_READMEMain { + + private DevWidget_READMEMain() { + } + + /** + * 创建 DevUtils - README 头部前缀 + * @param buffer 拼接 Buffer + * @param path 文件路径 + * @param packageName 包名 + * @param mapCatalog 对应目录的注释 + */ + private static void createREADMEHead(final StringBuffer buffer, final String path, final String packageName, + final HashMap mapCatalog) { + buffer.append("\n"); + buffer.append("## Gradle"); + + buffer.append("\n\n"); + buffer.append("```java"); + buffer.append("\n"); + buffer.append("// AndroidX"); + buffer.append("\n"); + buffer.append("implementation 'com.afkt:DevWidgetX:" + ApiConfig.DEV_WIDGET_VERSION + "'"); + buffer.append("\n"); + buffer.append("```"); + + buffer.append("\n\n"); + buffer.append("## 目录结构"); + + buffer.append("\n\n"); + // 不增加锚链接 -> 一级目录 + buffer.append(PackageCatalog.apiCatalog(false, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + buffer.append("## README"); + + buffer.append("\n\n"); + buffer.append("- 效果可运行 DevUtils 项目点击 DevWidget UI 库查看"); + buffer.append("\n\n"); + buffer.append("- 该库依赖 [DevApp](https://github.com/afkT/DevUtils/blob/master/lib/DevApp/README.md) 开发,需引用 DevApp 库"); + buffer.append("\n\n"); + buffer.append("- [Preview README](https://github.com/afkT/DevUtils/blob/master/lib/DevWidget/README.md)"); + buffer.append("\n\n"); + buffer.append("- [Change Log](https://github.com/afkT/DevUtils/blob/master/lib/DevWidget/CHANGELOG.md)"); + buffer.append("\n"); + + buffer.append("\n\n"); + buffer.append("## API"); + + buffer.append("\n\n"); + // 增加锚链接 -> 二级目录 + buffer.append(PackageCatalog.apiCatalog(true, path, packageName, mapCatalog)); + + buffer.append("\n\n"); + } + + /** + * 创建 REAMDE 文件 + * @return Create Result + */ + public static String createREADME() { + // 包名 + final String packageName = ApiConfig.DEV_WIDGET_PACKAGE; + // 本地文件路径 + final String path = ApiConfig.DEV_WIDGET_PATH; + // Github 链接地址 + final String githubUrl = ApiConfig.DEV_WIDGET_GITHUB_URL; + + // 方法名匹配存储 Map<类名, List<方法名>> + final HashMap> methodNameMatchesMap = new HashMap(); + // 方法名重复记录存储 + final StringBuffer methodRepeatBuffer = new StringBuffer(); + // 方法没有注释记录存储 + final StringBuffer methodNotAnnotateBuffer = new StringBuffer(); + // 类不存在方法记录存储 + final StringBuffer notMethodBuffer = new StringBuffer(); + + // =========== + // = 生成 API = + // =========== + + // 最终的数据 + StringBuffer buffer = new StringBuffer(); + // 添加头部信息 + createREADMEHead(buffer, path, packageName, ApiConfig.sCatalogMap_Widget); + + // 生成 dev 包下 + String widgetAPI = APIGenerate.apiGenerate("", path, packageName, githubUrl, + ApiConfig.sFilterClassMap_Widget, ApiConfig.sFilterMethodMap_Widget, ApiConfig.sMethodNameRegex, + methodNameMatchesMap, methodRepeatBuffer, methodNotAnnotateBuffer, notMethodBuffer); + + buffer.append(widgetAPI); + + // 保存合成后的 API REAMDE + FileUtils.saveFile(new File(ApiConfig.DEV_WIDGET_API_FILE_SAVE_PATH, ApiConfig.README_API_FILE_NAME).getAbsolutePath(), + buffer.toString().getBytes()); + +// // 方法名重复记录存储 +// Utils.saveFile(ApiConfig.DEV_WIDGET_API_FILE_SAVE_PATH, "readme_method_repeat_api.md", methodRepeatBuffer.toString()); +// // 方法没有注释记录存储 +// Utils.saveFile(ApiConfig.DEV_WIDGET_API_FILE_SAVE_PATH, "readme_method_not_annotate_api.md", methodNotAnnotateBuffer.toString()); +// // 类不存在方法记录存储 +// Utils.saveFile(ApiConfig.DEV_WIDGET_API_FILE_SAVE_PATH, "readme_not_method_api.md", notMethodBuffer.toString()); + + StringBuffer resultBuffer = new StringBuffer(); + resultBuffer.append("\n\n"); + resultBuffer.append("\n====================="); + resultBuffer.append("\n= 保存 JavaDoc 成功 ="); + resultBuffer.append("\n====================="); + resultBuffer.append("\n"); + resultBuffer.append("\n"); + resultBuffer.append("保存地址: " + ApiConfig.DEV_WIDGET_API_FILE_SAVE_PATH + ApiConfig.README_API_FILE_NAME); + resultBuffer.append("\n"); + return resultBuffer.toString(); + } + + public static void main(String[] args) { + System.out.println(DevWidget_READMEMain.createREADME()); + } +} \ No newline at end of file diff --git a/src/main/java/javadoc/dev_utils/readme/READMEMain.java b/src/main/java/javadoc/dev_utils/readme/READMEMain.java new file mode 100644 index 00000000..bdc15c38 --- /dev/null +++ b/src/main/java/javadoc/dev_utils/readme/READMEMain.java @@ -0,0 +1,40 @@ +package javadoc.dev_utils.readme; + +/** + * detail: 创建 README + * @author Ttt + */ +final class READMEMain { + + private READMEMain() { + } + + public static void main(String[] args) { + StringBuilder builder = new StringBuilder(); + builder.append(DevApp_READMEMain.createREADME()); + builder.append(DevAssist_READMEMain.createREADME()); + builder.append(DevBase_READMEMain.createREADME()); + builder.append(DevBaseMVVM_READMEMain.createREADME()); + builder.append(DevJava_READMEMain.createREADME()); + builder.append(DevOther_READMEMain.createREADME()); + builder.append(DevWidget_READMEMain.createREADME()); + print(builder.toString()); + } + + /** + * 输出信息 + * @param str str info + */ + private static void print(final String str) { + new Thread(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(2000); + } catch (InterruptedException e) { + } + System.out.println(str); + } + }).start(); + } +} \ No newline at end of file diff --git a/src/main/java/other/Pangu.java b/src/main/java/other/Pangu.java new file mode 100644 index 00000000..adca6222 --- /dev/null +++ b/src/main/java/other/Pangu.java @@ -0,0 +1,169 @@ +package other; + + +import java.io.*; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Paranoid text spacing for good readability, to automatically insert whitespace between + * CJK (Chinese, Japanese, Korean), half-width English, digit and symbol characters. + *

    + *

    These whitespaces between English and Chinese characters are called "Pangu Spacing" by sinologist, since it + * separate the confusion between full-width and half-width characters. Studies showed that who dislike to + * add whitespace between English and Chinese characters also have relationship problem. Almost 70 percent of them + * will get married to the one they don't love, the rest only can left the heritage to their cat. Indeed, + * love and writing need some space in good time. + * @author Vinta Chen + * @since 1.0.0 + */ +public class Pangu { + + /** + * You should use the constructor to create a {@code Pangu} object with default values. + */ + public Pangu() { + } + + /* + * Some capturing group patterns for convenience. + * CJK: Chinese, Japanese, Korean + * ANS: Alphabet, Number, Symbol + */ + private static final Pattern CJK_ANS = Pattern.compile( + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])" + + "([a-z0-9`~@\\$%\\^&\\*\\-_\\+=\\|\\\\/])", + Pattern.CASE_INSENSITIVE + ); + private static final Pattern ANS_CJK = Pattern.compile( + "([a-z0-9`~!\\$%\\^&\\*\\-_\\+=\\|\\\\;:,\\./\\?])" + + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])", + Pattern.CASE_INSENSITIVE + ); + + private static final Pattern CJK_QUOTE = Pattern.compile( + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])" + + "([\"'])" + ); + private static final Pattern QUOTE_CJK = Pattern.compile( + "([\"'])" + + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])" + ); + private static final Pattern FIX_QUOTE = Pattern.compile("([\"'])(\\s*)(.+?)(\\s*)([\"'])"); + + private static final Pattern CJK_BRACKET_CJK = Pattern.compile( + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])" + + "([\\({\\[]+(.*?)[\\)}\\]]+)" + + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])" + ); + private static final Pattern CJK_BRACKET = Pattern.compile( + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])" + + "([\\(\\){}\\[\\]])" + ); + private static final Pattern BRACKET_CJK = Pattern.compile( + "([\\(\\){}\\[\\]])" + + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])" + ); + private static final Pattern FIX_BRACKET = Pattern.compile("([(\\({\\[)]+)(\\s*)(.+?)(\\s*)([\\)}\\]]+)"); + + private static final Pattern CJK_HASH = Pattern.compile( + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])" + + "(#(\\S+))" + ); + private static final Pattern HASH_CJK = Pattern.compile( + "((\\S+)#)" + + "([\\p{InHiragana}\\p{InKatakana}\\p{InBopomofo}\\p{InCJKCompatibilityIdeographs}\\p{InCJKUnifiedIdeographs}])" + ); + + /** + * Performs a paranoid text spacing on {@code text}. + * @param text the string you want to process, must not be {@code null}. + * @return a comfortable and readable version of {@code text} for paranoiac. + */ + public String spacingText(String text) { + // CJK and quotes + Matcher cqMatcher = CJK_QUOTE.matcher(text); + text = cqMatcher.replaceAll("1ドル 2ドル"); + + Matcher qcMatcher = QUOTE_CJK.matcher(text); + text = qcMatcher.replaceAll("1ドル 2ドル"); + +// // 不处理引用等 +// Matcher fixQuoteMatcher = FIX_QUOTE.matcher(text); +// text = fixQuoteMatcher.replaceAll("1ドル3ドル5ドル"); + + // CJK and brackets + String oldText = text; + Matcher cbcMatcher = CJK_BRACKET_CJK.matcher(text); + String newText = cbcMatcher.replaceAll("1ドル 2ドル 4ドル"); + text = newText; + + if (oldText.equals(newText)) { + Matcher cbMatcher = CJK_BRACKET.matcher(text); + text = cbMatcher.replaceAll("1ドル 2ドル"); + + Matcher bcMatcher = BRACKET_CJK.matcher(text); + text = bcMatcher.replaceAll("1ドル 2ドル"); + } + +// // 不处理括号空格 +// Matcher fixBracketMatcher = FIX_BRACKET.matcher(text); +// text = fixBracketMatcher.replaceAll("1ドル3ドル5ドル"); + + // CJK and hash + Matcher chMatcher = CJK_HASH.matcher(text); + text = chMatcher.replaceAll("1ドル 2ドル"); + + Matcher hcMatcher = HASH_CJK.matcher(text); + text = hcMatcher.replaceAll("1ドル 3ドル"); + + // CJK and ANS + Matcher caMatcher = CJK_ANS.matcher(text); + text = caMatcher.replaceAll("1ドル 2ドル"); + + Matcher acMatcher = ANS_CJK.matcher(text); + text = acMatcher.replaceAll("1ドル 2ドル"); + + return text; + } + + /** + * Performs a paranoid text spacing on {@code inputFile} and generate a new file {@code outputFile}. + * @param inputFile an existing file to process, must not be {@code null}. + * @param outputFile the processed file, must not be {@code null}. + * @throws IOException if an error occurs. + * @since 1.1.0 + */ + public void spacingFile(File inputFile, File outputFile) throws IOException { + // TODO: support charset + + FileReader fr = new FileReader(inputFile); + BufferedReader br = new BufferedReader(fr); + + outputFile.getParentFile().mkdirs(); + FileWriter fw = new FileWriter(outputFile, false); + BufferedWriter bw = new BufferedWriter(fw); + + try { + String line = br.readLine(); // readLine() do not contain newline char + + while (line != null) { + line = spacingText(line); + + // TODO: keep file's raw newline char from difference OS platform + bw.write(line); + bw.newLine(); + + line = br.readLine(); + } + } finally { + br.close(); + + // 避免 writer 沒有實際操作就 close(),產生一個空檔案 + if (bw != null) { + bw.close(); + } + } + } + +} \ No newline at end of file diff --git a/src/main/java/other/RunMain.java b/src/main/java/other/RunMain.java new file mode 100644 index 00000000..6b65afb5 --- /dev/null +++ b/src/main/java/other/RunMain.java @@ -0,0 +1,19 @@ +package other; + +/** + * detail: 临时运行方法 + *

    + * idea 导入项目后, 右键项目不显示 Subversion 选项
    + * VCS -> Enable Version Control Integration
    + * @see 
    + * 
    + * @author Ttt + */ +public class RunMain { + + // 日志 TAG + private static final String TAG = RunMain.class.getSimpleName(); + + public static void main(String[] args) { + } +} \ No newline at end of file

    AltStyle によって変換されたページ (->オリジナル) /