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);