Author: olli
Date: Fri Jul 14 10:45:28 2017
New Revision: 1801933

URL: http://svn.apache.org/viewvc?rev=1801933&view=rev
Log:
SLING-3017 Improve Karaf integration tests

switch from OSGi EventHandler to Sling ResourceChangeListener

Modified:
    
sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java

Modified: 
sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java
URL: 
http://svn.apache.org/viewvc/sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java?rev=1801933&r1=1801932&r2=1801933&view=diff
==============================================================================
--- 
sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java
 (original)
+++ 
sling/trunk/karaf/org.apache.sling.karaf-integration-tests/src/test/java/org/apache/sling/karaf/tests/bootstrap/AbstractSlingLaunchpadOakTestSupport.java
 Fri Jul 14 10:45:28 2017
@@ -21,8 +21,10 @@ package org.apache.sling.karaf.tests.boo
 import java.io.Reader;
 import java.io.StringReader;
 import java.util.Collections;
+import java.util.Dictionary;
 import java.util.HashSet;
 import java.util.Hashtable;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
@@ -43,18 +45,16 @@ import javax.jcr.observation.Observation
 import javax.jcr.query.Query;
 
 import org.apache.jackrabbit.commons.cnd.CndImporter;
-import org.apache.sling.api.SlingConstants;
 import org.apache.sling.api.resource.ResourceResolverFactory;
+import org.apache.sling.api.resource.observation.ResourceChange;
+import org.apache.sling.api.resource.observation.ResourceChange.ChangeType;
+import org.apache.sling.api.resource.observation.ResourceChangeListener;
 import org.apache.sling.jcr.api.SlingRepository;
 import org.apache.sling.karaf.testing.KarafTestSupport;
 import org.junit.After;
 import org.junit.Test;
 import org.ops4j.pax.exam.util.Filter;
-import org.osgi.framework.BundleContext;
 import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.event.Event;
-import org.osgi.service.event.EventConstants;
-import org.osgi.service.event.EventHandler;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -376,16 +376,19 @@ public abstract class AbstractSlingLaunc
     }
 
     @Test
-    public void testOsgiResourceEvents() throws RepositoryException {
-        final ResourceEventListener listener = new ResourceEventListener();
-        final ServiceRegistration reg = listener.register(bundleContext, 
SlingConstants.TOPIC_RESOURCE_ADDED);
+    public void testResourceEvents() throws RepositoryException {
+        final AddedResourceChangeListener listener = new 
AddedResourceChangeListener();
+        final Dictionary<String, Object> properties = new Hashtable<>();
+        properties.put(ResourceChangeListener.PATHS, "/");
+        properties.put(ResourceChangeListener.CHANGES, "ADDED"); // 
ChangeType.ADDED
+        final ServiceRegistration reg = 
bundleContext.registerService(ResourceChangeListener.class, listener, 
properties);
         final Session s = slingRepository.loginAdministrative(null);
         final int nPaths = 2500 * TEST_SCALE;
         final int timeoutMsec = 2 * nPaths;
-        final String prefix = uniqueName("testOsgiResourceEvents");
+        final String prefix = uniqueName("testResourceObservationEvents");
 
         // Create N nodes with a unique name under /
-        // and verify that ResourceEventListener gets an event
+        // and verify that ResourceChangeListener gets notified
         // for each of them
         try {
             for(int i=0; i  < nPaths; i++) {
@@ -393,7 +396,7 @@ public abstract class AbstractSlingLaunc
             }
             s.save();
 
-            logger.info("Added {} nodes, checking what ResourceEventListener 
got...", nPaths);
+            logger.info("Added {} nodes, checking what ResourceChangeListener 
got...", nPaths);
             final long timeout = System.currentTimeMillis() + timeoutMsec;
             final Set<String> missing = new HashSet<String>();
             while(System.currentTimeMillis() < timeout) {
@@ -413,7 +416,7 @@ public abstract class AbstractSlingLaunc
 
             if(!missing.isEmpty()) {
                 final String missingStr = missing.size() > 10 ? missing.size() 
+ " paths missing" : missing.toString();
-                fail("OSGi add resource events are missing for "
+                fail("resource added events are missing for "
                     + missing.size() + "/" + nPaths + " paths after "
                     + timeoutMsec + " msec: " + missingStr);
             }
@@ -422,7 +425,7 @@ public abstract class AbstractSlingLaunc
             s.logout();
         }
 
-        logger.info("Successfuly detected OSGi observation events for " + 
nPaths + " paths");
+        logger.info("Successfully detected resource observation events for " + 
nPaths + " paths");
     }
 
     @Test
@@ -484,43 +487,37 @@ public abstract class AbstractSlingLaunc
 
     }
 
-    /** Keep track of OSGi events received on a given topic */
-    public class ResourceEventListener implements EventHandler {
+    public class AddedResourceChangeListener implements ResourceChangeListener 
{
 
-        private final Logger log = LoggerFactory.getLogger(getClass());
-        private final Set<String> paths = new HashSet<String>();
+        private Set<String> paths =  new LinkedHashSet<>();
 
-        ServiceRegistration register(BundleContext ctx, String osgiEventTopic) 
{
-            final Hashtable<String, Object> props = new Hashtable<String, 
Object>();
-            props.put(EventConstants.EVENT_TOPIC, osgiEventTopic);
-            return ctx.registerService(EventHandler.class.getName(), this, 
props);
-        }
+        private final Object lock = new Object();
 
-        @Override
-        public void handleEvent(Event event) {
-            final String path = (String) event.getProperty("path");
-            if(path != null) {
-                final int n = paths.size();
-                synchronized (paths) {
-                    if(n % 1000 == 0) {
-                        log.info("Got events for {} paths so far, last 
path={}", n, path);
-                    }
-                    paths.add(path);
-                }
-            }
-        }
+        private final Logger logger = 
LoggerFactory.getLogger(AddedResourceChangeListener.class);
 
-        void clear() {
-            synchronized (paths) {
-                paths.clear();
-            }
+        AddedResourceChangeListener() {
         }
 
         Set<String> getPaths() {
-            synchronized (paths) {
+            synchronized (lock) {
                 return Collections.unmodifiableSet(paths);
             }
         }
+
+        @Override
+        public void onChange(final List<ResourceChange> list) {
+            synchronized (lock) {
+                logger.info("{} resources added already", paths.size());
+                logger.info("{} new resource changes", list.size());
+                for (final ResourceChange resourceChange : list) {
+                    if (resourceChange.getType() == ChangeType.ADDED) {
+                        paths.add(resourceChange.getPath());
+                    }
+                }
+                logger.info("{} resources added in total", paths.size());
+            }
+        }
+
     }
 
 }


Reply via email to