diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRunningAppProvider.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRunningAppProvider.java index fd4e58e76..ca181f0f0 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRunningAppProvider.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/project/harness/MockRunningAppProvider.java @@ -106,7 +106,7 @@ public class MockRunningAppProvider { } public MockAppBuilder requestMappings(String mappings) throws Exception { - Collection requestMappings = SpringBootApp.parseRequestMappingsJson(mappings); + Collection requestMappings = SpringBootApp.parseRequestMappingsJson(mappings, "1.x"); when(app.getRequestMappings()).thenReturn(requestMappings); return this; } diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootApp.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootApp.java index 5ee7e4490..33e8b8638 100644 --- a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootApp.java +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootApp.java @@ -33,7 +33,8 @@ import org.json.JSONArray; import org.json.JSONObject; import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.RequestMapping; -import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.RequestMappingImpl1; +import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.Boot1xRequestMapping; +import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.RequestMappingsParser20; import org.springframework.ide.vscode.commons.util.CollectorUtil; import org.springframework.ide.vscode.commons.util.Log; @@ -195,29 +196,35 @@ public class SpringBootApp { } } - public static Collection parseRequestMappingsJson(String json) { + public static Collection parseRequestMappingsJson(String json, String bootVersion) { JSONObject obj = new JSONObject(json); - Iterator keys = obj.keys(); - List result = new ArrayList<>(); - while (keys.hasNext()) { - String rawKey = keys.next(); - JSONObject value = obj.getJSONObject(rawKey); - result.add(new RequestMappingImpl1(rawKey, value)); + if (bootVersion.equals("2.x")) { + return RequestMappingsParser20.parse(obj); + } else { //1.x + List result = new ArrayList<>(); + Iterator keys = obj.keys(); + while (keys.hasNext()) { + String rawKey = keys.next(); + JSONObject value = obj.getJSONObject(rawKey); + result.add(new Boot1xRequestMapping(rawKey, value)); + } + return result; } - return result; } public Collection getRequestMappings() throws Exception { + //Boot 1.x Object result = getActuatorDataFromAttribute("org.springframework.boot:type=Endpoint,name=requestMappingEndpoint", "Data"); if (result != null) { String mappings = new ObjectMapper().writeValueAsString(result); - return parseRequestMappingsJson(mappings); + return parseRequestMappingsJson(mappings, "1.x"); } + //Boot 2.x result = getActuatorDataFromOperation("org.springframework.boot:type=Endpoint,name=Mappings", "mappings"); if (result != null) { String mappings = new ObjectMapper().writeValueAsString(result); - return parseRequestMappingsJson(mappings); + return parseRequestMappingsJson(mappings, "2.x"); } return null; diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/AbstractRequestMapping.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/AbstractRequestMapping.java new file mode 100644 index 000000000..82186a4dc --- /dev/null +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/AbstractRequestMapping.java @@ -0,0 +1,109 @@ +/******************************************************************************* + * Copyright (c) 2018 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.boot.app.cli.requestmappings; + +import java.util.Arrays; +import java.util.Collections; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import java.util.stream.Collectors; + +import org.springframework.ide.vscode.commons.java.parser.JLRMethodParser; +import org.springframework.ide.vscode.commons.java.parser.JLRMethodParser.JLRMethod; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; + +public abstract class AbstractRequestMapping implements RequestMapping { + + private static final Pattern REQUEST_METHODS_PATTERN = Pattern.compile(".*methods=\\[(.*)\\].*"); + + final private Supplier methodDataSupplier; + final private Supplier> requestMethodsSupplier; + final private Supplier pathsSuplier; + + public AbstractRequestMapping() { + this.requestMethodsSupplier = Suppliers.memoize(() -> parseRequestMethods()); + this.methodDataSupplier = Suppliers.memoize(() -> JLRMethodParser.parse(getMethodString())); + this.pathsSuplier = Suppliers.memoize(() -> computePaths()); + } + + protected Set parseRequestMethods() { + Matcher matcher = REQUEST_METHODS_PATTERN.matcher(getPredicateString()); + if (matcher.matches()) { + return Arrays.stream(matcher.group(1).split("\\s*,\\s*")).collect(Collectors.toSet()); + } + return Collections.emptySet(); + } + + @Override + public Set getRequestMethods() { + return requestMethodsSupplier.get(); + } + + @Override + public final String getFullyQualifiedClassName() { + JLRMethod m = getMethodData(); + if (m!=null) { + return m.getFQClassName(); + } + return null; + } + + protected JLRMethod getMethodData() { + return methodDataSupplier.get(); + } + + @Override + public final String getMethodName() { + JLRMethod m = getMethodData(); + if (m!=null) { + return m.getMethodName(); + } + return null; + } + + @Override + public String[] getMethodParameters() { + return getMethodData().getParameters(); + } + + protected String[] computePaths() { + //Two cases we know about: + // 1: the 'predicate' is a path string + // 2: the 'predicate' looks something like: + // "{[/actuator/health],methods=[GET],produces=[application/vnd.spring-boot.actuator.v2+json || application/json]} + String predicate = getPredicateString(); + if (predicate.startsWith("{[")) { + //An almost json string. Unfortunately not really json so we can't + //use org.json or jackson Mapper to properly parse this. + int start = 2; //right after first '[' + int end = predicate.indexOf(']'); + if (end>=2) { + String pathString = predicate.substring(start, end); + return ParseUtil.splitPaths(pathString); + } + } + //Case 1, or some unanticipated stuff. + //Assume the key is the paths strk g, which is right for Case 1 + // and probably more useful than null for 'unanticipated stuff'. + return ParseUtil.splitPaths(predicate); + } + + protected abstract String getPredicateString(); + + @Override + public String[] getSplitPath() { + return pathsSuplier.get(); + } + +} diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/Boot1xRequestMapping.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/Boot1xRequestMapping.java new file mode 100644 index 000000000..b2c04677e --- /dev/null +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/Boot1xRequestMapping.java @@ -0,0 +1,70 @@ +/******************************************************************************* + * Copyright (c) 2017 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.boot.app.cli.requestmappings; + +import org.json.JSONObject; + +import com.google.common.base.Objects; + +public class Boot1xRequestMapping extends AbstractRequestMapping { + + /* +There are two styles of entries: + +1) key is a 'path' String. May contain patters like "**" + "/** /favicon.ico":{ + "bean":"faviconHandlerMapping" + } + +2) key is a 'almost json' String + "{[/bye],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}":{ + "bean":"requestMappingHandlerMapping", + "method":"public java.lang.String demo.MyController.bye()" + } + */ + + private JSONObject beanInfo; + private String pathKey; + + public Boot1xRequestMapping(String pathKey, JSONObject beanInfo) { + this.pathKey = pathKey; + this.beanInfo = beanInfo; + } + + @Override + public int hashCode() { + return pathKey.hashCode(); + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Boot1xRequestMapping other = (Boot1xRequestMapping) obj; + return Objects.equal(this.pathKey, other.pathKey) + && Objects.equal(this.getMethodString(), other.getMethodString()); + } + + @Override + public String getMethodString() { + return beanInfo.optString("method"); + } + + @Override + protected String getPredicateString() { + return pathKey; + } + +} \ No newline at end of file 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 new file mode 100644 index 000000000..0d3badb08 --- /dev/null +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/Boot20DispatcherServletMapping.java @@ -0,0 +1,78 @@ +/******************************************************************************* + * Copyright (c) 2018 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.boot.app.cli.requestmappings; + +import org.json.JSONObject; + +public class Boot20DispatcherServletMapping extends AbstractRequestMapping { + + /* + +Some example entries: + +[ + { + "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":"/**" + } + ] + + */ + + private JSONObject data; + + public Boot20DispatcherServletMapping(JSONObject data) { + this.data = data; + } + + @Override + public String getMethodString() { + return data.optString("handler"); + } + + @Override + protected String getPredicateString() { + return data.optString("predicate"); + } + +} diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/ParseUtil.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/ParseUtil.java new file mode 100644 index 000000000..4f2729e49 --- /dev/null +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/ParseUtil.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2018 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.boot.app.cli.requestmappings; + +import java.util.Arrays; + +public class ParseUtil { + + public static String[] splitPaths(String paths) { + return Arrays.stream(paths.split("\\|\\|")) + .map(s -> s.trim()) + .filter(s -> !s.isEmpty()) + .map(s -> { + if (s.charAt(0) != '/') { + return '/' + s; + } else { + return s; + } + }) + .toArray(String[]::new); + } + +} diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMapping.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMapping.java index 41c7c5bd2..d5f1fa62c 100644 --- a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMapping.java +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMapping.java @@ -13,7 +13,7 @@ package org.springframework.ide.vscode.commons.boot.app.cli.requestmappings; import java.util.Set; public interface RequestMapping { - String getPath(); + // String getPath(); commented... because... not used?? String[] getSplitPath(); String getFullyQualifiedClassName(); String getMethodName(); diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMappingImpl1.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMappingImpl1.java deleted file mode 100644 index 6dd7a2004..000000000 --- a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMappingImpl1.java +++ /dev/null @@ -1,180 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2017 Pivotal, Inc. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Pivotal, Inc. - initial API and implementation - *******************************************************************************/ -package org.springframework.ide.vscode.commons.boot.app.cli.requestmappings; - -import java.util.Arrays; -import java.util.Collections; -import java.util.Set; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.json.JSONObject; -import org.springframework.ide.vscode.commons.java.parser.JLRMethodParser; -import org.springframework.ide.vscode.commons.java.parser.JLRMethodParser.JLRMethod; -import org.springframework.ide.vscode.commons.util.Log; - -import com.google.common.base.Objects; -import com.google.common.base.Supplier; -import com.google.common.base.Suppliers; - -public class RequestMappingImpl1 implements RequestMapping { - - private static final Pattern REQUEST_METHODS_PATTERN = Pattern.compile(".*methods=\\[(.*)\\].*"); - - /* -There are two styles of entries: - -1) key is a 'path' String. May contain patters like "**" - "/** /favicon.ico":{ - "bean":"faviconHandlerMapping" - } - -2) key is a 'almost json' String - "{[/bye],methods=[],params=[],headers=[],consumes=[],produces=[],custom=[]}":{ - "bean":"requestMappingHandlerMapping", - "method":"public java.lang.String demo.MyController.bye()" - } - */ - - private JSONObject beanInfo; - private String pathKey; - private Supplier methodDataSupplier; - private Supplier> requestMethodsSupplier; - private Supplier requestPathSupplier; - - public RequestMappingImpl1(String pathKey, JSONObject beanInfo) { - this.pathKey = pathKey; - this.beanInfo = beanInfo; - this.requestMethodsSupplier = Suppliers.memoize(() -> parseRequestMethods()); - this.requestPathSupplier = Suppliers.memoize(() -> parseRequestPath()); - this.methodDataSupplier = Suppliers.memoize(() -> JLRMethodParser.parse(getMethodString())); - } - - @Override - public String getPath() { - return requestPathSupplier.get(); - } - - @Override - public String toString() { - return "RequestMapping("+pathKey+")"; - } - - @Override - public String getFullyQualifiedClassName() { - JLRMethod m = getMethodData(); - if (m!=null) { - return m.getFQClassName(); - } - return null; - } - - @Override - public String getMethodName() { - JLRMethod m = getMethodData(); - if (m!=null) { - return m.getMethodName(); - } - return null; - } - - /** - * Returns the raw string found in the requestmapping info. This is a 'toString' value - * of java.lang.reflect.Method object. - */ - @Override - public String getMethodString() { - try { - if (beanInfo!=null) { - if (beanInfo.has("method")) { - return beanInfo.getString("method"); - } - } - } catch (Exception e) { - Log.log(e); - } - return null; - } - - private JLRMethod getMethodData() { - return methodDataSupplier.get(); - } - - @Override - public int hashCode() { - return pathKey.hashCode(); - } - - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - RequestMappingImpl1 other = (RequestMappingImpl1) obj; - return Objects.equal(this.pathKey, other.pathKey) - && Objects.equal(this.getMethodString(), other.getMethodString()); - } - - protected Set parseRequestMethods() { - Matcher matcher = REQUEST_METHODS_PATTERN.matcher(pathKey); - if (matcher.matches()) { - return Arrays.stream(matcher.group(1).split("\\s*,\\s*")).collect(Collectors.toSet()); - } - return Collections.emptySet(); - } - - protected String parseRequestPath() { - if (pathKey.startsWith("{[")) { //Case 2 (see above) - //An almost json string. Unfortunately not really json so we can't - //use org.json or jackson Mapper to properly parse this. - int start = 2; //right after first '[' - int end = pathKey.indexOf(']'); - if (end>=2) { - return pathKey.substring(start, end); - } - } - //Case 1, or some unanticipated stuff. - //Assume the key is the path, which is right for Case 1 - // and probably more useful than null for 'unanticipated stuff'. - return pathKey; - } - - @Override - public Set getRequestMethods() { - return requestMethodsSupplier.get(); - } - - @Override - public String[] getSplitPath() { - String paths = requestPathSupplier.get(); - return Arrays.stream(paths.split("\\|\\|")) - .map(s -> s.trim()) - .filter(s -> !s.isEmpty()) - .map(s -> { - if (s.charAt(0) != '/') { - return '/' + s; - } else { - return s; - } - }) - .toArray(String[]::new); - } - - @Override - public String[] getMethodParameters() { - return getMethodData().getParameters(); - } - -} \ No newline at end of file diff --git a/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMappingsParser20.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMappingsParser20.java new file mode 100644 index 000000000..2a1a7ba15 --- /dev/null +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/requestmappings/RequestMappingsParser20.java @@ -0,0 +1,44 @@ +/******************************************************************************* + * Copyright (c) 2018 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.commons.boot.app.cli.requestmappings; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import org.json.JSONArray; +import org.json.JSONObject; + +public class RequestMappingsParser20 { + + public static Collection parse(JSONObject obj) { + obj = obj.getJSONObject("contexts"); + List result = new ArrayList<>(); + for (String contextId : obj.keySet()) { + //Contains 3 different keys now ('dispatcherServlets', 'servletFilters' and 'servlets'. + // Each with their own kind of data inside. Looks like 'dispatcherServlets' contains stuff similar to what we + // know from Boot 1.x but in slighly different form. We only parse that stuff for now. + JSONObject dispatcherServlets = obj + .getJSONObject(contextId) + .getJSONObject("mappings") + .getJSONObject("dispatcherServlets"); + for (String servletId : dispatcherServlets.keySet()) { + JSONArray servlets = dispatcherServlets.getJSONArray(servletId); + for (Object _servlet : servlets) { + JSONObject servlet = (JSONObject)_servlet; + result.add(new Boot20DispatcherServletMapping(servlet)); + } + } + } + return result; + } + +} diff --git a/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/RequestMappingImp1Test.java b/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/RequestMappingImp1Test.java index 0e845fd8a..95a34d884 100644 --- a/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/RequestMappingImp1Test.java +++ b/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/RequestMappingImp1Test.java @@ -13,7 +13,8 @@ package org.springframework.ide.vscode.commons.boot.app.cli; import static org.junit.Assert.assertEquals; import org.junit.Test; -import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.RequestMappingImpl1; +import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.AbstractRequestMapping; +import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.Boot1xRequestMapping; /** * @author Martin Lippert @@ -22,7 +23,7 @@ public class RequestMappingImp1Test { @Test public void testSplitPathWithoutDuplicate() { - RequestMappingImpl1 rm = new RequestMappingImpl1("/superpath", null); + AbstractRequestMapping rm = new Boot1xRequestMapping("/superpath", null); String[] splitPath = rm.getSplitPath(); assertEquals(1, splitPath.length); assertEquals("/superpath", splitPath[0]); @@ -30,7 +31,7 @@ public class RequestMappingImp1Test { @Test public void testSplitPathSimpleCaseWithEmptyOr() { - RequestMappingImpl1 rm = new RequestMappingImpl1("/superpath/mypath || ", null); + AbstractRequestMapping rm = new Boot1xRequestMapping("/superpath/mypath || ", null); String[] splitPath = rm.getSplitPath(); assertEquals(1, splitPath.length); assertEquals("/superpath/mypath", splitPath[0]); @@ -38,7 +39,7 @@ public class RequestMappingImp1Test { @Test public void testSplitPathSimpleCase() { - RequestMappingImpl1 rm = new RequestMappingImpl1("{[/superpath/mypath || mypath.json]}", null); + AbstractRequestMapping rm = new Boot1xRequestMapping("{[/superpath/mypath || mypath.json]}", null); String[] splitPath = rm.getSplitPath(); assertEquals(2, splitPath.length); assertEquals("/superpath/mypath", splitPath[0]); @@ -47,7 +48,7 @@ public class RequestMappingImp1Test { @Test public void testSplitPathMultipleCases() { - RequestMappingImpl1 rm = new RequestMappingImpl1("{[/superpath/mypath || mypath.json || somethingelse.what]}", null); + AbstractRequestMapping rm = new Boot1xRequestMapping("{[/superpath/mypath || mypath.json || somethingelse.what]}", null); String[] splitPath = rm.getSplitPath(); assertEquals(3, splitPath.length); assertEquals("/superpath/mypath", splitPath[0]); diff --git a/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootAppTest.java b/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootAppTest.java index affa11b76..04a0461b0 100644 --- a/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootAppTest.java +++ b/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/SpringBootAppTest.java @@ -181,11 +181,15 @@ public class SpringBootAppTest { @Test public void getRequestMappings() throws Exception { for (SpringBootApp testApp : getTestApps()) { - ACondition.waitFor(TIMEOUT, () -> { - Collection result = testApp.getRequestMappings(); - assertTrue(result != null && !result.isEmpty()); -// System.out.println("requestMappings = "+result); - }); + try { + ACondition.waitFor(TIMEOUT, () -> { + Collection result = testApp.getRequestMappings(); + assertTrue(result != null && result.size()>4); + // System.out.println("requestMappings = "+result); + }); + } catch (Exception e) { + throw new RuntimeException("Failed for: "+testApp, e); + } } } diff --git a/headless-services/commons/commons-boot-app-cli/src/test/resources/boot-apps/actuator-client-20-test-subject-0.0.1-SNAPSHOT.jar b/headless-services/commons/commons-boot-app-cli/src/test/resources/boot-apps/actuator-client-20-test-subject-0.0.1-SNAPSHOT.jar index a6620c482..83bf28702 100644 Binary files a/headless-services/commons/commons-boot-app-cli/src/test/resources/boot-apps/actuator-client-20-test-subject-0.0.1-SNAPSHOT.jar and b/headless-services/commons/commons-boot-app-cli/src/test/resources/boot-apps/actuator-client-20-test-subject-0.0.1-SNAPSHOT.jar differ diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JLRMethodParser.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JLRMethodParser.java index b151b37d9..d3a001df4 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JLRMethodParser.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JLRMethodParser.java @@ -151,7 +151,7 @@ public class JLRMethodParser { } - private static final Set MODIFIERS = Collections.unmodifiableSet(new HashSet(Arrays.asList( + public static final Set MODIFIERS = Collections.unmodifiableSet(new HashSet(Arrays.asList( "public", "protected", "private", "abstract", "static", "final", "synchronized", "native", "strictfp" ))); diff --git a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/HtmlBuffer.java b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/HtmlBuffer.java index 3e037e869..798c8b151 100644 --- a/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/HtmlBuffer.java +++ b/headless-services/commons/commons-util/src/main/java/org/springframework/ide/vscode/commons/util/HtmlBuffer.java @@ -50,7 +50,6 @@ public class HtmlBuffer { public String toString() { - return buffer.toString(); }