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:33:51 UTC

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

Author: cziegeler
Date: Wed Mar  2 14:33:51 2016
New Revision: 1733302

URL: http://svn.apache.org/viewvc?rev=1733302&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/ResourceResolverFactoryActivator.java
    sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
    sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java

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=1733302&r1=1733301&r2=1733302&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:33:51 2016
@@ -26,7 +26,6 @@ import java.util.Map;
 
 import org.apache.commons.collections.BidiMap;
 import org.apache.commons.collections.bidimap.TreeBidiMap;
-import org.apache.commons.lang.ArrayUtils;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Deactivate;
@@ -488,8 +487,16 @@ public class ResourceResolverFactoryActi
                     new ChangeListener() {
 
                         @Override
-                        public void providerChanged(final String pid) {
-                            if (ArrayUtils.contains(requiredResourceProviders, pid)) {
+                        public void providerAdded() {
+                            if ( factoryRegistration == null ) {
+                                checkFactoryPreconditions();
+                            }
+
+                        }
+
+                        @Override
+                        public void providerRemoved(final String pid) {
+                            if ( factoryRegistration != null ) {
                                 checkFactoryPreconditions();
                             }
                         }

Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java?rev=1733302&r1=1733301&r2=1733302&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java Wed Mar  2 14:33:51 2016
@@ -66,7 +66,9 @@ public class ResourceProviderTracker imp
 
     public interface ChangeListener {
 
-        void providerChanged(String pid);
+        void providerAdded();
+
+        void providerRemoved(String pid);
     }
 
     private final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -104,7 +106,7 @@ public class ResourceProviderTracker imp
                 final ServiceReference ref = (ServiceReference)service;
                 final ResourceProviderInfo info = infos.remove(ref);
                 if ( info != null ) {
-                    unregister(info);
+                    unregister(info, (String)ref.getProperty(Constants.SERVICE_PID));
                 }
             }
 
@@ -194,7 +196,7 @@ public class ResourceProviderTracker imp
      * Unregister a resource provider.
      * @param info The resource provider info.
      */
-    private void unregister(final ResourceProviderInfo info) {
+    private void unregister(final ResourceProviderInfo info, final String pid) {
         final boolean isInvalid;
         synchronized ( this.invalidProviders ) {
             isInvalid = this.invalidProviders.remove(info) != null;
@@ -207,16 +209,25 @@ public class ResourceProviderTracker imp
                 final List<ResourceProviderHandler> matchingHandlers = this.handlers.get(info.getPath());
                 if ( matchingHandlers != null ) {
                     boolean doActivateNext = false;
-                    if ( matchingHandlers.get(0).getInfo() == info ) {
+                    final ResourceProviderHandler firstHandler = matchingHandlers.get(0);
+                    if ( firstHandler.getInfo() == info ) {
                         doActivateNext = true;
-                        this.deactivate(matchingHandlers.get(0));
-                        events.add(new ProviderEvent(false, matchingHandlers.get(0).getInfo()));
+                        final ChangeListener cl = this.listener;
+                        if ( cl != null ) {
+                            cl.providerRemoved(pid);
+                        }
+                        this.deactivate(firstHandler);
+                        events.add(new ProviderEvent(false, firstHandler.getInfo()));
                     }
                     if (removeHandlerByInfo(info, matchingHandlers)) {
                         while (doActivateNext && !matchingHandlers.isEmpty()) {
                             if (this.activate(matchingHandlers.get(0))) {
                                 doActivateNext = false;
                                 events.add(new ProviderEvent(true, matchingHandlers.get(0).getInfo()));
+                                final ChangeListener cl = this.listener;
+                                if ( cl != null ) {
+                                    cl.providerAdded();
+                                }
                             } else {
                                 matchingHandlers.remove(0);
                             }
@@ -406,9 +417,6 @@ public class ResourceProviderTracker imp
                 for(final ProviderEvent e : events) {
                     postOSGiEvent(e);
                     postResourceProviderChange(e);
-                    if ( e.pid != null && listener != null ) {
-                        listener.providerChanged(e.pid);
-                    }
                 }
             }
         });

Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java?rev=1733302&r1=1733301&r2=1733302&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java Wed Mar  2 14:33:51 2016
@@ -45,7 +45,7 @@ import org.osgi.framework.BundleContext;
 import org.osgi.service.event.EventAdmin;
 
 public class ResourceProviderTrackerTest {
-    
+
     private ResourceProviderInfo rp2Info;
     private ResourceProviderTracker tracker;
     private Fixture fixture;
@@ -53,59 +53,59 @@ public class ResourceProviderTrackerTest
     @Before
     public void prepare() throws Exception {
         BundleContext bundleContext = MockOsgi.newBundleContext();
-        
+
         fixture = new Fixture(bundleContext);
-        
+
         EventAdmin eventAdmin = mock(EventAdmin.class);
-        
+
         @SuppressWarnings("unchecked")
         ResourceProvider<Object> rp = mock(ResourceProvider.class);
         @SuppressWarnings("unchecked")
         ResourceProvider<Object> rp2 = mock(ResourceProvider.class);
         @SuppressWarnings("unchecked")
         ResourceProvider<Object> rp3 = mock(ResourceProvider.class);
-        
+
         fixture.registerResourceProvider(rp, "/", AuthType.no);
         rp2Info = fixture.registerResourceProvider(rp2, "/path", AuthType.lazy);
         fixture.registerResourceProvider(rp3, "invalid", AuthType.no);
-        
+
         tracker = new ResourceProviderTracker();
-        
+
         tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new NoDothingObservationReporter()));
         tracker.activate(bundleContext, eventAdmin, new DoNothingChangeListener());
     }
 
     @Test
     public void activate() {
-        
+
         // since the OSGi mocks are asynchronous we don't have to wait for the changes to propagate
-        
+
         assertThat(tracker.getResourceProviderStorage().getAllHandlers().size(), equalTo(2));
-        
+
         fixture.unregisterResourceProvider(rp2Info);
-        
+
         assertThat(tracker.getResourceProviderStorage().getAllHandlers().size(), equalTo(1));
     }
 
     @Test
     public void deactivate() {
-        
+
         tracker.deactivate();
-        
+
         assertThat(tracker.getResourceProviderStorage().getAllHandlers(), hasSize(0));
     }
-    
+
     @Test
     public void fillDto() throws Exception {
-        
+
         RuntimeDTO dto = new RuntimeDTO();
-        
+
         tracker.fill(dto);
-        
+
         assertThat( dto.providers, arrayWithSize(2));
         assertThat( dto.failedProviders, arrayWithSize(1));
     }
-    
+
     static final class NoDothingObservationReporter implements ObservationReporter {
         @Override
         public void reportChanges(Iterable<ResourceChange> changes, boolean distribute) {
@@ -116,7 +116,7 @@ public class ResourceProviderTrackerTest
             return Collections.emptyList();
         }
     }
-    
+
     static final class SimpleObservationReporterGenerator implements ObservationReporterGenerator {
         private final ObservationReporter reporter;
 
@@ -134,11 +134,19 @@ public class ResourceProviderTrackerTest
             return reporter;
         }
     }
-    
+
     static final class DoNothingChangeListener implements ChangeListener {
+
+        @Override
+        public void providerAdded() {
+            // TODO Auto-generated method stub
+
+        }
+
         @Override
-        public void providerChanged(String pid) {
-            
+        public void providerRemoved(String pid) {
+            // TODO Auto-generated method stub
+
         }
     }
 }
\ No newline at end of file