diff --git a/.DS_Store b/.DS_Store index 9cd4c22..9e0ce96 100644 Binary files a/.DS_Store and b/.DS_Store differ 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..fd861a5 --- /dev/null +++ b/build.gradle @@ -0,0 +1,62 @@ +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" // 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 2.app' // 2019.3版本 + //downloadSources = false + 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 "192.5728.98" // 原 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 0000000..62d4c05 Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 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/restful/common/IntellijUtils.java b/src/java/com/zhaow/restful/common/IntellijUtils.java deleted file mode 100644 index 5b6f0db..0000000 --- a/src/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/java/com/zhaow/restful/common/ServiceHelper.java b/src/java/com/zhaow/restful/common/ServiceHelper.java deleted file mode 100644 index 2195d27..0000000 --- a/src/java/com/zhaow/restful/common/ServiceHelper.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.zhaow.restful.common; - -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; -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) { -// System.out.println("buildRestServiceProjectList"); - List serviceProjectList = new ArrayList<>(); - - Module[] modules = ModuleManager.getInstance(project).getModules(); - for (Module module : modules) { - List restServices = buildRestServiceItemListUsingResolver(module); - if (restServices.size() > 0) { - serviceProjectList.add(new RestServiceProject(module, restServices)); - } - } - - return serviceProjectList; - } - - public static List buildRestServiceItemListUsingResolver(Module module) { - - 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); - } - - return itemList; - } - - @NotNull - public static List buildRestServiceItemListUsingResolver(Project project) { - List itemList = new ArrayList<>(); - - SpringResolver springResolver = new SpringResolver(project); - JaxrsResolver jaxrsResolver = new JaxrsResolver(project); - - ServiceResolver[] resolvers = {springResolver,jaxrsResolver}; - for (ServiceResolver resolver : resolvers) { - List allSupportedServiceItemsInProject = resolver.findAllSupportedServiceItemsInProject(); - - itemList.addAll(allSupportedServiceItemsInProject); - } - - return itemList; - } -} diff --git a/src/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java b/src/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java deleted file mode 100644 index 13a7105..0000000 --- a/src/java/com/zhaow/restful/common/resolver/BaseServiceResolver.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.zhaow.restful.common.resolver; - - -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -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; - - @Override - public List findAllSupportedServiceItemsInModule() { - List itemList = new ArrayList<>(); - if (myModule == null) { - 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); - }); -*/ - - itemList = getRestServiceItemList(myModule.getProject(), globalSearchScope); - 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 (myProject == null) { - return new ArrayList<>(); - } - - GlobalSearchScope globalSearchScope = GlobalSearchScope.projectScope(myProject); - -/* List psiMethodList = this.getServicePsiMethodList(myProject, globalSearchScope); - - for (PsiMethod psiMethod : psiMethodList) { - List singleMethodServices = getServiceItemList(psiMethod); - - itemList.addAll(singleMethodServices); - - }*/ - - itemList = getRestServiceItemList(myProject, globalSearchScope); - - 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; - } - -/* - protected abstract List getServiceItemList(PsiMethod psiMethod); - - protected abstract List getServicePsiMethodList(Project myProject, GlobalSearchScope globalSearchScope);*/ -} diff --git a/src/java/com/zhaow/restful/common/resolver/JaxrsResolver.java b/src/java/com/zhaow/restful/common/resolver/JaxrsResolver.java deleted file mode 100644 index e90c001..0000000 --- a/src/java/com/zhaow/restful/common/resolver/JaxrsResolver.java +++ /dev/null @@ -1,119 +0,0 @@ -package com.zhaow.restful.common.resolver; - - -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; - -//import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex; - -public class JaxrsResolver extends BaseServiceResolver { - - public JaxrsResolver(Module module) { - myModule = module; - } - - 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); - - 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; - } - -// psiMethodList.addAll(Arrays.asList(psiMethods)); - - 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/java/com/zhaow/restful/common/resolver/ServiceResolver.java b/src/java/com/zhaow/restful/common/resolver/ServiceResolver.java deleted file mode 100644 index 44ba538..0000000 --- a/src/java/com/zhaow/restful/common/resolver/ServiceResolver.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.zhaow.restful.common.resolver; - -import com.zhaow.restful.navigation.action.RestServiceItem; - -import java.util.List; - -public interface ServiceResolver { - - /* 获取module 中所有的服务列表 */ - List findAllSupportedServiceItemsInModule(); - - /* 获取project 中所有的服务列表 */ - List findAllSupportedServiceItemsInProject(); -} diff --git a/src/java/com/zhaow/restful/common/resolver/SpringResolver.java b/src/java/com/zhaow/restful/common/resolver/SpringResolver.java deleted file mode 100644 index dca668e..0000000 --- a/src/java/com/zhaow/restful/common/resolver/SpringResolver.java +++ /dev/null @@ -1,426 +0,0 @@ -package com.zhaow.restful.common.resolver; - - -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.PathMappingAnnotation; -import com.zhaow.restful.annotations.SpringControllerAnnotation; -import com.zhaow.restful.annotations.SpringRequestMethodAnnotation; -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 { -/* Module myModule; - Project myProject;*/ - PropertiesHandler propertiesHandler ; - public SpringResolver(Module module) { - myModule = module; - propertiesHandler = new PropertiesHandler(module); - } - - public SpringResolver(Project project) { - myProject = project; - - } - - - //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<>(); - - // 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(); - - /*if (!(psiElement instanceof PsiClass)) continue; // RestController annotation 只出现在 class*/ - 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)); - } - } - } -/* - PsiClass psiClass = LightClassUtilsKt.toLightClass(ktClass); - itemList.addAll(getServiceItemList(psiClass));*/ - - } - - } - - 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(); -// String path = tryReplacePlaceholderValueInPath( 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) { - 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<>(); - 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<>(); - } - - -} diff --git a/src/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java b/src/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java deleted file mode 100644 index 0fcf663..0000000 --- a/src/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * 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 - * - * http://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. - */ -package com.zhaow.restful.navigation.action; - -import com.intellij.ide.util.gotoByName.ChooseByNameItemProvider; -import com.intellij.ide.util.gotoByName.ChooseByNameModel; -import com.intellij.ide.util.gotoByName.ChooseByNamePopup; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Key; -import com.intellij.openapi.util.text.StringUtil; -import com.zhaow.utils.ToolkitUtil; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -public class RestServiceChooseByNamePopup extends 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); - } - - 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); - - if (project != null) { - project.putUserData(CHOOSE_BY_NAME_POPUP_IN_PROJECT_KEY, newPopup); - } - 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; - } - - pattern = ToolkitUtil.removeRedundancyMarkup(pattern);; - return pattern; - } - - - @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; - } - -/* 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/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java b/src/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java deleted file mode 100644 index 8980057..0000000 --- a/src/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2000-2017 JetBrains s.r.o. - * - * 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 - * - * http://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. - */ -package com.zhaow.restful.navigator; - -import com.intellij.openapi.Disposable; -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; - -@State(name = "RestServiceProjectsManager") -public class RestServiceProjectsManager extends AbstractProjectComponent - implements PersistentStateComponent, Disposable, ProjectComponent { - protected final Project myProject; - - - - private RestServicesNavigatorState myState = new RestServicesNavigatorState(); - - public static RestServiceProjectsManager getInstance(Project p) { - return p.getComponent(RestServiceProjectsManager.class); - } - - public RestServiceProjectsManager(Project project) { - super(project); - myProject = project; -// System.out.println("RestServiceProjectsManager"); - } - - - @Override - public void dispose() { - - } - - @Nullable - @Override - public RestServicesNavigatorState getState() { - return null; - } - - @Override - public void loadState(RestServicesNavigatorState state) { - - } - - public List getServiceProjects() { -// List list = DumbService.getInstance(myProject).runReadActionInSmartMode(() -> ServiceHelper.buildRestServiceProjectList(myProject)); - List list = DumbService.getInstance(myProject).runReadActionInSmartMode(() -> ServiceHelper.buildRestServiceProjectListUsingResolver(myProject)); - return list; - } -/* - public boolean hasProjects() { - if (! myProject.isInitialized()) { - return false; - } - System.out.println("======hasProjects====="); - return getServiceProjects().size() > 0; - }*/ - - public void forceUpdateAllProjects() { - - } -} 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..533c5db --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/RestServiceDataManager.java @@ -0,0 +1,74 @@ +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.diagnostic.Logger; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.zhaow.restful.navigation.action.RestServiceItem; +import com.zhaow.restful.navigator.RestServiceProject; +import org.apache.commons.compress.utils.Lists; + +import java.util.List; + +/** + * @author aborn + * @date 2020/06/15 11:35 AM + */ +public class RestServiceDataManager { + + public static final Logger LOG = Logger.getInstance(RestServiceDataManager.class); + + public static List buildRestServiceData(Project project) { + List serviceProjectList = Lists.newArrayList(); + Module[] modules = ModuleManager.getInstance(project).getModules(); + + if (modules.length > 0) { + for (Module module : modules) { + List restServices = buildRestServiceItemListFrom(project, module); + if (restServices.size() > 0) { + serviceProjectList.add(new RestServiceProject(module.getName() + "(" + restServices.size() +")", restServices)); + } + } + } else { + List restServices = buildRestServiceItemListFrom(project); + 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; + } + + /** + * 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; + } + + /** + * 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/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..edc4050 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/helper/JavaxrsAnnotationHelper.java @@ -0,0 +1,55 @@ +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(); + + 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..bbf5bbd --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/resolver/IResolver.java @@ -0,0 +1,28 @@ +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 { + /** + * 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 new file mode 100644 index 0000000..853d05b --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/resolver/JavaxrsResolver.java @@ -0,0 +1,69 @@ +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) { + 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)); + 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(); + + 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); + if (module != null) { + 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..b08c865 --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/core/resolver/SpringResolver.java @@ -0,0 +1,105 @@ +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) { + 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(); + + 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); + if (module != null) { + item.setModule(module); + } + itemList.add(item); + } + } + + } + return itemList; + } + + +} 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/github/aborn/wdt/utils/FileUtils.java b/src/main/java/com/github/aborn/wdt/utils/FileUtils.java new file mode 100644 index 0000000..06bf5cb --- /dev/null +++ b/src/main/java/com/github/aborn/wdt/utils/FileUtils.java @@ -0,0 +1,41 @@ +package com.github.aborn.wdt.utils; + +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; + +public class FileUtils { + + /** + * 提取java文件 + * + * @param directory + * @return + */ + 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; + } + PsiClass[] classes = ((PsiJavaFileImpl) file).getClasses(); + + if ( classes.length > 0) { + psiClasses.add( classes[0] ); + } + } + + if ( directory.getSubdirectories() != null && directory.getSubdirectories().length > 0 ) { + for ( PsiDirectory subDir : directory.getSubdirectories() ) { + psiClasses.addAll( getJavaFilesFromDir(subDir) ); + } + } + } + return psiClasses; + } +} 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/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/ToolkitIcons.java b/src/main/java/com/zhaow/restful/common/ToolkitIcons.java similarity index 96% rename from src/java/com/zhaow/restful/common/ToolkitIcons.java rename to src/main/java/com/zhaow/restful/common/ToolkitIcons.java index 711125d..63ac3e3 100644 --- a/src/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/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/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 85% rename from src/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java rename to src/main/java/com/zhaow/restful/common/spring/RequestMappingAnnotationHelper.java index 707b551..74f1bc9 100644 --- a/src/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())) { @@ -80,18 +79,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) { @@ -125,24 +113,25 @@ 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) { 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 = "/"; List requestMappings = getRequestMappings(annotation, defaultValue); - if (requestMappings.size()>0) { + if (requestMappings.size() > 0) { list.addAll(requestMappings); } } @@ -160,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(); @@ -183,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(); } } @@ -221,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); } @@ -233,5 +222,4 @@ public static String getOneRequestMappingPath(PsiMethod psiMethod) { } - } \ No newline at end of file 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 97% rename from src/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java rename to src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingAction.java index 2dfe3d7..51e7952 100644 --- a/src/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; @@ -31,12 +32,12 @@ 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"); 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, 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 54% rename from src/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java rename to src/main/java/com/zhaow/restful/navigation/action/GotoRequestMappingContributor.java index 6212c41..ac1fa0b 100644 --- a/src/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 接口 + + // data source if (onlyThisModuleChecked && myModule != null) { - itemList = ServiceHelper.buildRestServiceItemListUsingResolver(myModule); + itemList = RestServiceDataManager.buildRestServiceItemListFrom(project, myModule); } else { - itemList = ServiceHelper.buildRestServiceItemListUsingResolver(project); + 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/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/main/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java b/src/main/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java new file mode 100644 index 0000000..a9a1553 --- /dev/null +++ b/src/main/java/com/zhaow/restful/navigation/action/RestServiceChooseByNamePopup.java @@ -0,0 +1,86 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * 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 + * + * http://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. + */ +package com.zhaow.restful.navigation.action; + +import com.intellij.ide.util.gotoByName.ChooseByNameItemProvider; +import com.intellij.ide.util.gotoByName.ChooseByNameModel; +import com.intellij.ide.util.gotoByName.ChooseByNamePopup; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.text.StringUtil; +import com.zhaow.utils.ToolkitUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class RestServiceChooseByNamePopup extends 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); + } + + 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); + + if (project != null) { + project.putUserData(CHOOSE_BY_NAME_POPUP_IN_PROJECT_KEY, newPopup); + } + 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; + } + + pattern = ToolkitUtil.removeRedundancyMarkup(pattern); + return pattern; + } + + + @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; + } + +} \ No newline at end of file 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 83% rename from src/java/com/zhaow/restful/navigator/RefreshProjectAction.java rename to src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java index 99a00cd..abd2814 100644 --- a/src/java/com/zhaow/restful/navigator/RefreshProjectAction.java +++ b/src/main/java/com/zhaow/restful/navigator/RefreshProjectAction.java @@ -11,20 +11,17 @@ public class RefreshProjectAction extends AnAction { protected void perform(@NotNull RestServiceProjectsManager manager) { - manager.forceUpdateAllProjects(); + manager.forceUpdateAllProjects(this); } @Override 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(); + servicesNavigator.atachEvent(e); servicesNavigator.scheduleStructureUpdate(); } 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/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java new file mode 100644 index 0000000..5b1e8f9 --- /dev/null +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceProjectsManager.java @@ -0,0 +1,73 @@ +/* + * Copyright 2000-2017 JetBrains s.r.o. + * + * 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 + * + * http://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. + */ +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; +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 org.jetbrains.annotations.Nullable; + +import java.util.List; + +@State(name = "RestServiceProjectsManager") +public class RestServiceProjectsManager implements PersistentStateComponent, Disposable, ProjectComponent { + protected final Project myProject; + private AnAction anAction; + private RestServicesNavigatorState myState = new RestServicesNavigatorState(); + + public static RestServiceProjectsManager getInstance(Project p) { + return p.getComponent(RestServiceProjectsManager.class); + } + + public RestServiceProjectsManager(Project project) { + myProject = project; +// System.out.println("RestServiceProjectsManager"); + } + + + @Override + public void dispose() { + + } + + @Nullable + @Override + public RestServicesNavigatorState getState() { + return null; + } + + @Override + public void loadState(RestServicesNavigatorState state) { + + } + + public List getServiceProjects(AnActionEvent anActionEvent) { + return DumbService.getInstance(myProject).runReadActionInSmartMode(() -> + RestServiceDataManager.buildRestServiceData(myProject) + ); + } + + + public void forceUpdateAllProjects(AnAction anAction) { + this.anAction = anAction; + } +} diff --git a/src/java/com/zhaow/restful/navigator/RestServiceStructure.java b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java similarity index 70% rename from src/java/com/zhaow/restful/navigator/RestServiceStructure.java rename to src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java index ec31e14..e42c408 100644 --- a/src/java/com/zhaow/restful/navigator/RestServiceStructure.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServiceStructure.java @@ -1,13 +1,15 @@ package com.zhaow.restful.navigator; - 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; @@ -30,19 +32,23 @@ 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; + private SimpleTreeBuilder myTreeBuilder; + private AsyncTreeModel asyncTreeModel; + private StructureTreeModel structureTreeModel; + 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<>(); @@ -56,11 +62,14 @@ 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); + //myTreeBuilder.initRoot(); + //myTreeBuilder.expand(myRoot, null); + + // structureTreeModel = new StructureTreeModel(this, Disposable ?); + //asyncTreeModel = new AsyncTreeModel() } @@ -74,51 +83,28 @@ public RootNode getRootElement() { return myRoot; } - public void update() { -// 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(); - + public void update(AnActionEvent event) { + RestServiceProjectsManager restServiceProjectsManager = RestServiceProjectsManager.getInstance(myProject); + if (structureTreeModel == null) { + structureTreeModel = new StructureTreeModel(this, restServiceProjectsManager); + } -// Set deleted = new HashSet<>(myProjectToNodeMapping.keySet()); -// deleted.removeAll(projects); + List projects = restServiceProjectsManager.getServiceProjects(event); 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.getUi().doUpdateFromRoot(); -// ((CachingSimpleNode) myRoot.getParent()).cleanUpCache(); -// myRoot.childrenChanged(); myRoot.updateProjectNodes(projects); } @@ -127,16 +113,15 @@ private ProjectNode findNodeFor(RestServiceProject project) { } public void updateFrom(SimpleNode node) { - myTreeBuilder.addSubtreeToUpdateByElement(node); + if (node != null) { + //structureTreeModel.expand(node, myTree, ); + 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(); } @@ -149,8 +134,7 @@ public static List getSelectedNodes(SimpleTree tre filtered.clear(); break; } - //noinspection unchecked - filtered.add((T)node); + filtered.add((T) node); } return filtered; } @@ -167,7 +151,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); @@ -194,7 +178,7 @@ protected void childrenChanged() { BaseSimpleNode each = this; while (each != null) { each.cleanUpCache(); - each = (BaseSimpleNode)each.getParent(); + each = (BaseSimpleNode) each.getParent(); } updateUpTo(this); } @@ -203,11 +187,12 @@ protected void childrenChanged() { public class RootNode extends BaseSimpleNode { - List projectNodes = new ArrayList<>(); + 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 @@ -218,34 +203,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); - } } @@ -255,8 +230,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; @@ -269,19 +243,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 @@ -301,22 +270,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"); } } @@ -342,9 +303,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; } @@ -356,29 +314,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(); } } @@ -406,11 +364,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); @@ -425,14 +383,6 @@ protected String getMenuId() { return "Toolkit.NavigatorServiceMenu"; } -/* - @Override - @Nullable - @NonNls - protected String getActionId() { - return "Toolkit.Navigator"; - }*/ - } private void resetRestServiceDetail() { diff --git a/src/java/com/zhaow/restful/navigator/RestServicesNavigator.java b/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java similarity index 72% rename from src/java/com/zhaow/restful/navigator/RestServicesNavigator.java rename to src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java index 1af6c43..4b8cc9a 100644 --- a/src/java/com/zhaow/restful/navigator/RestServicesNavigator.java +++ b/src/main/java/com/zhaow/restful/navigator/RestServicesNavigator.java @@ -1,7 +1,7 @@ package com.zhaow.restful.navigator; - 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 +27,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"; @@ -39,14 +39,13 @@ public class RestServicesNavigator extends AbstractProjectComponent implements P RestServicesNavigatorState myState = new RestServicesNavigatorState(); private SimpleTree myTree; -// private JTree myTree; protected RestServiceStructure myStructure; private ToolWindowEx myToolWindow; + private AnActionEvent anActionEvent; private RestServiceProjectsManager myProjectsManager; - public RestServicesNavigator(Project myProject,RestServiceProjectsManager projectsManager) { - super(myProject); + public RestServicesNavigator(Project myProject, RestServiceProjectsManager projectsManager) { this.myProject = myProject; myProjectsManager = projectsManager; } @@ -57,11 +56,9 @@ public static RestServicesNavigator getInstance(Project p) { } - private void initTree() { myTree = new SimpleTree() { - @Override protected void paintComponent(Graphics g) { super.paintComponent(g); @@ -72,7 +69,6 @@ protected void paintComponent(Graphics g) { if (myProject.isInitialized()) { return; } -// if (myProjectsManager.hasProjects()) return; myLabel.setFont(getFont()); myLabel.setBackground(getBackground()); @@ -85,8 +81,7 @@ protected void paintComponent(Graphics g) { Graphics g2 = g.create(bounds.x + x, bounds.y + 20, bounds.width, bounds.height); try { myLabel.paint(g2); - } - finally { + } finally { g2.dispose(); } } @@ -99,22 +94,29 @@ protected void paintComponent(Graphics g) { @Override 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); - 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); @@ -129,7 +131,9 @@ private void initToolWindow() { @Override public void stateChanged() { - if (myToolWindow.isDisposed()) return; + if (myToolWindow.isDisposed()) { + return; + } boolean visible = myToolWindow.isVisible(); if (!visible || wasVisible) { return; @@ -139,32 +143,24 @@ 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);*/ - } 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) { @@ -172,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); } @@ -205,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); } } 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 85% rename from src/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java rename to src/main/java/com/zhaow/restful/statistics/RestfulToolkitFeaturesProvider.java index bfc4588..98990f0 100644 --- a/src/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") }; } 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 98% rename from resources/META-INF/plugin.xml rename to src/main/resources/META-INF/plugin.xml index da52735..e2613a0 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 + WebDevelopmentKit (WDK) + 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