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/08 14:30:47 UTC

svn commit: r1734078 - in /sling/trunk/bundles/resourceresolver/src: main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java test/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTrackerTest.java

Author: cziegeler
Date: Tue Mar  8 13:30:47 2016
New Revision: 1734078

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

Modified:
    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/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=1734078&r1=1734077&r2=1734078&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 Tue Mar  8 13:30:47 2016
@@ -176,8 +176,15 @@ public class ResourceProviderTracker imp
                            this.handlers.remove(info.getPath());
                        }
                    } else {
+                       final ChangeListener cl = this.listener;
+                       if ( cl != null ) {
+                           cl.providerAdded();
+                       }
                        events.add(new ProviderEvent(true, info));
                        if ( matchingHandlers.size() > 1 ) {
+                           if ( cl != null ) {
+                               cl.providerRemoved((String)matchingHandlers.get(1).getInfo().getServiceReference().getProperty(Constants.SERVICE_PID));
+                           }
                            this.deactivate(matchingHandlers.get(1));
                            events.add(new ProviderEvent(false, matchingHandlers.get(1).getInfo()));
                        }

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=1734078&r1=1734077&r2=1734078&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 Tue Mar  8 13:30:47 2016
@@ -21,11 +21,14 @@ package org.apache.sling.resourceresolve
 import static org.hamcrest.Matchers.arrayWithSize;
 import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.hasSize;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.mock;
 
 import java.util.Collections;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.sling.api.resource.observation.ResourceChange;
 import org.apache.sling.api.resource.path.Path;
@@ -96,6 +99,150 @@ public class ResourceProviderTrackerTest
     }
 
     @Test
+    public void testActivationDeactivation() throws Exception {
+        final BundleContext bundleContext = MockOsgi.newBundleContext();
+        final EventAdmin eventAdmin = mock(EventAdmin.class);
+
+        final Fixture fixture = new Fixture(bundleContext);
+        final ResourceProviderTracker tracker = new ResourceProviderTracker();
+        tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new NoDothingObservationReporter()));
+
+        // create boolean markers for the listener
+        final AtomicBoolean addedCalled = new AtomicBoolean(false);
+        final AtomicBoolean removedCalled = new AtomicBoolean(false);
+
+        final ChangeListener listener = new ChangeListener() {
+
+            @Override
+            public void providerAdded() {
+                addedCalled.set(true);
+            }
+
+            @Override
+            public void providerRemoved(String pid) {
+                removedCalled.set(true);
+            }
+
+        };
+        // activate and check that no listener is called yet
+        tracker.activate(bundleContext, eventAdmin, listener);
+        assertFalse(addedCalled.get());
+        assertFalse(removedCalled.get());
+
+        // add a new resource provider
+        @SuppressWarnings("unchecked")
+        ResourceProvider<Object> rp = mock(ResourceProvider.class);
+        final ResourceProviderInfo info = fixture.registerResourceProvider(rp, "/", AuthType.no);
+
+        // check added is called but not removed
+        assertTrue(addedCalled.get());
+        assertFalse(removedCalled.get());
+
+        // verify a single provider
+        assertThat(tracker.getResourceProviderStorage().getAllHandlers().size(), equalTo(1));
+
+        // reset boolean markers
+        addedCalled.set(false);
+        removedCalled.set(false);
+
+        // remove provider
+        fixture.unregisterResourceProvider(info);
+
+        // verify removed is called but not added
+        assertTrue(removedCalled.get());
+        assertFalse(addedCalled.get());
+
+        // no provider anymore
+        assertThat(tracker.getResourceProviderStorage().getAllHandlers().size(), equalTo(0));
+    }
+
+    @Test
+    public void testReactivation() throws Exception {
+        final BundleContext bundleContext = MockOsgi.newBundleContext();
+        final EventAdmin eventAdmin = mock(EventAdmin.class);
+
+        final Fixture fixture = new Fixture(bundleContext);
+        final ResourceProviderTracker tracker = new ResourceProviderTracker();
+        tracker.setObservationReporterGenerator(new SimpleObservationReporterGenerator(new NoDothingObservationReporter()));
+
+        // create boolean markers for the listener
+        final AtomicBoolean addedCalled = new AtomicBoolean(false);
+        final AtomicBoolean removedCalled = new AtomicBoolean(false);
+
+        final ChangeListener listener = new ChangeListener() {
+
+            @Override
+            public void providerAdded() {
+                addedCalled.set(true);
+            }
+
+            @Override
+            public void providerRemoved(String pid) {
+                removedCalled.set(true);
+            }
+
+        };
+        // activate and check that no listener is called yet
+        tracker.activate(bundleContext, eventAdmin, listener);
+        assertFalse(addedCalled.get());
+        assertFalse(removedCalled.get());
+
+        // activate and check that no listener is called yet
+        @SuppressWarnings("unchecked")
+        ResourceProvider<Object> rp = mock(ResourceProvider.class);
+        final ResourceProviderInfo info = fixture.registerResourceProvider(rp, "/", AuthType.no);
+
+        // check added is called but not removed
+        assertTrue(addedCalled.get());
+        assertFalse(removedCalled.get());
+
+        // verify a single provider
+        assertThat(tracker.getResourceProviderStorage().getAllHandlers().size(), equalTo(1));
+
+        // reset boolean markers
+        addedCalled.set(false);
+        removedCalled.set(false);
+
+        // add overlay provider
+        final ResourceProviderInfo infoOverlay = fixture.registerResourceProvider(rp, "/", AuthType.no);
+
+        // check added and removed is called
+        assertTrue(addedCalled.get());
+        assertTrue(removedCalled.get());
+
+        // verify a single provider
+        assertThat(tracker.getResourceProviderStorage().getAllHandlers().size(), equalTo(1));
+
+        // reset boolean markers
+        addedCalled.set(false);
+        removedCalled.set(false);
+
+        // unregister overlay provider
+        fixture.unregisterResourceProvider(infoOverlay);
+
+        // check added and removed is called
+        assertTrue(addedCalled.get());
+        assertTrue(removedCalled.get());
+
+        // verify a single provider
+        assertThat(tracker.getResourceProviderStorage().getAllHandlers().size(), equalTo(1));
+
+        // reset boolean markers
+        addedCalled.set(false);
+        removedCalled.set(false);
+
+        // unregister first provider
+        fixture.unregisterResourceProvider(info);
+
+        // check removed is called but not added
+        assertTrue(removedCalled.get());
+        assertFalse(addedCalled.get());
+
+        // verify no provider
+        assertThat(tracker.getResourceProviderStorage().getAllHandlers().size(), equalTo(0));
+    }
+
+    @Test
     public void fillDto() throws Exception {
 
         RuntimeDTO dto = new RuntimeDTO();