You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by md...@apache.org on 2014/07/30 11:12:14 UTC

svn commit: r1614591 - in /jackrabbit/oak/trunk: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/

Author: mduerig
Date: Wed Jul 30 09:12:14 2014
New Revision: 1614591

URL: http://svn.apache.org/r1614591
Log:
OAK-2000: Observation events accessibility not checked correctly
- Avoid NPE when getChildHandler returns null
- Make sure events from multiple paths are not spread across various onEvent calls

Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
    jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventQueue.java

Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java?rev=1614591&r1=1614590&r2=1614591&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java Wed Jul 30 09:12:14 2014
@@ -71,6 +71,12 @@ public class EventGenerator {
     private final LinkedList<Runnable> continuations = newLinkedList();
 
     /**
+     * Creates a new generator instance. Changes to process need to be added
+     * through {@link #addHandler(NodeState, NodeState, EventHandler)}
+     */
+    public EventGenerator() {}
+
+    /**
      * Creates a new generator instance for processing the given changes.
      */
     public EventGenerator(
@@ -79,6 +85,10 @@ public class EventGenerator {
         continuations.addFirst(new Continuation(handler, before, after, 0));
     }
 
+    public void addHandler(NodeState before, NodeState after, EventHandler handler) {
+        continuations.addFirst(new Continuation(handler, before, after, 0));
+    }
+
     /**
      * Checks whether there are no more content changes to be processed.
      */

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java?rev=1614591&r1=1614590&r2=1614591&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ChangeProcessor.java Wed Jul 30 09:12:14 2014
@@ -262,19 +262,17 @@ class ChangeProcessor implements Observe
                 FilterProvider provider = filterProvider.get();
                 // FIXME don't rely on toString for session id
                 if (provider.includeCommit(contentSession.toString(), info)) {
-                    for (String path : provider.getSubTrees()) {
-                        EventFilter userFilter = provider.getFilter(previousRoot, root);
-                        EventIterator events = new EventQueue(namePathMapper, info, previousRoot, root,
-                                path, Filters.all(userFilter, VISIBLE_FILTER));
-
-                        if (events.hasNext() && runningMonitor.enterIf(running)) {
-                            try {
-                                CountingIterator countingEvents = new CountingIterator(events);
-                                eventListener.onEvent(countingEvents);
-                                countingEvents.updateCounters(eventCount, eventDuration);
-                            } finally {
-                                runningMonitor.leave();
-                            }
+                    EventFilter filter = provider.getFilter(previousRoot, root);
+                    EventIterator events = new EventQueue(namePathMapper, info, previousRoot, root,
+                            provider.getSubTrees(), Filters.all(filter, VISIBLE_FILTER));
+
+                    if (events.hasNext() && runningMonitor.enterIf(running)) {
+                        try {
+                            CountingIterator countingEvents = new CountingIterator(events);
+                            eventListener.onEvent(countingEvents);
+                            countingEvents.updateCounters(eventCount, eventDuration);
+                        } finally {
+                            runningMonitor.leave();
                         }
                     }
                 }

Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventQueue.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventQueue.java?rev=1614591&r1=1614590&r2=1614591&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventQueue.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventQueue.java Wed Jul 30 09:12:14 2014
@@ -50,18 +50,27 @@ class EventQueue implements EventIterato
     public EventQueue(
             @Nonnull NamePathMapper mapper, CommitInfo info,
             @Nonnull NodeState before, @Nonnull NodeState after,
-            @Nonnull String basePath, @Nonnull EventFilter filter) {
+            @Nonnull Iterable<String> basePaths, @Nonnull EventFilter filter) {
+        this.generator = new EventGenerator();
         EventFactory factory = new EventFactory(mapper, info);
         EventHandler handler = new FilteredHandler(
                 filter, new QueueingHandler(this, factory, before, after));
+        for (String path : basePaths) {
+            addHandler(before, after, path, handler, generator);
+        }
+    }
 
-        for (String name : PathUtils.elements(basePath)) {
+    private static void addHandler(NodeState before, NodeState after, String path,
+            EventHandler handler, EventGenerator generator) {
+        for (String name : PathUtils.elements(path)) {
             before = before.getChildNode(name);
             after = after.getChildNode(name);
             handler = handler.getChildHandler(name, before, after);
+            if (handler == null) {
+                return;
+            }
         }
-
-        this.generator = new EventGenerator(before, after, handler);
+        generator.addHandler(before, after, handler);
     }
 
     /**