From 136b98d2155786b22b2ab005595a6801943c8899 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Wed, 25 Oct 2017 13:40:57 -0700 Subject: [PATCH] Add parsing of LiveBeanModel to actuator client --- .../boot-java-language-server/pom.xml | 2 +- .../autowired/AutowiredHoverProvider.java | 23 ++++---- .../java/autowired/SpringBootAppProvider.java | 4 +- .../autowired/SpringBootAppProviderImpl.java | 3 +- .../java/beans/ComponentHoverProvider.java | 24 ++++----- .../test/AutowiredHoverProviderTest.java | 13 ++--- .../test/ComponentHoverProviderTest.java | 11 ++-- .../harness/MockRunningAppProvider.java | 3 +- .../commons/commons-boot-app-cli/pom.xml | 5 ++ .../commons/boot/app/cli/SpringBootApp.java | 13 ++++- .../boot/app/cli/livebean}/LiveBean.java | 2 +- .../app/cli/livebean}/LiveBeansModel.java | 49 +++++++++++------- .../boot/app/cli}/LiveBeansModelTest.java | 19 ++++--- .../boot/app/cli/SpringBootAppTest.java | 17 +++--- ...-client-15-test-subject-0.0.1-SNAPSHOT.jar | Bin ...-client-20-test-subject-0.0.1-SNAPSHOT.jar | Bin ...nt-20-thin-test-subject-0.0.1-SNAPSHOT.jar | Bin .../empty-live-beans-model.json | 0 .../simple-live-beans-model.json | 0 .../totally-empty-live-beans-model.json | 0 .../java/CompositeJavaProjectFinder.java | 2 +- headless-services/commons/pom.xml | 1 + 22 files changed, 113 insertions(+), 78 deletions(-) rename headless-services/{boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired => commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/livebean}/LiveBean.java (96%) rename headless-services/{boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired => commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/livebean}/LiveBeansModel.java (65%) rename headless-services/{boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test => commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli}/LiveBeansModelTest.java (75%) rename headless-services/commons/commons-boot-app-cli/src/test/resources/{ => boot-apps}/actuator-client-15-test-subject-0.0.1-SNAPSHOT.jar (100%) rename headless-services/commons/commons-boot-app-cli/src/test/resources/{ => boot-apps}/actuator-client-20-test-subject-0.0.1-SNAPSHOT.jar (100%) rename headless-services/commons/commons-boot-app-cli/src/test/resources/{ => boot-apps}/actuator-client-20-thin-test-subject-0.0.1-SNAPSHOT.jar (100%) rename headless-services/{boot-java-language-server => commons/commons-boot-app-cli}/src/test/resources/live-beans-models/empty-live-beans-model.json (100%) rename headless-services/{boot-java-language-server => commons/commons-boot-app-cli}/src/test/resources/live-beans-models/simple-live-beans-model.json (100%) rename headless-services/{boot-java-language-server => commons/commons-boot-app-cli}/src/test/resources/live-beans-models/totally-empty-live-beans-model.json (100%) diff --git a/headless-services/boot-java-language-server/pom.xml b/headless-services/boot-java-language-server/pom.xml index d1c813b6c..33a4cf809 100644 --- a/headless-services/boot-java-language-server/pom.xml +++ b/headless-services/boot-java-language-server/pom.xml @@ -84,7 +84,7 @@ commons-io commons-io - 2.4 + ${commons-io-version} diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/AutowiredHoverProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/AutowiredHoverProvider.java index 9dc13e806..36e3aa6d8 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/AutowiredHoverProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/AutowiredHoverProvider.java @@ -25,6 +25,8 @@ import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.springframework.ide.vscode.boot.java.handlers.HoverProvider; import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBean; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.Log; import org.springframework.ide.vscode.commons.util.text.TextDocument; @@ -54,8 +56,8 @@ public class AutowiredHoverProvider implements HoverProvider { for (SpringBootAppProvider bootApp : runningApps) { try { - String liveBeans = bootApp.getBeans(); - if (liveBeans != null && liveBeans.length() > 0) { + LiveBeansModel liveBeans = bootApp.getBeans(); + if (liveBeans != null && !liveBeans.isEmpty()) { addLiveHoverContent(annotation, doc, liveBeans, bootApp, hoverContent); } } @@ -85,8 +87,8 @@ public class AutowiredHoverProvider implements HoverProvider { try { for (SpringBootApp bootApp : runningApps) { try { - String liveBeans = bootApp.getBeans(); - if (liveBeans != null && liveBeans.length() > 0) { + LiveBeansModel liveBeans = bootApp.getBeans(); + if (liveBeans != null && !liveBeans.isEmpty()) { Range range = getLiveHoverHint(annotation, doc, liveBeans); if (range != null) { return ImmutableList.of(range); @@ -105,14 +107,11 @@ public class AutowiredHoverProvider implements HoverProvider { return null; } - public Range getLiveHoverHint(Annotation annotation, TextDocument doc, String liveBeansJSON) { + public Range getLiveHoverHint(Annotation annotation, TextDocument doc, LiveBeansModel beansModel) { try { String type = findDeclaredType(annotation); - if (type != null && liveBeansJSON != null) { - - LiveBeansModel beansModel = LiveBeansModel.parse(liveBeansJSON); + if (type != null && beansModel != null) { LiveBean[] beansOfType = beansModel.getBeansOfType(type); - if (beansOfType.length > 0) { Range hoverRange = doc.toRange(annotation.getStartPosition(), annotation.getLength()); return hoverRange; @@ -126,11 +125,9 @@ public class AutowiredHoverProvider implements HoverProvider { return null; } - public void addLiveHoverContent(Annotation annotation, TextDocument doc, String liveBeansJSON, SpringBootAppProvider bootApp, List> hoverContent) { + public void addLiveHoverContent(Annotation annotation, TextDocument doc, LiveBeansModel beansModel, SpringBootAppProvider bootApp, List> hoverContent) { String type = findDeclaredType(annotation); - if (type != null && liveBeansJSON != null) { - - LiveBeansModel beansModel = LiveBeansModel.parse(liveBeansJSON); + if (type != null && beansModel != null) { LiveBean[] beansOfType = beansModel.getBeansOfType(type); if (beansOfType.length > 0) { diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/SpringBootAppProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/SpringBootAppProvider.java index 9a4a64d3e..5bf1fda5d 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/SpringBootAppProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/SpringBootAppProvider.java @@ -10,12 +10,14 @@ *******************************************************************************/ package org.springframework.ide.vscode.boot.java.autowired; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; + /** * @author Martin Lippert */ public interface SpringBootAppProvider { - public String getBeans() throws Exception; + public LiveBeansModel getBeans() throws Exception; public String getProcessID(); public String getProcessName(); diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/SpringBootAppProviderImpl.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/SpringBootAppProviderImpl.java index af8e94c16..3563d0376 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/SpringBootAppProviderImpl.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/SpringBootAppProviderImpl.java @@ -11,6 +11,7 @@ package org.springframework.ide.vscode.boot.java.autowired; import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; /** * @author Martin Lippert @@ -24,7 +25,7 @@ public class SpringBootAppProviderImpl implements SpringBootAppProvider { } @Override - public String getBeans() throws Exception { + public LiveBeansModel getBeans() throws Exception { return bootApp.getBeans(); } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentHoverProvider.java b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentHoverProvider.java index 4a09f215b..4852b1d0d 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentHoverProvider.java +++ b/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/beans/ComponentHoverProvider.java @@ -26,12 +26,12 @@ import org.eclipse.lsp4j.MarkedString; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.jsonrpc.messages.Either; import org.springframework.ide.vscode.boot.java.autowired.Constants; -import org.springframework.ide.vscode.boot.java.autowired.LiveBean; -import org.springframework.ide.vscode.boot.java.autowired.LiveBeansModel; import org.springframework.ide.vscode.boot.java.autowired.SpringBootAppProvider; import org.springframework.ide.vscode.boot.java.autowired.SpringBootAppProviderImpl; import org.springframework.ide.vscode.boot.java.handlers.HoverProvider; import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBean; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; import org.springframework.ide.vscode.commons.util.BadLocationException; import org.springframework.ide.vscode.commons.util.Log; import org.springframework.ide.vscode.commons.util.text.TextDocument; @@ -68,8 +68,8 @@ public class ComponentHoverProvider implements HoverProvider { List> hoverContent = new ArrayList<>(); for (SpringBootAppProvider bootApp : runningApps) { try { - String liveBeans = bootApp.getBeans(); - if (liveBeans != null && liveBeans.length() > 0) { + LiveBeansModel liveBeans = bootApp.getBeans(); + if (liveBeans != null && !liveBeans.isEmpty()) { addLiveHoverContent(typeDecl, doc, liveBeans, bootApp, hoverContent); } } @@ -101,8 +101,8 @@ public class ComponentHoverProvider implements HoverProvider { try { for (SpringBootApp bootApp : runningApps) { try { - String liveBeans = bootApp.getBeans(); - if (liveBeans != null && liveBeans.length() > 0) { + LiveBeansModel liveBeans = bootApp.getBeans(); + if (liveBeans != null && !liveBeans.isEmpty()) { Range range = getLiveHoverHint(annotation, doc, liveBeans); if (range != null) { return ImmutableList.of(range); @@ -121,13 +121,11 @@ public class ComponentHoverProvider implements HoverProvider { return null; } - public Range getLiveHoverHint(Annotation annotation, TextDocument doc, String liveBeansJSON) { + public Range getLiveHoverHint(Annotation annotation, TextDocument doc, LiveBeansModel beansModel) { try { TypeDeclaration type = findDeclaredType(annotation); - if (type != null && liveBeansJSON != null) { + if (type != null && beansModel != null) { String typeName = type.resolveBinding().getQualifiedName(); - - LiveBeansModel beansModel = LiveBeansModel.parse(liveBeansJSON); LiveBean[] beansOfType = beansModel.getBeansOfType(typeName); if (beansOfType.length > 0) { @@ -160,11 +158,9 @@ public class ComponentHoverProvider implements HoverProvider { } - public void addLiveHoverContent(TypeDeclaration declaringType, TextDocument doc, String liveBeansJSON, SpringBootAppProvider bootApp, List> hoverContent) { + public void addLiveHoverContent(TypeDeclaration declaringType, TextDocument doc, LiveBeansModel beansModel, SpringBootAppProvider bootApp, List> hoverContent) { String type = declaringType.resolveBinding().getQualifiedName(); - if (type != null && liveBeansJSON != null) { - - LiveBeansModel beansModel = LiveBeansModel.parse(liveBeansJSON); + if (type != null && beansModel != null) { LiveBean[] beansOfType = beansModel.getBeansOfType(type); if (beansOfType.length > 0) { diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java index 92224fc0a..8e0d05537 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/AutowiredHoverProviderTest.java @@ -42,6 +42,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.ide.vscode.boot.java.autowired.AutowiredHoverProvider; import org.springframework.ide.vscode.boot.java.autowired.SpringBootAppProvider; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; @@ -82,7 +83,7 @@ public class AutowiredHoverProviderTest { AutowiredHoverProvider provider = new AutowiredHoverProvider(); String beansJSON = new String(Files.readAllBytes(new File(directory, "runtime-bean-information.json").toPath())); - Range hint = provider.getLiveHoverHint((Annotation)node, document, beansJSON); + Range hint = provider.getLiveHoverHint((Annotation)node, document, LiveBeansModel.parse(beansJSON)); assertNotNull(hint); assertEquals(11, hint.getStart().getLine()); @@ -106,7 +107,7 @@ public class AutowiredHoverProviderTest { ASTNode node = NodeFinder.perform(cu, offset, 0).getParent(); AutowiredHoverProvider provider = new AutowiredHoverProvider(); - Range hint = provider.getLiveHoverHint((Annotation)node, document, (String)null); + Range hint = provider.getLiveHoverHint((Annotation)node, document, LiveBeansModel.parse(null)); assertNull(hint); } @@ -127,7 +128,7 @@ public class AutowiredHoverProviderTest { AutowiredHoverProvider provider = new AutowiredHoverProvider(); String beansJSON = new String(Files.readAllBytes(new File(directory, "wrong-runtime-bean-information.json").toPath())); - Range hint = provider.getLiveHoverHint((Annotation)node, document, beansJSON); + Range hint = provider.getLiveHoverHint((Annotation)node, document, LiveBeansModel.parse(beansJSON)); assertNull(hint); } @@ -146,7 +147,7 @@ public class AutowiredHoverProviderTest { ASTNode node = NodeFinder.perform(cu, offset, 0).getParent(); AutowiredHoverProvider provider = new AutowiredHoverProvider(); - String beansJSON = new String(Files.readAllBytes(new File(directory, "runtime-bean-information.json").toPath())); + LiveBeansModel beansModel = LiveBeansModel.parse(new String(Files.readAllBytes(new File(directory, "runtime-bean-information.json").toPath()))); SpringBootAppProvider bootApp = new SpringBootAppProvider() { @Override @@ -160,8 +161,8 @@ public class AutowiredHoverProviderTest { } @Override - public String getBeans() throws Exception { - return beansJSON; + public LiveBeansModel getBeans() throws Exception { + return beansModel; } }; CompletableFuture hoverFuture = provider.provideHover(null, (Annotation)node, null, offset, document, new SpringBootAppProvider[] {bootApp}); diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java index 397f0aa2c..2130f9d06 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java +++ b/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/beans/test/ComponentHoverProviderTest.java @@ -42,6 +42,7 @@ import org.junit.Before; import org.junit.Test; import org.springframework.ide.vscode.boot.java.autowired.SpringBootAppProvider; import org.springframework.ide.vscode.boot.java.beans.ComponentHoverProvider; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; @@ -82,7 +83,7 @@ public class ComponentHoverProviderTest { ComponentHoverProvider provider = new ComponentHoverProvider(); String beansJSON = new String(Files.readAllBytes(new File(directory, "runtime-bean-information-automatically-wired.json").toPath())); - Range hint = provider.getLiveHoverHint((Annotation)node, document, beansJSON); + Range hint = provider.getLiveHoverHint((Annotation)node, document, LiveBeansModel.parse(beansJSON)); assertNotNull(hint); assertEquals(10, hint.getStart().getLine()); @@ -108,7 +109,7 @@ public class ComponentHoverProviderTest { ComponentHoverProvider provider = new ComponentHoverProvider(); String beansJSON = new String(Files.readAllBytes(new File(directory, "runtime-bean-information.json").toPath())); - Range hint = provider.getLiveHoverHint((Annotation)node, document, beansJSON); + Range hint = provider.getLiveHoverHint((Annotation)node, document, LiveBeansModel.parse(beansJSON)); assertNull(hint); } @@ -127,7 +128,7 @@ public class ComponentHoverProviderTest { ASTNode node = NodeFinder.perform(cu, offset, 0).getParent(); ComponentHoverProvider provider = new ComponentHoverProvider(); - String beansJSON = new String(Files.readAllBytes(new File(directory, "runtime-bean-information-automatically-wired.json").toPath())); + LiveBeansModel beansModel = LiveBeansModel.parse(new String(Files.readAllBytes(new File(directory, "runtime-bean-information-automatically-wired.json").toPath()))); SpringBootAppProvider bootApp = new SpringBootAppProvider() { @Override @@ -141,8 +142,8 @@ public class ComponentHoverProviderTest { } @Override - public String getBeans() throws Exception { - return beansJSON; + public LiveBeansModel getBeans() throws Exception { + return beansModel; } }; CompletableFuture hoverFuture = provider.provideHover(null, (Annotation) node, null, 0, document, new SpringBootAppProvider[] {bootApp}); 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 048afeaeb..d6df3851d 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 @@ -19,6 +19,7 @@ import java.util.Collection; import org.mockito.Mockito; import org.springframework.ide.vscode.boot.java.handlers.RunningAppProvider; import org.springframework.ide.vscode.commons.boot.app.cli.SpringBootApp; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; import org.springframework.ide.vscode.commons.util.ExceptionUtil; import org.springframework.ide.vscode.project.harness.BootLanguageServerHarness.Builder; @@ -67,7 +68,7 @@ public class MockRunningAppProvider { } public MockAppBuilder beans(String beans) throws Exception { - when(app.getBeans()).thenReturn(beans); + when(app.getBeans()).thenReturn(LiveBeansModel.parse(beans)); return this; } diff --git a/headless-services/commons/commons-boot-app-cli/pom.xml b/headless-services/commons/commons-boot-app-cli/pom.xml index 17847e03a..7c20c3917 100644 --- a/headless-services/commons/commons-boot-app-cli/pom.xml +++ b/headless-services/commons/commons-boot-app-cli/pom.xml @@ -24,6 +24,11 @@ jackson-databind 2.8.8.1 + + commons-io + commons-io + ${commons-io-version} + com.sun 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 b1cc28225..136ca67ef 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 @@ -30,7 +30,9 @@ import javax.management.remote.JMXServiceURL; 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.util.Log; +import org.springframework.ide.vscode.commons.util.StringUtil; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.collect.ImmutableList; @@ -170,7 +172,7 @@ public class SpringBootApp { return null; } - public String getBeans() throws Exception { + private String getBeansJson() throws Exception { Object result = getActuatorDataFromAttribute("org.springframework.boot:type=Endpoint,name=beansEndpoint", "Data"); if (result != null) { String beans = new ObjectMapper().writeValueAsString(result); @@ -186,6 +188,14 @@ public class SpringBootApp { return null; } + public LiveBeansModel getBeans() throws Exception { + String json = getBeansJson(); + if (StringUtil.hasText(json)) { + return LiveBeansModel.parse(json); + } + return null; + } + public String getRequestMappings() throws Exception { Object result = getActuatorDataFromAttribute("org.springframework.boot:type=Endpoint,name=requestMappingEndpoint", "Data"); if (result != null) { @@ -424,5 +434,4 @@ public class SpringBootApp { return null; } - } diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/LiveBean.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/livebean/LiveBean.java similarity index 96% rename from headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/LiveBean.java rename to headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/livebean/LiveBean.java index 6e7b29cde..ee2b3394d 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/LiveBean.java +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/livebean/LiveBean.java @@ -8,7 +8,7 @@ * Contributors: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ -package org.springframework.ide.vscode.boot.java.autowired; +package org.springframework.ide.vscode.commons.boot.app.cli.livebean; import org.json.JSONArray; import org.json.JSONObject; diff --git a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/LiveBeansModel.java b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/livebean/LiveBeansModel.java similarity index 65% rename from headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/LiveBeansModel.java rename to headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/livebean/LiveBeansModel.java index 85071675c..3544a2e33 100644 --- a/headless-services/boot-java-language-server/src/main/java/org/springframework/ide/vscode/boot/java/autowired/LiveBeansModel.java +++ b/headless-services/commons/commons-boot-app-cli/src/main/java/org/springframework/ide/vscode/commons/boot/app/cli/livebean/LiveBeansModel.java @@ -8,16 +8,19 @@ * Contributors: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ -package org.springframework.ide.vscode.boot.java.autowired; +package org.springframework.ide.vscode.commons.boot.app.cli.livebean; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; +import java.util.stream.Stream; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; +import org.springframework.ide.vscode.commons.util.StringUtil; /** * @author Martin Lippert @@ -26,32 +29,32 @@ public class LiveBeansModel { public static LiveBeansModel parse(String json) { LiveBeansModel model = new LiveBeansModel(); + if (StringUtil.hasText(json)) { + try { + JSONArray mainArray = new JSONArray(json); - try { - JSONArray mainArray = new JSONArray(json); + for (int i = 0; i < mainArray.length(); i++) { + JSONObject appContext = mainArray.getJSONObject(i); + if (appContext == null) continue; - for (int i = 0; i < mainArray.length(); i++) { - JSONObject appContext = mainArray.getJSONObject(i); - if (appContext == null) continue; + JSONArray beansArray = appContext.optJSONArray("beans"); + if (beansArray == null) continue; - JSONArray beansArray = appContext.optJSONArray("beans"); - if (beansArray == null) continue; + for (int j = 0; j < beansArray.length(); j++) { + JSONObject beanObject = beansArray.getJSONObject(j); + if (beanObject == null) continue; - for (int j = 0; j < beansArray.length(); j++) { - JSONObject beanObject = beansArray.getJSONObject(j); - if (beanObject == null) continue; - - LiveBean bean = LiveBean.parse(beanObject); - if (bean != null) { - model.add(bean); + LiveBean bean = LiveBean.parse(beanObject); + if (bean != null) { + model.add(bean); + } } } } + catch (JSONException e) { + e.printStackTrace(); + } } - catch (JSONException e) { - e.printStackTrace(); - } - return model; } @@ -85,4 +88,12 @@ public class LiveBeansModel { } } + public Stream getAllBeans() { + return beansViaName.values().stream().flatMap(Collection::stream); + } + + public boolean isEmpty() { + return !getAllBeans().findAny().isPresent(); + } + } diff --git a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/LiveBeansModelTest.java b/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/LiveBeansModelTest.java similarity index 75% rename from headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/LiveBeansModelTest.java rename to headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/LiveBeansModelTest.java index 5c08df184..e7372bd27 100644 --- a/headless-services/boot-java-language-server/src/test/java/org/springframework/ide/vscode/boot/java/autowired/test/LiveBeansModelTest.java +++ b/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/LiveBeansModelTest.java @@ -8,15 +8,16 @@ * Contributors: * Pivotal, Inc. - initial API and implementation *******************************************************************************/ -package org.springframework.ide.vscode.boot.java.autowired.test; +package org.springframework.ide.vscode.commons.boot.app.cli; import static org.junit.Assert.assertEquals; +import java.io.InputStream; + import org.apache.commons.io.IOUtils; import org.junit.Test; -import org.springframework.ide.vscode.boot.java.autowired.LiveBean; -import org.springframework.ide.vscode.boot.java.autowired.LiveBeansModel; -import org.springframework.ide.vscode.project.harness.ProjectsHarness; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBean; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; /** * @author Martin Lippert @@ -25,7 +26,7 @@ public class LiveBeansModelTest { @Test public void testSimpleModel() throws Exception { - String json = IOUtils.toString(ProjectsHarness.class.getResourceAsStream("/live-beans-models/simple-live-beans-model.json")); + String json = IOUtils.toString(getResourceAsStream("/live-beans-models/simple-live-beans-model.json")); LiveBeansModel model = LiveBeansModel.parse(json); LiveBean[] bean = model.getBeansOfType("org.test.DependencyA"); @@ -49,7 +50,7 @@ public class LiveBeansModelTest { @Test public void testEmptyModel() throws Exception { - String json = IOUtils.toString(ProjectsHarness.class.getResourceAsStream("/live-beans-models/empty-live-beans-model.json")); + String json = IOUtils.toString(getResourceAsStream("/live-beans-models/empty-live-beans-model.json")); LiveBeansModel model = LiveBeansModel.parse(json); LiveBean[] bean = model.getBeansOfType("org.test.DependencyA"); @@ -58,11 +59,15 @@ public class LiveBeansModelTest { @Test public void testTotallyEmptyModel() throws Exception { - String json = IOUtils.toString(ProjectsHarness.class.getResourceAsStream("/live-beans-models/totally-empty-live-beans-model.json")); + String json = IOUtils.toString(getResourceAsStream("/live-beans-models/totally-empty-live-beans-model.json")); LiveBeansModel model = LiveBeansModel.parse(json); LiveBean[] bean = model.getBeansOfType("org.test.DependencyA"); assertEquals(0, bean.length); } + private InputStream getResourceAsStream(String string) { + return LiveBeansModelTest.class.getResourceAsStream(string); + } + } 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 bc08c745e..65ce0f193 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 @@ -26,9 +26,11 @@ import java.util.stream.Collectors; import org.json.JSONObject; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; +import org.springframework.ide.vscode.commons.boot.app.cli.livebean.LiveBeansModel; import org.springframework.ide.vscode.commons.util.AsyncProcess; import org.springframework.ide.vscode.commons.util.ExceptionUtil; import org.springframework.ide.vscode.commons.util.ExternalCommand; @@ -37,11 +39,8 @@ import org.springframework.ide.vscode.commons.util.test.ACondition; import com.google.common.collect.ImmutableList; -import junit.framework.AssertionFailedError; - public class SpringBootAppTest { -// private static final String appName = "actuator-client-15-test-subject"; // Boot 1.5 test app private static final String[] appNames = { "actuator-client-20-test-subject", //Boot 2.0 test app "actuator-client-20-thin-test-subject", // Like the Boot 2.0 app, but packaged with thin launcher instead of fatjar @@ -59,7 +58,7 @@ public class SpringBootAppTest { public static void setupClass() throws Exception { testAppRunners = Arrays.asList(appNames).stream().map(appName -> { try { - return startTestApplication(SpringBootAppTest.class.getResource("/"+appName+"-0.0.1-SNAPSHOT.jar")); + return startTestApplication(SpringBootAppTest.class.getResource("/boot-apps/"+appName+"-0.0.1-SNAPSHOT.jar")); } catch (Exception e) { throw ExceptionUtil.unchecked(e); } @@ -141,6 +140,12 @@ public class SpringBootAppTest { .collect(Collectors.toList()); } + @Before + public void ensureTestAppsAvailable() throws Exception { + //To avoid race condition when JMX connector fails if trying to attach to quickly after starting apps + ACondition.waitFor(TIMEOUT, () -> getTestApps()); + } + @Test public void getHost() throws Exception { for (SpringBootApp testApp : getTestApps()) { @@ -169,8 +174,8 @@ public class SpringBootAppTest { for (SpringBootApp testApp : getTestApps()) { try { ACondition.waitFor(TIMEOUT, () -> { - String beans = testApp.getBeans(); - assertNonEmptyJsonObject(beans); + LiveBeansModel beansModel = testApp.getBeans(); + assertTrue(beansModel.getAllBeans().findAny().isPresent()); // System.out.println("beans = "+beans); }); } catch (Throwable e) { diff --git a/headless-services/commons/commons-boot-app-cli/src/test/resources/actuator-client-15-test-subject-0.0.1-SNAPSHOT.jar b/headless-services/commons/commons-boot-app-cli/src/test/resources/boot-apps/actuator-client-15-test-subject-0.0.1-SNAPSHOT.jar similarity index 100% rename from headless-services/commons/commons-boot-app-cli/src/test/resources/actuator-client-15-test-subject-0.0.1-SNAPSHOT.jar rename to headless-services/commons/commons-boot-app-cli/src/test/resources/boot-apps/actuator-client-15-test-subject-0.0.1-SNAPSHOT.jar diff --git a/headless-services/commons/commons-boot-app-cli/src/test/resources/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 similarity index 100% rename from headless-services/commons/commons-boot-app-cli/src/test/resources/actuator-client-20-test-subject-0.0.1-SNAPSHOT.jar rename to headless-services/commons/commons-boot-app-cli/src/test/resources/boot-apps/actuator-client-20-test-subject-0.0.1-SNAPSHOT.jar diff --git a/headless-services/commons/commons-boot-app-cli/src/test/resources/actuator-client-20-thin-test-subject-0.0.1-SNAPSHOT.jar b/headless-services/commons/commons-boot-app-cli/src/test/resources/boot-apps/actuator-client-20-thin-test-subject-0.0.1-SNAPSHOT.jar similarity index 100% rename from headless-services/commons/commons-boot-app-cli/src/test/resources/actuator-client-20-thin-test-subject-0.0.1-SNAPSHOT.jar rename to headless-services/commons/commons-boot-app-cli/src/test/resources/boot-apps/actuator-client-20-thin-test-subject-0.0.1-SNAPSHOT.jar diff --git a/headless-services/boot-java-language-server/src/test/resources/live-beans-models/empty-live-beans-model.json b/headless-services/commons/commons-boot-app-cli/src/test/resources/live-beans-models/empty-live-beans-model.json similarity index 100% rename from headless-services/boot-java-language-server/src/test/resources/live-beans-models/empty-live-beans-model.json rename to headless-services/commons/commons-boot-app-cli/src/test/resources/live-beans-models/empty-live-beans-model.json diff --git a/headless-services/boot-java-language-server/src/test/resources/live-beans-models/simple-live-beans-model.json b/headless-services/commons/commons-boot-app-cli/src/test/resources/live-beans-models/simple-live-beans-model.json similarity index 100% rename from headless-services/boot-java-language-server/src/test/resources/live-beans-models/simple-live-beans-model.json rename to headless-services/commons/commons-boot-app-cli/src/test/resources/live-beans-models/simple-live-beans-model.json diff --git a/headless-services/boot-java-language-server/src/test/resources/live-beans-models/totally-empty-live-beans-model.json b/headless-services/commons/commons-boot-app-cli/src/test/resources/live-beans-models/totally-empty-live-beans-model.json similarity index 100% rename from headless-services/boot-java-language-server/src/test/resources/live-beans-models/totally-empty-live-beans-model.json rename to headless-services/commons/commons-boot-app-cli/src/test/resources/live-beans-models/totally-empty-live-beans-model.json diff --git a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/CompositeJavaProjectFinder.java b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/CompositeJavaProjectFinder.java index b41060559..fbeb5921a 100644 --- a/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/CompositeJavaProjectFinder.java +++ b/headless-services/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/languageserver/java/CompositeJavaProjectFinder.java @@ -20,7 +20,7 @@ import org.eclipse.lsp4j.TextDocumentIdentifier; import org.springframework.ide.vscode.commons.java.IJavaProject; /** - * Composite project manager that acts a single project manager but consissts of many project managers + * Composite project manager that acts a single project manager but consists of many project managers * * @author Alex Boyko * diff --git a/headless-services/commons/pom.xml b/headless-services/commons/pom.xml index 51fa1730a..55e8c8007 100644 --- a/headless-services/commons/pom.xml +++ b/headless-services/commons/pom.xml @@ -85,6 +85,7 @@ 3.0.5.RELEASE 0.6.0.RELEASE 2.4.0.RELEASE + 2.4