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 ju...@apache.org on 2014/01/30 16:15:58 UTC
svn commit: r1562850 -
/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/QueueingHandler.java
Author: jukka
Date: Thu Jan 30 15:15:57 2014
New Revision: 1562850
URL: http://svn.apache.org/r1562850
Log:
OAK-1332: Large number of changes to the same node can fill observation queue
Simplify QueueingHandler now that much of the extra functionality is in separate classes.
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/QueueingHandler.java
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/QueueingHandler.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/QueueingHandler.java?rev=1562850&r1=1562849&r2=1562850&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/QueueingHandler.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/QueueingHandler.java Thu Jan 30 15:15:57 2014
@@ -25,76 +25,51 @@ import org.apache.jackrabbit.oak.plugins
import org.apache.jackrabbit.oak.spi.state.NodeState;
/**
- * Change handler that generates JCR Event instances and places them
- * in an event queue.
+ * Event handler that uses the given {@link EventFactory} and tracked path
+ * and identifier information to translate change callbacks to corresponding
+ * JCR events that are then placed in the given {@link EventQueue}.
*/
class QueueingHandler implements EventHandler {
- private final QueueingHandler parent;
-
- private final String name;
-
- private final PathTracker pathTracker;
-
- private final IdentifierTracker identifierTracker;
-
private final EventQueue queue;
private final EventFactory factory;
- private final NodeState before;
+ private final PathTracker pathTracker;
+
+ // need to track identifiers for both before and after trees,
+ // to get correct identifiers for events in removed subtrees
+ private final IdentifierTracker beforeIdentifierTracker;
- private final NodeState after;
+ private final IdentifierTracker identifierTracker;
QueueingHandler(
EventQueue queue, EventFactory factory,
NodeState before, NodeState after) {
- this.parent = null;
- this.name = null;
-
+ this.queue = queue;
+ this.factory = factory;
this.pathTracker = new PathTracker();
+ this.beforeIdentifierTracker = new IdentifierTracker(before);
if (after.exists()) {
this.identifierTracker = new IdentifierTracker(after);
} else {
- this.identifierTracker = new IdentifierTracker(before);
+ this.identifierTracker = beforeIdentifierTracker;
}
-
- this.queue = queue;
- this.factory = factory;
-
- this.before = before;
- this.after = after;
}
private QueueingHandler(
QueueingHandler parent,
String name, NodeState before, NodeState after) {
- this.parent = parent;
- this.name = name;
-
+ this.queue = parent.queue;
+ this.factory = parent.factory;
this.pathTracker = parent.pathTracker.getChildTracker(name);
+ this.beforeIdentifierTracker =
+ parent.beforeIdentifierTracker.getChildTracker(name, before);
if (after.exists()) {
this.identifierTracker =
parent.identifierTracker.getChildTracker(name, after);
} else {
- this.identifierTracker =
- parent.getBeforeIdentifierTracker().getChildTracker(name, before);
- }
-
- this.queue = parent.queue;
- this.factory = parent.factory;
-
- this.before = before;
- this.after = after;
- }
-
- private IdentifierTracker getBeforeIdentifierTracker() {
- if (!after.exists()) {
- return identifierTracker;
- } else if (parent != null) {
- return parent.getBeforeIdentifierTracker().getChildTracker(name, before);
- } else {
- return new IdentifierTracker(before);
+ this.identifierTracker = beforeIdentifierTracker;
}
}
@@ -129,33 +104,37 @@ class QueueingHandler implements EventHa
@Override
public void nodeAdded(String name, NodeState after) {
+ IdentifierTracker tracker =
+ identifierTracker.getChildTracker(name, after);
queue.addEvent(factory.nodeAdded(
- pathTracker.getPath(), name,
- identifierTracker.getChildTracker(name, after).getIdentifier()));
+ pathTracker.getPath(), name, tracker.getIdentifier()));
}
@Override
public void nodeDeleted(String name, NodeState before) {
+ IdentifierTracker tracker =
+ beforeIdentifierTracker.getChildTracker(name, before);
queue.addEvent(factory.nodeDeleted(
- pathTracker.getPath(), name,
- getBeforeIdentifierTracker().getChildTracker(name, before).getIdentifier()));
+ pathTracker.getPath(), name, tracker.getIdentifier()));
}
@Override
public void nodeMoved(
final String sourcePath, String name, NodeState moved) {
+ IdentifierTracker tracker =
+ identifierTracker.getChildTracker(name, moved);
queue.addEvent(factory.nodeMoved(
- pathTracker.getPath(), name,
- identifierTracker.getChildTracker(name, moved).getIdentifier(),
+ pathTracker.getPath(), name, tracker.getIdentifier(),
sourcePath));
}
@Override
public void nodeReordered(
final String destName, final String name, NodeState reordered) {
+ IdentifierTracker tracker =
+ identifierTracker.getChildTracker(name, reordered);
queue.addEvent(factory.nodeReordered(
- pathTracker.getPath(), name,
- identifierTracker.getChildTracker(name, reordered).getIdentifier(),
+ pathTracker.getPath(), name, tracker.getIdentifier(),
destName));
}