adding the jruby compiler bindings

git-svn-id: https://svn.apache.org/repos/asf/myfaces/extensions/scripting/trunk@1400845 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/extscript-core-root/extscript-core/pom.xml b/extscript-core-root/extscript-core/pom.xml
index b9ae164..de906b7 100644
--- a/extscript-core-root/extscript-core/pom.xml
+++ b/extscript-core-root/extscript-core/pom.xml
@@ -92,6 +92,11 @@
             <artifactId>groovy-all</artifactId>
             <version>${groovy.version}</version>
         </dependency>
+        <dependency>
+            <groupId>org.jruby</groupId>
+            <artifactId>jruby-complete</artifactId>
+            <version>1.7.0.preview2</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/ScriptingConst.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/ScriptingConst.java
index a8584c1..363e893 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/ScriptingConst.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/api/ScriptingConst.java
@@ -60,6 +60,7 @@
     public static final int ENGINE_TYPE_JSF_GROOVY = 0;
     public static final int ENGINE_TYPE_JSF_JAVA = 1;
     public static final int ENGINE_TYPE_JSF_SCALA = 2;
+    public static final int ENGINETYPE_JSF_RUBY = 3;
     public static final int ARTIFACT_TYPE_UNKNOWN = -1;
     public static final int ARTIFACT_TYPE_MANAGEDBEAN = 1;
     public static final int ARTIFACT_TYPE_MANAGEDPROPERTY = 2;
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/api/CompilerConst.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/api/CompilerConst.java
index ae940d0..f64b375 100644
--- a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/api/CompilerConst.java
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/api/CompilerConst.java
@@ -37,6 +37,8 @@
     public static final String JC_SOURCEPATH = "-sourcepath";
     public static final String JC_DEBUG = "-g";
     public static final String JAVA_WILDCARD = "*.java ";
+    public static final String RUBY_WILDARD = "*.ruby";
+
     public static final String JC_VERBOSE = "-verbose";
     @SuppressWarnings("unused")
     public static final String JC_SOURCE = "-source";
diff --git a/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/compiler/JRubyCompiler.java b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/compiler/JRubyCompiler.java
new file mode 100644
index 0000000..3a520d0
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/main/java/org/apache/myfaces/extensions/scripting/core/engine/compiler/JRubyCompiler.java
@@ -0,0 +1,115 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.myfaces.extensions.scripting.core.engine.compiler;
+
+import org.apache.myfaces.extensions.scripting.core.api.Configuration;
+import org.apache.myfaces.extensions.scripting.core.api.WeavingContext;
+import org.apache.myfaces.extensions.scripting.core.common.util.ClassLoaderUtils;
+import org.apache.myfaces.extensions.scripting.core.common.util.FileUtils;
+import org.apache.myfaces.extensions.scripting.core.engine.api.CompilationException;
+import org.apache.myfaces.extensions.scripting.core.engine.api.CompilationResult;
+
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import java.io.File;
+import java.util.List;
+
+import static org.apache.myfaces.extensions.scripting.core.api.ScriptingConst.ENGINETYPE_JSF_RUBY;
+import static org.apache.myfaces.extensions.scripting.core.engine.api.CompilerConst.RUBY_WILDARD;
+
+/**
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
+ *          <p/>
+ *          A compiler for jruby which uses ruby and the standard JSR 233
+ *          for compiling classes into java classes
+ */
+
+public class JRubyCompiler implements org.apache.myfaces.extensions.scripting.core.engine.api.Compiler
+{
+
+    private static final String ENGINE_JRUBY = "jruby";
+
+    @Override
+    public CompilationResult compile(File sourcePath, File targetPath, ClassLoader classLoader) throws CompilationException
+    {
+        targetPath.mkdirs();
+        String sources = getSourceFiles();
+        String classPath = ClassLoaderUtils.buildClasspath(ClassLoaderUtils.getDefaultClassLoader());
+
+        StringBuilder commandString = new StringBuilder();
+        commandString.append("require 'jruby/jrubyc'\n");
+        commandString.append("options = Array.new \n");
+        commandString.append("options << '-d" + sourcePath.getAbsolutePath() + "'\n");
+        commandString.append("options<< '--javac' \n");
+        commandString.append("options<< '-t" + targetPath.getAbsolutePath() + " '\n");
+        commandString.append("options<< '-c" + classPath + " '\n");
+        commandString.append("options<< '" + sources + " '\n");
+        commandString.append("$status = JRuby::Compiler::compile_argv(options) \n");
+        ScriptEngineManager manager = new ScriptEngineManager();
+        ScriptEngine engine = manager.getEngineByName(ENGINE_JRUBY);
+        try
+        {
+            engine.eval(commandString.toString());
+        }
+        catch (ScriptException e)
+        {
+            e.printStackTrace();
+        }
+
+        return null;
+    }
+
+    private String getSourceFiles()
+    {
+        WeavingContext context = WeavingContext.getInstance();
+        Configuration configuration = context.getConfiguration();
+        List<File> sourceFiles = FileUtils.fetchSourceFiles(configuration.getWhitelistedSourceDirs
+                (ENGINETYPE_JSF_RUBY), RUBY_WILDARD);
+        StringBuilder sources = new StringBuilder(sourceFiles.size() * 30);
+        for (File sourceFile : sourceFiles)
+        {
+            sources.append(sourceFile.getAbsolutePath());
+            sources.append(" ");
+        }
+        return sources.toString();
+    }
+
+    public static void main(String... argv)
+    {
+        ScriptEngineManager manager = new ScriptEngineManager();
+        ScriptEngine engine = manager.getEngineByName(ENGINE_JRUBY);
+        try
+        {
+            engine.eval("require 'jruby/jrubyc'\n" +
+                    "$status = 'hello world' #JRuby::Compiler::compile_argv(ARGV)");
+
+            Object status = engine.get("status");
+            System.out.println(status.toString());
+        }
+        catch (ScriptException e)
+        {
+            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
+        }
+
+    }
+
+}
diff --git a/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe1.java b/extscript-core-root/extscript-core/src/test/java/org/apache/myfaces/extensions/scripting/core/engine/compiler/RubyCompilerTest.java
similarity index 73%
rename from extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe1.java
rename to extscript-core-root/extscript-core/src/test/java/org/apache/myfaces/extensions/scripting/core/engine/compiler/RubyCompilerTest.java
index 10dda06..27089f5 100644
--- a/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe1.java
+++ b/extscript-core-root/extscript-core/src/test/java/org/apache/myfaces/extensions/scripting/core/engine/compiler/RubyCompilerTest.java
@@ -16,21 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package compiler;
+
+package org.apache.myfaces.extensions.scripting.core.engine.compiler;
 
 /**
- * a simple testprobe to check if the compiler api works
+ * @author Werner Punz (latest modification by $Author$)
+ * @version $Revision$ $Date$
  */
 
-public class TestProbe1 {
-
-    private String testAttr;
-
-    public String getTestAttr() {
-        return testAttr;
-    }
-
-    public void setTestAttr(String testAttr) {
-        this.testAttr = testAttr;
-    }
-}
\ No newline at end of file
+public class RubyCompilerTest
+{
+}
diff --git a/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe1.rb b/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe1.rb
new file mode 100644
index 0000000..d5e9696
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe1.rb
@@ -0,0 +1,15 @@
+# a small ruby testing class to test for a valid compilation
+# from the compiler
+# @author Werner Punz
+class TestProbe1
+  java_signature 'void helloWorld()'
+  def helloWorld
+      puts "Hello from Ruby"
+  end
+
+  java_signature 'public String stringReturn()'
+  def stringReturn
+    'hello world'
+  end
+
+end
diff --git a/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe2.rb b/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe2.rb
new file mode 100644
index 0000000..928ac85
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/resources/compiler/TestProbe2.rb
@@ -0,0 +1,4 @@
+java_package 'compiler'
+class TestProbe2
+
+end
\ No newline at end of file
diff --git a/extscript-core-root/extscript-core/src/test/ruby/test.rb b/extscript-core-root/extscript-core/src/test/ruby/test.rb
new file mode 100644
index 0000000..9f34748
--- /dev/null
+++ b/extscript-core-root/extscript-core/src/test/ruby/test.rb
@@ -0,0 +1 @@
+putstr "hello world"
\ No newline at end of file