Index: oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java (date 1371657236000) +++ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeDispatcher.java (revision ) @@ -197,7 +197,7 @@ add(changeSet); } } - return changeSets.isEmpty() ? null : changeSets.remove(); + return ChangeSet.aggregate(changeSets); } private void add(ChangeSet changeSet) { @@ -217,12 +217,40 @@ private final NodeState before; private final NodeState after; + @Nonnull static ChangeSet local(NodeState base, NodeState head, ContentSession contentSession) { return new InternalChangeSet(base, head, contentSession, System.currentTimeMillis()); } + @Nonnull static ChangeSet external(NodeState base, NodeState head) { return new ExternalChangeSet(base, head); + } + + @CheckForNull + static ChangeSet aggregate(Queue changeSets) { + ChangeSet first = changeSets.peek(); + ChangeSet last = first; + ChangeSet next = first; + while (next != null && canAggregate(first, next)) { + last = changeSets.remove(); + next = changeSets.peek(); + } + + if (first == last) { + return first; + } + + InternalChangeSet f = (InternalChangeSet) first; + InternalChangeSet l = (InternalChangeSet) last; + return new InternalChangeSet(first.before, last.after, l.contentSession, last.getDate()); // michid date is broken + } + + private static boolean canAggregate(ChangeSet first, ChangeSet last) { + InternalChangeSet f = (InternalChangeSet) first; + InternalChangeSet l = (InternalChangeSet) last; + + return !f.isExternal() && !l.isExternal() && f.contentSession == l.contentSession; } protected ChangeSet(NodeState before, NodeState after) {