public CompilationResult compile()

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;
    }