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