Modified: 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java?rev=1768558&r1=1768557&r2=1768558&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
 Mon Nov  7 17:08:24 2016
@@ -62,6 +62,7 @@ import org.apache.jackrabbit.oak.plugins
 import 
org.apache.jackrabbit.oak.plugins.observation.filter.UniversalFilter.Selector;
 import org.apache.jackrabbit.oak.plugins.observation.filter.FilterProvider;
 import 
org.apache.jackrabbit.oak.plugins.observation.filter.PermissionProviderFactory;
+import 
org.apache.jackrabbit.oak.plugins.observation.filter.ChangeSetFilterImpl;
 import org.apache.jackrabbit.oak.plugins.observation.filter.Selectors;
 import org.apache.jackrabbit.oak.spi.commit.Observable;
 import 
org.apache.jackrabbit.oak.spi.security.authorization.AuthorizationConfiguration;
@@ -278,6 +279,7 @@ public class ObservationManagerImpl impl
 
         List<Condition> excludeConditions = createExclusions(filterBuilder, 
excludedPaths);
 
+        final String[] validatedNodeTypeNames = 
validateNodeTypeNames(nodeTypeName);
         Selector nodeTypeSelector = Selectors.PARENT;
         boolean deleteSubtree = true;
         if (oakEventFilter != null) {
@@ -304,7 +306,7 @@ public class ObservationManagerImpl impl
                     filterBuilder.moveSubtree(),
                     filterBuilder.eventType(eventTypes),
                     filterBuilder.uuid(Selectors.PARENT, uuids),
-                    filterBuilder.nodeType(nodeTypeSelector, 
validateNodeTypeNames(nodeTypeName)),
+                    filterBuilder.nodeType(nodeTypeSelector, 
validatedNodeTypeNames),
                     filterBuilder.accessControl(permissionProviderFactory));
         if (oakEventFilter != null) {
             condition = oakEventFilter.wrapMainCondition(condition, 
filterBuilder, permissionProviderFactory);
@@ -319,6 +321,16 @@ public class ObservationManagerImpl impl
         ListenerTracker tracker = new WarningListenerTracker(
                 !noExternal, listener, eventTypes, absPath, isDeep, uuids, 
nodeTypeName, noLocal);
 
+        if (oakEventFilter != null) {
+            oakEventFilter.adjustPrefilterIncludePaths(includePaths);
+        }
+        
+        // OAK-4908 : prefiltering support. here we have explicit yes/no/maybe 
filtering
+        // for things like propertyNames/nodeTypes/nodeNames/paths which 
cannot be 
+        // applied on the full-fledged filterBuilder above but requires an 
explicit 'prefilter' for that.
+        filterBuilder.setChangeSetFilter(new ChangeSetFilterImpl(includePaths, 
isDeep, excludedPaths, null,
+                validatedNodeTypeNames == null ? null : 
newHashSet(validatedNodeTypeNames), null));
+        
         addEventListener(listener, tracker, filterBuilder.build());
     }
 

Modified: 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java?rev=1768558&r1=1768557&r2=1768558&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java
 Mon Nov  7 17:08:24 2016
@@ -436,7 +436,25 @@ public class ObservationTest extends Abs
             observationManager.removeEventListener(listener);
         }
     }
+    
+    @Test
+    public void propertyFilter() throws Exception {
+        Node root = getNode("/");
+        ExpectationListener listener = new ExpectationListener();
+        observationManager.addEventListener(listener, PROPERTY_ADDED, "/a/b", 
false, null, null, false);
+        Node a = root.addNode("a");
+        Node b = a.addNode("b");
+        listener.expect("/a/b/jcr:primaryType", PROPERTY_ADDED);
 
+        listener.expectAdd(b.setProperty("propName", 1));
+       root.getSession().save();
+
+       List<Expectation> missing = listener.getMissing(TIME_OUT, 
TimeUnit.SECONDS);
+        assertTrue("Missing events: " + missing, missing.isEmpty());
+        List<Event> unexpected = listener.getUnexpected();
+        assertTrue("Unexpected events: " + unexpected, unexpected.isEmpty());
+    }
+    
     @Test
     public void pathFilter() throws Exception {
         final String path = "/events/only/here";
@@ -1515,7 +1533,7 @@ public class ObservationTest extends Abs
 
         filter = new JackrabbitEventFilter();
         filter.setEventTypes(ALL_EVENTS);
-        filter = FilterFactory.wrap(filter).withIncludeGlobPaths(TEST_PATH + 
"/a3/**/y/*");
+        filter = FilterFactory.wrap(filter).withIncludeGlobPaths(TEST_PATH + 
"/a3/**/y");
         oManager.addEventListener(listener, filter);
         cp = oManager.getChangeProcessor(listener);
         assertNotNull(cp);


Reply via email to