Factor common logic for javadoc in javadoc package

This commit is contained in:
BoykoAlex
2016-11-17 14:34:07 -05:00
parent ff8c5ce491
commit f2abf2d21d
6 changed files with 72 additions and 72 deletions

View File

@@ -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<URL> sourcesJarUrl;
public JarSourcesJavadocProvider(Supplier<URL> 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());
}
}

View File

@@ -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;
}

View File

@@ -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();
}
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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<JandexIndex> javaIndex;
public MavenProjectClasspath(MavenProject project) {
this(project, MavenCore.getInstance());
}
@@ -67,9 +67,9 @@ public class MavenProjectClasspath implements IClasspath {
@Override
public Stream<Path> 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;
}));
});
}
}