diff --git a/headless-services/commons/commons-boot-app-cli/pom.xml b/headless-services/commons/commons-boot-app-cli/pom.xml index 1fc334f77..a3dbddf3e 100644 --- a/headless-services/commons/commons-boot-app-cli/pom.xml +++ b/headless-services/commons/commons-boot-app-cli/pom.xml @@ -48,6 +48,11 @@ org.springframework.ide.vscode ${project.version} + + org.ow2.asm + asm + 6.1.1 + diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/Boot20DispatcherServletMapping.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/Boot20DispatcherServletMapping.java index 0d3badb08..132fdf3fd 100644 --- a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/Boot20DispatcherServletMapping.java +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/Boot20DispatcherServletMapping.java @@ -10,54 +10,45 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.boot.app.cli.requestmappings; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; + +import org.json.JSONArray; import org.json.JSONObject; +import org.objectweb.asm.Type; -public class Boot20DispatcherServletMapping extends AbstractRequestMapping { +public class Boot20DispatcherServletMapping implements RequestMapping { - /* +/* -Some example entries: +Example entry: -[ - { - "handler":"ResourceHttpRequestHandler [locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/], class path resource []], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@7a63363d]]", - "predicate":"/** /favicon.ico" - }, - { - "handler":"public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map)", - "predicate":"{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" - }, - { - "handler":"public java.lang.Object org.springframework.boot.actuate.endpoint.web.servlet.AbstractWebMvcEndpointHandlerMapping$OperationHandler.handle(javax.servlet.http.HttpServletRequest,java.util.Map)", - "predicate":"{[/actuator/info],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" - }, - { - "handler":"protected java.util.Map> org.springframework.boot.actuate.endpoint.web.servlet.WebMvcEndpointHandlerMapping.links(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)", - "predicate":"{[/actuator],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]}" - }, - { - "handler":"public com.example.SomeData com.example.ActuatorClientTestSubjectApplication.getMethodName(java.lang.String)", - "predicate":"{[/path],methods=[GET]}" - }, - { - "handler":"public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)", - "predicate":"{[/error],produces=[text/html]}" - }, - { - "handler":"public org.springframework.http.ResponseEntity> org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController.error(javax.servlet.http.HttpServletRequest)", - "predicate":"{[/error]}" - }, - { - "handler":"ResourceHttpRequestHandler [locations=[class path resource [META-INF/resources/webjars/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@78837bf]]", - "predicate":"/webjars/**" - }, - { - "handler":"ResourceHttpRequestHandler [locations=[class path resource [META-INF/resources/], class path resource [resources/], class path resource [static/], class path resource [public/], ServletContext resource [/]], resolvers=[org.springframework.web.servlet.resource.PathResourceResolver@64b93bad]]", - "predicate":"/**" - } - ] - - */ +{ + "handler": "public java.lang.String com.example.demo.RestApi.aha(java.lang.String)", + "predicate": "{[/genericHello || /aha],methods=[GET]}", + "details": { + "requestMappingConditions": { + "headers": [], + "methods": [ + "GET" + ], + "patterns": [ + "/genericHello", + "/aha" + ], + "produces": [], + "params": [], + "consumes": [] + }, + "handlerMethod": { + "name": "aha", + "className": "com.example.demo.RestApi", + "descriptor": "(Ljava/lang/String;)Ljava/lang/String;" + } + } +} +*/ private JSONObject data; @@ -65,14 +56,81 @@ Some example entries: this.data = data; } + private JSONObject getDetails() { + return data.optJSONObject("details"); + } + + private JSONObject getHandlerMethod() { + JSONObject details = getDetails(); + return details == null ? null : details.getJSONObject("handlerMethod"); + } + + private JSONObject getRequestMappingConditions() { + JSONObject details = getDetails(); + return details == null ? null : details.getJSONObject("requestMappingConditions"); + } + @Override public String getMethodString() { return data.optString("handler"); } + @Override - protected String getPredicateString() { - return data.optString("predicate"); + public String getFullyQualifiedClassName() { + JSONObject handlerMethod = getHandlerMethod(); + return handlerMethod == null ? null : handlerMethod.getString("className"); + } + + @Override + public String getMethodName() { + JSONObject handlerMethod = getHandlerMethod(); + return handlerMethod == null ? null : handlerMethod.getString("name"); + } + + @Override + public String[] getMethodParameters() { + JSONObject handlerMethod = getHandlerMethod(); + if (handlerMethod != null) { + Type type = Type.getMethodType(handlerMethod.getString("descriptor")); + Type[] argsTypes = type.getArgumentTypes(); + String[] parameterTypes = new String[argsTypes.length]; + for (int i = 0; i < argsTypes.length; i++) { + parameterTypes[i] = argsTypes[i].getClassName(); + } + return parameterTypes; + } + return new String[0]; + } + + @Override + public String[] getSplitPath() { + JSONObject rmConditions = getRequestMappingConditions(); + if (rmConditions == null) { + return new String[0]; + } else { + JSONArray jsonArray = rmConditions.getJSONArray("patterns"); + String[] paths = new String[jsonArray.length()]; + for (int i = 0; i < jsonArray.length(); i++) { + paths[i] = jsonArray.getString(i); + } + return paths; + } + } + + @Override + public Set getRequestMethods() { + JSONObject rmConditions = getRequestMappingConditions(); + if (rmConditions == null) { + return Collections.emptySet(); + } else { + JSONArray jsonArray = rmConditions.getJSONArray("methods"); + Set methods = new HashSet<>(); + for (int i = 0; i < jsonArray.length(); i++) { + methods.add(jsonArray.getString(i)); + } + return methods; + } } }