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 2013/03/08 07:56:12 UTC

svn commit: r1454255 - in /sling/trunk/bundles: api/src/main/java/org/apache/sling/api/resource/ResourceMetadata.java resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceDecoratorTracker.java

Author: cziegeler
Date: Fri Mar  8 06:56:12 2013
New Revision: 1454255

URL: http://svn.apache.org/r1454255
Log:
SLING-2780 :  Make ResourceMetadata read-only when delivered to client code 

Modified:
    sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceMetadata.java
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceDecoratorTracker.java

Modified: sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceMetadata.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceMetadata.java?rev=1454255&r1=1454254&r2=1454255&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceMetadata.java (original)
+++ sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceMetadata.java Fri Mar  8 06:56:12 2013
@@ -18,7 +18,11 @@
  */
 package org.apache.sling.api.resource;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
 
 /**
  * The <code>ResourceMetadata</code> interface defines the API for the
@@ -33,6 +37,9 @@ import java.util.HashMap;
  * <p>
  * Note, that the prefix <em>sling.</em> to key names is reserved for the
  * Sling implementation.
+ *
+ * Once a resource is returned by the {@link ResourceResolver}, the resource
+ * metadata is made read-only and therefore can't be changed by client code!
  */
 public class ResourceMetadata extends HashMap<String, Object> {
 
@@ -119,6 +126,8 @@ public class ResourceMetadata extends Ha
      */
     public static final String INTERNAL_CONTINUE_RESOLVING = ":org.apache.sling.resource.internal.continue.resolving";
 
+    private boolean isReadOnly = false;
+
     /**
      * Sets the {@link #CHARACTER_ENCODING} property to <code>encoding</code>
      * if not <code>null</code>.
@@ -283,4 +292,71 @@ public class ResourceMetadata extends Ha
 
         return null;
     }
+
+    /**
+     * Make this object read-only. All method calls trying to modify this object
+     * result in an exception!
+     */
+    public void makeReadOnly() {
+        this.isReadOnly = true;
+    }
+
+    /**
+     * Check if this object is read only and if so throw an unsupported operation exception.
+     */
+    private void checkReadOnly() {
+        if ( this.isReadOnly ) {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    @Override
+    public void clear() {
+        this.checkReadOnly();
+        super.clear();
+    }
+
+    @Override
+    public Set<java.util.Map.Entry<String, Object>> entrySet() {
+        if ( this.isReadOnly ) {
+            // TODO - commons collections?
+            //return new UnmodifiableEntrySet(super.entrySet());
+        }
+        return super.entrySet();
+    }
+
+    @Override
+    public Object put(final String key, final Object value) {
+        this.checkReadOnly();
+        return super.put(key, value);
+    }
+
+    @Override
+    public void putAll(final Map<? extends String, ? extends Object> m) {
+        this.checkReadOnly();
+        super.putAll(m);
+    }
+
+    @Override
+    public Object remove(final Object key) {
+        this.checkReadOnly();
+        return super.remove(key);
+    }
+
+
+    @Override
+    public Set<String> keySet() {
+        if ( this.isReadOnly ) {
+            return Collections.unmodifiableSet(super.keySet());
+        }
+        return super.keySet();
+    }
+
+    @Override
+    public Collection<Object> values() {
+        if ( this.isReadOnly ) {
+            return Collections.unmodifiableCollection(super.values());
+        }
+        return super.values();
+    }
 }

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceDecoratorTracker.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceDecoratorTracker.java?rev=1454255&r1=1454254&r2=1454255&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceDecoratorTracker.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/helper/ResourceDecoratorTracker.java Fri Mar  8 06:56:12 2013
@@ -67,11 +67,14 @@ public class ResourceDecoratorTracker {
             }
         }
 
+        // make resource metadata read-only
+        result.getResourceMetadata().makeReadOnly();
+
         return result;
     }
 
     /**
-     * Bind a resouce decorator.
+     * Bind a resource decorator.
      */
     public void bindResourceDecorator(final ResourceDecorator decorator,
             final Map<String, Object> props) {