package de.saumya.mojo.tests;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
public abstract class AbstractMavenTestScriptFactory extends AbstractTestScriptFactory {
public String getFullScript() throws MalformedURLException {
StringBuilder builder = new StringBuilder();
getInterpreterScript(builder);
getPrologScript(builder);
getRubygemsSetupScript(builder);
getSystemPropertiesScript(builder);
builder.append(getPluginClasspathScript());
getTestClasspathSetupScript(builder);
getConstantsConfigScript(builder);
getRunnerScript(builder);
getResultsScript(builder);
return builder.toString();
}
private void getSystemPropertiesScript(StringBuilder builder) {
if (systemProperties.keySet().isEmpty()) {
return;
}
builder.append("# Set up system-properties for running outside of maven\n");
builder.append("\n");
for (Object propName : systemProperties.keySet()) {
String propValue = systemProperties.getProperty(propName.toString());
builder.append("Java::java.lang::System.setProperty( %q(" + propName.toString() + "), %q(" + propValue + ") )\n");
}
builder.append("\n");
}
private void getConstantsConfigScript(StringBuilder builder) {
builder.append("# Constants used for configuration and execution\n");
builder.append("\n");
builder.append("BASE_DIR=%q(" + sanitize(baseDir.getAbsolutePath()) + ")\n");
builder.append("SOURCE_DIR=%q(" + sanitize(sourceDir.getAbsolutePath()) + ")\n");
builder.append("TARGET_DIR=%q(" + sanitize(outputDir.getAbsolutePath()) + ")\n");
builder.append("REPORT_PATH=%q(" + sanitize(reportPath.getAbsolutePath()) + ")\n");
if (summaryReport != null) {
builder.append("SUMMARY_REPORT=%q(" + sanitize(summaryReport.getAbsolutePath()) + ")\n");
}
else {
builder.append("SUMMARY_REPORT=nil\n");
}
builder.append("\n");
builder.append("$: << File.join( BASE_DIR, 'lib' )\n");
builder.append("$: << SOURCE_DIR.sub( /\\*.*$/, '' )\n");
builder.append("\n");
}
protected abstract void getRunnerScript(StringBuilder builder);
public String getCoreScript() {
StringBuilder builder = new StringBuilder();
getPrologScript(builder);
getConstantsConfigScript(builder);
getRunnerScript(builder);
return builder.toString();
}
protected void getResultsScript(StringBuilder builder) {
builder.append("exit RESULT if defined? RESULT\n");
builder.append("\n");
builder.append("# A little exit code magic\n");
builder.append("\n");
builder.append("if File.new(REPORT_PATH, 'r').read =~ /, 0 failures/ \n");
builder.append(" exit 0\n" );
builder.append("else\n");
builder.append(" exit 1\n" );
builder.append("end\n");
builder.append("\n");
}
private void getInterpreterScript(StringBuilder builder) {
builder.append("#!/usr/bin/env jruby\n");
builder.append("\n");
}
private void getPrologScript(StringBuilder builder) {
builder.append("require %(java)\n");
builder.append("require %(jruby)\n");
builder.append("\n");
}
private void getRubygemsSetupScript(StringBuilder builder) {
if (gemHome == null && gemPaths == null) {
return;
}
builder.append("# Set up GEM_HOME and GEM_PATH for running outside of maven\n");
builder.append("\n");
if (gemHome != null) {
builder.append("ENV['GEM_HOME']=%q(" + gemHome + ")\n");
}
if (gemPaths != null) {
builder.append("ENV['GEM_PATH']=%q(");
String separator = "";
for(File path: gemPaths) {
builder.append(separator + path);
if (separator.length() == 0){
separator = System.getProperty("path.separator");
}
}
builder.append(")\n");
}
builder.append("\n");
}
private void getTestClasspathSetupScript(StringBuilder builder) {
builder.append("# Set up the classpath for running outside of maven\n");
builder.append("\n");
builder.append("def add_classpath_element(element)\n");
builder.append(" JRuby.runtime.jruby_class_loader.addURL( Java::java.net::URL.new( element ) )\n");
builder.append("end\n");
builder.append("\n");
for (String path : classpathElements) {
if (!(path.endsWith("jar") || path.endsWith("/"))) {
path = path + "/";
}
builder.append("add_classpath_element(%Q( file://" + sanitize(path) + " ))\n");
}
builder.append("\n");
}
private String sanitize(String path) {
String sanitized = path.replaceAll( "\\\\", "/" );
if ( sanitized.matches( "^[a-z]:.*" ) ) {
sanitized = sanitized.substring(0,1).toUpperCase() + sanitized.substring(1);
}
return sanitized;
}
protected String getPluginClasspathScript() {
String pathToClass = getClass().getName().replaceAll("\\.", "/") + ".class";
URL here = getClass().getClassLoader().getResource(pathToClass);
String herePath = here.getPath();
if (herePath.startsWith("file:")) {
herePath = herePath.substring(5);
int bangLoc = herePath.indexOf("!");
if (bangLoc > 0) {
herePath = herePath.substring(0, bangLoc);
}
}
if (herePath.endsWith(".jar")) {
return "require %q(" + herePath + ")\n";
} else {
return "$: << %q(" + herePath + ")\n";
}
}
}