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();