Author: cziegeler
Date: Sun Dec 15 22:51:43 2013
New Revision: 1551072

URL: http://svn.apache.org/r1551072
Log:
SLING-3285 : ResourceResolver.isResourceType() creates admin session for every 
call with super type, slowing down processing

Modified:
    
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
    
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java

Modified: 
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java?rev=1551072&r1=1551071&r2=1551072&view=diff
==============================================================================
--- 
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
 (original)
+++ 
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverImpl.java
 Sun Dec 15 22:51:43 2013
@@ -1094,7 +1094,7 @@ public class ResourceResolverImpl extend
     public boolean hasChanges() {
         return this.context.hasChanges(this);
     }
-    
+
     /**
      * @see org.apache.sling.api.resource.ResourceResolver#hasChildren()
      */
@@ -1120,28 +1120,7 @@ public class ResourceResolverImpl extend
      * @see 
org.apache.sling.api.resource.ResourceResolver#getParentResourceType(java.lang.String)
      */
     public String getParentResourceType(final String resourceType) {
-        // normalize resource type to a path string
-        final String rtPath = (resourceType == null ? null : 
ResourceUtil.resourceTypeToPath(resourceType));
-        // get the resource type resource and check its super type
-        String resourceSuperType = null;
-
-        if ( rtPath != null ) {
-            ResourceResolver adminResolver = null;
-            try {
-                adminResolver = 
this.factory.getAdministrativeResourceResolver(null);
-                final Resource rtResource = adminResolver.getResource(rtPath);
-                if (rtResource != null) {
-                    resourceSuperType = rtResource.getResourceSuperType();
-                }
-            } catch (final LoginException e) {
-                // we simply ignore this and return null
-            } finally {
-                if ( adminResolver != null ) {
-                    adminResolver.close();
-                }
-            }
-        }
-        return resourceSuperType;
+        return this.context.getParentResourceType(this.factory, this, 
resourceType);
     }
 
     /**

Modified: 
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java?rev=1551072&r1=1551071&r2=1551072&view=diff
==============================================================================
--- 
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java
 (original)
+++ 
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceResolverContext.java
 Sun Dec 15 22:51:43 2013
@@ -23,11 +23,15 @@ import java.util.Map;
 import java.util.Set;
 
 import org.apache.sling.api.resource.DynamicResourceProvider;
+import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.ModifyingResourceProvider;
 import org.apache.sling.api.resource.PersistenceException;
 import org.apache.sling.api.resource.RefreshableResourceProvider;
+import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceProvider;
 import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.apache.sling.api.resource.ResourceUtil;
 import org.osgi.util.tracker.ServiceTracker;
 
 /**
@@ -56,10 +60,13 @@ public class ResourceResolverContext {
      * The original authentication information - this is used for cloning and 
lazy logins.
      */
     private final Map<String, Object> originalAuthInfo;
-    
+
     /** service tracker for ResourceAccessSecurity service */
     private final ServiceTracker resourceAccessSecurityTracker;
 
+    /** Resource type resource resolver (admin resolver) */
+    private ResourceResolver resourceTypeResourceResolver;
+
     /**
      * Create a new resource resolver context.
      */
@@ -134,6 +141,10 @@ public class ResourceResolverContext {
         this.dynamicProviders.clear();
         this.providers.clear();
         this.refreshableProviders.clear();
+        if ( this.resourceTypeResourceResolver != null ) {
+            this.resourceTypeResourceResolver.close();
+            this.resourceTypeResourceResolver = null;
+        }
     }
 
     /**
@@ -174,12 +185,54 @@ public class ResourceResolverContext {
             provider.refresh();
         }
     }
-    
+
     /**
      * get's the ServiceTracker of the ResourceAccessSecurity service
      */
     public ServiceTracker getResourceAccessSecurityTracker () {
         return resourceAccessSecurityTracker;
     }
-    
+
+    private ResourceResolver getResourceTypeResourceResolver(
+            final ResourceResolverFactory factory,
+            final ResourceResolver resolver) {
+        if ( this.isAdmin ) {
+            return resolver;
+        } else {
+            if ( this.resourceTypeResourceResolver == null ) {
+                try {
+                    this.resourceTypeResourceResolver = 
factory.getAdministrativeResourceResolver(null);
+                } catch (final LoginException e) {
+                    // we simply ignore this and return null
+                }
+            }
+            return this.resourceTypeResourceResolver;
+        }
+    }
+
+    /**
+     * Get the parent resource type
+     *
+     * @see 
org.apache.sling.api.resource.ResourceResolver#getParentResourceType(java.lang.String)
+     */
+    public String getParentResourceType(
+            final ResourceResolverFactory factory,
+            final ResourceResolver resolver,
+            final String resourceType) {
+        // normalize resource type to a path string
+        final String rtPath = (resourceType == null ? null : 
ResourceUtil.resourceTypeToPath(resourceType));
+        // get the resource type resource and check its super type
+        String resourceSuperType = null;
+
+        if ( rtPath != null ) {
+            ResourceResolver adminResolver = 
this.getResourceTypeResourceResolver(factory, resolver);
+            if ( adminResolver != null ) {
+                final Resource rtResource = adminResolver.getResource(rtPath);
+                if (rtResource != null) {
+                    resourceSuperType = rtResource.getResourceSuperType();
+                }
+            }
+        }
+        return resourceSuperType;
+    }
 }


Reply via email to