Author: mduerig
Date: Wed Mar 12 22:07:38 2014
New Revision: 1576949

URL: http://svn.apache.org/r1576949
Log:
OAK-1514: Support for Sling JcrResourceListener
Correct Jcr to Oak name conversion

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

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/NodeObserver.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/NodeObserver.java?rev=1576949&r1=1576948&r2=1576949&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/NodeObserver.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/observation/NodeObserver.java
 Wed Mar 12 22:07:38 2014
@@ -26,6 +26,7 @@ import java.util.Set;
 
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;
+import javax.jcr.RepositoryException;
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
@@ -40,12 +41,16 @@ import org.apache.jackrabbit.oak.plugins
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.Observer;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Base class for {@code Observer} instances that group changes
  * by node instead of tracking them down to individual properties.
  */
 public abstract class NodeObserver implements Observer {
+    private static final Logger LOG = 
LoggerFactory.getLogger(NodeObserver.class);
+
     private final String path;
     private final Set<String> propertyNames = Sets.newHashSet();
 
@@ -114,28 +119,37 @@ public abstract class NodeObserver imple
 
     @Override
     public void contentChanged(@Nonnull NodeState root, @Nullable CommitInfo 
info) {
-        if (previousRoot != null) {
-            NamePathMapper namePathMapper = new NamePathMapperImpl(
-                    new GlobalNameMapper(new ImmutableRoot(root)));
-
-            NodeState before = previousRoot;
-            NodeState after = root;
-            EventHandler handler = new FilteredHandler(
-                    new VisibleFilter(),
-                    new NodeEventHandler("/", info, namePathMapper));
-            for (String name : PathUtils.elements(path)) {
-                before = before.getChildNode(name);
-                after = after.getChildNode(name);
-                handler = handler.getChildHandler(name, before, after);
-            }
+        try {
+            if (previousRoot != null) {
+                NamePathMapper namePathMapper = new NamePathMapperImpl(
+                        new GlobalNameMapper(new ImmutableRoot(root)));
+
+                Set<String> oakPropertyNames = Sets.newHashSet();
+                for (String name : propertyNames) {
+                    oakPropertyNames.add(namePathMapper.getJcrName(name));
+                }
+                NodeState before = previousRoot;
+                NodeState after = root;
+                EventHandler handler = new FilteredHandler(
+                        new VisibleFilter(),
+                        new NodeEventHandler("/", info, namePathMapper, 
oakPropertyNames));
+                for (String name : PathUtils.elements(path)) {
+                    String oakName = namePathMapper.getOakName(name);
+                    before = before.getChildNode(oakName);
+                    after = after.getChildNode(oakName);
+                    handler = handler.getChildHandler(oakName, before, after);
+                }
 
-            EventGenerator generator = new EventGenerator(before, after, 
handler);
-            while (!generator.isDone()) {
-                generator.generate();
+                EventGenerator generator = new EventGenerator(before, after, 
handler);
+                while (!generator.isDone()) {
+                    generator.generate();
+                }
             }
-        }
 
-        previousRoot = root;
+            previousRoot = root;
+        } catch (RepositoryException e) {
+            LOG.warn("Error while handling content change", e);
+        }
     }
 
     private enum EventType {ADDED, DELETED, CHANGED}
@@ -144,15 +158,18 @@ public abstract class NodeObserver imple
         private final String path;
         private final CommitInfo commitInfo;
         private final NamePathMapper namePathMapper;
+        private final Set<String> propertyNames;
         private final EventType eventType;
         private final Set<String> added = Sets.newHashSet();
         private final Set<String> deleted = Sets.newHashSet();
         private final Set<String> changed = Sets.newHashSet();
 
-        public NodeEventHandler(String path, CommitInfo commitInfo, 
NamePathMapper namePathMapper) {
+        public NodeEventHandler(String path, CommitInfo commitInfo, 
NamePathMapper namePathMapper,
+                Set<String> propertyNames) {
             this.path = path;
             this.commitInfo = commitInfo == null ? CommitInfo.EMPTY : 
commitInfo;
             this.namePathMapper = namePathMapper;
+            this.propertyNames = propertyNames;
             this.eventType = EventType.CHANGED;
         }
 
@@ -160,6 +177,7 @@ public abstract class NodeObserver imple
             this.path = "/".equals(parent.path) ? '/' + name : parent.path + 
'/' + name;
             this.commitInfo = parent.commitInfo;
             this.namePathMapper = parent.namePathMapper;
+            this.propertyNames = parent.propertyNames;
             this.eventType = eventType;
         }
 


Reply via email to