This is an automated email from the ASF dual-hosted git repository. rombert pushed a commit to annotated tag org.apache.sling.resourceresolver-1.0.2 in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-resourceresolver.git
commit 62fe67a08fb2950671168526e36d59fcf2ca32a5 Author: Justin Edelson <jus...@apache.org> AuthorDate: Wed Nov 14 21:42:35 2012 +0000 SLING-2665 - allow the default redirect status code to be configured git-svn-id: https://svn.apache.org/repos/asf/sling/trunk/bundles/resourceresolver@1409439 13f79535-47bb-0310-9956-ffa450edef68 --- .../impl/ResourceResolverFactoryActivator.java | 11 ++++ .../impl/ResourceResolverFactoryImpl.java | 4 ++ .../impl/mapping/MapConfigurationProvider.java | 2 + .../resourceresolver/impl/mapping/MapEntries.java | 8 ++- .../OSGI-INF/metatype/metatype.properties | 7 ++- .../impl/mapping/MapEntriesTest.java | 73 ++++++++++++++++++++-- 6 files changed, 96 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java index 6581290..cf019a8 100644 --- a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java +++ b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryActivator.java @@ -119,6 +119,9 @@ public class ResourceResolverFactoryActivator { @Property(value = MapEntries.DEFAULT_MAP_ROOT) private static final String PROP_MAP_LOCATION = "resource.resolver.map.location"; + @Property(intValue = MapEntries.DEFAULT_DEFAULT_VANITY_PATH_REDIRECT_STATUS) + private static final String PROP_DEFAULT_VANITY_PATH_REDIRECT_STATUS = "resource.resolver.default.vanity.redirect.status"; + /** Tracker for the resource decorators. */ private final ResourceDecoratorTracker resourceDecoratorTracker = new ResourceDecoratorTracker(); @@ -156,6 +159,8 @@ public class ResourceResolverFactoryActivator { /** ComponentContext */ private ComponentContext componentContext; + private int defaultVanityPathRedirectStatus; + private final FactoryPreconditions preconds = new FactoryPreconditions(); /** @@ -203,6 +208,10 @@ public class ResourceResolverFactoryActivator { return mapRoot; } + public int getDefaultVanityPathRedirectStatus() { + return defaultVanityPathRedirectStatus; + } + // ---------- SCR Integration --------------------------------------------- /** Activates this component, called by SCR before registering as a service */ @@ -263,6 +272,8 @@ public class ResourceResolverFactoryActivator { // the root of the resolver mappings mapRoot = PropertiesUtil.toString(properties.get(PROP_MAP_LOCATION), MapEntries.DEFAULT_MAP_ROOT); + defaultVanityPathRedirectStatus = PropertiesUtil.toInteger(properties.get(PROP_DEFAULT_VANITY_PATH_REDIRECT_STATUS), MapEntries.DEFAULT_DEFAULT_VANITY_PATH_REDIRECT_STATUS); + final BundleContext bc = componentContext.getBundleContext(); // check for required property diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryImpl.java b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryImpl.java index 5565d72..7d1f2f8 100644 --- a/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryImpl.java +++ b/src/main/java/org/apache/sling/resourceresolver/impl/ResourceResolverFactoryImpl.java @@ -161,4 +161,8 @@ public class ResourceResolverFactoryImpl implements ResourceResolverFactory, Map public RootResourceProviderEntry getRootProviderEntry() { return this.activator.getRootProviderEntry(); } + + public int getDefaultVanityPathRedirectStatus() { + return this.activator.getDefaultVanityPathRedirectStatus(); + } } \ No newline at end of file diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java index 28767e2..3990bf0 100644 --- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java +++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapConfigurationProvider.java @@ -35,4 +35,6 @@ public interface MapConfigurationProvider extends ResourceResolverFactory { Mapping[] getMappings(); + int getDefaultVanityPathRedirectStatus(); + } diff --git a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java index 098a2b5..1c22135 100644 --- a/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java +++ b/src/main/java/org/apache/sling/resourceresolver/impl/mapping/MapEntries.java @@ -77,6 +77,8 @@ public class MapEntries implements EventHandler { public static final String DEFAULT_MAP_ROOT = "/etc/map"; + public static final int DEFAULT_DEFAULT_VANITY_PATH_REDIRECT_STATUS = HttpServletResponse.SC_FOUND; + private static final String JCR_SYSTEM_PREFIX = "/jcr:system/"; static final String ANY_SCHEME_HOST = "[^/]+/[^/]+"; @@ -569,11 +571,11 @@ public class MapEntries implements EventHandler { final String redirect = redirectTarget.getPath(); final String redirectName = redirectTarget.getName(); - // whether the target is attained by a 302/FOUND or by an - // internal redirect is defined by the sling:redirect + // whether the target is attained by a external redirect or + // by an internal redirect is defined by the sling:redirect // property final int status = props.get("sling:redirect", false) ? props.get( - PROP_REDIRECT_EXTERNAL_REDIRECT_STATUS, HttpServletResponse.SC_FOUND) + PROP_REDIRECT_EXTERNAL_REDIRECT_STATUS, factory.getDefaultVanityPathRedirectStatus()) : -1; final String checkPath = result[1]; diff --git a/src/main/resources/OSGI-INF/metatype/metatype.properties b/src/main/resources/OSGI-INF/metatype/metatype.properties index 6512548..1b820a5 100644 --- a/src/main/resources/OSGI-INF/metatype/metatype.properties +++ b/src/main/resources/OSGI-INF/metatype/metatype.properties @@ -76,4 +76,9 @@ resource.resolver.required.providers.name = Required Providers resource.resolver.required.providers.description = A resource resolver factory is only \ available (registered) if all resource providers mentioned in this configuration \ are available. Each entry is either a service PID or a filter expression. \ - Invalid filters are ignored. \ No newline at end of file + Invalid filters are ignored. + +resource.resolver.default.vanity.redirect.status.name = Default Vanity Path Redirect Status +resource.resolver.default.vanity.redirect.status.description = The default status code \ + used when a sling:vanityPath is configured to redirect and does not have a specific \ + status code associated with it (via a sling:redirectStatus property) \ No newline at end of file diff --git a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java index a3677ef..8f9540a 100644 --- a/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java +++ b/src/test/java/org/apache/sling/resourceresolver/impl/mapping/MapEntriesTest.java @@ -20,9 +20,12 @@ import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; +import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; +import java.util.HashMap; import java.util.Iterator; +import java.util.List; import java.util.Map; import org.apache.sling.api.resource.Resource; @@ -75,7 +78,7 @@ public class MapEntriesTest { when(result.getParent()).thenReturn(parent); when(result.getPath()).thenReturn("/parent/child"); when(result.getName()).thenReturn("child"); - when(result.adaptTo(ValueMap.class)).thenReturn(singletonValueMap("sling:alias", "alias")); + when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias")); when(resourceResolver.findResources(anyString(), eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() { @@ -105,13 +108,13 @@ public class MapEntriesTest { when(result.getParent()).thenReturn(parent); when(result.getPath()).thenReturn("/parent/child"); when(result.getName()).thenReturn("child"); - when(result.adaptTo(ValueMap.class)).thenReturn(singletonValueMap("sling:alias", "alias")); + when(result.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias")); final Resource secondResult = mock(Resource.class); when(secondResult.getParent()).thenReturn(parent); when(secondResult.getPath()).thenReturn("/parent/child2"); when(secondResult.getName()).thenReturn("child2"); - when(secondResult.adaptTo(ValueMap.class)).thenReturn(singletonValueMap("sling:alias", "alias")); + when(secondResult.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:alias", "alias")); when(resourceResolver.findResources(anyString(), eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() { @@ -132,8 +135,68 @@ public class MapEntriesTest { assertEquals("child", aliasMap.get("alias")); } - private ValueMap singletonValueMap(String key, String value) { - return new ValueMapDecorator(Collections.<String, Object> singletonMap(key, value)); + @Test + public void test_vanity_path_registration() { + // specifically making this a weird value because we want to verify that + // the configuration value is being used + int DEFAULT_VANITY_STATUS = 333333; + + when(resourceResolverFactory.getDefaultVanityPathRedirectStatus()).thenReturn(DEFAULT_VANITY_STATUS); + + final List<Resource> resources = new ArrayList<Resource>(); + + Resource justVanityPath = mock(Resource.class); + when(justVanityPath.getPath()).thenReturn("/justVanityPath"); + when(justVanityPath.getName()).thenReturn("justVanityPath"); + when(justVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/justVanityPath")); + resources.add(justVanityPath); + + Resource redirectingVanityPath = mock(Resource.class); + when(redirectingVanityPath.getPath()).thenReturn("/redirectingVanityPath"); + when(redirectingVanityPath.getName()).thenReturn("redirectingVanityPath"); + when(redirectingVanityPath.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/redirectingVanityPath", "sling:redirect", true)); + resources.add(redirectingVanityPath); + + Resource redirectingVanityPath301 = mock(Resource.class); + when(redirectingVanityPath301.getPath()).thenReturn("/redirectingVanityPath301"); + when(redirectingVanityPath301.getName()).thenReturn("redirectingVanityPath301"); + when(redirectingVanityPath301.adaptTo(ValueMap.class)).thenReturn(buildValueMap("sling:vanityPath", "/target/redirectingVanityPath301", "sling:redirect", true, "sling:redirectStatus", 301)); + resources.add(redirectingVanityPath301); + + when(resourceResolver.findResources(anyString(), eq("sql"))).thenAnswer(new Answer<Iterator<Resource>>() { + + public Iterator<Resource> answer(InvocationOnMock invocation) throws Throwable { + if (invocation.getArguments()[0].toString().contains("sling:vanityPath")) { + return resources.iterator(); + } else { + return Collections.<Resource> emptySet().iterator(); + } + } + }); + + mapEntries.doInit(); + + List<MapEntry> entries = mapEntries.getResolveMaps(); + assertEquals(6, entries.size()); + for (MapEntry entry : entries) { + if (entry.getPattern().contains("/target/redirectingVanityPath301")) { + assertEquals(301, entry.getStatus()); + assertFalse(entry.isInternal()); + } else if (entry.getPattern().contains("/target/redirectingVanityPath")) { + assertEquals(DEFAULT_VANITY_STATUS, entry.getStatus()); + assertFalse(entry.isInternal()); + } else if (entry.getPattern().contains("/target/justVanityPath")) { + assertTrue(entry.isInternal()); + } + } + } + + private ValueMap buildValueMap(Object... string) { + final Map<String, Object> data = new HashMap<String, Object>(); + for (int i = 0; i < string.length; i = i + 2) { + data.put((String) string[i], string[i+1]); + } + return new ValueMapDecorator(data); } } -- To stop receiving notification emails like this one, please contact "commits@sling.apache.org" <commits@sling.apache.org>.