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 mr...@apache.org on 2020/03/13 15:06:38 UTC
svn commit: r1875158 - in /jackrabbit/oak/trunk/oak-jcr/src:
main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java
Author: mreutegg
Date: Fri Mar 13 15:06:37 2020
New Revision: 1875158
URL: http://svn.apache.org/viewvc?rev=1875158&view=rev
Log:
OAK-8948: ObservationManager.addEventListener() throws NPE with invalid paths in filter
Apply patch with fix and tests
Issue reported and test contributed by Rafiya Sirin
Modified:
jackrabbit/oak/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java
jackrabbit/oak/trunk/oak-jcr/src/test/java/org/apache/jackrabbit/oak/jcr/observation/ObservationTest.java
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=1875158&r1=1875157&r2=1875158&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 Fri Mar 13 15:06:37 2020
@@ -234,12 +234,12 @@ public class ObservationManagerImpl impl
boolean noLocal = filter.getNoLocal();
boolean noExternal = filter.getNoExternal() || listener instanceof ExcludeExternal;
boolean noInternal = filter.getNoInternal();
- Set<String> includePaths = getOakPaths(namePathMapper, filter.getAdditionalPaths());
+ Set<String> includePaths = getOakPaths(namePathMapper, filter.getAdditionalPaths(), "include");
String absPath = filter.getAbsPath();
if (absPath != null) {
includePaths.add(namePathMapper.getOakPath(absPath));
}
- Set<String> excludedPaths = getOakPaths(namePathMapper, filter.getExcludedPaths());
+ Set<String> excludedPaths = getOakPaths(namePathMapper, filter.getExcludedPaths(), "exclude");
PathUtils.unifyInExcludes(includePaths, excludedPaths);
if (oakEventFilter != null) {
String[] includeGlobPaths = oakEventFilter.getIncludeGlobPaths();
@@ -388,10 +388,16 @@ public class ObservationManagerImpl impl
return conditions;
}
- private static Set<String> getOakPaths(NamePathMapper mapper, String[] paths) {
+ private static Set<String> getOakPaths(NamePathMapper mapper, String[] paths, String type)
+ throws RepositoryException {
Set<String> oakPaths = newHashSet();
for (String path : paths) {
- oakPaths.add(mapper.getOakPath(path));
+ String oakPath = mapper.getOakPath(path);
+ if (oakPath != null) {
+ oakPaths.add(oakPath);
+ } else {
+ throw new RepositoryException("Invalid " + type + " path: " + path);
+ }
}
return oakPaths;
}
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=1875158&r1=1875157&r2=1875158&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 Fri Mar 13 15:06:37 2020
@@ -34,11 +34,14 @@ import static org.apache.jackrabbit.JcrC
import static org.apache.jackrabbit.JcrConstants.JCR_PRIMARYTYPE;
import static org.apache.jackrabbit.JcrConstants.NT_UNSTRUCTURED;
import static org.apache.jackrabbit.oak.api.Type.STRING;
+import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import java.util.Arrays;
@@ -870,6 +873,52 @@ public class ObservationTest extends Abs
}
@Test
+ public void excludePathInvalid() {
+ assumeTrue(observationManager instanceof JackrabbitObservationManager);
+ ObservationManagerImpl oManager = (ObservationManagerImpl) observationManager;
+ ExpectationListener listener = new ExpectationListener();
+ String invalidPath = TEST_PATH + "/[n]";
+ JackrabbitEventFilter filter = new JackrabbitEventFilter()
+ .setAbsPath(TEST_PATH)
+ .setIsDeep(true)
+ .setExcludedPaths(TEST_PATH + "/c", invalidPath)
+ .setEventTypes(ALL_EVENTS);
+ try {
+ oManager.addEventListener(listener, filter);
+ fail("addEventListener() must fail with RepositoryException");
+ } catch (RepositoryException e) {
+ // expected
+ assertThat(e.getMessage(), containsString("exclude"));
+ assertThat(e.getMessage(), containsString(invalidPath));
+ } catch (Exception e) {
+ fail("Unexpected exception: " + e);
+ }
+ }
+
+ @Test
+ public void includePathInvalid() {
+ assumeTrue(observationManager instanceof JackrabbitObservationManager);
+ ObservationManagerImpl oManager = (ObservationManagerImpl) observationManager;
+ ExpectationListener listener = new ExpectationListener();
+ String invalidPath = TEST_PATH + "/[n]";
+ JackrabbitEventFilter filter = new JackrabbitEventFilter()
+ .setAbsPath(TEST_PATH)
+ .setAdditionalPaths(invalidPath)
+ .setIsDeep(true)
+ .setEventTypes(ALL_EVENTS);
+ try {
+ oManager.addEventListener(listener, filter);
+ fail("addEventListener() must fail with RepositoryException");
+ } catch (RepositoryException e) {
+ // expected
+ assertThat(e.getMessage(), containsString("include"));
+ assertThat(e.getMessage(), containsString(invalidPath));
+ } catch (Exception e) {
+ fail("Unexpected exception: " + e);
+ }
+ }
+
+ @Test
public void parentPathExclude() throws ExecutionException, InterruptedException, RepositoryException {
assumeTrue(observationManager instanceof JackrabbitObservationManager);