diff --git a/.gitignore b/.gitignore index dd236ee..dc0243b 100644 --- a/.gitignore +++ b/.gitignore @@ -2,6 +2,8 @@ # Created by https://www.gitignore.io/api/gradle,java,eclipse,intellij # Edit at https://www.gitignore.io/?templates=gradle,java,eclipse,intellij +.DS_Store + ### Eclipse ### .metadata bin/ diff --git a/src/main/java/io/spring/gradle/javadoc/AggregateJavadocPlugin.java b/src/main/java/io/spring/gradle/javadoc/AggregateJavadocPlugin.java index c794588..3eb2752 100644 --- a/src/main/java/io/spring/gradle/javadoc/AggregateJavadocPlugin.java +++ b/src/main/java/io/spring/gradle/javadoc/AggregateJavadocPlugin.java @@ -5,27 +5,18 @@ import org.gradle.api.Project; import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.ConfigurationContainer; -import org.gradle.api.artifacts.ConfigurationPublications; import org.gradle.api.artifacts.Dependency; import org.gradle.api.artifacts.DependencySet; -import org.gradle.api.attributes.Attribute; -import org.gradle.api.attributes.AttributeContainer; -import org.gradle.api.attributes.Category; -import org.gradle.api.attributes.DocsType; -import org.gradle.api.attributes.Usage; -import org.gradle.api.model.ObjectFactory; import org.gradle.api.plugins.JavaPlugin; -import org.gradle.api.plugins.JavaPluginConvention; -import org.gradle.api.tasks.SourceSet; import org.gradle.api.tasks.javadoc.Javadoc; -import java.io.File; -import java.util.function.Consumer; - /** + * Plugin used to generate aggregated Javadoc. + * * @author Rob Winch */ public class AggregateJavadocPlugin implements Plugin { + public static final String AGGREGATE_JAVADOC_TASK_NAME = "aggregateJavadoc"; public static final String AGGREGATE_JAVADOC_CLASSPATH_CONFIGURATION_NAME = "aggregateJavadocClasspath"; @@ -35,85 +26,69 @@ public void apply(Project project) { project.getPlugins().apply(JavaPlugin.class); Configuration aggregatedConfiguration = aggregatedConfiguration(project); Configuration sourcesPath = sourcesPath(project, aggregatedConfiguration); - aggregatedJavadoc(project,sourcesPath, aggregatedConfiguration); + project.getTasks().create(AGGREGATE_JAVADOC_TASK_NAME, Javadoc.class, + new JavadocTask(sourcesPath, aggregatedConfiguration)); } private Configuration aggregatedConfiguration(Project project) { ConfigurationContainer configurations = project.getConfigurations(); - Configuration aggregatedConfiguration = configurations - .maybeCreate(AGGREGATE_JAVADOC_CLASSPATH_CONFIGURATION_NAME); + Configuration aggregatedConfiguration = configurations.maybeCreate(AGGREGATE_JAVADOC_CLASSPATH_CONFIGURATION_NAME); configurations.getByName(JavaPlugin.IMPLEMENTATION_CONFIGURATION_NAME).extendsFrom(aggregatedConfiguration); - aggregatedConfiguration.defaultDependencies(new Action() { - @Override - public void execute(DependencySet defaultDependencies) { - project.getGradle().getRootProject().subprojects(new Action() { - @Override - public void execute(Project subproject) { - subproject.getPlugins().withType(JavadocPlugin.class, new Action() { - @Override - public void execute(JavadocPlugin javadoc) { - Dependency dependency = project.getDependencies() - .create(subproject); - defaultDependencies.add(dependency); - } - }); - } - }); - } - }); + aggregatedConfiguration.defaultDependencies(new AggregatedDependencies(project)::apply); return aggregatedConfiguration; } private Configuration sourcesPath(Project project, Configuration aggregatedConfiguration) { ConfigurationContainer configurations = project.getConfigurations(); - return configurations.create("sourcesPath", new Action() { - @Override - public void execute(Configuration sourcesPath) { - sourcesPath.setCanBeResolved(true); - sourcesPath.setCanBeConsumed(false); - sourcesPath.extendsFrom(aggregatedConfiguration); - sourcesPath.attributes(new Action() { - @Override - public void execute(AttributeContainer attributes) { - ObjectFactory objects = project.getObjects(); - attributes.attribute( - Usage.USAGE_ATTRIBUTE, objects.named(Usage.class, Usage.JAVA_RUNTIME)); - attributes.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.class, Category.DOCUMENTATION)); - attributes.attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType.class, DocsType.SOURCES)); - attributes.attribute( - Attribute.of("org.gradle.docselements", String.class), "sources"); - } - }); - sourcesPath.outgoing(new Action() { - @Override - public void execute( - ConfigurationPublications publications) { - JavaPluginConvention javaPlugin = project.getConvention() - .getPlugin(JavaPluginConvention.class); - SourceSet mainSrc = javaPlugin.getSourceSets() - .getByName(SourceSet.MAIN_SOURCE_SET_NAME); - mainSrc.getAllJava().getSrcDirs().forEach(new Consumer() { - @Override - public void accept(File file) { - publications.artifact(file); - } - }); - } - }); - } + return configurations.create("sourcesPath", (sourcesPath) -> { + sourcesPath.setCanBeResolved(true); + sourcesPath.setCanBeConsumed(false); + sourcesPath.extendsFrom(aggregatedConfiguration); + sourcesPath.attributes(attributes -> JavadocPlugin.addAttributes(project, attributes)); + sourcesPath.outgoing(publications -> JavadocPlugin.addOutgoing(project, publications)); }); } - private void aggregatedJavadoc(Project project, Configuration sourcesPath, Configuration aggregatedConfiguration) { - project.getTasks().create(AGGREGATE_JAVADOC_TASK_NAME, Javadoc.class, new Action() { - @Override - public void execute(Javadoc javadoc) { - javadoc.setGroup("Documentation"); - javadoc.setDescription("Generates the aggregate Javadoc"); - ConfigurationContainer configurations = project.getConfigurations(); - javadoc.setSource(sourcesPath); - javadoc.setClasspath(aggregatedConfiguration); - } - }); + private static class JavadocTask implements Action{ + + private final Configuration sourcesPath; + + private final Configuration aggregatedConfiguration; + + JavadocTask(Configuration sourcesPath, Configuration aggregatedConfiguration) { + this.sourcesPath = sourcesPath; + this.aggregatedConfiguration=aggregatedConfiguration; + } + + @Override + public void execute(Javadoc javadoc) { + javadoc.setGroup("Documentation"); + javadoc.setDescription("Generates the aggregate Javadoc"); + javadoc.setSource(sourcesPath); + javadoc.setClasspath(aggregatedConfiguration); + } + } + + private static class AggregatedDependencies { + + private final Project project; + + public AggregatedDependencies(Project project) { + this.project = project; + } + + public void apply(DependencySet defaultDependencies) { + project.getGradle().getRootProject().subprojects(subproject -> apply(defaultDependencies, subproject)); + } + + private void apply(DependencySet defaultDependencies, Project subproject) { + subproject.getPlugins().withType(JavadocPlugin.class, (javadocPlugin) -> { + Dependency subprojectDependency = this.project.getDependencies().create(subproject); + defaultDependencies.add(subprojectDependency); + }); + } + + } + } diff --git a/src/main/java/io/spring/gradle/javadoc/JavadocPlugin.java b/src/main/java/io/spring/gradle/javadoc/JavadocPlugin.java index d3a7482..304ee4f 100644 --- a/src/main/java/io/spring/gradle/javadoc/JavadocPlugin.java +++ b/src/main/java/io/spring/gradle/javadoc/JavadocPlugin.java @@ -1,9 +1,7 @@ package io.spring.gradle.javadoc; -import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; import org.gradle.api.artifacts.ConfigurationPublications; import org.gradle.api.attributes.Attribute; import org.gradle.api.attributes.AttributeContainer; @@ -15,53 +13,41 @@ import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; -import java.io.File; -import java.util.function.Consumer; - /** + * Plugin used to indicate that a project is a memeber of the aggregate Javadoc. + * * @author Rob Winch */ public class JavadocPlugin implements Plugin { + + private static final Attribute DOCS_ELEMENTS_ATTRIBUTE = Attribute.of("org.gradle.docselements", String.class); + @Override public void apply(Project project) { - project.getPlugins().withType(JavaPlugin.class).all((javaPlugin) -> { - withSourcesElements(project); - }); + project.getPlugins().withType(JavaPlugin.class).all((plugin) -> createSourcesElements(project)); } - private void withSourcesElements(Project project) { - project.getConfigurations().create("sourcesElements", new Action() { - @Override - public void execute(Configuration config) { - config.setCanBeResolved(false); - config.setCanBeConsumed(true); - config.attributes(new Action() { - @Override - public void execute(AttributeContainer attributes) { - ObjectFactory objects = project.getObjects(); - attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.class, Usage.JAVA_RUNTIME)); - attributes.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.class, Category.DOCUMENTATION)); - attributes.attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType.class, DocsType.SOURCES)); - attributes.attribute(Attribute.of("org.gradle.docselements", String.class), "sources"); - } - }); - config.outgoing(new Action() { - @Override - public void execute( - ConfigurationPublications publications) { - JavaPluginConvention javaPlugin = project.getConvention() - .getPlugin(JavaPluginConvention.class); - SourceSet mainSrc = javaPlugin.getSourceSets() - .getByName(SourceSet.MAIN_SOURCE_SET_NAME); - mainSrc.getAllJava().getSrcDirs().forEach(new Consumer() { - @Override - public void accept(File file) { - publications.artifact(file); - } - }); - } - }); - } + private void createSourcesElements(Project project) { + project.getConfigurations().create("sourcesElements", (configuration) -> { + configuration.setCanBeResolved(false); + configuration.setCanBeConsumed(true); + configuration.attributes((attributes) -> addAttributes(project, attributes)); + configuration.outgoing((publications) -> addOutgoing(project, publications)); }); } + + static void addAttributes(Project project, AttributeContainer attributes) { + ObjectFactory objects = project.getObjects(); + attributes.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.class, Usage.JAVA_RUNTIME)); + attributes.attribute(Category.CATEGORY_ATTRIBUTE, objects.named(Category.class, Category.DOCUMENTATION)); + attributes.attribute(DocsType.DOCS_TYPE_ATTRIBUTE, objects.named(DocsType.class, DocsType.SOURCES)); + attributes.attribute(DOCS_ELEMENTS_ATTRIBUTE, "sources"); + } + + static void addOutgoing(Project project, ConfigurationPublications publications) { + JavaPluginConvention javaPlugin = project.getConvention().getPlugin(JavaPluginConvention.class); + SourceSet mainSrc = javaPlugin.getSourceSets().getByName(SourceSet.MAIN_SOURCE_SET_NAME); + mainSrc.getAllJava().getSrcDirs().forEach(publications::artifact); + } + }