package org.anarres.gradle.plugin.velocity; import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.Callable; import javax.annotation.Nonnull; import javax.inject.Inject; import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.internal.file.FileResolver; import org.gradle.api.internal.plugins.DslObject; import org.gradle.api.plugins.JavaPluginConvention; import org.gradle.api.tasks.SourceSet; /** * The velocity plugin. * * This creates a default configuration which preprocesses files * according to the VelocityPluginExtension. * * @author shevek */ public class VelocityPlugin implements Plugin<Project> { private final FileResolver fileResolver; @Inject public VelocityPlugin(FileResolver fileResolver) { this.fileResolver = fileResolver; } @Override public void apply(final Project project) { final VelocityPluginExtension extension = project.getExtensions().create("velocity", VelocityPluginExtension.class); project.getConvention().getPlugin(JavaPluginConvention.class).getSourceSets().all( new Action<SourceSet>() { @Override public void execute(SourceSet t) { apply(project, t, extension); } }); } private void apply(@Nonnull final Project project, @Nonnull SourceSet sourceSet, @Nonnull final VelocityPluginExtension extension) { final VelocitySourceSet velocitySourceSet = new VelocitySourceSet(sourceSet.getName(), fileResolver); new DslObject(sourceSet).getConvention().getPlugins().put("velocity", velocitySourceSet); final String srcDir = String.format("src/%s/velocity", sourceSet.getName()); velocitySourceSet.getVelocity().srcDir(srcDir); sourceSet.getAllSource().source(velocitySourceSet.getVelocity()); final String velocityTaskName = sourceSet.getTaskName("process", "Velocity"); VelocityTask velocityTask = project.getTasks().create(velocityTaskName, VelocityTask.class, new Action<VelocityTask>() { @Override public void execute(VelocityTask task) { task.setDescription("Preprocesses velocity template files."); task.conventionMapping("includeDirs", new Callable<List<File>>() { @Override public List<File> call() { List<Object> includeDirs = extension.includeDirs; if (includeDirs == null) return null; List<File> out = new ArrayList<File>(); for (Object includeDir : includeDirs) out.add(project.file(includeDir)); return out; } }); task.conventionMapping("contextValues", new Callable<Map<String, Object>>() { @Override public Map<String, Object> call() { return extension.contextValues; } }); } }); velocityTask.setSource(velocitySourceSet.getVelocity()); final String outputDirectoryName = String.format("%s/generated-sources/antlr/%s", project.getBuildDir(), sourceSet.getName()); File outputDir = new File(outputDirectoryName); velocityTask.setOutputDir(outputDir); sourceSet.getJava().srcDir(outputDir); project.getTasks().getByName(sourceSet.getCompileJavaTaskName()).dependsOn(velocityTask); } }