Author: fmeschbe
Date: Tue Dec 18 03:13:50 2007
New Revision: 605182

URL: http://svn.apache.org/viewvc?rev=605182&view=rev
Log:
SLING-139 Add javax.script.ScriptEngineFactory as a reference
    to the SCR descriptor.

Modified:
    
incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScriptResolver.java

Modified: 
incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScriptResolver.java
URL: 
http://svn.apache.org/viewvc/incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScriptResolver.java?rev=605182&r1=605181&r2=605182&view=diff
==============================================================================
--- 
incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScriptResolver.java
 (original)
+++ 
incubator/sling/trunk/scripting/resolver/src/main/java/org/apache/sling/scripting/resolver/impl/DefaultSlingScriptResolver.java
 Tue Dec 18 03:13:50 2007
@@ -63,6 +63,9 @@
  * @scr.property name="service.vendor" value="The Apache Software Foundation"
  * @scr.property name="service.description" value="Default SlingScriptResolver"
  * @scr.service
+ * @scr.reference name="ScriptEngineFactory"
+ *                interface="javax.script.ScriptEngineFactory"
+ *                cardinality="0..n" policy="dynamic"
  */
 public class DefaultSlingScriptResolver implements SlingScriptResolver,
         BundleListener {
@@ -84,6 +87,10 @@
 
     private String[] scriptPath;
 
+    private List<Bundle> engineSpiBundles = new LinkedList<Bundle>();
+
+    private List<ScriptEngineFactory> engineSpiServices = new 
LinkedList<ScriptEngineFactory>();
+
     /**
      * Try to find a script Node that can process the given request, based on
      * the rules defined above.
@@ -158,16 +165,27 @@
 
     private ScriptEngineManager getScriptEngineManager() {
         if (scriptEngineManager == null) {
-            ScriptEngineManager tmp = new ScriptEngineManager();
+            
+            // create (empty) script engine manager
+            ClassLoader loader = getClass().getClassLoader();
+            ScriptEngineManager tmp = new ScriptEngineManager(loader);
+            
+            // register script engines from bundles
             for (Bundle bundle : engineSpiBundles) {
-                addFactories(tmp, bundle);
+                registerFactories(tmp, bundle);
             }
+            
+            // register script engines from registered services
+            for (ScriptEngineFactory factory : engineSpiServices) {
+                registerFactory(tmp, factory);
+            }
+            
             scriptEngineManager = tmp;
         }
         return scriptEngineManager;
     }
 
-    private void addFactories(ScriptEngineManager mgr, Bundle bundle) {
+    private void registerFactories(ScriptEngineManager mgr, Bundle bundle) {
         URL url = bundle.getEntry(ENGINE_FACTORY_SERVICE);
         InputStream ins = null;
         try {
@@ -180,22 +198,7 @@
                     @SuppressWarnings("unchecked")
                     Class<ScriptEngineFactory> clazz = bundle.loadClass(line);
                     ScriptEngineFactory spi = clazz.newInstance();
-
-                    log.info("Adding ScriptEngine {}, {} for language {}, {}",
-                        new Object[] { spi.getEngineName(),
-                            spi.getEngineVersion(), spi.getLanguageName(),
-                            spi.getLanguageVersion() });
-
-                    for (Object ext : spi.getExtensions()) {
-                        mgr.registerEngineExtension((String) ext, spi);
-                    }
-                    for (Object mime : spi.getMimeTypes()) {
-                        mgr.registerEngineMimeType((String) mime, spi);
-                    }
-                    for (Object name : spi.getNames()) {
-                        mgr.registerEngineName((String) name, spi);
-                    }
-
+                    registerFactory(mgr, spi);
                 } catch (Throwable t) {
                     log.error("Cannot register ScriptEngineFactory " + line, 
t);
                 }
@@ -211,9 +214,26 @@
         }
     }
 
-    // ---------- BundleListener interface 
-------------------------------------
+    private void registerFactory(ScriptEngineManager mgr,
+            ScriptEngineFactory factory) {
+        log.info("Adding ScriptEngine {}, {} for language {}, {}",
+            new Object[] { factory.getEngineName(), factory.getEngineVersion(),
+                factory.getLanguageName(), factory.getLanguageVersion() });
 
-    private List<Bundle> engineSpiBundles = new LinkedList<Bundle>();
+        for (Object ext : factory.getExtensions()) {
+            mgr.registerEngineExtension((String) ext, factory);
+        }
+
+        for (Object mime : factory.getMimeTypes()) {
+            mgr.registerEngineMimeType((String) mime, factory);
+        }
+
+        for (Object name : factory.getNames()) {
+            mgr.registerEngineName((String) name, factory);
+        }
+    }
+
+    // ---------- BundleListener interface 
-------------------------------------
 
     public void bundleChanged(BundleEvent event) {
         if (event.getType() == BundleEvent.STARTED
@@ -265,6 +285,19 @@
         context.getBundleContext().removeBundleListener(this);
 
         engineSpiBundles.clear();
+        engineSpiServices.clear();
+        scriptEngineManager = null;
+    }
+
+    protected void bindScriptEngineFactory(
+            ScriptEngineFactory scriptEngineFactory) {
+        engineSpiServices.add(scriptEngineFactory);
+        scriptEngineManager = null;
+    }
+
+    protected void unbindScriptEngineFactory(
+            ScriptEngineFactory scriptEngineFactory) {
+        engineSpiServices.remove(scriptEngineFactory);
         scriptEngineManager = null;
     }
 


Reply via email to