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 ------------------------------------