From 47461c772ccf6855e427506a46a64477647afe82 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Wed, 30 Nov 2016 16:47:17 -0500 Subject: [PATCH] Logger name content asisst --- .../metadata/ClassReferenceProvider.java | 10 ++++- .../metadata/LoggerNameProvider.java | 41 +++++++++++++++++++ .../metadata/ValueProviderRegistry.java | 2 +- .../vscode/commons/jandex/JandexIndex.java | 32 +++++++++++++++ .../ide/vscode/commons/java/IJavaProject.java | 2 + .../commons/maven/java/MavenJavaProject.java | 5 +++ .../maven/java/MavenProjectClasspath.java | 4 ++ .../JavaProjectWithClasspathFile.java | 5 +++ .../vscode/commons/maven/JavaIndexTest.java | 10 +++++ .../yaml/ApplicationYamlEditorTest.java | 2 +- 10 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/LoggerNameProvider.java diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ClassReferenceProvider.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ClassReferenceProvider.java index e50f95a46..a8173959a 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ClassReferenceProvider.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ClassReferenceProvider.java @@ -20,6 +20,14 @@ import com.google.common.cache.CacheBuilder; import reactor.core.publisher.Flux; +/** + * Provides the algorithm for 'class-reference' valueProvider. + *

+ * See: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-docs/src/main/asciidoc/appendix-configuration-metadata.adoc + * + * @author Kris De Volder + * @author Alex Boyko + */ public class ClassReferenceProvider extends CachingValueProvider { /** @@ -44,7 +52,7 @@ public class ClassReferenceProvider extends CachingValueProvider { } ); - public static Function applyOn(long duration, TimeUnit unit, Function func) { + private static Function applyOn(long duration, TimeUnit unit, Function func) { Cache cache = CacheBuilder.newBuilder().expireAfterAccess(duration, unit).expireAfterWrite(duration, unit).build(); return (k) -> { try { diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/LoggerNameProvider.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/LoggerNameProvider.java new file mode 100644 index 000000000..dc58e1dc9 --- /dev/null +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/LoggerNameProvider.java @@ -0,0 +1,41 @@ +package org.springframework.ide.vscode.application.properties.metadata; + +import java.util.Map; +import java.util.function.Function; + +import org.springframework.ide.vscode.application.properties.metadata.ValueProviderRegistry.ValueProviderStrategy; +import org.springframework.ide.vscode.application.properties.metadata.hints.StsValueHint; +import org.springframework.ide.vscode.commons.java.IJavaProject; + +import reactor.core.publisher.Flux; +import reactor.util.function.Tuples; + +/** + * Provides the algorithm for 'logger-name' valueProvider. + *

+ * See: https://github.com/spring-projects/spring-boot/blob/master/spring-boot-docs/src/main/asciidoc/appendix-configuration-metadata.adoc + * + * @author Kris De Volder + * @author Alex Boyko + */ +public class LoggerNameProvider extends CachingValueProvider { + + private static final ValueProviderStrategy INSTANCE = new LoggerNameProvider(); + public static final Function, ValueProviderStrategy> FACTORY = (params) -> INSTANCE; + + @Override + protected Flux getValuesAsync(IJavaProject javaProject, String query) { + return Flux.concat( + javaProject + .fuzzySearchPackages(query) + .map(t -> Tuples.of(StsValueHint.create(t.getT1()), t.getT2())), + javaProject + .fuzzySearchTypes(query, null) + .map(t -> Tuples.of(StsValueHint.create(t.getT1()), t.getT2())) + ) + .collectSortedList((o1, o2) -> o2.getT2().compareTo(o1.getT2())) + .flatMap(l -> Flux.fromIterable(l)) + .map(t -> t.getT1()); + } + +} diff --git a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ValueProviderRegistry.java b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ValueProviderRegistry.java index a7b488d10..cd4e7cf18 100644 --- a/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ValueProviderRegistry.java +++ b/vscode-extensions/commons/application-properties-metadata/src/main/java/org/springframework/ide/vscode/application/properties/metadata/ValueProviderRegistry.java @@ -48,7 +48,7 @@ public class ValueProviderRegistry { } protected void initializeDefaults(ValueProviderRegistry r) { -// def("logger-name", LoggerNameProvider.FACTORY); + def("logger-name", LoggerNameProvider.FACTORY); def("class-reference", ClassReferenceProvider.FACTORY); } diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java index bb834d1f8..1cd029b7b 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/jandex/JandexIndex.java @@ -84,6 +84,8 @@ public class JandexIndex { private Map>>> knownTypes; + private Map>> knownPackages; + private Cache javadocProvidersCache = CacheBuilder.newBuilder().build(); private JandexIndex[] baseIndex; @@ -100,10 +102,12 @@ public class JandexIndex { this.baseIndex = baseIndex; this.index = new ConcurrentHashMap<>(); this.knownTypes = new HashMap<>(); + this.knownPackages = new HashMap<>(); this.javadocProviderFactory = javadocProviderFactory; classpathEntries.forEach(file -> { index.put(file, Suppliers.memoize(() -> createIndex(file, indexFileFinder))); knownTypes.put(file, Suppliers.memoize(() -> getKnownTypesStream(file).collect(Collectors.toList()))); + knownPackages.put(file, Suppliers.memoize(() -> getKnownPackages(file).collect(Collectors.toList()))); }); } @@ -225,6 +229,21 @@ public class JandexIndex { return Stream.empty(); } + private Stream getKnownPackages(File file) { + Optional indexView = index.get(file).get(); + if (indexView.isPresent()) { + return indexView.get() + .getKnownClasses() + .parallelStream() + .map(info -> { + String name = info.name().toString(); + return name.substring(0, name.lastIndexOf('.')); + }) + .distinct(); + } + return Stream.empty(); + } + public Flux> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter) { Flux> flux = Flux.fromIterable(knownTypes.values()) .publishOn(Schedulers.parallel()) @@ -239,6 +258,19 @@ public class JandexIndex { } } + public Flux> fuzzySearchPackages(String searchTerm) { + Flux> flux = Flux.fromIterable(knownPackages.values()) + .publishOn(Schedulers.parallel()) + .flatMap(s -> Flux.fromIterable(s.get())) + .map(pkg -> Tuples.of(pkg, FuzzyMatcher.matchScore(searchTerm, pkg))) + .filter(t -> t.getT2() != 0.0); + if (baseIndex == null) { + return flux; + } else { + return Flux.merge(flux, Flux.fromArray(baseIndex).flatMap(index -> index.fuzzySearchPackages(searchTerm))); + } + } + public Flux allSubtypesOf(IType type) { DotName name = DotName.createSimple(type.getFullyQualifiedName()); Flux flux = Flux.fromIterable(index.keySet()) diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java index c76860c49..58c34636f 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/IJavaProject.java @@ -14,6 +14,8 @@ public interface IJavaProject extends IJavaElement { Flux> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter); + Flux> fuzzySearchPackages(String searchTerm); + Flux allSubtypesOf(IType type); IClasspath getClasspath(); diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java index 9205747a6..ba190dcca 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java @@ -66,6 +66,11 @@ public class MavenJavaProject implements IJavaProject { return classpath.fuzzySearchType(searchTerm, typeFilter); } + @Override + public Flux> fuzzySearchPackages(String searchTerm) { + return classpath.fuzzySearchPackages(searchTerm); + } + @Override public Flux allSubtypesOf(IType type) { return classpath.allSubtypesOf(type); diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java index 2fd892e56..31bf7bf79 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenProjectClasspath.java @@ -104,6 +104,10 @@ public class MavenProjectClasspath implements IClasspath { return javaIndex.get().fuzzySearchTypes(searchTerm, typeFilter); } + public Flux> fuzzySearchPackages(String searchTerm) { + return javaIndex.get().fuzzySearchPackages(searchTerm); + } + public Flux allSubtypesOf(IType type) { return javaIndex.get().allSubtypesOf(type); } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/JavaProjectWithClasspathFile.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/JavaProjectWithClasspathFile.java index 499fa8df2..50f54e681 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/JavaProjectWithClasspathFile.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/classpathfile/JavaProjectWithClasspathFile.java @@ -63,6 +63,11 @@ public class JavaProjectWithClasspathFile implements IJavaProject { return Flux.empty(); } + @Override + public Flux> fuzzySearchPackages(String searchTerm) { + return Flux.empty(); + } + @Override public Flux allSubtypesOf(IType type) { return Flux.empty(); diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java index 6b1fbc74f..70d909196 100644 --- a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/JavaIndexTest.java @@ -87,6 +87,16 @@ public class JavaIndexTest { assertEquals("java.util.EnumMap$KeySet", results.get(0).getT1().getFullyQualifiedName()); } + @Test + public void fuzzySearchPackage() throws Exception { + List> results = MavenCore.getInstance().getJavaIndexForJreLibs() + .fuzzySearchPackages("util") + .collectSortedList((o1, o2) -> o2.getT2().compareTo(o1.getT2())) + .block(); + assertTrue(results.size() > 10); + assertEquals("java.util", results.get(0).getT1()); + } + @Test public void findClassInJar() throws Exception { MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); diff --git a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java index aecb348e1..208a1770b 100644 --- a/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java +++ b/vscode-extensions/vscode-application-yaml/src/test/java/org/springframework/ide/vscode/application/yaml/ApplicationYamlEditorTest.java @@ -3056,7 +3056,7 @@ public class ApplicationYamlEditorTest extends AbstractPropsEditorTest { ); } - @Ignore @Test public void testLoggerNameCompletion() throws Exception { + @Test public void testLoggerNameCompletion() throws Exception { CachingValueProvider.TIMEOUT = Duration.ofSeconds(20); // the provider can't be reliably tested if its not allowed to // fetch all its values (even though in 'production' you // wouldn't want it to block the UI thread for this long.