From 09b9a199978232f3b26f8e493f07ad7e1eb45a8f Mon Sep 17 00:00:00 2001 From: Ru Chuan Date: Thu, 11 Jun 2020 14:44:06 +0800 Subject: [PATCH 01/21] use gradle build project --- .gitignore | 5 + RestfulToolkit.iml | 18 +- build.gradle | 56 ++++++ gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 58910 bytes gradle/wrapper/gradle-wrapper.properties | 6 + gradlew | 185 ++++++++++++++++++ gradlew.bat | 104 ++++++++++ settings.gradle | 10 + .../RestToolkitTemplatesProvider.java | 0 .../restful/action/AbstractBaseAction.java | 0 .../action/ConvertClassToJSONAction.java | 0 .../ConvertClassToJSONCompressedAction.java | 0 .../action/ConvertKtClassToJSONAction.java | 0 .../restful/annotations/BasePathMapping.java | 0 .../JaxrsHttpMethodAnnotation.java | 0 .../annotations/JaxrsPathAnnotation.java | 0 .../annotations/JaxrsRequestAnnotation.java | 0 .../JaxrsRequestParamAnnotation.java | 0 .../annotations/PathMappingAnnotation.java | 0 .../SpringControllerAnnotation.java | 0 .../SpringRequestMethodAnnotation.java | 0 .../SpringRequestParamAnnotations.java | 0 .../restful/codegen/SpringBootGenerator.java | 0 .../zhaow/restful/common/ChineseUtill.java | 0 .../zhaow/restful/common/IntellijUtils.java | 0 .../zhaow/restful/common/KtClassHelper.java | 0 .../restful/common/KtFunctionHelper.java | 0 .../restful/common/PsiAnnotationHelper.java | 0 .../zhaow/restful/common/PsiClassHelper.java | 0 .../zhaow/restful/common/PsiMethodHelper.java | 0 .../zhaow/restful/common/RequestHelper.java | 0 .../common/RestSupportedAnnotationHelper.java | 0 .../zhaow/restful/common/ServiceHelper.java | 0 .../zhaow/restful/common/ToolkitIcons.java | 0 .../common/jaxrs/JaxrsAnnotationHelper.java | 0 .../common/resolver/BaseServiceResolver.java | 0 .../common/resolver/JaxrsResolver.java | 0 .../common/resolver/ServiceResolver.java | 0 .../common/resolver/SpringResolver.java | 0 .../restful/common/spring/AntPathMatcher.java | 0 .../RequestMappingAnnotationHelper.java | 0 .../restful/common/spring/StringUtils.java | 0 .../restful/highlight/JTextAreaHighlight.java | 0 .../com/zhaow/restful/method/HttpMethod.java | 0 .../com/zhaow/restful/method/Parameter.java | 0 .../com/zhaow/restful/method/RequestPath.java | 0 .../method/action/GenerateFullUrlAction.java | 0 .../action/GenerateQueryParamAction.java | 0 .../action/GenerateQueryParamJsonAction.java | 0 .../method/action/GenerateUrlAction.java | 0 .../restful/method/action/ModuleHelper.java | 0 .../method/action/PropertiesHandler.java | 0 .../action/SpringAnnotatedMethodAction.java | 0 .../action/GotoRequestMappingAction.java | 0 .../GotoRequestMappingConfiguration.java | 0 .../action/GotoRequestMappingContributor.java | 0 .../action/GotoRequestMappingModel.java | 0 .../action/GotoRequestMappingProvider.java | 0 .../action/RestServiceChooseByNamePopup.java | 0 .../navigation/action/RestServiceItem.java | 0 .../restful/navigator/CopyFullUrlAction.java | 0 .../restful/navigator/EditSourceAction.java | 0 .../navigator/RefreshProjectAction.java | 0 .../restful/navigator/RestServiceDetail.form | 0 .../restful/navigator/RestServiceDetail.java | 0 .../restful/navigator/RestServiceProject.java | 0 .../navigator/RestServiceProjectsManager.java | 0 .../navigator/RestServiceStructure.java | 5 +- .../navigator/RestServicesNavigator.java | 0 .../navigator/RestServicesNavigatorPanel.java | 0 .../navigator/RestServicesNavigatorState.java | 0 .../popup/action/PopupChoiceAction.java | 0 .../RestfulToolkitFeaturesProvider.java | 0 .../java/com/zhaow/utils/JsonUtils.java | 0 .../com/zhaow/utils/RestServiceDataKeys.java | 0 .../com/zhaow/utils/RestfulToolkitBundle.java | 0 .../java/com/zhaow/utils/ToolkitUtil.java | 0 .../java/com/zhaow/utils/ToolkitUtil.java.bak | 0 .../main/resources}/META-INF/plugin.xml | 6 +- .../RestfulToolkitBundle.properties | 0 .../main/resources}/icons/method/d.png | Bin .../main/resources}/icons/method/g.png | Bin .../main/resources}/icons/method/p.png | Bin .../main/resources}/icons/method/p2.png | Bin .../main/resources}/icons/method/p3.png | Bin .../resources}/icons/method/undefined.png | Bin .../main/resources}/icons/service.png | Bin .../main/resources}/tips/GotoService.html | 0 .../resources}/tips/images/GotoService.png | Bin .../resources}/tips/images/SSHKeyUpload.png | Bin 90 files changed, 372 insertions(+), 23 deletions(-) create mode 100644 build.gradle create mode 100644 gradle/wrapper/gradle-wrapper.jar create mode 100644 gradle/wrapper/gradle-wrapper.properties create mode 100755 gradlew create mode 100644 gradlew.bat create mode 100644 settings.gradle rename src/{ => main}/java/com/zhaow/livetemplate/RestToolkitTemplatesProvider.java (100%) rename src/{ => main}/java/com/zhaow/restful/action/AbstractBaseAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/action/ConvertClassToJSONAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/action/ConvertClassToJSONCompressedAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/action/ConvertKtClassToJSONAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/annotations/BasePathMapping.java (100%) rename src/{ => main}/java/com/zhaow/restful/annotations/JaxrsHttpMethodAnnotation.java (100%) rename src/{ => main}/java/com/zhaow/restful/annotations/JaxrsPathAnnotation.java (100%) rename src/{ => main}/java/com/zhaow/restful/annotations/JaxrsRequestAnnotation.java (100%) rename src/{ => main}/java/com/zhaow/restful/annotations/JaxrsRequestParamAnnotation.java (100%) rename src/{ => main}/java/com/zhaow/restful/annotations/PathMappingAnnotation.java (100%) rename src/{ => main}/java/com/zhaow/restful/annotations/SpringControllerAnnotation.java (100%) rename src/{ => main}/java/com/zhaow/restful/annotations/SpringRequestMethodAnnotation.java (100%) rename src/{ => main}/java/com/zhaow/restful/annotations/SpringRequestParamAnnotations.java (100%) rename src/{ => main}/java/com/zhaow/restful/codegen/SpringBootGenerator.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/ChineseUtill.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/IntellijUtils.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/KtClassHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/KtFunctionHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/PsiAnnotationHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/PsiClassHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/PsiMethodHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/RequestHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/RestSupportedAnnotationHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/ServiceHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/ToolkitIcons.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/jaxrs/JaxrsAnnotationHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/resolver/JaxrsResolver.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/resolver/ServiceResolver.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/resolver/SpringResolver.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/spring/AntPathMatcher.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/common/spring/StringUtils.java (100%) rename src/{ => main}/java/com/zhaow/restful/highlight/JTextAreaHighlight.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/HttpMethod.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/Parameter.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/RequestPath.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/action/GenerateFullUrlAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/action/GenerateQueryParamAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/action/GenerateQueryParamJsonAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/action/GenerateUrlAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/action/ModuleHelper.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/action/PropertiesHandler.java (100%) rename src/{ => main}/java/com/zhaow/restful/method/action/SpringAnnotatedMethodAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigation/action/GotoRequestMappingConfiguration.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigation/action/GotoRequestMappingModel.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigation/action/GotoRequestMappingProvider.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigation/action/RestServiceItem.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/CopyFullUrlAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/EditSourceAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/RefreshProjectAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/RestServiceDetail.form (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/RestServiceDetail.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/RestServiceProject.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/RestServiceStructure.java (99%) rename src/{ => main}/java/com/zhaow/restful/navigator/RestServicesNavigator.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/RestServicesNavigatorPanel.java (100%) rename src/{ => main}/java/com/zhaow/restful/navigator/RestServicesNavigatorState.java (100%) rename src/{ => main}/java/com/zhaow/restful/popup/action/PopupChoiceAction.java (100%) rename src/{ => main}/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java (100%) rename src/{ => main}/java/com/zhaow/utils/JsonUtils.java (100%) rename src/{ => main}/java/com/zhaow/utils/RestServiceDataKeys.java (100%) rename src/{ => main}/java/com/zhaow/utils/RestfulToolkitBundle.java (100%) rename src/{ => main}/java/com/zhaow/utils/ToolkitUtil.java (100%) rename src/{ => main}/java/com/zhaow/utils/ToolkitUtil.java.bak (100%) rename {resources => src/main/resources}/META-INF/plugin.xml (99%) rename {resources => src/main/resources}/RestfulToolkitBundle.properties (100%) rename {resources => src/main/resources}/icons/method/d.png (100%) rename {resources => src/main/resources}/icons/method/g.png (100%) rename {resources => src/main/resources}/icons/method/p.png (100%) rename {resources => src/main/resources}/icons/method/p2.png (100%) rename {resources => src/main/resources}/icons/method/p3.png (100%) rename {resources => src/main/resources}/icons/method/undefined.png (100%) rename {resources => src/main/resources}/icons/service.png (100%) rename {resources => src/main/resources}/tips/GotoService.html (100%) rename {resources => src/main/resources}/tips/images/GotoService.png (100%) rename {resources => src/main/resources}/tips/images/SSHKeyUpload.png (100%) diff --git a/.gitignore b/.gitignore index 35b7961..0996604 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,8 @@ .DS_Store .idea/ out/ +*.iml +build/ +.gradle/ +*.hprof + diff --git a/RestfulToolkit.iml b/RestfulToolkit.iml index d7f73ce..78b2cc5 100644 --- a/RestfulToolkit.iml +++ b/RestfulToolkit.iml @@ -1,18 +1,2 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file + \ No newline at end of file diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..6c924a0 --- /dev/null +++ b/build.gradle @@ -0,0 +1,56 @@ +plugins { + id 'java' + id "org.jetbrains.kotlin.jvm" version "1.3.72" + id 'org.jetbrains.intellij' version '0.4.14' //引入intellij的gradle插件 +} + +group 'com.zhaow.restful.toolkit' +version '3.0.0' //定义jar包/zip包的版本号 +ext.kotlin_version = '1.3.72' + +sourceCompatibility = 1.8 //限制jdk的使用版本号,这里限制到8,表示生成的idea插件只能运行在jdk8以上的环境中 + +repositories { + maven { + url 'https://maven.aliyun.com/nexus/content/groups/public/' + } + + maven { + url 'https://maven.aliyun.com/nexus/content/repositories/jcenter' + } + maven { + url "https://plugins.gradle.org/m2/" + } + mavenCentral() +} + +dependencies { + //这里引别的依赖包 + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" + testImplementation 'junit:junit:4.12' + testImplementation "org.jetbrains.kotlin:kotlin-test-junit:$kotlin_version" + //testCompile group: 'junit', name: 'junit', version: '4.12' +} + +// See https://github.com/JetBrains/gradle-intellij-plugin/ +intellij { + // 这里是指打插件包的时候用idea什么版本的依赖包打 + // 比如这里用2019.3打包,如果你的插件实现源码里用了2019.3不存在的依赖包或类,就会报错 + // 一般就填当前IDEA的版本号即可 + version "2019.3" + plugins = ['java', 'Kotlin'] +} + +patchPluginXml { + + //changeNotes里的内容展示位置参考图14 + changeNotes """ + 1.0版本. + + 第1.0版本:初始化这个测试插件项目""" + + // 这个意思是说当前定义的这个插件最早支持到什么版本的IDEA + // 这里配置sinceBuild=191,表示插件只能被版本号大于等于2019.1版本的IDEA安装,低于这个版本的将抛无法兼容的错误 + // ↑上方参考这篇问答:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003338799-Build-compatible-plugin + sinceBuild "191" // 原 191 +} \ 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 0000000000000000000000000000000000000000..62d4c053550b91381bbd28b1afc82d634bf73a8a GIT binary patch literal 58910 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 literal 0 HcmV?d00001 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..4ef311f --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Wed Jun 10 22:05:09 CST 2020 +distributionUrl=https\://services.gradle.org/distributions/gradle-6.4.1-all.zip +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew new file mode 100755 index 0000000..fbd7c51 --- /dev/null +++ b/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## 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='"-Xmx64m" "-Xms64m"' + +# 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 or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; 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=`expr $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" + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 0000000..a9f778a --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,104 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@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 Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@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="-Xmx64m" "-Xms64m" + +@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 0000000..92f1c8a --- /dev/null +++ b/settings.gradle @@ -0,0 +1,10 @@ +/* + * This file was generated by the Gradle 'init' task. + * + * The settings file is used to specify which projects to include in your build. + * + * Detailed information about configuring a multi-project build in Gradle can be found + * in the user manual at https://docs.gradle.org/6.4.1/userguide/multi_project_builds.html + */ + +rootProject.name = 'RestfulToolkit' diff --git a/src/java/com/zhaow/livetemplate/RestToolkitTemplatesProvider.java b/src/main/java/com/zhaow/livetemplate/RestToolkitTemplatesProvider.java similarity index 100% rename from src/java/com/zhaow/livetemplate/RestToolkitTemplatesProvider.java rename to src/main/java/com/zhaow/livetemplate/RestToolkitTemplatesProvider.java diff --git a/src/java/com/zhaow/restful/action/AbstractBaseAction.java b/src/main/java/com/zhaow/restful/action/AbstractBaseAction.java similarity index 100% rename from src/java/com/zhaow/restful/action/AbstractBaseAction.java rename to src/main/java/com/zhaow/restful/action/AbstractBaseAction.java diff --git a/src/java/com/zhaow/restful/action/ConvertClassToJSONAction.java b/src/main/java/com/zhaow/restful/action/ConvertClassToJSONAction.java similarity index 100% rename from src/java/com/zhaow/restful/action/ConvertClassToJSONAction.java rename to src/main/java/com/zhaow/restful/action/ConvertClassToJSONAction.java diff --git a/src/java/com/zhaow/restful/action/ConvertClassToJSONCompressedAction.java b/src/main/java/com/zhaow/restful/action/ConvertClassToJSONCompressedAction.java similarity index 100% rename from src/java/com/zhaow/restful/action/ConvertClassToJSONCompressedAction.java rename to src/main/java/com/zhaow/restful/action/ConvertClassToJSONCompressedAction.java diff --git a/src/java/com/zhaow/restful/action/ConvertKtClassToJSONAction.java b/src/main/java/com/zhaow/restful/action/ConvertKtClassToJSONAction.java similarity index 100% rename from src/java/com/zhaow/restful/action/ConvertKtClassToJSONAction.java rename to src/main/java/com/zhaow/restful/action/ConvertKtClassToJSONAction.java diff --git a/src/java/com/zhaow/restful/annotations/BasePathMapping.java b/src/main/java/com/zhaow/restful/annotations/BasePathMapping.java similarity index 100% rename from src/java/com/zhaow/restful/annotations/BasePathMapping.java rename to src/main/java/com/zhaow/restful/annotations/BasePathMapping.java diff --git a/src/java/com/zhaow/restful/annotations/JaxrsHttpMethodAnnotation.java b/src/main/java/com/zhaow/restful/annotations/JaxrsHttpMethodAnnotation.java similarity index 100% rename from src/java/com/zhaow/restful/annotations/JaxrsHttpMethodAnnotation.java rename to src/main/java/com/zhaow/restful/annotations/JaxrsHttpMethodAnnotation.java diff --git a/src/java/com/zhaow/restful/annotations/JaxrsPathAnnotation.java b/src/main/java/com/zhaow/restful/annotations/JaxrsPathAnnotation.java similarity index 100% rename from src/java/com/zhaow/restful/annotations/JaxrsPathAnnotation.java rename to src/main/java/com/zhaow/restful/annotations/JaxrsPathAnnotation.java diff --git a/src/java/com/zhaow/restful/annotations/JaxrsRequestAnnotation.java b/src/main/java/com/zhaow/restful/annotations/JaxrsRequestAnnotation.java similarity index 100% rename from src/java/com/zhaow/restful/annotations/JaxrsRequestAnnotation.java rename to src/main/java/com/zhaow/restful/annotations/JaxrsRequestAnnotation.java diff --git a/src/java/com/zhaow/restful/annotations/JaxrsRequestParamAnnotation.java b/src/main/java/com/zhaow/restful/annotations/JaxrsRequestParamAnnotation.java similarity index 100% rename from src/java/com/zhaow/restful/annotations/JaxrsRequestParamAnnotation.java rename to src/main/java/com/zhaow/restful/annotations/JaxrsRequestParamAnnotation.java diff --git a/src/java/com/zhaow/restful/annotations/PathMappingAnnotation.java b/src/main/java/com/zhaow/restful/annotations/PathMappingAnnotation.java similarity index 100% rename from src/java/com/zhaow/restful/annotations/PathMappingAnnotation.java rename to src/main/java/com/zhaow/restful/annotations/PathMappingAnnotation.java diff --git a/src/java/com/zhaow/restful/annotations/SpringControllerAnnotation.java b/src/main/java/com/zhaow/restful/annotations/SpringControllerAnnotation.java similarity index 100% rename from src/java/com/zhaow/restful/annotations/SpringControllerAnnotation.java rename to src/main/java/com/zhaow/restful/annotations/SpringControllerAnnotation.java diff --git a/src/java/com/zhaow/restful/annotations/SpringRequestMethodAnnotation.java b/src/main/java/com/zhaow/restful/annotations/SpringRequestMethodAnnotation.java similarity index 100% rename from src/java/com/zhaow/restful/annotations/SpringRequestMethodAnnotation.java rename to src/main/java/com/zhaow/restful/annotations/SpringRequestMethodAnnotation.java diff --git a/src/java/com/zhaow/restful/annotations/SpringRequestParamAnnotations.java b/src/main/java/com/zhaow/restful/annotations/SpringRequestParamAnnotations.java similarity index 100% rename from src/java/com/zhaow/restful/annotations/SpringRequestParamAnnotations.java rename to src/main/java/com/zhaow/restful/annotations/SpringRequestParamAnnotations.java diff --git a/src/java/com/zhaow/restful/codegen/SpringBootGenerator.java b/src/main/java/com/zhaow/restful/codegen/SpringBootGenerator.java similarity index 100% rename from src/java/com/zhaow/restful/codegen/SpringBootGenerator.java rename to src/main/java/com/zhaow/restful/codegen/SpringBootGenerator.java diff --git a/src/java/com/zhaow/restful/common/ChineseUtill.java b/src/main/java/com/zhaow/restful/common/ChineseUtill.java similarity index 100% rename from src/java/com/zhaow/restful/common/ChineseUtill.java rename to src/main/java/com/zhaow/restful/common/ChineseUtill.java diff --git a/src/java/com/zhaow/restful/common/IntellijUtils.java b/src/main/java/com/zhaow/restful/common/IntellijUtils.java similarity index 100% rename from src/java/com/zhaow/restful/common/IntellijUtils.java rename to src/main/java/com/zhaow/restful/common/IntellijUtils.java diff --git a/src/java/com/zhaow/restful/common/KtClassHelper.java b/src/main/java/com/zhaow/restful/common/KtClassHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/KtClassHelper.java rename to src/main/java/com/zhaow/restful/common/KtClassHelper.java diff --git a/src/java/com/zhaow/restful/common/KtFunctionHelper.java b/src/main/java/com/zhaow/restful/common/KtFunctionHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/KtFunctionHelper.java rename to src/main/java/com/zhaow/restful/common/KtFunctionHelper.java diff --git a/src/java/com/zhaow/restful/common/PsiAnnotationHelper.java b/src/main/java/com/zhaow/restful/common/PsiAnnotationHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/PsiAnnotationHelper.java rename to src/main/java/com/zhaow/restful/common/PsiAnnotationHelper.java diff --git a/src/java/com/zhaow/restful/common/PsiClassHelper.java b/src/main/java/com/zhaow/restful/common/PsiClassHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/PsiClassHelper.java rename to src/main/java/com/zhaow/restful/common/PsiClassHelper.java diff --git a/src/java/com/zhaow/restful/common/PsiMethodHelper.java b/src/main/java/com/zhaow/restful/common/PsiMethodHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/PsiMethodHelper.java rename to src/main/java/com/zhaow/restful/common/PsiMethodHelper.java diff --git a/src/java/com/zhaow/restful/common/RequestHelper.java b/src/main/java/com/zhaow/restful/common/RequestHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/RequestHelper.java rename to src/main/java/com/zhaow/restful/common/RequestHelper.java diff --git a/src/java/com/zhaow/restful/common/RestSupportedAnnotationHelper.java b/src/main/java/com/zhaow/restful/common/RestSupportedAnnotationHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/RestSupportedAnnotationHelper.java rename to src/main/java/com/zhaow/restful/common/RestSupportedAnnotationHelper.java diff --git a/src/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/ServiceHelper.java rename to src/main/java/com/zhaow/restful/common/ServiceHelper.java diff --git a/src/java/com/zhaow/restful/common/ToolkitIcons.java b/src/main/java/com/zhaow/restful/common/ToolkitIcons.java similarity index 100% rename from src/java/com/zhaow/restful/common/ToolkitIcons.java rename to src/main/java/com/zhaow/restful/common/ToolkitIcons.java diff --git a/src/java/com/zhaow/restful/common/jaxrs/JaxrsAnnotationHelper.java b/src/main/java/com/zhaow/restful/common/jaxrs/JaxrsAnnotationHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/jaxrs/JaxrsAnnotationHelper.java rename to src/main/java/com/zhaow/restful/common/jaxrs/JaxrsAnnotationHelper.java diff --git a/src/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java similarity index 100% rename from src/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java rename to src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java diff --git a/src/java/com/zhaow/restful/common/resolver/JaxrsResolver.java b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java similarity index 100% rename from src/java/com/zhaow/restful/common/resolver/JaxrsResolver.java rename to src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java diff --git a/src/java/com/zhaow/restful/common/resolver/ServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java similarity index 100% rename from src/java/com/zhaow/restful/common/resolver/ServiceResolver.java rename to src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java diff --git a/src/java/com/zhaow/restful/common/resolver/SpringResolver.java b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java similarity index 100% rename from src/java/com/zhaow/restful/common/resolver/SpringResolver.java rename to src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java diff --git a/src/java/com/zhaow/restful/common/spring/AntPathMatcher.java b/src/main/java/com/zhaow/restful/common/spring/AntPathMatcher.java similarity index 100% rename from src/java/com/zhaow/restful/common/spring/AntPathMatcher.java rename to src/main/java/com/zhaow/restful/common/spring/AntPathMatcher.java diff --git a/src/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java b/src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java similarity index 100% rename from src/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java rename to src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java diff --git a/src/java/com/zhaow/restful/common/spring/StringUtils.java b/src/main/java/com/zhaow/restful/common/spring/StringUtils.java similarity index 100% rename from src/java/com/zhaow/restful/common/spring/StringUtils.java rename to src/main/java/com/zhaow/restful/common/spring/StringUtils.java diff --git a/src/java/com/zhaow/restful/highlight/JTextAreaHighlight.java b/src/main/java/com/zhaow/restful/highlight/JTextAreaHighlight.java similarity index 100% rename from src/java/com/zhaow/restful/highlight/JTextAreaHighlight.java rename to src/main/java/com/zhaow/restful/highlight/JTextAreaHighlight.java diff --git a/src/java/com/zhaow/restful/method/HttpMethod.java b/src/main/java/com/zhaow/restful/method/HttpMethod.java similarity index 100% rename from src/java/com/zhaow/restful/method/HttpMethod.java rename to src/main/java/com/zhaow/restful/method/HttpMethod.java diff --git a/src/java/com/zhaow/restful/method/Parameter.java b/src/main/java/com/zhaow/restful/method/Parameter.java similarity index 100% rename from src/java/com/zhaow/restful/method/Parameter.java rename to src/main/java/com/zhaow/restful/method/Parameter.java diff --git a/src/java/com/zhaow/restful/method/RequestPath.java b/src/main/java/com/zhaow/restful/method/RequestPath.java similarity index 100% rename from src/java/com/zhaow/restful/method/RequestPath.java rename to src/main/java/com/zhaow/restful/method/RequestPath.java diff --git a/src/java/com/zhaow/restful/method/action/GenerateFullUrlAction.java b/src/main/java/com/zhaow/restful/method/action/GenerateFullUrlAction.java similarity index 100% rename from src/java/com/zhaow/restful/method/action/GenerateFullUrlAction.java rename to src/main/java/com/zhaow/restful/method/action/GenerateFullUrlAction.java diff --git a/src/java/com/zhaow/restful/method/action/GenerateQueryParamAction.java b/src/main/java/com/zhaow/restful/method/action/GenerateQueryParamAction.java similarity index 100% rename from src/java/com/zhaow/restful/method/action/GenerateQueryParamAction.java rename to src/main/java/com/zhaow/restful/method/action/GenerateQueryParamAction.java diff --git a/src/java/com/zhaow/restful/method/action/GenerateQueryParamJsonAction.java b/src/main/java/com/zhaow/restful/method/action/GenerateQueryParamJsonAction.java similarity index 100% rename from src/java/com/zhaow/restful/method/action/GenerateQueryParamJsonAction.java rename to src/main/java/com/zhaow/restful/method/action/GenerateQueryParamJsonAction.java diff --git a/src/java/com/zhaow/restful/method/action/GenerateUrlAction.java b/src/main/java/com/zhaow/restful/method/action/GenerateUrlAction.java similarity index 100% rename from src/java/com/zhaow/restful/method/action/GenerateUrlAction.java rename to src/main/java/com/zhaow/restful/method/action/GenerateUrlAction.java diff --git a/src/java/com/zhaow/restful/method/action/ModuleHelper.java b/src/main/java/com/zhaow/restful/method/action/ModuleHelper.java similarity index 100% rename from src/java/com/zhaow/restful/method/action/ModuleHelper.java rename to src/main/java/com/zhaow/restful/method/action/ModuleHelper.java diff --git a/src/java/com/zhaow/restful/method/action/PropertiesHandler.java b/src/main/java/com/zhaow/restful/method/action/PropertiesHandler.java similarity index 100% rename from src/java/com/zhaow/restful/method/action/PropertiesHandler.java rename to src/main/java/com/zhaow/restful/method/action/PropertiesHandler.java diff --git a/src/java/com/zhaow/restful/method/action/SpringAnnotatedMethodAction.java b/src/main/java/com/zhaow/restful/method/action/SpringAnnotatedMethodAction.java similarity index 100% rename from src/java/com/zhaow/restful/method/action/SpringAnnotatedMethodAction.java rename to src/main/java/com/zhaow/restful/method/action/SpringAnnotatedMethodAction.java diff --git a/src/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java similarity index 100% rename from src/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java rename to src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java diff --git a/src/java/com/zhaow/restful/navigation/action/GotoRequestMappingConfiguration.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingConfiguration.java similarity index 100% rename from src/java/com/zhaow/restful/navigation/action/GotoRequestMappingConfiguration.java rename to src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingConfiguration.java diff --git a/src/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java similarity index 100% rename from src/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java rename to src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java diff --git a/src/java/com/zhaow/restful/navigation/action/GotoRequestMappingModel.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingModel.java similarity index 100% rename from src/java/com/zhaow/restful/navigation/action/GotoRequestMappingModel.java rename to src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingModel.java diff --git a/src/java/com/zhaow/restful/navigation/action/GotoRequestMappingProvider.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingProvider.java similarity index 100% rename from src/java/com/zhaow/restful/navigation/action/GotoRequestMappingProvider.java rename to src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingProvider.java diff --git a/src/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java b/src/main/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java similarity index 100% rename from src/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java rename to src/main/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java diff --git a/src/java/com/zhaow/restful/navigation/action/RestServiceItem.java b/src/main/java/com/zhaow/restful/navigation/action/RestServiceItem.java similarity index 100% rename from src/java/com/zhaow/restful/navigation/action/RestServiceItem.java rename to src/main/java/com/zhaow/restful/navigation/action/RestServiceItem.java diff --git a/src/java/com/zhaow/restful/navigator/CopyFullUrlAction.java b/src/main/java/com/zhaow/restful/navigator/CopyFullUrlAction.java similarity index 100% rename from src/java/com/zhaow/restful/navigator/CopyFullUrlAction.java rename to src/main/java/com/zhaow/restful/navigator/CopyFullUrlAction.java diff --git a/src/java/com/zhaow/restful/navigator/EditSourceAction.java b/src/main/java/com/zhaow/restful/navigator/EditSourceAction.java similarity index 100% rename from src/java/com/zhaow/restful/navigator/EditSourceAction.java rename to src/main/java/com/zhaow/restful/navigator/EditSourceAction.java diff --git a/src/java/com/zhaow/restful/navigator/RefreshProjectAction.java b/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java similarity index 100% rename from src/java/com/zhaow/restful/navigator/RefreshProjectAction.java rename to src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java diff --git a/src/java/com/zhaow/restful/navigator/RestServiceDetail.form b/src/main/java/com/zhaow/restful/navigator/RestServiceDetail.form similarity index 100% rename from src/java/com/zhaow/restful/navigator/RestServiceDetail.form rename to src/main/java/com/zhaow/restful/navigator/RestServiceDetail.form diff --git a/src/java/com/zhaow/restful/navigator/RestServiceDetail.java b/src/main/java/com/zhaow/restful/navigator/RestServiceDetail.java similarity index 100% rename from src/java/com/zhaow/restful/navigator/RestServiceDetail.java rename to src/main/java/com/zhaow/restful/navigator/RestServiceDetail.java diff --git a/src/java/com/zhaow/restful/navigator/RestServiceProject.java b/src/main/java/com/zhaow/restful/navigator/RestServiceProject.java similarity index 100% rename from src/java/com/zhaow/restful/navigator/RestServiceProject.java rename to src/main/java/com/zhaow/restful/navigator/RestServiceProject.java diff --git a/src/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java similarity index 100% rename from src/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java rename to src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java diff --git a/src/java/com/zhaow/restful/navigator/RestServiceStructure.java b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java similarity index 99% rename from src/java/com/zhaow/restful/navigator/RestServiceStructure.java rename to src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java index ec31e14..4b5d70c 100644 --- a/src/java/com/zhaow/restful/navigator/RestServiceStructure.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java @@ -1,6 +1,5 @@ package com.zhaow.restful.navigator; - import com.intellij.icons.AllIcons; import com.intellij.lang.java.JavaLanguage; import com.intellij.openapi.diagnostic.Logger; @@ -206,8 +205,8 @@ public class RootNode extends BaseSimpleNode { List projectNodes = new ArrayList<>(); protected RootNode() { super(null); - getTemplatePresentation().setIcon(AllIcons.Actions.Module); - setIcon(AllIcons.Actions.Module); //兼容 IDEA 2016 + getTemplatePresentation().setIcon(AllIcons.Nodes.Module); + setIcon(AllIcons.Nodes.Module); //兼容 IDEA 2016 } @Override diff --git a/src/java/com/zhaow/restful/navigator/RestServicesNavigator.java b/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java similarity index 100% rename from src/java/com/zhaow/restful/navigator/RestServicesNavigator.java rename to src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java diff --git a/src/java/com/zhaow/restful/navigator/RestServicesNavigatorPanel.java b/src/main/java/com/zhaow/restful/navigator/RestServicesNavigatorPanel.java similarity index 100% rename from src/java/com/zhaow/restful/navigator/RestServicesNavigatorPanel.java rename to src/main/java/com/zhaow/restful/navigator/RestServicesNavigatorPanel.java diff --git a/src/java/com/zhaow/restful/navigator/RestServicesNavigatorState.java b/src/main/java/com/zhaow/restful/navigator/RestServicesNavigatorState.java similarity index 100% rename from src/java/com/zhaow/restful/navigator/RestServicesNavigatorState.java rename to src/main/java/com/zhaow/restful/navigator/RestServicesNavigatorState.java diff --git a/src/java/com/zhaow/restful/popup/action/PopupChoiceAction.java b/src/main/java/com/zhaow/restful/popup/action/PopupChoiceAction.java similarity index 100% rename from src/java/com/zhaow/restful/popup/action/PopupChoiceAction.java rename to src/main/java/com/zhaow/restful/popup/action/PopupChoiceAction.java diff --git a/src/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java b/src/main/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java similarity index 100% rename from src/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java rename to src/main/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java diff --git a/src/java/com/zhaow/utils/JsonUtils.java b/src/main/java/com/zhaow/utils/JsonUtils.java similarity index 100% rename from src/java/com/zhaow/utils/JsonUtils.java rename to src/main/java/com/zhaow/utils/JsonUtils.java diff --git a/src/java/com/zhaow/utils/RestServiceDataKeys.java b/src/main/java/com/zhaow/utils/RestServiceDataKeys.java similarity index 100% rename from src/java/com/zhaow/utils/RestServiceDataKeys.java rename to src/main/java/com/zhaow/utils/RestServiceDataKeys.java diff --git a/src/java/com/zhaow/utils/RestfulToolkitBundle.java b/src/main/java/com/zhaow/utils/RestfulToolkitBundle.java similarity index 100% rename from src/java/com/zhaow/utils/RestfulToolkitBundle.java rename to src/main/java/com/zhaow/utils/RestfulToolkitBundle.java diff --git a/src/java/com/zhaow/utils/ToolkitUtil.java b/src/main/java/com/zhaow/utils/ToolkitUtil.java similarity index 100% rename from src/java/com/zhaow/utils/ToolkitUtil.java rename to src/main/java/com/zhaow/utils/ToolkitUtil.java diff --git a/src/java/com/zhaow/utils/ToolkitUtil.java.bak b/src/main/java/com/zhaow/utils/ToolkitUtil.java.bak similarity index 100% rename from src/java/com/zhaow/utils/ToolkitUtil.java.bak rename to src/main/java/com/zhaow/utils/ToolkitUtil.java.bak diff --git a/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml similarity index 99% rename from resources/META-INF/plugin.xml rename to src/main/resources/META-INF/plugin.xml index da52735..4b093bb 100644 --- a/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -1,7 +1,7 @@ com.zhaow.restful.toolkit - RestfulToolkit - 2.0.5 + RestfulDevelopmentKit + 3.0.0 zhaow - + diff --git a/resources/RestfulToolkitBundle.properties b/src/main/resources/RestfulToolkitBundle.properties similarity index 100% rename from resources/RestfulToolkitBundle.properties rename to src/main/resources/RestfulToolkitBundle.properties diff --git a/resources/icons/method/d.png b/src/main/resources/icons/method/d.png similarity index 100% rename from resources/icons/method/d.png rename to src/main/resources/icons/method/d.png diff --git a/resources/icons/method/g.png b/src/main/resources/icons/method/g.png similarity index 100% rename from resources/icons/method/g.png rename to src/main/resources/icons/method/g.png diff --git a/resources/icons/method/p.png b/src/main/resources/icons/method/p.png similarity index 100% rename from resources/icons/method/p.png rename to src/main/resources/icons/method/p.png diff --git a/resources/icons/method/p2.png b/src/main/resources/icons/method/p2.png similarity index 100% rename from resources/icons/method/p2.png rename to src/main/resources/icons/method/p2.png diff --git a/resources/icons/method/p3.png b/src/main/resources/icons/method/p3.png similarity index 100% rename from resources/icons/method/p3.png rename to src/main/resources/icons/method/p3.png diff --git a/resources/icons/method/undefined.png b/src/main/resources/icons/method/undefined.png similarity index 100% rename from resources/icons/method/undefined.png rename to src/main/resources/icons/method/undefined.png diff --git a/resources/icons/service.png b/src/main/resources/icons/service.png similarity index 100% rename from resources/icons/service.png rename to src/main/resources/icons/service.png diff --git a/resources/tips/GotoService.html b/src/main/resources/tips/GotoService.html similarity index 100% rename from resources/tips/GotoService.html rename to src/main/resources/tips/GotoService.html diff --git a/resources/tips/images/GotoService.png b/src/main/resources/tips/images/GotoService.png similarity index 100% rename from resources/tips/images/GotoService.png rename to src/main/resources/tips/images/GotoService.png diff --git a/resources/tips/images/SSHKeyUpload.png b/src/main/resources/tips/images/SSHKeyUpload.png similarity index 100% rename from resources/tips/images/SSHKeyUpload.png rename to src/main/resources/tips/images/SSHKeyUpload.png From 1d6837fcaae85fb0b34324e73a3fa18cdb3b2a04 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Fri, 12 Jun 2020 15:07:44 +0800 Subject: [PATCH 02/21] =?UTF-8?q?fix=20data=EF=BC=8Cstill=20show=20bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../zhaow/restful/common/ServiceHelper.java | 21 +++++----- .../common/resolver/BaseServiceResolver.java | 39 +++++++++++++------ .../common/resolver/SpringResolver.java | 8 ++++ .../RequestMappingAnnotationHelper.java | 15 +------ .../action/GotoRequestMappingAction.java | 2 +- .../action/GotoRequestMappingContributor.java | 4 +- .../navigator/RefreshProjectAction.java | 3 +- .../navigator/RestServiceProjectsManager.java | 15 +++---- .../navigator/RestServiceStructure.java | 27 +++++++++---- .../navigator/RestServicesNavigator.java | 27 +++++++++---- src/main/resources/META-INF/plugin.xml | 2 +- 12 files changed, 103 insertions(+), 62 deletions(-) diff --git a/build.gradle b/build.gradle index 6c924a0..af7997b 100644 --- a/build.gradle +++ b/build.gradle @@ -52,5 +52,5 @@ patchPluginXml { // 这个意思是说当前定义的这个插件最早支持到什么版本的IDEA // 这里配置sinceBuild=191,表示插件只能被版本号大于等于2019.1版本的IDEA安装,低于这个版本的将抛无法兼容的错误 // ↑上方参考这篇问答:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003338799-Build-compatible-plugin - sinceBuild "191" // 原 191 + sinceBuild "192.5728.98" // 原 191 } \ No newline at end of file diff --git a/src/main/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java index 2195d27..6be1f83 100644 --- a/src/main/java/com/zhaow/restful/common/ServiceHelper.java +++ b/src/main/java/com/zhaow/restful/common/ServiceHelper.java @@ -1,5 +1,7 @@ package com.zhaow.restful.common; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; @@ -26,22 +28,23 @@ public ServiceHelper(PsiMethod psiMethod) { this.psiMethod = psiMethod; } - public static List buildRestServiceProjectListUsingResolver(Project project) { + public static List buildRestServiceProjectListUsingResolver(Project project, AnActionEvent anActionEvent) { // System.out.println("buildRestServiceProjectList"); List serviceProjectList = new ArrayList<>(); - Module[] modules = ModuleManager.getInstance(project).getModules(); - for (Module module : modules) { - List restServices = buildRestServiceItemListUsingResolver(module); + //Module[] modules = ModuleManager.getInstance(project).getModules(); + //for (Module module : modules) { + + List restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); if (restServices.size() > 0) { - serviceProjectList.add(new RestServiceProject(module, restServices)); + serviceProjectList.add(new RestServiceProject(project.getName(), restServices)); } - } + //} return serviceProjectList; } - public static List buildRestServiceItemListUsingResolver(Module module) { + public static List buildRestServiceItemListUsingResolver(Module module, AnAction anAction) { List itemList = new ArrayList<>(); @@ -59,10 +62,10 @@ public static List buildRestServiceItemListUsingResolver(Module } @NotNull - public static List buildRestServiceItemListUsingResolver(Project project) { + public static List buildRestServiceItemListUsingResolver(Project project, AnActionEvent anAction) { List itemList = new ArrayList<>(); - SpringResolver springResolver = new SpringResolver(project); + SpringResolver springResolver = new SpringResolver(project, anAction); JaxrsResolver jaxrsResolver = new JaxrsResolver(project); ServiceResolver[] resolvers = {springResolver,jaxrsResolver}; diff --git a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java index 13a7105..90e350a 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java @@ -1,10 +1,17 @@ package com.zhaow.restful.common.resolver; +import com.intellij.ide.IdeView; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; +import com.zhaow.restful.common.FileUtils; import com.zhaow.restful.method.RequestPath; import com.zhaow.restful.navigation.action.RestServiceItem; import org.jetbrains.annotations.NotNull; @@ -15,6 +22,7 @@ public abstract class BaseServiceResolver implements ServiceResolver{ Module myModule; Project myProject; + AnActionEvent anActionEvent; @Override public List findAllSupportedServiceItemsInModule() { @@ -35,7 +43,12 @@ public List findAllSupportedServiceItemsInModule() { }); */ - itemList = getRestServiceItemList(myModule.getProject(), globalSearchScope); + //globalSearchScope = GlobalSearchScope.projectScope(myProject); + + //globalSearchScope = GlobalSearchScope.allScope(myModule.getProject()); + //itemList = getRestServiceItemList(myModule.getProject(), globalSearchScope); + + itemList = findAllSupportedServiceItemsInProject(); return itemList; } @@ -49,24 +62,26 @@ public List findAllSupportedServiceItemsInProject() { myProject = myModule.getProject(); } - if (myProject == null) { - return new ArrayList<>(); - } + if (anActionEvent == null) { return new ArrayList<>(); } - GlobalSearchScope globalSearchScope = GlobalSearchScope.projectScope(myProject); -/* List psiMethodList = this.getServicePsiMethodList(myProject, globalSearchScope); + final IdeView view = anActionEvent.getData(LangDataKeys.IDE_VIEW); - for (PsiMethod psiMethod : psiMethodList) { - List singleMethodServices = getServiceItemList(psiMethod); + if (view == null) { return new ArrayList<>(); } - itemList.addAll(singleMethodServices); + PsiDirectory directory = view.getOrChooseDirectory(); - }*/ + List allClasses = new ArrayList<>(); + if ( directory != null ) { + allClasses.addAll( FileUtils.getJavaFilesFromDir(anActionEvent.getProject(), directory) ); + } - itemList = getRestServiceItemList(myProject, globalSearchScope); + itemList = new ArrayList<>(); + for (PsiClass psiClass : allClasses) { + itemList.addAll(Convertor.getServiceItemList(psiClass)); + } - return itemList; + return itemList; } diff --git a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java index dca668e..802f163 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java @@ -1,6 +1,8 @@ package com.zhaow.restful.common.resolver; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.psi.*; @@ -35,6 +37,12 @@ public SpringResolver(Project project) { } + public SpringResolver(Project project, AnActionEvent anAction) { + myProject = project; + anActionEvent = anAction; + + } + //Note: 当Controller 类上没有标记@RequestMapping 注解时,方法上的@RequestMapping 都是绝对路径。 /*@Override diff --git a/src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java b/src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java index 707b551..7f9f4fc 100644 --- a/src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java +++ b/src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java @@ -80,18 +80,7 @@ public static String[] getRequestMappingValues(PsiClass psiClass) { private static List getRequestMappings(PsiAnnotation annotation, String defaultValue) { List mappingList = new ArrayList<>(); - SpringRequestMethodAnnotation requestAnnotation = SpringRequestMethodAnnotation.getByQualifiedName(annotation.getQualifiedName()); - - if (requestAnnotation==null) { - return new ArrayList<>(); - } - - List methodList ; - if (requestAnnotation.methodName() != null) { - methodList = Arrays.asList(requestAnnotation.methodName()) ; - } else { // RequestMapping 如果没有指定具体method,不写的话,默认支持所有HTTP请求方法 - methodList = PsiAnnotationHelper.getAnnotationAttributeValues(annotation, "method"); - } + List methodList = PsiAnnotationHelper.getAnnotationAttributeValues(annotation, "method"); List pathList = PsiAnnotationHelper.getAnnotationAttributeValues(annotation, "value"); if (pathList.size() == 0) { @@ -137,7 +126,7 @@ public static RequestPath[] getRequestPaths(PsiMethod psiMethod) { for (PsiAnnotation annotation : annotations) { for (SpringRequestMethodAnnotation mappingAnnotation : SpringRequestMethodAnnotation.values()) { // for (PathMappingAnnotation mappingAnnotation : PathMappingAnnotation.allPathMappingAnnotations) { - if (mappingAnnotation.getQualifiedName().equals(annotation.getQualifiedName())) { + if (mappingAnnotation.getQualifiedName().endsWith(annotation.getQualifiedName())) { // String defaultValue = psiMethod.getName(); String defaultValue = "/"; diff --git a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java index 2dfe3d7..a5134fc 100644 --- a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java +++ b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java @@ -31,7 +31,7 @@ public GotoRequestMappingAction() { protected void gotoActionPerformed(AnActionEvent e) { //进入导航 Project project = e.getProject(); - if (project == null) return; + if (project == null) { return ;}; FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.service"); diff --git a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java index 6212c41..303aae4 100644 --- a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java +++ b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java @@ -28,9 +28,9 @@ public String[] getNames(Project project, boolean onlyThisModuleChecked) { List itemList; ///todo 查找 project 中所有符合 rest url 类型文件,包含 request 接口 if (onlyThisModuleChecked && myModule != null) { - itemList = ServiceHelper.buildRestServiceItemListUsingResolver(myModule); + itemList = ServiceHelper.buildRestServiceItemListUsingResolver(myModule, null); } else { - itemList = ServiceHelper.buildRestServiceItemListUsingResolver(project); + itemList = ServiceHelper.buildRestServiceItemListUsingResolver(project, null); } navItem = itemList; diff --git a/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java b/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java index 99a00cd..fb51ab0 100644 --- a/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java +++ b/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java @@ -11,7 +11,7 @@ public class RefreshProjectAction extends AnAction { protected void perform(@NotNull RestServiceProjectsManager manager) { - manager.forceUpdateAllProjects(); + manager.forceUpdateAllProjects(this); } @Override @@ -25,6 +25,7 @@ public void actionPerformed(AnActionEvent e) { RestServicesNavigator servicesNavigator = RestServicesNavigator.getInstance(project); servicesNavigator.initComponent(); + servicesNavigator.atachEvent(e); servicesNavigator.scheduleStructureUpdate(); } diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java index 8980057..c7db464 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java @@ -16,6 +16,8 @@ package com.zhaow.restful.navigator; import com.intellij.openapi.Disposable; +import com.intellij.openapi.actionSystem.AnAction; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ProjectComponent; @@ -28,9 +30,9 @@ import java.util.List; @State(name = "RestServiceProjectsManager") -public class RestServiceProjectsManager extends AbstractProjectComponent - implements PersistentStateComponent, Disposable, ProjectComponent { +public class RestServiceProjectsManager implements PersistentStateComponent, Disposable, ProjectComponent { protected final Project myProject; + private AnAction anAction; @@ -41,7 +43,6 @@ public static RestServiceProjectsManager getInstance(Project p) { } public RestServiceProjectsManager(Project project) { - super(project); myProject = project; // System.out.println("RestServiceProjectsManager"); } @@ -63,9 +64,9 @@ public void loadState(RestServicesNavigatorState state) { } - public List getServiceProjects() { + public List getServiceProjects(AnActionEvent anActionEvent) { // List list = DumbService.getInstance(myProject).runReadActionInSmartMode(() -> ServiceHelper.buildRestServiceProjectList(myProject)); - List list = DumbService.getInstance(myProject).runReadActionInSmartMode(() -> ServiceHelper.buildRestServiceProjectListUsingResolver(myProject)); + List list = DumbService.getInstance(myProject).runReadActionInSmartMode(() -> ServiceHelper.buildRestServiceProjectListUsingResolver(myProject, anActionEvent)); return list; } /* @@ -77,7 +78,7 @@ public boolean hasProjects() { return getServiceProjects().size() > 0; }*/ - public void forceUpdateAllProjects() { - + public void forceUpdateAllProjects(AnAction anAction) { + this.anAction = anAction; } } diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java index 4b5d70c..5df8c21 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java @@ -2,11 +2,14 @@ import com.intellij.icons.AllIcons; import com.intellij.lang.java.JavaLanguage; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Disposer; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; +import com.intellij.ui.tree.AsyncTreeModel; +import com.intellij.ui.tree.StructureTreeModel; import com.intellij.ui.treeStructure.*; import com.intellij.util.OpenSourceUtil; import com.zhaow.restful.common.KtFunctionHelper; @@ -32,12 +35,14 @@ public class RestServiceStructure extends SimpleTreeStructure { public static final Logger LOG = Logger.getInstance(RestServiceStructure.class); - private SimpleTreeBuilder myTreeBuilder; + private StructureTreeModel myTreeBuilder; + private AsyncTreeModel asyncTreeModel; private SimpleTree myTree; private final Project myProject; private RootNode myRoot = new RootNode(); private int serviceCount = 0; + private AnActionEvent anActionEvent; private final RestServiceProjectsManager myProjectsManager; @@ -55,11 +60,13 @@ public RestServiceStructure(Project project, configureTree(tree); - myTreeBuilder = new SimpleTreeBuilder(tree, (DefaultTreeModel)tree.getModel(), this, null); + myTreeBuilder = new StructureTreeModel(this, projectsManager); + // asyncTreeModel = new AsyncTreeModel(, projectsManager); + // myTreeBuilder = new SimpleTreeBuilder(tree, (DefaultTreeModel)tree.getModel(), this, null); Disposer.register(myProject, myTreeBuilder); - myTreeBuilder.initRoot(); - myTreeBuilder.expand(myRoot, null); + // myTreeBuilder.initRoot(); + myTreeBuilder.promiseVisitor(myRoot); } @@ -73,7 +80,7 @@ public RootNode getRootElement() { return myRoot; } - public void update() { + public void update(AnActionEvent event) { // myTreeBuilder.setClearOnHideDelay(4); // myTreeBuilder.cleanUp(); // myTreeBuilder.initRoot(); @@ -93,7 +100,7 @@ public void update() { PsiDocumentManager.getInstance(myProject).commitAllDocuments(); }*/ - List projects = RestServiceProjectsManager.getInstance(myProject).getServiceProjects(); + List projects = RestServiceProjectsManager.getInstance(myProject).getServiceProjects(event); @@ -115,7 +122,8 @@ public void updateProjects(List projects) { myProjectToNodeMapping.put(each, node); } } - myTreeBuilder.getUi().doUpdateFromRoot(); + //myTreeBuilder. + //myTreeBuilder.getUi().doUpdateFromRoot(); // ((CachingSimpleNode) myRoot.getParent()).cleanUpCache(); // myRoot.childrenChanged(); myRoot.updateProjectNodes(projects); @@ -126,7 +134,10 @@ private ProjectNode findNodeFor(RestServiceProject project) { } public void updateFrom(SimpleNode node) { - myTreeBuilder.addSubtreeToUpdateByElement(node); + if (node != null) { + myTreeBuilder.promiseVisitor(node); + } + //myTreeBuilder.addSubtreeToUpdateByElement(node); } private void updateUpTo(SimpleNode node) { diff --git a/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java b/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java index 1af6c43..1b5774f 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java @@ -2,6 +2,7 @@ import com.intellij.ide.util.treeView.TreeState; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.*; import com.intellij.openapi.diagnostic.Logger; @@ -27,7 +28,7 @@ import java.net.URL; @State(name = "RestServicesNavigator", storages = {@Storage(StoragePathMacros.WORKSPACE_FILE)}) -public class RestServicesNavigator extends AbstractProjectComponent implements PersistentStateComponent, ProjectComponent { +public class RestServicesNavigator implements PersistentStateComponent, ProjectComponent { public static final Logger LOG = Logger.getInstance(RestServicesNavigator.class); public static final String TOOL_WINDOW_ID = "RestServices"; @@ -42,11 +43,11 @@ public class RestServicesNavigator extends AbstractProjectComponent implements P // private JTree myTree; protected RestServiceStructure myStructure; private ToolWindowEx myToolWindow; + private AnActionEvent anActionEvent; private RestServiceProjectsManager myProjectsManager; public RestServicesNavigator(Project myProject,RestServiceProjectsManager projectsManager) { - super(myProject); this.myProject = myProject; myProjectsManager = projectsManager; } @@ -101,11 +102,17 @@ public void initComponent() { listenForProjectsChanges(); // ToolkitUtil.runWhenInitialized(myProject, (DumbAwareRunnable)() -> { ToolkitUtil.runWhenInitialized(myProject, () -> { - if (myProject.isDisposed()) return; + if (myProject.isDisposed()) { + return; + } initToolWindow(); }); } + public void atachEvent(AnActionEvent anActionEvent) { + this.anActionEvent = anActionEvent; + } + private void initToolWindow() { final ToolWindowManagerEx manager = ToolWindowManagerEx.getInstanceEx(myProject); @@ -129,7 +136,9 @@ private void initToolWindow() { @Override public void stateChanged() { - if (myToolWindow.isDisposed()) return; + if (myToolWindow.isDisposed()) { + return; + } boolean visible = myToolWindow.isVisible(); if (!visible || wasVisible) { return; @@ -154,17 +163,21 @@ public void stateChanged() { public void scheduleStructureUpdate() { - scheduleStructureRequest(() -> myStructure.update()); + scheduleStructureRequest(() -> myStructure.update(anActionEvent)); } private void scheduleStructureRequest(final Runnable r) { - if (myToolWindow == null) return; + if (myToolWindow == null) { + return; + } // ToolkitUtil.invokeLater(myProject, () -> { // ToolkitUtil.runWhenInitialized(myProject, () -> { ToolkitUtil.runWhenProjectIsReady(myProject, () -> { - if (!myToolWindow.isVisible()) return; + if (!myToolWindow.isVisible()) { + return; + } boolean shouldCreate = myStructure == null; if (shouldCreate) { diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 4b093bb..68e1cc7 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -68,7 +68,7 @@ - + From 66319a123f8899a2d8607c779216e5c0892e72ed Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Fri, 12 Jun 2020 15:24:02 +0800 Subject: [PATCH 03/21] recover --- .../com/zhaow/restful/common/FileUtils.java | 48 +++++++++++++++++ .../restful/common/resolver/Convertor.java | 54 +++++++++++++++++++ .../navigator/RestServiceStructure.java | 16 +++--- 3 files changed, 108 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/zhaow/restful/common/FileUtils.java create mode 100644 src/main/java/com/zhaow/restful/common/resolver/Convertor.java diff --git a/src/main/java/com/zhaow/restful/common/FileUtils.java b/src/main/java/com/zhaow/restful/common/FileUtils.java new file mode 100644 index 0000000..21839f4 --- /dev/null +++ b/src/main/java/com/zhaow/restful/common/FileUtils.java @@ -0,0 +1,48 @@ +package com.zhaow.restful.common; + +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiDirectory; +import com.intellij.psi.PsiFile; +import com.intellij.psi.impl.source.PsiJavaFileImpl; +import com.intellij.psi.search.GlobalSearchScope; +import com.intellij.psi.search.PsiShortNamesCache; + +import java.util.ArrayList; +import java.util.List; + +public class FileUtils { + + /** + * 提取java文件 + * @param project + * @param directory + * @return + */ + public static List getJavaFilesFromDir(Project project, PsiDirectory directory) { + List psiClasses = new ArrayList<>(); + if ( directory != null) { + for ( PsiFile file : directory.getFiles() ) { + if ( !file.getFileType().getName().equals("JAVA") ) { + continue; + } + + String name = file.getName().split("\\.")[0]; + + PsiClass[] classes = ((PsiJavaFileImpl) file).getClasses(); + //PsiClass[] classes = PsiShortNamesCache.getInstance(project).getClassesByName(name, GlobalSearchScope.fileScope(file)); + + if ( classes.length > 0) { + psiClasses.add( classes[0] ); + } + } + + if ( directory.getSubdirectories() != null && directory.getSubdirectories().length > 0 ) { + for ( PsiDirectory subDir : directory.getSubdirectories() ) { + psiClasses.addAll( getJavaFilesFromDir(project, subDir) ); + } + } + } + return psiClasses; + } +} diff --git a/src/main/java/com/zhaow/restful/common/resolver/Convertor.java b/src/main/java/com/zhaow/restful/common/resolver/Convertor.java new file mode 100644 index 0000000..79a096c --- /dev/null +++ b/src/main/java/com/zhaow/restful/common/resolver/Convertor.java @@ -0,0 +1,54 @@ +package com.zhaow.restful.common.resolver; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiMethod; +import com.zhaow.restful.common.spring.RequestMappingAnnotationHelper; +import com.zhaow.restful.method.RequestPath; +import com.zhaow.restful.navigation.action.RestServiceItem; + +import java.util.ArrayList; +import java.util.List; + +public class Convertor { + + public static List getServiceItemList(PsiClass psiClass) { + + PsiMethod[] psiMethods = psiClass.getMethods(); + if (psiMethods == null) { + return new ArrayList<>(); + } + + List itemList = new ArrayList<>(); + List classRequestPaths = RequestMappingAnnotationHelper.getRequestPaths(psiClass); + + for (PsiMethod psiMethod : psiMethods) { + RequestPath[] methodRequestPaths = RequestMappingAnnotationHelper.getRequestPaths(psiMethod); + + for (RequestPath classRequestPath : classRequestPaths) { + for (RequestPath methodRequestPath : methodRequestPaths) { + String path = classRequestPath.getPath(); +// String path = tryReplacePlaceholderValueInPath( classRequestPath.getPath() ); + + RestServiceItem item = createRestServiceItem(psiMethod, path, methodRequestPath); + itemList.add(item); + } + } + + } + return itemList; + } + + private static RestServiceItem createRestServiceItem(PsiElement psiMethod, String classUriPath, RequestPath requestMapping) { + if (!classUriPath.startsWith("/")) classUriPath = "/".concat(classUriPath); + if (!classUriPath.endsWith("/")) classUriPath = classUriPath.concat("/"); + + String methodPath = requestMapping.getPath(); + + if (methodPath.startsWith("/")) methodPath = methodPath.substring(1, methodPath.length()); + String requestPath = classUriPath + methodPath; + + RestServiceItem item = new RestServiceItem(psiMethod, requestMapping.getMethod(), requestPath); + return item; + } +} diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java index 5df8c21..07f420a 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java @@ -35,7 +35,7 @@ public class RestServiceStructure extends SimpleTreeStructure { public static final Logger LOG = Logger.getInstance(RestServiceStructure.class); - private StructureTreeModel myTreeBuilder; + private SimpleTreeBuilder myTreeBuilder; private AsyncTreeModel asyncTreeModel; private SimpleTree myTree; @@ -60,13 +60,12 @@ public RestServiceStructure(Project project, configureTree(tree); - myTreeBuilder = new StructureTreeModel(this, projectsManager); - // asyncTreeModel = new AsyncTreeModel(, projectsManager); - // myTreeBuilder = new SimpleTreeBuilder(tree, (DefaultTreeModel)tree.getModel(), this, null); + myTreeBuilder = new SimpleTreeBuilder(tree, (DefaultTreeModel)tree.getModel(), this, null); Disposer.register(myProject, myTreeBuilder); - // myTreeBuilder.initRoot(); - myTreeBuilder.promiseVisitor(myRoot); + myTreeBuilder.initRoot(); + myTreeBuilder.expand(myRoot, null); + } @@ -134,10 +133,7 @@ private ProjectNode findNodeFor(RestServiceProject project) { } public void updateFrom(SimpleNode node) { - if (node != null) { - myTreeBuilder.promiseVisitor(node); - } - //myTreeBuilder.addSubtreeToUpdateByElement(node); + myTreeBuilder.addSubtreeToUpdateByElement(node); } private void updateUpTo(SimpleNode node) { From 85423492e9b5c7c7c93b3e5500a6b36b99f419d2 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Fri, 12 Jun 2020 15:26:45 +0800 Subject: [PATCH 04/21] rename to WebDevelopmentKit (WDK) --- src/main/resources/META-INF/plugin.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 68e1cc7..e2613a0 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -1,6 +1,6 @@ com.zhaow.restful.toolkit - RestfulDevelopmentKit + WebDevelopmentKit (WDK) 3.0.0 zhaow From cd4f1c771df224fe32323887272aa154b4aa8de7 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Fri, 12 Jun 2020 20:50:43 +0800 Subject: [PATCH 05/21] format code --- .DS_Store | Bin 6148 -> 6148 bytes .../com/zhaow/restful/common/FileUtils.java | 13 +- .../common/resolver/BaseServiceResolver.java | 56 ++++---- .../common/resolver/JaxrsResolver.java | 93 +++----------- .../common/resolver/ServiceResolver.java | 8 +- .../common/resolver/SpringResolver.java | 120 ++--------------- .../navigator/RefreshProjectAction.java | 4 - .../navigator/RestServiceProjectsManager.java | 65 ++++------ .../navigator/RestServiceStructure.java | 121 ++++-------------- .../navigator/RestServicesNavigator.java | 51 ++------ 10 files changed, 127 insertions(+), 404 deletions(-) diff --git a/.DS_Store b/.DS_Store index 9cd4c22395e86236cf2cbbb7e9032f3247680943..9e0ce9600d0d74c0fdef01f05dccc679b57fcbef 100644 GIT binary patch delta 41 xcmZoMXffEZhf#!;A&H@sA(J78Atf!PI5{alKZkMi4Mu&oi47c^**X650{{m`4D<; diff --git a/src/main/java/com/zhaow/restful/common/FileUtils.java b/src/main/java/com/zhaow/restful/common/FileUtils.java index 21839f4..e25257f 100644 --- a/src/main/java/com/zhaow/restful/common/FileUtils.java +++ b/src/main/java/com/zhaow/restful/common/FileUtils.java @@ -5,9 +5,6 @@ import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.PsiJavaFileImpl; -import com.intellij.psi.search.GlobalSearchScope; -import com.intellij.psi.search.PsiShortNamesCache; - import java.util.ArrayList; import java.util.List; @@ -15,22 +12,18 @@ public class FileUtils { /** * 提取java文件 - * @param project + * * @param directory * @return */ - public static List getJavaFilesFromDir(Project project, PsiDirectory directory) { + public static List getJavaFilesFromDir(PsiDirectory directory) { List psiClasses = new ArrayList<>(); if ( directory != null) { for ( PsiFile file : directory.getFiles() ) { if ( !file.getFileType().getName().equals("JAVA") ) { continue; } - - String name = file.getName().split("\\.")[0]; - PsiClass[] classes = ((PsiJavaFileImpl) file).getClasses(); - //PsiClass[] classes = PsiShortNamesCache.getInstance(project).getClassesByName(name, GlobalSearchScope.fileScope(file)); if ( classes.length > 0) { psiClasses.add( classes[0] ); @@ -39,7 +32,7 @@ public static List getJavaFilesFromDir(Project project, PsiDirectory d if ( directory.getSubdirectories() != null && directory.getSubdirectories().length > 0 ) { for ( PsiDirectory subDir : directory.getSubdirectories() ) { - psiClasses.addAll( getJavaFilesFromDir(project, subDir) ); + psiClasses.addAll( getJavaFilesFromDir(subDir) ); } } } diff --git a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java index 90e350a..64ab1fc 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java @@ -19,7 +19,7 @@ import java.util.ArrayList; import java.util.List; -public abstract class BaseServiceResolver implements ServiceResolver{ +public abstract class BaseServiceResolver implements ServiceResolver { Module myModule; Project myProject; AnActionEvent anActionEvent; @@ -31,68 +31,60 @@ public List findAllSupportedServiceItemsInModule() { return itemList; } - GlobalSearchScope globalSearchScope = GlobalSearchScope.moduleScope(myModule); -/* - - List psiMethodList = this.getServicePsiMethodList(myModule.getProject(), globalSearchScope); - - // 尴尬了,PsiMethod 不能直接获取到 Module,暂时通过传参的方式 - psiMethodList.forEach(psiMethod -> { - List serviceItemList = getServiceItemList(psiMethod); - itemList.addAll(serviceItemList); - }); -*/ - - //globalSearchScope = GlobalSearchScope.projectScope(myProject); - - //globalSearchScope = GlobalSearchScope.allScope(myModule.getProject()); - //itemList = getRestServiceItemList(myModule.getProject(), globalSearchScope); - itemList = findAllSupportedServiceItemsInProject(); return itemList; } - - public abstract List getRestServiceItemList(Project project, GlobalSearchScope globalSearchScope) ; + public abstract List getRestServiceItemList(Project project, GlobalSearchScope globalSearchScope); @Override public List findAllSupportedServiceItemsInProject() { List itemList = null; - if(myProject == null && myModule != null){ + if (myProject == null && myModule != null) { myProject = myModule.getProject(); } - if (anActionEvent == null) { return new ArrayList<>(); } + if (anActionEvent == null) { + return new ArrayList<>(); + } final IdeView view = anActionEvent.getData(LangDataKeys.IDE_VIEW); - if (view == null) { return new ArrayList<>(); } + if (view == null) { + return new ArrayList<>(); + } PsiDirectory directory = view.getOrChooseDirectory(); List allClasses = new ArrayList<>(); - if ( directory != null ) { - allClasses.addAll( FileUtils.getJavaFilesFromDir(anActionEvent.getProject(), directory) ); + if (directory != null) { + allClasses.addAll(FileUtils.getJavaFilesFromDir(directory)); } itemList = new ArrayList<>(); - for (PsiClass psiClass : allClasses) { + for (PsiClass psiClass : allClasses) { itemList.addAll(Convertor.getServiceItemList(psiClass)); } - return itemList; + return itemList; } @NotNull protected RestServiceItem createRestServiceItem(PsiElement psiMethod, String classUriPath, RequestPath requestMapping) { - if (!classUriPath.startsWith("/")) classUriPath = "/".concat(classUriPath); - if (!classUriPath.endsWith("/")) classUriPath = classUriPath.concat("/"); + if (!classUriPath.startsWith("/")) { + classUriPath = "/".concat(classUriPath); + } + if (!classUriPath.endsWith("/")) { + classUriPath = classUriPath.concat("/"); + } String methodPath = requestMapping.getPath(); - if (methodPath.startsWith("/")) methodPath = methodPath.substring(1, methodPath.length()); + if (methodPath.startsWith("/")) { + methodPath = methodPath.substring(1, methodPath.length()); + } String requestPath = classUriPath + methodPath; RestServiceItem item = new RestServiceItem(psiMethod, requestMapping.getMethod(), requestPath); @@ -102,8 +94,4 @@ protected RestServiceItem createRestServiceItem(PsiElement psiMethod, String cla return item; } -/* - protected abstract List getServiceItemList(PsiMethod psiMethod); - - protected abstract List getServicePsiMethodList(Project myProject, GlobalSearchScope globalSearchScope);*/ } diff --git a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java index e90c001..3563d52 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java @@ -15,9 +15,7 @@ import java.util.Collection; import java.util.List; -//import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; - -public class JaxrsResolver extends BaseServiceResolver { +public class JaxrsResolver extends BaseServiceResolver { public JaxrsResolver(Module module) { myModule = module; @@ -27,92 +25,37 @@ public JaxrsResolver(Project project) { myProject = project; } - /* - protected List getServiceItemList(PsiMethod psiMethod) { - List itemList = new ArrayList<>(); - - String classUriPath = JaxrsAnnotationHelper.getClassUriPath(psiMethod.getContainingClass()); - - RequestPath[] methodUriPaths = JaxrsAnnotationHelper.getRequestPaths(psiMethod); - - for (RequestPath methodUriPath : methodUriPaths) { - RestServiceItem item = createRestServiceItem(psiMethod, classUriPath, methodUriPath); - itemList.add(item); - } - - return itemList; - }*/ - - /*@NotNull - public List getServicePsiMethodList(Project project, GlobalSearchScope globalSearchScope) { - List psiMethodList = new ArrayList<>(); - - for (PathMappingAnnotation supportedAnnotation : JaxrsPathAnnotation.values()) { - -// 标注了 jaxrs Path 注解的类 - Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(supportedAnnotation.getShortName(), project, globalSearchScope); - - for (PsiAnnotation psiAnnotation : psiAnnotations) { - PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); - PsiElement psiElement = psiModifierList.getParent(); -// System.out.println("psiElement : "+ psiElement); - - if (!(psiElement instanceof PsiClass)) continue; - - PsiClass psiClass = (PsiClass) psiElement; - PsiMethod[] psiMethods = psiClass.getMethods(); - - if (psiMethods == null) { - continue; - } - - psiMethodList.addAll(Arrays.asList(psiMethods)); - - } - } - return psiMethodList; - }*/ - - @Override public List getRestServiceItemList(Project project, GlobalSearchScope globalSearchScope) { List itemList = new ArrayList<>(); -// for (PathMappingAnnotation supportedAnnotation : JaxrsPathAnnotation.values()) { - -// 标注了 jaxrs Path 注解的类 -// Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(supportedAnnotation.getShortName(), project, globalSearchScope); - Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, globalSearchScope); + Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, globalSearchScope); - for (PsiAnnotation psiAnnotation : psiAnnotations) { - PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); - PsiElement psiElement = psiModifierList.getParent(); + for (PsiAnnotation psiAnnotation : psiAnnotations) { + PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); + PsiElement psiElement = psiModifierList.getParent(); - if (!(psiElement instanceof PsiClass)) continue; + if (!(psiElement instanceof PsiClass)) continue; - PsiClass psiClass = (PsiClass) psiElement; - PsiMethod[] psiMethods = psiClass.getMethods(); - - if (psiMethods == null) { - continue; - } + PsiClass psiClass = (PsiClass) psiElement; + PsiMethod[] psiMethods = psiClass.getMethods(); -// psiMethodList.addAll(Arrays.asList(psiMethods)); + if (psiMethods == null) { + continue; + } - String classUriPath = JaxrsAnnotationHelper.getClassUriPath(psiClass); + String classUriPath = JaxrsAnnotationHelper.getClassUriPath(psiClass); - for (PsiMethod psiMethod : psiMethods) { - RequestPath[] methodUriPaths = JaxrsAnnotationHelper.getRequestPaths(psiMethod); + for (PsiMethod psiMethod : psiMethods) { + RequestPath[] methodUriPaths = JaxrsAnnotationHelper.getRequestPaths(psiMethod); - for (RequestPath methodUriPath : methodUriPaths) { - RestServiceItem item = createRestServiceItem(psiMethod, classUriPath, methodUriPath); - itemList.add(item); - } + for (RequestPath methodUriPath : methodUriPaths) { + RestServiceItem item = createRestServiceItem(psiMethod, classUriPath, methodUriPath); + itemList.add(item); } - } -// } + } return itemList; } diff --git a/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java index 44ba538..a953c46 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java @@ -6,9 +6,13 @@ public interface ServiceResolver { - /* 获取module 中所有的服务列表 */ + /** + * 获取module 中所有的服务列表 + */ List findAllSupportedServiceItemsInModule(); - /* 获取project 中所有的服务列表 */ + /** + * 获取project 中所有的服务列表 + * */ List findAllSupportedServiceItemsInProject(); } diff --git a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java index 802f163..da8e50e 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java @@ -1,7 +1,5 @@ package com.zhaow.restful.common.resolver; - -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -23,10 +21,10 @@ import java.util.Collections; import java.util.List; -public class SpringResolver extends BaseServiceResolver { -/* Module myModule; - Project myProject;*/ - PropertiesHandler propertiesHandler ; +public class SpringResolver extends BaseServiceResolver { + + PropertiesHandler propertiesHandler; + public SpringResolver(Module module) { myModule = module; propertiesHandler = new PropertiesHandler(module); @@ -43,88 +41,6 @@ public SpringResolver(Project project, AnActionEvent anAction) { } - - //Note: 当Controller 类上没有标记@RequestMapping 注解时,方法上的@RequestMapping 都是绝对路径。 - /*@Override - public List getServiceItemList(PsiMethod psiMethod) { - List itemList = new ArrayList<>(); - - RequestPath[] methodRequestPaths = RequestMappingAnnotationHelper.getRequestPaths(psiMethod); - - //TODO: controller 没有设置requestMapping,默认“/” - // TODO : controller 设置了(rest)controller 所有方法未指定 requestMapping,所有方法均匹配; 存在方法指定 requestMapping,则只解析这些方法; -// String[] controllerPaths = RequestMappingAnnotationHelper.getRequestPaths(psiMethod.getContainingClass()); - List classRequestPaths = RequestMappingAnnotationHelper.getRequestPaths(psiMethod.getContainingClass()); - for (RequestPath classRequestPath : classRequestPaths) { - for (RequestPath methodRequestPath : methodRequestPaths) { - String path = classRequestPath.getPath(); -// String path = tryReplacePlaceholderValueInPath( classRequestPath.getPath() ); - - RestServiceItem item = createRestServiceItem(psiMethod, path, methodRequestPath); - itemList.add(item); - } - } - - return itemList; - }*/ - - - /* - private String tryReplacePlaceholderValueInPath(String path) { - if (!path.contains("${")) return path; - - StringBuilder cleanerPath = new StringBuilder(); - - for (String s : path.split("\\$\\{")) { - if (s.contains("}")) { - String placeholder = s.substring(0, s.indexOf("}")); - String theOther = s.substring(s.indexOf("}")+1); - - String propertyValue = propertiesHandler.getProperty(placeholder); - - cleanerPath.append(StringUtils.isEmpty(propertyValue) ? s : propertyValue.trim()).append(theOther); - } else { - cleanerPath.append(s); - } - } - return cleanerPath.toString(); - }*/ - - -/* @NotNull -// @Override - public List getServicePsiMethodList(Project project, GlobalSearchScope globalSearchScope) { - List psiMethodList = new ArrayList<>(); - //TODO : 这块需要改写,支持更多注解方式。 - // TODO: 这种实现的局限了其他方式实现的url映射(xml(类似struts),webflux routers) - SpringControllerAnnotation[] supportedAnnotations = SpringControllerAnnotation.values(); - // for (SpringControllerAnnotation controllerAnnotations : SpringControllerAnnotation.values()) { - for (PathMappingAnnotation controllerAnnotation : supportedAnnotations) { - - // 标注了 (Rest)Controller 注解的类,即 Controller 类 - Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(controllerAnnotation.getShortName(), project, globalSearchScope); - for (PsiAnnotation psiAnnotation : psiAnnotations) { - PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); - PsiElement psiElement = psiModifierList.getParent(); - - *//*if (!(psiElement instanceof PsiClass)) continue; // RestController annotation 只出现在class*//* - PsiClass psiClass = (PsiClass) psiElement; - PsiMethod[] psiMethods = psiClass.getMethods(); - // FIXME: 这里应该只包含 设置了,requstmapping的方法,除非所有方法都没标注 requstmapping - if (psiMethods == null) { - continue; - } - - for (PsiMethod psiMethod : psiMethods) { - // todo: 没有处理同时标注了 GET 和 POST 两种方法的方法,定义一个 RequestMapping 类{method,path} - psiMethodList.add(psiMethod); - } - } - - } - return psiMethodList; - }*/ - @Override public List getRestServiceItemList(Project project, GlobalSearchScope globalSearchScope) { List itemList = new ArrayList<>(); @@ -139,7 +55,6 @@ public List getRestServiceItemList(Project project, GlobalSearc PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); PsiElement psiElement = psiModifierList.getParent(); - /*if (!(psiElement instanceof PsiClass)) continue; // RestController annotation 只出现在 class*/ PsiClass psiClass = (PsiClass) psiElement; List serviceItemList = getServiceItemList(psiClass); itemList.addAll(serviceItemList); @@ -164,12 +79,7 @@ public List getRestServiceItemList(Project project, GlobalSearc } } } -/* - PsiClass psiClass = LightClassUtilsKt.toLightClass(ktClass); - itemList.addAll(getServiceItemList(psiClass));*/ - } - } return itemList; @@ -190,8 +100,7 @@ protected List getServiceItemList(PsiClass psiClass) { for (RequestPath classRequestPath : classRequestPaths) { for (RequestPath methodRequestPath : methodRequestPaths) { - String path = classRequestPath.getPath(); -// String path = tryReplacePlaceholderValueInPath( classRequestPath.getPath() ); + String path = classRequestPath.getPath(); RestServiceItem item = createRestServiceItem(psiMethod, path, methodRequestPath); itemList.add(item); @@ -221,7 +130,7 @@ private List getRequestPaths(KtClass ktClass) { //方法注解 List annotationEntries = ktClass.getModifierList().getAnnotationEntries(); - List requestPaths = getRequestMappings( defaultPath, annotationEntries); + List requestPaths = getRequestMappings(defaultPath, annotationEntries); return requestPaths; } @@ -231,11 +140,11 @@ private List getRequestPaths(KtNamedFunction fun) { String defaultPath = "/"; //方法注解 List annotationEntries = fun.getModifierList().getAnnotationEntries(); - List requestPaths = getRequestMappings( defaultPath, annotationEntries); + List requestPaths = getRequestMappings(defaultPath, annotationEntries); return requestPaths; } - private List getRequestMappings(String defaultPath, List annotationEntries) { + private List getRequestMappings(String defaultPath, List annotationEntries) { List requestPaths = new ArrayList<>(); for (KtAnnotationEntry entry : annotationEntries) { // List requestMappings = getRequestMappings(defaultPath, entry); @@ -342,7 +251,6 @@ private List getRequestMappings(String defaultPath, List getRequestMappings(String defaultPath, KtAnnotationEntry entry) { List requestPaths = new ArrayList<>(); List methodList = new ArrayList<>(); @@ -357,14 +265,14 @@ private List getRequestMappings(String defaultPath, KtAnnotationEnt if (requestMethodAnnotation.methodName() != null) { // GetMapping PostMapping ... methodList.add(requestMethodAnnotation.methodName()); } else { - methodList.addAll(getAttributeValues( entry, "method") ); // RequestMapping + methodList.addAll(getAttributeValues(entry, "method")); // RequestMapping } //注解参数值 // KtValueArgumentList valueArgumentList = entry.getValueArgumentList(); if (entry.getValueArgumentList() != null) { List mappingValues = getAttributeValues(entry, null); - if(!mappingValues.isEmpty() ) + if (!mappingValues.isEmpty()) pathList.addAll(mappingValues); else pathList.addAll(getAttributeValues(entry, "value")); // path @@ -372,7 +280,7 @@ private List getRequestMappings(String defaultPath, KtAnnotationEnt pathList.addAll(getAttributeValues(entry, "path")); // path } - if(pathList.isEmpty()) pathList.add(defaultPath); //没指定参数 + if (pathList.isEmpty()) pathList.add(defaultPath); //没指定参数 if (methodList.size() > 0) { for (String method : methodList) { @@ -392,7 +300,7 @@ private List getRequestMappings(String defaultPath, KtAnnotationEnt private List getAttributeValues(KtAnnotationEntry entry, String attribute) { KtValueArgumentList valueArgumentList = entry.getValueArgumentList(); - if(valueArgumentList == null) return Collections.emptyList(); + if (valueArgumentList == null) return Collections.emptyList(); List arguments = valueArgumentList.getArguments(); @@ -402,7 +310,7 @@ private List getAttributeValues(KtAnnotationEntry entry, String attribut KtExpression argumentExpression = ktValueArgument.getArgumentExpression(); - if (( argumentName == null && attribute == null ) || (argumentName != null && argumentName.getText().equals(attribute) ) ) { + if ((argumentName == null && attribute == null) || (argumentName != null && argumentName.getText().equals(attribute))) { List methodList = new ArrayList<>(); // array, kotlin 1.1- if (argumentExpression.getText().startsWith("arrayOf")) { @@ -420,7 +328,7 @@ private List getAttributeValues(KtAnnotationEntry entry, String attribut // 有且仅有一个value PsiElement[] paths = ktValueArgument.getArgumentExpression().getChildren(); // Arrays.stream(paths).forEach(p -> methodList.add(p.getText())); - methodList.add(paths.length==0? "" : paths[0].getText()); + methodList.add(paths.length == 0 ? "" : paths[0].getText()); } return methodList; diff --git a/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java b/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java index fb51ab0..abd2814 100644 --- a/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java +++ b/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java @@ -18,10 +18,6 @@ protected void perform(@NotNull RestServiceProjectsManager manager) { public void actionPerformed(AnActionEvent e) { final Project project = getProject(e.getDataContext()); - /*if(project == null) return ; - RestServiceProjectsManager manager = RestServiceProjectsManager.getInstance(project); - perform(manager);*/ - RestServicesNavigator servicesNavigator = RestServicesNavigator.getInstance(project); servicesNavigator.initComponent(); diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java index c7db464..276e6ab 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java @@ -31,54 +31,43 @@ @State(name = "RestServiceProjectsManager") public class RestServiceProjectsManager implements PersistentStateComponent, Disposable, ProjectComponent { - protected final Project myProject; - private AnAction anAction; + protected final Project myProject; + private AnAction anAction; + private RestServicesNavigatorState myState = new RestServicesNavigatorState(); + public static RestServiceProjectsManager getInstance(Project p) { + return p.getComponent(RestServiceProjectsManager.class); + } - - private RestServicesNavigatorState myState = new RestServicesNavigatorState(); - - public static RestServiceProjectsManager getInstance(Project p) { - return p.getComponent(RestServiceProjectsManager.class); - } - - public RestServiceProjectsManager(Project project) { - myProject = project; + public RestServiceProjectsManager(Project project) { + myProject = project; // System.out.println("RestServiceProjectsManager"); - } + } - @Override - public void dispose() { + @Override + public void dispose() { - } + } - @Nullable - @Override - public RestServicesNavigatorState getState() { - return null; - } + @Nullable + @Override + public RestServicesNavigatorState getState() { + return null; + } - @Override - public void loadState(RestServicesNavigatorState state) { + @Override + public void loadState(RestServicesNavigatorState state) { - } + } - public List getServiceProjects(AnActionEvent anActionEvent) { -// List list = DumbService.getInstance(myProject).runReadActionInSmartMode(() -> ServiceHelper.buildRestServiceProjectList(myProject)); - List list = DumbService.getInstance(myProject).runReadActionInSmartMode(() -> ServiceHelper.buildRestServiceProjectListUsingResolver(myProject, anActionEvent)); - return list; - } -/* - public boolean hasProjects() { - if (! myProject.isInitialized()) { - return false; + public List getServiceProjects(AnActionEvent anActionEvent) { + return DumbService.getInstance(myProject).runReadActionInSmartMode(() -> + ServiceHelper.buildRestServiceProjectListUsingResolver(myProject, anActionEvent)); } - System.out.println("======hasProjects====="); - return getServiceProjects().size() > 0; - }*/ - public void forceUpdateAllProjects(AnAction anAction) { - this.anAction = anAction; - } + + public void forceUpdateAllProjects(AnAction anAction) { + this.anAction = anAction; + } } diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java index 07f420a..ced2813 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java @@ -32,7 +32,7 @@ import java.util.List; import java.util.Map; -public class RestServiceStructure extends SimpleTreeStructure { +public class RestServiceStructure extends SimpleTreeStructure { public static final Logger LOG = Logger.getInstance(RestServiceStructure.class); private SimpleTreeBuilder myTreeBuilder; @@ -40,13 +40,13 @@ public class RestServiceStructure extends SimpleTreeStructure { private SimpleTree myTree; private final Project myProject; - private RootNode myRoot = new RootNode(); + private RootNode myRoot = new RootNode(); private int serviceCount = 0; private AnActionEvent anActionEvent; private final RestServiceProjectsManager myProjectsManager; - RestServiceDetail myRestServiceDetail ; + RestServiceDetail myRestServiceDetail; private final Map myProjectToNodeMapping = new THashMap<>(); @@ -60,13 +60,11 @@ public RestServiceStructure(Project project, configureTree(tree); - myTreeBuilder = new SimpleTreeBuilder(tree, (DefaultTreeModel)tree.getModel(), this, null); + myTreeBuilder = new SimpleTreeBuilder(tree, (DefaultTreeModel) tree.getModel(), this, null); Disposer.register(myProject, myTreeBuilder); myTreeBuilder.initRoot(); myTreeBuilder.expand(myRoot, null); - - } private void configureTree(SimpleTree tree) { @@ -80,51 +78,21 @@ public RootNode getRootElement() { } public void update(AnActionEvent event) { -// myTreeBuilder.setClearOnHideDelay(4); -// myTreeBuilder.cleanUp(); -// myTreeBuilder.initRoot(); -// myTreeBuilder.expand(myRoot, null); - // rest service controller -/* - SimpleTree tree1 = new SimpleTree(); - myRoot = new RootNode(); - myTreeBuilder = new SimpleTreeBuilder(tree1, (DefaultTreeModel)tree1.getModel(), this, null); - Disposer.register(myProject, myTreeBuilder); - - myTreeBuilder.initRoot(); - myTreeBuilder.expand(myRoot, null);*/ -// List projects = myProjectsManager.getProjects(); -// List projects = RestServiceProjectsManager.getInstance(myProject).getProjects(); -/* if (!ModalityState.current().equals(ModalityState.any()) && myProject.isInitialized()) { - PsiDocumentManager.getInstance(myProject).commitAllDocuments(); - }*/ - List projects = RestServiceProjectsManager.getInstance(myProject).getServiceProjects(event); - - - -// Set deleted = new HashSet<>(myProjectToNodeMapping.keySet()); -// deleted.removeAll(projects); updateProjects(projects); } public void updateProjects(List projects) { serviceCount = 0; -// DefaultMutableTreeNode rootTreeNode = createTreeNode("REST Services"); -// myTreeBuilder.addSubtreeToUpdate(rootTreeNode); for (RestServiceProject each : projects) { serviceCount += each.serviceItems.size(); ProjectNode node = findNodeFor(each); if (node == null) { - node = new ProjectNode(myRoot,each); + node = new ProjectNode(myRoot, each); myProjectToNodeMapping.put(each, node); } } - //myTreeBuilder. - //myTreeBuilder.getUi().doUpdateFromRoot(); -// ((CachingSimpleNode) myRoot.getParent()).cleanUpCache(); -// myRoot.childrenChanged(); myRoot.updateProjectNodes(projects); } @@ -133,16 +101,14 @@ private ProjectNode findNodeFor(RestServiceProject project) { } public void updateFrom(SimpleNode node) { - myTreeBuilder.addSubtreeToUpdateByElement(node); + if (node != null) { + myTreeBuilder.addSubtreeToUpdateByElement(node); + } } private void updateUpTo(SimpleNode node) { SimpleNode each = node; while (each != null) { - SimpleNode parent = each.getParent(); - /*if (parent != null) { - ((BaseSimpleNode)parent).cleanUpCache(); - }*/ updateFrom(each); each = each.getParent(); } @@ -155,8 +121,7 @@ public static List getSelectedNodes(SimpleTree tre filtered.clear(); break; } - //noinspection unchecked - filtered.add((T)node); + filtered.add((T) node); } return filtered; } @@ -173,7 +138,7 @@ private static List getSelectedNodes(SimpleTree tree) { } - public abstract class BaseSimpleNode extends CachingSimpleNode{ + public abstract class BaseSimpleNode extends CachingSimpleNode { protected BaseSimpleNode(SimpleNode aParent) { super(aParent); @@ -200,7 +165,7 @@ protected void childrenChanged() { BaseSimpleNode each = this; while (each != null) { each.cleanUpCache(); - each = (BaseSimpleNode)each.getParent(); + each = (BaseSimpleNode) each.getParent(); } updateUpTo(this); } @@ -209,7 +174,8 @@ protected void childrenChanged() { public class RootNode extends BaseSimpleNode { - List projectNodes = new ArrayList<>(); + List projectNodes = new ArrayList<>(); + protected RootNode() { super(null); getTemplatePresentation().setIcon(AllIcons.Nodes.Module); @@ -224,34 +190,24 @@ protected SimpleNode[] buildChildren() { @Override public String getName() { String s = "Found %d services ";// in {controllerCount} Controllers"; - return serviceCount > 0 ? String.format(s,serviceCount) : null; + return serviceCount > 0 ? String.format(s, serviceCount) : null; } @Override public void handleSelection(SimpleTree tree) { -// System.out.println("ProjectNode handleSelection"); resetRestServiceDetail(); } public void updateProjectNodes(List projects) { -// cleanUpCache(); projectNodes.clear(); for (RestServiceProject project : projects) { - ProjectNode projectNode = new ProjectNode(this,project); + ProjectNode projectNode = new ProjectNode(this, project); projectNodes.add(projectNode); } -// projectNode.updateServiceNodes(); - - /*SimpleNode parent = getParent(); - if (parent != null) { - ((BaseSimpleNode)parent).cleanUpCache(); - }*/ updateFrom(getParent()); childrenChanged(); -// updateUpTo(this); - } } @@ -261,8 +217,7 @@ public class ProjectNode extends BaseSimpleNode { RestServiceProject myProject; - public ProjectNode(SimpleNode parent,/*,List serviceItems*/RestServiceProject project) { -// super(parent); + public ProjectNode(SimpleNode parent, RestServiceProject project) { super(parent); myProject = project; @@ -275,19 +230,14 @@ public ProjectNode(SimpleNode parent,/*,List serviceItems*/Rest private void updateServiceNodes(List serviceItems) { serviceNodes.clear(); for (RestServiceItem serviceItem : serviceItems) { - serviceNodes.add(new ServiceNode(this,serviceItem)); + serviceNodes.add(new ServiceNode(this, serviceItem)); } - /* for (int i = 0; i < 4; i++) { - serviceNodes.add(new ServiceNode(this)); - }*/ SimpleNode parent = getParent(); if (parent != null) { - ((BaseSimpleNode)parent).cleanUpCache(); + ((BaseSimpleNode) parent).cleanUpCache(); } updateFrom(parent); -// childrenChanged(); -// updateUpTo(this); } @Override @@ -307,22 +257,14 @@ public String getName() { protected String getActionId() { return "Toolkit.RefreshServices"; } -/* - @Override - @Nullable - @NonNls - protected String getMenuId() { - return "Toolkit.ReimportServices"; - }*/ @Override public void handleSelection(SimpleTree tree) { -// System.out.println("ProjectNode handleSelection"); resetRestServiceDetail(); } + @Override public void handleDoubleClickOrEnter(SimpleTree tree, InputEvent inputEvent) { -// System.out.println("ProjectNode handleDoubleClickOrEnter"); } } @@ -348,9 +290,6 @@ protected SimpleNode[] buildChildren() { @Override public String getName() { String name = myServiceItem.getName(); -/* if (ToolkitIcons.METHOD.get(myServiceItem.getMethod()) == null && myServiceItem.getMethod() != null) { - name += " [" + myServiceItem.getMethod() + "]"; - }*/ return name; } @@ -362,29 +301,29 @@ public void handleSelection(SimpleTree tree) { /** * 显示服务详情,url - * */ + */ private void showServiceDetail(RestServiceItem serviceItem) { myRestServiceDetail.resetRequestTabbedPane(); - String method = serviceItem.getMethod()!=null? String.valueOf(serviceItem.getMethod()) : HttpMethod.GET.name(); + String method = serviceItem.getMethod() != null ? String.valueOf(serviceItem.getMethod()) : HttpMethod.GET.name(); myRestServiceDetail.setMethodValue(method); myRestServiceDetail.setUrlValue(serviceItem.getFullUrl()); String requestParams = ""; String requestBodyJson = ""; PsiElement psiElement = serviceItem.getPsiElement(); - if (psiElement.getLanguage()== JavaLanguage.INSTANCE) { + if (psiElement.getLanguage() == JavaLanguage.INSTANCE) { PsiMethodHelper psiMethodHelper = PsiMethodHelper.create(serviceItem.getPsiMethod()).withModule(serviceItem.getModule()); requestParams = psiMethodHelper.buildParamString(); requestBodyJson = psiMethodHelper.buildRequestBodyJson(); - }else if(psiElement.getLanguage()== KotlinLanguage.INSTANCE){ + } else if (psiElement.getLanguage() == KotlinLanguage.INSTANCE) { if (psiElement instanceof KtNamedFunction) { KtNamedFunction ktNamedFunction = (KtNamedFunction) psiElement; KtFunctionHelper ktFunctionHelper = KtFunctionHelper.create(ktNamedFunction).withModule(serviceItem.getModule()); requestParams = ktFunctionHelper.buildParamString(); - requestBodyJson =ktFunctionHelper.buildRequestBodyJson(); + requestBodyJson = ktFunctionHelper.buildRequestBodyJson(); } } @@ -412,11 +351,11 @@ public void handleDoubleClickOrEnter(SimpleTree tree, InputEvent inputEvent) { RestServicesNavigator.getInstance(myServiceItem.getModule().getProject()).scheduleStructureUpdate(); } - if (psiElement.getLanguage()== JavaLanguage.INSTANCE) { + if (psiElement.getLanguage() == JavaLanguage.INSTANCE) { PsiMethod psiMethod = myServiceItem.getPsiMethod(); OpenSourceUtil.navigate(psiMethod); - }else if(psiElement.getLanguage()== KotlinLanguage.INSTANCE){ + } else if (psiElement.getLanguage() == KotlinLanguage.INSTANCE) { if (psiElement instanceof KtNamedFunction) { KtNamedFunction ktNamedFunction = (KtNamedFunction) psiElement; OpenSourceUtil.navigate(ktNamedFunction); @@ -431,14 +370,6 @@ protected String getMenuId() { return "Toolkit.NavigatorServiceMenu"; } -/* - @Override - @Nullable - @NonNls - protected String getActionId() { - return "Toolkit.Navigator"; - }*/ - } private void resetRestServiceDetail() { diff --git a/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java b/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java index 1b5774f..4b8cc9a 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java @@ -1,6 +1,5 @@ package com.zhaow.restful.navigator; - import com.intellij.ide.util.treeView.TreeState; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.application.ApplicationManager; @@ -40,14 +39,13 @@ public class RestServicesNavigator implements PersistentStateComponent { ToolkitUtil.runWhenInitialized(myProject, () -> { if (myProject.isDisposed()) { return; @@ -116,12 +109,14 @@ public void atachEvent(AnActionEvent anActionEvent) { private void initToolWindow() { final ToolWindowManagerEx manager = ToolWindowManagerEx.getInstanceEx(myProject); - myToolWindow = (ToolWindowEx)manager.getToolWindow(TOOL_WINDOW_ID); - if(myToolWindow != null) {return;} + myToolWindow = (ToolWindowEx) manager.getToolWindow(TOOL_WINDOW_ID); + if (myToolWindow != null) { + return; + } initTree(); - myToolWindow = (ToolWindowEx)manager.registerToolWindow(TOOL_WINDOW_ID, false, ToolWindowAnchor.RIGHT, myProject, true); + myToolWindow = (ToolWindowEx) manager.registerToolWindow(TOOL_WINDOW_ID, false, ToolWindowAnchor.RIGHT, myProject, true); myToolWindow.setIcon(ToolkitIcons.SERVICE); JPanel panel = new RestServicesNavigatorPanel(myProject, myTree); @@ -148,17 +143,6 @@ public void stateChanged() { } }; manager.addToolWindowManagerListener(listener, myProject); - - //todo: 扩展 toolWindows 右键 -/* ActionManager actionManager = ActionManager.getInstance(); - DefaultActionGroup group = new DefaultActionGroup(); - group.add(actionManager.getAction("Maven.GroupProjects")); - group.add(actionManager.getAction("Maven.ShowIgnored")); - group.add(actionManager.getAction("Maven.ShowBasicPhasesOnly")); - group.add(actionManager.getAction("Maven.AlwaysShowArtifactId")); // 默认显示 app serviceName - group.add(actionManager.getAction("Maven.ShowVersions")); // - myToolWindow.setAdditionalGearActions(group);*/ - } @@ -166,14 +150,13 @@ public void scheduleStructureUpdate() { scheduleStructureRequest(() -> myStructure.update(anActionEvent)); } + private void scheduleStructureRequest(final Runnable r) { if (myToolWindow == null) { return; } -// ToolkitUtil.invokeLater(myProject, () -> { -// ToolkitUtil.runWhenInitialized(myProject, () -> { ToolkitUtil.runWhenProjectIsReady(myProject, () -> { if (!myToolWindow.isVisible()) { return; @@ -185,23 +168,12 @@ private void scheduleStructureRequest(final Runnable r) { } r.run(); -// fixme: compat -// if (shouldCreate) { -// TreeState.createFrom(myState.treeState).applyTo(myTree); -// } - }); - // if (isUnitTestMode()) { -/* if (myProject.isInitialized() *//* myProject.isDisposed() *//*) { - if (myStructure != null) { - r.run(); - } - return; - }*/ + }); } private void initStructure() { - myStructure = new RestServiceStructure(myProject,myProjectsManager,myTree); + myStructure = new RestServiceStructure(myProject, myProjectsManager, myTree); } @@ -218,8 +190,7 @@ public RestServicesNavigatorState getState() { try { myState.treeState = new Element("root"); TreeState.createOn(myTree).writeExternal(myState.treeState); - } - catch (WriteExternalException e) { + } catch (WriteExternalException e) { LOG.warn(e); } } From 7e0bc85cac5c6859d1ecbc84515d693550456238 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Fri, 12 Jun 2020 21:11:37 +0800 Subject: [PATCH 06/21] format code --- .../zhaow/restful/common/ServiceHelper.java | 2 +- .../restful/common/resolver/Convertor.java | 2 -- .../common/resolver/JaxrsResolver.java | 4 ++- .../RequestMappingAnnotationHelper.java | 25 +++++++++---------- 4 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java index 6be1f83..546680b 100644 --- a/src/main/java/com/zhaow/restful/common/ServiceHelper.java +++ b/src/main/java/com/zhaow/restful/common/ServiceHelper.java @@ -66,7 +66,7 @@ public static List buildRestServiceItemListUsingResolver(Projec List itemList = new ArrayList<>(); SpringResolver springResolver = new SpringResolver(project, anAction); - JaxrsResolver jaxrsResolver = new JaxrsResolver(project); + JaxrsResolver jaxrsResolver = new JaxrsResolver(project, anAction); ServiceResolver[] resolvers = {springResolver,jaxrsResolver}; for (ServiceResolver resolver : resolvers) { diff --git a/src/main/java/com/zhaow/restful/common/resolver/Convertor.java b/src/main/java/com/zhaow/restful/common/resolver/Convertor.java index 79a096c..390d8e4 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/Convertor.java +++ b/src/main/java/com/zhaow/restful/common/resolver/Convertor.java @@ -28,8 +28,6 @@ public static List getServiceItemList(PsiClass psiClass) { for (RequestPath classRequestPath : classRequestPaths) { for (RequestPath methodRequestPath : methodRequestPaths) { String path = classRequestPath.getPath(); -// String path = tryReplacePlaceholderValueInPath( classRequestPath.getPath() ); - RestServiceItem item = createRestServiceItem(psiMethod, path, methodRequestPath); itemList.add(item); } diff --git a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java index 3563d52..43af7ac 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java @@ -1,6 +1,7 @@ package com.zhaow.restful.common.resolver; +import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.psi.*; @@ -21,8 +22,9 @@ public JaxrsResolver(Module module) { myModule = module; } - public JaxrsResolver(Project project) { + public JaxrsResolver(Project project, AnActionEvent event) { myProject = project; + anActionEvent = event; } @Override diff --git a/src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java b/src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java index 7f9f4fc..74f1bc9 100644 --- a/src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java +++ b/src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java @@ -2,6 +2,7 @@ import com.intellij.psi.*; +import com.zhaow.restful.annotations.PathMappingAnnotation; import com.zhaow.restful.annotations.SpringRequestMethodAnnotation; import com.zhaow.restful.common.PsiAnnotationHelper; import com.zhaow.restful.common.RestSupportedAnnotationHelper; @@ -23,13 +24,11 @@ public class RequestMappingAnnotationHelper implements RestSupportedAnnotationHe */ public static List getRequestPaths(PsiClass psiClass) { PsiAnnotation[] annotations = psiClass.getModifierList().getAnnotations(); - if(annotations == null) return null; PsiAnnotation requestMappingAnnotation = null; List list = new ArrayList<>(); for (PsiAnnotation annotation : annotations) { for (SpringRequestMethodAnnotation mappingAnnotation : SpringRequestMethodAnnotation.values()) { -// for (PathMappingAnnotation mappingAnnotation : PathMappingAnnotation.allPathMappingAnnotations) { if (annotation.getQualifiedName().equals(mappingAnnotation.getQualifiedName())) { requestMappingAnnotation = annotation; } @@ -38,7 +37,7 @@ public static List getRequestPaths(PsiClass psiClass) { if (requestMappingAnnotation != null) { List requestMappings = getRequestMappings(requestMappingAnnotation, ""); - if (requestMappings.size()>0) { + if (requestMappings.size() > 0) { list.addAll(requestMappings); } } else { @@ -57,7 +56,7 @@ public static List getRequestPaths(PsiClass psiClass) { public static String[] getRequestMappingValues(PsiClass psiClass) { PsiAnnotation[] annotations = psiClass.getModifierList().getAnnotations(); - if(annotations == null) return null; + if (annotations == null) return null; for (PsiAnnotation annotation : annotations) { if (annotation.getQualifiedName().equals(SpringRequestMethodAnnotation.REQUEST_MAPPING.getQualifiedName())) { @@ -114,13 +113,14 @@ private static List getRequestMappings(PsiAnnotation annotation, St /** * 过滤所有注解 + * * @param psiMethod * @return */ public static RequestPath[] getRequestPaths(PsiMethod psiMethod) { PsiAnnotation[] annotations = psiMethod.getModifierList().getAnnotations(); - if(annotations == null) return null; + if (annotations == null) return null; List list = new ArrayList<>(); for (PsiAnnotation annotation : annotations) { @@ -131,7 +131,7 @@ public static RequestPath[] getRequestPaths(PsiMethod psiMethod) { // String defaultValue = psiMethod.getName(); String defaultValue = "/"; List requestMappings = getRequestMappings(annotation, defaultValue); - if (requestMappings.size()>0) { + if (requestMappings.size() > 0) { list.addAll(requestMappings); } } @@ -149,19 +149,19 @@ private static String getRequestMappingValue(PsiAnnotation annotation) { // if(psiAnnotationMemberValue.) if (StringUtils.isEmpty(value)) - value = PsiAnnotationHelper.getAnnotationAttributeValue(annotation,"path"); + value = PsiAnnotationHelper.getAnnotationAttributeValue(annotation, "path"); return value; } public static String[] getRequestMappingValues(PsiAnnotation annotation) { - String[] values ; + String[] values; //一个value class com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl //多个value class com.intellij.psi.impl.source.tree.java.PsiArrayInitializerMemberValueImpl PsiAnnotationMemberValue attributeValue = annotation.findDeclaredAttributeValue("value"); if (attributeValue instanceof PsiLiteralExpression) { - return new String[]{((PsiLiteralExpression) attributeValue).getValue().toString()}; + return new String[]{((PsiLiteralExpression) attributeValue).getValue().toString()}; } if (attributeValue instanceof PsiArrayInitializerMemberValue) { PsiAnnotationMemberValue[] initializers = ((PsiArrayInitializerMemberValue) attributeValue).getInitializers(); @@ -172,7 +172,7 @@ public static String[] getRequestMappingValues(PsiAnnotation annotation) { } for (int i = 0; i < initializers.length; i++) { - values[i] = ((PsiLiteralExpression)(initializers[i])).getValue().toString(); + values[i] = ((PsiLiteralExpression) (initializers[i])).getValue().toString(); } } @@ -210,10 +210,10 @@ public static String getOneRequestMappingPath(PsiMethod psiMethod) { } String mappingPath; - if(requestAnnotation != null){ + if (requestAnnotation != null) { PsiAnnotation annotation = psiMethod.getModifierList().findAnnotation(requestAnnotation.getQualifiedName()); mappingPath = RequestMappingAnnotationHelper.getRequestMappingValue(annotation); - }else { + } else { String methodName = psiMethod.getName(); mappingPath = StringUtils.uncapitalize(methodName); } @@ -222,5 +222,4 @@ public static String getOneRequestMappingPath(PsiMethod psiMethod) { } - } \ No newline at end of file From 989d75b8f19d4a2e0cfe5a0767f16c92244fcd17 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Fri, 12 Jun 2020 21:36:21 +0800 Subject: [PATCH 07/21] fix --- .../zhaow/restful/common/ServiceHelper.java | 36 +++---------------- .../action/GotoRequestMappingContributor.java | 8 ++--- .../navigator/RestServiceStructure.java | 2 +- 3 files changed, 10 insertions(+), 36 deletions(-) diff --git a/src/main/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java index 546680b..4d9d2ed 100644 --- a/src/main/java/com/zhaow/restful/common/ServiceHelper.java +++ b/src/main/java/com/zhaow/restful/common/ServiceHelper.java @@ -1,10 +1,7 @@ package com.zhaow.restful.common; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiMethod; import com.zhaow.restful.common.resolver.JaxrsResolver; @@ -29,36 +26,13 @@ public ServiceHelper(PsiMethod psiMethod) { } public static List buildRestServiceProjectListUsingResolver(Project project, AnActionEvent anActionEvent) { -// System.out.println("buildRestServiceProjectList"); List serviceProjectList = new ArrayList<>(); - - //Module[] modules = ModuleManager.getInstance(project).getModules(); - //for (Module module : modules) { - - List restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); - if (restServices.size() > 0) { - serviceProjectList.add(new RestServiceProject(project.getName(), restServices)); - } - //} - - return serviceProjectList; - } - - public static List buildRestServiceItemListUsingResolver(Module module, AnAction anAction) { - - List itemList = new ArrayList<>(); - - SpringResolver springResolver = new SpringResolver(module); - JaxrsResolver jaxrsResolver = new JaxrsResolver(module); - ServiceResolver[] resolvers = {springResolver,jaxrsResolver}; - - for (ServiceResolver resolver : resolvers) { - List allSupportedServiceItemsInModule = resolver.findAllSupportedServiceItemsInModule(); - - itemList.addAll(allSupportedServiceItemsInModule); + List restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); + if (restServices.size() > 0) { + serviceProjectList.add(new RestServiceProject(project.getName(), restServices)); } - return itemList; + return serviceProjectList; } @NotNull @@ -68,7 +42,7 @@ public static List buildRestServiceItemListUsingResolver(Projec SpringResolver springResolver = new SpringResolver(project, anAction); JaxrsResolver jaxrsResolver = new JaxrsResolver(project, anAction); - ServiceResolver[] resolvers = {springResolver,jaxrsResolver}; + ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; for (ServiceResolver resolver : resolvers) { List allSupportedServiceItemsInProject = resolver.findAllSupportedServiceItemsInProject(); diff --git a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java index 303aae4..f93c7c4 100644 --- a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java +++ b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java @@ -27,11 +27,11 @@ public String[] getNames(Project project, boolean onlyThisModuleChecked) { String[] names = null; List itemList; ///todo 查找 project 中所有符合 rest url 类型文件,包含 request 接口 - if (onlyThisModuleChecked && myModule != null) { - itemList = ServiceHelper.buildRestServiceItemListUsingResolver(myModule, null); - } else { + //if (onlyThisModuleChecked && myModule != null) { + // itemList = ServiceHelper.buildRestServiceItemListUsingResolver(myModule, null); + //} else { itemList = ServiceHelper.buildRestServiceItemListUsingResolver(project, null); - } + //} navItem = itemList; diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java index ced2813..87c7f88 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java @@ -86,7 +86,7 @@ public void updateProjects(List projects) { serviceCount = 0; for (RestServiceProject each : projects) { - serviceCount += each.serviceItems.size(); + serviceCount += each.serviceItems.size(); // 计算api个数 ProjectNode node = findNodeFor(each); if (node == null) { node = new ProjectNode(myRoot, each); From 264044a8bd4e366fc2807901808c301845ef909a Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Sat, 13 Jun 2020 22:26:26 +0800 Subject: [PATCH 08/21] use aborn package --- .../com/github/aborn/wdt/package-info.java | 3 +++ .../aborn/wdt/utils}/FileUtils.java | 4 ++-- .../zhaow/restful/common/ServiceHelper.java | 3 ++- .../common/resolver/BaseServiceResolver.java | 3 +-- .../navigator/RestServiceProjectsManager.java | 2 +- .../navigator/RestServiceStructure.java | 19 ++++++++++++++++--- 6 files changed, 25 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/github/aborn/wdt/package-info.java rename src/main/java/com/{zhaow/restful/common => github/aborn/wdt/utils}/FileUtils.java (93%) diff --git a/src/main/java/com/github/aborn/wdt/package-info.java b/src/main/java/com/github/aborn/wdt/package-info.java new file mode 100644 index 0000000..108a5b3 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/package-info.java @@ -0,0 +1,3 @@ +package com.github.aborn.wdt; + +// web development toolkit \ No newline at end of file diff --git a/src/main/java/com/zhaow/restful/common/FileUtils.java b/src/main/java/com/github/aborn/wdt/utils/FileUtils.java similarity index 93% rename from src/main/java/com/zhaow/restful/common/FileUtils.java rename to src/main/java/com/github/aborn/wdt/utils/FileUtils.java index e25257f..06bf5cb 100644 --- a/src/main/java/com/zhaow/restful/common/FileUtils.java +++ b/src/main/java/com/github/aborn/wdt/utils/FileUtils.java @@ -1,10 +1,10 @@ -package com.zhaow.restful.common; +package com.github.aborn.wdt.utils; -import com.intellij.openapi.project.Project; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiFile; import com.intellij.psi.impl.source.PsiJavaFileImpl; + import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java index 4d9d2ed..fe9fd9c 100644 --- a/src/main/java/com/zhaow/restful/common/ServiceHelper.java +++ b/src/main/java/com/zhaow/restful/common/ServiceHelper.java @@ -1,5 +1,6 @@ package com.zhaow.restful.common; +import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; @@ -25,7 +26,7 @@ public ServiceHelper(PsiMethod psiMethod) { this.psiMethod = psiMethod; } - public static List buildRestServiceProjectListUsingResolver(Project project, AnActionEvent anActionEvent) { + public static List buildRestServiceProjectListUsingResolver(Project project, AnActionEvent anActionEvent, Disposable disposable) { List serviceProjectList = new ArrayList<>(); List restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); if (restServices.size() > 0) { diff --git a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java index 64ab1fc..e90f47e 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java @@ -2,7 +2,6 @@ import com.intellij.ide.IdeView; -import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.module.Module; @@ -11,7 +10,7 @@ import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; -import com.zhaow.restful.common.FileUtils; +import com.github.aborn.wdt.utils.FileUtils; import com.zhaow.restful.method.RequestPath; import com.zhaow.restful.navigation.action.RestServiceItem; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java index 276e6ab..803cf24 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java @@ -63,7 +63,7 @@ public void loadState(RestServicesNavigatorState state) { public List getServiceProjects(AnActionEvent anActionEvent) { return DumbService.getInstance(myProject).runReadActionInSmartMode(() -> - ServiceHelper.buildRestServiceProjectListUsingResolver(myProject, anActionEvent)); + ServiceHelper.buildRestServiceProjectListUsingResolver(myProject, anActionEvent, this)); } diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java index 87c7f88..1e293e9 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java @@ -37,6 +37,8 @@ public class RestServiceStructure extends SimpleTreeStructure { private SimpleTreeBuilder myTreeBuilder; private AsyncTreeModel asyncTreeModel; + private StructureTreeModel structureTreeModel; + private SimpleTree myTree; private final Project myProject; @@ -63,8 +65,12 @@ public RestServiceStructure(Project project, myTreeBuilder = new SimpleTreeBuilder(tree, (DefaultTreeModel) tree.getModel(), this, null); Disposer.register(myProject, myTreeBuilder); - myTreeBuilder.initRoot(); - myTreeBuilder.expand(myRoot, null); + //myTreeBuilder.initRoot(); + //myTreeBuilder.expand(myRoot, null); + + // structureTreeModel = new StructureTreeModel(this, Disposable ?); + //asyncTreeModel = new AsyncTreeModel() + } private void configureTree(SimpleTree tree) { @@ -78,7 +84,13 @@ public RootNode getRootElement() { } public void update(AnActionEvent event) { - List projects = RestServiceProjectsManager.getInstance(myProject).getServiceProjects(event); + RestServiceProjectsManager restServiceProjectsManager = RestServiceProjectsManager.getInstance(myProject); + if (structureTreeModel == null) { + structureTreeModel = new StructureTreeModel(this, restServiceProjectsManager); + + } + + List projects = restServiceProjectsManager.getServiceProjects(event); updateProjects(projects); } @@ -102,6 +114,7 @@ private ProjectNode findNodeFor(RestServiceProject project) { public void updateFrom(SimpleNode node) { if (node != null) { + //structureTreeModel.expand(node, myTree, ); myTreeBuilder.addSubtreeToUpdateByElement(node); } } From 86d0689b87407a0d4a4c7e5665f390b38eb1307d Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Sun, 14 Jun 2020 12:38:37 +0800 Subject: [PATCH 09/21] fix uncampatiable problem in 2020.1 --- build.gradle | 20 ++++++++++++------- .../zhaow/restful/common/ToolkitIcons.java | 2 +- .../RestfulToolkitFeaturesProvider.java | 5 ++--- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index af7997b..5730a43 100644 --- a/build.gradle +++ b/build.gradle @@ -37,20 +37,26 @@ intellij { // 这里是指打插件包的时候用idea什么版本的依赖包打 // 比如这里用2019.3打包,如果你的插件实现源码里用了2019.3不存在的依赖包或类,就会报错 // 一般就填当前IDEA的版本号即可 - version "2019.3" + // version "2019.3" // 2019.3 + type = 'IU' // 'IU' IntelliJ IDEA Ultimate Edition,默认值为 'IC' IntelliJ IDEA Community Edition + pluginName = 'WebDevelopmentToolkit' // 插件名 + //localPath = '/Users/aborn/software/ideaIC-2020.1' // IC 版本 2020.1 + localPath = '/Applications/IntelliJ IDEA.app' // 本地的 ieda路径 (与version属性互斥),这个为2020.1版本 + //localPath = '/Applications/IntelliJ IDEA 2.app' // 2019.3版本 + //downloadSources = false plugins = ['java', 'Kotlin'] } -patchPluginXml { +//patchPluginXml { //changeNotes里的内容展示位置参考图14 - changeNotes """ - 1.0版本. + //changeNotes """ + // 1.0版本. - 第1.0版本:初始化这个测试插件项目""" + // 第1.0版本:初始化这个测试插件项目""" // 这个意思是说当前定义的这个插件最早支持到什么版本的IDEA // 这里配置sinceBuild=191,表示插件只能被版本号大于等于2019.1版本的IDEA安装,低于这个版本的将抛无法兼容的错误 // ↑上方参考这篇问答:https://intellij-support.jetbrains.com/hc/en-us/community/posts/360003338799-Build-compatible-plugin - sinceBuild "192.5728.98" // 原 191 -} \ No newline at end of file + // sinceBuild "192.5728.98" // 原 191 +//} \ No newline at end of file diff --git a/src/main/java/com/zhaow/restful/common/ToolkitIcons.java b/src/main/java/com/zhaow/restful/common/ToolkitIcons.java index 711125d..63ac3e3 100644 --- a/src/main/java/com/zhaow/restful/common/ToolkitIcons.java +++ b/src/main/java/com/zhaow/restful/common/ToolkitIcons.java @@ -36,7 +36,7 @@ public static Icon get(HttpMethod method) { // OPTIONS HEAD } - public static final Icon MODULE = AllIcons.Modules.ModulesNode; // 16x16 + public static final Icon MODULE = AllIcons.Nodes.ModuleGroup; // 16x16 public static final Icon Refresh = AllIcons.Actions.Refresh; // 16x16 // public static final Icon SERVICE = IconLoader.getIcon("/icons/service.png"); // 16x16 diff --git a/src/main/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java b/src/main/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java index bfc4588..98990f0 100644 --- a/src/main/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java +++ b/src/main/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java @@ -4,7 +4,6 @@ import com.intellij.featureStatistics.FeatureDescriptor; import com.intellij.featureStatistics.GroupDescriptor; import com.intellij.featureStatistics.ProductivityFeaturesProvider; -import com.intellij.remoteServer.util.CloudBundle; import java.util.Collections; @@ -17,7 +16,7 @@ public FeatureDescriptor[] getFeatureDescriptors() { return new FeatureDescriptor[]{new FeatureDescriptor(UPLOAD_SSH_KEY_FEATURE_ID, CLOUDS_GROUP_ID, "UploadSshKey.html", - CloudBundle.getText("upload.ssh.key.display.name"), + "upload.ssh.key.display.name", 0, 0, Collections.emptySet(), @@ -29,7 +28,7 @@ public FeatureDescriptor[] getFeatureDescriptors() { public GroupDescriptor[] getGroupDescriptors() { return new GroupDescriptor[] { - new GroupDescriptor(CLOUDS_GROUP_ID, CloudBundle.getText("group.display.name")) + new GroupDescriptor(CLOUDS_GROUP_ID, "group.display.name") }; } From 4a121d8e4abdf11caebe3046e2488b51cc94c626 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Sun, 14 Jun 2020 13:54:43 +0800 Subject: [PATCH 10/21] fix code format --- .../java/com/zhaow/restful/navigator/RestServiceStructure.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java index 1e293e9..e42c408 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java @@ -98,7 +98,7 @@ public void updateProjects(List projects) { serviceCount = 0; for (RestServiceProject each : projects) { - serviceCount += each.serviceItems.size(); // 计算api个数 + serviceCount += each.serviceItems.size(); ProjectNode node = findNodeFor(each); if (node == null) { node = new ProjectNode(myRoot, each); From 2cbbe1ac0bb94a8cba26c7e1aa9cb2b0092a3ed1 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Sun, 14 Jun 2020 19:17:17 +0800 Subject: [PATCH 11/21] Support JavaxPath Annotation --- build.gradle | 4 ++-- .../com/zhaow/restful/common/ServiceHelper.java | 17 ++++++++++++----- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/build.gradle b/build.gradle index 5730a43..d2b9ed1 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ group 'com.zhaow.restful.toolkit' version '3.0.0' //定义jar包/zip包的版本号 ext.kotlin_version = '1.3.72' -sourceCompatibility = 1.8 //限制jdk的使用版本号,这里限制到8,表示生成的idea插件只能运行在jdk8以上的环境中 +sourceCompatibility = 1.8 // 限制jdk的使用版本号,这里限制到8,表示生成的idea插件只能运行在jdk8以上的环境中 repositories { maven { @@ -39,7 +39,7 @@ intellij { // 一般就填当前IDEA的版本号即可 // version "2019.3" // 2019.3 type = 'IU' // 'IU' IntelliJ IDEA Ultimate Edition,默认值为 'IC' IntelliJ IDEA Community Edition - pluginName = 'WebDevelopmentToolkit' // 插件名 + pluginName = 'WebDT' // 插件名,Web Development Toolkit //localPath = '/Users/aborn/software/ideaIC-2020.1' // IC 版本 2020.1 localPath = '/Applications/IntelliJ IDEA.app' // 本地的 ieda路径 (与version属性互斥),这个为2020.1版本 //localPath = '/Applications/IntelliJ IDEA 2.app' // 2019.3版本 diff --git a/src/main/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java index fe9fd9c..27bccaa 100644 --- a/src/main/java/com/zhaow/restful/common/ServiceHelper.java +++ b/src/main/java/com/zhaow/restful/common/ServiceHelper.java @@ -5,6 +5,7 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiMethod; +import com.intellij.psi.search.GlobalSearchScope; import com.zhaow.restful.common.resolver.JaxrsResolver; import com.zhaow.restful.common.resolver.ServiceResolver; import com.zhaow.restful.common.resolver.SpringResolver; @@ -43,12 +44,18 @@ public static List buildRestServiceItemListUsingResolver(Projec SpringResolver springResolver = new SpringResolver(project, anAction); JaxrsResolver jaxrsResolver = new JaxrsResolver(project, anAction); - ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; - for (ServiceResolver resolver : resolvers) { - List allSupportedServiceItemsInProject = resolver.findAllSupportedServiceItemsInProject(); + //ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; - itemList.addAll(allSupportedServiceItemsInProject); - } + List javaxPathList = jaxrsResolver.getRestServiceItemList(project, GlobalSearchScope.allScope(project)); + itemList.addAll(javaxPathList); + List springList = springResolver.findAllSupportedServiceItemsInProject(); + itemList.addAll(springList); + +// for (ServiceResolver resolver : resolvers) { +// List allSupportedServiceItemsInProject = resolver.findAllSupportedServiceItemsInProject(); +// +// itemList.addAll(allSupportedServiceItemsInProject); +// } return itemList; } From f0165c62739a95a440364779d78a404cbf11b6b9 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Sun, 14 Jun 2020 19:58:43 +0800 Subject: [PATCH 12/21] add modules build --- .../zhaow/restful/common/ServiceHelper.java | 42 +++++++++++++++++-- .../common/resolver/JaxrsResolver.java | 16 +++++-- .../common/resolver/SpringResolver.java | 41 ++++++++++++++++++ 3 files changed, 93 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java index 27bccaa..2b2c8e7 100644 --- a/src/main/java/com/zhaow/restful/common/ServiceHelper.java +++ b/src/main/java/com/zhaow/restful/common/ServiceHelper.java @@ -3,9 +3,14 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiMethod; +import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; import com.intellij.psi.search.GlobalSearchScope; +import com.zhaow.restful.annotations.JaxrsPathAnnotation; import com.zhaow.restful.common.resolver.JaxrsResolver; import com.zhaow.restful.common.resolver.ServiceResolver; import com.zhaow.restful.common.resolver.SpringResolver; @@ -14,6 +19,7 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; +import java.util.Collection; import java.util.List; /** @@ -29,14 +35,44 @@ public ServiceHelper(PsiMethod psiMethod) { public static List buildRestServiceProjectListUsingResolver(Project project, AnActionEvent anActionEvent, Disposable disposable) { List serviceProjectList = new ArrayList<>(); - List restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); - if (restServices.size() > 0) { - serviceProjectList.add(new RestServiceProject(project.getName(), restServices)); + Module[] modules = ModuleManager.getInstance(project).getModules(); + List restServices; + + if (modules.length > 1) { + for (Module module : modules) { + List moduleList = buildRestServiceItemListUsingResolver(project, module, anActionEvent); + if (moduleList.size() > 0) { + serviceProjectList.add(new RestServiceProject(module.getName() + "(" + moduleList.size() +")", moduleList)); + } + } + } else { + restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); + if (restServices.size() > 0) { + serviceProjectList.add(new RestServiceProject(project.getName(), restServices)); + } } return serviceProjectList; } + @NotNull + public static List buildRestServiceItemListUsingResolver(Project project, Module module, AnActionEvent anAction) { + List itemList = new ArrayList<>(); + + SpringResolver springResolver = new SpringResolver(project, anAction); + JaxrsResolver jaxrsResolver = new JaxrsResolver(project, anAction); + + //ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; + + List javaxPathList = jaxrsResolver.getRestServiceItemList(project, module); + itemList.addAll(javaxPathList); + + List springList = springResolver.getRestServiceItemList(project, module); + itemList.addAll(springList); + + return itemList; + } + @NotNull public static List buildRestServiceItemListUsingResolver(Project project, AnActionEvent anAction) { List itemList = new ArrayList<>(); diff --git a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java index 43af7ac..f4b5588 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java @@ -29,15 +29,25 @@ public JaxrsResolver(Project project, AnActionEvent event) { @Override public List getRestServiceItemList(Project project, GlobalSearchScope globalSearchScope) { - List itemList = new ArrayList<>(); - Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, globalSearchScope); + return buildRestServiceItemList(psiAnnotations); + } + + public List getRestServiceItemList(Project project, Module module) { + Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, GlobalSearchScope.moduleScope(module)); + return buildRestServiceItemList(psiAnnotations); + } + + public List buildRestServiceItemList(Collection psiAnnotations) { + List itemList = new ArrayList<>(); for (PsiAnnotation psiAnnotation : psiAnnotations) { PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); PsiElement psiElement = psiModifierList.getParent(); - if (!(psiElement instanceof PsiClass)) continue; + if (!(psiElement instanceof PsiClass)) { + continue; + } PsiClass psiClass = (PsiClass) psiElement; PsiMethod[] psiMethods = psiClass.getMethods(); diff --git a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java index da8e50e..9ae7ea2 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java @@ -6,9 +6,11 @@ import com.intellij.psi.*; import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; import com.intellij.psi.search.GlobalSearchScope; +import com.zhaow.restful.annotations.JaxrsPathAnnotation; import com.zhaow.restful.annotations.PathMappingAnnotation; import com.zhaow.restful.annotations.SpringControllerAnnotation; import com.zhaow.restful.annotations.SpringRequestMethodAnnotation; +import com.zhaow.restful.common.jaxrs.JaxrsAnnotationHelper; import com.zhaow.restful.common.spring.RequestMappingAnnotationHelper; import com.zhaow.restful.method.RequestPath; import com.zhaow.restful.method.action.PropertiesHandler; @@ -41,6 +43,45 @@ public SpringResolver(Project project, AnActionEvent anAction) { } + public List getRestServiceItemList(Project project, Module module) { + Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(SpringControllerAnnotation.REST_CONTROLLER.getShortName(), project, GlobalSearchScope.moduleScope(module)); + return buildRestServiceItemList(psiAnnotations); + } + + public List buildRestServiceItemList(Collection psiAnnotations) { + List itemList = new ArrayList<>(); + + for (PsiAnnotation psiAnnotation : psiAnnotations) { + PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); + PsiElement psiElement = psiModifierList.getParent(); + + if (!(psiElement instanceof PsiClass)) { + continue; + } + + PsiClass psiClass = (PsiClass) psiElement; + PsiMethod[] psiMethods = psiClass.getMethods(); + + if (psiMethods == null) { + continue; + } + + String classUriPath = JaxrsAnnotationHelper.getClassUriPath(psiClass); + + for (PsiMethod psiMethod : psiMethods) { + RequestPath[] methodUriPaths = JaxrsAnnotationHelper.getRequestPaths(psiMethod); + + for (RequestPath methodUriPath : methodUriPaths) { + RestServiceItem item = createRestServiceItem(psiMethod, classUriPath, methodUriPath); + itemList.add(item); + } + } + + } + + return itemList; + } + @Override public List getRestServiceItemList(Project project, GlobalSearchScope globalSearchScope) { List itemList = new ArrayList<>(); From f9d747f1ee906c043319038034e6e223579f1f10 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Sun, 14 Jun 2020 20:15:36 +0800 Subject: [PATCH 13/21] deal spring module --- .../java/com/zhaow/restful/common/ServiceHelper.java | 11 +++++------ .../zhaow/restful/common/resolver/SpringResolver.java | 11 ++--------- 2 files changed, 7 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java index 2b2c8e7..ee34a70 100644 --- a/src/main/java/com/zhaow/restful/common/ServiceHelper.java +++ b/src/main/java/com/zhaow/restful/common/ServiceHelper.java @@ -36,19 +36,18 @@ public ServiceHelper(PsiMethod psiMethod) { public static List buildRestServiceProjectListUsingResolver(Project project, AnActionEvent anActionEvent, Disposable disposable) { List serviceProjectList = new ArrayList<>(); Module[] modules = ModuleManager.getInstance(project).getModules(); - List restServices; if (modules.length > 1) { for (Module module : modules) { - List moduleList = buildRestServiceItemListUsingResolver(project, module, anActionEvent); - if (moduleList.size() > 0) { - serviceProjectList.add(new RestServiceProject(module.getName() + "(" + moduleList.size() +")", moduleList)); + List restServices = buildRestServiceItemListUsingResolver(project, module, anActionEvent); + if (restServices.size() > 0) { + serviceProjectList.add(new RestServiceProject(module.getName() + "(" + restServices.size() +")", restServices)); } } } else { - restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); + List restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); if (restServices.size() > 0) { - serviceProjectList.add(new RestServiceProject(project.getName(), restServices)); + serviceProjectList.add(new RestServiceProject(project.getName() + "(" + restServices.size() +")", restServices)); } } diff --git a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java index 9ae7ea2..f69e14d 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java @@ -66,16 +66,9 @@ public List buildRestServiceItemList(Collection continue; } - String classUriPath = JaxrsAnnotationHelper.getClassUriPath(psiClass); + List restServiceItems = Convertor.getServiceItemList(psiClass); - for (PsiMethod psiMethod : psiMethods) { - RequestPath[] methodUriPaths = JaxrsAnnotationHelper.getRequestPaths(psiMethod); - - for (RequestPath methodUriPath : methodUriPaths) { - RestServiceItem item = createRestServiceItem(psiMethod, classUriPath, methodUriPath); - itemList.add(item); - } - } + itemList.addAll(restServiceItems); } From fee9ca2a29f59ad7273e7569fa7ec3cece920f09 Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Sun, 14 Jun 2020 20:33:24 +0800 Subject: [PATCH 14/21] spring annotation fix --- .../common/resolver/SpringResolver.java | 114 +----------------- 1 file changed, 5 insertions(+), 109 deletions(-) diff --git a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java index f69e14d..25daf93 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java @@ -27,16 +27,6 @@ public class SpringResolver extends BaseServiceResolver { PropertiesHandler propertiesHandler; - public SpringResolver(Module module) { - myModule = module; - propertiesHandler = new PropertiesHandler(module); - } - - public SpringResolver(Project project) { - myProject = project; - - } - public SpringResolver(Project project, AnActionEvent anAction) { myProject = project; anActionEvent = anAction; @@ -44,7 +34,10 @@ public SpringResolver(Project project, AnActionEvent anAction) { } public List getRestServiceItemList(Project project, Module module) { - Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(SpringControllerAnnotation.REST_CONTROLLER.getShortName(), project, GlobalSearchScope.moduleScope(module)); + Collection psiAnnotations = new ArrayList<>(); + for (SpringControllerAnnotation annotation : SpringControllerAnnotation.values()) { + psiAnnotations.addAll(JavaAnnotationIndex.getInstance().get(annotation.getShortName(), project, GlobalSearchScope.moduleScope(module))); + } return buildRestServiceItemList(psiAnnotations); } @@ -66,7 +59,7 @@ public List buildRestServiceItemList(Collection continue; } - List restServiceItems = Convertor.getServiceItemList(psiClass); + List restServiceItems = getServiceItemList(psiClass); itemList.addAll(restServiceItems); @@ -188,103 +181,6 @@ private List getRequestMappings(String defaultPath, List getRequestMappings(String defaultPath, KtAnnotationEntry entry) { - List requestPaths = new ArrayList<>(); - List methodList = new ArrayList<>(); - List pathList = new ArrayList<>(); - - String annotationName = entry.getCalleeExpression().getText(); - SpringRequestMethodAnnotation requestMethodAnnotation = SpringRequestMethodAnnotation.getByShortName(annotationName); - if (requestMethodAnnotation == null) { - return new ArrayList<>(); - } - - if (requestMethodAnnotation.methodName() != null) { - methodList.add(requestMethodAnnotation.methodName()); - } else { - // 下面循环获取 - } - - //注解参数值 - KtValueArgumentList valueArgumentList = entry.getValueArgumentList(); - // 只有注解,没有参数 - if (valueArgumentList != null) { - List arguments = valueArgumentList.getArguments(); - - - for (int i = 0; i < arguments.size(); i++) { - KtValueArgument ktValueArgument = arguments.get(i); - KtValueArgumentName argumentName = ktValueArgument.getArgumentName(); - - KtExpression argumentExpression = ktValueArgument.getArgumentExpression(); - if (argumentName == null || argumentName.getText().equals("value") || argumentName.getText().equals("path")) { - // array, kotlin 1.1- - if (argumentExpression.getText().startsWith("arrayOf")) { - List pathValueArguments = ((KtCallExpression) argumentExpression).getValueArguments(); - for (KtValueArgument pathValueArgument : pathValueArguments) { - pathList.add(pathValueArgument.getText().replace("\"", "")); - } - // array, kotlin 1.2+ - } else if (argumentExpression.getText().startsWith("[")) { - List innerExpressions = ((KtCollectionLiteralExpression) argumentExpression).getInnerExpressions(); - for (KtExpression ktExpression : innerExpressions) { - pathList.add(ktExpression.getText().replace("\"", "")); - } - } else { - // 有且仅有一个value - PsiElement[] paths = ktValueArgument.getArgumentExpression().getChildren(); -// Arrays.stream(paths).forEach(p -> pathList.add(p.getText())); - pathList.add(paths.length==0? "" : paths[0].getText()); - } - //TODO - continue; - } - - String attribute = "method"; - if (argumentName.getText().equals(attribute)) { - - // array, kotlin 1.1- - if (argumentExpression.getText().startsWith("arrayOf")) { - List pathValueArguments = ((KtCallExpression) argumentExpression).getValueArguments(); - for (KtValueArgument pathValueArgument : pathValueArguments) { - methodList.add(pathValueArgument.getText().replace("\"", "")); - } - // array, kotlin 1.2+ - } else if (argumentExpression.getText().startsWith("[")) { - List innerExpressions = ((KtCollectionLiteralExpression) argumentExpression).getInnerExpressions(); - for (KtExpression ktExpression : innerExpressions) { - methodList.add(ktExpression.getText().replace("\"", "")); - } - } else { - // 有且仅有一个value - PsiElement[] paths = ktValueArgument.getArgumentExpression().getChildren(); -// Arrays.stream(paths).forEach(p -> methodList.add(p.getText())); - methodList.add(paths.length==0? "" : paths[0].getText()); - } - - } - } - } else { - pathList.add(defaultPath); - //method = "GET"; - } - - if (methodList.size() > 0) { - for (String method : methodList) { - for (String path : pathList) { - requestPaths.add(new RequestPath(path, method)); - } - } - } else { - for (String path : pathList) { - requestPaths.add(new RequestPath(path, null)); - } - } - - return requestPaths; - }*/ - - private List getRequestMappings(String defaultPath, KtAnnotationEntry entry) { List requestPaths = new ArrayList<>(); List methodList = new ArrayList<>(); From 00bf541744428b5871cb87fc591d9d1ca58c460b Mon Sep 17 00:00:00 2001 From: Aborn Jiang Date: Sun, 14 Jun 2020 21:07:14 +0800 Subject: [PATCH 15/21] fix deprecated --- .../restful/navigation/action/GotoRequestMappingAction.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java index a5134fc..51e7952 100644 --- a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java +++ b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java @@ -7,6 +7,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataKeys; +import com.intellij.openapi.actionSystem.LangDataKeys; import com.intellij.openapi.fileEditor.ex.FileEditorManagerEx; import com.intellij.openapi.ide.CopyPasteManager; import com.intellij.openapi.project.DumbAware; @@ -36,7 +37,7 @@ protected void gotoActionPerformed(AnActionEvent e) { FeatureUsageTracker.getInstance().triggerFeatureUsed("navigation.popup.service"); ChooseByNameContributor[] chooseByNameContributors = { - new GotoRequestMappingContributor(e.getData(DataKeys.MODULE))/*, + new GotoRequestMappingContributor(e.getData(LangDataKeys.MODULE))/*, new RequestMappingContributor()*/ }; @@ -68,8 +69,7 @@ public void elementChosen(ChooseByNamePopup chooseByNamePopup, Object element) { } -// TODO IDEA 2018 删了? -// @Override + @Override protected void showNavigationPopup(AnActionEvent e, ChooseByNameModel model, final GotoActionCallback callback, From afda1ff3316079cef93d7ae8d0409d3b1b0a0e76 Mon Sep 17 00:00:00 2001 From: aborn Date: Mon, 15 Jun 2020 14:56:46 +0800 Subject: [PATCH 16/21] part refact --- build.gradle | 6 +- .../wdt/core/RestServiceDataManager.java | 81 ++++++++++++++++ .../wdt/core/helper/AnnotationHelper.java | 26 +++++ .../core/helper/JavaxrsAnnotationHelper.java | 61 ++++++++++++ .../core/helper/SpringAnnotationHelper.java | 85 ++++++++++++++++ .../aborn/wdt/core/resolver/BaseResolver.java | 33 +++++++ .../aborn/wdt/core/resolver/IResolver.java | 15 +++ .../wdt/core/resolver/JavaxrsResolver.java | 58 +++++++++++ .../wdt/core/resolver/SpringResolver.java | 90 +++++++++++++++++ .../zhaow/restful/common/ServiceHelper.java | 19 ++-- .../common/resolver/BaseServiceResolver.java | 2 +- .../common/resolver/JaxrsResolver.java | 1 + .../common/resolver/ServiceResolver.java | 10 ++ .../action/RestServiceChooseByNamePopup.java | 96 +++++++++---------- .../navigator/RestServiceProjectsManager.java | 5 +- 15 files changed, 518 insertions(+), 70 deletions(-) create mode 100644 src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java create mode 100644 src/main/java/com/github/aborn/wdt/core/helper/AnnotationHelper.java create mode 100644 src/main/java/com/github/aborn/wdt/core/helper/JavaxrsAnnotationHelper.java create mode 100644 src/main/java/com/github/aborn/wdt/core/helper/SpringAnnotationHelper.java create mode 100644 src/main/java/com/github/aborn/wdt/core/resolver/BaseResolver.java create mode 100644 src/main/java/com/github/aborn/wdt/core/resolver/IResolver.java create mode 100644 src/main/java/com/github/aborn/wdt/core/resolver/JavaxrsResolver.java create mode 100644 src/main/java/com/github/aborn/wdt/core/resolver/SpringResolver.java diff --git a/build.gradle b/build.gradle index d2b9ed1..dce0787 100644 --- a/build.gradle +++ b/build.gradle @@ -37,11 +37,11 @@ intellij { // 这里是指打插件包的时候用idea什么版本的依赖包打 // 比如这里用2019.3打包,如果你的插件实现源码里用了2019.3不存在的依赖包或类,就会报错 // 一般就填当前IDEA的版本号即可 - // version "2019.3" // 2019.3 - type = 'IU' // 'IU' IntelliJ IDEA Ultimate Edition,默认值为 'IC' IntelliJ IDEA Community Edition + version "2019.3" // 2019.3 + type = 'IC' // 'IU' IntelliJ IDEA Ultimate Edition,默认值为 'IC' IntelliJ IDEA Community Edition pluginName = 'WebDT' // 插件名,Web Development Toolkit //localPath = '/Users/aborn/software/ideaIC-2020.1' // IC 版本 2020.1 - localPath = '/Applications/IntelliJ IDEA.app' // 本地的 ieda路径 (与version属性互斥),这个为2020.1版本 + //localPath = '/Applications/IntelliJ IDEA.app' // 本地的 ieda路径 (与version属性互斥),这个为2020.1版本 //localPath = '/Applications/IntelliJ IDEA 2.app' // 2019.3版本 //downloadSources = false plugins = ['java', 'Kotlin'] diff --git a/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java b/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java new file mode 100644 index 0000000..2cf46d0 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java @@ -0,0 +1,81 @@ +package com.github.aborn.wdt.core; + +import com.github.aborn.wdt.core.resolver.IResolver; +import com.github.aborn.wdt.core.resolver.JavaxrsResolver; +import com.github.aborn.wdt.core.resolver.SpringResolver; +import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.psi.search.GlobalSearchScope; +import com.zhaow.restful.common.ServiceHelper; +import com.zhaow.restful.common.resolver.JaxrsResolver; +import com.zhaow.restful.navigation.action.RestServiceItem; +import com.zhaow.restful.navigator.RestServiceProject; +import org.apache.commons.compress.utils.Lists; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * @author aborn + * @date 2020/06/15 11:35 AM + */ +public class RestServiceDataManager { + + public static final Logger LOG = Logger.getInstance(ServiceHelper.class); + + public static List buildRestServiceData(Project project, AnActionEvent anActionEvent) { + List serviceProjectList = Lists.newArrayList(); + Module[] modules = ModuleManager.getInstance(project).getModules(); + + IResolver[] resolvers = {new SpringResolver(), new JavaxrsResolver()}; + + + if (modules.length > 0) { + for (Module module : modules) { + List restServices = Lists.newArrayList(); + for (IResolver resolver : resolvers) { + restServices.addAll(resolver.getRestServiceItemList(project, module)); + } + + if (restServices.size() > 0) { + serviceProjectList.add(new RestServiceProject(module.getName() + "(" + restServices.size() +")", restServices)); + } + } + } else { + List restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); + if (restServices.size() > 0) { + serviceProjectList.add(new RestServiceProject(project.getName() + "(" + restServices.size() +")", restServices)); + } + LOG.info("Not find any modules in project " + project.getName() + "."); + } + + return serviceProjectList; + } + + // TODO 需要重构 + @NotNull + public static List buildRestServiceItemListUsingResolver(Project project, AnActionEvent anAction) { + List itemList = Lists.newArrayList(); + + com.zhaow.restful.common.resolver.SpringResolver springResolver = new com.zhaow.restful.common.resolver.SpringResolver(project, anAction); + JaxrsResolver jaxrsResolver = new JaxrsResolver(project, anAction); + + //ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; + + List javaxPathList = jaxrsResolver.getRestServiceItemList(project, GlobalSearchScope.allScope(project)); + itemList.addAll(javaxPathList); + List springList = springResolver.findAllSupportedServiceItemsInProject(); + itemList.addAll(springList); + +// for (ServiceResolver resolver : resolvers) { +// List allSupportedServiceItemsInProject = resolver.findAllSupportedServiceItemsInProject(); +// +// itemList.addAll(allSupportedServiceItemsInProject); +// } + + return itemList; + } +} diff --git a/src/main/java/com/github/aborn/wdt/core/helper/AnnotationHelper.java b/src/main/java/com/github/aborn/wdt/core/helper/AnnotationHelper.java new file mode 100644 index 0000000..78691c4 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/helper/AnnotationHelper.java @@ -0,0 +1,26 @@ +package com.github.aborn.wdt.core.helper; + +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; +import com.zhaow.restful.method.RequestPath; + +/** + * @author aborn + * @date 2020/06/15 12:02 PM + */ +public interface AnnotationHelper { + + /** + * get class uri path + * @param psiClass + * @return + */ + String getClassUriPath(PsiClass psiClass); + + /** + * + * @param psiMethod + * @return + */ + RequestPath[] getRequestPaths(PsiMethod psiMethod); +} diff --git a/src/main/java/com/github/aborn/wdt/core/helper/JavaxrsAnnotationHelper.java b/src/main/java/com/github/aborn/wdt/core/helper/JavaxrsAnnotationHelper.java new file mode 100644 index 0000000..82fcca8 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/helper/JavaxrsAnnotationHelper.java @@ -0,0 +1,61 @@ +package com.github.aborn.wdt.core.helper; + +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; +import com.zhaow.restful.annotations.JaxrsHttpMethodAnnotation; +import com.zhaow.restful.annotations.JaxrsPathAnnotation; +import com.zhaow.restful.common.PsiAnnotationHelper; +import com.zhaow.restful.method.RequestPath; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * @author aborn + * @date 2020/06/15 12:03 PM + */ +public class JavaxrsAnnotationHelper implements AnnotationHelper { + + @Override + public String getClassUriPath(PsiClass psiClass) { + PsiAnnotation annotation = psiClass.getModifierList().findAnnotation(JaxrsPathAnnotation.PATH.getQualifiedName()); + String path = PsiAnnotationHelper.getAnnotationAttributeValue(annotation, "value"); + return path != null ? path : ""; + } + + @Override + public RequestPath[] getRequestPaths(PsiMethod psiMethod) { + PsiAnnotation[] annotations = psiMethod.getModifierList().getAnnotations(); + if(annotations == null) return null; + List list = new ArrayList<>(); + + PsiAnnotation wsPathAnnotation = psiMethod.getModifierList().findAnnotation(JaxrsPathAnnotation.PATH.getQualifiedName()); + String path = wsPathAnnotation == null ? psiMethod.getName() : getWsPathValue(wsPathAnnotation); + + JaxrsHttpMethodAnnotation[] jaxrsHttpMethodAnnotations = JaxrsHttpMethodAnnotation.values(); + + /*for (PsiAnnotation annotation : annotations) { + for (JaxrsHttpMethodAnnotation methodAnnotation : jaxrsHttpMethodAnnotations) { + if (annotation.getQualifiedName().equals(methodAnnotation.getQualifiedName())) { + list.add(new RequestPath(path, methodAnnotation.getShortName())); + } + } + }*/ + + Arrays.stream(annotations).forEach(a-> Arrays.stream(jaxrsHttpMethodAnnotations).forEach(methodAnnotation-> { + if (a.getQualifiedName().equals(methodAnnotation.getQualifiedName())) { + list.add(new RequestPath(path, methodAnnotation.getShortName())); + } + })); + + return list.toArray(new RequestPath[list.size()]); + } + + private String getWsPathValue(PsiAnnotation annotation) { + String value = PsiAnnotationHelper.getAnnotationAttributeValue(annotation, "value"); + + return value != null ? value : ""; + } +} diff --git a/src/main/java/com/github/aborn/wdt/core/helper/SpringAnnotationHelper.java b/src/main/java/com/github/aborn/wdt/core/helper/SpringAnnotationHelper.java new file mode 100644 index 0000000..b023ecc --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/helper/SpringAnnotationHelper.java @@ -0,0 +1,85 @@ +package com.github.aborn.wdt.core.helper; + +import com.intellij.psi.PsiAnnotation; +import com.intellij.psi.PsiClass; +import com.intellij.psi.PsiMethod; +import com.zhaow.restful.annotations.SpringRequestMethodAnnotation; +import com.zhaow.restful.common.PsiAnnotationHelper; +import com.zhaow.restful.method.RequestPath; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author aborn + * @date 2020/06/15 1:54 PM + */ +public class SpringAnnotationHelper implements AnnotationHelper { + + @Override + public String getClassUriPath(PsiClass psiClass) { + return null; + } + + @Override + public RequestPath[] getRequestPaths(PsiMethod psiMethod) { + PsiAnnotation[] annotations = psiMethod.getModifierList().getAnnotations(); + + if (annotations == null) { + return null; + } + List list = new ArrayList<>(); + + for (PsiAnnotation annotation : annotations) { + for (SpringRequestMethodAnnotation mappingAnnotation : SpringRequestMethodAnnotation.values()) { +// for (PathMappingAnnotation mappingAnnotation : PathMappingAnnotation.allPathMappingAnnotations) { + if (mappingAnnotation.getQualifiedName().endsWith(annotation.getQualifiedName())) { + +// String defaultValue = psiMethod.getName(); + String defaultValue = "/"; + List requestMappings = getRequestMappings(annotation, defaultValue); + if (requestMappings.size() > 0) { + list.addAll(requestMappings); + } + } + } + } + + return list.toArray(new RequestPath[list.size()]); + } + + private static List getRequestMappings(PsiAnnotation annotation, String defaultValue) { + List mappingList = new ArrayList<>(); + + List methodList = PsiAnnotationHelper.getAnnotationAttributeValues(annotation, "method"); + + List pathList = PsiAnnotationHelper.getAnnotationAttributeValues(annotation, "value"); + if (pathList.size() == 0) { + pathList = PsiAnnotationHelper.getAnnotationAttributeValues(annotation, "path"); + } + + // 没有设置 value,默认方法名 + if (pathList.size() == 0) { + pathList.add(defaultValue); + } + + // todo: 处理没有设置 value 或 path 的 RequestMapping + +// List finalPathList = pathList; +// methodList.forEach(method-> finalPathList.forEach(path->mappingList.add(new RequestMapping(path,method)))); + + if (methodList.size() > 0) { + for (String method : methodList) { + for (String path : pathList) { + mappingList.add(new RequestPath(path, method)); + } + } + } else { + for (String path : pathList) { + mappingList.add(new RequestPath(path, null)); + } + } + + return mappingList; + } +} diff --git a/src/main/java/com/github/aborn/wdt/core/resolver/BaseResolver.java b/src/main/java/com/github/aborn/wdt/core/resolver/BaseResolver.java new file mode 100644 index 0000000..7b89e37 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/resolver/BaseResolver.java @@ -0,0 +1,33 @@ +package com.github.aborn.wdt.core.resolver; + +import com.github.aborn.wdt.core.helper.AnnotationHelper; +import com.intellij.psi.PsiElement; +import com.zhaow.restful.method.RequestPath; +import com.zhaow.restful.navigation.action.RestServiceItem; +import org.jetbrains.annotations.NotNull; + +/** + * @author aborn + * @date 2020/06/15 11:41 AM + */ +public abstract class BaseResolver implements IResolver { + protected AnnotationHelper annotationHelper; + + @NotNull + protected RestServiceItem buildRestServiceItem(PsiElement psiMethod, String classUriPath, RequestPath requestMapping) { + if (!classUriPath.startsWith("/")) { + classUriPath = "/".concat(classUriPath); + } + if (!classUriPath.endsWith("/")) { + classUriPath = classUriPath.concat("/"); + } + + String methodPath = requestMapping.getPath(); + + if (methodPath.startsWith("/")) { + methodPath = methodPath.substring(1, methodPath.length()); + } + String requestPath = classUriPath + methodPath; + return new RestServiceItem(psiMethod, requestMapping.getMethod(), requestPath); + } +} diff --git a/src/main/java/com/github/aborn/wdt/core/resolver/IResolver.java b/src/main/java/com/github/aborn/wdt/core/resolver/IResolver.java new file mode 100644 index 0000000..2305c41 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/resolver/IResolver.java @@ -0,0 +1,15 @@ +package com.github.aborn.wdt.core.resolver; + +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.zhaow.restful.navigation.action.RestServiceItem; + +import java.util.List; + +/** + * @author aborn + * @date 2020/06/15 11:26 AM + */ +public interface IResolver { + List getRestServiceItemList(Project project, Module module); +} diff --git a/src/main/java/com/github/aborn/wdt/core/resolver/JavaxrsResolver.java b/src/main/java/com/github/aborn/wdt/core/resolver/JavaxrsResolver.java new file mode 100644 index 0000000..f801f26 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/resolver/JavaxrsResolver.java @@ -0,0 +1,58 @@ +package com.github.aborn.wdt.core.resolver; + +import com.github.aborn.wdt.core.helper.JavaxrsAnnotationHelper; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.zhaow.restful.annotations.JaxrsPathAnnotation; +import com.zhaow.restful.method.RequestPath; +import com.zhaow.restful.navigation.action.RestServiceItem; +import org.apache.commons.compress.utils.Lists; + +import java.util.Collection; +import java.util.List; + +/** + * @author aborn + * @date 2020/06/15 11:44 AM + */ +public class JavaxrsResolver extends BaseResolver { + + public JavaxrsResolver() { + annotationHelper = new JavaxrsAnnotationHelper(); + } + + @Override + public List getRestServiceItemList(Project project, Module module) { + Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, GlobalSearchScope.moduleScope(module)); + List itemList = Lists.newArrayList(); + + psiAnnotations.forEach(psiAnnotation -> { + PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); + PsiElement psiElement = psiModifierList.getParent(); + + if (!(psiElement instanceof PsiClass)) { + return; + } + + PsiClass psiClass = (PsiClass) psiElement; + PsiMethod[] psiMethods = psiClass.getMethods(); + + String classUriPath = annotationHelper.getClassUriPath(psiClass); + for (PsiMethod psiMethod : psiMethods) { + RequestPath[] methodUriPaths = annotationHelper.getRequestPaths(psiMethod); + + for (RequestPath methodUriPath : methodUriPaths) { + RestServiceItem item = buildRestServiceItem(psiMethod, classUriPath, methodUriPath); + item.setModule(module); + itemList.add(item); + } + } + + }); + + return itemList; + } +} diff --git a/src/main/java/com/github/aborn/wdt/core/resolver/SpringResolver.java b/src/main/java/com/github/aborn/wdt/core/resolver/SpringResolver.java new file mode 100644 index 0000000..ddfef42 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/resolver/SpringResolver.java @@ -0,0 +1,90 @@ +package com.github.aborn.wdt.core.resolver; + +import com.github.aborn.wdt.core.helper.SpringAnnotationHelper; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.psi.*; +import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; +import com.intellij.psi.search.GlobalSearchScope; +import com.zhaow.restful.annotations.SpringControllerAnnotation; +import com.zhaow.restful.common.spring.RequestMappingAnnotationHelper; +import com.zhaow.restful.method.RequestPath; +import com.zhaow.restful.navigation.action.RestServiceItem; +import org.apache.commons.compress.utils.Lists; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +/** + * @author aborn + * @date 2020/06/15 11:50 AM + */ +public class SpringResolver extends BaseResolver { + + public SpringResolver() { + annotationHelper = new SpringAnnotationHelper(); + } + + @Override + public List getRestServiceItemList(Project project, Module module) { + Collection psiAnnotations = new ArrayList<>(); + for (SpringControllerAnnotation annotation : SpringControllerAnnotation.values()) { + psiAnnotations.addAll(JavaAnnotationIndex.getInstance().get(annotation.getShortName(), project, GlobalSearchScope.moduleScope(module))); + } + + List itemList = Lists.newArrayList(); + + psiAnnotations.forEach(psiAnnotation -> { + PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); + PsiElement psiElement = psiModifierList.getParent(); + + if (!(psiElement instanceof PsiClass)) { + return; + } + + PsiClass psiClass = (PsiClass) psiElement; + PsiMethod[] psiMethods = psiClass.getMethods(); + + if (psiMethods == null) { + return; + } + + List restServiceItems = getServiceItemList(psiClass, module); + + itemList.addAll(restServiceItems); + + }); + + return itemList; + } + + protected List getServiceItemList(PsiClass psiClass, Module module) { + + PsiMethod[] psiMethods = psiClass.getMethods(); + if (psiMethods == null) { + return new ArrayList<>(); + } + + List itemList = new ArrayList<>(); + List classRequestPaths = RequestMappingAnnotationHelper.getRequestPaths(psiClass); + + for (PsiMethod psiMethod : psiMethods) { + RequestPath[] methodRequestPaths = annotationHelper.getRequestPaths(psiMethod); + + for (RequestPath classRequestPath : classRequestPaths) { + for (RequestPath methodRequestPath : methodRequestPaths) { + String path = classRequestPath.getPath(); + + RestServiceItem item = buildRestServiceItem(psiMethod, path, methodRequestPath); + item.setModule(module); + itemList.add(item); + } + } + + } + return itemList; + } + + +} diff --git a/src/main/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java index ee34a70..68c139b 100644 --- a/src/main/java/com/zhaow/restful/common/ServiceHelper.java +++ b/src/main/java/com/zhaow/restful/common/ServiceHelper.java @@ -1,16 +1,14 @@ package com.zhaow.restful.common; +import com.github.aborn.wdt.core.resolver.IResolver; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiAnnotation; import com.intellij.psi.PsiMethod; -import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; import com.intellij.psi.search.GlobalSearchScope; -import com.zhaow.restful.annotations.JaxrsPathAnnotation; import com.zhaow.restful.common.resolver.JaxrsResolver; import com.zhaow.restful.common.resolver.ServiceResolver; import com.zhaow.restful.common.resolver.SpringResolver; @@ -19,7 +17,6 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.Collection; import java.util.List; /** @@ -37,7 +34,7 @@ public static List buildRestServiceProjectListUsingResolver( List serviceProjectList = new ArrayList<>(); Module[] modules = ModuleManager.getInstance(project).getModules(); - if (modules.length > 1) { + if (modules.length > 0) { for (Module module : modules) { List restServices = buildRestServiceItemListUsingResolver(project, module, anActionEvent); if (restServices.size() > 0) { @@ -49,6 +46,7 @@ public static List buildRestServiceProjectListUsingResolver( if (restServices.size() > 0) { serviceProjectList.add(new RestServiceProject(project.getName() + "(" + restServices.size() +")", restServices)); } + LOG.info("Not find any modules in project " + project.getName() + "."); } return serviceProjectList; @@ -61,13 +59,10 @@ public static List buildRestServiceItemListUsingResolver(Projec SpringResolver springResolver = new SpringResolver(project, anAction); JaxrsResolver jaxrsResolver = new JaxrsResolver(project, anAction); - //ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; - - List javaxPathList = jaxrsResolver.getRestServiceItemList(project, module); - itemList.addAll(javaxPathList); - - List springList = springResolver.getRestServiceItemList(project, module); - itemList.addAll(springList); + ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; + for (ServiceResolver resolver : resolvers) { + itemList.addAll(resolver.getRestServiceItemList(project, module)); + } return itemList; } diff --git a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java index e90f47e..a9c41c0 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java @@ -1,6 +1,7 @@ package com.zhaow.restful.common.resolver; +import com.github.aborn.wdt.utils.FileUtils; import com.intellij.ide.IdeView; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.LangDataKeys; @@ -10,7 +11,6 @@ import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.search.GlobalSearchScope; -import com.github.aborn.wdt.utils.FileUtils; import com.zhaow.restful.method.RequestPath; import com.zhaow.restful.navigation.action.RestServiceItem; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java index f4b5588..3995c0c 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java @@ -33,6 +33,7 @@ public List getRestServiceItemList(Project project, GlobalSearc return buildRestServiceItemList(psiAnnotations); } + @Override public List getRestServiceItemList(Project project, Module module) { Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, GlobalSearchScope.moduleScope(module)); return buildRestServiceItemList(psiAnnotations); diff --git a/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java index a953c46..f0224c7 100644 --- a/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java +++ b/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java @@ -1,5 +1,7 @@ package com.zhaow.restful.common.resolver; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; import com.zhaow.restful.navigation.action.RestServiceItem; import java.util.List; @@ -15,4 +17,12 @@ public interface ServiceResolver { * 获取project 中所有的服务列表 * */ List findAllSupportedServiceItemsInProject(); + + /** + * + * @param project + * @param module + * @return + */ + List getRestServiceItemList(Project project, Module module); } diff --git a/src/main/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java b/src/main/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java index 0fcf663..a9a1553 100644 --- a/src/main/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java +++ b/src/main/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java @@ -26,71 +26,61 @@ import org.jetbrains.annotations.Nullable; public class RestServiceChooseByNamePopup extends ChooseByNamePopup { - public static final Key CHOOSE_BY_NAME_POPUP_IN_PROJECT_KEY = new Key<>("ChooseByNamePopup"); + public static final Key CHOOSE_BY_NAME_POPUP_IN_PROJECT_KEY = new Key<>("ChooseByNamePopup"); - protected RestServiceChooseByNamePopup(@Nullable Project project, @NotNull ChooseByNameModel model, @NotNull ChooseByNameItemProvider provider, @Nullable ChooseByNamePopup oldPopup, @Nullable String predefinedText, boolean mayRequestOpenInCurrentWindow, int initialIndex) { - super(project, model, provider, oldPopup, predefinedText, mayRequestOpenInCurrentWindow, initialIndex); - } + protected RestServiceChooseByNamePopup(@Nullable Project project, @NotNull ChooseByNameModel model, @NotNull ChooseByNameItemProvider provider, @Nullable ChooseByNamePopup oldPopup, @Nullable String predefinedText, boolean mayRequestOpenInCurrentWindow, int initialIndex) { + super(project, model, provider, oldPopup, predefinedText, mayRequestOpenInCurrentWindow, initialIndex); + } + + public static RestServiceChooseByNamePopup createPopup(final Project project, + @NotNull final ChooseByNameModel model, + @NotNull ChooseByNameItemProvider provider, + @Nullable final String predefinedText, + boolean mayRequestOpenInCurrentWindow, + final int initialIndex) { + if (!StringUtil.isEmptyOrSpaces(predefinedText)) { + return new RestServiceChooseByNamePopup(project, model, provider, null, predefinedText, mayRequestOpenInCurrentWindow, initialIndex); + } - public static RestServiceChooseByNamePopup createPopup(final Project project, - @NotNull final ChooseByNameModel model, - @NotNull ChooseByNameItemProvider provider, - @Nullable final String predefinedText, - boolean mayRequestOpenInCurrentWindow, - final int initialIndex) { - if (!StringUtil.isEmptyOrSpaces(predefinedText)) { - return new RestServiceChooseByNamePopup(project, model, provider, null, predefinedText, mayRequestOpenInCurrentWindow, initialIndex); - } + final RestServiceChooseByNamePopup oldPopup = project == null ? null : project.getUserData(CHOOSE_BY_NAME_POPUP_IN_PROJECT_KEY); + if (oldPopup != null) { + oldPopup.close(false); + } + RestServiceChooseByNamePopup newPopup = new RestServiceChooseByNamePopup(project, model, provider, oldPopup, predefinedText, mayRequestOpenInCurrentWindow, initialIndex); - final RestServiceChooseByNamePopup oldPopup = project == null ? null : project.getUserData(CHOOSE_BY_NAME_POPUP_IN_PROJECT_KEY); - if (oldPopup != null) { - oldPopup.close(false); + if (project != null) { + project.putUserData(CHOOSE_BY_NAME_POPUP_IN_PROJECT_KEY, newPopup); + } + return newPopup; } - RestServiceChooseByNamePopup newPopup = new RestServiceChooseByNamePopup(project, model, provider, oldPopup, predefinedText, mayRequestOpenInCurrentWindow, initialIndex); - if (project != null) { - project.putUserData(CHOOSE_BY_NAME_POPUP_IN_PROJECT_KEY, newPopup); + @Override + public String transformPattern(String pattern) { + final ChooseByNameModel model = getModel(); + return getTransformedPattern(pattern, model); } - return newPopup; - } - @Override - public String transformPattern(String pattern) { - final ChooseByNameModel model = getModel(); - return getTransformedPattern(pattern, model); - } + //TODO: resolve PathVariable + public static String getTransformedPattern(String pattern, ChooseByNameModel model) { + if (!(model instanceof GotoRequestMappingModel)) { + return pattern; + } -//TODO: resolve PathVariable - public static String getTransformedPattern(String pattern, ChooseByNameModel model) { - if (! (model instanceof GotoRequestMappingModel) ) { - return pattern; + pattern = ToolkitUtil.removeRedundancyMarkup(pattern); + return pattern; } - pattern = ToolkitUtil.removeRedundancyMarkup(pattern);; - return pattern; - } + @Nullable + public String getMemberPattern() { + final String enteredText = getTrimmedText(); + final int index = enteredText.lastIndexOf('#'); + if (index == -1) { + return null; + } - @Nullable - public String getMemberPattern() { - final String enteredText = getTrimmedText(); - final int index = enteredText.lastIndexOf('#'); - if (index == -1) { - return null; + String name = enteredText.substring(index + 1).trim(); + return StringUtil.isEmptyOrSpaces(name) ? null : name; } - String name = enteredText.substring(index + 1).trim(); - return StringUtil.isEmptyOrSpaces(name) ? null : name; - } - -/* public void repaintList() { - myRepaintQueue.cancelAllUpdates(); - myRepaintQueue.queue(new Update(this) { - @Override - public void run() { - RestServiceChooseByNamePopup.this.repaintListImmediate(); - } - }); - }*/ - } \ No newline at end of file diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java index 803cf24..eccf696 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java @@ -15,6 +15,7 @@ */ package com.zhaow.restful.navigator; +import com.github.aborn.wdt.core.RestServiceDataManager; import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; @@ -63,7 +64,9 @@ public void loadState(RestServicesNavigatorState state) { public List getServiceProjects(AnActionEvent anActionEvent) { return DumbService.getInstance(myProject).runReadActionInSmartMode(() -> - ServiceHelper.buildRestServiceProjectListUsingResolver(myProject, anActionEvent, this)); + //ServiceHelper.buildRestServiceProjectListUsingResolver(myProject, anActionEvent, this) + RestServiceDataManager.buildRestServiceData(myProject, anActionEvent) + ); } From ad1eb6f64709f5ea288d309d513d2482737bf5c6 Mon Sep 17 00:00:00 2001 From: aborn Date: Mon, 15 Jun 2020 15:53:41 +0800 Subject: [PATCH 17/21] fix search bug --- .../wdt/core/RestServiceDataManager.java | 64 +++++++++---------- .../aborn/wdt/core/resolver/IResolver.java | 13 ++++ .../wdt/core/resolver/JavaxrsResolver.java | 15 ++++- .../wdt/core/resolver/SpringResolver.java | 17 ++++- .../action/GotoRequestMappingContributor.java | 37 ++++------- .../navigator/RestServiceProjectsManager.java | 2 +- 6 files changed, 83 insertions(+), 65 deletions(-) diff --git a/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java b/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java index 2cf46d0..6f432e3 100644 --- a/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java +++ b/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java @@ -3,18 +3,14 @@ import com.github.aborn.wdt.core.resolver.IResolver; import com.github.aborn.wdt.core.resolver.JavaxrsResolver; import com.github.aborn.wdt.core.resolver.SpringResolver; -import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; -import com.intellij.psi.search.GlobalSearchScope; import com.zhaow.restful.common.ServiceHelper; -import com.zhaow.restful.common.resolver.JaxrsResolver; import com.zhaow.restful.navigation.action.RestServiceItem; import com.zhaow.restful.navigator.RestServiceProject; import org.apache.commons.compress.utils.Lists; -import org.jetbrains.annotations.NotNull; import java.util.List; @@ -26,26 +22,19 @@ public class RestServiceDataManager { public static final Logger LOG = Logger.getInstance(ServiceHelper.class); - public static List buildRestServiceData(Project project, AnActionEvent anActionEvent) { + public static List buildRestServiceData(Project project) { List serviceProjectList = Lists.newArrayList(); Module[] modules = ModuleManager.getInstance(project).getModules(); - IResolver[] resolvers = {new SpringResolver(), new JavaxrsResolver()}; - - if (modules.length > 0) { for (Module module : modules) { - List restServices = Lists.newArrayList(); - for (IResolver resolver : resolvers) { - restServices.addAll(resolver.getRestServiceItemList(project, module)); - } - + List restServices = buildRestServiceItemListFrom(project, module); if (restServices.size() > 0) { serviceProjectList.add(new RestServiceProject(module.getName() + "(" + restServices.size() +")", restServices)); } } } else { - List restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); + List restServices = buildRestServiceItemListFrom(project); if (restServices.size() > 0) { serviceProjectList.add(new RestServiceProject(project.getName() + "(" + restServices.size() +")", restServices)); } @@ -55,27 +44,32 @@ public static List buildRestServiceData(Project project, AnA return serviceProjectList; } - // TODO 需要重构 - @NotNull - public static List buildRestServiceItemListUsingResolver(Project project, AnActionEvent anAction) { - List itemList = Lists.newArrayList(); - - com.zhaow.restful.common.resolver.SpringResolver springResolver = new com.zhaow.restful.common.resolver.SpringResolver(project, anAction); - JaxrsResolver jaxrsResolver = new JaxrsResolver(project, anAction); - - //ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; - - List javaxPathList = jaxrsResolver.getRestServiceItemList(project, GlobalSearchScope.allScope(project)); - itemList.addAll(javaxPathList); - List springList = springResolver.findAllSupportedServiceItemsInProject(); - itemList.addAll(springList); - -// for (ServiceResolver resolver : resolvers) { -// List allSupportedServiceItemsInProject = resolver.findAllSupportedServiceItemsInProject(); -// -// itemList.addAll(allSupportedServiceItemsInProject); -// } + /** + * from module + * @param project + * @param module + * @return + */ + public static List buildRestServiceItemListFrom(Project project, Module module) { + IResolver[] resolvers = {new SpringResolver(), new JavaxrsResolver()}; + List restServices = Lists.newArrayList(); + for (IResolver resolver : resolvers) { + restServices.addAll(resolver.getRestServiceItemList(project, module)); + } + return restServices; + } - return itemList; + /** + * from project + * @param project + * @return + */ + public static List buildRestServiceItemListFrom(Project project) { + IResolver[] resolvers = {new SpringResolver(), new JavaxrsResolver()}; + List restServices = Lists.newArrayList(); + for (IResolver resolver : resolvers) { + restServices.addAll(resolver.getRestServiceItemList(project)); + } + return restServices; } } diff --git a/src/main/java/com/github/aborn/wdt/core/resolver/IResolver.java b/src/main/java/com/github/aborn/wdt/core/resolver/IResolver.java index 2305c41..bbf5bbd 100644 --- a/src/main/java/com/github/aborn/wdt/core/resolver/IResolver.java +++ b/src/main/java/com/github/aborn/wdt/core/resolver/IResolver.java @@ -11,5 +11,18 @@ * @date 2020/06/15 11:26 AM */ public interface IResolver { + /** + * build data from module in project + * @param project + * @param module + * @return + */ List getRestServiceItemList(Project project, Module module); + + /** + * build data from all project + * @param project + * @return + */ + List getRestServiceItemList(Project project); } diff --git a/src/main/java/com/github/aborn/wdt/core/resolver/JavaxrsResolver.java b/src/main/java/com/github/aborn/wdt/core/resolver/JavaxrsResolver.java index f801f26..853d05b 100644 --- a/src/main/java/com/github/aborn/wdt/core/resolver/JavaxrsResolver.java +++ b/src/main/java/com/github/aborn/wdt/core/resolver/JavaxrsResolver.java @@ -24,11 +24,20 @@ public JavaxrsResolver() { annotationHelper = new JavaxrsAnnotationHelper(); } + @Override + public List getRestServiceItemList(Project project) { + Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, GlobalSearchScope.projectScope(project)); + return build(psiAnnotations, null); + } + @Override public List getRestServiceItemList(Project project, Module module) { Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, GlobalSearchScope.moduleScope(module)); - List itemList = Lists.newArrayList(); + return build(psiAnnotations, module); + } + private List build(Collection psiAnnotations, Module module) { + List itemList = Lists.newArrayList(); psiAnnotations.forEach(psiAnnotation -> { PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); PsiElement psiElement = psiModifierList.getParent(); @@ -46,7 +55,9 @@ public List getRestServiceItemList(Project project, Module modu for (RequestPath methodUriPath : methodUriPaths) { RestServiceItem item = buildRestServiceItem(psiMethod, classUriPath, methodUriPath); - item.setModule(module); + if (module != null) { + item.setModule(module); + } itemList.add(item); } } diff --git a/src/main/java/com/github/aborn/wdt/core/resolver/SpringResolver.java b/src/main/java/com/github/aborn/wdt/core/resolver/SpringResolver.java index ddfef42..b08c865 100644 --- a/src/main/java/com/github/aborn/wdt/core/resolver/SpringResolver.java +++ b/src/main/java/com/github/aborn/wdt/core/resolver/SpringResolver.java @@ -26,12 +26,25 @@ public SpringResolver() { annotationHelper = new SpringAnnotationHelper(); } + @Override + public List getRestServiceItemList(Project project) { + Collection psiAnnotations = new ArrayList<>(); + for (SpringControllerAnnotation annotation : SpringControllerAnnotation.values()) { + psiAnnotations.addAll(JavaAnnotationIndex.getInstance().get(annotation.getShortName(), project, GlobalSearchScope.projectScope(project))); + } + return build(psiAnnotations, null); + } + @Override public List getRestServiceItemList(Project project, Module module) { Collection psiAnnotations = new ArrayList<>(); for (SpringControllerAnnotation annotation : SpringControllerAnnotation.values()) { psiAnnotations.addAll(JavaAnnotationIndex.getInstance().get(annotation.getShortName(), project, GlobalSearchScope.moduleScope(module))); } + return build(psiAnnotations, module); + } + + private List build(Collection psiAnnotations, Module module) { List itemList = Lists.newArrayList(); @@ -77,7 +90,9 @@ protected List getServiceItemList(PsiClass psiClass, Module mod String path = classRequestPath.getPath(); RestServiceItem item = buildRestServiceItem(psiMethod, path, methodRequestPath); - item.setModule(module); + if (module != null) { + item.setModule(module); + } itemList.add(item); } } diff --git a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java index f93c7c4..ac1fa0b 100644 --- a/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java +++ b/src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java @@ -1,16 +1,15 @@ package com.zhaow.restful.navigation.action; +import com.github.aborn.wdt.core.RestServiceDataManager; import com.intellij.navigation.ChooseByNameContributor; import com.intellij.navigation.NavigationItem; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; -import com.zhaow.restful.common.ServiceHelper; import org.jetbrains.annotations.NotNull; import java.util.List; -// public class GotoRequestMappingContributor implements ChooseByNameContributor { Module myModule; @@ -20,22 +19,24 @@ public GotoRequestMappingContributor(Module myModule) { this.myModule = myModule; } - //Returns the list of names for the specified project to which it is possible to navigate by name. 所有该类型的文件列表 @NotNull @Override public String[] getNames(Project project, boolean onlyThisModuleChecked) { String[] names = null; List itemList; - ///todo 查找 project 中所有符合 rest url 类型文件,包含 request 接口 - //if (onlyThisModuleChecked && myModule != null) { - // itemList = ServiceHelper.buildRestServiceItemListUsingResolver(myModule, null); - //} else { - itemList = ServiceHelper.buildRestServiceItemListUsingResolver(project, null); - //} + + // data source + if (onlyThisModuleChecked && myModule != null) { + itemList = RestServiceDataManager.buildRestServiceItemListFrom(project, myModule); + } else { + itemList = RestServiceDataManager.buildRestServiceItemListFrom(project); + } navItem = itemList; - if (itemList != null) names = new String[itemList.size()]; + if (itemList != null) { + names = new String[itemList.size()]; + } for (int i = 0; i < itemList.size(); i++) { RestServiceItem requestMappingNavigationItem = itemList.get(i); @@ -44,26 +45,10 @@ public String[] getNames(Project project, boolean onlyThisModuleChecked) { return names; } -/* - - private List findAllRestServiceItemList(Module myModule) { -// List itemList = ServiceHelper.buildRestServiceItemList(myModule); - return ServiceHelper.buildRestServiceItemListUsingResolver(myModule); - } - - private List findAllRestServiceItemList(Project project) { -// Arrays.stream(SpringRequestAnnotation.values()).flatMap(annotation -> ) - List itemList = ServiceHelper.buildRestServiceItemList(project); - - return itemList; - } -*/ - //Returns the list of navigation items matching the specified name. 匹配,对比 @NotNull @Override public NavigationItem[] getItemsByName(String name, String pattern, Project project, boolean onlyThisModuleChecked) { -// AntPathMatcher NavigationItem[] navigationItems = navItem.stream().filter(item -> item.getName().equals(name)).toArray(NavigationItem[]::new); return navigationItems; diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java index eccf696..be514c3 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java @@ -65,7 +65,7 @@ public void loadState(RestServicesNavigatorState state) { public List getServiceProjects(AnActionEvent anActionEvent) { return DumbService.getInstance(myProject).runReadActionInSmartMode(() -> //ServiceHelper.buildRestServiceProjectListUsingResolver(myProject, anActionEvent, this) - RestServiceDataManager.buildRestServiceData(myProject, anActionEvent) + RestServiceDataManager.buildRestServiceData(myProject) ); } From 1f62b42bcbced55530e11dfec96b7becd15914e2 Mon Sep 17 00:00:00 2001 From: aborn Date: Mon, 15 Jun 2020 15:55:19 +0800 Subject: [PATCH 18/21] code format --- .../java/com/github/aborn/wdt/core/RestServiceDataManager.java | 3 +-- .../zhaow/restful/navigator/RestServiceProjectsManager.java | 3 --- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java b/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java index 6f432e3..533c5db 100644 --- a/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java +++ b/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java @@ -7,7 +7,6 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; -import com.zhaow.restful.common.ServiceHelper; import com.zhaow.restful.navigation.action.RestServiceItem; import com.zhaow.restful.navigator.RestServiceProject; import org.apache.commons.compress.utils.Lists; @@ -20,7 +19,7 @@ */ public class RestServiceDataManager { - public static final Logger LOG = Logger.getInstance(ServiceHelper.class); + public static final Logger LOG = Logger.getInstance(RestServiceDataManager.class); public static List buildRestServiceData(Project project) { List serviceProjectList = Lists.newArrayList(); diff --git a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java index be514c3..5b1e8f9 100644 --- a/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java @@ -19,13 +19,11 @@ import com.intellij.openapi.Disposable; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.components.AbstractProjectComponent; import com.intellij.openapi.components.PersistentStateComponent; import com.intellij.openapi.components.ProjectComponent; import com.intellij.openapi.components.State; import com.intellij.openapi.project.DumbService; import com.intellij.openapi.project.Project; -import com.zhaow.restful.common.ServiceHelper; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -64,7 +62,6 @@ public void loadState(RestServicesNavigatorState state) { public List getServiceProjects(AnActionEvent anActionEvent) { return DumbService.getInstance(myProject).runReadActionInSmartMode(() -> - //ServiceHelper.buildRestServiceProjectListUsingResolver(myProject, anActionEvent, this) RestServiceDataManager.buildRestServiceData(myProject) ); } From dc98e8b232b1a8cbd38be270979576faa9a3c017 Mon Sep 17 00:00:00 2001 From: aborn Date: Mon, 15 Jun 2020 15:59:54 +0800 Subject: [PATCH 19/21] delete useless code --- .../zhaow/restful/common/IntellijUtils.java | 6 - .../zhaow/restful/common/ServiceHelper.java | 92 ------ .../common/resolver/BaseServiceResolver.java | 96 ------- .../restful/common/resolver/Convertor.java | 52 ---- .../common/resolver/JaxrsResolver.java | 75 ----- .../common/resolver/ServiceResolver.java | 28 -- .../common/resolver/SpringResolver.java | 272 ------------------ 7 files changed, 621 deletions(-) delete mode 100644 src/main/java/com/zhaow/restful/common/IntellijUtils.java delete mode 100644 src/main/java/com/zhaow/restful/common/ServiceHelper.java delete mode 100644 src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java delete mode 100644 src/main/java/com/zhaow/restful/common/resolver/Convertor.java delete mode 100644 src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java delete mode 100644 src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java delete mode 100644 src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java diff --git a/src/main/java/com/zhaow/restful/common/IntellijUtils.java b/src/main/java/com/zhaow/restful/common/IntellijUtils.java deleted file mode 100644 index 5b6f0db..0000000 --- a/src/main/java/com/zhaow/restful/common/IntellijUtils.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.zhaow.restful.common; - - -public class IntellijUtils { - -} diff --git a/src/main/java/com/zhaow/restful/common/ServiceHelper.java b/src/main/java/com/zhaow/restful/common/ServiceHelper.java deleted file mode 100644 index 68c139b..0000000 --- a/src/main/java/com/zhaow/restful/common/ServiceHelper.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.zhaow.restful.common; - -import com.github.aborn.wdt.core.resolver.IResolver; -import com.intellij.openapi.Disposable; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiMethod; -import com.intellij.psi.search.GlobalSearchScope; -import com.zhaow.restful.common.resolver.JaxrsResolver; -import com.zhaow.restful.common.resolver.ServiceResolver; -import com.zhaow.restful.common.resolver.SpringResolver; -import com.zhaow.restful.navigation.action.RestServiceItem; -import com.zhaow.restful.navigator.RestServiceProject; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -/** - * 服务相关工具类 - */ -public class ServiceHelper { - public static final Logger LOG = Logger.getInstance(ServiceHelper.class); - PsiMethod psiMethod; - - public ServiceHelper(PsiMethod psiMethod) { - this.psiMethod = psiMethod; - } - - public static List buildRestServiceProjectListUsingResolver(Project project, AnActionEvent anActionEvent, Disposable disposable) { - List serviceProjectList = new ArrayList<>(); - Module[] modules = ModuleManager.getInstance(project).getModules(); - - if (modules.length > 0) { - for (Module module : modules) { - List restServices = buildRestServiceItemListUsingResolver(project, module, anActionEvent); - if (restServices.size() > 0) { - serviceProjectList.add(new RestServiceProject(module.getName() + "(" + restServices.size() +")", restServices)); - } - } - } else { - List restServices = buildRestServiceItemListUsingResolver(project, anActionEvent); - if (restServices.size() > 0) { - serviceProjectList.add(new RestServiceProject(project.getName() + "(" + restServices.size() +")", restServices)); - } - LOG.info("Not find any modules in project " + project.getName() + "."); - } - - return serviceProjectList; - } - - @NotNull - public static List buildRestServiceItemListUsingResolver(Project project, Module module, AnActionEvent anAction) { - List itemList = new ArrayList<>(); - - SpringResolver springResolver = new SpringResolver(project, anAction); - JaxrsResolver jaxrsResolver = new JaxrsResolver(project, anAction); - - ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; - for (ServiceResolver resolver : resolvers) { - itemList.addAll(resolver.getRestServiceItemList(project, module)); - } - - return itemList; - } - - @NotNull - public static List buildRestServiceItemListUsingResolver(Project project, AnActionEvent anAction) { - List itemList = new ArrayList<>(); - - SpringResolver springResolver = new SpringResolver(project, anAction); - JaxrsResolver jaxrsResolver = new JaxrsResolver(project, anAction); - - //ServiceResolver[] resolvers = {springResolver, jaxrsResolver}; - - List javaxPathList = jaxrsResolver.getRestServiceItemList(project, GlobalSearchScope.allScope(project)); - itemList.addAll(javaxPathList); - List springList = springResolver.findAllSupportedServiceItemsInProject(); - itemList.addAll(springList); - -// for (ServiceResolver resolver : resolvers) { -// List allSupportedServiceItemsInProject = resolver.findAllSupportedServiceItemsInProject(); -// -// itemList.addAll(allSupportedServiceItemsInProject); -// } - - return itemList; - } -} diff --git a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java deleted file mode 100644 index a9c41c0..0000000 --- a/src/main/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.zhaow.restful.common.resolver; - - -import com.github.aborn.wdt.utils.FileUtils; -import com.intellij.ide.IdeView; -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.actionSystem.LangDataKeys; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiDirectory; -import com.intellij.psi.PsiElement; -import com.intellij.psi.search.GlobalSearchScope; -import com.zhaow.restful.method.RequestPath; -import com.zhaow.restful.navigation.action.RestServiceItem; -import org.jetbrains.annotations.NotNull; - -import java.util.ArrayList; -import java.util.List; - -public abstract class BaseServiceResolver implements ServiceResolver { - Module myModule; - Project myProject; - AnActionEvent anActionEvent; - - @Override - public List findAllSupportedServiceItemsInModule() { - List itemList = new ArrayList<>(); - if (myModule == null) { - return itemList; - } - - itemList = findAllSupportedServiceItemsInProject(); - return itemList; - } - - public abstract List getRestServiceItemList(Project project, GlobalSearchScope globalSearchScope); - - @Override - public List findAllSupportedServiceItemsInProject() { - List itemList = null; - if (myProject == null && myModule != null) { - myProject = myModule.getProject(); - } - - if (anActionEvent == null) { - return new ArrayList<>(); - } - - - final IdeView view = anActionEvent.getData(LangDataKeys.IDE_VIEW); - - if (view == null) { - return new ArrayList<>(); - } - - PsiDirectory directory = view.getOrChooseDirectory(); - - List allClasses = new ArrayList<>(); - if (directory != null) { - allClasses.addAll(FileUtils.getJavaFilesFromDir(directory)); - } - - itemList = new ArrayList<>(); - for (PsiClass psiClass : allClasses) { - itemList.addAll(Convertor.getServiceItemList(psiClass)); - } - - return itemList; - - } - - @NotNull - protected RestServiceItem createRestServiceItem(PsiElement psiMethod, String classUriPath, RequestPath requestMapping) { - if (!classUriPath.startsWith("/")) { - classUriPath = "/".concat(classUriPath); - } - if (!classUriPath.endsWith("/")) { - classUriPath = classUriPath.concat("/"); - } - - String methodPath = requestMapping.getPath(); - - if (methodPath.startsWith("/")) { - methodPath = methodPath.substring(1, methodPath.length()); - } - String requestPath = classUriPath + methodPath; - - RestServiceItem item = new RestServiceItem(psiMethod, requestMapping.getMethod(), requestPath); - if (myModule != null) { - item.setModule(myModule); - } - return item; - } - -} diff --git a/src/main/java/com/zhaow/restful/common/resolver/Convertor.java b/src/main/java/com/zhaow/restful/common/resolver/Convertor.java deleted file mode 100644 index 390d8e4..0000000 --- a/src/main/java/com/zhaow/restful/common/resolver/Convertor.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.zhaow.restful.common.resolver; - -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiElement; -import com.intellij.psi.PsiMethod; -import com.zhaow.restful.common.spring.RequestMappingAnnotationHelper; -import com.zhaow.restful.method.RequestPath; -import com.zhaow.restful.navigation.action.RestServiceItem; - -import java.util.ArrayList; -import java.util.List; - -public class Convertor { - - public static List getServiceItemList(PsiClass psiClass) { - - PsiMethod[] psiMethods = psiClass.getMethods(); - if (psiMethods == null) { - return new ArrayList<>(); - } - - List itemList = new ArrayList<>(); - List classRequestPaths = RequestMappingAnnotationHelper.getRequestPaths(psiClass); - - for (PsiMethod psiMethod : psiMethods) { - RequestPath[] methodRequestPaths = RequestMappingAnnotationHelper.getRequestPaths(psiMethod); - - for (RequestPath classRequestPath : classRequestPaths) { - for (RequestPath methodRequestPath : methodRequestPaths) { - String path = classRequestPath.getPath(); - RestServiceItem item = createRestServiceItem(psiMethod, path, methodRequestPath); - itemList.add(item); - } - } - - } - return itemList; - } - - private static RestServiceItem createRestServiceItem(PsiElement psiMethod, String classUriPath, RequestPath requestMapping) { - if (!classUriPath.startsWith("/")) classUriPath = "/".concat(classUriPath); - if (!classUriPath.endsWith("/")) classUriPath = classUriPath.concat("/"); - - String methodPath = requestMapping.getPath(); - - if (methodPath.startsWith("/")) methodPath = methodPath.substring(1, methodPath.length()); - String requestPath = classUriPath + methodPath; - - RestServiceItem item = new RestServiceItem(psiMethod, requestMapping.getMethod(), requestPath); - return item; - } -} diff --git a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java b/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java deleted file mode 100644 index 3995c0c..0000000 --- a/src/main/java/com/zhaow/restful/common/resolver/JaxrsResolver.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.zhaow.restful.common.resolver; - - -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; -import com.intellij.psi.search.GlobalSearchScope; -import com.zhaow.restful.annotations.JaxrsPathAnnotation; -import com.zhaow.restful.common.jaxrs.JaxrsAnnotationHelper; -import com.zhaow.restful.method.RequestPath; -import com.zhaow.restful.navigation.action.RestServiceItem; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - -public class JaxrsResolver extends BaseServiceResolver { - - public JaxrsResolver(Module module) { - myModule = module; - } - - public JaxrsResolver(Project project, AnActionEvent event) { - myProject = project; - anActionEvent = event; - } - - @Override - public List getRestServiceItemList(Project project, GlobalSearchScope globalSearchScope) { - Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, globalSearchScope); - return buildRestServiceItemList(psiAnnotations); - } - - @Override - public List getRestServiceItemList(Project project, Module module) { - Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(JaxrsPathAnnotation.PATH.getShortName(), project, GlobalSearchScope.moduleScope(module)); - return buildRestServiceItemList(psiAnnotations); - } - - public List buildRestServiceItemList(Collection psiAnnotations) { - List itemList = new ArrayList<>(); - - for (PsiAnnotation psiAnnotation : psiAnnotations) { - PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); - PsiElement psiElement = psiModifierList.getParent(); - - if (!(psiElement instanceof PsiClass)) { - continue; - } - - PsiClass psiClass = (PsiClass) psiElement; - PsiMethod[] psiMethods = psiClass.getMethods(); - - if (psiMethods == null) { - continue; - } - - String classUriPath = JaxrsAnnotationHelper.getClassUriPath(psiClass); - - for (PsiMethod psiMethod : psiMethods) { - RequestPath[] methodUriPaths = JaxrsAnnotationHelper.getRequestPaths(psiMethod); - - for (RequestPath methodUriPath : methodUriPaths) { - RestServiceItem item = createRestServiceItem(psiMethod, classUriPath, methodUriPath); - itemList.add(item); - } - } - - } - - return itemList; - } -} diff --git a/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java b/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java deleted file mode 100644 index f0224c7..0000000 --- a/src/main/java/com/zhaow/restful/common/resolver/ServiceResolver.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.zhaow.restful.common.resolver; - -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.zhaow.restful.navigation.action.RestServiceItem; - -import java.util.List; - -public interface ServiceResolver { - - /** - * 获取module 中所有的服务列表 - */ - List findAllSupportedServiceItemsInModule(); - - /** - * 获取project 中所有的服务列表 - * */ - List findAllSupportedServiceItemsInProject(); - - /** - * - * @param project - * @param module - * @return - */ - List getRestServiceItemList(Project project, Module module); -} diff --git a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java b/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java deleted file mode 100644 index 25daf93..0000000 --- a/src/main/java/com/zhaow/restful/common/resolver/SpringResolver.java +++ /dev/null @@ -1,272 +0,0 @@ -package com.zhaow.restful.common.resolver; - -import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.intellij.psi.*; -import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; -import com.intellij.psi.search.GlobalSearchScope; -import com.zhaow.restful.annotations.JaxrsPathAnnotation; -import com.zhaow.restful.annotations.PathMappingAnnotation; -import com.zhaow.restful.annotations.SpringControllerAnnotation; -import com.zhaow.restful.annotations.SpringRequestMethodAnnotation; -import com.zhaow.restful.common.jaxrs.JaxrsAnnotationHelper; -import com.zhaow.restful.common.spring.RequestMappingAnnotationHelper; -import com.zhaow.restful.method.RequestPath; -import com.zhaow.restful.method.action.PropertiesHandler; -import com.zhaow.restful.navigation.action.RestServiceItem; -import org.jetbrains.kotlin.idea.stubindex.KotlinAnnotationsIndex; -import org.jetbrains.kotlin.psi.*; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -public class SpringResolver extends BaseServiceResolver { - - PropertiesHandler propertiesHandler; - - public SpringResolver(Project project, AnActionEvent anAction) { - myProject = project; - anActionEvent = anAction; - - } - - public List getRestServiceItemList(Project project, Module module) { - Collection psiAnnotations = new ArrayList<>(); - for (SpringControllerAnnotation annotation : SpringControllerAnnotation.values()) { - psiAnnotations.addAll(JavaAnnotationIndex.getInstance().get(annotation.getShortName(), project, GlobalSearchScope.moduleScope(module))); - } - return buildRestServiceItemList(psiAnnotations); - } - - public List buildRestServiceItemList(Collection psiAnnotations) { - List itemList = new ArrayList<>(); - - for (PsiAnnotation psiAnnotation : psiAnnotations) { - PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); - PsiElement psiElement = psiModifierList.getParent(); - - if (!(psiElement instanceof PsiClass)) { - continue; - } - - PsiClass psiClass = (PsiClass) psiElement; - PsiMethod[] psiMethods = psiClass.getMethods(); - - if (psiMethods == null) { - continue; - } - - List restServiceItems = getServiceItemList(psiClass); - - itemList.addAll(restServiceItems); - - } - - return itemList; - } - - @Override - public List getRestServiceItemList(Project project, GlobalSearchScope globalSearchScope) { - List itemList = new ArrayList<>(); - - // TODO: 这种实现的局限了其他方式实现的url映射(xml(类似struts),webflux routers) - SpringControllerAnnotation[] supportedAnnotations = SpringControllerAnnotation.values(); - for (PathMappingAnnotation controllerAnnotation : supportedAnnotations) { - - // java: 标注了 (Rest)Controller 注解的类,即 Controller 类 - Collection psiAnnotations = JavaAnnotationIndex.getInstance().get(controllerAnnotation.getShortName(), project, globalSearchScope); - for (PsiAnnotation psiAnnotation : psiAnnotations) { - PsiModifierList psiModifierList = (PsiModifierList) psiAnnotation.getParent(); - PsiElement psiElement = psiModifierList.getParent(); - - PsiClass psiClass = (PsiClass) psiElement; - List serviceItemList = getServiceItemList(psiClass); - itemList.addAll(serviceItemList); - } - - - // kotlin: - Collection ktAnnotationEntries = KotlinAnnotationsIndex.getInstance().get(controllerAnnotation.getShortName(), project, globalSearchScope); - for (KtAnnotationEntry ktAnnotationEntry : ktAnnotationEntries) { - KtClass ktClass = (KtClass) ktAnnotationEntry.getParent().getParent(); - - List classRequestPaths = getRequestPaths(ktClass); - - List ktNamedFunctions = getKtNamedFunctions(ktClass); - for (KtNamedFunction fun : ktNamedFunctions) { - List requestPaths = getRequestPaths(fun); - - for (RequestPath classRequestPath : classRequestPaths) { - for (RequestPath requestPath : requestPaths) { - requestPath.concat(classRequestPath); - itemList.add(createRestServiceItem(fun, "", requestPath)); - } - } - } - } - } - - return itemList; - } - - protected List getServiceItemList(PsiClass psiClass) { - - PsiMethod[] psiMethods = psiClass.getMethods(); - if (psiMethods == null) { - return new ArrayList<>(); - } - - List itemList = new ArrayList<>(); - List classRequestPaths = RequestMappingAnnotationHelper.getRequestPaths(psiClass); - - for (PsiMethod psiMethod : psiMethods) { - RequestPath[] methodRequestPaths = RequestMappingAnnotationHelper.getRequestPaths(psiMethod); - - for (RequestPath classRequestPath : classRequestPaths) { - for (RequestPath methodRequestPath : methodRequestPaths) { - String path = classRequestPath.getPath(); - - RestServiceItem item = createRestServiceItem(psiMethod, path, methodRequestPath); - itemList.add(item); - } - } - - } - return itemList; - } - - private List getKtNamedFunctions(KtClass ktClass) { - List ktNamedFunctions = new ArrayList<>(); - List declarations = ktClass.getDeclarations(); - - for (KtDeclaration declaration : declarations) { - if (declaration instanceof KtNamedFunction) { - KtNamedFunction fun = (KtNamedFunction) declaration; - ktNamedFunctions.add(fun); - - } - } - return ktNamedFunctions; - } - - private List getRequestPaths(KtClass ktClass) { - String defaultPath = "/"; - //方法注解 - List annotationEntries = ktClass.getModifierList().getAnnotationEntries(); - - List requestPaths = getRequestMappings(defaultPath, annotationEntries); - return requestPaths; - } - - private List getRequestPaths(KtNamedFunction fun) { -// String methodBody = fun.getBodyExpression().getText();// 方法体 -// String defaultPath = fun.getName(); - String defaultPath = "/"; - //方法注解 - List annotationEntries = fun.getModifierList().getAnnotationEntries(); - List requestPaths = getRequestMappings(defaultPath, annotationEntries); - return requestPaths; - } - - private List getRequestMappings(String defaultPath, List annotationEntries) { - List requestPaths = new ArrayList<>(); - for (KtAnnotationEntry entry : annotationEntries) { -// List requestMappings = getRequestMappings(defaultPath, entry); - List requestMappings = getRequestMappings(defaultPath, entry); - requestPaths.addAll(requestMappings); - } - return requestPaths; - } - - private List getRequestMappings(String defaultPath, KtAnnotationEntry entry) { - List requestPaths = new ArrayList<>(); - List methodList = new ArrayList<>(); - List pathList = new ArrayList<>(); - - String annotationName = entry.getCalleeExpression().getText(); - SpringRequestMethodAnnotation requestMethodAnnotation = SpringRequestMethodAnnotation.getByShortName(annotationName); - if (requestMethodAnnotation == null) { - return new ArrayList<>(); - } - - if (requestMethodAnnotation.methodName() != null) { // GetMapping PostMapping ... - methodList.add(requestMethodAnnotation.methodName()); - } else { - methodList.addAll(getAttributeValues(entry, "method")); // RequestMapping - } - - //注解参数值 -// KtValueArgumentList valueArgumentList = entry.getValueArgumentList(); - if (entry.getValueArgumentList() != null) { - List mappingValues = getAttributeValues(entry, null); - if (!mappingValues.isEmpty()) - pathList.addAll(mappingValues); - else - pathList.addAll(getAttributeValues(entry, "value")); // path - - pathList.addAll(getAttributeValues(entry, "path")); // path - } - - if (pathList.isEmpty()) pathList.add(defaultPath); //没指定参数 - - if (methodList.size() > 0) { - for (String method : methodList) { - for (String path : pathList) { - requestPaths.add(new RequestPath(path, method)); - } - } - } else { - for (String path : pathList) { - requestPaths.add(new RequestPath(path, null)); - } - } - - return requestPaths; - } - - private List getAttributeValues(KtAnnotationEntry entry, String attribute) { - KtValueArgumentList valueArgumentList = entry.getValueArgumentList(); - - if (valueArgumentList == null) return Collections.emptyList(); - - List arguments = valueArgumentList.getArguments(); - - for (int i = 0; i < arguments.size(); i++) { - KtValueArgument ktValueArgument = arguments.get(i); - KtValueArgumentName argumentName = ktValueArgument.getArgumentName(); - - KtExpression argumentExpression = ktValueArgument.getArgumentExpression(); - - if ((argumentName == null && attribute == null) || (argumentName != null && argumentName.getText().equals(attribute))) { - List methodList = new ArrayList<>(); - // array, kotlin 1.1- - if (argumentExpression.getText().startsWith("arrayOf")) { - List pathValueArguments = ((KtCallExpression) argumentExpression).getValueArguments(); - for (KtValueArgument pathValueArgument : pathValueArguments) { - methodList.add(pathValueArgument.getText().replace("\"", "")); - } - // array, kotlin 1.2+ - } else if (argumentExpression.getText().startsWith("[")) { - List innerExpressions = ((KtCollectionLiteralExpression) argumentExpression).getInnerExpressions(); - for (KtExpression ktExpression : innerExpressions) { - methodList.add(ktExpression.getText().replace("\"", "")); - } - } else { - // 有且仅有一个value - PsiElement[] paths = ktValueArgument.getArgumentExpression().getChildren(); -// Arrays.stream(paths).forEach(p -> methodList.add(p.getText())); - methodList.add(paths.length == 0 ? "" : paths[0].getText()); - } - - return methodList; - } - } - - return new ArrayList<>(); - } - - -} From c84e21d7673846346c77673e01cb6e371870c200 Mon Sep 17 00:00:00 2001 From: aborn Date: Mon, 15 Jun 2020 16:06:53 +0800 Subject: [PATCH 20/21] 2020.1 IU --- build.gradle | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.gradle b/build.gradle index dce0787..fd861a5 100644 --- a/build.gradle +++ b/build.gradle @@ -37,11 +37,11 @@ intellij { // 这里是指打插件包的时候用idea什么版本的依赖包打 // 比如这里用2019.3打包,如果你的插件实现源码里用了2019.3不存在的依赖包或类,就会报错 // 一般就填当前IDEA的版本号即可 - version "2019.3" // 2019.3 - type = 'IC' // 'IU' IntelliJ IDEA Ultimate Edition,默认值为 'IC' IntelliJ IDEA Community Edition + //version "2019.3" // 2019.3 + type = 'IU' // 'IU' IntelliJ IDEA Ultimate Edition,默认值为 'IC' IntelliJ IDEA Community Edition pluginName = 'WebDT' // 插件名,Web Development Toolkit //localPath = '/Users/aborn/software/ideaIC-2020.1' // IC 版本 2020.1 - //localPath = '/Applications/IntelliJ IDEA.app' // 本地的 ieda路径 (与version属性互斥),这个为2020.1版本 + localPath = '/Applications/IntelliJ IDEA.app' // 本地的 ieda路径 (与version属性互斥),这个为2020.1版本 //localPath = '/Applications/IntelliJ IDEA 2.app' // 2019.3版本 //downloadSources = false plugins = ['java', 'Kotlin'] From 50085442e15359bfb3eeace1998762a2e30a8a59 Mon Sep 17 00:00:00 2001 From: aborn Date: Mon, 15 Jun 2020 19:22:36 +0800 Subject: [PATCH 21/21] delete useless code --- .../wdt/core/helper/JavaxrsAnnotationHelper.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/github/aborn/wdt/core/helper/JavaxrsAnnotationHelper.java b/src/main/java/com/github/aborn/wdt/core/helper/JavaxrsAnnotationHelper.java index 82fcca8..edc4050 100644 --- a/src/main/java/com/github/aborn/wdt/core/helper/JavaxrsAnnotationHelper.java +++ b/src/main/java/com/github/aborn/wdt/core/helper/JavaxrsAnnotationHelper.java @@ -28,23 +28,17 @@ public String getClassUriPath(PsiClass psiClass) { @Override public RequestPath[] getRequestPaths(PsiMethod psiMethod) { PsiAnnotation[] annotations = psiMethod.getModifierList().getAnnotations(); - if(annotations == null) return null; + if (annotations == null) { + return null; + } + List list = new ArrayList<>(); PsiAnnotation wsPathAnnotation = psiMethod.getModifierList().findAnnotation(JaxrsPathAnnotation.PATH.getQualifiedName()); String path = wsPathAnnotation == null ? psiMethod.getName() : getWsPathValue(wsPathAnnotation); - JaxrsHttpMethodAnnotation[] jaxrsHttpMethodAnnotations = JaxrsHttpMethodAnnotation.values(); - /*for (PsiAnnotation annotation : annotations) { - for (JaxrsHttpMethodAnnotation methodAnnotation : jaxrsHttpMethodAnnotations) { - if (annotation.getQualifiedName().equals(methodAnnotation.getQualifiedName())) { - list.add(new RequestPath(path, methodAnnotation.getShortName())); - } - } - }*/ - - Arrays.stream(annotations).forEach(a-> Arrays.stream(jaxrsHttpMethodAnnotations).forEach(methodAnnotation-> { + Arrays.stream(annotations).forEach(a -> Arrays.stream(jaxrsHttpMethodAnnotations).forEach(methodAnnotation -> { if (a.getQualifiedName().equals(methodAnnotation.getQualifiedName())) { list.add(new RequestPath(path, methodAnnotation.getShortName())); }