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 2015/09/29 07:41:33 UTC

svn commit: r1705802 - in /sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal: ScriptResource.java SlingServletResolver.java

Author: cziegeler
Date: Tue Sep 29 05:41:33 2015
New Revision: 1705802

URL: http://svn.apache.org/viewvc?rev=1705802&view=rev
Log:
SLING-5068 : perThreadScriptResolver is shared between multiple Threads causing ISE in ResourceResolverImpl

Modified:
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java
    sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java?rev=1705802&r1=1705801&r2=1705802&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/ScriptResource.java Tue Sep 29 05:41:33 2015
@@ -18,7 +18,6 @@
  */
 package org.apache.sling.servlets.resolver.internal;
 
-import java.lang.ref.WeakReference;
 import java.util.Iterator;
 
 import javax.servlet.Servlet;
@@ -27,6 +26,8 @@ import org.apache.sling.api.resource.Abs
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceMetadata;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceUtil;
+import org.apache.sling.api.scripting.SlingScript;
 
 /**
  * ScriptResource is a resource wrapper of a resource fetched by a
@@ -40,32 +41,37 @@ import org.apache.sling.api.resource.Res
  */
 public class ScriptResource extends AbstractResource {
 
-    private Resource activeResource;
+    private volatile Resource sharedResource;
 
     private final ResourceResolver sharedResourceResolver;
 
-    private WeakReference<ResourceResolver> perThreadResourceResolver;
+    private final ThreadLocal<ResourceResolver> perThreadResourceResolver;
 
-    public ScriptResource(final Resource resource, final ResourceResolver sharedResourceResolver) {
-        this.perThreadResourceResolver = new WeakReference<ResourceResolver>(resource.getResourceResolver());
+    private final String path;
+
+    public ScriptResource(final Resource resource,
+            final ThreadLocal<ResourceResolver> perThreadScriptResolver,
+            final ResourceResolver sharedResourceResolver) {
+        this.path = resource.getPath();
         this.sharedResourceResolver = sharedResourceResolver;
-        this.activeResource = resource;
+        this.perThreadResourceResolver = perThreadScriptResolver;
     }
 
     private Resource getActiveResource() {
-        if ( this.perThreadResourceResolver != null ) {
-            final ResourceResolver rr = this.perThreadResourceResolver.get();
-            if ( rr == null || !rr.isLive() ) {
-                this.perThreadResourceResolver = null;
-                this.activeResource = this.sharedResourceResolver.getResource(this.activeResource.getPath());
-            }
+        ResourceResolver perThreadResolver = this.perThreadResourceResolver.get();
+        if ( perThreadResolver != null && perThreadResolver.isLive() ) {
+            return perThreadResolver.getResource(this.path);
+        }
+        if ( this.sharedResource == null ) {
+            this.sharedResource = this.sharedResourceResolver.getResource(this.path);
         }
-        return this.activeResource;
+        return this.sharedResource;
     }
 
     /**
      * @see org.apache.sling.api.resource.Resource#getResourceType()
      */
+    @Override
     public String getResourceType() {
         return this.getActiveResource().getResourceType();
     }
@@ -73,6 +79,7 @@ public class ScriptResource extends Abst
     /**
      * @see org.apache.sling.api.resource.Resource#getResourceSuperType()
      */
+    @Override
     public String getResourceSuperType() {
         return this.getActiveResource().getResourceSuperType();
     }
@@ -80,6 +87,7 @@ public class ScriptResource extends Abst
     /**
      * @see org.apache.sling.api.resource.Resource#getResourceResolver()
      */
+    @Override
     public ResourceResolver getResourceResolver() {
         return this.getActiveResource().getResourceResolver();
     }
@@ -95,6 +103,11 @@ public class ScriptResource extends Abst
             if ( s != null ) {
                 return (AdapterType)s;
             }
+        } else if ( type == SlingScript.class ) {
+            final SlingScript s = (SlingScript)super.adaptTo(type);
+            if ( s != null ) {
+                return (AdapterType)s;
+            }
         }
         return this.getActiveResource().adaptTo(type);
     }
@@ -102,13 +115,15 @@ public class ScriptResource extends Abst
     /**
      * @see org.apache.sling.api.resource.Resource#getPath()
      */
+    @Override
     public String getPath() {
-        return this.getActiveResource().getPath();
+        return this.path;
     }
 
     /**
      * @see org.apache.sling.api.resource.Resource#getResourceMetadata()
      */
+    @Override
     public ResourceMetadata getResourceMetadata() {
         return this.getActiveResource().getResourceMetadata();
     }
@@ -118,7 +133,7 @@ public class ScriptResource extends Abst
      */
     @Override
     public String getName() {
-        return this.getActiveResource().getName();
+        return ResourceUtil.getName(this.path);
     }
 
     /**

Modified: sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java?rev=1705802&r1=1705801&r2=1705802&view=diff
==============================================================================
--- sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java (original)
+++ sling/trunk/bundles/servlets/resolver/src/main/java/org/apache/sling/servlets/resolver/internal/SlingServletResolver.java Tue Sep 29 05:41:33 2015
@@ -341,7 +341,7 @@ public class SlingServletResolver
         // return a resource wrapper to make sure the implementation
         // switches from the per thread resource resolver to the shared once
         // the per thread resource resolver is closed
-        return new ScriptResource(scriptResource, this.sharedScriptResolver).adaptTo(Servlet.class);
+        return new ScriptResource(scriptResource, perThreadScriptResolver, this.sharedScriptResolver).adaptTo(Servlet.class);
     }
 
     // ---------- ScriptResolver interface ------------------------------------