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/07/03 15:11:46 UTC
svn commit: r1499383 - 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 3 13:11:45 2013
New Revision: 1499383
URL: http://svn.apache.org/r1499383
Log:
OAK-144 Implement Observation
Use Oak names and paths in EventFilter
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventImpl.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/EventFilter.java
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
Modified: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventImpl.java?rev=1499383&r1=1499382&r2=1499383&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventImpl.java (original)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventImpl.java Wed Jul 3 13:11:45 2013
@@ -32,7 +32,7 @@ import org.apache.jackrabbit.api.observa
public class EventImpl implements JackrabbitEvent {
private final int type;
- private final String path;
+ private final String jcrPath;
private final String userID;
private final String identifier;
private final Map<?, ?> info;
@@ -41,10 +41,10 @@ public class EventImpl implements Jackra
private final boolean external;
public EventImpl(
- int type, String path, String userID, String identifier,
+ int type, String jcrPath, String userID, String identifier,
Map<?, ?> info, long date, String userData, boolean external) {
this.type = type;
- this.path = path;
+ this.jcrPath = jcrPath;
this.userID = userID;
this.identifier = identifier;
this.info = info == null ? Collections.emptyMap() : info;
@@ -60,7 +60,7 @@ public class EventImpl implements Jackra
@Override
public String getPath() throws RepositoryException {
- return path;
+ return jcrPath;
}
@Override
@@ -106,7 +106,7 @@ public class EventImpl implements Jackra
return date == that.date && type == that.type &&
(identifier == null ? that.identifier == null : identifier.equals(that.identifier)) &&
(info == null ? that.info == null : info.equals(that.info)) &&
- (path == null ? that.path == null : path.equals(that.path)) &&
+ (jcrPath == null ? that.jcrPath == null : jcrPath.equals(that.jcrPath)) &&
(userID == null ? that.userID == null : userID.equals(that.userID)) &&
(userData == null ? that.userData == null : userData.equals(that.userData)) &&
external == that.external;
@@ -116,7 +116,7 @@ public class EventImpl implements Jackra
@Override
public final int hashCode() {
int result = type;
- result = 31 * result + (path == null ? 0 : path.hashCode());
+ result = 31 * result + (jcrPath == null ? 0 : jcrPath.hashCode());
result = 31 * result + (userID == null ? 0 : userID.hashCode());
result = 31 * result + (identifier == null ? 0 : identifier.hashCode());
result = 31 * result + (info == null ? 0 : info.hashCode());
@@ -129,7 +129,7 @@ public class EventImpl implements Jackra
public String toString() {
return "EventImpl{" +
"type=" + type +
- ", path='" + path + '\'' +
+ ", jcrPath='" + jcrPath + '\'' +
", userID='" + userID + '\'' +
", identifier='" + identifier + '\'' +
", info=" + info +
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=1499383&r1=1499382&r2=1499383&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 3 13:11:45 2013
@@ -252,13 +252,9 @@ class ChangeProcessor implements Runnabl
}
}
- private String jcrPath() {
- return namePathMapper.getJcrPath(path);
- }
-
@Override
public boolean propertyAdded(PropertyState after) {
- if (filterRef.get().include(Event.PROPERTY_ADDED, jcrPath(), afterParentNode)) {
+ if (filterRef.get().include(Event.PROPERTY_ADDED, path, afterParentNode)) {
Event event = generatePropertyEvent(Event.PROPERTY_ADDED, path, after, getAfterId());
events.add(Iterators.singletonIterator(event));
}
@@ -267,7 +263,7 @@ class ChangeProcessor implements Runnabl
@Override
public boolean propertyChanged(PropertyState before, PropertyState after) {
- if (filterRef.get().include(Event.PROPERTY_CHANGED, jcrPath(), afterParentNode)) {
+ if (filterRef.get().include(Event.PROPERTY_CHANGED, path, afterParentNode)) {
Event event = generatePropertyEvent(Event.PROPERTY_CHANGED, path, after, getAfterId());
events.add(Iterators.singletonIterator(event));
}
@@ -276,7 +272,7 @@ class ChangeProcessor implements Runnabl
@Override
public boolean propertyDeleted(PropertyState before) {
- if (filterRef.get().include(Event.PROPERTY_REMOVED, jcrPath(), afterParentNode)) {
+ if (filterRef.get().include(Event.PROPERTY_REMOVED, path, afterParentNode)) {
Event event = generatePropertyEvent(Event.PROPERTY_REMOVED, path, before, getBeforeId());
events.add(Iterators.singletonIterator(event));
}
@@ -285,7 +281,7 @@ class ChangeProcessor implements Runnabl
@Override
public boolean childNodeAdded(String name, NodeState after) {
- if (filterRef.get().includeChildren(jcrPath())) {
+ if (filterRef.get().includeChildren(path)) {
Iterator<Event> events = generateNodeEvents(Event.NODE_ADDED, path, name,
after, afterParentNode, getAfterId(after, name));
this.events.add(events);
@@ -298,7 +294,7 @@ class ChangeProcessor implements Runnabl
@Override
public boolean childNodeDeleted(String name, NodeState before) {
- if (filterRef.get().includeChildren(jcrPath())) {
+ if (filterRef.get().includeChildren(path)) {
Iterator<Event> events = generateNodeEvents(Event.NODE_REMOVED, path, name,
before, beforeParentNode, getBeforeId(before, name));
this.events.add(events);
@@ -314,7 +310,7 @@ class ChangeProcessor implements Runnabl
@Nonnull
@Override
public RecursingNodeStateDiff createChildDiff(String name, NodeState before, NodeState after) {
- if (filterRef.get().includeChildren(jcrPath())) {
+ if (filterRef.get().includeChildren(path)) {
EventGeneratingNodeStateDiff diff = new EventGeneratingNodeStateDiff(
changes, PathUtils.concat(path, name), events, before, after, this, name);
return VisibleDiff.wrap(diff);
@@ -323,10 +319,10 @@ class ChangeProcessor implements Runnabl
}
}
- private EventImpl createEvent(int eventType, String jcrPath, String id) {
+ private EventImpl createEvent(int eventType, String path, String id) {
// TODO support info
return new EventImpl(
- eventType, jcrPath, changes.getUserId(),
+ eventType, namePathMapper.getJcrPath(path), changes.getUserId(),
id, null, changes.getDate(), userDataRef.get(),
changes.isExternal());
}
@@ -379,20 +375,17 @@ class ChangeProcessor implements Runnabl
}
private Event generatePropertyEvent(int eventType, String parentPath, PropertyState property, String id) {
- String jcrPath = namePathMapper.getJcrPath(PathUtils.concat(parentPath, property.getName()));
- return createEvent(eventType, jcrPath, id);
+ String path = PathUtils.concat(parentPath, property.getName());
+ return createEvent(eventType, path, id);
}
private Iterator<Event> generateNodeEvents(int eventType, String parentPath, String childName,
NodeState node, NodeState parentNode, final String id) {
EventFilter filter = filterRef.get();
final String path = PathUtils.concat(parentPath, childName);
- String jcrParentPath = namePathMapper.getJcrPath(parentPath);
- String jcrPath = namePathMapper.getJcrPath(path);
-
Iterator<Event> nodeEvent;
- if (filter.include(eventType, jcrParentPath, parentNode)) {
- Event event = createEvent(eventType, jcrPath, id);
+ if (filter.include(eventType, parentPath, parentNode)) {
+ Event event = createEvent(eventType, path, id);
nodeEvent = Iterators.singletonIterator(event);
} else {
nodeEvent = Iterators.emptyIterator();
@@ -403,7 +396,7 @@ class ChangeProcessor implements Runnabl
: Event.PROPERTY_REMOVED;
Iterator<Event> propertyEvents;
- if (filter.include(propertyEventType, jcrPath, parentNode)) {
+ if (filter.include(propertyEventType, path, parentNode)) {
propertyEvents = Iterators.transform(
Iterators.filter(
node.getProperties().iterator(),
@@ -423,7 +416,7 @@ class ChangeProcessor implements Runnabl
propertyEvents = Iterators.emptyIterator();
}
- Iterator<Event> childNodeEvents = filter.includeChildren(jcrPath)
+ Iterator<Event> childNodeEvents = filter.includeChildren(path)
? Iterators.concat(generateChildEvents(eventType, path, node, id))
: Iterators.<Event>emptyIterator();
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventFilter.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventFilter.java?rev=1499383&r1=1499382&r2=1499383&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventFilter.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/EventFilter.java Wed Jul 3 13:11:45 2013
@@ -20,7 +20,6 @@ package org.apache.jackrabbit.oak.jcr.ob
import static com.google.common.base.Objects.toStringHelper;
-import javax.annotation.CheckForNull;
import javax.annotation.Nullable;
import javax.jcr.RepositoryException;
import javax.jcr.nodetype.NoSuchNodeTypeException;
@@ -31,7 +30,6 @@ import org.apache.jackrabbit.oak.api.Tre
import org.apache.jackrabbit.oak.api.Type;
import org.apache.jackrabbit.oak.commons.PathUtils;
import org.apache.jackrabbit.oak.core.ReadOnlyTree;
-import org.apache.jackrabbit.oak.namepath.NamePathMapper;
import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
import org.apache.jackrabbit.oak.spi.state.NodeState;
@@ -40,7 +38,6 @@ import org.apache.jackrabbit.oak.spi.sta
*/
class EventFilter {
private final ReadOnlyNodeTypeManager ntMgr;
- private final NamePathMapper namePathMapper;
private final int eventTypes;
private final String path;
private final boolean deep;
@@ -50,8 +47,8 @@ class EventFilter {
/**
* Create a new instance of a filter for a certain criterion
+ *
* @param ntMgr
- * @param namePathMapper
* @param eventTypes event types to include encoded as a bit mask
* @param path path to include
* @param deep {@code true} if descendants of {@code path} should be included. {@code false} otherwise.
@@ -63,18 +60,14 @@ class EventFilter {
* @see javax.jcr.observation.ObservationManager#addEventListener(javax.jcr.observation.EventListener,
* int, String, boolean, String[], String[], boolean)
*/
- public EventFilter(ReadOnlyNodeTypeManager ntMgr,
- NamePathMapper namePathMapper, int eventTypes,
- String path, boolean deep, String[] uuids,
- String[] nodeTypeName, boolean noLocal)
- throws NoSuchNodeTypeException, RepositoryException {
+ public EventFilter(ReadOnlyNodeTypeManager ntMgr, int eventTypes, String path, boolean deep, String[] uuids,
+ String[] nodeTypeName, boolean noLocal) {
this.ntMgr = ntMgr;
- this.namePathMapper = namePathMapper;
this.eventTypes = eventTypes;
this.path = path;
this.deep = deep;
this.uuids = uuids;
- this.nodeTypeOakName = validateNodeTypeNames(nodeTypeName);
+ this.nodeTypeOakName = nodeTypeName;
this.noLocal = noLocal;
}
@@ -98,12 +91,9 @@ class EventFilter {
* @return {@code true} if the children of {@code path} could be matched by this filter
*/
public boolean includeChildren(String path) {
- String thisOakPath = namePathMapper.getOakPath(this.path);
- String thatOakPath = namePathMapper.getOakPath(path);
-
- return PathUtils.isAncestor(thatOakPath, thisOakPath) ||
- path.equals(thisOakPath) ||
- deep && PathUtils.isAncestor(thisOakPath, thatOakPath);
+ return PathUtils.isAncestor(path, this.path) ||
+ path.equals((this.path)) ||
+ deep && PathUtils.isAncestor(this.path, path);
}
/**
@@ -139,15 +129,12 @@ class EventFilter {
}
private boolean include(String path) {
- String thisOakPath = namePathMapper.getOakPath(this.path);
- String thatOakPath = namePathMapper.getOakPath(path);
-
- boolean equalPaths = thisOakPath.equals(thatOakPath);
+ boolean equalPaths = this.path.equals(path);
if (!deep && !equalPaths) {
return false;
}
- if (deep && !(PathUtils.isAncestor(thisOakPath, thatOakPath) || equalPaths)) {
+ if (deep && !(PathUtils.isAncestor(this.path, path) || equalPaths)) {
return false;
}
return true;
@@ -197,27 +184,4 @@ class EventFilter {
return false;
}
- /**
- * Validates the given node type names.
- *
- * @param nodeTypeNames the node type names.
- * @return the node type names as oak names.
- * @throws javax.jcr.nodetype.NoSuchNodeTypeException if one of the node type names refers to
- * an non-existing node type.
- * @throws javax.jcr.RepositoryException if an error occurs while reading from the
- * node type manager.
- */
- @CheckForNull
- private String[] validateNodeTypeNames(@Nullable String[] nodeTypeNames)
- throws NoSuchNodeTypeException, RepositoryException {
- if (nodeTypeNames == null) {
- return null;
- }
- String[] oakNames = new String[nodeTypeNames.length];
- for (int i = 0; i < nodeTypeNames.length; i++) {
- ntMgr.getNodeType(nodeTypeNames[i]);
- oakNames[i] = namePathMapper.getOakName(nodeTypeNames[i]);
- }
- return oakNames;
- }
}
Modified: jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java?rev=1499383&r1=1499382&r2=1499383&view=diff
==============================================================================
--- jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java (original)
+++ jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java Wed Jul 3 13:11:45 2013
@@ -24,8 +24,11 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import javax.annotation.CheckForNull;
+import javax.annotation.Nullable;
import javax.jcr.RepositoryException;
import javax.jcr.UnsupportedRepositoryOperationException;
+import javax.jcr.nodetype.NoSuchNodeTypeException;
import javax.jcr.observation.EventJournal;
import javax.jcr.observation.EventListener;
import javax.jcr.observation.EventListenerIterator;
@@ -99,8 +102,8 @@ public class ObservationManagerImpl impl
@Override
public synchronized void addEventListener(EventListener listener, int eventTypes, String absPath,
boolean isDeep, String[] uuid, String[] nodeTypeName, boolean noLocal) throws RepositoryException {
- EventFilter filter = new EventFilter(ntMgr, namePathMapper, eventTypes,
- absPath, isDeep, uuid, nodeTypeName, noLocal);
+ EventFilter filter = new EventFilter(ntMgr, eventTypes, oakPath(absPath), isDeep,
+ uuid, validateNodeTypeNames(nodeTypeName), noLocal);
ChangeProcessor processor = processors.get(listener);
if (processor == null) {
log.info(OBSERVATION, "Registering event listener {} with filter {}", listener, filter);
@@ -160,4 +163,34 @@ public class ObservationManagerImpl impl
throw new UnsupportedRepositoryOperationException();
}
+ //------------------------------------------------------------< private >---
+
+ private String oakPath(String jcrPath) {
+ return namePathMapper.getOakPath(jcrPath);
+ }
+
+ /**
+ * Validates the given node type names.
+ *
+ * @param nodeTypeNames the node type names.
+ * @return the node type names as oak names.
+ * @throws javax.jcr.nodetype.NoSuchNodeTypeException if one of the node type names refers to
+ * an non-existing node type.
+ * @throws javax.jcr.RepositoryException if an error occurs while reading from the
+ * node type manager.
+ */
+ @CheckForNull
+ private String[] validateNodeTypeNames(@Nullable String[] nodeTypeNames)
+ throws NoSuchNodeTypeException, RepositoryException {
+ if (nodeTypeNames == null) {
+ return null;
+ }
+ String[] oakNames = new String[nodeTypeNames.length];
+ for (int i = 0; i < nodeTypeNames.length; i++) {
+ ntMgr.getNodeType(nodeTypeNames[i]);
+ oakNames[i] = namePathMapper.getOakName(nodeTypeNames[i]);
+ }
+ return oakNames;
+ }
+
}