From 9ef919e73fd5a9f8cc39e54ef4f8f1938646170b Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 6 Sep 2018 18:25:39 -0400 Subject: [PATCH 1/7] PT #160125656: Consolidate prefs page for LS extensions --- .../plugin.xml | 4 +- .../ls/BootLanguageServerPreferencesPage.java | 39 +++++++++++++++++-- .../plugin.xml | 9 +++-- ...ava => LanguageServerPreferencesPage.java} | 11 +----- .../commons/preferences/PrefsInitializer.java | 2 +- 5 files changed, 45 insertions(+), 20 deletions(-) rename eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/{LanguageServerConsolesPreferencesPage.java => LanguageServerPreferencesPage.java} (79%) diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml index 913e99c71..0534855a6 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml @@ -86,9 +86,9 @@ diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLanguageServerPreferencesPage.java b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLanguageServerPreferencesPage.java index 9a9284fcf..94159272b 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLanguageServerPreferencesPage.java +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/src/org/springframework/tooling/boot/ls/BootLanguageServerPreferencesPage.java @@ -12,8 +12,15 @@ package org.springframework.tooling.boot.ls; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; +import org.eclipse.jface.preference.IPreferenceStore; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Label; import org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; +import org.springframework.tooling.ls.eclipse.commons.LanguageServerCommonsActivator; +import org.springframework.tooling.ls.eclipse.commons.preferences.PreferenceConstants; /** * Preference page for Boot-Java LS extension @@ -28,17 +35,43 @@ public class BootLanguageServerPreferencesPage extends FieldEditorPreferencePage @Override public void init(IWorkbench workbench) { - setDescription("Settings for Boot-Java language server extension"); setPreferenceStore(BootLanguageServerPlugin.getDefault().getPreferenceStore()); } @Override protected void createFieldEditors() { - BooleanFieldEditor liveHintsPrefEditor = new BooleanFieldEditor(Constants.PREF_BOOT_HINTS, "Live Boot Hint Decorators", getFieldEditorParent()); + + Composite parent = getFieldEditorParent(); + + Label l = new Label(parent, SWT.NONE); + l.setFont(parent.getFont()); + l.setText("Settings for Spring Boot Live Beans data:"); + GridData gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 2; + gd.grabExcessHorizontalSpace = false; + l.setLayoutData(gd); + + BooleanFieldEditor liveHintsPrefEditor = new BooleanFieldEditor(Constants.PREF_BOOT_HINTS, "Live Boot Hint Decorators", parent); addField(liveHintsPrefEditor); - BooleanFieldEditor liveChangeDetectionPrefEditor = new BooleanFieldEditor(Constants.PREF_CHANGE_DETECTION, "Live Boot Change Detection", getFieldEditorParent()); + final IPreferenceStore commonsLsPrefs = LanguageServerCommonsActivator.getInstance().getPreferenceStore(); + addField(new BooleanFieldEditor(PreferenceConstants.HIGHLIGHT_CODELENS_PREFS, "Highlights CodeLens (Experimental)", parent) { + + @Override + public IPreferenceStore getPreferenceStore() { + return commonsLsPrefs; + } + + }); + + BooleanFieldEditor liveChangeDetectionPrefEditor = new BooleanFieldEditor(Constants.PREF_CHANGE_DETECTION, "Live Boot Change Detection", parent); addField(liveChangeDetectionPrefEditor); + + l = new Label(parent, SWT.NONE); + gd = new GridData(GridData.FILL_HORIZONTAL); + gd.horizontalSpan = 2; + l.setLayoutData(gd); + } } diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml index 47126e5e1..3d2a114bf 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml @@ -28,10 +28,11 @@ - + category="org.eclipse.lsp4e.preferences" + class="org.springframework.tooling.ls.eclipse.commons.preferences.LanguageServerPreferencesPage" + id="org.springframework.tooling.ls.eclipse.commons.console.preferences" + name="STS Language Servers"> + diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/LanguageServerConsolesPreferencesPage.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/LanguageServerPreferencesPage.java similarity index 79% rename from eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/LanguageServerConsolesPreferencesPage.java rename to eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/LanguageServerPreferencesPage.java index 5e2d8b091..89a097a72 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/LanguageServerConsolesPreferencesPage.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/LanguageServerPreferencesPage.java @@ -12,7 +12,6 @@ package org.springframework.tooling.ls.eclipse.commons.preferences; import static org.springframework.tooling.ls.eclipse.commons.preferences.LanguageServerConsolePreferenceConstants.ALL_SERVERS; -import org.eclipse.debug.internal.ui.SWTFactory; import org.eclipse.jface.preference.BooleanFieldEditor; import org.eclipse.jface.preference.FieldEditorPreferencePage; import org.eclipse.jface.preference.IPreferenceStore; @@ -22,8 +21,7 @@ import org.eclipse.ui.IWorkbenchPreferencePage; import org.springframework.tooling.ls.eclipse.commons.LanguageServerCommonsActivator; import org.springframework.tooling.ls.eclipse.commons.preferences.LanguageServerConsolePreferenceConstants.ServerInfo; -@SuppressWarnings("restriction") -public class LanguageServerConsolesPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { +public class LanguageServerPreferencesPage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage { static IPreferenceStore getPrefsStoreFromPlugin() { return LanguageServerCommonsActivator.getInstance().getPreferenceStore(); @@ -42,12 +40,5 @@ public class LanguageServerConsolesPreferencesPage extends FieldEditorPreference for (ServerInfo s : ALL_SERVERS) { addField(new BooleanFieldEditor(s.preferenceKey, s.label, parent)); } - - SWTFactory.createHorizontalSpacer(parent, 2); - - SWTFactory.createLabel(parent, "Settings for Spring Languare Server extensions:", 2); - - addField(new BooleanFieldEditor(PreferenceConstants.HIGHLIGHT_CODELENS_PREFS, "Highlights CodeLens (Experimental)", parent)); - } } diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/PrefsInitializer.java b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/PrefsInitializer.java index e973c5a69..24e4f70f6 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/PrefsInitializer.java +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/src/org/springframework/tooling/ls/eclipse/commons/preferences/PrefsInitializer.java @@ -20,7 +20,7 @@ import org.springframework.tooling.ls.eclipse.commons.preferences.LanguageServer public class PrefsInitializer extends AbstractPreferenceInitializer { @Override public void initializeDefaultPreferences() { - IPreferenceStore store = LanguageServerConsolesPreferencesPage.getPrefsStoreFromPlugin(); + IPreferenceStore store = LanguageServerPreferencesPage.getPrefsStoreFromPlugin(); for (ServerInfo s : ALL_SERVERS) { store.setDefault(s.preferenceKey, ENABLE_BY_DEFAULT); } From 15a0cb5db883fd5f72bcff44aaa12190f17b0ee1 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Fri, 7 Sep 2018 00:39:08 -0400 Subject: [PATCH 2/7] PT #160125656: Adjust names for property pages --- .../org.springframework.tooling.boot.ls/plugin.xml | 2 +- .../org.springframework.tooling.ls.eclipse.commons/plugin.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml index 0534855a6..a87dd7c5d 100644 --- a/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml +++ b/eclipse-language-servers/org.springframework.tooling.boot.ls/plugin.xml @@ -89,7 +89,7 @@ category="org.springframework.tooling.ls.eclipse.commons.console.preferences" class="org.springframework.tooling.boot.ls.BootLanguageServerPreferencesPage" id="org.springframework.tooling.boot.java.ls.preferences" - name="Boot Language Server Extension"> + name="Spring Boot Language Server"> diff --git a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml index 3d2a114bf..72ee50fe5 100644 --- a/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml +++ b/eclipse-language-servers/org.springframework.tooling.ls.eclipse.commons/plugin.xml @@ -31,7 +31,7 @@ category="org.eclipse.lsp4e.preferences" class="org.springframework.tooling.ls.eclipse.commons.preferences.LanguageServerPreferencesPage" id="org.springframework.tooling.ls.eclipse.commons.console.preferences" - name="STS Language Servers"> + name="Spring Language Servers"> Date: Fri, 7 Sep 2018 09:17:02 +0200 Subject: [PATCH 3/7] updated orbit repo for eclipse 2018-09 --- eclipse-distribution/pom.xml | 2 +- eclipse-language-servers/pom.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/eclipse-distribution/pom.xml b/eclipse-distribution/pom.xml index 71ad40bc0..39f528630 100644 --- a/eclipse-distribution/pom.xml +++ b/eclipse-distribution/pom.xml @@ -319,7 +319,7 @@ orbit p2 - http://download.eclipse.org/tools/orbit/downloads/drops/S20180710163057/repository + http://download.eclipse.org/tools/orbit/downloads/drops/R20180905201904/repository latest-m2e diff --git a/eclipse-language-servers/pom.xml b/eclipse-language-servers/pom.xml index 9ddc42f75..2915d2e5f 100644 --- a/eclipse-language-servers/pom.xml +++ b/eclipse-language-servers/pom.xml @@ -237,7 +237,7 @@ orbit p2 - http://download.eclipse.org/tools/orbit/downloads/drops/S20180710163057/repository + http://download.eclipse.org/tools/orbit/downloads/drops/R20180905201904/repository e-i-commons From 2a39071b50713687c370f89216e5eb64ef4a30fa Mon Sep 17 00:00:00 2001 From: Martin Lippert Date: Fri, 7 Sep 2018 10:01:44 +0200 Subject: [PATCH 4/7] ignore exceptions during parsing due to compilation or type resolve problems --- .../annotations/AnnotationHierarchies.java | 28 +++++++++++-------- .../AnnotationHierarchyAwareLookup.java | 2 -- 2 files changed, 16 insertions(+), 14 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchies.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchies.java index e08738be7..dec401162 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchies.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchies.java @@ -20,6 +20,7 @@ import java.util.stream.Stream; import org.eclipse.jdt.core.dom.Annotation; import org.eclipse.jdt.core.dom.IAnnotationBinding; import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.internal.compiler.problem.AbortCompilation; import org.springframework.ide.vscode.commons.util.CollectorUtil; import com.google.common.collect.ImmutableList; @@ -34,28 +35,31 @@ import com.google.common.collect.ImmutableList; */ public abstract class AnnotationHierarchies { - private AnnotationHierarchies() { - } - protected static boolean ignoreAnnotation(String fqname) { return fqname.startsWith("java."); //mostly intended to capture java.lang.annotation.* types. But really it should be //safe to ignore any type defined by the JRE since it can't possibly be inheriting from a spring annotation. }; public static Collection getDirectSuperAnnotations(ITypeBinding typeBinding) { - IAnnotationBinding[] annotations = typeBinding.getAnnotations(); - if (annotations!=null && annotations.length!=0) { - ImmutableList.Builder superAnnotations = ImmutableList.builder(); - for (IAnnotationBinding ab : annotations) { - ITypeBinding sa = ab.getAnnotationType(); - if (sa!=null) { - if (!ignoreAnnotation(sa.getQualifiedName())) { - superAnnotations.add(sa); + try { + IAnnotationBinding[] annotations = typeBinding.getAnnotations(); + if (annotations != null && annotations.length != 0) { + ImmutableList.Builder superAnnotations = ImmutableList.builder(); + for (IAnnotationBinding ab : annotations) { + ITypeBinding sa = ab.getAnnotationType(); + if (sa != null) { + if (!ignoreAnnotation(sa.getQualifiedName())) { + superAnnotations.add(sa); + } } } + return superAnnotations.build(); } - return superAnnotations.build(); } + catch (AbortCompilation e) { + // ignore this, it is most likely caused by broken source code, a broken classpath, or some optional dependencies not being on the classpath + } + return ImmutableList.of(); } diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java index 83e9843d5..3bc139a67 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/annotations/AnnotationHierarchyAwareLookup.java @@ -33,8 +33,6 @@ import com.google.common.collect.ImmutableList; */ public class AnnotationHierarchyAwareLookup { - private static final boolean DEBUG = false; - private static class Binding { T value; boolean isOverriding; From 3963855d08bd64e45bc2f3f9a1051fd34f15b8c0 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Fri, 7 Sep 2018 15:28:10 -0400 Subject: [PATCH 5/7] Do not crash on WebFlux handler functions data parsing --- .../requestmappings/Boot20DispatcherServletMapping.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) 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 132fdf3fd..c24c52c63 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 @@ -62,7 +62,14 @@ Example entry: private JSONObject getHandlerMethod() { JSONObject details = getDetails(); - return details == null ? null : details.getJSONObject("handlerMethod"); + if (details != null) { + if (details.has("handlerMethod")) { + return details.getJSONObject("handlerMethod"); + } else if (details.has("handlerFunction")) { + //TODO: handler function for the Router bean + } + } + return null; } private JSONObject getRequestMappingConditions() { From 68f54e42b539c54ddd554ca77328d6d0e052657e Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Fri, 7 Sep 2018 15:56:51 -0400 Subject: [PATCH 6/7] Do not fail if "requestMappingConditions" is not JSON object --- .../app/cli/requestmappings/Boot20DispatcherServletMapping.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 c24c52c63..a55a51c15 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 @@ -74,7 +74,7 @@ Example entry: private JSONObject getRequestMappingConditions() { JSONObject details = getDetails(); - return details == null ? null : details.getJSONObject("requestMappingConditions"); + return details == null ? null : details.optJSONObject("requestMappingConditions"); } @Override From 276eb4d84e437294c6be35e57d3a2bf4e73fbf22 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Fri, 7 Sep 2018 16:16:47 -0400 Subject: [PATCH 7/7] Add unit test for functional RM JMX data --- .../app/cli/Boot2xRequestMappingsTest.java | 53 +++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/Boot2xRequestMappingsTest.java b/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/Boot2xRequestMappingsTest.java index 450345170..5d9c4e29d 100644 --- a/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/Boot2xRequestMappingsTest.java +++ b/headless-services/commons/commons-boot-app-cli/src/test/java/org/springframework/ide/vscode/commons/boot/app/cli/Boot2xRequestMappingsTest.java @@ -12,7 +12,9 @@ package org.springframework.ide.vscode.commons.boot.app.cli; import static org.junit.Assert.assertEquals; +import java.util.Arrays; import java.util.Collection; +import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.json.JSONObject; @@ -20,6 +22,8 @@ import org.junit.Test; import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.RequestMapping; import org.springframework.ide.vscode.commons.boot.app.cli.requestmappings.RequestMappingsParser20; +import com.google.common.collect.ImmutableSet; + public class Boot2xRequestMappingsTest { @Test @@ -27,13 +31,62 @@ public class Boot2xRequestMappingsTest { String json = IOUtils.toString(Boot2xRequestMappingsTest.class.getResourceAsStream("/live-rm-beans/rms-boot2-web.json")); Collection rms = RequestMappingsParser20.parse(new JSONObject(json)); assertEquals(10, rms.size()); + + ImmutableSet expected = ImmutableSet.of( + "/error", + "/actuator", + "/actuator/health", + "/actuator/info", + "/hello", + "/qq", + "/pp" + ); + assertEquals(expected, + rms.stream() + .flatMap(rm -> Arrays.stream(rm.getSplitPath())) + .collect(Collectors.toSet()) + ); + } @Test public void testWebFluxAnnotationRms() throws Exception { String json = IOUtils.toString(Boot2xRequestMappingsTest.class.getResourceAsStream("/live-rm-beans/rms-boot2-webflux.json")); Collection rms = RequestMappingsParser20.parse(new JSONObject(json)); + assertEquals(7, rms.size()); + + ImmutableSet expected = ImmutableSet.of( + "/actuator", + "/actuator/health", + "/actuator/info", + "/hello", + "/pp", + "/qq" + ); + assertEquals(expected, + rms.stream() + .flatMap(rm -> Arrays.stream(rm.getSplitPath())) + .collect(Collectors.toSet()) + ); } + @Test + public void testWebFluxAnnotationRmsFunctional() throws Exception { + String json = IOUtils.toString(Boot2xRequestMappingsTest.class.getResourceAsStream("/live-rm-beans/rms-boot2-webflux-functional.json")); + Collection rms = RequestMappingsParser20.parse(new JSONObject(json)); + + assertEquals(6, rms.size()); + + ImmutableSet expected = ImmutableSet.of( + "/actuator", + "/actuator/health", + "/actuator/info" + ); + assertEquals(expected, + rms.stream() + .flatMap(rm -> Arrays.stream(rm.getSplitPath())) + .collect(Collectors.toSet()) + ); + } }