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) {}