package com.bladecoder.engineeditor.setup;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.List;
import com.bladecoder.engineeditor.setup.DependencyBank.ProjectType;
public class BuildScriptHelper {
private static int indent = 0;
public static void addBuildScript(List<ProjectType> projects, BufferedWriter wr) throws IOException {
write(wr, "buildscript {");
// repos
write(wr, "repositories {");
write(wr, DependencyBank.mavenCentral);
write(wr, DependencyBank.jCenter);
write(wr, "}");
// dependencies
write(wr, "dependencies {");
if (projects.contains(ProjectType.HTML)) {
write(wr, "classpath \"" + DependencyBank.gwtPluginImport + "\"");
}
if (projects.contains(ProjectType.ANDROID)) {
write(wr, "classpath \"" + DependencyBank.androidPluginImport + "\"");
}
if (projects.contains(ProjectType.IOS)) {
write(wr,
"classpath \"" + DependencyBank.roboVMPluginImport + "\"");
}
write(wr, "}");
write(wr, "}");
space(wr);
}
public static void addAllProjects(BufferedWriter wr) throws IOException {
write(wr, "allprojects {");
write(wr, "apply plugin: \"eclipse\"");
write(wr, "apply plugin: \"idea\"");
space(wr);
write(wr, "repositories {");
write(wr, DependencyBank.mavenCentral);
write(wr, "maven { url \"" + DependencyBank.libGDXSnapshotsUrl + "\" }");
write(wr, "maven { url \"" + DependencyBank.libGDXReleaseUrl + "\" }");
write(wr, "}");
space(wr);
write(wr, " task setVersion << {");
write(wr, " println \"Set version $project.version in BladeEngine.properties\"");
space(wr);
write(wr, " def props = new Properties()");
write(wr, " def propFile = project.file(\"../android/assets/BladeEngine.properties\");");
write(wr, " props.load(new FileReader(propFile))");
write(wr, " props.\"version\" = version");
write(wr, " props.\"bladeEngineVersion\" = bladeEngineVersion");
write(wr, " props.\"gdxVersion\" = gdxVersion");
write(wr, " props.\"roboVMVersion\" = roboVMVersion");
space(wr);
write(wr, " def writer = new FileWriter(propFile)");
write(wr, " try {");
write(wr, " props.store(writer, null)");
write(wr, " writer.flush()");
write(wr, " } finally {");
write(wr, " writer.close()");
write(wr, " }");
write(wr, " }");
space(wr);
write(wr, "}");
}
public static void addProject(ProjectType project, List<Dependency> dependencies, BufferedWriter wr)
throws IOException {
space(wr);
write(wr, "project(\":" + project.getName() + "\") {");
for (String plugin : project.getPlugins()) {
write(wr, "apply plugin: \"" + plugin + "\"");
}
space(wr);
addConfigurations(project, wr);
space(wr);
addDependencies(project, dependencies, wr);
space(wr);
if (project.equals(ProjectType.CORE)) {
write(wr, " processResources.finalizedBy(setVersion)");
space(wr);
} else if (project.equals(ProjectType.ANDROID)) {
write(wr, " preBuild.finalizedBy(setVersion)");
space(wr);
}
write(wr, "}");
}
private static void addDependencies(ProjectType project, List<Dependency> dependencyList, BufferedWriter wr)
throws IOException {
write(wr, "dependencies {");
if (!project.equals(ProjectType.CORE)) {
write(wr, "compile project(\":" + ProjectType.CORE.getName() + "\")");
}
for (Dependency dep : dependencyList) {
if (dep.getDependencies(project) == null)
continue;
for (String moduleDependency : dep.getDependencies(project)) {
if (moduleDependency == null)
continue;
if ((project.equals(ProjectType.ANDROID)) && moduleDependency.contains("native")) {
write(wr, "natives \"" + moduleDependency + "\"");
} else {
if (moduleDependency.startsWith("fileTree("))
write(wr, "compile " + moduleDependency);
else
write(wr, "compile \"" + moduleDependency + "\"");
}
}
}
write(wr, "}");
}
private static void addConfigurations(ProjectType project, BufferedWriter wr) throws IOException {
if (project.equals(ProjectType.IOS) || project.equals(ProjectType.ANDROID)) {
write(wr, "configurations { natives }");
}
}
private static void write(BufferedWriter wr, String input) throws IOException {
int delta = StringUtils.countMatches(input, '{') - StringUtils.countMatches(input, '}');
indent += delta *= 4;
indent = clamp(indent);
if (delta > 0) {
wr.write(StringUtils.repeat(" ", clamp(indent - 4)) + input + "\n");
} else if (delta < 0) {
wr.write(StringUtils.repeat(" ", clamp(indent)) + input + "\n");
} else {
wr.write(StringUtils.repeat(" ", indent) + input + "\n");
}
}
private static void space(BufferedWriter wr) throws IOException {
wr.write("\n");
}
private static int clamp(int indent) {
if (indent < 0) {
return 0;
}
return indent;
}
static class StringUtils {
public static int countMatches(String input, char match) {
int count = 0;
for (int i = 0; i < input.length(); i++) {
if (input.charAt(i) == match) {
count++;
}
}
return count;
}
public static String repeat(String toRepeat, int count) {
String repeat = "";
for (int i = 0; i < count; i++) {
repeat += toRepeat;
}
return repeat;
}
}
}