You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2012/01/19 16:25:40 UTC

svn commit: r1233430 - in /openejb/trunk/openejb/server: openejb-common-cli/ openejb-common-cli/src/main/java/org/apache/openejb/server/cli/ openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ openejb-groovy/ openejb-script/ openejb...

Author: rmannibucau
Date: Thu Jan 19 15:25:38 2012
New Revision: 1233430

URL: http://svn.apache.org/viewvc?rev=1233430&view=rev
Log:
refactoring to not be dependent on groovy (its jar alone if 6M big) but on JSR 223 (scripting)

Added:
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java
      - copied, changed from r1233384, openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java
      - copied, changed from r1233384, openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.java
    openejb/trunk/openejb/server/openejb-script/
      - copied from r1233317, openejb/trunk/openejb/server/openejb-groovy/
    openejb/trunk/openejb/server/openejb-script/src/main/java/org/apache/openejb/server/script/
    openejb/trunk/openejb/server/openejb-script/src/main/java/org/apache/openejb/server/script/OpenEJBScripter.java
Removed:
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyCommand.java
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.java
    openejb/trunk/openejb/server/openejb-groovy/
    openejb/trunk/openejb/server/openejb-script/src/main/java/org/apache/openejb/server/groovy/
Modified:
    openejb/trunk/openejb/server/openejb-common-cli/pom.xml
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java
    openejb/trunk/openejb/server/openejb-script/pom.xml
    openejb/trunk/openejb/server/openejb-script/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java

Modified: openejb/trunk/openejb/server/openejb-common-cli/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/pom.xml?rev=1233430&r1=1233429&r2=1233430&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/pom.xml (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/pom.xml Thu Jan 19 15:25:38 2012
@@ -15,7 +15,7 @@
   <dependencies>
     <dependency>
       <groupId>${project.groupId}</groupId>
-      <artifactId>openejb-groovy</artifactId>
+      <artifactId>openejb-script</artifactId>
       <version>${project.version}</version>
     </dependency>
     <dependency>

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java?rev=1233430&r1=1233429&r2=1233430&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/CliRunnable.java Thu Jan 19 15:25:38 2012
@@ -21,12 +21,13 @@ import jline.FileNameCompletor;
 import org.apache.openejb.server.cli.command.AbstractCommand;
 import org.apache.openejb.server.cli.command.Deploy;
 import org.apache.openejb.server.cli.command.ExitCommand;
-import org.apache.openejb.server.cli.command.GroovyCommand;
-import org.apache.openejb.server.cli.command.GroovyFileCommand;
 import org.apache.openejb.server.cli.command.HelpCommand;
 import org.apache.openejb.server.cli.command.ListCommand;
 import org.apache.openejb.server.cli.command.PropertiesCommand;
+import org.apache.openejb.server.cli.command.ScriptCommand;
+import org.apache.openejb.server.cli.command.ScriptFileCommand;
 import org.apache.openejb.server.cli.command.Undeploy;
+import org.apache.openejb.server.script.OpenEJBScripter;
 import org.apache.xbean.recipe.ObjectRecipe;
 import org.apache.xbean.recipe.Option;
 
@@ -46,7 +47,7 @@ public class CliRunnable implements Runn
     private static final String PROMPT;
     private static final String PROMPT_SUFFIX = "> ";
     private static final List<Class<? extends AbstractCommand>> COMMAND_CLASSES
-            = Arrays.asList(GroovyCommand.class, GroovyFileCommand.class,
+            = Arrays.asList(ScriptFileCommand.class, ScriptCommand.class,
                 ListCommand.class, PropertiesCommand.class,
                 Deploy.class, Undeploy.class,
                 HelpCommand.class, ExitCommand.class);
@@ -65,7 +66,7 @@ public class CliRunnable implements Runn
 
     public String lineSep;
 
-    private Object shell; // groovy jar = 6M so using reflection to be able to don't bring it
+    private OpenEJBScripter scripter;
     private OutputStream err;
     private OutputStream out;
     private InputStream sin;
@@ -115,14 +116,7 @@ public class CliRunnable implements Runn
     }
 
     public void start() throws IOException {
-        try {
-            shell = getClass().getClassLoader()
-                        .loadClass("org.apache.openejb.server.groovy.OpenEJBGroovyShell")
-                        .newInstance();
-        } catch (Exception e) {
-            shell = null;
-        }
-
+        scripter = new OpenEJBScripter();
         initializeCommands();
         new Thread(this, "OpenEJB Cli").start();
     }
@@ -140,10 +134,10 @@ public class CliRunnable implements Runn
     }
 
     public void destroy() {
-        if (shell != null) {
+        if (scripter != null) {
             try {
-                shell.getClass().getDeclaredMethod("resetLoadedClasses")
-                        .invoke(shell);
+                scripter.getClass().getDeclaredMethod("resetLoadedClasses")
+                        .invoke(scripter);
             } catch (Exception e) {
                 // ignored
             }
@@ -184,7 +178,7 @@ public class CliRunnable implements Runn
                     ObjectRecipe recipe = new ObjectRecipe(cmdClass);
                     recipe.setProperty("streamManager", streamManager);
                     recipe.setProperty("command", line);
-                    recipe.setProperty("shell", shell);
+                    recipe.setProperty("scripter", scripter);
                     recipe.setProperty("commands", commands);
 
                     recipe.allow(Option.CASE_INSENSITIVE_PROPERTIES);

Copied: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java (from r1233384, openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyCommand.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java?p2=openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java&p1=openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyCommand.java&r1=1233384&r2=1233430&rev=1233430&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptCommand.java Thu Jan 19 15:25:38 2012
@@ -16,57 +16,52 @@
  */
 package org.apache.openejb.server.cli.command;
 
-import java.lang.reflect.Method;
+import org.apache.openejb.server.script.OpenEJBScripter;
 
-public class GroovyCommand extends AbstractCommand {
-    public static final String GROOVY_NAME = "groovy"; // use it instead of name() because of inheritance
+public class ScriptCommand extends AbstractCommand {
+    public static final String SCRIPT_CMD = "script"; // use it instead of name() because of inheritance
 
-    protected Object shell;
-    private Method evaluateMethod = null;
+    protected OpenEJBScripter scripter;
+    protected String language;
+    protected String script;
 
     @Override
     public String name() {
-        return GROOVY_NAME;
+        return SCRIPT_CMD;
     }
 
     @Override
     public String usage() {
-        return name() + " <groovy code>";
+        return name() + " <script code>";
     }
 
     @Override
     public String description() {
-        return "execute groovy code. ejb can be accessed through their ejb name in the script.";
+        return "execute script code in the specified language. ejb can be accessed through their ejb name in the script.";
     }
 
     @Override
     public void execute(final String cmd) {
-        if (initEvaluateMethod() == null) {
-            streamManager.writeErr("groovy is not available, add groovy-all jar in openejb libs");
-            return;
-        }
-
-        final String toExec = cmd.substring(GROOVY_NAME.length() + 1).trim();
         try {
-            final Object result = evaluateMethod.invoke(shell, toExec);
+            parse(cmd);
+            final Object result = scripter.evaluate(language, script);
             streamManager.writeOut(streamManager.asString(result));
         } catch (Exception e) {
             streamManager.writeErr(e);
         }
     }
 
-    public void setShell(Object shell) {
-        this.shell = shell;
+    protected void parse(final String cmd) {
+        final String parseableCmd = cmd.substring(name().length() + 1);
+        final int spaceIdx = parseableCmd.indexOf(" ");
+        if (spaceIdx < 0) {
+            throw new IllegalArgumentException("bad syntax, see help");
+        }
+        language = parseableCmd.substring(0, spaceIdx);
+        script = parseableCmd.substring(spaceIdx + 1, parseableCmd.length());
     }
 
-    public Method initEvaluateMethod() {
-        if (shell != null) {
-            try {
-                evaluateMethod = shell.getClass().getMethod("evaluate", String.class);
-            } catch (Exception e) {
-                // ignored
-            }
-        }
-        return evaluateMethod;
+    public void setScripter(OpenEJBScripter scripter) {
+        this.scripter = scripter;
     }
 }

Copied: openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java (from r1233384, openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.java)
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java?p2=openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java&p1=openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.java&r1=1233384&r2=1233430&rev=1233430&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/GroovyFileCommand.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/command/ScriptFileCommand.java Thu Jan 19 15:25:38 2012
@@ -21,44 +21,46 @@ import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
 
-public class GroovyFileCommand extends GroovyCommand {
+public class ScriptFileCommand extends ScriptCommand {
     @Override
     public String name() {
-        return "groovy file";
+        return "script file";
     }
 
     @Override
     public String usage() {
-        return name() + " <groovy file path>";
+        return name() + "<script file path>";
     }
 
     @Override
     public String description() {
-        return "execute groovy code contained in a file. ejb can be accessed through their ejb name in the script.";
+        return "execute script code contained in a file in the specifid language. ejb can be accessed through their ejb name in the script. The extension is used to detect the file format.";
     }
 
     @Override
     public void execute(final String cmd) {
-        if (initEvaluateMethod() == null) {
-            streamManager.writeErr("groovy is not available, add groovy-all jar in openejb libs");
+        try {
+            parse(cmd);
+        } catch (IllegalArgumentException iae) {
+            streamManager.writeErr("script cmd " + cmd + " can't be parsed");
             return;
         }
 
-        final File file = new File(cmd.substring(name().length() + 1).trim());
+        final File file = new File(script.trim());
         if (!file.exists()) {
-            streamManager.writeErr("groovy file " + file.getPath() + " doesn't exist");
+            streamManager.writeErr("script file " + file.getPath() + " doesn't exist");
             return;
         }
 
         final StringBuilder builder = new StringBuilder(1024);
-        builder.append(super.name()).append(" "); // we will run the parent command
+        builder.append(super.name()).append(" ").append(language).append(" "); // we will run the parent command
 
         BufferedReader reader = null;
         try {
             reader = new BufferedReader(new FileReader(file));
             char[] buf = new char[1024];
             int numRead;
-            while((numRead = reader.read(buf)) != -1){
+            while ((numRead = reader.read(buf)) != -1) {
                 String readData = String.valueOf(buf, 0, numRead);
                 builder.append(readData);
                 buf = new char[1024];
@@ -78,4 +80,15 @@ public class GroovyFileCommand extends G
 
         super.execute(builder.toString());
     }
+
+    @Override
+    protected void parse(final String cmd) {
+        final String parseableCmd = cmd.substring(name().length() + 1);
+        final int dotIdx = parseableCmd.lastIndexOf(".");
+        if (dotIdx < 0) {
+            throw new IllegalArgumentException("bad syntax, see help");
+        }
+        script = parseableCmd.substring(0, dotIdx);
+        language = parseableCmd.substring(dotIdx, parseableCmd.length());
+    }
 }

Modified: openejb/trunk/openejb/server/openejb-script/pom.xml
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-script/pom.xml?rev=1233430&r1=1233317&r2=1233430&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-script/pom.xml (original)
+++ openejb/trunk/openejb/server/openejb-script/pom.xml Thu Jan 19 15:25:38 2012
@@ -27,8 +27,8 @@
   </parent>
   <modelVersion>4.0.0</modelVersion>
 
-  <artifactId>openejb-groovy</artifactId>
-  <name>OpenEJB :: Server :: Groovy</name>
+  <artifactId>openejb-script</artifactId>
+  <name>OpenEJB :: Server :: Script</name>
 
   <dependencies>
     <dependency>
@@ -40,6 +40,7 @@
       <groupId>org.codehaus.groovy</groupId>
       <artifactId>groovy-all</artifactId>
       <version>2.0.0-beta-1</version>
+      <scope>test</scope> <!-- don't deliver it -->
     </dependency>
   </dependencies>
 </project>

Added: openejb/trunk/openejb/server/openejb-script/src/main/java/org/apache/openejb/server/script/OpenEJBScripter.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-script/src/main/java/org/apache/openejb/server/script/OpenEJBScripter.java?rev=1233430&view=auto
==============================================================================
--- openejb/trunk/openejb/server/openejb-script/src/main/java/org/apache/openejb/server/script/OpenEJBScripter.java (added)
+++ openejb/trunk/openejb/server/openejb-script/src/main/java/org/apache/openejb/server/script/OpenEJBScripter.java Thu Jan 19 15:25:38 2012
@@ -0,0 +1,67 @@
+package org.apache.openejb.server.script;
+
+import org.apache.openejb.BeanContext;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
+import org.apache.openejb.util.proxy.ProxyEJB;
+
+import javax.script.Bindings;
+import javax.script.ScriptContext;
+import javax.script.ScriptEngine;
+import javax.script.ScriptEngineFactory;
+import javax.script.ScriptEngineManager;
+import javax.script.ScriptException;
+import javax.script.SimpleBindings;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class OpenEJBScripter {
+    private static final Map<String, ScriptEngineFactory> ENGINE_FACTORIES = new ConcurrentHashMap<String, ScriptEngineFactory>();
+
+    static {
+        final ScriptEngineManager mgr = new ScriptEngineManager();
+        for (ScriptEngineFactory factory : mgr.getEngineFactories()) {
+            if (factory.getParameter("THREADING") != null) { // thread safe
+                for (String ext : factory.getExtensions()) {
+                    ENGINE_FACTORIES.put(ext, factory);
+                }
+            }
+        }
+    }
+
+    public Object evaluate(final String language, final String script) throws ScriptException {
+        if (!ENGINE_FACTORIES.containsKey(language)) {
+            throw new IllegalArgumentException("can't find factory for language " + language + ". You probably need to add the jar to openejb libs.");
+        }
+
+        final ScriptEngineFactory factory = ENGINE_FACTORIES.get(language);
+        final ScriptEngine engine = factory.getScriptEngine();
+        engine.setBindings(binding(), ScriptContext.ENGINE_SCOPE);
+        return engine.eval(script);
+    }
+
+    private static Bindings binding() {
+        final Bindings bindings = new SimpleBindings();
+        final ContainerSystem cs = SystemInstance.get().getComponent(ContainerSystem.class);
+        for (BeanContext beanContext : cs.deployments()) {
+            if (BeanContext.Comp.class.equals(beanContext.getBeanClass())) {
+                continue;
+            }
+
+            Object service = null;
+            if (beanContext.getBusinessLocalInterface() != null) {
+                service = ProxyEJB.proxy(beanContext, beanContext.getBusinessLocalInterfaces().toArray(new Class<?>[beanContext.getBusinessLocalInterfaces().size()]));
+            } else if (beanContext.isLocalbean()) {
+                service = ProxyEJB.proxy(beanContext, new Class<?>[] { beanContext.getBusinessLocalBeanInterface() });
+            } else if (beanContext.getBusinessRemoteInterface() != null) {
+                service = ProxyEJB.proxy(beanContext, beanContext.getBusinessRemoteInterfaces().toArray(new Class<?>[beanContext.getBusinessRemoteInterfaces().size()]));
+            }
+
+            if (service != null) {
+                // replace all non alphanumeric characters in the ejb name by an underscore (to be a groovy variable)
+                bindings.put(beanContext.getEjbName().replaceAll("[^a-zA-Z0-9]", "_"), service);
+            }
+        }
+        return bindings;
+    }
+}

Modified: openejb/trunk/openejb/server/openejb-script/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-script/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java?rev=1233430&r1=1233317&r2=1233430&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-script/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java (original)
+++ openejb/trunk/openejb/server/openejb-script/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java Thu Jan 19 15:25:38 2012
@@ -16,11 +16,13 @@
  */
 package org.apache.openejb.server.groovy;
 
+import org.apache.openejb.server.script.OpenEJBScripter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import javax.ejb.embeddable.EJBContainer;
+import javax.script.ScriptException;
 
 import static org.junit.Assert.assertEquals;
 
@@ -38,9 +40,9 @@ public class OpenEJBGroovyShellTest {
     }
 
     @Test
-    public void call() {
-        final OpenEJBGroovyShell shell = new OpenEJBGroovyShell();
-        final Object out = shell.evaluate("Foo.foo()");
+    public void call() throws ScriptException {
+        final OpenEJBScripter shell = new OpenEJBScripter();
+        final Object out = shell.evaluate("groovy", "Foo.foo()");
         assertEquals("foo", out);
     }
 }