From 1b268093499d3bc87725740ca9371babe2c11f43 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Tue, 13 Dec 2016 23:34:23 -0500 Subject: [PATCH 1/4] Compile maven project and generate javadoc instead of resolving dependencies --- .../ide/vscode/commons/maven/MavenBridge.java | 26 +- .../ide/vscode/commons/maven/MavenCore.java | 9 +- .../commons/maven/java/MavenJavaProject.java | 10 +- .../maven/java/MavenProjectClasspath.java | 86 +++- .../commons/maven/DependencyTreeTest.java | 4 +- .../vscode/commons/maven/HtmlJavadocTest.java | 316 +++++++++++++ .../vscode/commons/maven/JavaIndexTest.java | 418 +----------------- .../commons/maven/SourceJavadocTest.java | 129 ++++++ .../project/harness/ProjectsHarness.java | 1 - 9 files changed, 556 insertions(+), 443 deletions(-) create mode 100644 vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/HtmlJavadocTest.java create mode 100644 vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/SourceJavadocTest.java 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..019acf6bd 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("skipTests", "true"); +// 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/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..1803df72d 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 @@ -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 { 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 @@ -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..7c8cd016e 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,18 +15,22 @@ 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.stream.Collectors; import java.util.stream.Stream; import org.apache.maven.artifact.Artifact; +import org.apache.maven.execution.MavenExecutionResult; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.DirectoryScanner; import org.springframework.ide.vscode.commons.jandex.JandexIndex; import org.springframework.ide.vscode.commons.java.IClasspath; +import org.springframework.ide.vscode.commons.java.IJavaProject.TypeFilter; 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 +61,25 @@ 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(() -> { + try { + return createMavenProject(); + } catch (MavenException e) { + Log.log(e); + return null; + } + }); this.javaIndex = Suppliers.memoize(() -> { Stream classpathEntries = Stream.empty(); try { @@ -86,13 +99,49 @@ public class MavenProjectClasspath implements IClasspath { }, maven.getJavaIndexForJreLibs()); }); } + + private final MavenProject createMavenProject() throws MavenException { + MavenExecutionResult result = maven.build(pom); + if (result.hasExceptions()) { + result.getExceptions().forEach(Log::log); + } + return result.getProject(); + } + + 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) { @@ -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/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..751a1958d 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,7 +76,7 @@ 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); 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..df6313761 --- /dev/null +++ b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/HtmlJavadocTest.java @@ -0,0 +1,316 @@ +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()); + 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..78d9586c9 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,17 +28,6 @@ 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 @@ -58,15 +42,6 @@ public class JavaIndexTest { 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() @@ -100,7 +75,7 @@ public class JavaIndexTest { @Test public void findClassInJar() throws Exception { MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - IType type = project.findType("org.springframework.test.web.client.ExpectedCount"); + IType type = project.findType("org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration"); assertNotNull(type); } @@ -150,395 +125,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/test/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java index 7f56c7744..6d6a9c656 100644 --- a/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java +++ b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java @@ -50,7 +50,6 @@ public class ProjectsHarness { Path testProjectPath = getProjectPath(name); switch (type) { case MAVEN: - MavenBuilder.newBuilder(testProjectPath).clean().pack().javadoc().skipTests().execute(); return new MavenJavaProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); case CLASSPATH_TXT: MavenBuilder.newBuilder(testProjectPath).clean().pack().skipTests().execute(); From 4df222af385b090e86888bf0f34ccad331ea9f32 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Wed, 14 Dec 2016 10:56:34 -0500 Subject: [PATCH 2/4] Include private members in javadoc --- .../ide/vscode/commons/maven/MavenBridge.java | 6 +++--- .../src/main/java/demo/FooProperties.java | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) 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 019acf6bd..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 @@ -375,9 +375,9 @@ class MavenBridge { configuration.setResolveDependencies(true); configuration.setResolveVersionRanges(true); request.setGoals(Arrays.asList(new String[] { "compile", "javadoc:javadoc" })); -// Properties userProperties = (Properties) request.getUserProperties().clone(); -// userProperties.put("skipTests", "true"); -// request.setUserProperties(userProperties); + 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); 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 From 288d846a688ee4054c5572839bb5690dd53cdaa6 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Fri, 16 Dec 2016 10:15:04 -0500 Subject: [PATCH 3/4] Instead of mvn build use mvn project building + resolve. Refactorings --- .../vscode/commons/jandex/JandexIndex.java | 6 ++-- .../ide/vscode/commons/java/IJavaProject.java | 13 ++------ .../vscode/commons/maven/MavenBuilder.java | 1 + .../commons/maven/java/MavenJavaProject.java | 4 +-- .../maven/java/MavenProjectClasspath.java | 32 +++++++++---------- .../JavaProjectWithClasspathFile.java | 3 +- .../vscode/commons/maven/HtmlJavadocTest.java | 1 + .../vscode/commons/maven/JavaIndexTest.java | 9 ++---- .../boot/BootPropertiesLanguageServer.java | 4 +-- .../project/harness/ProjectsHarness.java | 1 + 10 files changed, 34 insertions(+), 40 deletions(-) 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/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/java/MavenJavaProject.java b/vscode-extensions/commons/commons-maven/src/main/java/org/springframework/ide/vscode/commons/maven/java/MavenJavaProject.java index 1803df72d..b13accbf0 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; @@ -60,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); } 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 7c8cd016e..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 @@ -19,16 +19,15 @@ 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; import org.apache.maven.artifact.Artifact; -import org.apache.maven.execution.MavenExecutionResult; import org.apache.maven.project.MavenProject; import org.codehaus.plexus.util.DirectoryScanner; import org.springframework.ide.vscode.commons.jandex.JandexIndex; import org.springframework.ide.vscode.commons.java.IClasspath; -import org.springframework.ide.vscode.commons.java.IJavaProject.TypeFilter; import org.springframework.ide.vscode.commons.java.IJavadocProvider; import org.springframework.ide.vscode.commons.java.IType; import org.springframework.ide.vscode.commons.java.parser.ParserJavadocProvider; @@ -72,14 +71,7 @@ public class MavenProjectClasspath implements IClasspath { MavenProjectClasspath(File pom, MavenCore maven) { this.maven = maven; this.pom = pom; - this.projectSupplier = Suppliers.memoize(() -> { - try { - return createMavenProject(); - } catch (MavenException e) { - Log.log(e); - return null; - } - }); + this.projectSupplier = Suppliers.memoize(() -> createMavenProject()); this.javaIndex = Suppliers.memoize(() -> { Stream classpathEntries = Stream.empty(); try { @@ -100,12 +92,20 @@ public class MavenProjectClasspath implements IClasspath { }); } - private final MavenProject createMavenProject() throws MavenException { - MavenExecutionResult result = maven.build(pom); - if (result.hasExceptions()) { - result.getExceptions().forEach(Log::log); + 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; + } } - return result.getProject(); } public boolean exists() { @@ -148,7 +148,7 @@ public class MavenProjectClasspath implements IClasspath { 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); } 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/HtmlJavadocTest.java b/vscode-extensions/commons/commons-maven/src/test/java/org/springframework/ide/vscode/commons/maven/HtmlJavadocTest.java index df6313761..d08b0f823 100644 --- 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 @@ -28,6 +28,7 @@ public class HtmlJavadocTest { 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; 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 78d9586c9..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 @@ -33,15 +33,12 @@ public class JavaIndexTest { @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()); - } - @Test public void fuzzySearchNoFilter() throws Exception { List> results = MavenCore.getDefault().getJavaIndexForJreLibs() @@ -75,7 +72,7 @@ public class JavaIndexTest { @Test public void findClassInJar() throws Exception { MavenJavaProject project = mavenProjectsCache.get("gs-rest-service-cors-boot-1.4.1-with-classpath-file"); - IType type = project.findType("org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration"); + IType type = project.findType("org.springframework.test.web.client.ExpectedCount"); assertNotNull(type); } 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 326d0c80d..4cc544505 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/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java index 6d6a9c656..7f56c7744 100644 --- a/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java +++ b/vscode-extensions/vscode-boot-properties/src/test/java/org/springframework/ide/vscode/project/harness/ProjectsHarness.java @@ -50,6 +50,7 @@ public class ProjectsHarness { Path testProjectPath = getProjectPath(name); switch (type) { case MAVEN: + MavenBuilder.newBuilder(testProjectPath).clean().pack().javadoc().skipTests().execute(); return new MavenJavaProject(testProjectPath.resolve(MavenCore.POM_XML).toFile()); case CLASSPATH_TXT: MavenBuilder.newBuilder(testProjectPath).clean().pack().skipTests().execute(); From 5362d8380d53b352ad72c7c7c6926537c8787438 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Fri, 16 Dec 2016 10:22:21 -0500 Subject: [PATCH 4/4] Unit test for dependency resolution for project model building + resolve --- .../commons/maven/java/MavenJavaProject.java | 2 +- .../commons/maven/DependencyTreeTest.java | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) 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 b13accbf0..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 @@ -34,7 +34,7 @@ public class MavenJavaProject implements IJavaProject { private MavenProjectClasspath classpath; private MavenCore maven; - public MavenJavaProject(File pom) throws Exception { + public MavenJavaProject(File pom) { this.maven = MavenCore.getDefault(); this.classpath = new MavenProjectClasspath(pom, maven); } 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 751a1958d..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 @@ -79,6 +79,40 @@ public class DependencyTreeTest { 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) {