in extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/compiler/JRubyCompiler.java [63:128]
public CompilationResult compile(File sourcePath, File targetPath, List<String> sources)
{
targetPath.mkdirs();
String classPath = ClassLoaderUtils.buildClasspath(ClassLoaderUtils.getDefaultClassLoader());
//capturing stdout technique from http://thinkingdigitally.com/archive/capturing-output-from-puts-in-ruby/
StringBuilder commandString = new StringBuilder();
commandString.append("require 'jruby/jrubyc'\n");
commandString.append("require 'stringio' \n");
commandString.append("module Kernel\n");
commandString.append(" def capture_stdout\n");
commandString.append(" out = StringIO.new\n");
commandString.append(" $stdout = out\n");
commandString.append(" yield\n");
commandString.append(" return out\n");
commandString.append(" ensure\n");
commandString.append(" $stdout = STDOUT\n");
commandString.append(" end\n");
commandString.append("end\n");
commandString.append("out = capture_stdout do\n");
commandString.append(" options = Array.new \n");
commandString.append(" options << '-d" + sourcePath.getAbsolutePath().replaceAll("\\s", "\\\\ ") + "'\n");
commandString.append(" options<< '--javac' \n");
commandString.append(" options<< '-t" + targetPath.getAbsolutePath().replaceAll("\\s", "\\\\ ") + "'\n");
commandString.append(" options<< '-c" + classPath.replaceAll("\\s", "\\\\ ") + "'\n");
for (String singleSource : sources)
{
commandString.append(" options<< '" + singleSource.replaceAll("\\s", "\\\\ ") + "'\n");
}
commandString.append(" $status = JRuby::Compiler::compile_argv(options) \n");
commandString.append("end\n");
commandString.append("$finalOut = out.string\n");
//commandString.append("options<< '" + sources + "'\n");
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName(ENGINE_JRUBY);
if(engine == null) {
logger.info("[EXT-SCRIPT] jruby not present compiler deactivated");
return new CompilationResult("No Errors");
}
try
{
//See: http://stackoverflow.com/questions/4183408/redirect-stdout-to-a-string-in-java
engine.eval(commandString.toString());
Long status = (Long) engine.get("status");
String compilerOutput = (String) engine.get("finalOut");
if (status.equals(0L))
{
CompilationResult result = new CompilationResult("No Errors");
logger.info("No Compilation errors");
return result;
} else
{
CompilationResult result = new CompilationResult("Errors");
result.registerError(new CompilationMessage(status, compilerOutput));
logger.info(compilerOutput);
return result;
}
}
catch (ScriptException e)
{
e.printStackTrace();
}
return null;
}