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;
+ }
}
}