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);
}
/**