package com.prezi.haxe.gradle;
import com.prezi.haxe.gradle.incubating.LanguageSourceSet;
import org.apache.commons.io.FileUtils;
import org.gradle.api.DomainObjectSet;
import org.gradle.api.tasks.Optional;
import org.gradle.api.tasks.OutputDirectory;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Set;
public class HaxeCompile extends AbstractHaxeCompileTask {
private File outputFile;
private File outputDirectory;
@TaskAction
public void compile() throws IOException, InterruptedException {
List<String> cmd = getHaxeCommandToExecute();
CommandExecutor.execute(cmd, getProject().getProjectDir(), new DefaultExecutionResultHandler(cmd));
}
public List<String> getHaxeCommandToExecute() throws IOException {
return configureHaxeCommandBuilder(getAndRecreateOutput(), getSourceSets()).build();
}
protected HaxeCommandBuilder configureHaxeCommandBuilder(File output, DomainObjectSet<LanguageSourceSet> sources) {
return new HaxeCommandBuilder(getProject(), "haxe")
.withMain(getMainClass())
.withTarget(getTargetPlatform(), output)
.withSources(getSourceDirectories(sources))
.withSourceSets(sources, getEmbeddedResources())
.withMacros(getMacros())
.withIncludes(getIncludes())
.withExcludes(getExcludes())
.withFlags(getFlagList())
.withDebugFlags(isDebug());
}
protected Set<File> getSourceDirectories(DomainObjectSet<LanguageSourceSet> sources) {
return AbstractHaxeCompileTask.getAllSourceDirectories(sources);
}
protected String getMainClass() {
return getMain();
}
@OutputFile
@Optional
public File getOutputFile() {
return outputFile;
}
public void setOutputFile(Object file) {
this.outputFile = getProject().file(file);
}
public void outputFile(Object file) {
setOutputFile(file);
}
@OutputDirectory
@Optional
public File getOutputDirectory() {
return outputDirectory;
}
public void setOutputDirectory(Object directory) {
this.outputDirectory = getProject().file(directory);
}
public void outputDirectory(Object directory) {
setOutputDirectory(directory);
}
private File getAndRecreateOutput() throws IOException {
File output;
File dirToMake;
if (isOutputInADirectory()) {
output = getOutputDirectory();
FileUtils.deleteDirectory(output);
dirToMake = output;
} else {
output = getOutputFile();
output.delete();
dirToMake = output.getParentFile();
}
FileUtils.forceMkdir(dirToMake);
return output;
}
private boolean isOutputInADirectory() {
if (getOutputFile() != null) {
return false;
}
if (getOutputDirectory() != null) {
return true;
}
throw new RuntimeException("Neither output file or directory is set");
}
}