package com.prezi.spaghetti.gradle;
import com.google.common.collect.Maps;
import com.prezi.spaghetti.bundle.ModuleBundleSet;
import com.prezi.spaghetti.gradle.internal.AbstractSpaghettiTask;
import com.prezi.spaghetti.packaging.ApplicationPackageParameters;
import com.prezi.spaghetti.packaging.ApplicationType;
import org.gradle.api.file.ConfigurableFileCollection;
import org.gradle.api.tasks.Input;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.TaskAction;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.Callable;
import static com.prezi.spaghetti.gradle.internal.TextFileUtils.getText;
public class PackageApplication extends AbstractSpaghettiTask {
private final ConfigurableFileCollection prefixes = getProject().files();
private final ConfigurableFileCollection suffixes = getProject().files();
private String mainModule;
private String applicationName = ApplicationPackageParameters.DEFAULT_APPLICATION_NAME;
private ApplicationType type = ApplicationType.COMMON_JS;
private Boolean execute = null;
private File outputDirectory;
private Map<String, String> externalDependencies = Maps.newLinkedHashMap();
@Input
@Optional
public String getMainModule() {
return mainModule;
}
public void setMainModule(String mainModule) {
this.mainModule = mainModule;
}
@SuppressWarnings("UnusedDeclaration")
public void mainModule(String mainModule) {
setMainModule(mainModule);
}
@Input
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
@SuppressWarnings("UnusedDeclaration")
public void applicationName(String applicationName) {
setApplicationName(applicationName);
}
@InputFiles
public ConfigurableFileCollection getPrefixes() {
return prefixes;
}
public void prefixes(Object... prefixes) {
this.getPrefixes().from(prefixes);
}
@SuppressWarnings("UnusedDeclaration")
public void prefix(Object... prefixes) {
this.prefixes(prefixes);
}
@InputFiles
public ConfigurableFileCollection getSuffixes() {
return suffixes;
}
public void suffixes(Object... suffixes) {
this.getSuffixes().from(suffixes);
}
@SuppressWarnings("UnusedDeclaration")
public void suffix(Object... suffixes) {
this.suffixes(suffixes);
}
@Input
public ApplicationType getType() {
return type;
}
public void type(String type) {
setType(type);
}
public void setType(String type) {
this.type = ApplicationType.fromString(type);
}
@Input
public boolean getExecute() {
return execute != null ? execute : mainModule != null;
}
public void setExecute(boolean execute) {
this.execute = execute;
}
@SuppressWarnings("UnusedDeclaration")
public void execute(boolean execute) {
setExecute(execute);
}
@OutputDirectory
public File getOutputDirectory() {
return outputDirectory;
}
public void setOutputDirectory(Object outputDirectory) {
this.outputDirectory = getProject().file(outputDirectory);
}
public void outputDirectory(Object outputDirectory) {
setOutputDirectory(outputDirectory);
}
@Input
public Map<String, String> getExternalDependencies() {
return externalDependencies;
}
public void setExternalDependencies(Map<String, String> externalDependencies) {
this.externalDependencies = externalDependencies;
}
public void externalDependencies(Map<String, String> externalDependencies) {
this.externalDependencies.putAll(externalDependencies);
}
public void externalDependency(String name, String path) {
this.externalDependencies.put(name, path);
}
@SuppressWarnings("UnusedDeclaration")
public File getApplicationFile() {
return new File(getOutputDirectory(), getApplicationName());
}
public PackageApplication() {
this.getConventionMapping().map("outputDirectory", new Callable<File>() {
@Override
public File call() throws Exception {
return new File(getProject().getBuildDir(), "spaghetti/application");
}
});
if ((execute == Boolean.TRUE) && (mainModule == null)) {
throw new IllegalArgumentException("You need to set mainModule as well when execute is true");
}
}
@TaskAction
@SuppressWarnings("UnusedDeclaration")
public void makeBundle() throws IOException {
ModuleBundleSet bundles = lookupBundles();
getLogger().info("Creating {} application in {}", getType().getDescription(), getOutputDirectory());
getType().getPackager().packageApplicationDirectory(getOutputDirectory(), new ApplicationPackageParameters(
bundles,
getApplicationName(),
getMainModule(),
getExecute(),
getText(getPrefixes()),
getText(getSuffixes()),
getExternalDependencies()
));
}
}