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)