You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by mp...@apache.org on 2015/05/04 16:23:21 UTC

svn commit: r1677602 - in /sling/trunk/contrib/extensions/distribution/core/src: main/java/org/apache/sling/distribution/trigger/impl/ test/java/org/apache/sling/distribution/trigger/impl/

Author: mpetria
Date: Mon May  4 14:23:20 2015
New Revision: 1677602

URL: http://svn.apache.org/r1677602
Log:
Allow certain paths to be ignored by jcrtrigger

Modified:
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java
    sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
    sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java?rev=1677602&r1=1677601&r2=1677602&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/AbstractJcrEventTrigger.java Mon May  4 14:23:20 2015
@@ -24,10 +24,15 @@ import javax.jcr.Session;
 import javax.jcr.observation.Event;
 import javax.jcr.observation.EventIterator;
 import javax.jcr.observation.EventListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.sling.distribution.DistributionRequest;
+import org.apache.sling.distribution.DistributionRequestType;
+import org.apache.sling.distribution.SimpleDistributionRequest;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.apache.sling.distribution.trigger.DistributionTriggerException;
@@ -60,7 +65,6 @@ public abstract class AbstractJcrEventTr
         this.repository = repository;
         this.path = path;
         this.serviceUser = serviceUser;
-
     }
 
     public void register(@Nonnull DistributionRequestHandler requestHandler) throws DistributionTriggerException {
@@ -98,19 +102,40 @@ public abstract class AbstractJcrEventTr
 
         public void onEvent(EventIterator eventIterator) {
             log.info("handling event {}");
+            List<DistributionRequest> requestList = new ArrayList<DistributionRequest>();
+
             while (eventIterator.hasNext()) {
                 Event event = eventIterator.nextEvent();
                 try {
                     if (DistributionJcrUtils.isSafe(event)) {
                         DistributionRequest request = processEvent(event);
                         if (request != null) {
-                            requestHandler.handle(request);
+                            addToList(request, requestList);
                         }
+
                     }
                 } catch (RepositoryException e) {
                     log.error("Error while handling event {}", event, e);
                 }
             }
+
+            for (DistributionRequest request: requestList) {
+                requestHandler.handle(request);
+            }
+        }
+    }
+
+    private void addToList(DistributionRequest request, List<DistributionRequest> requestList) {
+        DistributionRequest lastRequest = requestList.isEmpty()? null : requestList.get(requestList.size() - 1);
+
+        if (lastRequest == null || lastRequest.getRequestType() == null || !lastRequest.getRequestType().equals(request.getRequestType())) {
+            requestList.add(request);
+        } else {
+            List<String> allPaths = new ArrayList<String>();
+            allPaths.addAll(Arrays.asList(lastRequest.getPaths()));
+            allPaths.addAll(Arrays.asList(request.getPaths()));
+            lastRequest = new SimpleDistributionRequest(lastRequest.getRequestType(), allPaths.toArray(new String[0]));
+            requestList.set(requestList.size() - 1, lastRequest);
         }
     }
 
@@ -169,4 +194,20 @@ public abstract class AbstractJcrEventTr
     }
 
 
+    protected String getNodePathFromEvent(Event event) throws RepositoryException {
+        String eventPath = event.getPath();
+        int type = event.getType();
+
+        if (eventPath == null) {
+            return null;
+        }
+
+        if (Event.PROPERTY_REMOVED == type || Event.PROPERTY_CHANGED == type || Event.PROPERTY_ADDED == type) {
+            eventPath = eventPath.substring(0, eventPath.lastIndexOf('/'));
+        }
+
+        return eventPath;
+    }
+
+
 }

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java?rev=1677602&r1=1677601&r2=1677602&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTrigger.java Mon May  4 14:23:20 2015
@@ -35,26 +35,44 @@ import org.slf4j.LoggerFactory;
 public class JcrEventDistributionTrigger extends AbstractJcrEventTrigger implements DistributionTrigger {
 
     private final Logger log = LoggerFactory.getLogger(this.getClass());
+    private final String[] ignoredPathsPatterns;
 
-    public JcrEventDistributionTrigger(SlingRepository repository, String path, String serviceName) {
+    public JcrEventDistributionTrigger(SlingRepository repository, String path, String serviceName, String[] ignoredPathsPatterns) {
         super(repository, path, serviceName);
+        this.ignoredPathsPatterns = ignoredPathsPatterns;
     }
 
     @Override
     protected DistributionRequest processEvent(Event event) throws RepositoryException {
         log.info("triggering distribution from jcr event {}", event);
         DistributionRequest distributionRequest = null;
-        Object pathProperty = event.getPath();
-        if (pathProperty != null) {
-            String replicatingPath = String.valueOf(pathProperty);
-            int type = event.getType();
-            if (Event.PROPERTY_REMOVED == type || Event.PROPERTY_CHANGED == type || Event.PROPERTY_ADDED == type) {
-                replicatingPath = replicatingPath.substring(0, replicatingPath.lastIndexOf('/'));
-            }
-            distributionRequest = new SimpleDistributionRequest(Event.NODE_REMOVED ==
-                    type ? DistributionRequestType.DELETE : DistributionRequestType.ADD, replicatingPath);
+        String replicatingPath = getNodePathFromEvent(event);
+        if (!isIgnoredPath(replicatingPath)) {
+
+            distributionRequest = new SimpleDistributionRequest(Event.NODE_REMOVED == event.getType() ?
+                    DistributionRequestType.DELETE : DistributionRequestType.ADD, replicatingPath);
             log.info("distributing {}", distributionRequest);
+
         }
         return distributionRequest;
     }
+
+
+    boolean isIgnoredPath(String path) {
+        if (path == null) {
+            return true;
+        }
+
+        if (ignoredPathsPatterns == null || ignoredPathsPatterns.length == 0) {
+            return false;
+        }
+
+        for (String pattern : ignoredPathsPatterns) {
+            if (path.matches(pattern)) {
+                return true;
+            }
+        }
+
+        return false;
+    }
 }
\ No newline at end of file

Modified: sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java?rev=1677602&r1=1677601&r2=1677602&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/main/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerFactory.java Mon May  4 14:23:20 2015
@@ -27,6 +27,7 @@ import org.apache.felix.scr.annotations.
 import org.apache.felix.scr.annotations.Service;
 import org.apache.sling.commons.osgi.PropertiesUtil;
 import org.apache.sling.distribution.component.impl.DistributionComponentConstants;
+import org.apache.sling.distribution.component.impl.SettingsUtils;
 import org.apache.sling.distribution.trigger.DistributionRequestHandler;
 import org.apache.sling.distribution.trigger.DistributionTrigger;
 import org.apache.sling.distribution.trigger.DistributionTriggerException;
@@ -52,10 +53,16 @@ public class JcrEventDistributionTrigger
     /**
      * jcr event trigger path property
      */
-    @Property(label = "Path", description = "The path for whcih changes are distributed.")
+    @Property(label = "Path", description = "The path for which changes are distributed.")
     public static final String PATH = "path";
 
     /**
+     * jcr event trigger path property
+     */
+    @Property(cardinality = 100, label = "Ignored Paths Patterns", description = "The paths matching one of these patterns will be ignored.")
+    public static final String IGNORED_PATHS_PATTERNS = "ignoredPathsPatterns";
+
+    /**
      * jcr event trigger service user property
      */
     @Property(label = "Service Name", description = "The service used to listen for jcr events")
@@ -73,8 +80,11 @@ public class JcrEventDistributionTrigger
     public void activate(BundleContext bundleContext, Map<String, Object> config) {
         String path = PropertiesUtil.toString(config.get(PATH), null);
         String serviceName = PropertiesUtil.toString(config.get(SERVICE_NAME), null);
+        String[] ignoredPathsPatterns = PropertiesUtil.toStringArray(config.get(IGNORED_PATHS_PATTERNS), null);
+        ignoredPathsPatterns = SettingsUtils.removeEmptyEntries(ignoredPathsPatterns);
+
 
-        trigger =  new JcrEventDistributionTrigger(repository, path, serviceName);
+        trigger =  new JcrEventDistributionTrigger(repository, path, serviceName, ignoredPathsPatterns);
         trigger.enable();
     }
 

Modified: sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java?rev=1677602&r1=1677601&r2=1677602&view=diff
==============================================================================
--- sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java (original)
+++ sling/trunk/contrib/extensions/distribution/core/src/test/java/org/apache/sling/distribution/trigger/impl/JcrEventDistributionTriggerTest.java Mon May  4 14:23:20 2015
@@ -39,7 +39,7 @@ public class JcrEventDistributionTrigger
         SlingRepository repository = mock(SlingRepository.class);
         String path = "/some/path";
         String serviceName = "serviceId";
-        JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, path, serviceName);
+        JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, path, serviceName, null);
         Event event = mock(Event.class);
         DistributionRequest distributionRequest = jcrEventdistributionTrigger.processEvent(event);
         assertNull(distributionRequest);
@@ -50,7 +50,7 @@ public class JcrEventDistributionTrigger
         SlingRepository repository = mock(SlingRepository.class);
         String path = "/some/path";
         String serviceName = "serviceId";
-        JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, path, serviceName);
+        JcrEventDistributionTrigger jcrEventdistributionTrigger = new JcrEventDistributionTrigger(repository, path, serviceName, null);
         Event event = mock(Event.class);
         when(event.getPath()).thenReturn("/some/path/generating/event");
         DistributionRequest distributionRequest = jcrEventdistributionTrigger.processEvent(event);