This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.resourcemerger-1.2.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourcemerger.git
commit b355a9589e61256905e59c02c0ae9b5bf020b5e4 Author: Carsten Ziegeler <[email protected]> AuthorDate: Sat Sep 13 13:35:37 2014 +0000 SLING-3909 : Merged ResourceProviders should be optionally modifiable git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/resourcemerger@1624735 13f79535-47bb-0310-9956-ffa450edef68 --- .../resourcemerger/impl/CRUDMergedResource.java | 105 ++++++++++++++++++++- .../impl/MergedResourceProviderTest.java | 52 ++++++++++ 2 files changed, 154 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/apache/sling/resourcemerger/impl/CRUDMergedResource.java b/src/main/java/org/apache/sling/resourcemerger/impl/CRUDMergedResource.java index f662c02..756a722 100644 --- a/src/main/java/org/apache/sling/resourcemerger/impl/CRUDMergedResource.java +++ b/src/main/java/org/apache/sling/resourcemerger/impl/CRUDMergedResource.java @@ -18,8 +18,12 @@ */ package org.apache.sling.resourcemerger.impl; +import java.util.Collection; +import java.util.HashMap; import java.util.Iterator; import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.sling.api.resource.ModifiableValueMap; import org.apache.sling.api.resource.PersistenceException; @@ -27,6 +31,8 @@ import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.resource.ValueMap; +import org.apache.sling.api.wrappers.DeepReadValueMapDecorator; +import org.apache.sling.api.wrappers.ValueMapDecorator; import org.apache.sling.resourcemerger.spi.MergedResourcePicker; /** @@ -75,14 +81,107 @@ public class CRUDMergedResource extends MergedResource { final Resource copyResource = this.getResourceResolver().getResource(paths[paths.length - 1]); try { final Resource newResource = ResourceUtil.getOrCreateResource(this.getResourceResolver(), highestRsrc.getPath(), copyResource.getResourceType(), null, false); - return (AdapterType)newResource.adaptTo(ModifiableValueMap.class); + final ModifiableValueMap target = newResource.adaptTo(ModifiableValueMap.class); + if ( target != null ) { + return (AdapterType)new ModifiableProperties(this, target); + } } catch ( final PersistenceException pe) { // we ignore this for now - return null; } + return super.adaptTo(type); + } + final ModifiableValueMap target = highestRsrc.adaptTo(ModifiableValueMap.class); + if ( target != null ) { + return (AdapterType)new ModifiableProperties(this, target); } - return (AdapterType)highestRsrc.adaptTo(ModifiableValueMap.class); } return super.adaptTo(type); } + + private static final class ModifiableProperties implements ModifiableValueMap { + + private final ModifiableValueMap targetMap; + + private final ValueMap properties; + + public ModifiableProperties(final Resource rsrc, final ModifiableValueMap targetMap) { + this.properties = new DeepReadValueMapDecorator(rsrc, new ValueMapDecorator(new HashMap<String, Object>(rsrc.getValueMap()))); + this.targetMap = targetMap; + } + + public <T> T get(final String name, final Class<T> type) { + return properties.get(name, type); + } + + public <T> T get(final String name, final T defaultValue) { + return properties.get(name, defaultValue); + } + + public int size() { + return properties.size(); + } + + public boolean isEmpty() { + return properties.isEmpty(); + } + + public boolean containsKey(final Object key) { + return properties.containsKey(key); + } + + public boolean containsValue(final Object value) { + return properties.containsValue(value); + } + + public Object get(final Object key) { + return properties.get(key); + } + + public Object put(final String key, final Object value) { + final Object result = this.properties.get(key); + this.targetMap.put(key, value); + return result; + } + + public Object remove(final Object key) { + final Object result = this.properties.get(key); + if ( this.targetMap.remove(key) == null ) { + final String[] hiddenProps = this.targetMap.get(MergedResourceConstants.PN_HIDE_PROPERTIES, String[].class); + final String[] newHiddenProps; + if ( hiddenProps == null || hiddenProps.length == 0 ) { + newHiddenProps = new String[] {key.toString()}; + } else { + newHiddenProps = new String[hiddenProps.length + 1]; + System.arraycopy(hiddenProps, 0, newHiddenProps, 0, hiddenProps.length); + newHiddenProps[hiddenProps.length] = key.toString(); + } + this.targetMap.put(MergedResourceConstants.PN_HIDE_PROPERTIES, newHiddenProps); + } + return result; + } + + public void putAll(final Map<? extends String, ? extends Object> m) { + if ( m != null ) { + for(final Map.Entry<? extends String, ? extends Object> entry : m.entrySet()) { + this.put(entry.getKey(), entry.getValue()); + } + } + } + + public void clear() { + // not supported + } + + public Set<String> keySet() { + return this.properties.keySet(); + } + + public Collection<Object> values() { + return this.properties.values(); + } + + public Set<Entry<String, Object>> entrySet() { + return this.properties.entrySet(); + } + } } diff --git a/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java b/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java index cded41b..30fe6e4 100644 --- a/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java +++ b/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java @@ -28,6 +28,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; +import org.apache.sling.api.resource.ModifiableValueMap; import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; @@ -66,6 +67,7 @@ public class MergedResourceProviderTest { .resource(".X") .resource("/libs") .resource("deleteTest") + .resource(".mvmTest").p("a", "1").p("b", "2") .resource(".a") .resource("1").p("a", "5").p("c", "2") .resource(".2").p(ResourceResolver.PROPERTY_RESOURCE_TYPE, "libs") @@ -228,4 +230,54 @@ public class MergedResourceProviderTest { this.resolver.revert(); } } + + @Test public void testModifiableValueMap() throws PersistenceException { + final String path = "/merged/mvmTest"; + try { + assertNotNull(this.resolver.getResource("/libs/mvmTest")); + assertNull(this.resolver.getResource("/apps/mvmTest")); + + final Resource rsrc = this.provider.getResource(this.resolver, path); + assertNotNull(rsrc); + final ValueMap beforeVM = rsrc.getValueMap(); + assertEquals("1", beforeVM.get("a")); + assertEquals("2", beforeVM.get("b")); + + final ModifiableValueMap mvm = rsrc.adaptTo(ModifiableValueMap.class); + assertNotNull(mvm); + assertEquals("1", mvm.get("a")); + assertEquals("2", mvm.get("b")); + + mvm.put("c", "3"); + mvm.remove("a"); + + assertNotNull(this.resolver.getResource("/libs/mvmTest")); + assertNotNull(this.resolver.getResource("/apps/mvmTest")); + + final Resource rsrc2 = this.provider.getResource(this.resolver, path); + assertNotNull(rsrc2); + final ValueMap afterVM = rsrc2.getValueMap(); + assertNull(afterVM.get("a")); + assertEquals("2", afterVM.get("b")); + assertEquals("3", afterVM.get("c")); + + final Resource rsrcL = this.resolver.getResource("/libs/mvmTest"); + assertEquals("1", rsrcL.getValueMap().get("a")); + assertEquals("2", rsrcL.getValueMap().get("b")); + assertNull(rsrcL.getValueMap().get("c")); + + final Resource rsrcA = this.resolver.getResource("/apps/mvmTest"); + assertNull(rsrcA.getValueMap().get("a")); + assertNull(rsrcA.getValueMap().get("b")); + assertEquals("3", rsrcA.getValueMap().get("c")); + final String[] hidden = rsrcA.getValueMap().get(MergedResourceConstants.PN_HIDE_PROPERTIES, String[].class); + assertNotNull(hidden); + assertEquals(1, hidden.length); + assertEquals("a", hidden[0]); + + } finally { + this.resolver.revert(); + } + + } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
