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"));
}
}