Author: cziegeler
Date: Mon Dec 16 07:05:14 2013
New Revision: 1551124

URL: http://svn.apache.org/r1551124
Log:
Some code optimizations

Modified:
    
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/AccessGateResourceWrapper.java
    
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessGateHandler.java
    
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java

Modified: 
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/AccessGateResourceWrapper.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/AccessGateResourceWrapper.java?rev=1551124&r1=1551123&r2=1551124&view=diff
==============================================================================
--- 
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/AccessGateResourceWrapper.java
 (original)
+++ 
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/AccessGateResourceWrapper.java
 Mon Dec 16 07:05:14 2013
@@ -25,16 +25,16 @@ import org.apache.sling.api.resource.Res
 import org.apache.sling.resourceaccesssecurity.ResourceAccessGate;
 
 /**
- * The <code>AccessGateResourceWrapper</code> wraps a <code>Resource</code> 
and 
+ * The <code>AccessGateResourceWrapper</code> wraps a <code>Resource</code> and
  * intercepts calls to adaptTo to wrap the adapted <code>ValueMap</code> or
  * also a <code>ModifiableValueMap</code> to enforce access rules defined
  * by implementations of <code>ResourceAccessGate</code>
  *
  */
 public class AccessGateResourceWrapper extends ResourceWrapper {
-    
+
     private List<ResourceAccessGate> accessGatesForValues;
-    
+
     /**
      * Creates a new wrapper instance delegating all method calls to the given
      * <code>resource</code>, but intercepts the calls with checks to the
@@ -51,7 +51,7 @@ public class AccessGateResourceWrapper e
      */
     @Override
     public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) {
-        //TODO intercept adaptions of ValueMap
+        //TODO intercept adaptions of ValueMap, ModifiableValueMap, and 
PersistableValueMap
         return getResource().adaptTo(type);
     }
 

Modified: 
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessGateHandler.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessGateHandler.java?rev=1551124&r1=1551123&r2=1551124&view=diff
==============================================================================
--- 
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessGateHandler.java
 (original)
+++ 
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessGateHandler.java
 Mon Dec 16 07:05:14 2013
@@ -17,8 +17,8 @@
  * under the License.
  */package org.apache.sling.resourceaccesssecurity.impl;
 
-import java.util.ArrayList;
-import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -27,21 +27,21 @@ import org.apache.sling.resourceaccessse
 import org.osgi.framework.ServiceReference;
 
 public class ResourceAccessGateHandler {
-    
-    private ResourceAccessGate resourceAccessGate;
-    
-    private Pattern pathPattern;
-    private List<ResourceAccessGate.Operation> operations = new 
ArrayList<ResourceAccessGate.Operation>();
-    private List<ResourceAccessGate.Operation> finalOperations = new 
ArrayList<ResourceAccessGate.Operation>();
-    
+
+    private final ResourceAccessGate resourceAccessGate;
+
+    private final Pattern pathPattern;
+    private final Set<ResourceAccessGate.Operation> operations = new 
HashSet<ResourceAccessGate.Operation>();
+    private final Set<ResourceAccessGate.Operation> finalOperations = new 
HashSet<ResourceAccessGate.Operation>();
+
     /**
      * constructor
      */
-    public ResourceAccessGateHandler ( ServiceReference resourceAccessGateRef 
) {
-        
+    public ResourceAccessGateHandler ( final ServiceReference 
resourceAccessGateRef ) {
+
         resourceAccessGate = (ResourceAccessGate) 
resourceAccessGateRef.getBundle().
                 getBundleContext().getService(resourceAccessGateRef);
-        /* extract the service property "path" */
+        // extract the service property "path"
         String path = (String) 
resourceAccessGateRef.getProperty(ResourceAccessGate.PATH);
         if ( path != null ) {
             pathPattern = Pattern.compile(path);
@@ -50,59 +50,54 @@ public class ResourceAccessGateHandler {
         {
             pathPattern = Pattern.compile(".*");
         }
-        
-        /* extract the service property "operations" */
+
+        // extract the service property "operations"
         String ops = (String) 
resourceAccessGateRef.getProperty(ResourceAccessGate.OPERATIONS);
         if ( ops != null ) {
             String[] opsArray = PropertiesUtil.toStringArray(ops);
             for (String opAsString : opsArray) {
                 ResourceAccessGate.Operation operation = 
ResourceAccessGate.Operation.fromString(opAsString);
-                if ( operation != null )
-                {
+                if ( operation != null ) {
                     operations.add(operation);
                 }
             }
-        }
-        else
-        {
+        } else {
            for (ResourceAccessGate.Operation op : 
ResourceAccessGate.Operation.values() ) {
                operations.add(op);
            }
         }
-        
-        /* extract the service property "finaloperations" */
+
+        // extract the service property "finaloperations"
         String finOps = (String) 
resourceAccessGateRef.getProperty(ResourceAccessGate.FINALOPERATIONS);
         if ( finOps != null ) {
             String[] finOpsArray = PropertiesUtil.toStringArray(finOps);
             for (String opAsString : finOpsArray) {
                 ResourceAccessGate.Operation operation = 
ResourceAccessGate.Operation.fromString(opAsString);
-                if ( operation != null )
-                {
+                if ( operation != null ) {
                     finalOperations.add(operation);
                 }
             }
         }
 
     }
-    
-    public boolean matches ( String path, ResourceAccessGate.Operation 
operation ) {
+
+    public boolean matches ( final String path, final 
ResourceAccessGate.Operation operation ) {
         boolean returnValue = false;
-        
-        if ( operations.contains( operation ) )
-        {
-            Matcher match = pathPattern.matcher(path);
+
+        if ( operations.contains( operation ) ) {
+            final Matcher match = pathPattern.matcher(path);
             returnValue = match.matches();
         }
-        
+
         return returnValue;
     }
-    
-    public boolean isFinalOperation( ResourceAccessGate.Operation operation ) {
+
+    public boolean isFinalOperation( final ResourceAccessGate.Operation 
operation ) {
         return finalOperations.contains(operation);
     }
-    
+
     public ResourceAccessGate getResourceAccessGate () {
         return resourceAccessGate;
     }
-    
+
 }

Modified: 
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java?rev=1551124&r1=1551123&r2=1551124&view=diff
==============================================================================
--- 
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java
 (original)
+++ 
sling/trunk/bundles/resourceaccesssecurity/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java
 Mon Dec 16 07:05:14 2013
@@ -19,7 +19,9 @@
 package org.apache.sling.resourceaccesssecurity.impl;
 
 import java.util.ArrayList;
+import java.util.Iterator;
 import java.util.List;
+import java.util.NoSuchElementException;
 
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
@@ -62,81 +64,113 @@ public class ResourceAccessSecurityImpl 
         resourceAccessGateTracker.close();
     }
 
-    private List<ResourceAccessGateHandler> 
getMatchingResourceAccessGateHandlers(
+    /**
+     * This method returns either an iterator delivering the matching handlers
+     * or <code>null</code>.
+     */
+    private Iterator<ResourceAccessGateHandler> 
getMatchingResourceAccessGateHandlerIterator(
             final String path, final ResourceAccessGate.Operation operation) {
         //
         // TODO: maybe caching some frequent paths with read operation would be
         // a good idea
         //
         final List<ResourceAccessGateHandler> handlers = 
resourceAccessGateTracker.getResourceAccessGateHandlers();
-        List<ResourceAccessGateHandler> returnValue = handlers;
 
         if (handlers.size() > 0) {
-            returnValue = new ArrayList<ResourceAccessGateHandler>();
 
-            for (ResourceAccessGateHandler resourceAccessGateHandler : 
handlers) {
-                if (resourceAccessGateHandler.matches(path, operation)) {
-                    returnValue.add(resourceAccessGateHandler);
+            final Iterator<ResourceAccessGateHandler> iter = 
handlers.iterator();
+            return new Iterator<ResourceAccessGateHandler>() {
+
+                private ResourceAccessGateHandler next = peek();
+
+                private ResourceAccessGateHandler peek() {
+                    this.next = null;
+                    while ( iter.hasNext() && next == null ) {
+                        final ResourceAccessGateHandler handler = iter.next();
+                        if (handler.matches(path, operation)) {
+                            next = handler;
+                        }
+                    }
+                    return next;
                 }
-            }
+
+                @Override
+                public boolean hasNext() {
+                    return next != null;
+                }
+
+                @Override
+                public ResourceAccessGateHandler next() {
+                    if ( next == null ) {
+                        throw new NoSuchElementException();
+                    }
+                    final ResourceAccessGateHandler handler = this.next;
+                    this.next = peek();
+                    return handler;
+                }
+
+                @Override
+                public void remove() {
+                    throw new UnsupportedOperationException();
+                }
+
+            };
         }
 
-        return returnValue;
+        return null;
     }
 
     @Override
     public Resource getReadableResource(final Resource resource) {
         Resource returnValue = resource;
-        ResourceResolver resResolver = resource.getResourceResolver();
 
-        List<ResourceAccessGateHandler> accessGateHandlers = 
getMatchingResourceAccessGateHandlers(
+        final Iterator<ResourceAccessGateHandler> accessGateHandlers = 
getMatchingResourceAccessGateHandlerIterator(
                 resource.getPath(), ResourceAccessGate.Operation.READ);
+        if ( accessGateHandlers != null ) {
+            final ResourceResolver resResolver = 
resource.getResourceResolver();
 
-        GateResult finalGateResult = null;
-        boolean canReadAllValues = false;
-        List<ResourceAccessGate> accessGatesForValues = null;
-
-        for (ResourceAccessGateHandler resourceAccessGateHandler : 
accessGateHandlers) {
-            GateResult gateResult = resourceAccessGateHandler
-                    .getResourceAccessGate().canRead(resource);
-            if (!canReadAllValues && gateResult == GateResult.GRANTED) {
-                if (resourceAccessGateHandler.getResourceAccessGate()
-                        .canReadAllValues(resource)) {
-                    canReadAllValues = true;
-                    accessGatesForValues = null;
-                } else {
-                    if (accessGatesForValues == null) {
-                        accessGatesForValues = new 
ArrayList<ResourceAccessGate>();
+            GateResult finalGateResult = null;
+            boolean canReadAllValues = false;
+            List<ResourceAccessGate> accessGatesForValues = null;
+
+            while ( accessGateHandlers.hasNext() ) {
+                final ResourceAccessGateHandler resourceAccessGateHandler  = 
accessGateHandlers.next();
+
+                final GateResult gateResult = 
resourceAccessGateHandler.getResourceAccessGate().canRead(resource);
+                if (!canReadAllValues && gateResult == GateResult.GRANTED) {
+                    if 
(resourceAccessGateHandler.getResourceAccessGate().canReadAllValues(resource)) {
+                        canReadAllValues = true;
+                        accessGatesForValues = null;
+                    } else {
+                        if (accessGatesForValues == null) {
+                            accessGatesForValues = new 
ArrayList<ResourceAccessGate>();
+                        }
+                        
accessGatesForValues.add(resourceAccessGateHandler.getResourceAccessGate());
                     }
-                    accessGatesForValues.add(resourceAccessGateHandler
-                            .getResourceAccessGate());
+                }
+                if (finalGateResult == null) {
+                    finalGateResult = gateResult;
+                } else if (finalGateResult == GateResult.DENIED) {
+                    finalGateResult = gateResult;
+                }
+                if 
(resourceAccessGateHandler.isFinalOperation(ResourceAccessGate.Operation.READ)) 
{
+                    break;
                 }
             }
-            if (finalGateResult == null) {
-                finalGateResult = gateResult;
-            } else if (finalGateResult == GateResult.DENIED) {
-                finalGateResult = gateResult;
+
+            // return NonExistingResource if access is denied or no
+            // ResourceAccessGate is present
+            if (finalGateResult == null || finalGateResult == 
GateResult.DENIED) {
+                returnValue = new 
NonExistingResource(resResolver,resource.getPath());
+            } else if (finalGateResult == GateResult.DONTCARE) {
+                returnValue = resource;
             }
-            if (resourceAccessGateHandler
-                    .isFinalOperation(ResourceAccessGate.Operation.READ)) {
-                break;
+            // wrap Resource if read access is not or partly (values) not 
granted
+            else if (!canReadAllValues) {
+                returnValue = new AccessGateResourceWrapper(resource,
+                        accessGatesForValues);
             }
         }
-
-        // return NonExistingResource if access is denied or no
-        // ResourceAccessGate is present
-        if (finalGateResult == null || finalGateResult == GateResult.DENIED) {
-            returnValue = new NonExistingResource(resResolver,
-                    resource.getPath());
-        } else if (finalGateResult == GateResult.DONTCARE) {
-            returnValue = resource;
-        }
-        // wrap Resource if read access is not or partly (values) not granted
-        else if (!canReadAllValues) {
-            returnValue = new AccessGateResourceWrapper(resource,
-                    accessGatesForValues);
-        }
-
         return returnValue;
     }
 


Reply via email to