You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cz...@apache.org on 2024/07/12 09:10:40 UTC

(sling-org-apache-sling-resourceresolver) branch master updated: SLING-12382 : Potential concurrency issues with resource provider registration/unregistration

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 23d16d1  SLING-12382 : Potential concurrency issues with resource provider registration/unregistration
23d16d1 is described below

commit 23d16d1d047250ca834b1960cb908d293f3bcbe7
Author: Carsten Ziegeler <cz...@apache.org>
AuthorDate: Fri Jul 12 11:10:33 2024 +0200

    SLING-12382 : Potential concurrency issues with resource provider registration/unregistration
---
 .../impl/FactoryPreconditions.java                 |  11 +-
 .../impl/FactoryRegistrationHandler.java           |   6 +-
 .../impl/ResourceResolverFactoryActivator.java     |   7 +-
 .../impl/providers/ResourceProviderTracker.java    | 226 ++++++++-------------
 .../impl/FactoryPreconditionsTest.java             |  32 +--
 .../impl/FactoryRegistrationHandlerTest.java       |  25 ++-
 .../providers/ResourceProviderTrackerTest.java     |  20 +-
 7 files changed, 124 insertions(+), 203 deletions(-)

diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java b/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java
index 702600a..0897249 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java
@@ -19,7 +19,6 @@
 package org.apache.sling.resourceresolver.impl;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -132,7 +131,7 @@ public class FactoryPreconditions {
         return rps;
     }
 
-    public boolean checkPreconditions(final String unavailableName, final String unavailableServicePid) {
+    public boolean checkPreconditions() {
         boolean canRegister = true;
         for (final RequiredProvider rp : requiredProviders) {
             canRegister = false;
@@ -145,14 +144,6 @@ public class FactoryPreconditions {
                 }
                 @SuppressWarnings("rawtypes") final ServiceReference ref = info.getServiceReference();
                 final Object servicePid = ref.getProperty(Constants.SERVICE_PID);
-                if (unavailableServicePid != null && unavailableServicePid.equals(servicePid)) {
-                    // ignore this service
-                    continue;
-                }
-                if (unavailableName != null && unavailableName.equals(info.getName())) {
-                    // ignore this service
-                    continue;
-                }
                 if (rp.name != null && rp.name.equals(info.getName())) {
                     canRegister = true;
                     break;
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/FactoryRegistrationHandler.java b/src/main/java/org/apache/sling/resourceresolver/impl/FactoryRegistrationHandler.java
index 1227f3c..76fe0fc 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/FactoryRegistrationHandler.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/FactoryRegistrationHandler.java
@@ -81,7 +81,7 @@ public class FactoryRegistrationHandler implements AutoCloseable {
 
         if (reRegister) {
             unregisterFactory();
-            maybeRegisterFactory(null, null);
+            maybeRegisterFactory();
         }
     }
 
@@ -107,7 +107,7 @@ public class FactoryRegistrationHandler implements AutoCloseable {
     /**
      * Check the preconditions and if it changed, either register factory or unregister
      */
-    void maybeRegisterFactory(final String unavailableName, final String unavailableServicePid) {
+    void maybeRegisterFactory() {
         if (!factoryRegistrationWorker.isShutdown()) {
             LOG.debug("submitting maybeRegisterFactory");
             factoryRegistrationWorker.execute(() -> {
@@ -115,7 +115,7 @@ public class FactoryRegistrationHandler implements AutoCloseable {
                 final ResourceResolverFactoryActivator localActivator;
                 try {
                     configurationLock.lock();
-                    preconditionsOk = factoryPreconditions.checkPreconditions(unavailableName, unavailableServicePid);
+                    preconditionsOk = factoryPreconditions.checkPreconditions();
                     localActivator = activator;
                 } finally {
                     configurationLock.unlock();
diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
index 4b249d3..faa538a 100644
--- a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
+++ b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
@@ -25,7 +25,6 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
-import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
 import java.util.TreeSet;
@@ -325,15 +324,15 @@ public class ResourceResolverFactoryActivator {
 
                         @Override
                         public void providerAdded() {
-                            factoryRegistrationHandler.maybeRegisterFactory(null, null);
+                            factoryRegistrationHandler.maybeRegisterFactory();
                         }
 
                         @Override
-                        public void providerRemoved(final String name, final String pid, final boolean stateful, final boolean isUsed) {
+                        public void providerRemoved(final boolean stateful, final boolean isUsed) {
                             if ( isUsed && (stateful || config.resource_resolver_providerhandling_paranoid()) ) {
                                 factoryRegistrationHandler.unregisterFactory();
                             }
-                            factoryRegistrationHandler.maybeRegisterFactory(name, pid);
+                            factoryRegistrationHandler.maybeRegisterFactory();
                         }
                     });
         }
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 45a6371..35429e2 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
@@ -70,7 +70,7 @@ public class ResourceProviderTracker implements ResourceProviderStorageProvider
 
         void providerAdded();
 
-        void providerRemoved(String name, String pid, boolean stateful, boolean used);
+        void providerRemoved(boolean stateful, boolean used);
     }
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -110,11 +110,7 @@ public class ResourceProviderTracker implements ResourceProviderStorageProvider
             public void removedService(final ServiceReference<ResourceProvider> reference, final ServiceReference<ResourceProvider> ref) {
                 final ResourceProviderInfo info = infos.remove(ref);
                 if ( info != null ) {
-                    Object pid = ref.getProperty(Constants.SERVICE_PID);
-                    if ( pid != null && !(pid instanceof String) ) {
-                        pid = null;
-                    }
-                    unregister(info, (String)pid);
+                    unregister(info);
                 }
             }
 
@@ -170,68 +166,53 @@ public class ResourceProviderTracker implements ResourceProviderStorageProvider
      */
     private void register(final ResourceProviderInfo info) {
         if ( info.isValid() ) {
-           logger.debug("Registering new resource provider {}", info);
-           final List<ProviderEvent> events = new ArrayList<>();
-           boolean providerAdded = false;
-           ResourceProviderHandler deactivateHandler = null;
-
-           ResourceProviderHandler activate = null;
-           synchronized ( this.handlers ) {
-               final List<ResourceProviderHandler> matchingHandlers = this.handlers.computeIfAbsent(info.getPath(), key -> new ArrayList<>());
-               final ResourceProviderHandler handler = new ResourceProviderHandler(bundleContext, info);
-               matchingHandlers.add(handler);
-               Collections.sort(matchingHandlers);
-               if ( matchingHandlers.get(0) == handler ) {
-                   activate = handler;
-               }
-           }
-           if ( activate != null ) {
-               if ( this.activate(activate) ) {
-                   providerAdded = true;
-                   events.add(new ProviderEvent(true, info));
-                   synchronized ( this.handlers ) {
-                       storage = null;
-                       final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
-                       if ( matchingHandlers != null && matchingHandlers.size() > 1  ) {
-                           deactivateHandler = matchingHandlers.get(1);
-                       }
-                   }
-               } else {
-                   synchronized ( this.handlers ) {
-                       final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
-                       if ( matchingHandlers != null && !matchingHandlers.isEmpty() && matchingHandlers.remove(activate) ) {
-                           storage = null;
-                           if ( matchingHandlers.isEmpty() ) {
-                               this.handlers.remove(info.getPath());
-                           }
-                       }
-                   }
-               }
-           }
-
-           final ChangeListener cl = this.listener;
-           if ( providerAdded && cl != null ) {
-               cl.providerAdded();
-           }
-           // we have to check for deactivated handlers
-           if ( deactivateHandler != null ) {
-               final ResourceProviderInfo handlerInfo = deactivateHandler.getInfo();
-               if ( cl != null ) {
-                   Object pid = handlerInfo.getServiceReference().getProperty(Constants.SERVICE_PID);
-                   if ( pid != null && !(pid instanceof String) ) {
-                       pid = null;
-                   }
-                   cl.providerRemoved(handlerInfo.getName(), (String)pid,
-                               handlerInfo.getAuthType() != AuthType.no,
-                                       deactivateHandler.isUsed());
-               }
-               this.deactivate(deactivateHandler);
-               synchronized ( this.handlers ) {
-                   storage = null;
-               }
-               events.add(new ProviderEvent(false, handlerInfo));
-           }
-           this.postEvents(events);
+            logger.debug("Registering new resource provider {}", info);
+
+            final List<ProviderEvent> events = new ArrayList<>();
+            boolean providerAdded = false;
+            ResourceProviderHandler deactivateHandler = null;
+
+            final ResourceProviderHandler handler = new ResourceProviderHandler(bundleContext, info);
+
+            // update list of active handlers
+            synchronized ( this.handlers ) {
+                final List<ResourceProviderHandler> matchingHandlers = this.handlers.computeIfAbsent(info.getPath(), key -> new ArrayList<>());
+                matchingHandlers.add(handler);
+                Collections.sort(matchingHandlers);
+
+                if ( matchingHandlers.get(0) == handler ) {
+                    if ( this.activate(handler) ) {
+                        providerAdded = true;
+                        events.add(new ProviderEvent(true, info));
+                        synchronized ( this.handlers ) {
+                            storage = null;
+                            if (  matchingHandlers.size() > 1  ) {
+                                deactivateHandler = matchingHandlers.get(1);
+                                this.deactivate(deactivateHandler);
+                                events.add(new ProviderEvent(false, deactivateHandler.getInfo()));
+                            }
+                        }
+                    } else {
+                        matchingHandlers.remove(handler);
+                        if ( matchingHandlers.isEmpty() ) {
+                            this.handlers.remove(info.getPath());
+                        }
+                    }
+                }
+            }
+
+            // update change listener (only once)
+            final ChangeListener cl = this.listener;
+            if ( cl != null ) {
+                if ( deactivateHandler != null ) {
+                    cl.providerRemoved(deactivateHandler.getInfo().getAuthType() != AuthType.no, deactivateHandler.isUsed());
+                } else if ( providerAdded ) {
+                    cl.providerAdded();
+                }
+            }
+
+            // send events
+            this.postEvents(events);
         } else {
             logger.warn("Ignoring invalid resource provider {}", info);
             this.invalidProviders.put(info, FailureReason.invalid);
@@ -242,14 +223,12 @@ public class ResourceProviderTracker implements ResourceProviderStorageProvider
      * Unregister a resource provider.
      * @param info The resource provider info.
      */
-    private void unregister(final ResourceProviderInfo info, final String pid) {
-        final boolean isInvalid;
-        synchronized ( this.invalidProviders ) {
-            isInvalid = this.invalidProviders.remove(info) != null;
-        }
+    private void unregister(final ResourceProviderInfo info) {
+        final boolean isInvalid = this.invalidProviders.remove(info) != null;
 
         if ( !isInvalid ) {
             logger.debug("Unregistering resource provider {}", info);
+            final List<ProviderEvent> events = new ArrayList<>();
 
             // remove provider from handlers and if the provider is active (first handler)
             // keep the reference for deactivation
@@ -265,82 +244,55 @@ public class ResourceProviderTracker implements ResourceProviderStorageProvider
                             it.remove();
                             if ( first ) {
                                 deactivateHandler = h;
+                                storage = null;
                             } else {
                                 h.dispose();
                             }
                             if (matchingHandlers.isEmpty()) {
                                 this.handlers.remove(info.getPath());
                             }
-                            storage = null;
 
                             break;
                         }
                         first = false;
                     }
                 }
-            }
-
-            if ( deactivateHandler != null ) {
-                final List<ProviderEvent> events = new ArrayList<>();
-                final ChangeListener cl = this.listener;
-                if ( cl != null ) {
-                    cl.providerRemoved(info.getName(), pid,
-                            info.getAuthType() != AuthType.no,
-                                    deactivateHandler.isUsed());
-                }
-                this.deactivate(deactivateHandler);
-                deactivateHandler.dispose();
-
-                // check if we can activate another handler
-                ResourceProviderHandler addingProvider = null;
-                synchronized ( this.handlers ) {
-                    final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
-                    if ( matchingHandlers != null ) {
-                        if ( matchingHandlers.isEmpty() ) {
-                            this.handlers.remove(info.getPath());
-                        } else {
-                            addingProvider = matchingHandlers.get(0);
-                        }
-                    }
-                }
-                boolean providerAdded = false;
-                while ( addingProvider != null ) {
-                    if (this.activate(addingProvider)) {
-                        events.add(new ProviderEvent(true, addingProvider.getInfo()));
-                        providerAdded = true;
-                        addingProvider = null;
-                        synchronized ( this.handlers ) {
-                            this.storage = null;
-                        }
-                    } else {
-                        synchronized ( this.handlers ) {
-                            final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
-                            if ( matchingHandlers != null && !matchingHandlers.isEmpty() ) {
-                                if ( matchingHandlers.get(0) == addingProvider ) {
-                                    this.storage = null;
-                                    matchingHandlers.remove(0);
-                                    addingProvider.dispose();
-                                    if ( matchingHandlers.isEmpty() ) {
-                                        this.handlers.remove(info.getPath());
-                                        addingProvider = null;
-                                    } else {
-                                        addingProvider = matchingHandlers.get(0);
-                                    }
+                if ( deactivateHandler != null ) {
+                    this.deactivate(deactivateHandler);
+                    deactivateHandler.dispose();
+                    events.add(new ProviderEvent(false, info));
+
+                    // check if we can activate another handler
+                    if ( !matchingHandlers.isEmpty() ) {
+                        ResourceProviderHandler addingProvider = matchingHandlers.get(0);
+                        while ( addingProvider != null ) {
+                            if (this.activate(addingProvider)) {
+                                events.add(new ProviderEvent(true, addingProvider.getInfo()));
+                                addingProvider = null;
+                            } else {
+                                matchingHandlers.remove(0);
+                                addingProvider.dispose();
+                                if ( matchingHandlers.isEmpty() ) {
+                                    this.handlers.remove(info.getPath());
+                                    addingProvider = null;
+                                } else {
+                                    addingProvider = matchingHandlers.get(0);
                                 }
                             }
                         }
-                    }
+                    }    
                 }
+            }
 
-                if ( providerAdded && cl != null ) {
-                    if ( cl != null ) {
-                        cl.providerAdded();
-                    }
-                }
-                events.add(new ProviderEvent(false,info));
-                this.postEvents(events);
-
+            // update change listener (only once)
+            final ChangeListener cl = this.listener;
+            if ( cl != null ) {
+                cl.providerRemoved(info.getAuthType() != AuthType.no, deactivateHandler.isUsed());
             }
+
+            // send events
+            this.postEvents(events);
+
         } else {
             logger.debug("Unregistering invalid resource provider {}", info);
         }
@@ -426,13 +378,11 @@ public class ResourceProviderTracker implements ResourceProviderStorageProvider
                 }
             }
         }
-        synchronized ( this.invalidProviders ) {
-            for(final Map.Entry<ResourceProviderInfo, FailureReason> entry : this.invalidProviders.entrySet()) {
-                final ResourceProviderFailureDTO d = new ResourceProviderFailureDTO();
-                fill(d, entry.getKey());
-                d.reason = entry.getValue();
-                failures.add(d);
-            }
+        for(final Map.Entry<ResourceProviderInfo, FailureReason> entry : this.invalidProviders.entrySet()) {
+            final ResourceProviderFailureDTO d = new ResourceProviderFailureDTO();
+            fill(d, entry.getKey());
+            d.reason = entry.getValue();
+            failures.add(d);
         }
         dto.providers = dtos.toArray(new ResourceProviderDTO[dtos.size()]);
         dto.failedProviders = failures.toArray(new ResourceProviderFailureDTO[failures.size()]);
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java
index b930503..03710cc 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java
@@ -45,11 +45,11 @@ public class FactoryPreconditionsTest {
 
         FactoryPreconditions conditions = new FactoryPreconditions(tracker, null, null);
 
-        assertTrue(conditions.checkPreconditions(null, null));
+        assertTrue(conditions.checkPreconditions());
 
         conditions = new FactoryPreconditions(tracker, Collections.<String> emptySet(), Collections.<String> emptySet());
 
-        assertTrue(conditions.checkPreconditions(null, null));
+        assertTrue(conditions.checkPreconditions());
     }
 
     private List<ResourceProviderHandler> getResourceProviderHandlers(String[] pids) {
@@ -95,15 +95,15 @@ public class FactoryPreconditionsTest {
 
         final List<ResourceProviderHandler> handlers1 = getResourceProviderHandlers(new String[] {"pid2"});
         Mockito.when(storage.getAllHandlers()).thenReturn(handlers1);
-        assertFalse(conditions.checkPreconditions(null, null));
+        assertFalse(conditions.checkPreconditions());
 
         final List<ResourceProviderHandler> handlers2 = getResourceProviderHandlers(new String[] {"pid1", "pid2", "pid3"});
         Mockito.when(storage.getAllHandlers()).thenReturn(handlers2);
-        assertTrue(conditions.checkPreconditions(null, null));
+        assertTrue(conditions.checkPreconditions());
 
         final List<ResourceProviderHandler> handlers3 = getResourceProviderHandlers(new String[] {"pid1"});
         Mockito.when(storage.getAllHandlers()).thenReturn(handlers3);
-        assertFalse(conditions.checkPreconditions(null, null));
+        assertFalse(conditions.checkPreconditions());
     }
 
     @Test public void testNames() {
@@ -115,30 +115,14 @@ public class FactoryPreconditionsTest {
 
         final List<ResourceProviderHandler> handlers1 = getResourceProviderHandlersWithNames(new String[] {"n2"});
         Mockito.when(storage.getAllHandlers()).thenReturn(handlers1);
-        assertFalse(conditions.checkPreconditions(null, null));
+        assertFalse(conditions.checkPreconditions());
 
         final List<ResourceProviderHandler> handlers2 = getResourceProviderHandlersWithNames(new String[] {"n1", "n2", "n3"});
         Mockito.when(storage.getAllHandlers()).thenReturn(handlers2);
-        assertTrue(conditions.checkPreconditions(null, null));
+        assertTrue(conditions.checkPreconditions());
 
         final List<ResourceProviderHandler> handlers3 = getResourceProviderHandlersWithNames(new String[] {"n1"});
         Mockito.when(storage.getAllHandlers()).thenReturn(handlers3);
-        assertFalse(conditions.checkPreconditions(null, null));
-    }
-
-    @Test public void testUnregisteringService() {
-        final ResourceProviderTracker tracker = Mockito.mock(ResourceProviderTracker.class);
-        final ResourceProviderStorage storage = Mockito.mock(ResourceProviderStorage.class);
-        Mockito.when(tracker.getResourceProviderStorage()).thenReturn(storage);
-
-        FactoryPreconditions conditions = new FactoryPreconditions(tracker, null, new HashSet<>(Arrays.asList("pid1", "pid3")));
-
-        final List<ResourceProviderHandler> handlers2 = getResourceProviderHandlers(new String[] {"pid1", "pid2", "pid3"});
-        Mockito.when(storage.getAllHandlers()).thenReturn(handlers2);
-        assertTrue(conditions.checkPreconditions(null, null));
-
-        assertTrue(conditions.checkPreconditions(null, "pid2"));
-
-        assertFalse(conditions.checkPreconditions(null, "pid1"));
+        assertFalse(conditions.checkPreconditions());
     }
 }
diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/FactoryRegistrationHandlerTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/FactoryRegistrationHandlerTest.java
index 04fb408..1ee8f74 100644
--- a/src/test/java/org/apache/sling/resourceresolver/impl/FactoryRegistrationHandlerTest.java
+++ b/src/test/java/org/apache/sling/resourceresolver/impl/FactoryRegistrationHandlerTest.java
@@ -43,7 +43,6 @@ import static org.apache.sling.resourceresolver.util.events.ServiceEventUtil.unr
 import static org.hamcrest.Matchers.empty;
 import static org.hamcrest.Matchers.hasSize;
 import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.isNull;
 import static org.mockito.Mockito.doCallRealMethod;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.when;
@@ -99,7 +98,7 @@ class FactoryRegistrationHandlerTest {
     void testFactoryRegistrationDeregistration() throws InterruptedException {
         final BundleContext bundleContext = osgi.bundleContext();
         final FactoryPreconditions preconditions = mock(FactoryPreconditions.class);
-        when(preconditions.checkPreconditions(isNull(), isNull())).thenReturn(true);
+        when(preconditions.checkPreconditions()).thenReturn(true);
 
         try (FactoryRegistrationHandler factoryRegistrationHandler = new FactoryRegistrationHandler()) {
 
@@ -114,7 +113,7 @@ class FactoryRegistrationHandlerTest {
             }
 
             try (RecordingListener listener = RecordingListener.of(bundleContext)) {
-                factoryRegistrationHandler.maybeRegisterFactory(null, null);
+                factoryRegistrationHandler.maybeRegisterFactory();
                 listener.assertRecorded(RRF_REGISTRATION);
             }
         }
@@ -127,14 +126,14 @@ class FactoryRegistrationHandlerTest {
 
         try (FactoryRegistrationHandler factoryRegistrationHandler = new FactoryRegistrationHandler()) {
             try (final RecordingListener listener = RecordingListener.of(ctx)) {
-                when(preconditions.checkPreconditions(isNull(), isNull())).thenReturn(true);
+                when(preconditions.checkPreconditions()).thenReturn(true);
                 factoryRegistrationHandler.configure(activator, preconditions);
                 listener.assertRecorded(RRF_REGISTRATION);
             }
 
             try (final RecordingListener listener = RecordingListener.of(ctx)) {
-                when(preconditions.checkPreconditions(isNull(), isNull())).thenReturn(false);
-                factoryRegistrationHandler.maybeRegisterFactory(null, null);
+                when(preconditions.checkPreconditions()).thenReturn(false);
+                factoryRegistrationHandler.maybeRegisterFactory();
                 listener.assertRecorded(RRF_UNREGISTRATION);
             }
         }
@@ -145,7 +144,7 @@ class FactoryRegistrationHandlerTest {
     void testReconfigurationLeadingToUnregsitration() throws InterruptedException {
         final BundleContext ctx = osgi.bundleContext();
         final FactoryPreconditions preconditions = mock(FactoryPreconditions.class);
-        when(preconditions.checkPreconditions(isNull(), isNull())).thenReturn(true);
+        when(preconditions.checkPreconditions()).thenReturn(true);
 
         try (final FactoryRegistrationHandler factoryRegistrationHandler = new FactoryRegistrationHandler()) {
             try (RecordingListener listener = RecordingListener.of(ctx)) {
@@ -155,7 +154,7 @@ class FactoryRegistrationHandlerTest {
 
             try (RecordingListener listener = RecordingListener.of(ctx)) {
                 final FactoryPreconditions failingPreconditions = mock(FactoryPreconditions.class); // new instance
-                when(failingPreconditions.checkPreconditions(isNull(), isNull())).thenReturn(false);
+                when(failingPreconditions.checkPreconditions()).thenReturn(false);
                 factoryRegistrationHandler.configure(activator, failingPreconditions);
                 listener.assertRecorded(RRF_UNREGISTRATION);
             }
@@ -165,7 +164,7 @@ class FactoryRegistrationHandlerTest {
     void testReconfigurationWithNoChanges() throws InterruptedException {
         final BundleContext ctx = osgi.bundleContext();
         final FactoryPreconditions preconditions = mock(FactoryPreconditions.class);
-        when(preconditions.checkPreconditions(isNull(), isNull())).thenReturn(true);
+        when(preconditions.checkPreconditions()).thenReturn(true);
 
         try (final FactoryRegistrationHandler factoryRegistrationHandler = new FactoryRegistrationHandler()) {
             try (RecordingListener listener = RecordingListener.of(ctx)) {
@@ -187,14 +186,14 @@ class FactoryRegistrationHandlerTest {
         try (final FactoryRegistrationHandler factoryRegistrationHandler = new FactoryRegistrationHandler()) {
             try (RecordingListener listener = RecordingListener.of(ctx)) {
                 final FactoryPreconditions preconditions = mock(FactoryPreconditions.class);
-                when(preconditions.checkPreconditions(isNull(), isNull())).thenReturn(true);
+                when(preconditions.checkPreconditions()).thenReturn(true);
                 factoryRegistrationHandler.configure(activator, preconditions);
                 listener.assertRecorded(RRF_REGISTRATION);
             }
 
             try (RecordingListener listener = RecordingListener.of(ctx)) {
                 final FactoryPreconditions preconditions = mock(FactoryPreconditions.class);
-                when(preconditions.checkPreconditions(isNull(), isNull())).thenReturn(true);
+                when(preconditions.checkPreconditions()).thenReturn(true);
                 factoryRegistrationHandler.configure(activator, preconditions);
                 listener.assertRecorded(allOf(RRF_REREGISTRATION));
             }
@@ -208,13 +207,13 @@ class FactoryRegistrationHandlerTest {
         final FactoryRegistrationHandler factoryRegistrationHandler = new FactoryRegistrationHandler();
 
         try (RecordingListener listener = RecordingListener.of(ctx)) {
-            when(preconditions.checkPreconditions(isNull(), isNull())).thenReturn(true);
+            when(preconditions.checkPreconditions()).thenReturn(true);
             factoryRegistrationHandler.configure(activator, preconditions);
             listener.assertRecorded(RRF_REGISTRATION);
         }
 
         try (RecordingListener listener = RecordingListener.of(ctx)) {
-            when(preconditions.checkPreconditions(isNull(), isNull())).thenReturn(false);
+            when(preconditions.checkPreconditions()).thenReturn(false);
             factoryRegistrationHandler.close();
             listener.assertRecorded(allOf(RRF_UNREGISTRATION));
 
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 34fdd65..a55d234 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
@@ -116,7 +116,7 @@ public class ResourceProviderTrackerTest {
             }
 
             @Override
-            public void providerRemoved(String name, String pid, boolean stateful, boolean used) {
+            public void providerRemoved(boolean stateful, boolean used) {
                 removedCalled.set(true);
             }
 
@@ -170,7 +170,7 @@ public class ResourceProviderTrackerTest {
             }
 
             @Override
-            public void providerRemoved(String name, String pid, boolean stateful, boolean used) {
+            public void providerRemoved(boolean stateful, boolean used) {
                 removedCalled.set(true);
             }
 
@@ -201,8 +201,8 @@ public class ResourceProviderTrackerTest {
         ResourceProvider<Object> rp2 = mock(ResourceProvider.class);
         final ResourceProviderInfo infoOverlay = fixture.registerResourceProvider(rp2, "/", AuthType.no, 1000);
 
-        // check added and removed is called
-        assertTrue(addedCalled.get());
+        // check only removed is called
+        assertFalse(addedCalled.get());
         assertTrue(removedCalled.get());
 
         // verify a single provider
@@ -215,8 +215,8 @@ public class ResourceProviderTrackerTest {
         // unregister overlay provider
         fixture.unregisterResourceProvider(infoOverlay);
 
-        // check added and removed is called
-        assertTrue(addedCalled.get());
+        // check only removed is called
+        assertFalse(addedCalled.get());
         assertTrue(removedCalled.get());
 
         // verify a single provider
@@ -286,14 +286,12 @@ public class ResourceProviderTrackerTest {
 
         @Override
         public void providerAdded() {
-            // TODO Auto-generated method stub
-
+            // do nothing
         }
 
         @Override
-        public void providerRemoved(String name, String pid, boolean stateful, boolean used) {
-            // TODO Auto-generated method stub
-
+        public void providerRemoved(boolean stateful, boolean used) {
+            // do nothing
         }
     }
 }
\ No newline at end of file