From f2abf2d21db988c1593717cdd1a56a3d3ce066fd Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Thu, 17 Nov 2016 14:34:07 -0500 Subject: [PATCH] Factor common logic for javadoc in javadoc package --- .../parser/JarSourcesJavadocProvider.java | 31 ----------------- ...adocProvider.java => JavadocProvider.java} | 16 +++++---- .../parser/SourceFolderJavadocProvider.java | 23 ------------- .../commons/javadoc/SourceUrlProvider.java | 12 +++++++ .../SourceUrlProviderFromSourceContainer.java | 29 ++++++++++++++++ .../maven/java/MavenProjectClasspath.java | 33 ++++++++++++------- 6 files changed, 72 insertions(+), 72 deletions(-) delete mode 100644 vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JarSourcesJavadocProvider.java rename vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/{AbstractJavadocProvider.java => JavadocProvider.java} (94%) delete mode 100644 vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/SourceFolderJavadocProvider.java create mode 100644 vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/SourceUrlProvider.java create mode 100644 vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/SourceUrlProviderFromSourceContainer.java diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JarSourcesJavadocProvider.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JarSourcesJavadocProvider.java deleted file mode 100644 index 5a2396ee7..000000000 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JarSourcesJavadocProvider.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.springframework.ide.vscode.commons.java.parser; - -import java.net.MalformedURLException; -import java.net.URL; - -import org.springframework.ide.vscode.commons.java.IType; - -import com.google.common.base.Supplier; - -public class JarSourcesJavadocProvider extends AbstractJavadocProvider { - - private Supplier sourcesJarUrl; - - public JarSourcesJavadocProvider(Supplier sourcesJarUrl) { - super(); - this.sourcesJarUrl = sourcesJarUrl; - } - - @Override - protected URL createSourceUrl(IType type) throws MalformedURLException { - StringBuilder sourceUrlStr = new StringBuilder(); - sourceUrlStr.append("jar:"); - sourceUrlStr.append(sourcesJarUrl.get()); - sourceUrlStr.append("!"); - sourceUrlStr.append('/'); - sourceUrlStr.append(type.getFullyQualifiedName().replaceAll("\\.", "/")); - sourceUrlStr.append(".java"); - return new URL(sourceUrlStr.toString()); - } - -} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/AbstractJavadocProvider.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JavadocProvider.java similarity index 94% rename from vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/AbstractJavadocProvider.java rename to vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JavadocProvider.java index d9ca22434..110e5a0e3 100644 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/AbstractJavadocProvider.java +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/JavadocProvider.java @@ -1,6 +1,5 @@ package org.springframework.ide.vscode.commons.java.parser; -import java.net.MalformedURLException; import java.net.URL; import java.util.Optional; @@ -11,6 +10,7 @@ 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.javadoc.RawJavadoc; +import org.springframework.ide.vscode.commons.javadoc.SourceUrlProvider; import org.springframework.ide.vscode.commons.util.Log; import com.github.javaparser.ast.CompilationUnit; @@ -21,7 +21,13 @@ import com.github.javaparser.ast.body.MethodDeclaration; import com.github.javaparser.ast.body.VariableDeclarator; import com.github.javaparser.ast.visitor.GenericVisitorAdapter; -public abstract class AbstractJavadocProvider implements IJavadocProvider { +public class JavadocProvider implements IJavadocProvider { + + private SourceUrlProvider sourceUrlProvider; + + public JavadocProvider(SourceUrlProvider sourceUrlProvider) { + this.sourceUrlProvider = sourceUrlProvider; + } public IJavadoc getJavadoc(IType type) { if (type.isEnum()) { @@ -64,9 +70,9 @@ public abstract class AbstractJavadocProvider implements IJavadocProvider { private CompilationUnit getCompilationUnit(IType type) { try { - URL sourceUrl = createSourceUrl(type); + URL sourceUrl = sourceUrlProvider.sourceUrl(type); return CompilationUnitIndex.DEFAULT.getCompilationUnit(sourceUrl); - } catch (MalformedURLException e) { + } catch (Exception e) { Log.log("Invalid source URL for type " + type, e); return null; } @@ -156,6 +162,4 @@ public abstract class AbstractJavadocProvider implements IJavadocProvider { }; } - abstract protected URL createSourceUrl(IType type) throws MalformedURLException; - } diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/SourceFolderJavadocProvider.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/SourceFolderJavadocProvider.java deleted file mode 100644 index 0f2ce7983..000000000 --- a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/java/parser/SourceFolderJavadocProvider.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.springframework.ide.vscode.commons.java.parser; - -import java.io.File; -import java.net.MalformedURLException; -import java.net.URL; - -import org.springframework.ide.vscode.commons.java.IType; - -public class SourceFolderJavadocProvider extends AbstractJavadocProvider { - - private File sourceFolder; - - public SourceFolderJavadocProvider(File sourceFolder) { - super(); - this.sourceFolder = sourceFolder; - } - - @Override - protected URL createSourceUrl(IType type) throws MalformedURLException { - return new File(sourceFolder, type.getFullyQualifiedName().replaceAll("\\.", "/") + ".java").toURI().toURL(); - } - -} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/SourceUrlProvider.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/SourceUrlProvider.java new file mode 100644 index 000000000..a0b25ddfd --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/SourceUrlProvider.java @@ -0,0 +1,12 @@ +package org.springframework.ide.vscode.commons.javadoc; + +import java.net.URL; + +import org.springframework.ide.vscode.commons.java.IType; + +@FunctionalInterface +public interface SourceUrlProvider { + + URL sourceUrl(IType type) throws Exception; + +} diff --git a/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/SourceUrlProviderFromSourceContainer.java b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/SourceUrlProviderFromSourceContainer.java new file mode 100644 index 000000000..c92f3e5ef --- /dev/null +++ b/vscode-extensions/commons/commons-java/src/main/java/org/springframework/ide/vscode/commons/javadoc/SourceUrlProviderFromSourceContainer.java @@ -0,0 +1,29 @@ +package org.springframework.ide.vscode.commons.javadoc; + +import java.net.URL; +import java.nio.file.Paths; + +import org.springframework.ide.vscode.commons.java.IType; + +@FunctionalInterface +public interface SourceUrlProviderFromSourceContainer { + + public static final SourceUrlProviderFromSourceContainer JAR_SOURCE_URL_PROVIDER = (sourceContainerUrl, type) -> { + StringBuilder sourceUrlStr = new StringBuilder(); + sourceUrlStr.append("jar:"); + sourceUrlStr.append(sourceContainerUrl); + sourceUrlStr.append("!"); + sourceUrlStr.append('/'); + sourceUrlStr.append(type.getFullyQualifiedName().replaceAll("\\.", "/")); + sourceUrlStr.append(".java"); + return new URL(sourceUrlStr.toString()); + + }; + + public static final SourceUrlProviderFromSourceContainer SOURCE_FOLDER_URL_SUPPLIER = (sourceContainerUrl, type) -> { + return Paths.get(sourceContainerUrl.toURI()).resolve(type.getFullyQualifiedName().replaceAll("\\.", "/") + ".java").toUri().toURL(); + }; + + URL sourceUrl(URL sourceContainerUrl, IType type) throws Exception; + +} 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 ee7a8d576..cdbf82b2a 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 @@ -12,8 +12,8 @@ package org.springframework.ide.vscode.commons.maven.java; import java.io.File; import java.net.MalformedURLException; +import java.net.URL; import java.nio.file.Path; -import java.nio.file.Paths; import java.util.Arrays; import java.util.Optional; import java.util.stream.Stream; @@ -25,8 +25,8 @@ 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.parser.JarSourcesJavadocProvider; -import org.springframework.ide.vscode.commons.java.parser.SourceFolderJavadocProvider; +import org.springframework.ide.vscode.commons.java.parser.JavadocProvider; +import org.springframework.ide.vscode.commons.javadoc.SourceUrlProviderFromSourceContainer; import org.springframework.ide.vscode.commons.maven.MavenCore; import org.springframework.ide.vscode.commons.maven.MavenException; import org.springframework.ide.vscode.commons.util.Log; @@ -45,7 +45,7 @@ public class MavenProjectClasspath implements IClasspath { private MavenCore maven; private MavenProject project; private Supplier javaIndex; - + public MavenProjectClasspath(MavenProject project) { this(project, MavenCore.getInstance()); } @@ -67,9 +67,9 @@ public class MavenProjectClasspath implements IClasspath { @Override public Stream getClasspathEntries() throws Exception { return Stream.concat(maven.resolveDependencies(project, null).stream().map(artifact -> { - return Paths.get(artifact.getFile().toURI()); - }), Stream.of(Paths.get(new File(project.getBuild().getOutputDirectory()).toURI()), - Paths.get(new File(project.getBuild().getTestOutputDirectory()).toURI()))); + return artifact.getFile().toPath(); + }), Stream.of(new File(project.getBuild().getOutputDirectory()).toPath(), + new File(project.getBuild().getTestOutputDirectory()).toPath())); } public IType findType(String fqName) { @@ -87,25 +87,34 @@ public class MavenProjectClasspath implements IClasspath { private IJavadocProvider createJavadocProvider(File classpathResource) { if (classpathResource.isDirectory()) { if (classpathResource.toString().startsWith(project.getBuild().getOutputDirectory())) { - return new SourceFolderJavadocProvider(new File(project.getBuild().getSourceDirectory())); + return new JavadocProvider(type -> { + return SourceUrlProviderFromSourceContainer.SOURCE_FOLDER_URL_SUPPLIER + .sourceUrl(new File(project.getBuild().getSourceDirectory()).toURI().toURL(), type); + }); } else if (classpathResource.toString().startsWith(project.getBuild().getTestOutputDirectory())) { - return new SourceFolderJavadocProvider(new File(project.getBuild().getTestSourceDirectory())); + return new JavadocProvider(type -> { + return SourceUrlProviderFromSourceContainer.SOURCE_FOLDER_URL_SUPPLIER + .sourceUrl(new File(project.getBuild().getTestSourceDirectory()).toURI().toURL(), type); + }); } else { throw new IllegalArgumentException("Cannot find source folder for " + classpathResource); } } else { // Assume it's a JAR file - return new JarSourcesJavadocProvider(Suppliers.memoize(() -> { + return new JavadocProvider(type -> { try { Artifact artifact = getArtifactFromJarFile(classpathResource).get(); - return maven.getSources(artifact).getFile().toURI().toURL(); + URL sourceContainer = maven.getSources(artifact).getFile().toURI().toURL(); + System.out.println("----> SOURCE " + sourceContainer); + return SourceUrlProviderFromSourceContainer.JAR_SOURCE_URL_PROVIDER.sourceUrl(sourceContainer, + type); } catch (MavenException e) { Log.log("Failed to find sources JAR for " + classpathResource, e); } catch (MalformedURLException e) { Log.log("Invalid URL for sources JAR for " + classpathResource, e); } return null; - })); + }); } }