Author: sseifert
Date: Mon Sep 29 16:50:41 2014
New Revision: 1628219

URL: http://svn.apache.org/r1628219
Log:
SLING-1778 initial sling superimposing resource provider implementation

Modified:
    
sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/SuperimposingManager.java
    
sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/impl/SuperimposingManagerImpl.java
    
sling/trunk/contrib/extensions/superimposing/src/test/java/org/apache/sling/superimposing/impl/SuperimposingManagerImplTest.java

Modified: 
sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/SuperimposingManager.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/SuperimposingManager.java?rev=1628219&r1=1628218&r2=1628219&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/SuperimposingManager.java
 (original)
+++ 
sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/SuperimposingManager.java
 Mon Sep 29 16:50:41 2014
@@ -18,7 +18,7 @@
  */
 package org.apache.sling.superimposing;
 
-import java.util.Map;
+import java.util.Iterator;
 
 import org.apache.sling.superimposing.impl.SuperimposingResourceProviderImpl;
 
@@ -29,13 +29,15 @@ import org.apache.sling.superimposing.im
 public interface SuperimposingManager {
 
     /**
-     * @return true if superimposing mode is enabled
+     * @return true if superimposing mode is enabled.
      */
     boolean isEnabled();
 
     /**
-     * @return Immutable map with all superimposing resource providers 
currently registered
+     * @return Iterator with all superimposing resource providers currently 
registered.
+     *   Iterator is backed by a {@link 
java.util.concurrent.ConcurrentHashMap} and is safe to access
+     *   even if superimposing resource providers are registered or 
unregistered at the same time.
      */
-    Map<String, SuperimposingResourceProvider> getRegisteredProviders();
+    Iterator<SuperimposingResourceProvider> getRegisteredProviders();
 
 }

Modified: 
sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/impl/SuperimposingManagerImpl.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/impl/SuperimposingManagerImpl.java?rev=1628219&r1=1628218&r2=1628219&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/impl/SuperimposingManagerImpl.java
 (original)
+++ 
sling/trunk/contrib/extensions/superimposing/src/main/java/org/apache/sling/superimposing/impl/SuperimposingManagerImpl.java
 Mon Sep 29 16:50:41 2014
@@ -22,9 +22,9 @@ import static org.apache.sling.superimpo
 import static 
org.apache.sling.superimposing.SuperimposingResourceProvider.PROP_SUPERIMPOSE_SOURCE_PATH;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.Dictionary;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -413,11 +413,13 @@ public class SuperimposingManagerImpl im
     }
 
     /**
-     * @return Immutable map with all superimposing resource providers 
currently registered
+     * @return Iterator with all superimposing resource providers currently 
registered.
+     *   Iterator is backed by a {@link 
java.util.concurrent.ConcurrentHashMap} and is safe to access
+     *   even if superimposing resource providers are registered or 
unregistered at the same time.
      */
-    public Map<String, SuperimposingResourceProvider> getRegisteredProviders() 
{
-        Map<String, SuperimposingResourceProvider> mapcopy = new 
HashMap<String, SuperimposingResourceProvider>(superimposingProviders);
-        return Collections.unmodifiableMap(mapcopy);
+    @SuppressWarnings("unchecked")
+    public Iterator<SuperimposingResourceProvider> getRegisteredProviders() {
+        return 
IteratorUtils.unmodifiableIterator(superimposingProviders.values().iterator());
     }
 
     SuperimposingManagerImpl 
withResourceResolverFactory(ResourceResolverFactory resolverFactory) {

Modified: 
sling/trunk/contrib/extensions/superimposing/src/test/java/org/apache/sling/superimposing/impl/SuperimposingManagerImplTest.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/superimposing/src/test/java/org/apache/sling/superimposing/impl/SuperimposingManagerImplTest.java?rev=1628219&r1=1628218&r2=1628219&view=diff
==============================================================================
--- 
sling/trunk/contrib/extensions/superimposing/src/test/java/org/apache/sling/superimposing/impl/SuperimposingManagerImplTest.java
 (original)
+++ 
sling/trunk/contrib/extensions/superimposing/src/test/java/org/apache/sling/superimposing/impl/SuperimposingManagerImplTest.java
 Mon Sep 29 16:50:41 2014
@@ -40,6 +40,7 @@ import javax.jcr.observation.Event;
 import javax.jcr.observation.EventIterator;
 import javax.jcr.observation.EventListener;
 
+import org.apache.commons.collections.IteratorUtils;
 import org.apache.sling.api.resource.LoginException;
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
@@ -217,6 +218,7 @@ public class SuperimposingManagerImplTes
         verifyZeroInteractions(bundleContext);
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void testFindAllSuperimposings() throws InterruptedException, 
LoginException, RepositoryException {
         // prepare a query that returns one existing superimposed resource
@@ -231,9 +233,9 @@ public class SuperimposingManagerImplTes
         initialize(true);
 
         // ensure the superimposed resource is detected and registered
-        Map<String, SuperimposingResourceProvider> providers = 
underTest.getRegisteredProviders();
+        List<SuperimposingResourceProvider> providers = 
IteratorUtils.toList(underTest.getRegisteredProviders());
         assertEquals(1, providers.size());
-        SuperimposingResourceProvider provider = 
providers.values().iterator().next();
+        SuperimposingResourceProvider provider = providers.iterator().next();
         assertEquals(SUPERIMPOSED_PATH, provider.getRootPath());
         assertEquals(ORIGINAL_PATH, provider.getSourcePath());
         assertFalse(provider.isOverlayable());
@@ -300,6 +302,7 @@ public class SuperimposingManagerImplTes
         return eventIterator;
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void testSuperimposedResourceCreateUpdateRemove() throws 
InterruptedException, LoginException, RepositoryException {
         initialize(true);
@@ -309,9 +312,9 @@ public class SuperimposingManagerImplTes
         underTest.onEvent(prepareNodeCreateEvent(superimposedResource));
 
         // ensure the superimposed resource is detected and registered
-        Map<String, SuperimposingResourceProvider> providers = 
underTest.getRegisteredProviders();
+        List<SuperimposingResourceProvider> providers = 
IteratorUtils.toList(underTest.getRegisteredProviders());
         assertEquals(1, providers.size());
-        SuperimposingResourceProvider provider = 
providers.values().iterator().next();
+        SuperimposingResourceProvider provider = providers.iterator().next();
         assertEquals(SUPERIMPOSED_PATH, provider.getRootPath());
         assertEquals(ORIGINAL_PATH, provider.getSourcePath());
         assertFalse(provider.isOverlayable());
@@ -322,9 +325,9 @@ public class SuperimposingManagerImplTes
         underTest.onEvent(prepareNodeChangeEvent(superimposedResource));
 
         // ensure the superimposed resource update is detected and a new 
provider instance is registered
-        providers = underTest.getRegisteredProviders();
+        providers = IteratorUtils.toList(underTest.getRegisteredProviders());
         assertEquals(1, providers.size());
-        SuperimposingResourceProvider provider2 = 
providers.values().iterator().next();
+        SuperimposingResourceProvider provider2 = providers.iterator().next();
         assertEquals(SUPERIMPOSED_PATH, provider2.getRootPath());
         assertEquals("/other/path", provider2.getSourcePath());
         assertFalse(provider2.isOverlayable());
@@ -334,10 +337,11 @@ public class SuperimposingManagerImplTes
         underTest.onEvent(prepareNodeRemoveEvent(superimposedResource));
 
         // ensure provider is removed
-        providers = underTest.getRegisteredProviders();
+        providers = IteratorUtils.toList(underTest.getRegisteredProviders());
         assertEquals(0, providers.size());
     }
 
+    @SuppressWarnings("unchecked")
     @Test
     public void testSuperimposedResourceCreateMove() throws 
InterruptedException, LoginException, RepositoryException {
         
when(componentContextProperties.get(SuperimposingManagerImpl.FINDALLQUERIES_PROPERTY)).thenReturn("syntax|query");
@@ -363,9 +367,9 @@ public class SuperimposingManagerImplTes
         underTest.onEvent(prepareNodeMoveEvent(superimposedResource, oldPath));
 
         // ensure the superimposed resource update is detected and a new 
provider instance is registered
-        Map<String, SuperimposingResourceProvider> providers = 
underTest.getRegisteredProviders();
+        List<SuperimposingResourceProvider> providers = 
IteratorUtils.toList(underTest.getRegisteredProviders());
         assertEquals(1, providers.size());
-        SuperimposingResourceProvider provider = 
providers.values().iterator().next();
+        SuperimposingResourceProvider provider = providers.iterator().next();
         assertEquals("/new/path", provider.getRootPath());
         assertEquals(ORIGINAL_PATH, provider.getSourcePath());
         assertFalse(provider.isOverlayable());


Reply via email to