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