Merge pull request #5 from spring-projects/maven-build
Simplify dependency resolution. Refactorings.
This commit is contained in:
@@ -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<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter) {
|
||||
public Flux<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, Predicate<IType> typeFilter) {
|
||||
Flux<Tuple2<IType, Double>> 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) {
|
||||
|
||||
@@ -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<IType> instead.
|
||||
*/
|
||||
@Deprecated
|
||||
@FunctionalInterface
|
||||
public static interface TypeFilter {
|
||||
boolean accept(IType type);
|
||||
}
|
||||
|
||||
IType findType(String fqName);
|
||||
|
||||
Flux<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter);
|
||||
Flux<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, Predicate<IType> typeFilter);
|
||||
|
||||
Flux<Tuple2<String, Double>> fuzzySearchPackages(String searchTerm);
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@ public class MavenBuilder {
|
||||
|
||||
public MavenBuilder javadoc() {
|
||||
properties.add("javadoc:javadoc");
|
||||
properties.add("-Dshow=private");
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter) {
|
||||
public Flux<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, Predicate<IType> 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());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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<MavenProject> projectSupplier;
|
||||
private Supplier<JandexIndex> 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<Path> 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<Path> 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<Artifact> projectDependencies() {
|
||||
MavenProject project = projectSupplier.get();
|
||||
return project == null ? Collections.emptySet() : project.getArtifacts();
|
||||
}
|
||||
|
||||
private List<File> 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<Tuple2<IType, Double>> fuzzySearchType(String searchTerm, TypeFilter typeFilter) {
|
||||
public Flux<Tuple2<IType, Double>> fuzzySearchType(String searchTerm, Predicate<IType> typeFilter) {
|
||||
return javaIndex.get().fuzzySearchTypes(searchTerm, typeFilter);
|
||||
}
|
||||
|
||||
@@ -116,12 +165,17 @@ public class MavenProjectClasspath implements IClasspath {
|
||||
}
|
||||
|
||||
private Optional<Artifact> 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<String> 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 -> {
|
||||
|
||||
@@ -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<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, TypeFilter typeFilter) {
|
||||
public Flux<Tuple2<IType, Double>> fuzzySearchTypes(String searchTerm, Predicate<IType> typeFilter) {
|
||||
return Flux.empty();
|
||||
}
|
||||
|
||||
|
||||
@@ -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<Path> 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<Artifact> 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<Artifact> calculatedClassPath = project.getArtifacts();
|
||||
assertEquals(49, calculatedClassPath.size());
|
||||
|
||||
String parentFolderPathStr = localRepoFolder.toString();
|
||||
for (Artifact artifact : calculatedClassPath) {
|
||||
|
||||
@@ -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<MavenJavaProject> 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",
|
||||
"<div class=\"block\">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("<init>", Stream.empty());
|
||||
assertNotNull(method);
|
||||
|
||||
String expected = String.join("\n",
|
||||
"<h4>ArrayList</h4>"
|
||||
);
|
||||
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",
|
||||
"<h4>BANNER_LOCATION_PROPERTY_VALUE</h4>",
|
||||
"<pre>public static final <a href=\"http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true\" title=\"class or interface in java.lang\">String</a> BANNER_LOCATION_PROPERTY_VALUE</pre>",
|
||||
"<div class=\"block\">Default banner location.</div>",
|
||||
"<dl>",
|
||||
"<dt><span class=\"seeLabel\">See Also:</span></dt>",
|
||||
"<dd><a href=\"../../../constant-values.html#org.springframework.boot.SpringApplication.BANNER_LOCATION_PROPERTY_VALUE\">Constant Field Values</a></dd>",
|
||||
"</dl>"
|
||||
);
|
||||
IJavadoc javaDoc = field.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IMethod method = type.getMethod("getListeners", Stream.empty());
|
||||
assertNotNull(method);
|
||||
expected = String.join("\n",
|
||||
"<h4>getListeners</h4>",
|
||||
"<pre>public <a href=\"http://docs.oracle.com/javase/6/docs/api/java/util/Set.html?is-external=true\" title=\"class or interface in java.util\">Set</a><org.springframework.context.ApplicationListener<?>> getListeners()</pre>",
|
||||
"<div class=\"block\">Returns read-only ordered Set of the <code>ApplicationListener</code>s that will be",
|
||||
" applied to the SpringApplication and registered with the <code>ApplicationContext</code>",
|
||||
" .</div>",
|
||||
"<dl>",
|
||||
"<dt><span class=\"returnLabel\">Returns:</span></dt>",
|
||||
"<dd>the listeners</dd>",
|
||||
"</dl>"
|
||||
);
|
||||
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("<div class=\"block\">Comment for inner class</div>", javaDoc.getRenderable().toHtml());
|
||||
|
||||
IField field = type.getField("innerField");
|
||||
assertNotNull(field);
|
||||
String expected = String.join("\n",
|
||||
"<h4>innerField</h4>",
|
||||
"<pre>protected int innerField</pre>",
|
||||
"<div class=\"block\">Comment for inner field</div>"
|
||||
);
|
||||
javaDoc = field.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IMethod method = type.getMethod("getInnerField", Stream.empty());
|
||||
assertNotNull(method);
|
||||
expected = String.join("\n",
|
||||
"<h4>getInnerField</h4>",
|
||||
"<pre>public int getInnerField()</pre>",
|
||||
"<div class=\"block\">Comment for method inside nested class</div>"
|
||||
);
|
||||
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("<div class=\"block\">Comment for level 2 nested class</div>", javaDoc.getRenderable().toHtml());
|
||||
|
||||
IField field = type.getField("innerLevel2Field");
|
||||
assertNotNull(field);
|
||||
String expected = String.join("\n",
|
||||
"<h4>innerLevel2Field</h4>",
|
||||
"<pre>protected int innerLevel2Field</pre>",
|
||||
"<div class=\"block\">Comment for level 2 inner field</div>"
|
||||
);
|
||||
javaDoc = field.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IMethod method = type.getMethod("getInnerLevel2Field", Stream.empty());
|
||||
assertNotNull(method);
|
||||
expected = String.join("\n",
|
||||
"<h4>getInnerLevel2Field</h4>",
|
||||
"<pre>public int getInnerLevel2Field()</pre>",
|
||||
"<div class=\"block\">Comment for method inside level 2 nested class</div>"
|
||||
);
|
||||
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 = "<div class=\"block\">Comment for Greeting class</div>";
|
||||
IJavadoc javaDoc = type.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IField field = type.getField("id");
|
||||
assertNotNull(field);
|
||||
expected = String.join("\n",
|
||||
"<h4>id</h4>",
|
||||
"<pre>protected final long id</pre>",
|
||||
"<div class=\"block\">Comment for id field</div>"
|
||||
);
|
||||
javaDoc = field.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IMethod method = type.getMethod("getId", Stream.empty());
|
||||
assertNotNull(method);
|
||||
expected = String.join("\n",
|
||||
"<h4>getId</h4>",
|
||||
"<pre>public long getId()</pre>",
|
||||
"<div class=\"block\">Comment for getId()</div>"
|
||||
);
|
||||
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",
|
||||
"<h4>size</h4>",
|
||||
"<pre>public int size()</pre>",
|
||||
"<div class=\"block\">Returns the number of elements in this list.</div>"
|
||||
);
|
||||
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",
|
||||
"<div class=\"block\">A map entry (key-value pair). The <tt>Map.entrySet</tt> 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",
|
||||
"<h4>template</h4>",
|
||||
"<pre>public static final <a href=\"http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true\" title=\"class or interface in java.lang\">String</a> template</pre>",
|
||||
"<dl>",
|
||||
"<dt><span class=\"seeLabel\">See Also:</span></dt>",
|
||||
"<dd><a href=\"../constant-values.html#hello.GreetingController.template\">Constant Field Values</a></dd>",
|
||||
"</dl>"
|
||||
);
|
||||
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",
|
||||
"<h4>corsConfigurer</h4>",
|
||||
"<pre>@Bean",
|
||||
"public org.springframework.web.servlet.config.annotation.WebMvcConfigurer corsConfigurer()</pre>"
|
||||
);
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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<String, Path> projectsCache = CacheBuilder.newBuilder().build(new CacheLoader<String, Path>() {
|
||||
|
||||
@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<String, MavenJavaProject> mavenProjectsCache = CacheBuilder.newBuilder().build(new CacheLoader<String, MavenJavaProject>() {
|
||||
|
||||
@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<Tuple2<IType, Double>> 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",
|
||||
"<div class=\"block\">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",
|
||||
"<div class=\"block\">A map entry (key-value pair). The <tt>Map.entrySet</tt> 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",
|
||||
"<h4>size</h4>",
|
||||
"<pre>public int size()</pre>",
|
||||
"<div class=\"block\">Returns the number of elements in this list.</div>"
|
||||
);
|
||||
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("<init>", Stream.empty());
|
||||
assertNotNull(method);
|
||||
|
||||
String expected = String.join("\n",
|
||||
"<h4>ArrayList</h4>"
|
||||
);
|
||||
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",
|
||||
"<h4>BANNER_LOCATION_PROPERTY_VALUE</h4>",
|
||||
"<pre>public static final <a href=\"http://docs.oracle.com/javase/6/docs/api/java/lang/String.html?is-external=true\" title=\"class or interface in java.lang\">String</a> BANNER_LOCATION_PROPERTY_VALUE</pre>",
|
||||
"<div class=\"block\">Default banner location.</div>",
|
||||
"<dl>",
|
||||
"<dt><span class=\"seeLabel\">See Also:</span></dt>",
|
||||
"<dd><a href=\"../../../constant-values.html#org.springframework.boot.SpringApplication.BANNER_LOCATION_PROPERTY_VALUE\">Constant Field Values</a></dd>",
|
||||
"</dl>"
|
||||
);
|
||||
IJavadoc javaDoc = field.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IMethod method = type.getMethod("getListeners", Stream.empty());
|
||||
assertNotNull(method);
|
||||
expected = String.join("\n",
|
||||
"<h4>getListeners</h4>",
|
||||
"<pre>public <a href=\"http://docs.oracle.com/javase/6/docs/api/java/util/Set.html?is-external=true\" title=\"class or interface in java.util\">Set</a><org.springframework.context.ApplicationListener<?>> getListeners()</pre>",
|
||||
"<div class=\"block\">Returns read-only ordered Set of the <code>ApplicationListener</code>s that will be",
|
||||
" applied to the SpringApplication and registered with the <code>ApplicationContext</code>",
|
||||
" .</div>",
|
||||
"<dl>",
|
||||
"<dt><span class=\"returnLabel\">Returns:</span></dt>",
|
||||
"<dd>the listeners</dd>",
|
||||
"</dl>"
|
||||
);
|
||||
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 = "<div class=\"block\">Comment for Greeting class</div>";
|
||||
IJavadoc javaDoc = type.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IField field = type.getField("id");
|
||||
assertNotNull(field);
|
||||
expected = String.join("\n",
|
||||
"<h4>id</h4>",
|
||||
"<pre>protected final long id</pre>",
|
||||
"<div class=\"block\">Comment for id field</div>"
|
||||
);
|
||||
javaDoc = field.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IMethod method = type.getMethod("getId", Stream.empty());
|
||||
assertNotNull(method);
|
||||
expected = String.join("\n",
|
||||
"<h4>getId</h4>",
|
||||
"<pre>public long getId()</pre>",
|
||||
"<div class=\"block\">Comment for getId()</div>"
|
||||
);
|
||||
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("<div class=\"block\">Comment for inner class</div>", javaDoc.getRenderable().toHtml());
|
||||
|
||||
IField field = type.getField("innerField");
|
||||
assertNotNull(field);
|
||||
String expected = String.join("\n",
|
||||
"<h4>innerField</h4>",
|
||||
"<pre>protected int innerField</pre>",
|
||||
"<div class=\"block\">Comment for inner field</div>"
|
||||
);
|
||||
javaDoc = field.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IMethod method = type.getMethod("getInnerField", Stream.empty());
|
||||
assertNotNull(method);
|
||||
expected = String.join("\n",
|
||||
"<h4>getInnerField</h4>",
|
||||
"<pre>public int getInnerField()</pre>",
|
||||
"<div class=\"block\">Comment for method inside nested class</div>"
|
||||
);
|
||||
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("<div class=\"block\">Comment for level 2 nested class</div>", javaDoc.getRenderable().toHtml());
|
||||
|
||||
IField field = type.getField("innerLevel2Field");
|
||||
assertNotNull(field);
|
||||
String expected = String.join("\n",
|
||||
"<h4>innerLevel2Field</h4>",
|
||||
"<pre>protected int innerLevel2Field</pre>",
|
||||
"<div class=\"block\">Comment for level 2 inner field</div>"
|
||||
);
|
||||
javaDoc = field.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
|
||||
IMethod method = type.getMethod("getInnerLevel2Field", Stream.empty());
|
||||
assertNotNull(method);
|
||||
expected = String.join("\n",
|
||||
"<h4>getInnerLevel2Field</h4>",
|
||||
"<pre>public int getInnerLevel2Field()</pre>",
|
||||
"<div class=\"block\">Comment for method inside level 2 nested class</div>"
|
||||
);
|
||||
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",
|
||||
"<h4>corsConfigurer</h4>",
|
||||
"<pre>@Bean",
|
||||
"public org.springframework.web.servlet.config.annotation.WebMvcConfigurer corsConfigurer()</pre>"
|
||||
);
|
||||
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",
|
||||
"<h4>template</h4>",
|
||||
"<pre>public static final <a href=\"http://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true\" title=\"class or interface in java.lang\">String</a> template</pre>",
|
||||
"<dl>",
|
||||
"<dt><span class=\"seeLabel\">See Also:</span></dt>",
|
||||
"<dd><a href=\"../constant-values.html#hello.GreetingController.template\">Constant Field Values</a></dd>",
|
||||
"</dl>"
|
||||
);
|
||||
IJavadoc javaDoc = field.getJavaDoc();
|
||||
assertNotNull(javaDoc);
|
||||
assertEquals(expected, javaDoc.getRenderable().toHtml());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<MavenJavaProject> 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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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";
|
||||
|
||||
@@ -19,6 +19,9 @@ public class FooProperties {
|
||||
private Color color;
|
||||
|
||||
//Map Enum -> Atomic
|
||||
/**
|
||||
* Some color names. Do you see me?
|
||||
*/
|
||||
private Map<Color,String> colorNames;
|
||||
|
||||
//Map Atomic -> Enum
|
||||
|
||||
Reference in New Issue
Block a user