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/06/08 17:18:52 UTC

svn commit: r1348108 - in /openejb/trunk/openejb: container/openejb-core/src/main/java/org/apache/openejb/util/ server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/ server/openejb-common-cli/src/test/java/org/apache/openejb/server/gro...

Author: rmannibucau
Date: Fri Jun  8 15:18:52 2012
New Revision: 1348108

URL: http://svn.apache.org/viewvc?rev=1348108&view=rev
Log:
moving json executor to core to be able to use it everywhere (common-cli, webapp ...). using it in ConsoleServlet

Added:
    openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/OpenEJBScripter.java
Removed:
    openejb/trunk/openejb/server/openejb-common-cli/src/main/java/org/apache/openejb/server/cli/OpenEJBScripter.java
Modified:
    openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/BeanManagerHelperTest.java
    openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java
    openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/servlet/ConsoleServlet.java

Added: openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/OpenEJBScripter.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/OpenEJBScripter.java?rev=1348108&view=auto
==============================================================================
--- openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/OpenEJBScripter.java (added)
+++ openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/util/OpenEJBScripter.java Fri Jun  8 15:18:52 2012
@@ -0,0 +1,156 @@
+/*
+ * 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.openejb.util;
+
+import org.apache.openejb.AppContext;
+import org.apache.openejb.BeanContext;
+import org.apache.openejb.OpenEJBRuntimeException;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.spi.ContainerSystem;
+import org.apache.openejb.util.proxy.ProxyEJB;
+
+import javax.enterprise.inject.spi.Bean;
+import javax.enterprise.inject.spi.BeanManager;
+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.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class OpenEJBScripter {
+    private static final Map<String, ScriptEngineFactory> ENGINE_FACTORIES = new ConcurrentHashMap<String, ScriptEngineFactory>();
+    private static final ThreadLocal<Map<String, ScriptEngine>> ENGINES = new ThreadLocal<Map<String, ScriptEngine>>() {
+        @Override
+        protected Map<String, ScriptEngine> initialValue() {
+            return new HashMap<String, ScriptEngine>();
+        }
+    };
+
+    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 {
+        return evaluate(language, script, new SimpleBindings());
+    }
+
+    public Object evaluate(final String language, final String script, final Bindings bindings) 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.");
+        }
+
+        Bindings usedBindings = bindings;
+        if (usedBindings == null) {
+            usedBindings = new SimpleBindings();
+        }
+        return engine(language, usedBindings).eval(script);
+    }
+
+    private static ScriptEngine engine(final String language, final Bindings bindings) {
+        ScriptEngine engine = ENGINES.get().get(language);
+        if (engine == null) {
+            final ScriptEngineFactory factory = ENGINE_FACTORIES.get(language);
+            engine = factory.getScriptEngine();
+            engine.setBindings(binding(bindings), ScriptContext.ENGINE_SCOPE);
+            ENGINES.get().put(language, engine);
+        }
+        return engine;
+    }
+
+    public static void clearEngines() {
+        ENGINES.get().clear();
+    }
+
+    private static Bindings binding(final Bindings bindings) {
+        bindings.put("bm", new BeanManagerHelper());
+
+        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;
+    }
+
+    public static class BeanManagerHelper {
+        public Object beanFromClass(final String appName, final String classname) {
+            final AppContext appContext = appContext(appName);
+            final BeanManager bm = appContext.getBeanManager();
+            final Class<?> clazz;
+            try {
+                clazz = appContext.getClassLoader().loadClass(classname);
+            } catch (ClassNotFoundException e) {
+                throw new OpenEJBRuntimeException(e);
+            }
+            final Set<Bean<?>> beans = bm.getBeans(clazz);
+            return instance(bm, beans, clazz);
+        }
+
+        public Object beanFromName(final String appName, final String name) {
+            final BeanManager bm = beanManager(appName);
+            final Set<Bean<?>> beans = bm.getBeans(name);
+            return instance(bm, beans, Object.class);
+        }
+
+        private <T> T instance(final BeanManager bm, final Set<Bean<?>> beans, final Class<T> clazz) {
+            final Bean<?> bean = bm.resolve(beans);
+            return (T) bm.getReference(bean, clazz, bm.createCreationalContext(bean));
+        }
+
+        private BeanManager beanManager(final String appName) {
+            return appContext(appName).getBeanManager();
+        }
+
+        private AppContext appContext(final String appName) {
+            final ContainerSystem cs = SystemInstance.get().getComponent(ContainerSystem.class);
+            final AppContext appContext = cs.getAppContext(appName);
+            if (appContext == null) {
+                throw new OpenEJBRuntimeException("can't find application " + appName);
+            }
+            return appContext;
+        }
+    }
+}
+

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/BeanManagerHelperTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/BeanManagerHelperTest.java?rev=1348108&r1=1348107&r2=1348108&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/BeanManagerHelperTest.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/BeanManagerHelperTest.java Fri Jun  8 15:18:52 2012
@@ -19,7 +19,7 @@ package org.apache.openejb.server.groovy
 import org.apache.openejb.jee.Beans;
 import org.apache.openejb.junit.ApplicationComposer;
 import org.apache.openejb.junit.Module;
-import org.apache.openejb.server.cli.OpenEJBScripter;
+import org.apache.openejb.util.OpenEJBScripter;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;

Modified: openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java?rev=1348108&r1=1348107&r2=1348108&view=diff
==============================================================================
--- openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java (original)
+++ openejb/trunk/openejb/server/openejb-common-cli/src/test/java/org/apache/openejb/server/groovy/OpenEJBGroovyShellTest.java Fri Jun  8 15:18:52 2012
@@ -16,16 +16,14 @@
  */
 package org.apache.openejb.server.groovy;
 
-import org.apache.openejb.server.cli.OpenEJBScripter;
+import java.util.Properties;
+import javax.ejb.embeddable.EJBContainer;
+import javax.script.ScriptException;
+import org.apache.openejb.util.OpenEJBScripter;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import javax.ejb.embeddable.EJBContainer;
-import javax.script.ScriptException;
-
-import java.util.Properties;
-
 import static org.junit.Assert.assertEquals;
 
 public class OpenEJBGroovyShellTest {

Modified: openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/servlet/ConsoleServlet.java
URL: http://svn.apache.org/viewvc/openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/servlet/ConsoleServlet.java?rev=1348108&r1=1348107&r2=1348108&view=diff
==============================================================================
--- openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/servlet/ConsoleServlet.java (original)
+++ openejb/trunk/openejb/tomee/tomee-webapp/src/main/java/org/apache/tomee/webapp/servlet/ConsoleServlet.java Fri Jun  8 15:18:52 2012
@@ -17,6 +17,9 @@
 
 package org.apache.tomee.webapp.servlet;
 
+import javax.script.Bindings;
+import javax.script.SimpleBindings;
+import org.apache.openejb.util.OpenEJBScripter;
 import org.apache.tomee.webapp.JsonExecutor;
 
 import javax.script.ScriptEngine;
@@ -30,27 +33,25 @@ import java.io.IOException;
 import java.util.Map;
 
 public class ConsoleServlet extends HttpServlet {
+    private static final OpenEJBScripter SCRIPTER = new OpenEJBScripter();
 
     @Override
     protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
         JsonExecutor.execute(resp, new JsonExecutor.Executor() {
             @Override
             public void call(Map<String, Object> json) throws Exception {
-                final ScriptEngineManager manager = new ScriptEngineManager();
                 final HttpSession session = req.getSession();
 
                 String engineName = req.getParameter("engineName");
                 if (engineName == null || "".equals(engineName.trim())) {
-                    engineName = "JavaScript";
+                    engineName = "js";
                 }
-                final ScriptEngine engine = manager.getEngineByName(engineName);
-
-                engine.put("req", req);
-                engine.put("resp", resp);
-
-                engine.put("util", new Utility() {
 
+                final Bindings bindings = new SimpleBindings();
+                bindings.put("req", req);
+                bindings.put("resp", resp);
 
+                bindings.put("util", new Utility() {
                     @Override
                     public void write(Object obj) throws Exception {
                         resp.getWriter().write(String.valueOf(obj));
@@ -67,7 +68,7 @@ public class ConsoleServlet extends Http
                 if (scriptCode == null || "".equals(scriptCode.trim())) {
                     scriptCode = "var a = 0;";
                 }
-                engine.eval(scriptCode);
+                SCRIPTER.evaluate(engineName, scriptCode, bindings);
             }
         });
     }