You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by bd...@apache.org on 2012/10/31 16:40:04 UTC
svn commit: r1404209 - in /sling/trunk/bundles/resourceresolver/src:
main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java
test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java
Author: bdelacretaz
Date: Wed Oct 31 15:40:03 2012
New Revision: 1404209
URL: http://svn.apache.org/viewvc?rev=1404209&view=rev
Log:
SLING-2640 - ResourceProviderEntry did not correctly remove a root provider
Modified:
sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java
sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java
Modified: sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java?rev=1404209&r1=1404208&r2=1404209&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java (original)
+++ sling/trunk/bundles/resourceresolver/src/main/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntry.java Wed Oct 31 15:40:03 2012
@@ -215,15 +215,25 @@ public class ResourceProviderEntry imple
* Remove the given resource provider from the tree
*/
protected synchronized boolean removeResourceProvider(final String prefix, final ProviderHandler resourceProvider) {
+ boolean result = false;
final String[] elements = split(prefix);
final List<ResourceProviderEntry> entries = new ArrayList<ResourceProviderEntry>();
this.populateProviderPath(entries, elements);
- if (entries.size() > 0 && entries.size() == elements.length) {
+ if(entries.size() == 0) {
+ // might be a root provider, try to remove it on this entry
+ result = this.removeInternalProvider(resourceProvider);
+ } else if (entries.size() > 0 && entries.size() == elements.length) {
// the last element is a perfect match;
- return entries.get(entries.size() - 1).removeInternalProvider(resourceProvider);
+ result = entries.get(entries.size() - 1).removeInternalProvider(resourceProvider);
}
- return false;
+
+ if(!result) {
+ // bad news - the provider might be an OSGi service being deactivated,
+ // so this should be taken care of.
+ LOGGER.warn("Unable to remove {} for prefix {}, no matching entry found", resourceProvider, prefix);
+ }
+ return result;
}
/**
Modified: sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java?rev=1404209&r1=1404208&r2=1404209&view=diff
==============================================================================
--- sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java (original)
+++ sling/trunk/bundles/resourceresolver/src/test/java/org/apache/sling/resourceresolver/impl/tree/ResourceProviderEntryTest.java Wed Oct 31 15:40:03 2012
@@ -18,6 +18,7 @@
*/
package org.apache.sling.resourceresolver.impl.tree;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
@@ -34,6 +35,7 @@ import org.apache.sling.api.resource.Res
import org.apache.sling.api.resource.ResourceMetadata;
import org.apache.sling.api.resource.ResourceProvider;
import org.apache.sling.api.resource.ResourceResolver;
+import org.apache.sling.api.resource.SyntheticResource;
import org.junit.Before;
import org.junit.Test;
import org.osgi.framework.Constants;
@@ -179,6 +181,37 @@ public class ResourceProviderEntryTest {
assertEquals(first, root.getResource(null, null, "/rootel/html.js"));
assertEquals(second, root.getResource(null, null, "/rootel/child/html.js"));
}
+
+ @Test public void testRemoveTheOnlyProvider() {
+ final ResourceProviderEntry e = new ResourceProviderEntry("/", null);
+ long counter = 1;
+
+ for(String path : new String[] { "/foo", "/", "/foo/bar" }) {
+ final ResourceProvider p = new TestResourceProvider(path);
+ final Map<String, Object> props = new HashMap<String, Object>();
+ props.put(Constants.SERVICE_ID, ++counter);
+
+ e.addResourceProvider(path, new ResourceProviderHandler(p, props));
+ {
+ final Resource r = e.getResource(null, null, path);
+ assertEquals(p, r);
+ assertFalse(r instanceof SyntheticResource);
+ }
+
+ e.removeResourceProvider(path, new ResourceProviderHandler(p, props));
+ {
+ final Resource r = e.getResource(null, null, path);
+ // If our provider is indeed gone, we should get one of the following conditions
+ if(r == null) {
+ //fine
+ } else if(!p.equals(r.getResourceResolver())) {
+ //fine
+ } else {
+ fail("Expecting inactive provider after removing it for " + path);
+ }
+ }
+ }
+ }
protected void assertEquals(ResourceProvider resProvider, Resource res) {
org.junit.Assert.assertEquals(resProvider, res.getResourceResolver());