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)