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 2016/03/02 15:45:49 UTC

svn commit: r1733306 - in /sling/trunk/bundles/resourceresolver/src: main/java/org/apache/sling/resourceresolver/impl/ test/java/org/apache/sling/resourceresolver/impl/

Author: cziegeler
Date: Wed Mar  2 14:45:49 2016
New Revision: 1733306

URL: http://svn.apache.org/viewvc?rev=1733306&view=rev
Log:
SLING-5561 : Resource Resolver Factory should be deactivated before provider is removed

Modified:
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
    sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java?rev=1733306&r1=1733305&r2=1733306&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/FactoryPreconditions.java Wed Mar  2 14:45:49 2016
@@ -32,6 +32,10 @@ import org.osgi.framework.ServiceReferen
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+/**
+ * Helper class which checks whether all conditions for registering
+ * the resource resolver factory are fulfilled.
+ */
 public class FactoryPreconditions {
 
     private static final class RequiredProvider {
@@ -77,7 +81,7 @@ public class FactoryPreconditions {
         this.tracker = null;
     }
 
-    public boolean checkPreconditions() {
+    public boolean checkPreconditions(final String unavailableServicePid) {
         synchronized ( this ) {
             final List<RequiredProvider> localRequiredProviders = this.requiredProviders;
             final ResourceProviderTracker localTracker = this.tracker;
@@ -87,10 +91,15 @@ public class FactoryPreconditions {
                     canRegister = false;
                     for (final ResourceProviderHandler h : localTracker.getResourceProviderStorage().getAllHandlers()) {
                         final ServiceReference ref = h.getInfo().getServiceReference();
+                        final String servicePid = (String)ref.getProperty(Constants.SERVICE_PID);
+                        if ( unavailableServicePid != null && unavailableServicePid.equals(servicePid) ) {
+                            // ignore this service
+                            continue;
+                        }
                         if (rp.filter != null && rp.filter.match(ref)) {
                             canRegister = true;
                             break;
-                        } else if (rp.pid != null && rp.pid.equals(ref.getProperty(Constants.SERVICE_PID))){
+                        } else if (rp.pid != null && rp.pid.equals(servicePid)){
                             canRegister = true;
                             break;
                         } else if (rp.pid != null && rp.pid.equals(ref.getProperty(LegacyResourceProviderWhiteboard.ORIGINAL_SERVICE_PID))) {

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java?rev=1733306&r1=1733305&r2=1733306&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java Wed Mar  2 14:45:49 2016
@@ -489,7 +489,7 @@ public class ResourceResolverFactoryActi
                         @Override
                         public void providerAdded() {
                             if ( factoryRegistration == null ) {
-                                checkFactoryPreconditions();
+                                checkFactoryPreconditions(null);
                             }
 
                         }
@@ -497,7 +497,7 @@ public class ResourceResolverFactoryActi
                         @Override
                         public void providerRemoved(final String pid) {
                             if ( factoryRegistration != null ) {
-                                checkFactoryPreconditions();
+                                checkFactoryPreconditions(pid);
                             }
                         }
                     });
@@ -564,7 +564,7 @@ public class ResourceResolverFactoryActi
         requiredResourceProviders = PropertiesUtil.toStringArray(properties.get(PROP_REQUIRED_PROVIDERS));
         this.preconds.activate(bc, requiredResourceProviders, resourceProviderTracker);
 
-        this.checkFactoryPreconditions();
+        this.checkFactoryPreconditions(null);
 
         final Thread t = new Thread(this);
         t.setDaemon(true);
@@ -664,10 +664,10 @@ public class ResourceResolverFactoryActi
     /**
      * Check the preconditions and if it changed, either register factory or unregister
      */
-    private void checkFactoryPreconditions() {
+    private void checkFactoryPreconditions(final String unavailableServicePid) {
         final ComponentContext localContext = this.componentContext;
         if ( localContext != null ) {
-            final boolean result = this.preconds.checkPreconditions();
+            final boolean result = this.preconds.checkPreconditions(unavailableServicePid);
             if ( result && this.factoryRegistration == null ) {
                 this.registerFactory(localContext);
             } else if ( !result && this.factoryRegistration != null ) {
@@ -729,7 +729,7 @@ public class ResourceResolverFactoryActi
             }
 
             if ( isRunning ) {
-                this.checkFactoryPreconditions();
+                this.checkFactoryPreconditions(null);
             }
         }
         this.unregisterFactory();

Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java?rev=1733306&r1=1733305&r2=1733306&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/FactoryPreconditionsTest.java Wed Mar  2 14:45:49 2016
@@ -43,12 +43,12 @@ public class FactoryPreconditionsTest {
         FactoryPreconditions conditions = new FactoryPreconditions();
         conditions.activate(null, null, tracker);
 
-        assertTrue(conditions.checkPreconditions());
+        assertTrue(conditions.checkPreconditions(null));
 
         conditions = new FactoryPreconditions();
         conditions.activate(null, new String[0], tracker);
 
-        assertTrue(conditions.checkPreconditions());
+        assertTrue(conditions.checkPreconditions(null));
     }
 
     @Test public void testDeactivated() {
@@ -59,11 +59,11 @@ public class FactoryPreconditionsTest {
         FactoryPreconditions conditions = new FactoryPreconditions();
         conditions.activate(null, null, tracker);
 
-        assertTrue(conditions.checkPreconditions());
+        assertTrue(conditions.checkPreconditions(null));
 
         conditions.deactivate();
 
-        assertFalse(conditions.checkPreconditions());
+        assertFalse(conditions.checkPreconditions(null));
     }
 
     private List<ResourceProviderHandler> getResourceProviderHandlers(String[] pids) {
@@ -93,14 +93,31 @@ public class FactoryPreconditionsTest {
 
         final List<ResourceProviderHandler> handlers1 = getResourceProviderHandlers(new String[] {"pid2"});
         Mockito.when(storage.getAllHandlers()).thenReturn(handlers1);
-        assertFalse(conditions.checkPreconditions());
+        assertFalse(conditions.checkPreconditions(null));
 
         final List<ResourceProviderHandler> handlers2 = getResourceProviderHandlers(new String[] {"pid1", "pid2", "pid3"});
         Mockito.when(storage.getAllHandlers()).thenReturn(handlers2);
-        assertTrue(conditions.checkPreconditions());
+        assertTrue(conditions.checkPreconditions(null));
 
         final List<ResourceProviderHandler> handlers3 = getResourceProviderHandlers(new String[] {"pid1"});
         Mockito.when(storage.getAllHandlers()).thenReturn(handlers3);
-        assertFalse(conditions.checkPreconditions());
+        assertFalse(conditions.checkPreconditions(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();
+        conditions.activate(null, new String[] {"pid1", "pid3"}, tracker);
+
+        final List<ResourceProviderHandler> handlers2 = getResourceProviderHandlers(new String[] {"pid1", "pid2", "pid3"});
+        Mockito.when(storage.getAllHandlers()).thenReturn(handlers2);
+        assertTrue(conditions.checkPreconditions(null));
+
+        assertTrue(conditions.checkPreconditions("pid2"));
+
+        assertFalse(conditions.checkPreconditions("pid1"));
     }
 }