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