Skip to content

Replace anonymous classes with lambdas #6

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -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/
Expand Down
133 changes: 54 additions & 79 deletions src/main/java/io/spring/gradle/javadoc/AggregateJavadocPlugin.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Project> {

public static final String AGGREGATE_JAVADOC_TASK_NAME = "aggregateJavadoc";

public static final String AGGREGATE_JAVADOC_CLASSPATH_CONFIGURATION_NAME = "aggregateJavadocClasspath";
Expand All @@ -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<DependencySet>() {
@Override
public void execute(DependencySet defaultDependencies) {
project.getGradle().getRootProject().subprojects(new Action<Project>() {
@Override
public void execute(Project subproject) {
subproject.getPlugins().withType(JavadocPlugin.class, new Action<JavadocPlugin>() {
@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<Configuration>() {
@Override
public void execute(Configuration sourcesPath) {
sourcesPath.setCanBeResolved(true);
sourcesPath.setCanBeConsumed(false);
sourcesPath.extendsFrom(aggregatedConfiguration);
sourcesPath.attributes(new Action<AttributeContainer>() {
@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<ConfigurationPublications>() {
@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<File>() {
@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<Javadoc>() {
@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<Javadoc>{

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

}

}
68 changes: 27 additions & 41 deletions src/main/java/io/spring/gradle/javadoc/JavadocPlugin.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<Project> {

private static final Attribute<String> 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<Configuration>() {
@Override
public void execute(Configuration config) {
config.setCanBeResolved(false);
config.setCanBeConsumed(true);
config.attributes(new Action<AttributeContainer>() {
@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<ConfigurationPublications>() {
@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<File>() {
@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);
}

}