This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.resourcemerger-1.1.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourcemerger.git
commit 68dcf374e735823c81a9752cf2052ee5df380ec3 Author: Carsten Ziegeler <[email protected]> AuthorDate: Fri Feb 28 09:21:27 2014 +0000 SLING-3420 : Revert implementation of ModifyingResourceProvider and provide an utility method instead git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/resourcemerger@1572894 13f79535-47bb-0310-9956-ffa450edef68 --- .../resourcemerger/api/ResourceMergerService.java | 18 +++ .../sling/resourcemerger/api/package-info.java | 3 +- .../sling/resourcemerger/impl/MergedResource.java | 34 +--- .../impl/MergedResourceProvider.java | 178 ++------------------- .../impl/MergedResourceProviderFactory.java | 13 ++ .../impl/MergedResourceProviderTest.java | 28 ---- 6 files changed, 44 insertions(+), 230 deletions(-) diff --git a/src/main/java/org/apache/sling/resourcemerger/api/ResourceMergerService.java b/src/main/java/org/apache/sling/resourcemerger/api/ResourceMergerService.java index 9ec7da9..80d03ba 100644 --- a/src/main/java/org/apache/sling/resourcemerger/api/ResourceMergerService.java +++ b/src/main/java/org/apache/sling/resourcemerger/api/ResourceMergerService.java @@ -54,4 +54,22 @@ public interface ResourceMergerService { * @return Returns <code>true</code> if the provided {@link Resource} is a merged resource. */ boolean isMergedResource(Resource resource); + + /** + * Return a resource path by taking the path of the merged resource, removing + * the mount point and replacing it with the search path. + * + * For example, if the provided search path is "/apps/" and the merged resource + * path is "/mnt/overlay/my/resource", the result will be "/apps/my/resource". + * + * @param searchPath The search path, this is an absolute path ending with a slash + * as returned by the resource resolver + * @param mergedResourcePath An absolute path to a merged resource + * @return The path to the resource + * @throws IllegalArgumentException If search path is not absolute or does not end + * with a slash or if the merged resource path + * is not within the space of the merged resources. + * @since 1.1 + */ + String getResourcePath(String searchPath, String mergedResourcePath); } diff --git a/src/main/java/org/apache/sling/resourcemerger/api/package-info.java b/src/main/java/org/apache/sling/resourcemerger/api/package-info.java index 2c28f9b..4d75dec 100644 --- a/src/main/java/org/apache/sling/resourcemerger/api/package-info.java +++ b/src/main/java/org/apache/sling/resourcemerger/api/package-info.java @@ -20,7 +20,8 @@ /** * Provides a service to merge multiple physical resources into a single one */ -@Version("1.0.0") +@Version("1.1.0") package org.apache.sling.resourcemerger.api; import aQute.bnd.annotation.Version; + diff --git a/src/main/java/org/apache/sling/resourcemerger/impl/MergedResource.java b/src/main/java/org/apache/sling/resourcemerger/impl/MergedResource.java index 34c98af..47f89ed 100644 --- a/src/main/java/org/apache/sling/resourcemerger/impl/MergedResource.java +++ b/src/main/java/org/apache/sling/resourcemerger/impl/MergedResource.java @@ -21,12 +21,9 @@ package org.apache.sling.resourcemerger.impl; import java.util.List; import org.apache.sling.api.resource.AbstractResource; -import org.apache.sling.api.resource.ModifiableValueMap; -import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceMetadata; import org.apache.sling.api.resource.ResourceResolver; -import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.resource.ValueMap; /** @@ -49,9 +46,6 @@ public class MergedResource extends AbstractResource { /** Cache value map. */ private final ValueMap properties; - /** Root path */ - private final String mergedRootPath; - /** * Constructor * @@ -64,8 +58,7 @@ public class MergedResource extends AbstractResource { final String mergeRootPath, final String relativePath, final List<Resource> mappedResources, - final List<ValueMap> valueMaps, - final String mergedRootPath) { + final List<ValueMap> valueMaps) { this.resolver = resolver; this.path = (relativePath.length() == 0 ? mergeRootPath : mergeRootPath + "/" + relativePath); this.properties = new MergedValueMap(valueMaps); @@ -78,7 +71,6 @@ public class MergedResource extends AbstractResource { i++; } metadata.put(MergedResourceConstants.METADATA_RESOURCES, resourcePaths); - this.mergedRootPath = mergedRootPath; } /** @@ -127,30 +119,6 @@ public class MergedResource extends AbstractResource { if (type == ValueMap.class) { return (AdapterType) this.properties; } - if (type == ModifiableValueMap.class) { - final String paths[] = (String[])this.metadata.get(MergedResourceConstants.METADATA_RESOURCES); - final String[] searchPaths = resolver.getSearchPath(); - final String lastSearchPath = searchPaths[searchPaths.length-1]; - - if ( paths.length == 1 && paths[0].startsWith(lastSearchPath) ) { - final Resource copyResource = resolver.getResource(paths[0]); - if ( searchPaths.length == 1 ) { - return (AdapterType)copyResource.adaptTo(ModifiableValueMap.class); - } - final String prefix = searchPaths[searchPaths.length-2]; - final String createPath = prefix + path.substring(this.mergedRootPath.length() + 1); - try { - final Resource newResource = ResourceUtil.getOrCreateResource(resolver, ResourceUtil.getParent(createPath),copyResource.getResourceType(), null, false); - return (AdapterType)newResource.adaptTo(ModifiableValueMap.class); - } catch ( final PersistenceException pe) { - // we ignore this for now - return null; - } - } - final String resourcePath = paths[paths.length-1]; - final Resource rsrc = resolver.getResource(resourcePath); - return (AdapterType)rsrc.adaptTo(ModifiableValueMap.class); - } return super.adaptTo(type); } diff --git a/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProvider.java b/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProvider.java index ece03c0..f7b1bd0 100644 --- a/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProvider.java +++ b/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProvider.java @@ -19,15 +19,11 @@ package org.apache.sling.resourcemerger.impl; import java.util.ArrayList; -import java.util.HashMap; import java.util.Iterator; import java.util.List; -import java.util.Map; import javax.servlet.http.HttpServletRequest; -import org.apache.sling.api.resource.ModifyingResourceProvider; -import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceProvider; import org.apache.sling.api.resource.ResourceResolver; @@ -39,7 +35,7 @@ import org.apache.sling.api.resource.ValueMap; * access to {@link MergedResource} objects. */ public class MergedResourceProvider - implements ResourceProvider, ModifyingResourceProvider { + implements ResourceProvider { private final String mergeRootPath; @@ -54,46 +50,23 @@ public class MergedResourceProvider return getResource(resolver, path); } - private static final class ExcludeEntry { - - public final String name; - public final boolean exclude; - - public ExcludeEntry(final String value) { - if ( value.startsWith("!!") ) { - this.name = value.substring(1); - this.exclude = false; - } else if ( value.startsWith("!") ) { - this.name = value.substring(1); - this.exclude = true; - } else { - this.name = value; - this.exclude = false; - } - } - } - private static final class ParentHidingHandler { - private final List<ExcludeEntry> entries = new ArrayList<MergedResourceProvider.ExcludeEntry>(); + private final String[] childrenToHideArray; public ParentHidingHandler(final Resource parent) { final ValueMap parentProps = ResourceUtil.getValueMap(parent); - final String[] childrenToHideArray = parentProps.get(MergedResourceConstants.PN_HIDE_CHILDREN, String[].class); - if ( childrenToHideArray != null ) { - for(final String value : childrenToHideArray) { - final ExcludeEntry entry = new ExcludeEntry(value); - this.entries.add(entry); - } - } + this.childrenToHideArray = parentProps.get(MergedResourceConstants.PN_HIDE_CHILDREN, String[].class); } public boolean isHidden(final String name) { boolean hidden = false; - for(final ExcludeEntry entry : this.entries) { - if ( entry.name.equals("*") || entry.name.equals(name) ) { - hidden = !entry.exclude; - break; + if ( this.childrenToHideArray != null ) { + for(final String entry : childrenToHideArray) { + if ( entry.equals("*") || entry.equals(name) ) { + hidden = true; + break; + } } } return hidden; @@ -173,7 +146,7 @@ public class MergedResourceProvider if (!holder.resources.isEmpty()) { // create a new merged resource based on the list of mapped physical resources - return new MergedResource(resolver, mergeRootPath, relativePath, holder.resources, holder.valueMaps, this.mergeRootPath); + return new MergedResource(resolver, mergeRootPath, relativePath, holder.resources, holder.valueMaps); } return null; } @@ -272,135 +245,4 @@ public class MergedResourceProvider } return null; } - - private ResourceHolder getAllResources(final ResourceResolver resolver, - final String path, - final String relativePath) { - final ResourceHolder holder = new ResourceHolder(ResourceUtil.getName(path)); - - // Loop over provided base paths, start with least import - final String[] searchPaths = resolver.getSearchPath(); - for(int i=searchPaths.length-1; i >= 0; i--) { - final String basePath = searchPaths[i]; - - // Try to get the corresponding physical resource for this base path - final String fullPath = basePath + relativePath; - - // check parent for hiding - final Resource parent = resolver.getResource(ResourceUtil.getParent(fullPath)); - if ( parent != null ) { - final boolean hidden = new ParentHidingHandler(parent).isHidden(holder.name); - if ( hidden ) { - holder.resources.clear(); - } else { - final Resource baseRes = resolver.getResource(fullPath); - if (baseRes != null) { - holder.resources.add(baseRes); - } - } - } - } - return holder; - } - - /** - * @see org.apache.sling.api.resource.ModifyingResourceProvider#create(org.apache.sling.api.resource.ResourceResolver, java.lang.String, java.util.Map) - */ - public Resource create(final ResourceResolver resolver, - final String path, - final Map<String, Object> properties) - throws PersistenceException { - // we only support modifications if there is more than one search path - final String[] searchPaths = resolver.getSearchPath(); - if ( searchPaths.length < 2 ) { - throw new PersistenceException("Modifying is only supported with at least two search paths", null, path, null); - } - // check if the resource exists - final Resource mountResource = this.getResource(resolver, path); - if ( mountResource != null ) { - throw new PersistenceException("Resource at " + path + " already exists.", null, path, null); - } - // creating of the root mount resource is not supported - final String relativePath = getRelativePath(path); - if ( relativePath == null || relativePath.length() == 0 ) { - throw new PersistenceException("Resource at " + path + " can't be created.", null, path, null); - } - - final String lastSearchPath = searchPaths[searchPaths.length-1]; - final ResourceHolder holder = this.getAllResources(resolver, path, relativePath); - if ( holder.resources.size() == 0 || holder.resources.size() == 1 && holder.resources.get(0).getPath().startsWith(lastSearchPath) ) { - final String useSearchPath = searchPaths[searchPaths.length-2]; - - final String createPath = useSearchPath + path.substring(this.mergeRootPath.length() + 1); - final Resource parentResource = ResourceUtil.getOrCreateResource(resolver, ResourceUtil.getParent(createPath), (String)null, null, false); - resolver.create(parentResource, ResourceUtil.getName(createPath), properties); - } - // TODO check hiding flag - return this.getResource(resolver, path); - } - - /** - * @see org.apache.sling.api.resource.ModifyingResourceProvider#delete(org.apache.sling.api.resource.ResourceResolver, java.lang.String) - */ - public void delete(final ResourceResolver resolver, final String path) - throws PersistenceException { - // we only support modifications if there is more than one search path - final String[] searchPaths = resolver.getSearchPath(); - if ( searchPaths.length < 2 ) { - throw new PersistenceException("Modifying is only supported with at least two search paths"); - } - // deleting of the root mount resource is not supported - final String relativePath = getRelativePath(path); - if ( relativePath == null || relativePath.length() == 0 ) { - throw new PersistenceException("Resource at " + path + " can't be created.", null, path, null); - } - - // check if the resource exists - final Resource mntResource = this.getResource(resolver, path); - if ( mntResource == null ) { - throw new PersistenceException("Resource at " + path + " does not exist", null, path, null); - } - final ResourceHolder holder = this.getAllResources(resolver, path, relativePath); - final String lastSearchPath = searchPaths[searchPaths.length-1]; - - int deleted = 0; - for(final Resource rsrc : holder.resources) { - final String p = rsrc.getPath(); - if ( !p.startsWith(lastSearchPath) ) { - resolver.delete(rsrc); - deleted++; - } - } - if ( deleted < holder.resources.size() ) { - // create overlay resource which is hiding the other - final String prefix = searchPaths[searchPaths.length-2]; - final String createPath = prefix + path.substring(this.mergeRootPath.length() + 1); - final Resource parentResource = ResourceUtil.getOrCreateResource(resolver, ResourceUtil.getParent(createPath), (String)null, null, false); - final Map<String, Object> properties = new HashMap<String, Object>(); - properties.put(MergedResourceConstants.PN_HIDE_RESOURCE, Boolean.TRUE); - resolver.create(parentResource, ResourceUtil.getName(createPath), properties); - } - } - - /** - * @see org.apache.sling.api.resource.ModifyingResourceProvider#revert(org.apache.sling.api.resource.ResourceResolver) - */ - public void revert(final ResourceResolver resolver) { - // the provider for the search paths will revert - } - - /** - * @see org.apache.sling.api.resource.ModifyingResourceProvider#commit(org.apache.sling.api.resource.ResourceResolver) - */ - public void commit(final ResourceResolver resolver) throws PersistenceException { - // the provider for the search paths will commit - } - - /** - * @see org.apache.sling.api.resource.ModifyingResourceProvider#hasChanges(org.apache.sling.api.resource.ResourceResolver) - */ - public boolean hasChanges(final ResourceResolver resolver) { - // the provider for the search paths will return in case of changes - return false; - } } diff --git a/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderFactory.java b/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderFactory.java index 5cbdfb2..3357b8a 100644 --- a/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderFactory.java +++ b/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderFactory.java @@ -112,6 +112,19 @@ public class MergedResourceProviderFactory implements ResourceProviderFactory, R return Boolean.TRUE.equals(resource.getResourceMetadata().get(MergedResourceConstants.METADATA_FLAG)); } + /** + * {@inheritDoc} + */ + public String getResourcePath(final String searchPath, final String mergedResourcePath) { + if( searchPath == null || !searchPath.startsWith("/") || !searchPath.endsWith("/") ) { + throw new IllegalArgumentException("Provided path is not a valid search path: " + searchPath); + } + if ( mergedResourcePath == null || !mergedResourcePath.startsWith(this.mergeRootPath + "/") ) { + throw new IllegalArgumentException("Provided path does not point to a merged resource: " + mergedResourcePath); + } + return searchPath + mergedResourcePath.substring(this.mergeRootPath.length() + 1); + } + @Activate protected void configure(final Map<String, Object> properties) { mergeRootPath = PropertiesUtil.toString(properties.get(ResourceProvider.ROOTS), DEFAULT_ROOT); diff --git a/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java b/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java index 0034a79..315e4e4 100644 --- a/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java +++ b/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java @@ -24,15 +24,12 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import java.util.ArrayList; -import java.util.Collections; import java.util.Iterator; import java.util.List; -import org.apache.sling.api.resource.PersistenceException; import org.apache.sling.api.resource.Resource; import org.apache.sling.api.resource.ResourceResolver; import org.apache.sling.api.resource.ResourceResolverFactory; -import org.apache.sling.api.resource.ResourceUtil; import org.apache.sling.api.resource.ValueMap; import org.apache.sling.testing.resourceresolver.MockHelper; import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory; @@ -153,29 +150,4 @@ public class MergedResourceProviderTest { assertEquals("2", vm.get("e")); assertEquals("x", vm.get("b")); } - - @Test public void testSimpleCreateAndDelete() throws PersistenceException { - final String path = "/merged/a/new"; - try { - final Resource rsrc = this.provider.create(this.resolver, path, Collections.singletonMap("foo", (Object)"bla")); - assertNotNull(rsrc); - assertEquals(path, rsrc.getPath()); - final ValueMap vm = ResourceUtil.getValueMap(rsrc); - assertEquals("bla", vm.get("foo")); - - final Resource realResource = this.resolver.getResource("/apps/a/new"); - assertNotNull(realResource); - final ValueMap vmReal = ResourceUtil.getValueMap(realResource); - assertEquals("bla", vmReal.get("foo")); - assertNull(this.resolver.getResource("/libs/a/new")); - - this.provider.delete(this.resolver, path); - assertNull(this.provider.getResource(this.resolver, path)); - assertNull(this.resolver.getResource("/libs/a/new")); - assertNull(this.resolver.getResource("/apps/a/new")); - - } finally { - this.resolver.revert(); - } - } } -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
