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/10/29 18:43:03 UTC

svn commit: r1536832 - 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: Tue Oct 29 17:43:03 2013
New Revision: 1536832

URL: http://svn.apache.org/r1536832
Log:
OAK-1121: Enhance observation mechanism to only listen to cluster local changes
Initial implementation using a marker interface to indicate exclusion of cluster external events

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ExcludeExternal.java
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/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/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=1536832&r1=1536831&r2=1536832&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 Oct 29 17:43:03 2013
@@ -143,7 +143,8 @@ public class ChangeProcessor {
                     EventFilter filter = filterRef.get();
                     // FIXME don't rely on toString for session id
                     if (changes != null &&
-                            filter.include(changes.isLocal(contentSession.toString()))) {
+                            filter.includeSessionLocal(changes.isLocal(contentSession.toString())) &&
+                            filter.includeClusterExternal(changes.getCommitInfo() == null)) {
                         String path = namePathMapper.getOakPath(filter.getPath());
                         ImmutableTree beforeTree = getTree(changes.getBeforeState(), path);
                         ImmutableTree afterTree = getTree(changes.getAfterState(), path);

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=1536832&r1=1536831&r2=1536832&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 Tue Oct 29 17:43:03 2013
@@ -43,7 +43,8 @@ public class EventFilter {
     private final boolean deep;
     private final String[] uuids;
     private final String[] nodeTypeOakName;
-    private final boolean includeLocal;
+    private final boolean includeSessionLocal;
+    private final boolean includeClusterExternal;
 
     /**
      * Create a new instance of a filter for a certain criterion
@@ -51,24 +52,28 @@ public class EventFilter {
      * @param ntMgr
      * @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.
+     * @param deep        {@code true} if descendants of {@code path} should be included.
+     *                    {@code false} otherwise.
      * @param uuids       uuids to include
-     * @param nodeTypeName  node type names to include
-     * @param includeLocal  include session local events if {@code true}. Exclude otherwise.
-     * @throws NoSuchNodeTypeException  if any of the node types in {@code nodeTypeName} does not exist
+     * @param nodeTypeName              node type names to include
+     * @param includeSessionLocal       include session local events if {@code true}.
+     *                                  Exclude otherwise.
+     * @param includeClusterExternal    include cluster external events if {@code true}.
+     *                                  Exclude otherwise.
+     * @throws NoSuchNodeTypeException  if any of the node types in {@code nodeTypeName} does not
+     *                                  exist
      * @throws RepositoryException      if an error occurs while reading from the node type manager.
-     * @see javax.jcr.observation.ObservationManager#addEventListener(javax.jcr.observation.EventListener,
-     * int, String, boolean, String[], String[], boolean)
-     */
+     * @see javax.jcr.observation.ObservationManager#addEventListener(javax.jcr.observation.EventListener, int, String, boolean, String[], String[], boolean) */
     public EventFilter(ReadOnlyNodeTypeManager ntMgr, int eventTypes, String path, boolean deep, String[] uuids,
-            String[] nodeTypeName, boolean includeLocal) {
+            String[] nodeTypeName, boolean includeSessionLocal, boolean includeClusterExternal) {
         this.ntMgr = ntMgr;
         this.eventTypes = eventTypes;
         this.path = path;
         this.deep = deep;
         this.uuids = uuids;
         this.nodeTypeOakName = nodeTypeName;
-        this.includeLocal = includeLocal;
+        this.includeSessionLocal = includeSessionLocal;
+        this.includeClusterExternal = includeClusterExternal;
     }
 
     /**
@@ -87,11 +92,20 @@ public class EventFilter {
 
     /**
      * Determine whether session local changes should be included.
-     * @param local  {@code true} for session local changes, {@code false} otherwise.
+     * @param isLocal  {@code true} for session local changes, {@code false} otherwise.
+     * @return  {@code true} if the changes are included with this filter. {@code false} otherwise.
+     */
+    public boolean includeSessionLocal(boolean isLocal) {
+        return includeSessionLocal || !isLocal;
+    }
+
+    /**
+     * Determine whether cluster external changes should be included.
+     * @param isExternal  {@code true} for cluster external changes, {@code false} otherwise.
      * @return  {@code true} if the changes are included with this filter. {@code false} otherwise.
      */
-    public boolean include(boolean local) {
-        return includeLocal || !local;
+    public boolean includeClusterExternal(boolean isExternal) {
+        return includeClusterExternal || !isExternal;
     }
 
     /**
@@ -120,7 +134,8 @@ public class EventFilter {
                 .add("deep", deep)
                 .add("uuids", Arrays.toString(uuids))
                 .add("node types", Arrays.toString(nodeTypeOakName))
-                .add("includeLocal", includeLocal)
+                .add("includeSessionLocal", includeSessionLocal)
+                .add("includeClusterExternal", includeClusterExternal)
             .toString();
     }
 

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ExcludeExternal.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ExcludeExternal.java?rev=1536832&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ExcludeExternal.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ExcludeExternal.java Tue Oct 29 17:43:03 2013
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.jackrabbit.oak.plugins.observation;
+
+/**
+ * The presence of this marker interface on a {@link javax.jcr.observation.EventListener}
+ * indicates that cluster external observation events must not be reported to that
+ * event listener.
+ */
+public interface ExcludeExternal {
+}

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=1536832&r1=1536831&r2=1536832&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 Tue Oct 29 17:43:03 2013
@@ -42,6 +42,7 @@ import org.apache.jackrabbit.oak.namepat
 import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
 import org.apache.jackrabbit.oak.plugins.observation.ChangeProcessor;
 import org.apache.jackrabbit.oak.plugins.observation.EventFilter;
+import org.apache.jackrabbit.oak.plugins.observation.ExcludeExternal;
 import org.apache.jackrabbit.oak.plugins.observation.Observable;
 import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
 import org.slf4j.Logger;
@@ -104,8 +105,9 @@ 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 {
+        boolean includeExternal = !(listener instanceof ExcludeExternal);
         EventFilter filter = new EventFilter(ntMgr, eventTypes, oakPath(absPath), isDeep,
-                uuid, validateNodeTypeNames(nodeTypeName), !noLocal);
+                uuid, validateNodeTypeNames(nodeTypeName), !noLocal, includeExternal);
         ChangeProcessor processor = processors.get(listener);
         if (processor == null) {
             log.info(OBSERVATION, "Registering event listener {} with filter {}", listener, filter);