package com.github.jarlakxen.scala.sbt.builder;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import com.github.jarlakxen.scala.sbt.SbtVersion;
import com.github.jarlakxen.scala.sbt.ScalaVersion;
import com.github.jarlakxen.scala.sbt.wizard.create.SbtWizard;
/**
* TemplateBuilder for SBT files
*
* @see SbtWizard
* @author Facundo Viale
*/
public class TemplateBuilder {
private static final String BR = System.getProperty("line.separator");
// Template for build.sbt
public static SbtTemplateBuilder createSbtTemplate() {
return new SbtTemplateBuilder();
}
public static class SbtTemplateBuilder {
private ScalaVersion scalaVersion;
private String organization;
private String projectName;
private String productVersion;
private TestLibrary testLibrary;
private boolean webNature = false;
private SbtTemplateBuilder() {
}
public SbtTemplateBuilder scalaVersion(ScalaVersion scalaVersion) {
this.scalaVersion = scalaVersion;
return this;
}
public SbtTemplateBuilder organization(String organization) {
this.organization = organization;
return this;
}
public SbtTemplateBuilder projectName(String projectName) {
this.projectName = projectName;
return this;
}
public SbtTemplateBuilder productVersion(String productVersion) {
this.productVersion = productVersion;
return this;
}
public SbtTemplateBuilder testLibrary(TestLibrary testLibrary) {
this.testLibrary = testLibrary;
return this;
}
public SbtTemplateBuilder webNature(boolean webNature) {
this.webNature = webNature;
return this;
}
public String build() {
StringBuilder builder = new StringBuilder();
builder.append("name := \"").append(projectName).append("\"").append(BR).append(BR);
builder.append("organization := \"").append(organization).append("\"").append(BR).append(BR);
builder.append("version := \"").append(productVersion).append("\"").append(BR).append(BR);
builder.append("scalaVersion := \"").append(scalaVersion.getText()).append("\"").append(BR).append(BR);
builder.append("scalacOptions <++= scalaVersion map { v =>").append(BR);
builder.append("\tif (v.startsWith(\"2.10\"))").append(BR);
builder.append(
"\t\tSeq(\"-unchecked\", \"-deprecation\", \"-feature\", \"-language:implicitConversions\", \"-language:postfixOps\", \"-language:existentials\" )")
.append(BR);
builder.append("\telse").append(BR);
builder.append("\t\tSeq(\"-unchecked\", \"-deprecation\" )").append(BR);
builder.append("}").append(BR).append(BR);
builder.append("EclipseKeys.createSrc := EclipseCreateSrc.Default + EclipseCreateSrc.Resource").append(BR).append(BR);
builder.append("EclipseKeys.withSource := true").append(BR).append(BR);
if (webNature) {
builder.append("seq(webSettings :_*)").append(BR).append(BR);
}
List<String> libraryDependencies = new ArrayList<String>();
if (testLibrary != null) {
libraryDependencies.add( testLibrary.getDependancy(scalaVersion));
}
if (webNature) {
libraryDependencies.add( "\"org.mortbay.jetty\" % \"jetty\" % \"6.1.22\" % \"container\"");
}
builder.append("libraryDependencies ++= Seq(");
if (!libraryDependencies.isEmpty()) {
builder.append(BR).append(StringUtils.join(libraryDependencies, "," + BR )).append(BR);
}
builder.append(")").append(BR).append(BR);
return builder.toString();
}
}
// Template for project/build.properties
public static SbtPropertiesTemplateBuilder createSbtPropertiesTemplate() {
return new SbtPropertiesTemplateBuilder();
}
public static class SbtPropertiesTemplateBuilder {
private SbtVersion sbtVersion;
private String organization;
private String projectName;
private SbtPropertiesTemplateBuilder() {
}
public SbtPropertiesTemplateBuilder sbtVersion(SbtVersion sbtVersion) {
this.sbtVersion = sbtVersion;
return this;
}
public SbtPropertiesTemplateBuilder organization(String organization) {
this.organization = organization;
return this;
}
public SbtPropertiesTemplateBuilder projectName(String projectName) {
this.projectName = projectName;
return this;
}
public String build() {
StringBuilder builder = new StringBuilder();
builder.append("sbt.version=").append(sbtVersion.getLastVersion()).append(BR);
builder.append("project.organization=").append(organization).append(BR);
builder.append("project.name=").append(projectName).append(BR);
return builder.toString();
}
}
// Template for project/plugins.sbt
public static SbtPluginsTemplateBuilder createSbtPluginsTemplate() {
return new SbtPluginsTemplateBuilder();
}
public static class SbtPluginsTemplateBuilder {
private boolean webNature = false;
private SbtPluginsTemplateBuilder() {
}
public SbtPluginsTemplateBuilder webNature(boolean webNature) {
this.webNature = webNature;
return this;
}
public String fill(String pluginsFile) {
String pluginsFileLines[] = pluginsFile.split("[\\r?\\n]+");
for (String necesaryLines : build().split("[\\r?\\n]+")) {
boolean isNecesaryLinePresent = false;
for (String currentLine : pluginsFileLines) {
if (currentLine.startsWith(necesaryLines.substring(0, necesaryLines.lastIndexOf("%")))) {
isNecesaryLinePresent = true;
break;
}
}
if (isNecesaryLinePresent) {
pluginsFile = pluginsFile + BR + BR + necesaryLines;
}
}
return pluginsFile;
}
public String build() {
StringBuilder builder = new StringBuilder();
builder.append("addSbtPlugin(\"com.timushev.sbt\" % \"sbt-updates\" % \"0.1.2\")");
builder.append(BR);
builder.append(BR);
builder.append("addSbtPlugin(\"com.typesafe.sbteclipse\" % \"sbteclipse-plugin\" % \"2.3.0\")");
if (webNature) {
builder.append(BR);
builder.append(BR);
builder.append("addSbtPlugin(\"com.earldouglas\" % \"xsbt-web-plugin\" % \"0.4.2\")");
}
return builder.toString();
}
}
}