package com.prezi.spaghetti.gradle; import com.google.common.base.Function; import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import com.prezi.spaghetti.bundle.ModuleBundle; import com.prezi.spaghetti.bundle.ModuleBundleFactory; import com.prezi.spaghetti.bundle.ModuleBundleElement; import com.prezi.spaghetti.gradle.internal.AbstractBundleModuleTask; import com.prezi.spaghetti.packaging.ModulePackageParameters; import com.prezi.spaghetti.packaging.ModuleType; import org.gradle.api.file.ConfigurableFileCollection; import org.gradle.api.internal.ConventionTask; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.InputDirectory; import org.gradle.api.tasks.InputFiles; import org.gradle.api.tasks.OutputDirectory; import org.gradle.api.tasks.TaskAction; import java.io.File; import java.io.IOException; import java.util.Arrays; import java.util.EnumSet; import java.util.concurrent.Callable; import static com.prezi.spaghetti.gradle.internal.TextFileUtils.getText; @SuppressWarnings("UnusedDeclaration") public class PackageModule extends ConventionTask { private final ConfigurableFileCollection prefixes = getProject().files(); private final ConfigurableFileCollection suffixes = getProject().files(); private Object bundle; private EnumSet<ModuleBundleElement> elements = ModulePackageParameters.DEFAULT_ELEMENTS; private ModuleType type = ModuleType.COMMON_JS; private File outputDirectory; public void setBundle(Object bundle) { if (bundle instanceof AbstractBundleModuleTask) { dependsOn(bundle); } this.bundle = bundle; } public void bundle(Object bundle) { setBundle(bundle); } @InputDirectory public File getBundle() { if (bundle instanceof AbstractBundleModuleTask) { return ((AbstractBundleModuleTask) bundle).getOutputDirectory(); } else { return getProject().file(bundle); } } @InputFiles public ConfigurableFileCollection getPrefixes() { return prefixes; } public void prefixes(Object... prefixes) { this.getPrefixes().from(prefixes); } public void prefix(Object... prefixes) { this.prefixes(prefixes); } @InputFiles public ConfigurableFileCollection getSuffixes() { return suffixes; } public void suffixes(Object... suffixes) { this.getSuffixes().from(suffixes); } public void suffix(Object... suffixes) { this.suffixes(suffixes); } @Input @SuppressWarnings("UnusedDeclaration") public EnumSet<ModuleBundleElement> getElements() { return elements; } @SuppressWarnings("UnusedDeclaration") public void elements(Object... elementObjects) { Iterable<ModuleBundleElement> elements = Iterables.transform(Arrays.asList(elementObjects), new Function<Object, ModuleBundleElement>() { @Override public ModuleBundleElement apply(final Object elemObject) { if (elemObject instanceof String) { return ModuleBundleElement.valueOf((String) elemObject); } else if (elemObject instanceof ModuleBundleElement) { return (ModuleBundleElement) elemObject; } else { throw new IllegalArgumentException("Unknwon module bundle element: " + String.valueOf(elemObject)); } } }); this.elements = Sets.newEnumSet(elements, ModuleBundleElement.class); } @Input public ModuleType getType() { return type; } public void type(String type) { setType(type); } public void setType(String typeName) { this.type = ModuleType.fromString(typeName); } @OutputDirectory public File getOutputDirectory() { return outputDirectory; } public void setOutputDirectory(Object outputDirectory) { this.outputDirectory = getProject().file(outputDirectory); } public void outputDirectory(Object outputDirectory) { setOutputDirectory(outputDirectory); } @SuppressWarnings("UnusedDeclaration") public File getModuleFile() throws IOException { ModuleBundle bundle = ModuleBundleFactory.load(getBundle()); return new File(getOutputDirectory(), getType().getPackager().getModuleName(bundle)); } @SuppressWarnings("UnusedDeclaration") public PackageModule() { this.getConventionMapping().map("outputDirectory", new Callable<File>() { @Override public File call() throws Exception { return new File(getProject().getBuildDir(), "spaghetti/module"); } }); } @TaskAction @SuppressWarnings("UnusedDeclaration") public void makeBundle() throws IOException { getLogger().info("Creating {} module in {}", getType().getDescription(), getOutputDirectory()); ModuleBundle bundle = ModuleBundleFactory.load(getBundle()); ModulePackageParameters params = new ModulePackageParameters(bundle, getText(getPrefixes()), getText(getSuffixes())); getType().getPackager().packageModuleDirectory(getOutputDirectory(), params); } }