You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2013/03/12 13:45:55 UTC
svn commit: r1455511 - in /sling/trunk/bundles/api/src:
main/java/org/apache/sling/api/resource/ResourceMetadata.java
test/java/org/apache/sling/api/resource/ResourceMetadataTest.java
Author: bdelacretaz
Date: Tue Mar 12 12:45:55 2013
New Revision: 1455511
URL: http://svn.apache.org/r1455511
Log:
SLING-2785 - avoid recursion in get methods
Modified:
sling/trunk/bundles/api/src/main/java/org/apache/sling/api/resource/ResourceMetadata.java
sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceMetadataTest.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=1455511&r1=1455510&r2=1455511&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 Tue Mar 12 12:45:55 2013
@@ -306,7 +306,7 @@ public class ResourceMetadata extends Ha
*/
private void checkReadOnly() {
if ( this.isReadOnly ) {
- throw new UnsupportedOperationException();
+ throw new UnsupportedOperationException(getClass().getSimpleName() + " is locked");
}
}
@@ -334,36 +334,37 @@ public class ResourceMetadata extends Ha
return super.remove(key);
}
- private Map<String, Object> unmodifiableMap;
-
- private Map<String, Object> getUnmodifiableMap() {
- if ( this.unmodifiableMap == null ) {
- this.unmodifiableMap = Collections.unmodifiableMap(this);
+ private Set<Map.Entry<String, Object>> lockedEntrySet;
+ private Set<String> lockedKeySet;
+ private Collection<Object> lockedValues;
+
+ private void getLockedData() {
+ if(isReadOnly && lockedEntrySet == null) {
+ synchronized (this) {
+ if(isReadOnly && lockedEntrySet == null) {
+ lockedEntrySet = Collections.unmodifiableSet(super.entrySet());
+ lockedKeySet = Collections.unmodifiableSet(super.keySet());
+ lockedValues = Collections.unmodifiableCollection(super.values());
+ }
+ }
}
- return this.unmodifiableMap;
}
-
+
@Override
- public Set<java.util.Map.Entry<String, Object>> entrySet() {
- if ( this.isReadOnly ) {
- return this.getUnmodifiableMap().entrySet();
- }
- return super.entrySet();
+ public Set<Map.Entry<String, Object>> entrySet() {
+ getLockedData();
+ return lockedEntrySet != null ? lockedEntrySet : super.entrySet();
}
@Override
public Set<String> keySet() {
- if ( this.isReadOnly ) {
- return this.getUnmodifiableMap().keySet();
- }
- return super.keySet();
+ getLockedData();
+ return lockedKeySet != null ? lockedKeySet : super.keySet();
}
@Override
public Collection<Object> values() {
- if ( this.isReadOnly ) {
- return this.getUnmodifiableMap().values();
- }
- return super.values();
+ getLockedData();
+ return lockedValues != null ? lockedValues : super.values();
}
}
Modified: sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceMetadataTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceMetadataTest.java?rev=1455511&r1=1455510&r2=1455511&view=diff
==============================================================================
--- sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceMetadataTest.java (original)
+++ sling/trunk/bundles/api/src/test/java/org/apache/sling/api/resource/ResourceMetadataTest.java Tue Mar 12 12:45:55 2013
@@ -81,21 +81,21 @@ public class ResourceMetadataTest {
}
}
- @Test(expected=StackOverflowError.class)
+ @Test
public void testLockedEntrySet() {
final ResourceMetadata m = new ResourceMetadata();
m.lock();
m.entrySet().toString();
}
- @Test(expected=StackOverflowError.class)
+ @Test
public void testLockedKeySet() {
final ResourceMetadata m = new ResourceMetadata();
m.lock();
m.keySet().toString();
}
- @Test(expected=StackOverflowError.class)
+ @Test
public void testLockedValues() {
final ResourceMetadata m = new ResourceMetadata();
m.lock();