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/04/27 13:23:03 UTC

svn commit: r1676239 - in /sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl: CRUDMergingResourceProvider.java MergingResourceProvider.java

Author: cziegeler
Date: Mon Apr 27 11:23:03 2015
New Revision: 1676239

URL: http://svn.apache.org/r1676239
Log:
SLING-4568 : Performance: MergingResourceProvider.ParentHidingHandler adds about 30pp rendering overhead. Apply slightly modified patch from Joel Richard

Modified:
    sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/CRUDMergingResourceProvider.java
    sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/MergingResourceProvider.java

Modified: sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/CRUDMergingResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/CRUDMergingResourceProvider.java?rev=1676239&r1=1676238&r2=1676239&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/CRUDMergingResourceProvider.java (original)
+++ sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/CRUDMergingResourceProvider.java Mon Apr 27 11:23:03 2015
@@ -63,22 +63,30 @@ public class CRUDMergingResourceProvider
         holder.count = 0;
 
         // Loop over resources
+        boolean isUnderlying = true;
         final Iterator<Resource> iter = this.picker.pickResources(resolver, relativePath).iterator();
         while ( iter.hasNext() ) {
             final Resource rsrc = iter.next();
             holder.count++;
             holder.highestResourcePath = rsrc.getPath();
-            if ( !ResourceUtil.isNonExistingResource(rsrc) ) {
-                // check parent for hiding
-                final Resource parent = rsrc.getParent();
-                if ( parent != null ) {
-                    final boolean hidden = new ParentHidingHandler(parent, this.traverseHierarchie).isHidden(holder.name);
-                    if ( hidden ) {
-                        holder.resources.clear();
-                    } else {
-                        holder.resources.add(rsrc);
-                    }
+
+            if (!ResourceUtil.isNonExistingResource(rsrc)) {
+                final boolean hidden;
+                if (isUnderlying) {
+                    hidden = false;
+                } else {
+                    // check parent for hiding
+                    // SLING 3521 : if parent is not readable, nothing is hidden
+                    final Resource parent = rsrc.getParent();
+                    hidden = (parent == null ? false : new ParentHidingHandler(parent, this.traverseHierarchie).isHidden(holder.name));
+                }
+                if (hidden) {
+                    holder.resources.clear();
+                } else {
+                    holder.resources.add(rsrc);
                 }
+            } else {
+                isUnderlying = false;
             }
         }
 

Modified: sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/MergingResourceProvider.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/MergingResourceProvider.java?rev=1676239&r1=1676238&r2=1676239&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/MergingResourceProvider.java (original)
+++ sling/trunk/contrib/extensions/resourcemerger/src/main/java/org/apache/sling/resourcemerger/impl/MergingResourceProvider.java Mon Apr 27 11:23:03 2015
@@ -70,6 +70,10 @@ class MergingResourceProvider implements
         }
     }
 
+    /**
+     * Class to check whether a child resource must be hidden. It should not be instantiated for the underlying resource
+     * tree (which is /libs by default) because this check is expensive.
+     */
     protected static final class ParentHidingHandler {
 
         private List<ExcludeEntry> entries = new ArrayList<ExcludeEntry>();
@@ -213,16 +217,14 @@ class MergingResourceProvider implements
                 return null;
             }
 
-            boolean first = true;
+            boolean isUnderlying = true;
             while (resources.hasNext()) {
                 final Resource resource = resources.next();
 
                 final boolean hidden;
-                if (first) {
-                    // The ParentHidingHandler does not have to be executed for the first resource because it isn't an
-                    // overlay. This can drastically improve the performance in some cases.
+                if (isUnderlying) {
                     hidden = false;
-                    first = false;
+                    isUnderlying = false;
                 } else {
                     // check parent for hiding
                     // SLING 3521 : if parent is not readable, nothing is hidden
@@ -254,9 +256,12 @@ class MergingResourceProvider implements
 
             final Iterator<Resource> resources = picker.pickResources(resolver, relativePath).iterator();
 
+            boolean isUnderlying = true;
             while (resources.hasNext()) {
                 Resource parentResource = resources.next();
-                final ParentHidingHandler handler = new ParentHidingHandler(parentResource, this.traverseHierarchie);
+                final ParentHidingHandler handler = !isUnderlying ? new ParentHidingHandler(parentResource, this.traverseHierarchie) : null;
+                isUnderlying = false;
+
                 for (final Resource child : parentResource.getChildren()) {
                     final String rsrcName = child.getName();
                     ResourceHolder holder = null;
@@ -294,11 +299,13 @@ class MergingResourceProvider implements
                         candidates.remove(candidates.size() - 1);
                     }
                 }
-                final Iterator<ResourceHolder> iter = candidates.iterator();
-                while (iter.hasNext()) {
-                    final ResourceHolder holder = iter.next();
-                    if (handler.isHidden(holder.name)) {
-                        iter.remove();
+                if (handler != null) {
+                    final Iterator<ResourceHolder> iter = candidates.iterator();
+                    while (iter.hasNext()) {
+                        final ResourceHolder holder = iter.next();
+                        if (handler.isHidden(holder.name)) {
+                            iter.remove();
+                        }
                     }
                 }
             }