Author: jukka
Date: Tue Jan 28 21:13:19 2014
New Revision: 1562231

URL: http://svn.apache.org/r1562231
Log:
OAK-1133: Observation listener PLUS

Hook the restored Listener/ChangeHandler interface back into EventGenerator.

Modified:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/EventGenerator.java

Modified: 
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/EventGenerator.java?rev=1562231&r1=1562230&r2=1562231&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/EventGenerator.java
 Tue Jan 28 21:13:19 2014
@@ -49,6 +49,8 @@ import org.apache.jackrabbit.oak.namepat
 import org.apache.jackrabbit.oak.plugins.observation.filter.EventFilter;
 import org.apache.jackrabbit.oak.plugins.observation.filter.Filters;
 import org.apache.jackrabbit.oak.plugins.observation.filter.VisibleFilter;
+import org.apache.jackrabbit.oak.plugins.observation.handler.ChangeHandler;
+import org.apache.jackrabbit.oak.plugins.observation.handler.FilteredHandler;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
@@ -107,45 +109,37 @@ public class EventGenerator implements E
         private final NodeState after;
 
         /**
-         * Filter for selecting which events to produce.
+         * Filtered handler of detected content changes.
          */
-        private final EventFilter filter;
-
-        private final ImmutableTree beforeTree;
-        private final ImmutableTree afterTree;
+        private final ChangeHandler handler;
 
         EventDiff(NodeState before, NodeState after, String path,
                 EventFilter filter) {
             String name = null;
-            ImmutableTree btree = new ImmutableTree(before);
-            ImmutableTree atree = new ImmutableTree(after);
+            ChangeHandler handler = new Handler(
+                    new ImmutableTree(before), new ImmutableTree(after));
             for (String element : PathUtils.elements(path)) {
                 name = element;
                 before = before.getChildNode(name);
                 after = after.getChildNode(name);
-                btree = new ImmutableTree(btree, name, before);
-                atree = new ImmutableTree(atree, name, after);
+                handler = handler.getChildHandler(name, before, after);
             }
 
             this.parent = null;
             this.name = name;
             this.before = before;
             this.after = after;
-            this.filter = filter;
-            this.beforeTree = btree;
-            this.afterTree = atree;
+            this.handler = new FilteredHandler(filter, handler);
         }
 
         private EventDiff(
-                EventDiff parent, EventFilter filter,
+                EventDiff parent, ChangeHandler handler,
                 String name, NodeState before, NodeState after) {
             this.parent = parent;
             this.name = name;
             this.before = before;
             this.after = after;
-            this.filter = filter;
-            this.beforeTree = new ImmutableTree(parent.beforeTree, name, 
before);
-            this.afterTree = new ImmutableTree(parent.afterTree, name, after);
+            this.handler = handler;
         }
 
         //------------------------------------------------------< Runnable >--
@@ -168,10 +162,7 @@ public class EventGenerator implements E
 
         @Override
         public boolean propertyAdded(PropertyState after) {
-            if (filter.includeAdd(after)) {
-                events.add(new EventImpl(
-                        context, PROPERTY_ADDED, afterTree, after.getName()));
-            }
+            handler.propertyAdded(after);
             return true;
         }
 
@@ -183,19 +174,13 @@ public class EventGenerator implements E
                 handleReorderedNodes(
                         before.getValue(NAMES), after.getValue(NAMES));
             }
-            if (filter.includeChange(before, after)) {
-                events.add(new EventImpl(
-                        context, PROPERTY_CHANGED, afterTree, 
after.getName()));
-            }
+            handler.propertyChanged(before, after);
             return true;
         }
 
         @Override
         public boolean propertyDeleted(PropertyState before) {
-            if (filter.includeDelete(before)) {
-                events.add(new EventImpl(
-                        context, PROPERTY_REMOVED, beforeTree, 
before.getName()));
-            }
+            handler.propertyDeleted(before);
             return true;
         }
 
@@ -226,10 +211,9 @@ public class EventGenerator implements E
 
         private boolean addChildEventGenerator(
                 String name, NodeState before, NodeState after) {
-            EventFilter childFilter = filter.create(name, before, after);
-            if (childFilter != null) {
-                generators.add(new EventDiff(
-                        this, childFilter, name, before, after));
+            ChangeHandler h = handler.getChildHandler(name, before, after);
+            if (h != null) {
+                generators.add(new EventDiff(this, h, name, before, after));
                 return true;
             } else {
                 return false;
@@ -240,26 +224,14 @@ public class EventGenerator implements E
             PropertyState sourceProperty = after.getProperty(SOURCE_PATH);
             if (sourceProperty != null) {
                 String sourcePath = sourceProperty.getValue(STRING);
-                if (filter.includeMove(sourcePath, name, after)) {
-                    ImmutableTree tree = new ImmutableTree(afterTree, name, 
after);
-                    Map<String, String> info = ImmutableMap.of(
-                            "srcAbsPath", context.getJcrPath(sourcePath),
-                            "destAbsPath", context.getJcrPath(tree.getPath()));
-                    events.add(new EventImpl(context, NODE_MOVED, tree, info));
-                }
+                handler.nodeMoved(sourcePath, name, after);
             }
 
-            if (filter.includeAdd(name, after)) {
-                ImmutableTree tree = new ImmutableTree(afterTree, name, after);
-                events.add(new EventImpl(context, NODE_ADDED, tree));
-            }
+            handler.nodeAdded(name, after);
         }
 
         protected void handleDeletedNode(String name, NodeState before) {
-            if (filter.includeDelete(name, before)) {
-                ImmutableTree tree = new ImmutableTree(beforeTree, name, 
before);
-                events.add(new EventImpl(context, NODE_REMOVED, tree));
-            }
+            handler.nodeDeleted(name, before);
         }
 
         private void handleReorderedNodes(
@@ -280,13 +252,7 @@ public class EventGenerator implements E
                         beforeNames.set(a, beforeName);
                         String destName = beforeNames.get(a + 1);
                         NodeState afterChild = 
this.after.getChildNode(afterName);
-                        if (filter.includeReorder(destName, afterName, 
afterChild)) {
-                            Map<String, String> info = ImmutableMap.of(
-                                    "srcChildRelPath", 
context.getJcrName(afterName),
-                                    "destChildRelPath", 
context.getJcrName(destName));
-                            ImmutableTree tree = new ImmutableTree(afterTree, 
afterName, afterChild);
-                            events.add(new EventImpl(context, NODE_MOVED, 
tree, info));
-                        }
+                        handler.nodeReordered(destName, afterName, afterChild);
                     }
                 }
             }
@@ -294,6 +260,75 @@ public class EventGenerator implements E
 
     }
 
+    private class Handler implements ChangeHandler {
+
+        private final ImmutableTree before;
+        private final ImmutableTree after;
+
+        Handler(ImmutableTree before, ImmutableTree after) {
+            this.before = before;
+            this.after = after;
+        }
+
+        @Override
+        public ChangeHandler getChildHandler(
+                String name, NodeState before, NodeState after) {
+            return new Handler(
+                    new ImmutableTree(this.before, name, before),
+                    new ImmutableTree(this.after, name, after));
+        }
+
+        @Override
+        public void propertyAdded(PropertyState after) {
+            events.add(new EventImpl(
+                    context, PROPERTY_ADDED, this.after, after.getName()));
+        }
+
+        @Override
+        public void propertyChanged(PropertyState before, PropertyState after) 
{
+            events.add(new EventImpl(
+                    context, PROPERTY_CHANGED, this.after, after.getName()));
+        }
+
+        @Override
+        public void propertyDeleted(PropertyState before) {
+            events.add(new EventImpl(
+                    context, PROPERTY_REMOVED, this.before, before.getName()));
+        }
+
+        @Override
+        public void nodeAdded(String name, NodeState after) {
+            ImmutableTree tree = new ImmutableTree(this.after, name, after);
+            events.add(new EventImpl(context, NODE_ADDED, tree));
+        }
+
+        @Override
+        public void nodeDeleted(String name, NodeState before) {
+            ImmutableTree tree = new ImmutableTree(this.before, name, before);
+            events.add(new EventImpl(context, NODE_REMOVED, tree));
+        }
+
+        @Override
+        public void nodeMoved(String sourcePath, String name, NodeState moved) 
{
+            ImmutableTree tree = new ImmutableTree(this.after, name, moved);
+            Map<String, String> info = ImmutableMap.of(
+                    "srcAbsPath", context.getJcrPath(sourcePath),
+                    "destAbsPath", context.getJcrPath(tree.getPath()));
+            events.add(new EventImpl(context, NODE_MOVED, tree, info));
+        }
+
+        @Override
+        public void nodeReordered(
+                String destName, String name, NodeState reordered) {
+            Map<String, String> info = ImmutableMap.of(
+                    "srcChildRelPath", context.getJcrName(name),
+                    "destChildRelPath", context.getJcrName(destName));
+            ImmutableTree tree = new ImmutableTree(after, name, reordered);
+            events.add(new EventImpl(context, NODE_MOVED, tree, info));
+        }
+
+    }
+
     //-----------------------------------------------------< EventIterator >--
 
     @Override


Reply via email to