package com.prezi.grub.gradle; import com.google.common.base.Charsets; import com.google.common.base.Throwables; import com.prezi.grub.gradle.config.ParameterContainer; import org.gradle.api.Action; import org.gradle.api.Plugin; import org.gradle.api.Project; import org.gradle.api.Task; import org.gradle.api.plugins.ExtraPropertiesExtension; import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.util.Map; public class GrubPlugin implements Plugin<Project> { public static final String GENERATE_TASK = "generate"; public static final String DEFAULT_PROCESS_FILES_TASK = "processDefaultTemplateFiles"; public static final String TEMPLATE_PROPERTY = "template"; public static final String DEFAULT_TEMPLATE_LOCATION = "src/main/grub"; @Override public void apply(Project project) { final ParameterContainer parameters = project.getExtensions().create("parameters", ParameterContainer.class); project.afterEvaluate(new Action<Project>() { @Override public void execute(Project project) { ExtraPropertiesExtension extraProperties = project.getExtensions().getExtraProperties(); Reader reader = new InputStreamReader(System.in, Charsets.UTF_8); try { Map<String, Object> resolved = parameters.resolve(reader); for (Map.Entry<String, Object> entry : resolved.entrySet()) { extraProperties.set(entry.getKey(), entry.getValue()); } } catch (IOException e) { Throwables.propagate(e); } } }); ProcessFiles processDefaultTemplateFiles = project.getTasks().create(DEFAULT_PROCESS_FILES_TASK, ProcessFiles.class); processDefaultTemplateFiles.setTemplateDirectory(project.file(project.property(TEMPLATE_PROPERTY) + "/" + DEFAULT_TEMPLATE_LOCATION)); processDefaultTemplateFiles.setTargetDirectory(project.getProjectDir()); Task generateTask = project.getTasks().create(GENERATE_TASK); generateTask.dependsOn(processDefaultTemplateFiles); } }