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 1cd029b7b..4b681733e 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 @@ -13,6 +13,7 @@ import java.util.Map; import java.util.Optional; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ExecutionException; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -27,7 +28,6 @@ import org.springframework.ide.vscode.commons.java.IField; import org.springframework.ide.vscode.commons.java.IJavadocProvider; import org.springframework.ide.vscode.commons.java.IMethod; import org.springframework.ide.vscode.commons.java.IType; -import org.springframework.ide.vscode.commons.java.IJavaProject.TypeFilter; import org.springframework.ide.vscode.commons.javadoc.IJavadoc; import org.springframework.ide.vscode.commons.util.FuzzyMatcher; import org.springframework.ide.vscode.commons.util.Log; @@ -244,11 +244,11 @@ public class JandexIndex { return Stream.empty(); } - public Flux> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter) { + public Flux> fuzzySearchTypes(String searchTerm, Predicate typeFilter) { Flux> flux = Flux.fromIterable(knownTypes.values()) .publishOn(Schedulers.parallel()) .flatMap(s -> Flux.fromIterable(s.get())) - .filter(t -> typeFilter == null || typeFilter.accept(t.getT2())) + .filter(t -> typeFilter == null || typeFilter.test(t.getT2())) .map(t -> Tuples.of(t.getT2(), FuzzyMatcher.matchScore(searchTerm, t.getT1()))) .filter(t -> t.getT2() != 0.0); if (baseIndex == null) { 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 f0f919619..5c9b4dd8b 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 @@ -1,22 +1,15 @@ package org.springframework.ide.vscode.commons.java; +import java.util.function.Predicate; + import reactor.core.publisher.Flux; import reactor.util.function.Tuple2; public interface IJavaProject extends IJavaElement { - - /** - * TypeFilter is deprecated. Should use java.util.funcion.Predicate instead. - */ - @Deprecated - @FunctionalInterface - public static interface TypeFilter { - boolean accept(IType type); - } IType findType(String fqName); - Flux> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter); + Flux> fuzzySearchTypes(String searchTerm, Predicate typeFilter); Flux> fuzzySearchPackages(String searchTerm); diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBridge.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBridge.java index f89876d7c..9f7f13ffd 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBridge.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBridge.java @@ -349,12 +349,13 @@ class MavenBridge { } } - public MavenProject readProject(final File pomFile, MavenExecutionRequest request) throws MavenException { + public MavenProject readProject(final File pomFile, MavenExecutionRequest request, boolean resolveDependencies) throws MavenException { try { lookup(MavenExecutionRequestPopulator.class).populateDefaults(request); ProjectBuildingRequest configuration = request.getProjectBuildingRequest(); configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL); configuration.setRepositorySession(createRepositorySession(request)); + configuration.setResolveDependencies(resolveDependencies); return lookup(ProjectBuilder.class).build(pomFile, configuration).getProject(); } catch (ProjectBuildingException ex) { throw new MavenException(ex); @@ -362,6 +363,26 @@ class MavenBridge { throw new MavenException(ex); } } + + public MavenExecutionResult compileAndGenerateJavadoc(File pom) throws MavenException { + try { + MavenExecutionRequest request = createExecutionRequest(); + lookup(MavenExecutionRequestPopulator.class).populateDefaults(request); + request.setPom(pom); + ProjectBuildingRequest configuration = request.getProjectBuildingRequest(); + configuration.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL); + configuration.setRepositorySession(createRepositorySession(request)); + configuration.setResolveDependencies(true); + configuration.setResolveVersionRanges(true); + request.setGoals(Arrays.asList(new String[] { "compile", "javadoc:javadoc" })); + Properties userProperties = (Properties) request.getUserProperties().clone(); + userProperties.put("show", "private"); + request.setUserProperties(userProperties); + return lookup(Maven.class).execute(request); + } catch (MavenExecutionRequestPopulationException e) { + throw new MavenException(e); + } + } public MavenExecutionResult readMavenProject(File pomFile, ProjectBuildingRequest configuration) throws MavenException { @@ -675,8 +696,7 @@ class MavenBridge { private synchronized PlexusContainer getPlexusContainer0() throws PlexusContainerException { if (plexus == null) { plexus = newPlexusContainer(); - // plexus.setLoggerManager(new - // EclipseLoggerManager(mavenConfiguration)); +// plexus.setLoggerManager(new LoggerManager(mavenConfiguration)); } return plexus; } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBuilder.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBuilder.java index 675d6e41d..bced75bb5 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBuilder.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenBuilder.java @@ -53,6 +53,7 @@ public class MavenBuilder { public MavenBuilder javadoc() { properties.add("javadoc:javadoc"); + properties.add("-Dshow=private"); return this; } diff --git a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java index 2b7e290c1..18d5b06b1 100644 --- a/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java +++ b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/MavenCore.java @@ -35,6 +35,7 @@ import org.apache.maven.RepositoryUtils; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.repository.ArtifactRepository; import org.apache.maven.execution.MavenExecutionRequest; +import org.apache.maven.execution.MavenExecutionResult; import org.apache.maven.model.DependencyManagement; import org.apache.maven.project.MavenProject; import org.eclipse.aether.DefaultRepositorySystemSession; @@ -138,10 +139,14 @@ public class MavenCore { * @return Maven project instance * @throws MavenException */ - public MavenProject readProject(File pom) throws MavenException { - return maven.readProject(pom, maven.createExecutionRequest()); + public MavenProject readProject(File pom, boolean resolveDependencies) throws MavenException { + return maven.readProject(pom, maven.createExecutionRequest(), resolveDependencies); } + public MavenExecutionResult build(File pom) throws MavenException { + return maven.compileAndGenerateJavadoc(pom); + } + /** * Taken from M2E same named method from MavenModelManager * 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 e372788da..6f496f4f8 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 @@ -13,8 +13,8 @@ package org.springframework.ide.vscode.commons.maven.java; import java.io.File; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.function.Predicate; -import org.apache.maven.project.MavenProject; import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.java.IType; import org.springframework.ide.vscode.commons.javadoc.IJavadoc; @@ -31,19 +31,17 @@ import reactor.util.function.Tuple2; */ public class MavenJavaProject implements IJavaProject { - private MavenProject mavenProject; private MavenProjectClasspath classpath; private MavenCore maven; - public MavenJavaProject(File pom) throws Exception { + public MavenJavaProject(File pom) { this.maven = MavenCore.getDefault(); - this.mavenProject = maven.readProject(pom); - this.classpath = new MavenProjectClasspath(mavenProject, maven); + this.classpath = new MavenProjectClasspath(pom, maven); } @Override public String getElementName() { - return mavenProject.getName(); + return classpath.getName(); } @Override @@ -53,7 +51,7 @@ public class MavenJavaProject implements IJavaProject { @Override public boolean exists() { - return mavenProject != null; + return classpath.exists(); } @Override @@ -62,7 +60,7 @@ public class MavenJavaProject implements IJavaProject { } @Override - public Flux> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter) { + public Flux> fuzzySearchTypes(String searchTerm, Predicate typeFilter) { return classpath.fuzzySearchType(searchTerm, typeFilter); } @@ -82,7 +80,7 @@ public class MavenJavaProject implements IJavaProject { } public Path getOutputFolder() { - return Paths.get(new File(mavenProject.getBuild().getOutputDirectory()).toURI()); + return Paths.get(new File(classpath.getOutputFolder()).toURI()); } } 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 54bbffc42..0147bbde2 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 @@ -15,7 +15,11 @@ import java.net.MalformedURLException; import java.net.URL; import java.nio.file.Path; import java.util.Arrays; +import java.util.Collections; +import java.util.List; import java.util.Optional; +import java.util.Set; +import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -26,7 +30,6 @@ import org.springframework.ide.vscode.commons.jandex.JandexIndex; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavadocProvider; import org.springframework.ide.vscode.commons.java.IType; -import org.springframework.ide.vscode.commons.java.IJavaProject.TypeFilter; import org.springframework.ide.vscode.commons.java.parser.ParserJavadocProvider; import org.springframework.ide.vscode.commons.javadoc.HtmlJavadocProvider; import org.springframework.ide.vscode.commons.javadoc.SourceUrlProviderFromSourceContainer; @@ -57,16 +60,18 @@ public class MavenProjectClasspath implements IClasspath { } private MavenCore maven; - private MavenProject project; + private File pom; + private Supplier projectSupplier; private Supplier javaIndex; - public MavenProjectClasspath(MavenProject project) { - this(project, MavenCore.getDefault()); + public MavenProjectClasspath(File pom) { + this(pom, MavenCore.getDefault()); } - MavenProjectClasspath(MavenProject project, MavenCore maven) { + MavenProjectClasspath(File pom, MavenCore maven) { this.maven = maven; - this.project = project; + this.pom = pom; + this.projectSupplier = Suppliers.memoize(() -> createMavenProject()); this.javaIndex = Suppliers.memoize(() -> { Stream classpathEntries = Stream.empty(); try { @@ -86,20 +91,64 @@ public class MavenProjectClasspath implements IClasspath { }, maven.getJavaIndexForJreLibs()); }); } + + private final MavenProject createMavenProject() { + try { + // Read with resolved dependencies + return maven.readProject(pom, true); + } catch (MavenException e) { + Log.log(e); + try { + // Try without resolving dependencies - just read the XML + return maven.readProject(pom, false); + } catch (MavenException e1) { + Log.log(e); + return null; + } + } + } + + public boolean exists() { + return pom.exists(); + } + + public String getName() { + MavenProject project = projectSupplier.get(); + return project == null ? null : project.getName(); + } @Override public Stream getClasspathEntries() throws Exception { - return Stream.concat(maven.resolveDependencies(project, null).stream().map(artifact -> { - return artifact.getFile().toPath(); - }), Stream.of(new File(project.getBuild().getOutputDirectory()).toPath(), - new File(project.getBuild().getTestOutputDirectory()).toPath())); +// return Stream.concat(maven.resolveDependencies(project, null).stream().map(artifact -> { +// return artifact.getFile().toPath(); +// }), projectResolvedOutput()); + return Stream.concat(projectDependencies().stream().map(a -> a.getFile().toPath()), projectOutput().stream().map(f -> f.toPath())); + } + + private Set projectDependencies() { + MavenProject project = projectSupplier.get(); + return project == null ? Collections.emptySet() : project.getArtifacts(); + } + + private List projectOutput() { + MavenProject project = projectSupplier.get(); + if (project == null) { + return Collections.emptyList(); + } else { + return Arrays.asList(new File(project.getBuild().getOutputDirectory()), new File(project.getBuild().getTestOutputDirectory())); + } + } + + public String getOutputFolder() { + MavenProject project = projectSupplier.get(); + return project == null ? null : project.getBuild().getOutputDirectory(); } public IType findType(String fqName) { return javaIndex.get().findType(fqName); } - public Flux> fuzzySearchType(String searchTerm, TypeFilter typeFilter) { + public Flux> fuzzySearchType(String searchTerm, Predicate typeFilter) { return javaIndex.get().fuzzySearchTypes(searchTerm, typeFilter); } @@ -116,12 +165,17 @@ public class MavenProjectClasspath implements IClasspath { } private Optional getArtifactFromJarFile(File file) throws MavenException { - return maven.resolveDependencies(project, null).stream().filter(a -> file.equals(a.getFile())).findFirst(); + MavenProject project = projectSupplier.get(); + return project.getArtifacts().stream().filter(a -> file.equals(a.getFile())).findFirst(); } @Override public Stream getClasspathResources() { - return project.getBuild().getResources().stream().flatMap(resource -> { + MavenProject project = projectSupplier.get(); + if (project == null) { + return Stream.empty(); + } + return project.getBuild().getResources().stream().flatMap(resource -> { DirectoryScanner scanner = new DirectoryScanner(); scanner.setBasedir(resource.getDirectory()); if (resource.getIncludes() != null && !resource.getIncludes().isEmpty()) { @@ -173,6 +227,10 @@ public class MavenProjectClasspath implements IClasspath { // } private IJavadocProvider createParserJavadocProvider(File classpathResource) { + MavenProject project = projectSupplier.get(); + if (project == null) { + return null; + } if (classpathResource.isDirectory()) { if (classpathResource.toString().startsWith(project.getBuild().getOutputDirectory())) { return new ParserJavadocProvider(type -> { @@ -206,6 +264,10 @@ public class MavenProjectClasspath implements IClasspath { } private IJavadocProvider createHtmlJavdocProvider(File classpathResource) { + MavenProject project = projectSupplier.get(); + if (project == null) { + return null; + } if (classpathResource.isDirectory()) { if (classpathResource.toString().startsWith(project.getBuild().getOutputDirectory())) { return new HtmlJavadocProvider(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 50f54e681..90725959d 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 @@ -12,6 +12,7 @@ package org.springframework.ide.vscode.commons.maven.java.classpathfile; import java.io.File; import java.nio.file.Paths; +import java.util.function.Predicate; import org.springframework.ide.vscode.commons.java.IClasspath; import org.springframework.ide.vscode.commons.java.IJavaProject; @@ -59,7 +60,7 @@ public class JavaProjectWithClasspathFile implements IJavaProject { } @Override - public Flux> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter) { + public Flux> fuzzySearchTypes(String searchTerm, Predicate typeFilter) { return Flux.empty(); } diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java index cf14a4b0b..6fc05c7c9 100644 --- a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/DependencyTreeTest.java @@ -42,7 +42,7 @@ public class DependencyTreeTest { Path testProjectPath = Paths.get(DependencyTreeTest.class.getResource("/" + projectName).toURI()); MavenBuilder.newBuilder(testProjectPath).clean().pack().skipTests().execute(); - MavenProject project = MavenCore.getDefault().readProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); + MavenProject project = MavenCore.getDefault().readProject(testProjectPath.resolve(MavenCore.POM_XML).toFile(), false); Set calculatedClassPath = MavenCore.getDefault().resolveDependencies(project, null).stream().map(artifact -> { return Paths.get(artifact.getFile().toURI()); }).collect(Collectors.toSet()); @@ -76,9 +76,43 @@ public class DependencyTreeTest { assertFalse(localRepoFolder.exists()); Path testProjectPath = Paths.get(getClass().getResource("/gs-rest-service-cors-boot-1.4.1-with-classpath-file").toURI()); - MavenProject project = maven.readProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); + MavenProject project = maven.readProject(testProjectPath.resolve(MavenCore.POM_XML).toFile(), false); Set calculatedClassPath = maven.resolveDependencies(project, null); + assertEquals(49, calculatedClassPath.size()); + + String parentFolderPathStr = localRepoFolder.toString(); + for (Artifact artifact : calculatedClassPath) { + assertTrue(artifact.isResolved()); + File file = artifact.getFile(); + assertNotNull(file); + assertTrue(file.toString().startsWith(parentFolderPathStr)); + assertTrue(file.exists()); + } + + deleteFolderAndContents(localRepoFolder.toPath()); + assertFalse(localRepoFolder.exists()); + } + + @Test + public void dowloadDependenciesWithProjectBuildingTest() throws Exception { + String userSettingsFile = Paths.get(getClass().getResource("/maven-config/settings.xml").toURI()).toFile().toString(); + DefaultMavenConfiguration mavenConfig = new DefaultMavenConfiguration(); + mavenConfig.setUserSettingsFile(userSettingsFile); + + MavenCore maven = new MavenCore(mavenConfig); + File localRepoFolder = maven.localRepositoryFolder(); + if (localRepoFolder.exists()) { + deleteFolderAndContents(localRepoFolder.toPath()); + } + + assertFalse(localRepoFolder.exists()); + + Path testProjectPath = Paths.get(getClass().getResource("/gs-rest-service-cors-boot-1.4.1-with-classpath-file").toURI()); + MavenProject project = maven.readProject(testProjectPath.resolve(MavenCore.POM_XML).toFile(), true); + + Set calculatedClassPath = project.getArtifacts(); + assertEquals(49, calculatedClassPath.size()); String parentFolderPathStr = localRepoFolder.toString(); for (Artifact artifact : calculatedClassPath) { diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/HtmlJavadocTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/HtmlJavadocTest.java new file mode 100644 index 000000000..d08b0f823 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/HtmlJavadocTest.java @@ -0,0 +1,317 @@ +package org.springframework.ide.vscode.commons.maven; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import org.junit.Assume; +import org.junit.Test; +import org.springframework.ide.vscode.commons.java.IField; +import org.springframework.ide.vscode.commons.java.IMethod; +import org.springframework.ide.vscode.commons.java.IType; +import org.springframework.ide.vscode.commons.javadoc.IJavadoc; +import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject; +import org.springframework.ide.vscode.commons.maven.java.MavenProjectClasspath; +import org.springframework.ide.vscode.commons.maven.java.MavenProjectClasspath.JavadocProviderTypes; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; + +public class HtmlJavadocTest { + + private static Supplier projectSupplier = Suppliers.memoize(() -> { + Path testProjectPath; + try { + MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; + testProjectPath = Paths.get(HtmlJavadocTest.class.getResource("/gs-rest-service-cors-boot-1.4.1-with-classpath-file").toURI()); + MavenBuilder.newBuilder(testProjectPath).clean().pack().javadoc().skipTests().execute(); + return new MavenJavaProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); + } catch (Exception e) { + return null; + } + }); + + @Test + public void html_testClassJavadoc() throws Exception { + Assume.assumeTrue(javaVersionHigherThan(6)); + + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("java.util.Map"); + assertNotNull(type); + String expected = String.join("\n", + "
An object that maps keys to values. A map cannot contain duplicate keys;", + " each key can map to at most one value." + ); + IJavadoc javaDoc = type.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml().substring(0, expected.length())); + } + + @Test + public void html_testConstructorJavadoc() throws Exception { + Assume.assumeTrue(javaVersionHigherThan(6)); + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("java.util.ArrayList"); + assertNotNull(type); + IMethod method = type.getMethod("", Stream.empty()); + assertNotNull(method); + + String expected = String.join("\n", + "

ArrayList

" + ); + IJavadoc javaDoc = method.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml().substring(0, expected.length())); + + } + + @Test + public void html_testEmptyJavadocClass() throws Exception { + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("hello.Application"); + assertNotNull(type); + assertNull(type.getJavaDoc()); + } + + @Test + public void html_testFieldAndMethodJavadocForJar() throws Exception { + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("org.springframework.boot.SpringApplication"); + assertNotNull(type); + + IField field = type.getField("BANNER_LOCATION_PROPERTY_VALUE"); + assertNotNull(field); + String expected = String.join("\n", + "

BANNER_LOCATION_PROPERTY_VALUE

", + "
public static final String BANNER_LOCATION_PROPERTY_VALUE
", + "
Default banner location.
", + "
", + "
See Also:
", + "
Constant Field Values
", + "
" + ); + IJavadoc javaDoc = field.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + + IMethod method = type.getMethod("getListeners", Stream.empty()); + assertNotNull(method); + expected = String.join("\n", + "

getListeners

", + "
public Set<org.springframework.context.ApplicationListener<?>> getListeners()
", + "
Returns read-only ordered Set of the ApplicationListeners that will be", + " applied to the SpringApplication and registered with the ApplicationContext", + " .
", + "
", + "
Returns:
", + "
the listeners
", + "
" + ); + javaDoc = method.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + } + + @Test + public void html_testInnerClassJavadocForOutputFolder() throws Exception { + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("hello.Greeting$TestInnerClass"); + assertNotNull(type); + IJavadoc javaDoc = type.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals("
Comment for inner class
", javaDoc.getRenderable().toHtml()); + + IField field = type.getField("innerField"); + assertNotNull(field); + String expected = String.join("\n", + "

innerField

", + "
protected int innerField
", + "
Comment for inner field
" + ); + javaDoc = field.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + + IMethod method = type.getMethod("getInnerField", Stream.empty()); + assertNotNull(method); + expected = String.join("\n", + "

getInnerField

", + "
public int getInnerField()
", + "
Comment for method inside nested class
" + ); + javaDoc = method.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + } + + @Test + public void html_testInnerClassLevel2_JavadocForOutputFolder() throws Exception { + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("hello.Greeting$TestInnerClass$TestInnerClassLevel2"); + assertNotNull(type); + IJavadoc javaDoc = type.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals("
Comment for level 2 nested class
", javaDoc.getRenderable().toHtml()); + + IField field = type.getField("innerLevel2Field"); + assertNotNull(field); + String expected = String.join("\n", + "

innerLevel2Field

", + "
protected int innerLevel2Field
", + "
Comment for level 2 inner field
" + ); + javaDoc = field.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + + IMethod method = type.getMethod("getInnerLevel2Field", Stream.empty()); + assertNotNull(method); + expected = String.join("\n", + "

getInnerLevel2Field

", + "
public int getInnerLevel2Field()
", + "
Comment for method inside level 2 nested class
" + ); + javaDoc = method.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + } + + @Test + public void html_testJavadocOutputFolder() throws Exception { + MavenJavaProject project = projectSupplier.get(); + IType type = project.findType("hello.Greeting"); + + assertNotNull(type); + String expected = "
Comment for Greeting class
"; + IJavadoc javaDoc = type.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + + IField field = type.getField("id"); + assertNotNull(field); + expected = String.join("\n", + "

id

", + "
protected final long id
", + "
Comment for id field
" + ); + javaDoc = field.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + + IMethod method = type.getMethod("getId", Stream.empty()); + assertNotNull(method); + expected = String.join("\n", + "

getId

", + "
public long getId()
", + "
Comment for getId()
" + ); + javaDoc = method.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + } + + @Test + public void html_testMethodJavadoc() throws Exception { + Assume.assumeTrue(javaVersionHigherThan(6)); + + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("java.util.ArrayList"); + assertNotNull(type); + IMethod method = type.getMethod("size", Stream.empty()); + assertNotNull(method); + + String expected = String.join("\n", + "

size

", + "
public int size()
", + "
Returns the number of elements in this list.
" + ); + IJavadoc javaDoc = method.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml().substring(0, expected.length())); + } + + @Test + public void html_testNestedClassJavadoc() throws Exception { + Assume.assumeTrue(javaVersionHigherThan(6)); + + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("java.util.Map$Entry"); + assertNotNull(type); + String expected = String.join("\n", + "
A map entry (key-value pair). The Map.entrySet method returns", + " a collection-view of the map, whose elements are of this class. The"); + IJavadoc javaDoc = type.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml().substring(0, expected.length())); + } + + @Test + public void html_testNoJavadocClass() throws Exception { + MavenJavaProject project = projectSupplier.get();; + + IType type = project.findType("hello.GreetingController"); + assertNotNull(type); + assertNull(type.getJavaDoc()); + } + + @Test + public void html_testNoJavadocField() throws Exception { + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("hello.GreetingController"); + assertNotNull(type); + IField field = type.getField("template"); + assertNotNull(field); + String expected = String.join("\n", + "

template

", + "
public static final String template
", + "
", + "
See Also:
", + "
Constant Field Values
", + "
" + ); + IJavadoc javaDoc = field.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + } + + @Test + public void html_testNoJavadocMethod() throws Exception { + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("hello.Application"); + assertNotNull(type); + IMethod method = type.getMethod("corsConfigurer", Stream.empty()); + assertNotNull(method); + String expected = String.join("\n", + "

corsConfigurer

", + "
@Bean",
+				"public org.springframework.web.servlet.config.annotation.WebMvcConfigurer corsConfigurer()
" + ); + IJavadoc javaDoc = method.getJavaDoc(); + assertNotNull(javaDoc); + assertEquals(expected, javaDoc.getRenderable().toHtml()); + } + + private static boolean javaVersionHigherThan(int version) { + String versionStr = MavenCore.getDefault().getJavaRuntimeMinorVersion(); + try { + return versionStr != null && Integer.valueOf(versionStr) > version; + } catch (NumberFormatException e) { + return false; + } + } + +} 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 c7b5433ca..36689df26 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 @@ -12,18 +12,13 @@ import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; -import org.junit.Assume; import org.junit.Test; import org.springframework.ide.vscode.commons.java.Flags; -import org.springframework.ide.vscode.commons.java.IField; import org.springframework.ide.vscode.commons.java.IMethod; import org.springframework.ide.vscode.commons.java.IPrimitiveType; import org.springframework.ide.vscode.commons.java.IType; import org.springframework.ide.vscode.commons.java.IVoidType; -import org.springframework.ide.vscode.commons.javadoc.IJavadoc; import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject; -import org.springframework.ide.vscode.commons.maven.java.MavenProjectClasspath; -import org.springframework.ide.vscode.commons.maven.java.MavenProjectClasspath.JavadocProviderTypes; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -33,40 +28,17 @@ import reactor.util.function.Tuple2; public class JavaIndexTest { - private static LoadingCache projectsCache = CacheBuilder.newBuilder().build(new CacheLoader() { - - @Override - public Path load(String projectName) throws Exception { - Path testProjectPath = Paths.get(DependencyTreeTest.class.getResource("/" + projectName).toURI()); - MavenBuilder.newBuilder(testProjectPath).clean().pack().javadoc().skipTests().execute(); - return testProjectPath; - } - - }); - private static LoadingCache mavenProjectsCache = CacheBuilder.newBuilder().build(new CacheLoader() { @Override public MavenJavaProject load(String projectName) throws Exception { Path testProjectPath = Paths.get(DependencyTreeTest.class.getResource("/" + projectName).toURI()); - return createMavenProject(testProjectPath); + MavenBuilder.newBuilder(testProjectPath).clean().pack().javadoc().skipTests().execute(); + return new MavenJavaProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); } }); - private static MavenJavaProject createMavenProject(Path projectPath) throws Exception { - return new MavenJavaProject(projectPath.resolve(MavenCore.POM_XML).toFile()); - } - - private static boolean javaVersionHigherThan(int version) { - String versionStr = MavenCore.getDefault().getJavaRuntimeMinorVersion(); - try { - return versionStr != null && Integer.valueOf(versionStr) > version; - } catch (NumberFormatException e) { - return false; - } - } - @Test public void fuzzySearchNoFilter() throws Exception { List> results = MavenCore.getDefault().getJavaIndexForJreLibs() @@ -150,395 +122,4 @@ public class JavaIndexTest { assertEquals(IVoidType.DEFAULT, m.getReturnType()); assertEquals(Collections.singletonList(IPrimitiveType.INT), m.parameters().collect(Collectors.toList())); } - - @Test - public void parser_testClassJavadocForOutputFolder() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.JAVA_PARSER; - MavenJavaProject project = createMavenProject(projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file")); - IType type = project.findType("hello.Greeting"); - - assertNotNull(type); - String expected = String.join("\n", - "/**", - " * Comment for Greeting class ", - " */" - ); - assertEquals(expected, type.getJavaDoc().raw().trim()); - - IField field = type.getField("id"); - assertNotNull(field); - expected = String.join("\n", - "/**", - " * Comment for id field", - " */" - ); - assertEquals(expected, field.getJavaDoc().raw().trim()); - - IMethod method = type.getMethod("getId", Stream.empty()); - assertNotNull(method); - expected = String.join("\n", - "/**", - " * Comment for getId()", - " */" - ); - assertEquals(expected, method.getJavaDoc().raw().trim()); - } - - @Test - public void parser_testInnerClassJavadocForOutputFolder() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.JAVA_PARSER; - MavenJavaProject project = createMavenProject(projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file")); - IType type = project.findType("hello.Greeting$TestInnerClass"); - assertNotNull(type); - assertEquals("/**\n * Comment for inner class\n */", type.getJavaDoc().raw().trim()); - - IField field = type.getField("innerField"); - assertNotNull(field); - assertEquals("/**\n \t * Comment for inner field\n \t */", field.getJavaDoc().raw().trim()); - - IMethod method = type.getMethod("getInnerField", Stream.empty()); - assertNotNull(method); - assertEquals("/**\n \t * Comment for method inside nested class\n \t */", method.getJavaDoc().raw().trim()); - } - - @Test - public void parser_testClassJavadocForJar() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.JAVA_PARSER; - MavenJavaProject project = createMavenProject(projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file")); - - IType type = project.findType("org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener"); - assertNotNull(type); - String expected = String.join("\n", - "/**", - " * {@link ApplicationListener} that replaces the liquibase {@link ServiceLocator} with a" - ); - assertEquals(expected, type.getJavaDoc().raw().trim().substring(0, expected.length())); - - type = project.findType("org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener$LiquibasePresent"); - assertNotNull(type); - expected = String.join("\n", - "/**", - " * Inner class to prevent class not found issues.", - " */" - ); - assertEquals(expected, type.getJavaDoc().raw().trim()); - } - - @Test - public void parser_testFieldAndMethodJavadocForJar() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.JAVA_PARSER; - MavenJavaProject project = createMavenProject(projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file")); - - IType type = project.findType("org.springframework.boot.SpringApplication"); - assertNotNull(type); - - IField field = type.getField("BANNER_LOCATION_PROPERTY_VALUE"); - assertNotNull(field); - String expected = String.join("\n", - "/**", - " * Default banner location.", - " */" - ); - assertEquals(expected, field.getJavaDoc().raw().trim()); - - IMethod method = type.getMethod("getListeners", Stream.empty()); - assertNotNull(method); - expected = String.join("\n", - "/**", - " * Returns read-only ordered Set of the {@link ApplicationListener}s that will be" - ); - assertEquals(expected, method.getJavaDoc().raw().trim().substring(0, expected.length())); - } - - @Test - public void html_testClassJavadoc() throws Exception { - Assume.assumeTrue(javaVersionHigherThan(6)); - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - - MavenJavaProject project = createMavenProject(projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file")); - - IType type = project.findType("java.util.Map"); - assertNotNull(type); - String expected = String.join("\n", - "
An object that maps keys to values. A map cannot contain duplicate keys;", - " each key can map to at most one value." - ); - IJavadoc javaDoc = type.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml().substring(0, expected.length())); - } - - @Test - public void html_testNestedClassJavadoc() throws Exception { - Assume.assumeTrue(javaVersionHigherThan(6)); - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - - MavenJavaProject project = createMavenProject(projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file")); - - IType type = project.findType("java.util.Map$Entry"); - assertNotNull(type); - String expected = String.join("\n", - "
A map entry (key-value pair). The Map.entrySet method returns", - " a collection-view of the map, whose elements are of this class. The"); - IJavadoc javaDoc = type.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml().substring(0, expected.length())); - } - - @Test - public void html_testMethodJavadoc() throws Exception { - Assume.assumeTrue(javaVersionHigherThan(6)); - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - - MavenJavaProject project = createMavenProject(projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file")); - - IType type = project.findType("java.util.ArrayList"); - assertNotNull(type); - IMethod method = type.getMethod("size", Stream.empty()); - assertNotNull(method); - - String expected = String.join("\n", - "

size

", - "
public int size()
", - "
Returns the number of elements in this list.
" - ); - IJavadoc javaDoc = method.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml().substring(0, expected.length())); - } - - @Test - public void html_testConstructorJavadoc() throws Exception { - Assume.assumeTrue(javaVersionHigherThan(6)); - - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - - MavenJavaProject project = createMavenProject(projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file")); - - IType type = project.findType("java.util.ArrayList"); - assertNotNull(type); - IMethod method = type.getMethod("", Stream.empty()); - assertNotNull(method); - - String expected = String.join("\n", - "

ArrayList

" - ); - IJavadoc javaDoc = method.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml().substring(0, expected.length())); - - } - - @Test - public void html_testFieldAndMethodJavadocForJar() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - - MavenJavaProject project = createMavenProject(projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file")); - - IType type = project.findType("org.springframework.boot.SpringApplication"); - assertNotNull(type); - - IField field = type.getField("BANNER_LOCATION_PROPERTY_VALUE"); - assertNotNull(field); - String expected = String.join("\n", - "

BANNER_LOCATION_PROPERTY_VALUE

", - "
public static final String BANNER_LOCATION_PROPERTY_VALUE
", - "
Default banner location.
", - "
", - "
See Also:
", - "
Constant Field Values
", - "
" - ); - IJavadoc javaDoc = field.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - - IMethod method = type.getMethod("getListeners", Stream.empty()); - assertNotNull(method); - expected = String.join("\n", - "

getListeners

", - "
public Set<org.springframework.context.ApplicationListener<?>> getListeners()
", - "
Returns read-only ordered Set of the ApplicationListeners that will be", - " applied to the SpringApplication and registered with the ApplicationContext", - " .
", - "
", - "
Returns:
", - "
the listeners
", - "
" - ); - javaDoc = method.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - } - - @Test - public void html_testJavadocOutputFolder() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - MavenJavaProject project = createMavenProject(projectPath); - IType type = project.findType("hello.Greeting"); - - assertNotNull(type); - String expected = "
Comment for Greeting class
"; - IJavadoc javaDoc = type.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - - IField field = type.getField("id"); - assertNotNull(field); - expected = String.join("\n", - "

id

", - "
protected final long id
", - "
Comment for id field
" - ); - javaDoc = field.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - - IMethod method = type.getMethod("getId", Stream.empty()); - assertNotNull(method); - expected = String.join("\n", - "

getId

", - "
public long getId()
", - "
Comment for getId()
" - ); - javaDoc = method.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - } - - @Test - public void html_testInnerClassJavadocForOutputFolder() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - MavenJavaProject project = createMavenProject(projectPath); - - IType type = project.findType("hello.Greeting$TestInnerClass"); - assertNotNull(type); - IJavadoc javaDoc = type.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals("
Comment for inner class
", javaDoc.getRenderable().toHtml()); - - IField field = type.getField("innerField"); - assertNotNull(field); - String expected = String.join("\n", - "

innerField

", - "
protected int innerField
", - "
Comment for inner field
" - ); - javaDoc = field.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - - IMethod method = type.getMethod("getInnerField", Stream.empty()); - assertNotNull(method); - expected = String.join("\n", - "

getInnerField

", - "
public int getInnerField()
", - "
Comment for method inside nested class
" - ); - javaDoc = method.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - } - - @Test - public void html_testInnerClassLevel2_JavadocForOutputFolder() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - MavenJavaProject project = createMavenProject(projectPath); - - IType type = project.findType("hello.Greeting$TestInnerClass$TestInnerClassLevel2"); - assertNotNull(type); - IJavadoc javaDoc = type.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals("
Comment for level 2 nested class
", javaDoc.getRenderable().toHtml()); - - IField field = type.getField("innerLevel2Field"); - assertNotNull(field); - String expected = String.join("\n", - "

innerLevel2Field

", - "
protected int innerLevel2Field
", - "
Comment for level 2 inner field
" - ); - javaDoc = field.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - - IMethod method = type.getMethod("getInnerLevel2Field", Stream.empty()); - assertNotNull(method); - expected = String.join("\n", - "

getInnerLevel2Field

", - "
public int getInnerLevel2Field()
", - "
Comment for method inside level 2 nested class
" - ); - javaDoc = method.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - } - - @Test - public void html_testNoJavadocClass() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - MavenJavaProject project = createMavenProject(projectPath); - - IType type = project.findType("hello.GreetingController"); - assertNotNull(type); - assertNull(type.getJavaDoc()); - } - - @Test - public void html_testEmptyJavadocClass() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - MavenJavaProject project = createMavenProject(projectPath); - - IType type = project.findType("hello.Application"); - assertNotNull(type); - assertNull(type.getJavaDoc()); - } - - @Test - public void html_testNoJavadocMethod() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - MavenJavaProject project = createMavenProject(projectPath); - - IType type = project.findType("hello.Application"); - assertNotNull(type); - IMethod method = type.getMethod("corsConfigurer", Stream.empty()); - assertNotNull(method); - String expected = String.join("\n", - "

corsConfigurer

", - "
@Bean",
-				"public org.springframework.web.servlet.config.annotation.WebMvcConfigurer corsConfigurer()
" - ); - IJavadoc javaDoc = method.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - } - - @Test - public void html_testNoJavadocField() throws Exception { - MavenProjectClasspath.providerType = JavadocProviderTypes.HTML; - Path projectPath = projectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - MavenJavaProject project = createMavenProject(projectPath); - - IType type = project.findType("hello.GreetingController"); - assertNotNull(type); - IField field = type.getField("template"); - assertNotNull(field); - String expected = String.join("\n", - "

template

", - "
public static final String template
", - "
", - "
See Also:
", - "
Constant Field Values
", - "
" - ); - IJavadoc javaDoc = field.getJavaDoc(); - assertNotNull(javaDoc); - assertEquals(expected, javaDoc.getRenderable().toHtml()); - } } diff --git a/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/SourceJavadocTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/SourceJavadocTest.java new file mode 100644 index 000000000..4c17f4296 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/SourceJavadocTest.java @@ -0,0 +1,129 @@ +package org.springframework.ide.vscode.commons.maven; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.stream.Stream; + +import org.junit.Test; +import org.springframework.ide.vscode.commons.java.IField; +import org.springframework.ide.vscode.commons.java.IMethod; +import org.springframework.ide.vscode.commons.java.IType; +import org.springframework.ide.vscode.commons.maven.java.MavenJavaProject; +import org.springframework.ide.vscode.commons.maven.java.MavenProjectClasspath; +import org.springframework.ide.vscode.commons.maven.java.MavenProjectClasspath.JavadocProviderTypes; + +import com.google.common.base.Supplier; +import com.google.common.base.Suppliers; + +public class SourceJavadocTest { + + private static Supplier projectSupplier = Suppliers.memoize(() -> { + Path testProjectPath; + try { + MavenProjectClasspath.providerType = JavadocProviderTypes.JAVA_PARSER; + testProjectPath = Paths.get(SourceJavadocTest.class.getResource("/gs-rest-service-cors-boot-1.4.1-with-classpath-file").toURI()); + return new MavenJavaProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); + } catch (Exception e) { + return null; + } + }); + + @Test + public void parser_testClassJavadocForJar() throws Exception { + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener"); + assertNotNull(type); + String expected = String.join("\n", + "/**", + " * {@link ApplicationListener} that replaces the liquibase {@link ServiceLocator} with a" + ); + assertEquals(expected, type.getJavaDoc().raw().trim().substring(0, expected.length())); + + type = project.findType("org.springframework.boot.liquibase.LiquibaseServiceLocatorApplicationListener$LiquibasePresent"); + assertNotNull(type); + expected = String.join("\n", + "/**", + " * Inner class to prevent class not found issues.", + " */" + ); + assertEquals(expected, type.getJavaDoc().raw().trim()); + } + + @Test + public void parser_testClassJavadocForOutputFolder() throws Exception { + MavenJavaProject project = projectSupplier.get(); + IType type = project.findType("hello.Greeting"); + + assertNotNull(type); + String expected = String.join("\n", + "/**", + " * Comment for Greeting class ", + " */" + ); + assertEquals(expected, type.getJavaDoc().raw().trim()); + + IField field = type.getField("id"); + assertNotNull(field); + expected = String.join("\n", + "/**", + " * Comment for id field", + " */" + ); + assertEquals(expected, field.getJavaDoc().raw().trim()); + + IMethod method = type.getMethod("getId", Stream.empty()); + assertNotNull(method); + expected = String.join("\n", + "/**", + " * Comment for getId()", + " */" + ); + assertEquals(expected, method.getJavaDoc().raw().trim()); + } + + @Test + public void parser_testFieldAndMethodJavadocForJar() throws Exception { + MavenJavaProject project = projectSupplier.get(); + + IType type = project.findType("org.springframework.boot.SpringApplication"); + assertNotNull(type); + + IField field = type.getField("BANNER_LOCATION_PROPERTY_VALUE"); + assertNotNull(field); + String expected = String.join("\n", + "/**", + " * Default banner location.", + " */" + ); + assertEquals(expected, field.getJavaDoc().raw().trim()); + + IMethod method = type.getMethod("getListeners", Stream.empty()); + assertNotNull(method); + expected = String.join("\n", + "/**", + " * Returns read-only ordered Set of the {@link ApplicationListener}s that will be" + ); + assertEquals(expected, method.getJavaDoc().raw().trim().substring(0, expected.length())); + } + + @Test + public void parser_testInnerClassJavadocForOutputFolder() throws Exception { + MavenJavaProject project = projectSupplier.get(); + IType type = project.findType("hello.Greeting$TestInnerClass"); + assertNotNull(type); + assertEquals("/**\n * Comment for inner class\n */", type.getJavaDoc().raw().trim()); + + IField field = type.getField("innerField"); + assertNotNull(field); + assertEquals("/**\n \t * Comment for inner field\n \t */", field.getJavaDoc().raw().trim()); + + IMethod method = type.getMethod("getInnerField", Stream.empty()); + assertNotNull(method); + assertEquals("/**\n \t * Comment for method inside nested class\n \t */", method.getJavaDoc().raw().trim()); + } + +} diff --git a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java index e0693e887..dd3132a00 100644 --- a/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java +++ b/vscode-extensions/vscode-boot-properties/src/main/java/org/springframework/ide/vscode/boot/BootPropertiesLanguageServer.java @@ -60,8 +60,8 @@ import com.google.common.collect.ImmutableList; public class BootPropertiesLanguageServer extends SimpleLanguageServer { public static final JavaProjectFinder DEFAULT_PROJECT_FINDER = new DefaultJavaProjectFinder(new IJavaProjectFinderStrategy[] { - new JavaProjectWithClasspathFileFinderStrategy(), - new MavenProjectFinderStrategy() + new MavenProjectFinderStrategy(), + new JavaProjectWithClasspathFileFinderStrategy() }); private static final String YML = ".yml"; diff --git a/vscode-extensions/vscode-boot-properties/src/test/resources/test-projects/enums-boot-1.3.2-app/src/main/java/demo/FooProperties.java b/vscode-extensions/vscode-boot-properties/src/test/resources/test-projects/enums-boot-1.3.2-app/src/main/java/demo/FooProperties.java index 0177267a5..7046ca45a 100644 --- a/vscode-extensions/vscode-boot-properties/src/test/resources/test-projects/enums-boot-1.3.2-app/src/main/java/demo/FooProperties.java +++ b/vscode-extensions/vscode-boot-properties/src/test/resources/test-projects/enums-boot-1.3.2-app/src/main/java/demo/FooProperties.java @@ -19,6 +19,9 @@ public class FooProperties { private Color color; //Map Enum -> Atomic + /** + * Some color names. Do you see me? + */ private Map colorNames; //Map Atomic -> Enum