diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java index 556394572..14593c14f 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerCodeLensProvider.java @@ -71,7 +71,14 @@ public class WebfluxHandlerCodeLensProvider implements CodeLensProvider { CodeLens codeLens = new CodeLens(); codeLens.setRange(document.toRange(node.getName().getStartPosition(), node.getName().getLength())); - codeLens.setCommand(new Command(handlerInfo.getSymbol(), null)); + + String codeLensCommand = handlerInfo.getHttpMethod() != null ? handlerInfo.getHttpMethod() + " " : ""; + codeLensCommand += handlerInfo.getPath(); + + codeLensCommand += handlerInfo.getContentType() != null ? " Content-Type: " + handlerInfo.getContentType() : ""; + codeLensCommand += handlerInfo.getAcceptType() != null ? " Accept: " + handlerInfo.getAcceptType() : ""; + + codeLens.setCommand(new Command(codeLensCommand, null)); resultAccumulator.add(codeLens); } catch (BadLocationException e) { diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerInformation.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerInformation.java index 4bf3c4ae9..7f7b34142 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerInformation.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxHandlerInformation.java @@ -15,18 +15,22 @@ package org.springframework.ide.vscode.boot.java.requestmapping; */ public class WebfluxHandlerInformation { - private final String symbol; - private String handlerClass; - private String handlerMethod; + private final String handlerClass; + private final String handlerMethod; - public WebfluxHandlerInformation(String symbol, String handlerClass, String handlerMethod) { - this.symbol = symbol; + private final String path; + private final String httpMethod; + private final String contentType; + private final String acceptType; + + public WebfluxHandlerInformation(String handlerClass, String handlerMethod, String path, String httpMethod, String contentType, String acceptType) { this.handlerClass = handlerClass; this.handlerMethod = handlerMethod; - } - - public String getSymbol() { - return symbol; + + this.path = path; + this.httpMethod = httpMethod; + this.contentType = contentType; + this.acceptType = acceptType; } public String getHandlerClass() { @@ -36,5 +40,21 @@ public class WebfluxHandlerInformation { public String getHandlerMethod() { return handlerMethod; } + + public String getPath() { + return path; + } + + public String getHttpMethod() { + return httpMethod; + } + + public String getContentType() { + return contentType; + } + + public String getAcceptType() { + return acceptType; + } } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxRouterSymbolProvider.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxRouterSymbolProvider.java index 30fdeda6c..e9b494bb5 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxRouterSymbolProvider.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/requestmapping/WebfluxRouterSymbolProvider.java @@ -91,6 +91,9 @@ public class WebfluxRouterSymbolProvider implements SymbolProvider { String path = extractPath(node, foundPath); String httpMethod = extractMethod(node); + String contentType = null; + String acceptType = null; + int methodNameStart = node.getName().getStartPosition(); int invocationStart = node.getStartPosition(); @@ -99,7 +102,7 @@ public class WebfluxRouterSymbolProvider implements SymbolProvider { Location location = new Location(doc.getUri(), doc.toRange(methodNameStart, node.getLength() - (methodNameStart - invocationStart))); String label = "@" + (path.startsWith("/") ? path : ("/" + path)) + (httpMethod == null || httpMethod.isEmpty() ? "" : " -- " + httpMethod); - WebfluxHandlerInformation handler = extractHandlerInformation(node, label); + WebfluxHandlerInformation handler = extractHandlerInformation(node, path, httpMethod, contentType, acceptType); result.add(new EnhancedSymbolInformation(new SymbolInformation(label, SymbolKind.Interface, location), handler)); } catch (BadLocationException e) { @@ -161,7 +164,7 @@ public class WebfluxRouterSymbolProvider implements SymbolProvider { return method; } - private WebfluxHandlerInformation extractHandlerInformation(MethodInvocation node, String symbol) { + private WebfluxHandlerInformation extractHandlerInformation(MethodInvocation node, String path, String httpMethod, String contentType, String acceptType) { List arguments = node.arguments(); if (arguments != null) { @@ -177,7 +180,7 @@ public class WebfluxRouterSymbolProvider implements SymbolProvider { String handlerMethod = methodBinding.getMethodDeclaration().toString(); if (handlerMethod != null) handlerMethod = handlerMethod.trim(); - return new WebfluxHandlerInformation(symbol, handlerClass, handlerMethod); + return new WebfluxHandlerInformation(handlerClass, handlerMethod, path, httpMethod, contentType, acceptType); } } } diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxCodeLensProviderTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxCodeLensProviderTest.java index d374973b4..786a535c7 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxCodeLensProviderTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxCodeLensProviderTest.java @@ -53,10 +53,10 @@ public class WebFluxCodeLensProviderTest { assertEquals(4, codeLenses.size()); - assertTrue(containsCodeLens(codeLenses, "@/hello -- GET", 25, 29, 25, 34)); - assertTrue(containsCodeLens(codeLenses, "@/echo -- POST", 30, 29, 30, 33)); - assertTrue(containsCodeLens(codeLenses, "@/quotes -- GET", 35, 29, 35, 41)); - assertTrue(containsCodeLens(codeLenses, "@/quotes -- GET", 41, 29, 41, 40)); + assertTrue(containsCodeLens(codeLenses, "GET /hello", 25, 29, 25, 34)); + assertTrue(containsCodeLens(codeLenses, "POST /echo", 30, 29, 30, 33)); + assertTrue(containsCodeLens(codeLenses, "GET /quotes", 35, 29, 35, 41)); + assertTrue(containsCodeLens(codeLenses, "GET /quotes", 41, 29, 41, 40)); } private boolean containsCodeLens(List codeLenses, String commandTitle, int startLine, int startPosition, int endLine, int endPosition) { diff --git a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxMappingSymbolProviderTest.java b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxMappingSymbolProviderTest.java index 7e41d4173..00d7b7d5c 100644 --- a/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxMappingSymbolProviderTest.java +++ b/headless-services/spring-boot-language-server/src/test/java/org/springframework/ide/vscode/boot/java/requestmapping/test/WebFluxMappingSymbolProviderTest.java @@ -69,23 +69,35 @@ public class WebFluxMappingSymbolProviderTest { List addons = getAdditionalInformation(docUri); assertEquals(4, addons.size()); - WebfluxHandlerInformation handlerInfo1 = getWebfluxHandler(addons, "@/hello -- GET").get(0); - assertEquals("@/hello -- GET", handlerInfo1.getSymbol()); + WebfluxHandlerInformation handlerInfo1 = getWebfluxHandler(addons, "/hello", "GET").get(0); + assertEquals("/hello", handlerInfo1.getPath()); + assertEquals("GET", handlerInfo1.getHttpMethod()); + assertNull(handlerInfo1.getContentType()); + assertNull(handlerInfo1.getAcceptType()); assertEquals("org.test.QuoteHandler", handlerInfo1.getHandlerClass()); assertEquals("public Mono hello(org.springframework.web.reactive.function.server.ServerRequest)", handlerInfo1.getHandlerMethod()); - WebfluxHandlerInformation handlerInfo2 = getWebfluxHandler(addons, "@/echo -- POST").get(0); - assertEquals("@/echo -- POST", handlerInfo2.getSymbol()); + WebfluxHandlerInformation handlerInfo2 = getWebfluxHandler(addons, "/echo", "POST").get(0); + assertEquals("/echo", handlerInfo2.getPath()); + assertEquals("POST", handlerInfo2.getHttpMethod()); + assertNull(handlerInfo2.getContentType()); + assertNull(handlerInfo2.getAcceptType()); assertEquals("org.test.QuoteHandler", handlerInfo2.getHandlerClass()); assertEquals("public Mono echo(org.springframework.web.reactive.function.server.ServerRequest)", handlerInfo2.getHandlerMethod()); - WebfluxHandlerInformation handlerInfo3 = getWebfluxHandler(addons, "@/quotes -- GET").get(0); - assertEquals("@/quotes -- GET", handlerInfo3.getSymbol()); + WebfluxHandlerInformation handlerInfo3 = getWebfluxHandler(addons, "/quotes", "GET").get(0); + assertEquals("/quotes", handlerInfo3.getPath()); + assertEquals("GET", handlerInfo3.getHttpMethod()); + assertNull(handlerInfo3.getContentType()); + assertNull(handlerInfo3.getAcceptType()); assertEquals("org.test.QuoteHandler", handlerInfo3.getHandlerClass()); assertEquals("public Mono streamQuotes(org.springframework.web.reactive.function.server.ServerRequest)", handlerInfo3.getHandlerMethod()); - WebfluxHandlerInformation handlerInfo4 = getWebfluxHandler(addons, "@/quotes -- GET").get(1); - assertEquals("@/quotes -- GET", handlerInfo4.getSymbol()); + WebfluxHandlerInformation handlerInfo4 = getWebfluxHandler(addons, "/quotes", "GET").get(1); + assertEquals("/quotes", handlerInfo4.getPath()); + assertEquals("GET", handlerInfo4.getHttpMethod()); + assertNull(handlerInfo4.getContentType()); + assertNull(handlerInfo4.getAcceptType()); assertEquals("org.test.QuoteHandler", handlerInfo4.getHandlerClass()); assertEquals("public Mono fetchQuotes(org.springframework.web.reactive.function.server.ServerRequest)", handlerInfo4.getHandlerMethod()); } @@ -105,18 +117,27 @@ public class WebFluxMappingSymbolProviderTest { List addons = getAdditionalInformation(docUri); assertEquals(3, addons.size()); - WebfluxHandlerInformation handlerInfo1 = getWebfluxHandler(addons, "@/person/{id} -- GET").get(0); - assertEquals("@/person/{id} -- GET", handlerInfo1.getSymbol()); + WebfluxHandlerInformation handlerInfo1 = getWebfluxHandler(addons, "/person/{id}", "GET").get(0); + assertEquals("/person/{id}", handlerInfo1.getPath()); + assertEquals("GET", handlerInfo1.getHttpMethod()); + assertNull(handlerInfo1.getContentType()); + assertNull(handlerInfo1.getAcceptType()); assertEquals("org.test.PersonHandler", handlerInfo1.getHandlerClass()); assertEquals("public Mono getPerson(org.springframework.web.reactive.function.server.ServerRequest)", handlerInfo1.getHandlerMethod()); - WebfluxHandlerInformation handlerInfo2 = getWebfluxHandler(addons, "@/person/ -- POST").get(0); - assertEquals("@/person/ -- POST", handlerInfo2.getSymbol()); + WebfluxHandlerInformation handlerInfo2 = getWebfluxHandler(addons, "/person/", "POST").get(0); + assertEquals("/person/", handlerInfo2.getPath()); + assertEquals("POST", handlerInfo2.getHttpMethod()); + assertNull(handlerInfo2.getContentType()); + assertNull(handlerInfo2.getAcceptType()); assertEquals("org.test.PersonHandler", handlerInfo2.getHandlerClass()); assertEquals("public Mono createPerson(org.springframework.web.reactive.function.server.ServerRequest)", handlerInfo2.getHandlerMethod()); - WebfluxHandlerInformation handlerInfo3 = getWebfluxHandler(addons, "@/person -- GET").get(0); - assertEquals("@/person -- GET", handlerInfo3.getSymbol()); + WebfluxHandlerInformation handlerInfo3 = getWebfluxHandler(addons, "/person", "GET").get(0); + assertEquals("/person", handlerInfo3.getPath()); + assertEquals("GET", handlerInfo3.getHttpMethod()); + assertNull(handlerInfo3.getContentType()); + assertNull(handlerInfo3.getAcceptType()); assertEquals("org.test.PersonHandler", handlerInfo3.getHandlerClass()); assertEquals("public Mono listPeople(org.springframework.web.reactive.function.server.ServerRequest)", handlerInfo3.getHandlerMethod()); } @@ -146,11 +167,11 @@ public class WebFluxMappingSymbolProviderTest { return harness.getServerWrapper().getComponents().getSpringIndexer().getAdditonalInformation(docUri); } - private List getWebfluxHandler(List addons, String symbol) { + private List getWebfluxHandler(List addons, String path, String httpMethod) { return addons.stream() .filter((obj) -> obj instanceof WebfluxHandlerInformation) .map((obj -> (WebfluxHandlerInformation) obj)) - .filter((addon) -> addon.getSymbol().equals(symbol)) + .filter((addon) -> addon.getPath().equals(path) && addon.getHttpMethod().equals(httpMethod)) .collect(Collectors.toList()); }