Hi All,
I was trying to register a simple ResourceChangeListener  and it failed with 
the attached stack trace. A small snippet from it :

[org.apache.sling.api.resource.observation.ResourceChangeListener, 
org.apache.sling.event.jobs.consumer.JobConsumer]] ServiceEvent REGISTERED
05.03.2020 23:39:00.728 *ERROR* [FelixDispatchQueue] 
org.apache.sling.resourceresolver FrameworkEvent ERROR 
(java.lang.NullPointerException)
java.lang.NullPointerException: null
    at 
org.apache.jackrabbit.oak.commons.PathUtils.unifyInExcludes(PathUtils.java:501) 
[org.apache.jackrabbit.oak-commons:1.8.17]
    at 
org.apache.jackrabbit.oak.jcr.observation.ObservationManagerImpl.addEventListener(ObservationManagerImpl.java:240)
 [org.apache.jackrabbit.oak-jcr:1.8.17]
    at 
org.apache.sling.jcr.resource.internal.JcrListenerBaseConfig.register(JcrListenerBaseConfig.java:136)
 [org.apache.sling.jcr.resource:3.0.16.1]

On a deeper analysis, I found that it was due to getOakPath() [0] returning a 
null for one of the paths. The path that returned null was 
/libs/[/globalnav-page, /localnav-page]/xyzTargetIds.json.POST.servlet.  This 
is a servlet in our codebase which is registered in following manner :

SLING_SERVLET_RESOURCE_TYPES + "=[" + RT_GLOBALNAV_PAGE + "," +RT_LOCALNAV_PAGE 
+ "]",

which caused the same path to be constructed and an oak path was expected to be 
present for it. Since it wasn’t present, a null was stored in the excludes Set 
which ultimately caused the NPE and listener failed to register.
When I changed the initialization of this servlet to follow the practices,
    property = {
        SLING_SERVLET_RESOURCE_TYPES + "=" + RT_GLOBALNAV_PAGE,
            SLING_SERVLET_RESOURCE_TYPES + "=" + RT_LOCALNAV_PAGE,
issue is fixed.
I am working on raising a PR [OAK-8948] in oak-jcr to *warn* for paths which 
return a null for getOakPath() for awareness and also a check for null in 
PathUtils.java just in case.
Meanwhile, I think we should also have a check in Sling on the way context’s 
exclude paths are constructed? Or maybe block it even earlier by not allowing 
to go on and register in case of a bad path.
Let me know your thoughts on this.

Thanks,
Rafiya Sirin

[0] - 
https://github.com/apache/jackrabbit-oak/blob/trunk/oak-jcr/src/main/java/org/apache/jackrabbit/oak/jcr/observation/ObservationManagerImpl.java#L394

05.03.2020 23:39:00.609 *INFO* [FelixStartLevel] 
com.adobe.dexter.dexterUI-bundle Service 
[com.adobe.dexter.ui.iconmanager.impl.IconManagerResourceChangeListener,7443, 
[org.apache.sling.api.resource.observation.ResourceChangeListener, 
org.apache.sling.event.jobs.consumer.JobConsumer]] ServiceEvent REGISTERED
05.03.2020 23:39:00.728 *ERROR* [FelixDispatchQueue] 
org.apache.sling.resourceresolver FrameworkEvent ERROR 
(java.lang.NullPointerException)
java.lang.NullPointerException: null
    at 
org.apache.jackrabbit.oak.commons.PathUtils.unifyInExcludes(PathUtils.java:501) 
[org.apache.jackrabbit.oak-commons:1.8.17]
    at 
org.apache.jackrabbit.oak.jcr.observation.ObservationManagerImpl.addEventListener(ObservationManagerImpl.java:240)
 [org.apache.jackrabbit.oak-jcr:1.8.17]
    at 
org.apache.sling.jcr.resource.internal.JcrListenerBaseConfig.register(JcrListenerBaseConfig.java:136)
 [org.apache.sling.jcr.resource:3.0.16.1]
    at 
org.apache.sling.jcr.resource.internal.JcrResourceListener.<init>(JcrResourceListener.java:61)
 [org.apache.sling.jcr.resource:3.0.16.1]
    at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.updateListeners(JcrResourceProvider.java:274)
 [org.apache.sling.jcr.resource:3.0.16.1]
    at 
org.apache.sling.jcr.resource.internal.helper.jcr.JcrResourceProvider.update(JcrResourceProvider.java:193)
 [org.apache.sling.jcr.resource:3.0.16.1]
    at 
org.apache.sling.resourceresolver.impl.providers.ResourceProviderHandler.update(ResourceProviderHandler.java:159)
 [org.apache.sling.resourceresolver:1.6.8]
    at 
org.apache.sling.resourceresolver.impl.providers.ResourceProviderTracker.setObservationReporterGenerator(ResourceProviderTracker.java:159)
 [org.apache.sling.resourceresolver:1.6.8]
    at 
org.apache.sling.resourceresolver.impl.observation.ResourceChangeListenerWhiteboard.updateProviderTracker(ResourceChangeListenerWhiteboard.java:109)
 [org.apache.sling.resourceresolver:1.6.8]
    at 
org.apache.sling.resourceresolver.impl.observation.ResourceChangeListenerWhiteboard.access$100(ResourceChangeListenerWhiteboard.java:44)
 [org.apache.sling.resourceresolver:1.6.8]
    at 
org.apache.sling.resourceresolver.impl.observation.ResourceChangeListenerWhiteboard$1.addingService(ResourceChangeListenerWhiteboard.java:88)
 [org.apache.sling.resourceresolver:1.6.8]
    at 
org.apache.sling.resourceresolver.impl.observation.ResourceChangeListenerWhiteboard$1.addingService(ResourceChangeListenerWhiteboard.java:64)
 [org.apache.sling.resourceresolver:1.6.8]
    at 
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
 [org.apache.felix.eventadmin:1.4.10]
    at 
org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:870)
 [org.apache.felix.eventadmin:1.4.10]
    at 
org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) 
[org.apache.felix.eventadmin:1.4.10]
    at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:229) 
[org.apache.felix.eventadmin:1.4.10]
    at 
org.osgi.util.tracker.ServiceTracker$Tracked.serviceChanged(ServiceTracker.java:901)
 [org.apache.felix.eventadmin:1.4.10]
    at 
org.apache.felix.framework.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:990)
    at 
org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:838)
    at 
org.apache.felix.framework.EventDispatcher.fireServiceEvent(EventDispatcher.java:545)
    at org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4595)
    at org.apache.felix.framework.Felix.registerService(Felix.java:3587)
    at 
org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:348)
    at 
org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:891)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.manager.AbstractComponentManager$3.register(AbstractComponentManager.java:877)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.manager.RegistrationManager.changeRegistration(RegistrationManager.java:128)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.registerService(AbstractComponentManager.java:944)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.activateInternal(AbstractComponentManager.java:727)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.enableInternal(AbstractComponentManager.java:661)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.manager.AbstractComponentManager.enable(AbstractComponentManager.java:427)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.manager.ConfigurableComponentHolder.enableComponents(ConfigurableComponentHolder.java:665)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.BundleComponentActivator.initialEnable(BundleComponentActivator.java:339)
 [org.apache.felix.scr:2.1.0.B008]
    at org.apache.felix.scr.impl.Activator.loadComponents(Activator.java:381) 
[org.apache.felix.scr:2.1.0.B008]
    at org.apache.felix.scr.impl.Activator.access$200(Activator.java:49) 
[org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.Activator$ScrExtension.start(Activator.java:263) 
[org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.AbstractExtender.createExtension(AbstractExtender.java:196)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:169)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.apache.felix.scr.impl.AbstractExtender.modifiedBundle(AbstractExtender.java:49)
 [org.apache.felix.scr:2.1.0.B008]
    at 
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:482)
 [org.apache.felix.eventadmin:1.4.10]
    at 
org.osgi.util.tracker.BundleTracker$Tracked.customizerModified(BundleTracker.java:415)
 [org.apache.felix.eventadmin:1.4.10]
    at org.osgi.util.tracker.AbstractTracked.track(AbstractTracked.java:232) 
[org.apache.felix.eventadmin:1.4.10]
    at 
org.osgi.util.tracker.BundleTracker$Tracked.bundleChanged(BundleTracker.java:444)
 [org.apache.felix.eventadmin:1.4.10]
    at 
org.apache.felix.framework.EventDispatcher.invokeBundleListenerCallback(EventDispatcher.java:915)
    at 
org.apache.felix.framework.EventDispatcher.fireEventImmediately(EventDispatcher.java:834)
    at 
org.apache.felix.framework.EventDispatcher.fireBundleEvent(EventDispatcher.java:516)
    at org.apache.felix.framework.Felix.fireBundleEvent(Felix.java:4579)
    at org.apache.felix.framework.Felix.startBundle(Felix.java:2174)
    at org.apache.felix.framework.Felix.setActiveStartLevel(Felix.java:1373)
    at 
org.apache.felix.framework.FrameworkStartLevelImpl.run(FrameworkStartLevelImpl.java:308)
    at java.lang.Thread.run(Thread.java:748)

Reply via email to