You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2010/04/09 15:15:50 UTC

svn commit: r932399 - in /sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core: ScriptHelper.java impl/DefaultSlingScript.java impl/SlingScriptAdapterFactory.java

Author: cziegeler
Date: Fri Apr  9 13:15:50 2010
New Revision: 932399

URL: http://svn.apache.org/viewvc?rev=932399&view=rev
Log:
SLING-1478 : Improve SlingScriptHelper service handling

Modified:
    sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
    sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java
    sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java

Modified: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java?rev=932399&r1=932398&r2=932399&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java (original)
+++ sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/ScriptHelper.java Fri Apr  9 13:15:50 2010
@@ -54,72 +54,88 @@ import org.slf4j.LoggerFactory;
  */
 public class ScriptHelper implements SlingScriptHelper {
 
+    /** The corresponding script. */
     private final SlingScript script;
 
+    /** The current request or <code>null</code>. */
     private final SlingHttpServletRequest request;
 
+    /** The current response or <code>null</code>. */
     private final SlingHttpServletResponse response;
 
+    /** The bundle context. */
     protected final BundleContext bundleContext;
 
     /**
      * The list of references - we don't need to synchronize this as we are
      * running in one single request.
      */
-    protected final List<ServiceReference> references = new ArrayList<ServiceReference>();
+    protected List<ServiceReference> references;
 
     /** A map of found services. */
-    protected final Map<String, Object> services = new HashMap<String, Object>();
+    protected Map<String, Object> services;
 
-    public ScriptHelper(BundleContext ctx, SlingScript script) {
+    public ScriptHelper(final BundleContext ctx, final SlingScript script) {
         if (ctx == null ) {
             throw new IllegalArgumentException("Bundle context must not be null.");
         }
-        this.bundleContext = ctx;
         this.request = null;
         this.response = null;
         this.script = script;
+        this.bundleContext = ctx;
     }
 
-    public ScriptHelper(BundleContext ctx, SlingScript script, SlingHttpServletRequest request,
-            SlingHttpServletResponse response) {
+    public ScriptHelper(final BundleContext ctx,
+            final SlingScript script,
+            final SlingHttpServletRequest request,
+            final SlingHttpServletResponse response) {
         if (ctx == null ) {
             throw new IllegalArgumentException("Bundle context must not be null.");
         }
-        this.bundleContext = ctx;
         this.script = script;
         this.request = new OnDemandReaderRequest(request);
         this.response = new OnDemandWriterResponse(response);
+        this.bundleContext = ctx;
     }
 
+    /**
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#getScript()
+     */
     public SlingScript getScript() {
         return script;
     }
 
+    /**
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#getRequest()
+     */
     public SlingHttpServletRequest getRequest() {
         return request;
     }
 
+    /**
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#getResponse()
+     */
     public SlingHttpServletResponse getResponse() {
         return response;
     }
 
     /**
-     * @trows SlingIOException Wrapping a <code>IOException</code> thrown
-     *        while handling the include.
-     * @throws SlingServletException Wrapping a <code>ServletException</code>
-     *             thrown while handling the include.
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#include(java.lang.String)
      */
     public void include(String path) {
         include(path, (RequestDispatcherOptions) null);
     }
 
-    /** Include the output of another request, using specified options */
+    /**
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#include(java.lang.String, java.lang.String)
+     */
     public void include(String path, String options) {
         include(path, new RequestDispatcherOptions(options));
     }
 
-    /** Include the output of another request, using specified options */
+    /**
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#include(java.lang.String, org.apache.sling.api.request.RequestDispatcherOptions)
+     */
     public void include(String path, RequestDispatcherOptions options) {
         final RequestDispatcher dispatcher = getRequest().getRequestDispatcher(
             path, options);
@@ -135,17 +151,23 @@ public class ScriptHelper implements Sli
         }
     }
 
-    /** Forward the request to another resource, using no options */
+    /**
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#forward(java.lang.String)
+     */
     public void forward(String path) {
         forward(path, (RequestDispatcherOptions) null);
     }
 
-    /** Forward the request to another resource, using specified options */
+    /**
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#forward(java.lang.String, java.lang.String)
+     */
     public void forward(String path, String options) {
         forward(path, new RequestDispatcherOptions(options));
     }
 
-    /** Forward the request to another resource, using specified options */
+    /**
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#forward(java.lang.String, org.apache.sling.api.request.RequestDispatcherOptions)
+     */
     public void forward(String path, RequestDispatcherOptions options) {
         final RequestDispatcher dispatcher = getRequest().getRequestDispatcher(
             path, options);
@@ -162,16 +184,29 @@ public class ScriptHelper implements Sli
     }
 
     /**
+     * @see org.apache.sling.api.scripting.SlingScriptHelper#dispose()
+     */
+    public void dispose() {
+        LoggerFactory.getLogger(this.getClass()).error("ScriptHelper#dispose has been called. This method is deprecated and should never be called by clients!");
+    }
+
+    /**
      * @see org.apache.sling.api.scripting.SlingScriptHelper#getService(java.lang.Class)
      */
     @SuppressWarnings("unchecked")
     public <ServiceType> ServiceType getService(Class<ServiceType> type) {
-        ServiceType service = (ServiceType) this.services.get(type.getName());
+        ServiceType service = (this.services == null ? null : (ServiceType) this.services.get(type.getName()));
         if (service == null) {
             final ServiceReference ref = this.bundleContext.getServiceReference(type.getName());
             if (ref != null) {
                 service = (ServiceType) this.bundleContext.getService(ref);
                 if ( service != null ) {
+                    if ( this.services == null ) {
+                        this.services = new HashMap<String, Object>();
+                    }
+                    if ( this.references == null ) {
+                        this.references = new ArrayList<ServiceReference>();
+                    }
                     this.references.add(ref);
                     this.services.put(type.getName(), service);
                 }
@@ -194,9 +229,12 @@ public class ScriptHelper implements Sli
             if (refs != null) {
                 final List<ServiceType> objects = new ArrayList<ServiceType>();
                 for (int i = 0; i < refs.length; i++) {
-                    this.references.add(refs[i]);
                     final ServiceType service = (ServiceType) this.bundleContext.getService(refs[i]);
                     if (service != null) {
+                        if ( this.references == null ) {
+                            this.references = new ArrayList<ServiceReference>();
+                        }
+                        this.references.add(refs[i]);
                         objects.add(service);
                     }
                 }
@@ -215,19 +253,16 @@ public class ScriptHelper implements Sli
      * Clean up this instance.
      */
     public void cleanup() {
-        final Iterator<ServiceReference> i = this.references.iterator();
-        while (i.hasNext()) {
-            final ServiceReference ref = i.next();
-            this.bundleContext.ungetService(ref);
+        if ( this.references != null ) {
+            final Iterator<ServiceReference> i = this.references.iterator();
+            while (i.hasNext()) {
+                final ServiceReference ref = i.next();
+                this.bundleContext.ungetService(ref);
+            }
+            this.references.clear();
+        }
+        if ( this.services != null ) {
+            this.services.clear();
         }
-        this.references.clear();
-        this.services.clear();
-    }
-
-    /**
-     * @see org.apache.sling.api.scripting.SlingScriptHelper#dispose()
-     */
-    public void dispose() {
-        LoggerFactory.getLogger(this.getClass()).error("ScriptHelper#dispose has been called. This method is deprecated and should never be called by clients!");
     }
 }

Modified: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java?rev=932399&r1=932398&r2=932399&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java (original)
+++ sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/DefaultSlingScript.java Fri Apr  9 13:15:50 2010
@@ -68,7 +68,6 @@ import org.apache.sling.api.scripting.Sl
 import org.apache.sling.api.scripting.SlingScriptConstants;
 import org.apache.sling.api.scripting.SlingScriptHelper;
 import org.apache.sling.scripting.api.BindingsValuesProvider;
-import org.apache.sling.scripting.core.ScriptHelper;
 import org.apache.sling.scripting.core.impl.helper.ProtectedBindings;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
@@ -106,18 +105,27 @@ class DefaultSlingScript implements Slin
     /** The ScriptBindingsValuesProviders. */
     private final Collection<BindingsValuesProvider> bindingsValuesProviders;
 
+    /** The cache for services. */
+    private final ServiceCache cache;
+
     /**
      * Constructor
      * @param bundleContext The bundle context
      * @param scriptResource The script resource
      * @param scriptEngine The script engine
+     * @param bindingsValuesProviders additional bindings values providers
+     * @param cache serviceCache
      */
-    DefaultSlingScript(BundleContext bundleContext, Resource scriptResource, ScriptEngine scriptEngine,
-            Collection<BindingsValuesProvider> bindingsValuesProviders) {
+    DefaultSlingScript(final BundleContext bundleContext,
+            final Resource scriptResource,
+            final ScriptEngine scriptEngine,
+            final Collection<BindingsValuesProvider> bindingsValuesProviders,
+            final ServiceCache cache) {
         this.scriptResource = scriptResource;
         this.scriptEngine = scriptEngine;
         this.bundleContext = bundleContext;
         this.bindingsValuesProviders = bindingsValuesProviders;
+        this.cache = cache;
         this.scriptName = this.scriptResource.getPath();
         // Now know how to get the input stream, we still have to decide
         // on the encoding of the stream's data. Primarily we assume it is
@@ -262,7 +270,7 @@ class DefaultSlingScript implements Slin
 
             // dispose of the SlingScriptHelper
             if ( bindings != null && disposeScriptHelper ) {
-                final ScriptHelper helper = (ScriptHelper) bindings.get(SLING);
+                final InternalScriptHelper helper = (InternalScriptHelper) bindings.get(SLING);
                 if ( helper != null ) {
                     helper.cleanup();
                 }
@@ -467,9 +475,9 @@ class DefaultSlingScript implements Slin
         if (slingObject == null) {
 
             if ( request != null ) {
-                slingObject = new ScriptHelper(this.bundleContext, this, request, slingBindings.getResponse());
+                slingObject = new InternalScriptHelper(this.bundleContext, this, request, slingBindings.getResponse(), this.cache);
             } else {
-                slingObject = new ScriptHelper(this.bundleContext, this);
+                slingObject = new InternalScriptHelper(this.bundleContext, this, this.cache);
             }
         } else if (!(slingObject instanceof SlingScriptHelper) ) {
             throw fail(SLING, "Wrong type");

Modified: sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java?rev=932399&r1=932398&r2=932399&view=diff
==============================================================================
--- sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java (original)
+++ sling/trunk/bundles/scripting/core/src/main/java/org/apache/sling/scripting/core/impl/SlingScriptAdapterFactory.java Fri Apr  9 13:15:50 2010
@@ -120,6 +120,11 @@ public class SlingScriptAdapterFactory i
      */
     private Map<String, Map<Object, BindingsValuesProvider>> langBindingsValuesProviders;
 
+    /**
+     * The service cache for script execution.
+     */
+    private ServiceCache serviceCache;
+
     // ---------- AdapterFactory -----------------------------------------------
 
     @SuppressWarnings("unchecked")
@@ -133,7 +138,8 @@ public class SlingScriptAdapterFactory i
         if (engine != null) {
             Collection<BindingsValuesProvider> bindingsValuesProviders = getBindingsValuesProviders(engine.getFactory());
             // unchecked cast
-            return (AdapterType) new DefaultSlingScript(this.bundleContext, resource, engine, bindingsValuesProviders);
+            return (AdapterType) new DefaultSlingScript(this.bundleContext,
+                    resource, engine, bindingsValuesProviders, this.serviceCache);
         }
 
         return null;
@@ -322,9 +328,12 @@ public class SlingScriptAdapterFactory i
         } catch (Throwable t) {
             // so what ?
         }
+        this.serviceCache = new ServiceCache(this.bundleContext);
     }
 
     protected void deactivate(ComponentContext context) {
+        this.serviceCache.dispose();
+        this.serviceCache = null;
 
         try {
             org.apache.sling.scripting.core.impl.ScriptEngineConsolePlugin.destroyPlugin();