Author: mduerig
Date: Tue Nov 19 17:20:13 2013
New Revision: 1543508
URL: http://svn.apache.org/r1543508
Log:
OAK-1133: Observation listener PLUS
Correct calculation of associated parent node
Modified:
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/FilterProvider.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java
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=1543508&r1=1543507&r2=1543508&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
Tue Nov 19 17:20:13 2013
@@ -128,7 +128,7 @@ public class ChangeProcessor implements
ImmutableTree afterTree = getTree(root, path);
EventIterator<Event> events = new EventIterator<Event>(
beforeTree.getNodeState(),
afterTree.getNodeState(),
- provider.getFilter(afterTree),
+ provider.getFilter(beforeTree, afterTree),
new JcrListener(beforeTree, afterTree,
namePathMapper, info));
if (events.hasNext()) {
eventListener.onEvent(new
EventIteratorAdapter(events));
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java?rev=1543508&r1=1543507&r2=1543508&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java
Tue Nov 19 17:20:13 2013
@@ -92,9 +92,9 @@ public class FilterProvider {
&& (includeClusterExternal || !isExternal(info));
}
- public Filter getFilter(ImmutableTree afterTree) {
+ public Filter getFilter(ImmutableTree beforeTree, ImmutableTree afterTree)
{
List<Filter> filters = Lists.<Filter>newArrayList(
- new PathFilter(afterTree, path, deep));
+ new PathFilter(beforeTree, afterTree, path, deep));
if ((ALL_EVENTS & eventTypes) == 0) {
return Filters.excludeAll();
@@ -106,7 +106,8 @@ public class FilterProvider {
if (uuids.length == 0) {
return Filters.excludeAll();
} else {
- filters.add(new UuidFilter(afterTree.getNodeState(), uuids));
+ filters.add(new UuidFilter(
+ beforeTree.getNodeState(), afterTree.getNodeState(),
uuids));
}
}
@@ -114,7 +115,7 @@ public class FilterProvider {
if (ntNames.length == 0) {
return Filters.excludeAll();
} else {
- filters.add(new NodeTypeFilter(afterTree, ntManager, ntNames));
+ filters.add(new NodeTypeFilter(beforeTree, afterTree,
ntManager, ntNames));
}
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java?rev=1543508&r1=1543507&r2=1543508&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/NodeTypeFilter.java
Tue Nov 19 17:20:13 2013
@@ -34,12 +34,14 @@ import org.apache.jackrabbit.oak.spi.sta
* TODO Clarify: filter applies to parent
*/
public class NodeTypeFilter implements Filter {
+ private final ImmutableTree beforeTree;
private final ImmutableTree afterTree;
private final ReadOnlyNodeTypeManager ntManager;
private final String[] ntNames;
- public NodeTypeFilter(@Nonnull ImmutableTree afterTree,
+ public NodeTypeFilter(@Nonnull ImmutableTree beforeTree, @Nonnull
ImmutableTree afterTree,
@Nonnull ReadOnlyNodeTypeManager ntManager, @Nonnull String[]
ntNames) {
+ this.beforeTree = checkNotNull(beforeTree);
this.afterTree = checkNotNull(afterTree);
this.ntManager = checkNotNull(ntManager);
this.ntNames = checkNotNull(ntNames);
@@ -82,7 +84,8 @@ public class NodeTypeFilter implements F
@Override
public Filter create(String name, NodeState before, NodeState after) {
- return new NodeTypeFilter(afterTree.getChild(name), ntManager,
ntNames);
+ return new NodeTypeFilter(
+ beforeTree.getChild(name), afterTree.getChild(name),
ntManager, ntNames);
}
//------------------------------------------------------------< private
>---
@@ -95,8 +98,12 @@ public class NodeTypeFilter implements F
* parent node.
*/
private boolean includeByType() {
+ ImmutableTree associatedParent = afterTree.exists()
+ ? afterTree
+ : beforeTree;
+
for (String ntName : ntNames) {
- if (ntManager.isNodeType(afterTree, ntName)) {
+ if (ntManager.isNodeType(associatedParent, ntName)) {
return true;
}
}
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.java?rev=1543508&r1=1543507&r2=1543508&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/PathFilter.java
Tue Nov 19 17:20:13 2013
@@ -19,6 +19,10 @@
package org.apache.jackrabbit.oak.plugins.observation.filter;
+import static com.google.common.base.Preconditions.checkNotNull;
+
+import javax.annotation.Nonnull;
+
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.core.ImmutableTree;
@@ -30,55 +34,58 @@ import org.apache.jackrabbit.oak.spi.sta
* TODO Clarify: filter applies to parent
*/
public class PathFilter implements Filter {
+ private final ImmutableTree beforeTree;
private final ImmutableTree afterTree;
private final String path;
private final boolean deep;
- public PathFilter(ImmutableTree afterTree, String path, boolean deep) {
- this.afterTree = afterTree;
- this.path = path;
+ public PathFilter(@Nonnull ImmutableTree beforeTree, @Nonnull
ImmutableTree afterTree,
+ @Nonnull String path, boolean deep) {
+ this.beforeTree = checkNotNull(beforeTree);
+ this.afterTree = checkNotNull(afterTree);
+ this.path = checkNotNull(path);
this.deep = deep;
}
@Override
public boolean includeAdd(PropertyState after) {
- return includeByPath(afterTree.getPath());
+ return includeByPath();
}
@Override
public boolean includeChange(PropertyState before, PropertyState after) {
- return includeByPath(afterTree.getPath());
+ return includeByPath();
}
@Override
public boolean includeDelete(PropertyState before) {
- return includeByPath(afterTree.getPath());
+ return includeByPath();
}
@Override
public boolean includeAdd(String name, NodeState after) {
- return includeByPath(afterTree.getPath());
+ return includeByPath();
}
@Override
public boolean includeChange(String name, NodeState before, NodeState
after) {
- return includeByPath(afterTree.getPath());
+ return includeByPath();
}
@Override
public boolean includeDelete(String name, NodeState before) {
- return includeByPath(afterTree.getPath());
+ return includeByPath();
}
@Override
public boolean includeMove(String sourcePath, String destPath, NodeState
moved) {
- return includeByPath(afterTree.getPath());
+ return includeByPath();
}
@Override
public Filter create(String name, NodeState before, NodeState after) {
- if (includeChildren(PathUtils.concat(afterTree.getPath(), name))) {
- return new PathFilter(afterTree.getChild(name), path, deep);
+ if (includeChildren(name)) {
+ return new PathFilter(beforeTree, afterTree.getChild(name), path,
deep);
} else {
return null;
}
@@ -86,7 +93,11 @@ public class PathFilter implements Filte
//------------------------------------------------------------< private
>---
- private boolean includeByPath(String path) {
+ private boolean includeByPath() {
+ String path = afterTree.exists()
+ ? afterTree.getPath()
+ : beforeTree.getPath();
+
boolean equalPaths = this.path.equals(path);
if (!deep && !equalPaths) {
return false;
@@ -98,12 +109,11 @@ public class PathFilter implements Filte
return true;
}
- /**
- * Determine whether the children of a {@code path} would be matched by
this filter
- * @param path path whose children to test
- * @return {@code true} if the children of {@code path} could be matched
by this filter
- */
- public boolean includeChildren(String path) {
+ private boolean includeChildren(String name) {
+ String path = afterTree.exists()
+ ? PathUtils.concat(afterTree.getPath(), name)
+ : PathUtils.concat(beforeTree.getPath(), name);
+
return PathUtils.isAncestor(path, this.path) ||
path.equals((this.path)) ||
deep && PathUtils.isAncestor(this.path, path);
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java?rev=1543508&r1=1543507&r2=1543508&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/filter/UuidFilter.java
Tue Nov 19 17:20:13 2013
@@ -34,10 +34,13 @@ import org.apache.jackrabbit.oak.spi.sta
* TODO Clarify: filter applies to parent
*/
public class UuidFilter implements Filter {
+ private final NodeState before;
private final NodeState after;
private final String[] uuids;
- public UuidFilter(@Nonnull NodeState after, @Nonnull String[] uuids) {
+ public UuidFilter(@Nonnull NodeState before, @Nonnull NodeState after,
+ @Nonnull String[] uuids) {
+ this.before = checkNotNull(before);
this.after = checkNotNull(after);
this.uuids = checkNotNull(uuids);
}
@@ -79,7 +82,8 @@ public class UuidFilter implements Filte
@Override
public Filter create(String name, NodeState before, NodeState after) {
- return new UuidFilter(after, uuids);
+ // FIXME shouldn't we pass the respective child node states here!?
+ return new UuidFilter(before, after, uuids);
}
//------------------------------------------------------------< private
>---
@@ -89,7 +93,11 @@ public class UuidFilter implements Filte
return false;
}
- PropertyState uuidProperty = after.getProperty(JcrConstants.JCR_UUID);
+ NodeState associatedParent = after.exists()
+ ? after
+ : before;
+
+ PropertyState uuidProperty =
associatedParent.getProperty(JcrConstants.JCR_UUID);
if (uuidProperty == null) {
return false;
}