From 7bceecdb88a2411a7a75712b4f7a52f4ed766ce2 Mon Sep 17 00:00:00 2001 From: Carlos Ruiz Date: Wed, 23 Nov 2016 21:08:46 +0100 Subject: [PATCH] IDEMPIERE-3243 - peer review --- org.adempiere.base/OSGI-INF/groovyfactory.xml | 7 ++ .../src/org/adempiere/base/Core.java | 13 +--- .../base/osgi/OSGiScriptEngineFactory.java | 8 +-- .../base/osgi/OSGiScriptEngineManager.java | 69 +++---------------- 4 files changed, 25 insertions(+), 72 deletions(-) create mode 100644 org.adempiere.base/OSGI-INF/groovyfactory.xml diff --git a/org.adempiere.base/OSGI-INF/groovyfactory.xml b/org.adempiere.base/OSGI-INF/groovyfactory.xml new file mode 100644 index 0000000000..fdfd354b81 --- /dev/null +++ b/org.adempiere.base/OSGI-INF/groovyfactory.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/org.adempiere.base/src/org/adempiere/base/Core.java b/org.adempiere.base/src/org/adempiere/base/Core.java index 426ae8fe6a..c84d24890d 100644 --- a/org.adempiere.base/src/org/adempiere/base/Core.java +++ b/org.adempiere.base/src/org/adempiere/base/Core.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.logging.Level; import javax.script.ScriptEngine; -import javax.script.ScriptEngineManager; import org.adempiere.base.osgi.OSGiScriptEngineManager; import org.adempiere.model.IAddressValidation; @@ -411,15 +410,9 @@ public class Core { */ public static ScriptEngine getScriptEngine(String engineName) { - ScriptEngineManager factory = new ScriptEngineManager(Core.class.getClassLoader()); - ScriptEngine engine = factory.getEngineByName(engineName); - - if(engine == null) - { - OSGiScriptEngineManager osgiFactory = new OSGiScriptEngineManager( FrameworkUtil.getBundle(Core.class).getBundleContext()); - engine = osgiFactory.getEngineByName(engineName); - } - + OSGiScriptEngineManager osgiFactory = new OSGiScriptEngineManager( FrameworkUtil.getBundle(Core.class).getBundleContext()); + ScriptEngine engine = osgiFactory.getEngineByName(engineName); + return engine; } } diff --git a/org.adempiere.base/src/org/adempiere/base/osgi/OSGiScriptEngineFactory.java b/org.adempiere.base/src/org/adempiere/base/osgi/OSGiScriptEngineFactory.java index 15f45a32ea..e071878fc7 100644 --- a/org.adempiere.base/src/org/adempiere/base/osgi/OSGiScriptEngineFactory.java +++ b/org.adempiere.base/src/org/adempiere/base/osgi/OSGiScriptEngineFactory.java @@ -76,10 +76,10 @@ public class OSGiScriptEngineFactory implements ScriptEngineFactory{ public ScriptEngine getScriptEngine() { ScriptEngine engine=null; if(contextClassLoader!=null){ - ClassLoader old=Thread.currentThread().getContextClassLoader(); - Thread.currentThread().setContextClassLoader(contextClassLoader); - engine=factory.getScriptEngine(); - Thread.currentThread().setContextClassLoader(old); + ClassLoader old=Thread.currentThread().getContextClassLoader(); + Thread.currentThread().setContextClassLoader(contextClassLoader); + engine=factory.getScriptEngine(); + Thread.currentThread().setContextClassLoader(old); } else engine=factory.getScriptEngine(); return engine; diff --git a/org.adempiere.base/src/org/adempiere/base/osgi/OSGiScriptEngineManager.java b/org.adempiere.base/src/org/adempiere/base/osgi/OSGiScriptEngineManager.java index e19832314f..a020533875 100644 --- a/org.adempiere.base/src/org/adempiere/base/osgi/OSGiScriptEngineManager.java +++ b/org.adempiere.base/src/org/adempiere/base/osgi/OSGiScriptEngineManager.java @@ -16,12 +16,7 @@ */ package org.adempiere.base.osgi; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; import java.util.ArrayList; -import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -32,8 +27,7 @@ import javax.script.ScriptEngineFactory; import javax.script.ScriptEngineManager; import javax.script.SimpleBindings; -import org.compiere.util.Util; -import org.osgi.framework.Bundle; +import org.adempiere.base.Service; import org.osgi.framework.BundleContext; /** @@ -201,63 +195,22 @@ public class OSGiScriptEngineManager extends ScriptEngineManager{ } - private Map findManagers(BundleContext context) { + Map managers=new HashMap(); - try { - for(String factoryName: findFactoryCandidates(context)){ - //We do not really need the class, but we need the classloader - ClassLoader factoryLoader=Class.forName(factoryName).getClassLoader(); + + List seFactoryList = + Service.locator().list(ScriptEngineFactory.class).getServices(); + if (seFactoryList != null) { + for(ScriptEngineFactory seFactory : seFactoryList) { + ClassLoader factoryLoader = seFactory.getClass().getClassLoader(); ScriptEngineManager manager=new ScriptEngineManager(factoryLoader); manager.setBindings(bindings); managers.put(manager, factoryLoader); } - return managers; - } catch (IOException ioe) { - throw new RuntimeException(ioe); - } catch (ClassNotFoundException cnfe) { - throw new RuntimeException(cnfe); } + + return managers; } - /** - * Iterates through all bundles to get the available @link ScriptEngineFactory classes - * @return the names of the available ScriptEngineFactory classes - * @throws IOException - */ - private List findFactoryCandidates(BundleContext context) throws IOException{ - Bundle[] bundles = context.getBundles(); - List factoryCandidates = new ArrayList(); - for (Bundle bundle : bundles) { - // IDEMPIERE-3243: removed print and small improvements on enumeration - // System.out.println(bundle.getSymbolicName()); - if(bundle.getSymbolicName().equals("system.bundle")) continue; - Enumeration urls = bundle.findEntries("META-INF/services", - "javax.script.ScriptEngineFactory", false); - if (urls == null) - continue; - while (urls.hasMoreElements()) { - URL u = urls.nextElement(); - BufferedReader reader = new BufferedReader( - new InputStreamReader(u.openStream())); - String line; - while ((line = reader.readLine()) != null) - { - // IDEMPIERE-3243: removed comment lines - - int commentIdx = line.indexOf('#'); - - if(commentIdx >= 0) - line = line.substring(0, commentIdx); - - line = line.trim(); - - if(Util.isEmpty(line) == false) - { - factoryCandidates.add(line); - } - } - } - } - return factoryCandidates; - } + }