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/06/05 12:03:32 UTC

svn commit: r1489788 - in /jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak: plugins/observation/ChangeProcessor.java spi/state/VisibleDiff.java

Author: mduerig
Date: Wed Jun  5 10:03:32 2013
New Revision: 1489788

URL: http://svn.apache.org/r1489788
Log:
OAK-775 Implement backward compatible observation
Factor visibility checks into separate NodeStateDiff wrapper class

Added:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/VisibleDiff.java   (with props)
Modified:
    jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/ChangeProcessor.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=1489788&r1=1489787&r2=1489788&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 Wed Jun  5 10:03:32 2013
@@ -42,6 +42,7 @@ import org.apache.jackrabbit.oak.spi.sta
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.apache.jackrabbit.oak.spi.state.NodeStateDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeStateUtils;
+import org.apache.jackrabbit.oak.spi.state.VisibleDiff;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.Marker;
@@ -133,7 +134,7 @@ class ChangeProcessor implements Runnabl
             if (changes != null &&
                     !(filterRef.get().excludeLocal() && changes.isLocal(observationManager.getContentSession()))) {
                 EventGeneratingNodeStateDiff diff = new EventGeneratingNodeStateDiff(changes);
-                changes.diff(diff);
+                changes.diff(VisibleDiff.wrap(diff));
                 if (!stopping) {
                     diff.sendEvents();
                 }
@@ -231,8 +232,7 @@ class ChangeProcessor implements Runnabl
 
         @Override
         public boolean propertyAdded(PropertyState after) {
-            if (!NodeStateUtils.isHidden(after.getName())
-                    && filterRef.get().include(Event.PROPERTY_ADDED, jcrPath(), associatedParentNode)) {
+            if (filterRef.get().include(Event.PROPERTY_ADDED, jcrPath(), associatedParentNode)) {
                 Event event = generatePropertyEvent(Event.PROPERTY_ADDED, path, after);
                 events.add(Iterators.singletonIterator(event));
             }
@@ -241,8 +241,7 @@ class ChangeProcessor implements Runnabl
 
         @Override
         public boolean propertyChanged(PropertyState before, PropertyState after) {
-            if (!NodeStateUtils.isHidden(before.getName())
-                    && filterRef.get().include(Event.PROPERTY_CHANGED, jcrPath(), associatedParentNode)) {
+            if (filterRef.get().include(Event.PROPERTY_CHANGED, jcrPath(), associatedParentNode)) {
                 Event event = generatePropertyEvent(Event.PROPERTY_CHANGED, path, after);
                 events.add(Iterators.singletonIterator(event));
             }
@@ -251,8 +250,7 @@ class ChangeProcessor implements Runnabl
 
         @Override
         public boolean propertyDeleted(PropertyState before) {
-            if (!NodeStateUtils.isHidden(before.getName())
-                    && filterRef.get().include(Event.PROPERTY_REMOVED, jcrPath(), associatedParentNode)) {
+            if (filterRef.get().include(Event.PROPERTY_REMOVED, jcrPath(), associatedParentNode)) {
                 Event event = generatePropertyEvent(Event.PROPERTY_REMOVED, path, before);
                 events.add(Iterators.singletonIterator(event));
             }
@@ -261,8 +259,7 @@ class ChangeProcessor implements Runnabl
 
         @Override
         public boolean childNodeAdded(String name, NodeState after) {
-            if (!NodeStateUtils.isHidden(name)
-                    && filterRef.get().includeChildren(jcrPath())) {
+            if (filterRef.get().includeChildren(jcrPath())) {
                 Iterator<Event> events = generateNodeEvents(Event.NODE_ADDED, path, name, after);
                 this.events.add(events);
                 if (++childNodeCount > PURGE_LIMIT) {
@@ -274,8 +271,7 @@ class ChangeProcessor implements Runnabl
 
         @Override
         public boolean childNodeDeleted(String name, NodeState before) {
-            if (!NodeStateUtils.isHidden(name)
-                    && filterRef.get().includeChildren(jcrPath())) {
+            if (filterRef.get().includeChildren(jcrPath())) {
                 Iterator<Event> events = generateNodeEvents(Event.NODE_REMOVED, path, name, before);
                 this.events.add(events);
             }
@@ -284,11 +280,10 @@ class ChangeProcessor implements Runnabl
 
         @Override
         public boolean childNodeChanged(String name, NodeState before, NodeState after) {
-            if (!NodeStateUtils.isHidden(name)
-                    && filterRef.get().includeChildren(jcrPath())) {
+            if (filterRef.get().includeChildren(jcrPath())) {
                 EventGeneratingNodeStateDiff diff = new EventGeneratingNodeStateDiff(
                         changes, PathUtils.concat(path, name), events, after);
-                if (!after.compareAgainstBaseState(before, diff)) {
+                if (!after.compareAgainstBaseState(before, VisibleDiff.wrap(diff))) {
                     return false;
                 }
                 if (events.size() > PURGE_LIMIT) {

Added: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/VisibleDiff.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/VisibleDiff.java?rev=1489788&view=auto
==============================================================================
--- jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/VisibleDiff.java (added)
+++ jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/VisibleDiff.java Wed Jun  5 10:03:32 2013
@@ -0,0 +1,100 @@
+/*
+ * 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.spi.state;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.jackrabbit.oak.spi.state.NodeStateUtils.isHidden;
+
+import javax.annotation.Nonnull;
+
+import org.apache.jackrabbit.oak.api.PropertyState;
+
+/**
+ * {@code NodeStateDiff} wrapper that passes only changes to non-hidden nodes and properties
+ * (i.e. ones whose names don't start with a colon) to the given delegate diff.
+ *
+ * @since Oak 0.9
+ */
+public class VisibleDiff implements NodeStateDiff {
+    private final NodeStateDiff diff;
+
+    @Nonnull
+    public static NodeStateDiff wrap(@Nonnull NodeStateDiff diff) {
+        return new VisibleDiff(checkNotNull(diff));
+    }
+
+    public VisibleDiff(NodeStateDiff diff) {
+        this.diff = checkNotNull(diff);
+    }
+
+    @Override
+    public boolean propertyAdded(PropertyState after) {
+        if (!isHidden(after.getName())) {
+            return diff.propertyAdded(after);
+        } else {
+            return true;
+        }
+    }
+
+    @Override
+    public boolean propertyChanged(PropertyState before, PropertyState after) {
+        if (!isHidden(after.getName())) {
+            return diff.propertyChanged(before, after);
+        } else {
+            return true;
+        }
+    }
+
+    @Override
+    public boolean propertyDeleted(PropertyState before) {
+        if (!isHidden(before.getName())) {
+            return diff.propertyDeleted(before);
+        } else {
+            return true;
+        }
+    }
+
+    @Override
+    public boolean childNodeAdded(String name, NodeState after) {
+        if (!isHidden(name)) {
+            return diff.childNodeAdded(name, after);
+        } else {
+            return true;
+        }
+    }
+
+    @Override
+    public boolean childNodeChanged(String name, NodeState before, NodeState after) {
+        if (!isHidden(name)) {
+            return diff.childNodeChanged(name, before, after);
+        } else {
+            return true;
+        }
+    }
+
+    @Override
+    public boolean childNodeDeleted(String name, NodeState before) {
+        if (!isHidden(name)) {
+            return diff.childNodeDeleted(name, before);
+        } else {
+            return true;
+        }
+    }
+}

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/VisibleDiff.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/state/VisibleDiff.java
------------------------------------------------------------------------------
    svn:keywords = Author Date Id Revision Rev URL