This is an automated email from the ASF dual-hosted git repository.

sagarmiglani pushed a commit to branch 1.x
in repository 
https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git


The following commit(s) were added to refs/heads/1.x by this push:
     new 4c9096fb SLING-12741 - NPE resource resolver during resource provider 
unregisteration (#169)
4c9096fb is described below

commit 4c9096fb99422900ae1d8687ce2b05475dca5fbb
Author: Sagar Miglani <[email protected]>
AuthorDate: Tue Apr 8 13:26:34 2025 +0530

    SLING-12741 - NPE resource resolver during resource provider 
unregisteration (#169)
    
    * SLING-12741 - NPE resource resolver during resource provider 
unregisteration
    
    * SLING-12741 - NPE resource resolver during resource provider 
unregisteration
---
 .../impl/providers/ResourceProviderTracker.java    |  2 +-
 .../providers/ResourceProviderTrackerTest.java     | 44 ++++++++++++++++++++++
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git 
a/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
 
b/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
index 736f438e..75ec1168 100644
--- 
a/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
+++ 
b/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
@@ -304,7 +304,7 @@ public class ResourceProviderTracker implements 
ResourceProviderStorageProvider
 
         // update change listener (only once)
         final ChangeListener cl = this.listener;
-        if (cl != null) {
+        if (cl != null && deactivateHandler != null) {
             cl.providerRemoved(info.getAuthType() != AuthType.no, 
deactivateHandler.isUsed());
         }
 
diff --git 
a/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java
 
b/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java
index e38cee1d..e2566c82 100644
--- 
a/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java
+++ 
b/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java
@@ -42,6 +42,7 @@ import org.osgi.service.event.EventAdmin;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 import static org.mockito.Mockito.mock;
 
 public class ResourceProviderTrackerTest {
@@ -250,6 +251,49 @@ public class ResourceProviderTrackerTest {
         assertEquals(1, dto.failedProviders.length);
     }
 
+    @Test
+    public void testRemoveSamePathResourceProvider() throws Exception {
+        try {
+            final ResourceProviderTracker tracker = new 
ResourceProviderTracker();
+            tracker.setObservationReporterGenerator(
+                    new SimpleObservationReporterGenerator(new 
NoDothingObservationReporter()));
+
+            final AtomicBoolean removedCalled = new AtomicBoolean(false);
+            final ChangeListener listener = new ChangeListener() {
+
+                @Override
+                public void providerAdded() {}
+
+                @Override
+                public void providerRemoved(boolean stateful, boolean used) {
+                    removedCalled.set(true);
+                }
+            };
+            tracker.activate(context.bundleContext(), eventAdmin, listener);
+
+            @SuppressWarnings("unchecked")
+            ResourceProvider<Object> rp1 = mock(ResourceProvider.class);
+            final ResourceProviderInfo info1 = 
fixture.registerResourceProvider(rp1, "/temp/path", AuthType.no, 101);
+
+            @SuppressWarnings("unchecked")
+            ResourceProvider<Object> rp2 = mock(ResourceProvider.class);
+            final ResourceProviderInfo info2 = 
fixture.registerResourceProvider(rp2, "/temp/path", AuthType.no, 100);
+
+            // check removed is not called yet
+            assertFalse(removedCalled.get());
+            // unregister the provider with lower service rank
+            fixture.unregisterResourceProvider(info2);
+
+            // removed should not be called after unregistering the provider 
with lower service rank
+            assertFalse(removedCalled.get());
+
+            fixture.unregisterResourceProvider(info1);
+            assertTrue(removedCalled.get());
+        } catch (NullPointerException e) {
+            fail("NullPointerException should not be thrown: " + 
e.getMessage());
+        }
+    }
+
     static final class NoDothingObservationReporter implements 
ObservationReporter {
         @Override
         public void reportChanges(Iterable<ResourceChange> changes, boolean 
distribute) {}

Reply via email to