This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.resourcemerger-1.0.0 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourcemerger.git
commit 861888312df60fa38490cbef5842cc4e6a14335c Author: Carsten Ziegeler <cziege...@apache.org> AuthorDate: Thu Jan 30 10:15:31 2014 +0000 SLING-2986 : Remove unneeded null checks for search path, add test for property merging git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/contrib/extensions/resourcemerger@1562762 13f79535-47bb-0310-9956-ffa450edef68 --- .../impl/MergedResourceProvider.java | 137 ++++++++--------- .../impl/MergedResourceProviderTest.java | 166 ++++++++++++++++++++- 2 files changed, 228 insertions(+), 75 deletions(-) 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 5ce1d25..a152c2f 100644 --- a/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProvider.java +++ b/src/main/java/org/apache/sling/resourcemerger/impl/MergedResourceProvider.java @@ -53,52 +53,49 @@ public class MergedResourceProvider implements ResourceProvider { * {@inheritDoc} */ public Resource getResource(final ResourceResolver resolver, final String path) { - if (resolver.getSearchPath() != null) { - final String relativePath = getRelativePath(path); - - if ( relativePath != null ) { - final List<String> mappedResources = new ArrayList<String>(); - // Loop over provided base paths - for (final String basePath : resolver.getSearchPath()) { - // Try to get the corresponding physical resource for this base path - final Resource baseRes = resolver.getResource(basePath + "/" + relativePath); - if (baseRes != null) { - // check if resource is hidden - boolean hidden = false; - final ValueMap props = ResourceUtil.getValueMap(baseRes); - if ( props.get(MergedResourceConstants.PN_HIDE_RESOURCE, Boolean.FALSE) ) { - hidden = true; - } - if ( !hidden ) { - // check parent - final ValueMap parentProps = ResourceUtil.getValueMap(baseRes.getParent()); - final String[] childrenToHideArray = parentProps.get(MergedResourceConstants.PN_HIDE_CHILDREN, String[].class); - if ( childrenToHideArray != null ) { - for(final String name : childrenToHideArray ) { - if ( name.equals(baseRes.getName()) || name.equals("*") ) { - hidden = true; - break; - } + final String relativePath = getRelativePath(path); + + if ( relativePath != null ) { + final List<String> mappedResources = new ArrayList<String>(); + // Loop over provided base paths + for (final String basePath : resolver.getSearchPath()) { + // Try to get the corresponding physical resource for this base path + final Resource baseRes = resolver.getResource(basePath + "/" + relativePath); + if (baseRes != null) { + // check if resource is hidden + boolean hidden = false; + final ValueMap props = ResourceUtil.getValueMap(baseRes); + if ( props.get(MergedResourceConstants.PN_HIDE_RESOURCE, Boolean.FALSE) ) { + hidden = true; + } + if ( !hidden ) { + // check parent + final ValueMap parentProps = ResourceUtil.getValueMap(baseRes.getParent()); + final String[] childrenToHideArray = parentProps.get(MergedResourceConstants.PN_HIDE_CHILDREN, String[].class); + if ( childrenToHideArray != null ) { + for(final String name : childrenToHideArray ) { + if ( name.equals(baseRes.getName()) || name.equals("*") ) { + hidden = true; + break; } } } - if ( !hidden ) { - // Physical resource exists, add it to the list of mapped resources - mappedResources.add(0, baseRes.getPath()); - } else { - mappedResources.clear(); - } + } + if ( !hidden ) { + // Physical resource exists, add it to the list of mapped resources + mappedResources.add(0, baseRes.getPath()); + } else { + mappedResources.clear(); } } + } - if (!mappedResources.isEmpty()) { - // Create a new merged resource based on the list of mapped physical resources - return new MergedResource(resolver, mergeRootPath, relativePath, mappedResources); - } + if (!mappedResources.isEmpty()) { + // Create a new merged resource based on the list of mapped physical resources + return new MergedResource(resolver, mergeRootPath, relativePath, mappedResources); } } - // Either base paths were not defined, or the resource does not exist in any of them return null; } @@ -108,48 +105,45 @@ public class MergedResourceProvider implements ResourceProvider { public Iterator<Resource> listChildren(final Resource resource) { final ResourceResolver resolver = resource.getResourceResolver(); - if (resolver.getSearchPath() != null) { - final String relativePath = getRelativePath(resource.getPath()); - - if ( relativePath != null ) { - final List<String> names = new ArrayList<String>(); - // Loop over provided base paths - for (final String basePath : resolver.getSearchPath()) { - final Resource baseResource = resolver.getResource(basePath + "/" + relativePath); - if ( baseResource != null ) { - for(final Resource child : baseResource.getChildren()) { - final String rsrcName = child.getName(); - if ( !names.contains(rsrcName) ) { - names.add(rsrcName); - } - // Check if children need reordering - int orderBeforeIndex = -1; - final ValueMap vm = ResourceUtil.getValueMap(child); - final String orderBefore = vm.get(MergedResourceConstants.PN_ORDER_BEFORE, String.class); - if (orderBefore != null && !orderBefore.equals(rsrcName)) { - // search entry - orderBeforeIndex = names.indexOf(orderBefore); - } + final String relativePath = getRelativePath(resource.getPath()); + + if ( relativePath != null ) { + final List<String> names = new ArrayList<String>(); + // Loop over provided base paths + for (final String basePath : resolver.getSearchPath()) { + final Resource baseResource = resolver.getResource(basePath + "/" + relativePath); + if ( baseResource != null ) { + for(final Resource child : baseResource.getChildren()) { + final String rsrcName = child.getName(); + if ( !names.contains(rsrcName) ) { + names.add(rsrcName); + } + // Check if children need reordering + int orderBeforeIndex = -1; + final ValueMap vm = ResourceUtil.getValueMap(child); + final String orderBefore = vm.get(MergedResourceConstants.PN_ORDER_BEFORE, String.class); + if (orderBefore != null && !orderBefore.equals(rsrcName)) { + // search entry + orderBeforeIndex = names.indexOf(orderBefore); + } - if (orderBeforeIndex > -1) { - names.add(orderBeforeIndex, rsrcName); - names.remove(names.size() - 1); - } + if (orderBeforeIndex > -1) { + names.add(orderBeforeIndex, rsrcName); + names.remove(names.size() - 1); } } } - final List<Resource> children = new ArrayList<Resource>(); - for(final String name : names) { - final Resource mergedResource = this.getResource(resolver, resource.getPath() + "/" + name); - if ( mergedResource != null ) { - children.add(mergedResource); - } + } + final List<Resource> children = new ArrayList<Resource>(); + for(final String name : names) { + final Resource mergedResource = this.getResource(resolver, resource.getPath() + "/" + name); + if ( mergedResource != null ) { + children.add(mergedResource); } - return children.iterator(); } + return children.iterator(); } - // Return null for resources that aren't a MergedResource return null; } @@ -170,5 +164,4 @@ public class MergedResourceProvider implements ResourceProvider { } return null; } - } 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 bde3a55..e4e4185 100644 --- a/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java +++ b/src/test/java/org/apache/sling/resourcemerger/impl/MergedResourceProviderTest.java @@ -23,12 +23,19 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; 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.LoginException; +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.ValueMap; import org.apache.sling.testing.resourceresolver.MockResourceResolverFactory; import org.junit.Before; import org.junit.Test; @@ -41,7 +48,7 @@ public class MergedResourceProviderTest { @Before public void setup() throws Exception { final ResourceResolverFactory factory = new MockResourceResolverFactory(); - this.resolver = factory.getAdministrativeResourceResolver(null); + this.resolver = new ResourceResolverWrapper(factory.getAdministrativeResourceResolver(null)); final Resource root = this.resolver.getResource("/"); final Resource apps = this.resolver.create(root, "apps", null); final Resource libs = this.resolver.create(root, "libs", null); @@ -49,8 +56,8 @@ public class MergedResourceProviderTest { final Resource appsA = this.resolver.create(apps, "a", null); final Resource libsA = this.resolver.create(libs, "a", null); - this.resolver.create(appsA, "1", null); - this.resolver.create(libsA, "1", null); + this.resolver.create(appsA, "1", new map().p("a", "1").p("b", "2")); + this.resolver.create(libsA, "1", new map().p("a", "5").p("c", "2")); this.resolver.create(appsA, "2", null); this.resolver.create(libsA, "2", null); this.resolver.create(appsA, "X", null); @@ -76,4 +83,157 @@ public class MergedResourceProviderTest { assertTrue(names.contains("Y")); assertTrue(names.contains("X")); } + + @Test public void testProperties() { + final Resource rsrcA1 = this.provider.getResource(this.resolver, "/merged/a/1"); + final ValueMap vm = rsrcA1.adaptTo(ValueMap.class); + assertNotNull(vm); + assertEquals(3, vm.size()); + assertEquals("1", vm.get("a")); + assertEquals("2", vm.get("b")); + assertEquals("2", vm.get("c")); + } + + protected static final class map extends HashMap<String, Object> { + + private static final long serialVersionUID = 1L; + + public map p(final String name, final String value) { + this.put(name, value); + return this; + } + } + + /** + * We have to use a wrapper until Sling testing resource resolver mock 0.2.0 is out + * Fixing SLING-3354 + */ + public static class ResourceResolverWrapper implements ResourceResolver { + + private final ResourceResolver resolver; + + public ResourceResolverWrapper(final ResourceResolver r) { + this.resolver = r; + } + + public <AdapterType> AdapterType adaptTo(Class<AdapterType> type) { + return resolver.adaptTo(type); + } + + public Resource resolve(HttpServletRequest request, String absPath) { + return resolver.resolve(request, absPath); + } + + public Resource resolve(String absPath) { + return resolver.resolve(absPath); + } + + public Resource resolve(HttpServletRequest request) { + return resolver.resolve(request); + } + + public String map(String resourcePath) { + return resolver.map(resourcePath); + } + + public String map(HttpServletRequest request, String resourcePath) { + return resolver.map(request, resourcePath); + } + + public Resource getResource(String path) { + return resolver.getResource(path); + } + + public Resource getResource(Resource base, String path) { + return resolver.getResource(base, path); + } + + public String[] getSearchPath() { + return new String[] {"/apps", "/libs"}; + } + + public Iterator<Resource> listChildren(Resource parent) { + return resolver.listChildren(parent); + } + + public Iterable<Resource> getChildren(Resource parent) { + return resolver.getChildren(parent); + } + + public Iterator<Resource> findResources(String query, String language) { + return resolver.findResources(query, language); + } + + public Iterator<Map<String, Object>> queryResources(String query, + String language) { + return resolver.queryResources(query, language); + } + + public boolean hasChildren(Resource resource) { + return resolver.hasChildren(resource); + } + + public ResourceResolver clone(Map<String, Object> authenticationInfo) + throws LoginException { + return resolver.clone(authenticationInfo); + } + + public boolean isLive() { + return resolver.isLive(); + } + + public void close() { + resolver.close(); + } + + public String getUserID() { + return resolver.getUserID(); + } + + public Iterator<String> getAttributeNames() { + return resolver.getAttributeNames(); + } + + public Object getAttribute(String name) { + return resolver.getAttribute(name); + } + + public void delete(Resource resource) throws PersistenceException { + resolver.delete(resource); + } + + public Resource create(Resource parent, String name, + Map<String, Object> properties) throws PersistenceException { + return resolver.create(parent, name, properties); + } + + public void revert() { + resolver.revert(); + } + + public void commit() throws PersistenceException { + resolver.commit(); + } + + public boolean hasChanges() { + return resolver.hasChanges(); + } + + public String getParentResourceType(Resource resource) { + return resolver.getParentResourceType(resource); + } + + public String getParentResourceType(String resourceType) { + return resolver.getParentResourceType(resourceType); + } + + public boolean isResourceType(Resource resource, String resourceType) { + return resolver.isResourceType(resource, resourceType); + } + + public void refresh() { + resolver.refresh(); + } + + } } -- To stop receiving notification emails like this one, please contact "commits@sling.apache.org" <commits@sling.apache.org>.