diff --git a/src/main/java/io/freefair/gradle/plugins/javadoc/ConfigureJavadocLinks.java b/src/main/java/io/freefair/gradle/plugins/javadoc/ConfigureJavadocLinks.java deleted file mode 100644 index 89e82b38..00000000 --- a/src/main/java/io/freefair/gradle/plugins/javadoc/ConfigureJavadocLinks.java +++ /dev/null @@ -1,108 +0,0 @@ -package io.freefair.gradle.plugins.javadoc; - -import lombok.Getter; -import lombok.Setter; -import org.gradle.api.DefaultTask; -import org.gradle.api.JavaVersion; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.artifacts.ResolvedArtifact; -import org.gradle.api.artifacts.component.ComponentIdentifier; -import org.gradle.api.artifacts.component.ModuleComponentIdentifier; -import org.gradle.api.tasks.Input; -import org.gradle.api.tasks.InputFiles; -import org.gradle.api.tasks.TaskAction; -import org.gradle.api.tasks.javadoc.Javadoc; -import org.gradle.external.javadoc.MinimalJavadocOptions; -import org.gradle.external.javadoc.StandardJavadocDocletOptions; - -/** - * @author Lars Grefer - */ -@Getter -@Setter -public class ConfigureJavadocLinks extends DefaultTask { - - private Javadoc javadoc; - - @InputFiles - private Configuration configuration; - - @Input - private JavaVersion javaVersion; - - @TaskAction - public void configureJavadocLinks() { - - switch (getJavaVersion()) { - case VERSION_1_5: - addLink("https://docs.oracle.com/javase/5/docs/api/"); - break; - case VERSION_1_6: - addLink("https://docs.oracle.com/javase/6/docs/api/"); - break; - case VERSION_1_7: - addLink("https://docs.oracle.com/javase/7/docs/api/"); - break; - case VERSION_1_8: - addLink("https://docs.oracle.com/javase/8/docs/api/"); - break; - case VERSION_1_9: - addLink("https://docs.oracle.com/javase/9/docs/api/"); - break; - default: - getLogger().warn("Unknown java version {}", javaVersion); - } - - boolean usedJavadocIo = false; - - for (ResolvedArtifact resolvedArtifact : getConfiguration().getResolvedConfiguration().getResolvedArtifacts()) { - ComponentIdentifier componentIdentifier = resolvedArtifact.getId().getComponentIdentifier(); - - if (componentIdentifier instanceof ModuleComponentIdentifier) { - ModuleComponentIdentifier moduleComponentIdentifier = (ModuleComponentIdentifier) componentIdentifier; - String group = moduleComponentIdentifier.getGroup(); - String artifact = moduleComponentIdentifier.getModule(); - String version = moduleComponentIdentifier.getVersion(); - - String wellKnownLink = findWellKnownLink(group, artifact, version); - if (wellKnownLink != null) { - getLogger().info("Using well known link '{}' for '{}:{}:{}'", wellKnownLink, group, artifact, version); - addLink(wellKnownLink); - break; - } else { - getLogger().info("Using javadoc.io link for '{}:{}:{}'", group, artifact, version); - String javadocIoLink = String.format("https://static.javadoc.io/%s/%s/%s/", group, artifact, version); - addLink(javadocIoLink); - usedJavadocIo = true; - } - } - } - - if(usedJavadocIo) { - javadoc.getOptions().jFlags("-Dhttp.agent=" + System.currentTimeMillis()); - } - } - - private String findWellKnownLink(String group, String artifact, String version) { - if (group.equals("org.springframework") && artifact.startsWith("spring-")) { - return "https://docs.spring.io/spring/docs/" + version + "/javadoc-api/"; - } else if (group.equals("org.springframework.boot")) { - return "https://docs.spring.io/spring-boot/docs/" + version + "/api/"; - } - return null; - } - - private void addLink(String baseUrl) { - MinimalJavadocOptions options = javadoc.getOptions(); - if (options instanceof StandardJavadocDocletOptions) { - StandardJavadocDocletOptions docletOptions = (StandardJavadocDocletOptions) options; - if (!docletOptions.getLinks().contains(baseUrl)) { - getLogger().debug("Adding '{}' to {}", baseUrl, javadoc); - docletOptions.links(baseUrl); - setDidWork(true); - } else { - getLogger().info("Not adding '{}' to {} because it's already present", baseUrl, javadoc); - } - } - } -} diff --git a/src/main/java/io/freefair/gradle/plugins/javadoc/JavadocLinksExtension.java b/src/main/java/io/freefair/gradle/plugins/javadoc/JavadocLinksExtension.java deleted file mode 100644 index f3682438..00000000 --- a/src/main/java/io/freefair/gradle/plugins/javadoc/JavadocLinksExtension.java +++ /dev/null @@ -1,34 +0,0 @@ -package io.freefair.gradle.plugins.javadoc; - -import lombok.Data; -import org.gradle.api.JavaVersion; - -import java.util.LinkedList; -import java.util.List; - -/** - * @author Lars Grefer; - */ -@Data -public class JavadocLinksExtension { - - private JavaVersion javaVersion; - - private List links = new LinkedList<>(); - - public JavadocLinksExtension() { - javaVersion = JavaVersion.current(); - } - - public void links(String... links) { - for (String link : links) { - links(link); - } - } - - public void links(String link) { - if(!links.contains(link)) { - links.add(link); - } - } -} diff --git a/src/main/java/io/freefair/gradle/plugins/javadoc/JavadocLinksPlugin.java b/src/main/java/io/freefair/gradle/plugins/javadoc/JavadocLinksPlugin.java index 25910f81..a0934630 100644 --- a/src/main/java/io/freefair/gradle/plugins/javadoc/JavadocLinksPlugin.java +++ b/src/main/java/io/freefair/gradle/plugins/javadoc/JavadocLinksPlugin.java @@ -1,48 +1,91 @@ package io.freefair.gradle.plugins.javadoc; import lombok.Getter; +import org.gradle.api.JavaVersion; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; +import org.gradle.api.artifacts.ResolvedArtifact; +import org.gradle.api.artifacts.component.ComponentIdentifier; +import org.gradle.api.artifacts.component.ModuleComponentIdentifier; import org.gradle.api.file.FileCollection; import org.gradle.api.internal.file.UnionFileCollection; -import org.gradle.api.plugins.JavaBasePlugin; +import org.gradle.api.logging.Logger; import org.gradle.api.tasks.javadoc.Javadoc; +import org.gradle.external.javadoc.MinimalJavadocOptions; import org.gradle.external.javadoc.StandardJavadocDocletOptions; -import static org.codehaus.groovy.runtime.StringGroovyMethods.capitalize; +import java.util.List; @Getter public class JavadocLinksPlugin implements Plugin { - private JavadocLinksExtension javadocLinks; + private Project project; @Override public void apply(Project project) { - javadocLinks = project.getExtensions().create("javadocLinks", JavadocLinksExtension.class); - - project.getTasks().withType(Javadoc.class, javadoc -> { - String taskName = "configure" + capitalize((CharSequence) javadoc.getName()) + "Links"; - - ConfigureJavadocLinks configureJavadocLinks = project.getTasks().create(taskName, ConfigureJavadocLinks.class); - configureJavadocLinks.setGroup(JavaBasePlugin.DOCUMENTATION_GROUP); - configureJavadocLinks.setJavadoc(javadoc); - javadoc.dependsOn(configureJavadocLinks); - - project.afterEvaluate(p -> { - configureJavadocLinks.setJavaVersion(javadocLinks.getJavaVersion()); - configureJavadocLinks.setConfiguration(findConfiguraion(javadoc.getClasspath())); - }); - - configureJavadocLinks.doFirst(configureJavadocLinks1 -> - project.getTasks().withType(Javadoc.class, javadoc1 -> { - StandardJavadocDocletOptions options = (StandardJavadocDocletOptions) javadoc1.getOptions(); - for (String link : javadocLinks.getLinks()) { - project.getLogger().info("Adding link {} to javadoc task {}", link, javadoc1); - options.links(link); - } - })); - }); + this.project = project; + + project.getTasks().withType(Javadoc.class, javadoc -> javadoc.doFirst(task -> { + + addLink(javadoc, getJavaSeLink(JavaVersion.current())); + + Configuration configuration = findConfiguraion(javadoc.getClasspath()); + + boolean usedJavadocIo = false; + + for (ResolvedArtifact resolvedArtifact : configuration.getResolvedConfiguration().getResolvedArtifacts()) { + ComponentIdentifier componentIdentifier = resolvedArtifact.getId().getComponentIdentifier(); + + if (componentIdentifier instanceof ModuleComponentIdentifier) { + ModuleComponentIdentifier moduleComponentIdentifier = (ModuleComponentIdentifier) componentIdentifier; + String group = moduleComponentIdentifier.getGroup(); + String artifact = moduleComponentIdentifier.getModule(); + String version = moduleComponentIdentifier.getVersion(); + + String wellKnownLink = findWellKnownLink(group, artifact, version); + if (wellKnownLink != null) { + javadoc.getLogger().info("Using well known link '{}' for '{}:{}:{}'", wellKnownLink, group, artifact, version); + addLink(javadoc, wellKnownLink); + break; + } else { + javadoc.getLogger().info("Using javadoc.io link for '{}:{}:{}'", group, artifact, version); + String javadocIoLink = String.format("https://static.javadoc.io/%s/%s/%s/", group, artifact, version); + addLink(javadoc, javadocIoLink); + usedJavadocIo = true; + } + } + } + + if (usedJavadocIo && javadoc.getOptions().getJFlags().stream().noneMatch(flag -> flag.contains("http.agent"))) { + javadoc.getOptions().jFlags("-Dhttp.agent=" + System.currentTimeMillis()); + } + })); + } + + private void addLink(Javadoc javadoc, String link) { + MinimalJavadocOptions options = javadoc.getOptions(); + if (options instanceof StandardJavadocDocletOptions) { + StandardJavadocDocletOptions docletOptions = (StandardJavadocDocletOptions) options; + Logger logger = javadoc.getLogger(); + List links = docletOptions.getLinks(); + + if (!links.contains(link)) { + logger.debug("Adding '{}' to {}", link, javadoc); + links.add(link); + } else { + logger.info("Not adding '{}' to {} because it's already present", link, javadoc); + } + } + } + + private String findWellKnownLink(String group, String artifact, String version) { + if (group.equals("org.springframework") && artifact.startsWith("spring-")) { + return "https://docs.spring.io/spring/docs/" + version + "/javadoc-api/"; + } else if (group.equals("org.springframework.boot")) { + return "https://docs.spring.io/spring-boot/docs/" + version + "/api/"; + } + return null; } private Configuration findConfiguraion(FileCollection classpath) { @@ -57,4 +100,22 @@ private Configuration findConfiguraion(FileCollection classpath) { return null; } + + private String getJavaSeLink(JavaVersion javaVersion) { + switch (javaVersion) { + case VERSION_1_5: + return "https://docs.oracle.com/javase/5/docs/api/"; + case VERSION_1_6: + return "https://docs.oracle.com/javase/6/docs/api/"; + case VERSION_1_7: + return "https://docs.oracle.com/javase/7/docs/api/"; + case VERSION_1_8: + return "https://docs.oracle.com/javase/8/docs/api/"; + case VERSION_1_9: + return "https://docs.oracle.com/javase/9/docs/api/"; + default: + project.getLogger().warn("Unknown java version {}", javaVersion); + return null; + } + } } diff --git a/src/test/java/io/freefair/gradle/plugins/javadoc/JavadocLinksPluginTest.java b/src/test/java/io/freefair/gradle/plugins/javadoc/JavadocLinksPluginTest.java deleted file mode 100644 index 1bc7e744..00000000 --- a/src/test/java/io/freefair/gradle/plugins/javadoc/JavadocLinksPluginTest.java +++ /dev/null @@ -1,28 +0,0 @@ -package io.freefair.gradle.plugins.javadoc; - -import io.freefair.gradle.plugins.AbstractPluginTest; -import org.gradle.testkit.runner.BuildResult; -import org.gradle.testkit.runner.GradleRunner; -import org.hamcrest.CoreMatchers; -import org.junit.Test; - -import static org.junit.Assert.assertThat; - - -public class JavadocLinksPluginTest extends AbstractPluginTest { - - @Test - public void apply() throws Exception { - loadBuildFileFromClasspath("javadoc-links.gradle"); - - BuildResult result = GradleRunner.create() - .withProjectDir(testProjectDir.getRoot()) - .withArguments("javadoc", "--info") - .withPluginClasspath() - .withDebug(true) - .build(); - - assertThat(result.getOutput(), CoreMatchers.containsString("Using javadoc.io link for 'com.squareup.okio:okio:1.13.0'")); - } - -} \ No newline at end of file diff --git a/src/test/resources/io/freefair/gradle/plugins/javadoc/javadoc-links.gradle b/src/test/resources/io/freefair/gradle/plugins/javadoc/javadoc-links.gradle deleted file mode 100644 index fe71c8bb..00000000 --- a/src/test/resources/io/freefair/gradle/plugins/javadoc/javadoc-links.gradle +++ /dev/null @@ -1,12 +0,0 @@ -plugins { - id "java" - id "io.freefair.javadoc-links" -} - -dependencies { - compile 'com.squareup.retrofit2:retrofit:2+' -} - -repositories { - jcenter() -} \ No newline at end of file