Return-Path: X-Original-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Delivered-To: apmail-jackrabbit-oak-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 219AE1091D for ; Wed, 3 Jul 2013 13:12:18 +0000 (UTC) Received: (qmail 38484 invoked by uid 500); 3 Jul 2013 13:12:17 -0000 Delivered-To: apmail-jackrabbit-oak-commits-archive@jackrabbit.apache.org Received: (qmail 38445 invoked by uid 500); 3 Jul 2013 13:12:17 -0000 Mailing-List: contact oak-commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: oak-dev@jackrabbit.apache.org Delivered-To: mailing list oak-commits@jackrabbit.apache.org Received: (qmail 38432 invoked by uid 99); 3 Jul 2013 13:12:14 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 03 Jul 2013 13:12:14 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 03 Jul 2013 13:12:07 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 31A6023888CD; Wed, 3 Jul 2013 13:11:46 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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/ Date: Wed, 03 Jul 2013 13:11:46 -0000 To: oak-commits@jackrabbit.apache.org From: mduerig@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20130703131146.31A6023888CD@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 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 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 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 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 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 childNodeEvents = filter.includeChildren(jcrPath) + Iterator childNodeEvents = filter.includeChildren(path) ? Iterators.concat(generateChildEvents(eventType, path, node, id)) : Iterators.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; + } + }