Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventImpl.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventImpl.java (revision 1469221) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventImpl.java (working copy) @@ -22,12 +22,13 @@ import java.util.Map; import javax.jcr.RepositoryException; -import javax.jcr.observation.Event; +import org.apache.jackrabbit.api.observation.JackrabbitEvent; + /** * TODO document */ -public class EventImpl implements Event { +public class EventImpl implements JackrabbitEvent { private final int type; private final String path; private final String userID; @@ -35,8 +36,9 @@ private final Map info; private final long date; private final String userData; + private final boolean external; - public EventImpl(int type, String path, String userID, String identifier, Map info, long date, String userData) { + public EventImpl(int type, String path, String userID, String identifier, Map info, long date, String userData, boolean external) { this.type = type; this.path = path; this.userID = userID; @@ -44,6 +46,7 @@ this.info = info == null ? Collections.emptyMap() : info; this.date = date; this.userData = userData; + this.external = external; } @Override @@ -81,7 +84,14 @@ return date; } + //-------------------------< JackrabbitEvent >------------------------------ + @Override + public boolean isExternal() { + return external; + } + + @Override public final boolean equals(Object other) { if (this == other) { return true; Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventQueueReader.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventQueueReader.java (revision 1469221) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventQueueReader.java (working copy) @@ -21,6 +21,7 @@ import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.DATE; import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.EVENTS_PATH; +import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.INSTANCE_ID; import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.PATH; import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.TYPE; import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.USER_DATA; @@ -46,6 +47,7 @@ public class EventQueueReader { private final Root root; private final NamePathMapper namePathMapper; + private final String instanceId = EventQueueWriterProvider.INSTANCE_ID; private Tree bundles; private long nextBundleId = EventQueueWriterProvider.BUNDLE_ID.get(); @@ -100,7 +102,8 @@ String userId = getString(event.getChild(id), USER_ID); long date = getLong(event, DATE, 0); String userData = getString(event.getChild(id), USER_DATA); - return new EventImpl(type, path, userId, id, Collections.emptyMap(), date, userData); + boolean external = !instanceId.equals(getString(event.getParent(), INSTANCE_ID)); + return new EventImpl(type, path, userId, id, Collections.emptyMap(), date, userData, external); } private String getJcrPath(Tree event) { Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventQueueWriter.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventQueueWriter.java (revision 1469221) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventQueueWriter.java (working copy) @@ -30,6 +30,7 @@ import static org.apache.jackrabbit.JcrConstants.JCR_UUID; import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.DATE; import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.DEEP; +import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.INSTANCE_ID; import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.NODE_TYPES; import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.NO_LOCAL; import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.PATH; @@ -238,10 +239,11 @@ private long eventId; - public EventRecorder(NodeBuilder eventQueue, Iterable listenerSpecs) { + public EventRecorder(NodeBuilder eventQueue, Iterable listenerSpecs, String instanceId) { this.eventQueue = eventQueue; this.listenerSpecs = listenerSpecs; this.date = System.currentTimeMillis(); + this.eventQueue.setProperty(INSTANCE_ID, instanceId); } private void recordEvent(int type, String path, String identifier, String[] associatedParentTypes) { Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventQueueWriterProvider.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventQueueWriterProvider.java (revision 1469221) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/EventQueueWriterProvider.java (working copy) @@ -25,6 +25,7 @@ import static org.apache.jackrabbit.oak.plugins.observation2.ObservationConstants.REP_OBSERVATION; import java.util.Set; +import java.util.UUID; import java.util.concurrent.atomic.AtomicLong; import com.google.common.collect.Sets; @@ -44,6 +45,8 @@ */ public class EventQueueWriterProvider implements EditorProvider { public static final AtomicLong BUNDLE_ID = new AtomicLong(); + // FIXME: does not work for multiple cluster nodes in single JVM + public static final String INSTANCE_ID = UUID.randomUUID().toString(); @Override public Editor getRootEditor(NodeState before, NodeState after, NodeBuilder builder) { @@ -57,7 +60,7 @@ return DefaultEditor.INSTANCE; } - EventRecorder eventRecorder = new EventRecorder(queue, listenerSpecs); + EventRecorder eventRecorder = new EventRecorder(queue, listenerSpecs, INSTANCE_ID); return VisibleEditor.wrap(new EventQueueWriter(eventRecorder, "/", after)); } Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/ObservationConstants.java =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/ObservationConstants.java (revision 1469221) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation2/ObservationConstants.java (working copy) @@ -39,6 +39,7 @@ String UUID = "uuid"; String NODE_TYPES = "nodeTypes"; String NO_LOCAL = "noLocal"; + String INSTANCE_ID = "instanceId"; String LISTENER_PATH = '/' + JCR_SYSTEM + '/' + REP_OBSERVATION + '/' + LISTENERS; String EVENTS_PATH = '/' + JCR_SYSTEM + '/' + REP_OBSERVATION + '/' + EVENTS;