Author: mduerig
Date: Mon Nov 18 16:47:46 2013
New Revision: 1543080
URL: http://svn.apache.org/r1543080
Log:
OAK-1133: Observation listener PLUS
Implement event generation and filtering of JCR observation through the new
filter and event generation mechanism
Added:
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/JcrListener.java
- copied, changed from r1543079,
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java
Removed:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventFilter.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/SecurableValidator.java
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/SecureValidator.java
jackrabbit/oak/trunk/oak-core/src/test/java/org/apache/jackrabbit/oak/SecureNodeStateDiffTest.java
Modified:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.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=1543080&r1=1543079&r2=1543080&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
Mon Nov 18 16:47:46 2013
@@ -27,9 +27,9 @@ import java.util.concurrent.atomic.Atomi
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
+import javax.jcr.observation.Event;
import javax.jcr.observation.EventListener;
-import com.google.common.base.Objects;
import org.apache.jackrabbit.api.jmx.EventListenerMBean;
import org.apache.jackrabbit.commons.iterator.EventIteratorAdapter;
import org.apache.jackrabbit.commons.observation.ListenerTracker;
@@ -37,6 +37,7 @@ import org.apache.jackrabbit.oak.api.Con
import org.apache.jackrabbit.oak.core.ImmutableRoot;
import org.apache.jackrabbit.oak.core.ImmutableTree;
import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.plugins.observation.filter.EventIterator;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
import org.apache.jackrabbit.oak.spi.commit.Observable;
import org.apache.jackrabbit.oak.spi.commit.Observer;
@@ -49,7 +50,7 @@ import org.slf4j.LoggerFactory;
/**
* A {@code ChangeProcessor} generates observation {@link
javax.jcr.observation.Event}s
- * based on a {@link EventFilter} and delivers them to an {@link
EventListener}.
+ * based on a {@link FilterProvider filter} and delivers them to an {@link
EventListener}.
* <p>
* After instantiation a {@code ChangeProcessor} must be started in order to
start
* delivering observation events and stopped to stop doing so.
@@ -60,8 +61,8 @@ public class ChangeProcessor implements
private final ContentSession contentSession;
private final NamePathMapper namePathMapper;
private final ListenerTracker tracker;
- private final EventListener listener;
- private final AtomicReference<EventFilter> filterRef;
+ private final EventListener eventListener;
+ private final AtomicReference<FilterProvider> filterProvider;
private Closeable observer;
private Registration mbean;
@@ -69,21 +70,21 @@ public class ChangeProcessor implements
public ChangeProcessor(
ContentSession contentSession, NamePathMapper namePathMapper,
- ListenerTracker tracker, EventFilter filter) {
+ ListenerTracker tracker, FilterProvider filter) {
checkArgument(contentSession instanceof Observable);
this.contentSession = contentSession;
this.namePathMapper = namePathMapper;
this.tracker = tracker;
- listener = tracker.getTrackedListener();
- filterRef = new AtomicReference<EventFilter>(filter);
+ eventListener = tracker.getTrackedListener();
+ filterProvider = new AtomicReference<FilterProvider>(filter);
}
/**
* Set the filter for the events this change processor will generate.
* @param filter
*/
- public void setFilter(EventFilter filter) {
- filterRef.set(filter);
+ public void setFilterProvider(FilterProvider filter) {
+ filterProvider.set(filter);
}
/**
@@ -119,16 +120,18 @@ public class ChangeProcessor implements
public void contentChanged(@Nonnull NodeState root, @Nullable CommitInfo
info) {
if (previousRoot != null) {
try {
- EventFilter filter = filterRef.get();
- if (filter.includeSessionLocal(isLocal(info))
- && filter.includeClusterExternal(isExternal(info))) {
- String path = namePathMapper.getOakPath(filter.getPath());
+ FilterProvider provider = filterProvider.get();
+ // FIXME don't rely on toString for session id
+ if (provider.includeCommit(contentSession.toString(), info)) {
+ String path =
namePathMapper.getOakPath(provider.getPath());
ImmutableTree beforeTree = getTree(previousRoot, path);
ImmutableTree afterTree = getTree(root, path);
- EventGenerator events = new EventGenerator(
- info, beforeTree, afterTree, filter,
namePathMapper);
+ EventIterator<Event> events = new EventIterator<Event>(
+ beforeTree.getNodeState(),
afterTree.getNodeState(),
+ provider.getFilter(afterTree),
+ new JcrListener(beforeTree, afterTree,
namePathMapper, info));
if (events.hasNext()) {
- listener.onEvent(new EventIteratorAdapter(events));
+ eventListener.onEvent(new
EventIteratorAdapter(events));
}
}
} catch (Exception e) {
@@ -138,15 +141,6 @@ public class ChangeProcessor implements
previousRoot = root;
}
- private boolean isLocal(CommitInfo info) {
- // FIXME don't rely on toString for session id
- return info != null && Objects.equal(info.getSessionId(),
contentSession.toString());
- }
-
- private static boolean isExternal(CommitInfo info) {
- return info == null;
- }
-
private static ImmutableTree getTree(NodeState nodeState, String path) {
return new ImmutableRoot(nodeState).getTree(path);
}
Added:
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=1543080&view=auto
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java
(added)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/FilterProvider.java
Mon Nov 18 16:47:46 2013
@@ -0,0 +1,117 @@
+/*
+ * 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;
+
+import static com.google.common.base.Objects.toStringHelper;
+
+import com.google.common.base.Objects;
+import org.apache.jackrabbit.oak.core.ImmutableTree;
+import org.apache.jackrabbit.oak.plugins.nodetype.ReadOnlyNodeTypeManager;
+import
org.apache.jackrabbit.oak.plugins.observation.filter.EventGenerator.Filter;
+import org.apache.jackrabbit.oak.plugins.observation.filter.EventTypeFilter;
+import org.apache.jackrabbit.oak.plugins.observation.filter.Filters;
+import org.apache.jackrabbit.oak.plugins.observation.filter.NodeTypeFilter;
+import org.apache.jackrabbit.oak.plugins.observation.filter.PathFilter;
+import org.apache.jackrabbit.oak.plugins.observation.filter.UuidFilter;
+import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
+
+/**
+ * Provider for a filter filtering observation events according to a certain
criterion.
+ */
+public class FilterProvider {
+ private final ReadOnlyNodeTypeManager ntManager;
+ private final int eventTypes;
+ private final String path;
+ private final boolean deep;
+ private final String[] uuids;
+ private final String[] ntNames;
+ private final boolean includeSessionLocal;
+ private final boolean includeClusterExternal;
+
+ /**
+ * Create a new instance of a {@code FilterProvider} for certain criteria
+ *
+ * @param ntManager node type manager
+ * @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 uuids uuids to include
+ * @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.
+ *
+ * @see
javax.jcr.observation.ObservationManager#addEventListener(javax.jcr.observation.EventListener,
int, String, boolean, String[], String[], boolean) */
+ public FilterProvider(ReadOnlyNodeTypeManager ntManager, int eventTypes,
String path,
+ boolean deep, String[] uuids, String[] nodeTypeName,
+ boolean includeSessionLocal, boolean includeClusterExternal) {
+ this.ntManager = ntManager;
+ this.eventTypes = eventTypes;
+ this.path = path;
+ this.deep = deep;
+ this.uuids = uuids;
+ this.ntNames = nodeTypeName;
+ this.includeSessionLocal = includeSessionLocal;
+ this.includeClusterExternal = includeClusterExternal;
+ }
+
+ public boolean includeCommit(String sessionId, CommitInfo info) {
+ return (includeSessionLocal || !isLocal(sessionId, info))
+ && (includeClusterExternal || !isExternal(info));
+ }
+
+ public Filter getFilter(ImmutableTree afterTree) {
+ return Filters.all(
+ // TODO add filter based on access rights of the reading
session
+ new PathFilter(afterTree, path, deep),
+ new EventTypeFilter(eventTypes),
+ new UuidFilter(afterTree.getNodeState(), uuids),
+ new NodeTypeFilter(afterTree, ntManager, ntNames));
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ @Override
+ public String toString() {
+ return toStringHelper(this)
+ .add("event types", eventTypes)
+ .add("path", path)
+ .add("deep", deep)
+ .add("uuids", uuids)
+ .add("node type names", ntNames)
+ .add("includeSessionLocal", includeSessionLocal)
+ .add("includeClusterExternal", includeClusterExternal)
+ .toString();
+ }
+
+ //------------------------------------------------------------< private
>---
+
+ private static boolean isLocal(String sessionId, CommitInfo info) {
+ return info != null && Objects.equal(info.getSessionId(), sessionId);
+ }
+
+ private static boolean isExternal(CommitInfo info) {
+ return info == null;
+ }
+
+}
Copied:
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/JcrListener.java
(from r1543079,
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java)
URL:
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/JcrListener.java?p2=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/JcrListener.java&p1=jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java&r1=1543079&r2=1543080&rev=1543080&view=diff
==============================================================================
---
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java
(original)
+++
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/JcrListener.java
Mon Nov 18 16:47:46 2013
@@ -16,9 +16,9 @@
* specific language governing permissions and limitations
* under the License.
*/
+
package org.apache.jackrabbit.oak.plugins.observation;
-import static com.google.common.collect.Iterators.concat;
import static com.google.common.collect.Lists.newArrayList;
import static java.util.Collections.emptyMap;
import static javax.jcr.observation.Event.NODE_ADDED;
@@ -37,47 +37,33 @@ import java.util.Map;
import javax.jcr.observation.Event;
-import com.google.common.collect.ForwardingIterator;
import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterators;
import com.google.common.collect.Lists;
-import org.apache.jackrabbit.oak.api.CommitFailedException;
import org.apache.jackrabbit.oak.api.PropertyState;
import org.apache.jackrabbit.oak.api.Tree;
import org.apache.jackrabbit.oak.commons.PathUtils;
-import org.apache.jackrabbit.oak.core.ImmutableTree;
-import org.apache.jackrabbit.oak.namepath.NamePathMapper;
+import org.apache.jackrabbit.oak.namepath.PathMapper;
+import
org.apache.jackrabbit.oak.plugins.observation.filter.EventIterator.IterableListener;
import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
-import org.apache.jackrabbit.oak.spi.commit.VisibleValidator;
-import org.apache.jackrabbit.oak.spi.state.MoveDetector;
-import org.apache.jackrabbit.oak.spi.state.MoveValidator;
import org.apache.jackrabbit.oak.spi.state.NodeState;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
/**
- * TODO document
+ * TODO JcrListener...
*/
-class EventGenerator extends ForwardingIterator<Event> implements
MoveValidator {
- private static final Logger log =
LoggerFactory.getLogger(EventGenerator.class);
-
+class JcrListener implements IterableListener<Event> {
+ private final Tree beforeTree;
+ private final Tree afterTree;
+ private final List<Event> events = newArrayList();
+ private final PathMapper namePathMapper;
private final String userId;
- private final String message;
private final long timestamp;
+ private final String message;
private final boolean external;
- private final ImmutableTree beforeTree;
- private final ImmutableTree afterTree;
- private final EventFilter filter;
- private final NamePathMapper namePathMapper;
-
- private final List<Event> events = newArrayList();
- private final List<Iterator<Event>> childEvents = newArrayList();
-
- private Iterator<Event> eventIterator;
-
- EventGenerator(CommitInfo info, ImmutableTree beforeTree, ImmutableTree
afterTree,
- EventFilter filter, NamePathMapper namePathMapper) {
+ JcrListener(Tree beforeTree, Tree afterTree, PathMapper namePathMapper,
CommitInfo info) {
+ this.beforeTree = beforeTree;
+ this.afterTree = afterTree;
+ this.namePathMapper = namePathMapper;
if (info != null) {
this.userId = info.getUserId();
this.message = info.getMessage();
@@ -91,105 +77,70 @@ class EventGenerator extends ForwardingI
this.timestamp = System.currentTimeMillis();
this.external = true;
}
+ }
+
+ private JcrListener(Tree beforeTree, Tree afterTree, PathMapper
namePathMapper, String userId,
+ long timestamp, String message, boolean external) {
this.beforeTree = beforeTree;
this.afterTree = afterTree;
- this.filter = filter;
this.namePathMapper = namePathMapper;
+ this.userId = userId;
+ this.timestamp = timestamp;
+ this.message = message;
+ this.external = external;
}
- EventGenerator(EventGenerator parent, String name) {
- this.userId = parent.userId;
- this.message = parent.message;
- this.timestamp = parent.timestamp;
- this.external = parent.external;
- this.beforeTree = parent.beforeTree.getChild(name);
- this.afterTree = parent.afterTree.getChild(name);
- this.filter = parent.filter;
- this.namePathMapper = parent.namePathMapper;
- }
-
- //------------------------------------------------------------<
ForwardingIterator >---
-
- @Override
- protected Iterator<Event> delegate() {
- try {
- if (eventIterator == null) {
- SecureValidator.compare(beforeTree, afterTree,
- new VisibleValidator(
- new MoveDetector(this, afterTree.getPath()),
true, true));
- eventIterator = concat(events.iterator(),
concat(childEvents.iterator()));
- }
- return eventIterator;
- } catch (CommitFailedException e) {
- log.error("Error while extracting observation events", e);
- return Iterators.emptyIterator();
- }
+ @Override
+ public void propertyAdded(PropertyState after) {
+ events.add(createEvent(PROPERTY_ADDED, afterTree, after));
}
- //------------------------------------------------------------< Validator
>---
-
@Override
- public void enter(NodeState before, NodeState after) throws
CommitFailedException {
+ public void propertyChanged(PropertyState before, PropertyState after) {
+ events.add(createEvent(Event.PROPERTY_CHANGED, afterTree, after));
}
@Override
- public void leave(NodeState before, NodeState after) throws
CommitFailedException {
+ public void propertyDeleted(PropertyState before) {
+ events.add(createEvent(PROPERTY_REMOVED, beforeTree, before));
}
@Override
- public void propertyAdded(PropertyState after) {
- if (filter.include(PROPERTY_ADDED, afterTree)) {
- events.add(createEvent(PROPERTY_ADDED, afterTree, after));
- }
+ public void childNodeAdded(String name, NodeState after) {
+ events.add(createEvent(NODE_ADDED, afterTree.getChild(name)));
}
@Override
- public void propertyChanged(PropertyState before, PropertyState after) {
- if (filter.include(Event.PROPERTY_CHANGED, afterTree)) {
- events.add(createEvent(Event.PROPERTY_CHANGED, afterTree, after));
- }
+ public void childNodeChanged(String name, NodeState before, NodeState
after) {
+ detectReorder(name, before, after);
}
@Override
- public void propertyDeleted(PropertyState before) {
- if (filter.include(PROPERTY_REMOVED, afterTree)) {
- events.add(createEvent(PROPERTY_REMOVED, beforeTree, before));
- }
+ public void childNodeDeleted(String name, NodeState before) {
+ events.add(createEvent(NODE_REMOVED, beforeTree.getChild(name)));
}
@Override
- public MoveValidator childNodeAdded(String name, NodeState after) {
- if (filter.include(NODE_ADDED, afterTree)) {
- events.add(createEvent(NODE_ADDED, afterTree.getChild(name)));
- }
- if (filter.includeChildren(afterTree.getPath())) {
- childEvents.add(new EventGenerator(this, name));
- }
- return null;
+ public void nodeMoved(String sourcePath, String destPath, NodeState moved)
{
+ events.add(createEvent(NODE_MOVED,
afterTree.getChild(getName(destPath)),
+ ImmutableMap.of(
+ "srcAbsPath", namePathMapper.getJcrPath(sourcePath),
+ "destAbsPath", namePathMapper.getJcrPath(destPath))));
}
@Override
- public MoveValidator childNodeDeleted(String name, NodeState before) {
- if (filter.include(NODE_REMOVED, afterTree)) {
- events.add(createEvent(NODE_REMOVED, beforeTree.getChild(name)));
- }
- if (filter.includeChildren(beforeTree.getPath())) {
- childEvents.add(new EventGenerator(this, name));
- }
- return null;
+ public JcrListener create(String name, NodeState before, NodeState after) {
+ return new JcrListener(beforeTree.getChild(name),
afterTree.getChild(name), namePathMapper,
+ userId, timestamp, message, external);
}
@Override
- public MoveValidator childNodeChanged(String name, NodeState before,
NodeState after) {
- if (filter.include(NODE_MOVED, afterTree)) {
- detectReorder(name, before, after);
- }
- if (filter.includeChildren(afterTree.getPath())) {
- childEvents.add(new EventGenerator(this, name));
- }
- return null;
+ public Iterator<Event> iterator() {
+ return events.iterator();
}
+ //------------------------------------------------------------< private
>---
+
private void detectReorder(String name, NodeState before, NodeState after)
{
PropertyState afterOrder = after.getProperty(OAK_CHILD_ORDER);
PropertyState beforeOrder = before.getProperty(OAK_CHILD_ORDER);
@@ -228,19 +179,6 @@ class EventGenerator extends ForwardingI
return names;
}
- @Override
- public void move(String sourcePath, String destPath, NodeState moved)
- throws CommitFailedException {
- if (filter.include(NODE_MOVED, afterTree)) {
- events.add(createEvent(NODE_MOVED,
afterTree.getChild(getName(destPath)),
- ImmutableMap.of(
- "srcAbsPath",
namePathMapper.getJcrPath(sourcePath),
- "destAbsPath",
namePathMapper.getJcrPath(destPath))));
- }
- }
-
- //------------------------------------------------------------< internal
>---
-
private Event createEvent(int eventType, Tree tree) {
return createEvent(eventType, tree.getPath(), getIdentifier(tree),
emptyMap());
}
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=1543080&r1=1543079&r2=1543080&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
Mon Nov 18 16:47:46 2013
@@ -41,8 +41,8 @@ import org.apache.jackrabbit.oak.jcr.del
import org.apache.jackrabbit.oak.namepath.NamePathMapper;
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.FilterProvider;
import org.apache.jackrabbit.oak.spi.commit.Observable;
import org.apache.jackrabbit.oak.spi.whiteboard.Whiteboard;
import org.slf4j.Logger;
@@ -106,11 +106,11 @@ public class ObservationManagerImpl impl
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,
+ FilterProvider filterProvider = new FilterProvider(ntMgr, eventTypes,
oakPath(absPath), isDeep,
uuid, validateNodeTypeNames(nodeTypeName), !noLocal,
includeExternal);
ChangeProcessor processor = processors.get(listener);
if (processor == null) {
- log.info(OBSERVATION, "Registering event listener {} with filter
{}", listener, filter);
+ log.info(OBSERVATION, "Registering event listener {} with filter
{}", listener, filterProvider);
ListenerTracker tracker = new ListenerTracker(
listener, eventTypes, absPath, isDeep,
uuid, nodeTypeName, noLocal) {
@@ -124,12 +124,12 @@ public class ObservationManagerImpl impl
}
};
processor = new ChangeProcessor(
- sessionDelegate.getContentSession(), namePathMapper,
tracker, filter);
+ sessionDelegate.getContentSession(), namePathMapper,
tracker, filterProvider);
processors.put(listener, processor);
processor.start(whiteboard);
} else {
- log.debug(OBSERVATION, "Changing event listener {} to filter {}",
listener, filter);
- processor.setFilter(filter);
+ log.debug(OBSERVATION, "Changing event listener {} to filter {}",
listener, filterProvider);
+ processor.setFilterProvider(filterProvider);
}
}