package org.webpieces.gradle.compiler; import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.file.FileTreeElement; import org.gradle.api.internal.file.SourceDirectorySetFactory; import org.gradle.api.internal.plugins.DslObject; import org.gradle.api.internal.project.ProjectInternal; import org.gradle.api.internal.tasks.DefaultSourceSet; import org.gradle.api.plugins.JavaBasePlugin; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.specs.Spec; import org.gradle.api.tasks.SourceSet; public class TemplateCompilerPlugin implements Plugin<ProjectInternal> { private final SourceDirectorySetFactory sourceDirectorySetFactory; @Inject public TemplateCompilerPlugin(SourceDirectorySetFactory sourceDirectorySetFactory) { this.sourceDirectorySetFactory = sourceDirectorySetFactory; } @Override public void apply(ProjectInternal project) { project.getExtensions().create("compileTemplateSetting", TemplateCompileOptions.class); project.getPluginManager().apply(JavaBasePlugin.class); JavaBasePlugin javaBasePlugin = project.getPlugins().getPlugin(JavaBasePlugin.class); configureSourceSetDefaults(project, javaBasePlugin); } private void configureSourceSetDefaults(Project project, final JavaBasePlugin javaBasePlugin) { project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().all(new CompileAction(project, javaBasePlugin)); } private class CompileAction implements Action<SourceSet> { private Project project; private JavaBasePlugin javaBasePlugin; public CompileAction(Project project, JavaBasePlugin javaBasePlugin) { this.project = project; this.javaBasePlugin = javaBasePlugin; } public void execute(SourceSet sourceSet) { final DefaultTemplateSourceSet templateSourceSet = new DefaultTemplateSourceSet(((DefaultSourceSet) sourceSet).getDisplayName(), sourceDirectorySetFactory); new DslObject(sourceSet).getConvention().getPlugins().put("templates", templateSourceSet); templateSourceSet.getTemplatesSrc().srcDir("src/"+sourceSet.getName()+"/java"); sourceSet.getResources().getFilter().exclude(new Spec<FileTreeElement>() { public boolean isSatisfiedBy(FileTreeElement element) { return templateSourceSet.getTemplatesSrc().contains(element.getFile()); } }); sourceSet.getAllJava().source(templateSourceSet.getTemplatesSrc()); sourceSet.getAllSource().source(templateSourceSet.getTemplatesSrc()); String compileTaskName = sourceSet.getCompileTaskName("templates"); TemplateCompilerTask compile = project.getTasks().create(compileTaskName, TemplateCompilerTask.class); javaBasePlugin.configureForSourceSet(sourceSet, compile); compile.setGroup("Build"); compile.setDescription("Compiles the " + sourceSet.getName() + " Html or other template files source."); compile.dependsOn(sourceSet.getCompileJavaTaskName()); compile.setSource(templateSourceSet.getTemplatesSrc()); project.getTasks().getByName(sourceSet.getClassesTaskName()).dependsOn(compileTaskName); } } }