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