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 2013/06/21 15:43:22 UTC
svn commit: r1495436 - in
/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak:
plugins/observation/ChangeDispatcher.java
plugins/observation/ChangeProcessor.java
plugins/observation/EventFilter.java spi/state/NodeStateUtils.java
Author: mduerig
Date: Fri Jun 21 13:43:22 2013
New Revision: 1495436
URL: http://svn.apache.org/r1495436
Log:
OAK-144 Implement Observation
diff only subtree at given path if a path filter is set for an observation listener
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventFilter.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java?rev=1495436&r1=1495435&r2=1495436&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java Fri Jun 21 13:43:22 2013
@@ -21,6 +21,7 @@ package org.apache.jackrabbit.oak.plugin
import static com.google.common.base.Objects.toStringHelper;
import static com.google.common.base.Preconditions.checkNotNull;
import static org.apache.jackrabbit.oak.plugins.observation.ObservationConstants.OAK_UNKNOWN;
+import static org.apache.jackrabbit.oak.spi.state.NodeStateUtils.getNode;
import java.util.Queue;
import java.util.Set;
@@ -250,10 +251,11 @@ public class ChangeDispatcher {
/**
* {@link NodeStateDiff} of the changes
* @param diff node state diff instance for traversing the changes.
+ * @param path path where diffing should start
*/
- public void diff(RecursingNodeStateDiff diff) {
+ public void diff(RecursingNodeStateDiff diff, String path) {
NodeStateDiff secureDiff = SecureNodeStateDiff.wrap(diff);
- after.compareAgainstBaseState(before, secureDiff);
+ getNode(after, path).compareAgainstBaseState(getNode(before, path), secureDiff);
}
@Override
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java?rev=1495436&r1=1495435&r2=1495436&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.java Fri Jun 21 13:43:22 2013
@@ -162,9 +162,10 @@ class ChangeProcessor implements Runnabl
try {
ChangeSet changes = changeListener.getChanges();
while (!stopping && changes != null) {
- if (!(filterRef.get().excludeLocal() && changes.isLocal(observationManager.getContentSession()))) {
+ EventFilter filter = filterRef.get();
+ if (!(filter.excludeLocal() && changes.isLocal(observationManager.getContentSession()))) {
EventGeneratingNodeStateDiff diff = new EventGeneratingNodeStateDiff(changes);
- changes.diff(VisibleDiff.wrap(diff));
+ changes.diff(VisibleDiff.wrap(diff), filter.getPath());
if (!stopping) {
diff.sendEvents();
}
@@ -212,7 +213,7 @@ class ChangeProcessor implements Runnabl
public EventGeneratingNodeStateDiff(ChangeSet changes) {
// FIXME parent nodes should be the root here
- this(changes, "/", new ArrayList<Iterator<Event>>(PURGE_LIMIT), null, null, null, "");
+ this(changes, filterRef.get().getPath(), new ArrayList<Iterator<Event>>(PURGE_LIMIT), null, null, null, "");
}
public void sendEvents() {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventFilter.java?rev=1495436&r1=1495435&r2=1495436&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventFilter.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventFilter.java Fri Jun 21 13:43:22 2013
@@ -93,6 +93,10 @@ class EventFilter {
.toString();
}
+ public String getPath() {
+ return path;
+ }
+
//-----------------------------< internal >---------------------------------
private boolean include(int eventType) {
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java?rev=1495436&r1=1495435&r2=1495436&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/NodeStateUtils.java Fri Jun 21 13:43:22 2013
@@ -16,12 +16,15 @@
*/
package org.apache.jackrabbit.oak.spi.state;
+import static com.google.common.base.Preconditions.checkNotNull;
+
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import org.apache.jackrabbit.JcrConstants;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Type;
+import org.apache.jackrabbit.oak.commons.PathUtils;
/**
* Utility method for code that deals with node states.
@@ -47,4 +50,19 @@ public final class NodeStateUtils {
PropertyState ps = nodeState.getProperty(JcrConstants.JCR_PRIMARYTYPE);
return (ps == null) ? null : ps.getValue(Type.NAME);
}
+
+ /**
+ * Get a possibly non existing child node of a node.
+ * @param node node whose child node to get
+ * @param path path of the child node
+ * @return child node of {@code node} at {@code path}.
+ */
+ @Nonnull
+ public static NodeState getNode(@Nonnull NodeState node, @Nonnull String path) {
+ for (String name : PathUtils.elements(checkNotNull(path))) {
+ node = node.getChildNode(checkNotNull(name));
+ }
+ return node;
+ }
+
}