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