SLING-3458 - Restrictions imposed by ProviderResourceAccessSecurity should not be discarded by ApplicationResourceAccessSecurity, 
SLING-3462 - Make ResourceAccessSecurity provider context and application context behave the same way

git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1579213 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/java/org/apache/sling/resourceaccesssecurity/AllowingResourceAccessGate.java b/src/main/java/org/apache/sling/resourceaccesssecurity/AllowingResourceAccessGate.java
index 1e7d8c7..2570f81 100644
--- a/src/main/java/org/apache/sling/resourceaccesssecurity/AllowingResourceAccessGate.java
+++ b/src/main/java/org/apache/sling/resourceaccesssecurity/AllowingResourceAccessGate.java
@@ -32,48 +32,48 @@
 
     @Override
     public GateResult canRead(final Resource resource) {
-        return GateResult.DONTCARE;
+        return GateResult.CANT_DECIDE;
     }
 
     @Override
     public GateResult canCreate(final String absPathName,
             final ResourceResolver resourceResolver) {
-        return GateResult.DONTCARE;
+        return GateResult.CANT_DECIDE;
     }
 
     @Override
     public GateResult canUpdate(final Resource resource) {
-        return GateResult.DONTCARE;
+        return GateResult.CANT_DECIDE;
     }
 
     @Override
     public GateResult canDelete(final Resource resource) {
-        return GateResult.DONTCARE;
+        return GateResult.CANT_DECIDE;
     }
 
     @Override
     public GateResult canExecute(final Resource resource) {
-        return GateResult.DONTCARE;
+        return GateResult.CANT_DECIDE;
     }
 
     @Override
     public GateResult canReadValue(final Resource resource, final String valueName) {
-        return GateResult.DONTCARE;
+        return GateResult.CANT_DECIDE;
     }
 
     @Override
     public GateResult canCreateValue(final Resource resource, final String valueName) {
-        return GateResult.DONTCARE;
+        return GateResult.CANT_DECIDE;
     }
 
     @Override
     public GateResult canUpdateValue(final Resource resource, final String valueName) {
-        return GateResult.DONTCARE;
+        return GateResult.CANT_DECIDE;
     }
 
     @Override
     public GateResult canDeleteValue(final Resource resource, final String valueName) {
-        return GateResult.DONTCARE;
+        return GateResult.CANT_DECIDE;
     }
 
     @Override
diff --git a/src/main/java/org/apache/sling/resourceaccesssecurity/ResourceAccessGate.java b/src/main/java/org/apache/sling/resourceaccesssecurity/ResourceAccessGate.java
index 4b096e8..6ee4e2b 100644
--- a/src/main/java/org/apache/sling/resourceaccesssecurity/ResourceAccessGate.java
+++ b/src/main/java/org/apache/sling/resourceaccesssecurity/ResourceAccessGate.java
@@ -123,7 +123,7 @@
      * </ul>
      */
     public enum GateResult {
-        GRANTED, DENIED, DONTCARE
+        GRANTED, DENIED, CANT_DECIDE
     };
 
     public enum Operation {
diff --git a/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ApplicationResourceAccessSecurityImpl.java b/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ApplicationResourceAccessSecurityImpl.java
index e784236..d4ac38e 100644
--- a/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ApplicationResourceAccessSecurityImpl.java
+++ b/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ApplicationResourceAccessSecurityImpl.java
@@ -37,6 +37,6 @@
 public class ApplicationResourceAccessSecurityImpl extends ResourceAccessSecurityImpl {
 
     public ApplicationResourceAccessSecurityImpl() {
-        super(true);
+        super(false);
     }
 }
diff --git a/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java b/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java
index 72279e5..cd1f200 100644
--- a/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java
+++ b/src/main/java/org/apache/sling/resourceaccesssecurity/impl/ResourceAccessSecurityImpl.java
@@ -36,10 +36,10 @@
 
     private List<ResourceAccessGateHandler> allHandlers = Collections.emptyList();
 
-    private final boolean defaultAllow;
+    private final boolean defaultAllowIfNoGateMatches;
 
-    public ResourceAccessSecurityImpl(final boolean defaultAllow) {
-        this.defaultAllow = defaultAllow;
+    public ResourceAccessSecurityImpl(final boolean defaultAllowIfNoGateMatches) {
+        this.defaultAllowIfNoGateMatches = defaultAllowIfNoGateMatches;
     }
 
     /**
@@ -101,7 +101,7 @@
 
     @Override
     public Resource getReadableResource(final Resource resource) {
-        Resource returnValue = (this.defaultAllow ? resource : null);
+        Resource returnValue = null;
 
         final Iterator<ResourceAccessGateHandler> accessGateHandlers = getMatchingResourceAccessGateHandlerIterator(
                 resource.getPath(), ResourceAccessGate.Operation.READ);
@@ -113,7 +113,10 @@
 
         if ( accessGateHandlers != null ) {
 
+            boolean noGateMatched = true;
+            
             while ( accessGateHandlers.hasNext() ) {
+                noGateMatched = false;
                 final ResourceAccessGateHandler resourceAccessGateHandler  = accessGateHandlers.next();
 
                 final GateResult gateResult = resourceAccessGateHandler.getResourceAccessGate().canRead(resource);
@@ -130,23 +133,24 @@
                 }
                 if (finalGateResult == null) {
                     finalGateResult = gateResult;
-                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.DONTCARE) {
+                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.CANT_DECIDE) {
                     finalGateResult = gateResult;
                 }
                 // stop checking if the operation is final and the result not GateResult.DONTCARE
-                if (gateResult != GateResult.DONTCARE  && resourceAccessGateHandler.isFinalOperation(ResourceAccessGate.Operation.READ)) {
+                if (gateResult != GateResult.CANT_DECIDE  && resourceAccessGateHandler.isFinalOperation(ResourceAccessGate.Operation.READ)) {
                     break;
                 }
             }
 
 
             // return null if access is denied or no ResourceAccessGate is present
-            if (finalGateResult == null || finalGateResult == GateResult.DENIED) {
+            if (finalGateResult == GateResult.DENIED) {
                 returnValue = null;
-            } else if (finalGateResult == GateResult.DONTCARE) {
-                returnValue = (this.defaultAllow ? resource : null);
             } else if (finalGateResult == GateResult.GRANTED ) {
                 returnValue = resource;
+            } else if (noGateMatched && this.defaultAllowIfNoGateMatches)
+            {
+                returnValue = resource;
             }
         }
 
@@ -169,20 +173,22 @@
             final ResourceResolver resolver) {
         final Iterator<ResourceAccessGateHandler> handlers = getMatchingResourceAccessGateHandlerIterator(
                 path, ResourceAccessGate.Operation.CREATE);
-        boolean result = this.defaultAllow;
+        boolean result = false;
         if ( handlers != null ) {
             GateResult finalGateResult = null;
+            boolean noGateMatched = true;
 
             while ( handlers.hasNext() ) {
+                noGateMatched = false;
                 final ResourceAccessGateHandler resourceAccessGateHandler  = handlers.next();
 
                 final GateResult gateResult = resourceAccessGateHandler.getResourceAccessGate().canCreate(path, resolver);
                 if (finalGateResult == null) {
                     finalGateResult = gateResult;
-                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.DONTCARE) {
+                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.CANT_DECIDE) {
                     finalGateResult = gateResult;
                 }
-                if (finalGateResult == GateResult.GRANTED || gateResult != GateResult.DONTCARE && 
+                if (finalGateResult == GateResult.GRANTED || gateResult != GateResult.CANT_DECIDE && 
                         resourceAccessGateHandler.isFinalOperation(ResourceAccessGate.Operation.CREATE)) {
                     break;
                 }
@@ -192,6 +198,9 @@
                 result = true;
             } else if ( finalGateResult == GateResult.DENIED ) {
                 result = false;
+            } else if ( noGateMatched && this.defaultAllowIfNoGateMatches )
+            {
+                result = true;
             }
         }
         return result;
@@ -201,20 +210,22 @@
     public boolean canUpdate(final Resource resource) {
         final Iterator<ResourceAccessGateHandler> handlers = getMatchingResourceAccessGateHandlerIterator(
                 resource.getPath(), ResourceAccessGate.Operation.UPDATE);
-        boolean result = this.defaultAllow;
+        boolean result = this.defaultAllowIfNoGateMatches;
         if ( handlers != null ) {
             GateResult finalGateResult = null;
+            boolean noGateMatched = true;
 
             while ( handlers.hasNext() ) {
+                noGateMatched = false;
                 final ResourceAccessGateHandler resourceAccessGateHandler  = handlers.next();
 
                 final GateResult gateResult = resourceAccessGateHandler.getResourceAccessGate().canUpdate(resource);
                 if (finalGateResult == null) {
                     finalGateResult = gateResult;
-                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.DONTCARE) {
+                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.CANT_DECIDE) {
                     finalGateResult = gateResult;
                 }
-                if (finalGateResult == GateResult.GRANTED || gateResult != GateResult.DONTCARE && 
+                if (finalGateResult == GateResult.GRANTED || gateResult != GateResult.CANT_DECIDE && 
                         resourceAccessGateHandler.isFinalOperation(ResourceAccessGate.Operation.UPDATE)) {
                     break;
                 }
@@ -224,6 +235,9 @@
                 result = true;
             } else if ( finalGateResult == GateResult.DENIED ) {
                 result = false;
+            } else if ( noGateMatched && this.defaultAllowIfNoGateMatches )
+            {
+                result = true;
             }
         }
         return result;
@@ -233,20 +247,22 @@
     public boolean canDelete(final Resource resource) {
         final Iterator<ResourceAccessGateHandler> handlers = getMatchingResourceAccessGateHandlerIterator(
                 resource.getPath(), ResourceAccessGate.Operation.DELETE);
-        boolean result = this.defaultAllow;
+        boolean result = this.defaultAllowIfNoGateMatches;
         if ( handlers != null ) {
             GateResult finalGateResult = null;
+            boolean noGateMatched = true;
 
             while ( handlers.hasNext() ) {
+                noGateMatched = false;
                 final ResourceAccessGateHandler resourceAccessGateHandler  = handlers.next();
 
                 final GateResult gateResult = resourceAccessGateHandler.getResourceAccessGate().canDelete(resource);
                 if (finalGateResult == null) {
                     finalGateResult = gateResult;
-                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.DONTCARE) {
+                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.CANT_DECIDE) {
                     finalGateResult = gateResult;
                 }
-                if (finalGateResult == GateResult.GRANTED || gateResult != GateResult.DONTCARE && 
+                if (finalGateResult == GateResult.GRANTED || gateResult != GateResult.CANT_DECIDE && 
                         resourceAccessGateHandler.isFinalOperation(ResourceAccessGate.Operation.DELETE)) {
                     break;
                 }
@@ -256,6 +272,9 @@
                 result = true;
             } else if ( finalGateResult == GateResult.DENIED ) {
                 result = false;
+            } else if ( noGateMatched && this.defaultAllowIfNoGateMatches )
+            {
+                result = true;
             }
         }
         return result;
@@ -265,20 +284,22 @@
     public boolean canExecute(final Resource resource) {
         final Iterator<ResourceAccessGateHandler> handlers = getMatchingResourceAccessGateHandlerIterator(
                 resource.getPath(), ResourceAccessGate.Operation.EXECUTE);
-        boolean result = this.defaultAllow;
+        boolean result = this.defaultAllowIfNoGateMatches;
         if ( handlers != null ) {
             GateResult finalGateResult = null;
+            boolean noGateMatched = true;
 
             while ( handlers.hasNext() ) {
+                noGateMatched = false;
                 final ResourceAccessGateHandler resourceAccessGateHandler  = handlers.next();
 
                 final GateResult gateResult = resourceAccessGateHandler.getResourceAccessGate().canExecute(resource);
                 if (finalGateResult == null) {
                     finalGateResult = gateResult;
-                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.DONTCARE) {
+                } else if (finalGateResult != GateResult.GRANTED && gateResult != GateResult.CANT_DECIDE) {
                     finalGateResult = gateResult;
                 }
-                if (finalGateResult == GateResult.GRANTED || gateResult != GateResult.DONTCARE && resourceAccessGateHandler.isFinalOperation(ResourceAccessGate.Operation.EXECUTE)) {
+                if (finalGateResult == GateResult.GRANTED || gateResult != GateResult.CANT_DECIDE && resourceAccessGateHandler.isFinalOperation(ResourceAccessGate.Operation.EXECUTE)) {
                     break;
                 }
             }
@@ -287,6 +308,9 @@
                 result = true;
             } else if ( finalGateResult == GateResult.DENIED ) {
                 result = false;
+            } else if ( noGateMatched && this.defaultAllowIfNoGateMatches )
+            {
+                result = true;
             }
         }
         return result;
@@ -295,19 +319,19 @@
     @Override
     public boolean canReadValue(final Resource resource, final String valueName) {
         // TODO Auto-generated method stub
-        return this.defaultAllow;
+        return false;
     }
 
     @Override
     public boolean canSetValue(final Resource resource, final String valueName) {
         // TODO Auto-generated method stub
-        return this.defaultAllow;
+        return false;
     }
 
     @Override
     public boolean canDeleteValue(final Resource resource, final String valueName) {
         // TODO Auto-generated method stub
-        return this.defaultAllow;
+        return false;
     }
 
     @Override