blob: 450faa7ce1f1e584fdc85fd73c322649a895b546 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.sling.servlets.resolver.internal.helper;
import static org.apache.sling.api.servlets.ServletResolverConstants.DEFAULT_RESOURCE_TYPE;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceUtil;
import org.apache.sling.commons.testing.sling.MockResource;
public class LocationIteratorTest extends HelperTestBase {
private LocationIterator getLocationIterator(final String resourceType,
final String resourceSuperType) {
return this.getLocationIterator(resourceType, resourceSuperType, DEFAULT_RESOURCE_TYPE);
}
private LocationIterator getLocationIterator(final String resourceType,
final String resourceSuperType,
final String baseResourceType) {
final LocationIterator li = new LocationIterator(resourceType,
resourceSuperType,
baseResourceType,
this.resourceResolver);
return li;
}
public void testSearchPathEmpty() {
// expect path gets { "/" }
resourceResolver.setSearchPath((String[]) null);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /foo/bar
assertTrue(li.hasNext());
assertEquals("/" + resourceTypePath, li.next());
// 2. /sling/servlet/default
assertTrue(li.hasNext());
assertEquals("/" + DEFAULT_RESOURCE_TYPE, li.next());
// 3. finished
assertFalse(li.hasNext());
}
public void testSearchPath1Element() {
String root0 = "/apps";
resourceResolver.setSearchPath(root0);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /apps/foo/bar
assertTrue(li.hasNext());
assertEquals(root0 + "/" + resourceTypePath, li.next());
// 2. /apps/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 3. finished
assertFalse(li.hasNext());
}
public void testSearchPath2Elements() {
String root0 = "/apps";
String root1 = "/libs";
resourceResolver.setSearchPath(root0, root1);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /apps/foo/bar
assertTrue(li.hasNext());
assertEquals(root0 + "/" + resourceTypePath, li.next());
// 2. /libs/foo/bar
assertTrue(li.hasNext());
assertEquals(root1 + "/" + resourceTypePath, li.next());
// 3. /apps/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 4. /libs/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 5. finished
assertFalse(li.hasNext());
}
public void testSearchPathEmptyAbsoluteType() {
// expect path gets { "/" }
resourceResolver.setSearchPath((String[]) null);
// absolute resource type
resourceType = "/foo/bar";
resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
resource.setResourceType(resourceType);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /foo/bar
assertTrue(li.hasNext());
assertEquals(resourceTypePath, li.next());
// 2. /sling/servlet/default
assertTrue(li.hasNext());
assertEquals("/" + DEFAULT_RESOURCE_TYPE, li.next());
// 3. finished
assertFalse(li.hasNext());
}
public void testSearchPath1ElementAbsoluteType() {
String root0 = "/apps";
resourceResolver.setSearchPath(root0);
// absolute resource type
resourceType = "/foo/bar";
resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
resource.setResourceType(resourceType);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /foo/bar
assertTrue(li.hasNext());
assertEquals(resourceTypePath, li.next());
// 2. /apps/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 3. finished
assertFalse(li.hasNext());
}
public void testSearchPath2ElementsAbsoluteType() {
String root0 = "/apps";
String root1 = "/libs";
resourceResolver.setSearchPath(root0, root1);
// absolute resource type
resourceType = "/foo/bar";
resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
resource.setResourceType(resourceType);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /foo/bar
assertTrue(li.hasNext());
assertEquals(resourceTypePath, li.next());
// 2. /apps/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 3. /libs/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 4. finished
assertFalse(li.hasNext());
}
public void testSearchPathEmptyWithSuper() {
// expect path gets { "/" }
resourceResolver.setSearchPath((String[]) null);
// set resource super type
resourceSuperType = "foo:superBar";
resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
resource.setResourceSuperType(resourceSuperType);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /foo/bar
assertTrue(li.hasNext());
assertEquals("/" + resourceTypePath, li.next());
// 2. /foo/superBar
assertTrue(li.hasNext());
assertEquals("/" + resourceSuperTypePath, li.next());
// 3. /sling/servlet/default
assertTrue(li.hasNext());
assertEquals("/" + DEFAULT_RESOURCE_TYPE, li.next());
// 4. finished
assertFalse(li.hasNext());
}
public void testSearchPath1ElementWithSuper() {
String root0 = "/apps";
resourceResolver.setSearchPath(root0);
// set resource super type
resourceSuperType = "foo:superBar";
resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
resource.setResourceSuperType(resourceSuperType);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /apps/foo/bar
assertTrue(li.hasNext());
assertEquals(root0 + "/" + resourceTypePath, li.next());
// 2. /apps/foo/superBar
assertTrue(li.hasNext());
assertEquals(root0 + "/" + resourceSuperTypePath, li.next());
// 3. /apps/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 4. finished
assertFalse(li.hasNext());
}
public void testSearchPath2ElementsWithSuper() {
String root0 = "/apps";
String root1 = "/libs";
resourceResolver.setSearchPath(root0, root1);
// set resource super type
resourceSuperType = "foo:superBar";
resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
resource.setResourceSuperType(resourceSuperType);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /apps/foo/bar
assertTrue(li.hasNext());
assertEquals(root0 + "/" + resourceTypePath, li.next());
// 2. /libs/foo/bar
assertTrue(li.hasNext());
assertEquals(root1 + "/" + resourceTypePath, li.next());
// 3. /apps/foo/superBar
assertTrue(li.hasNext());
assertEquals(root0 + "/" + resourceSuperTypePath, li.next());
// 4. /libs/foo/superBar
assertTrue(li.hasNext());
assertEquals(root1 + "/" + resourceSuperTypePath, li.next());
// 5. /apps/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 6. /libs/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 7. finished
assertFalse(li.hasNext());
}
public void testSearchPathEmptyAbsoluteTypeWithSuper() {
// expect path gets { "/" }
resourceResolver.setSearchPath((String[]) null);
// absolute resource type
resourceType = "/foo/bar";
resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
resource.setResourceType(resourceType);
// set resource super type
resourceSuperType = "foo:superBar";
resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
resource.setResourceSuperType(resourceSuperType);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /foo/bar
assertTrue(li.hasNext());
assertEquals(resourceTypePath, li.next());
// 2. /foo/superBar
assertTrue(li.hasNext());
assertEquals("/" + resourceSuperTypePath, li.next());
// 3. /sling/servlet/default
assertTrue(li.hasNext());
assertEquals("/" + DEFAULT_RESOURCE_TYPE, li.next());
// 4. finished
assertFalse(li.hasNext());
}
public void testSearchPath1ElementAbsoluteTypeWithSuper() {
String root0 = "/apps";
resourceResolver.setSearchPath(root0);
// absolute resource type
resourceType = "/foo/bar";
resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
resource.setResourceType(resourceType);
// set resource super type
resourceSuperType = "foo:superBar";
resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
resource.setResourceSuperType(resourceSuperType);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /foo/bar
assertTrue(li.hasNext());
assertEquals(resourceTypePath, li.next());
// 2. /apps/foo/superBar
assertTrue(li.hasNext());
assertEquals(root0 + "/" + resourceSuperTypePath, li.next());
// 3. /apps/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 4. finished
assertFalse(li.hasNext());
}
public void testSearchPath2ElementsAbsoluteTypeWithSuper() {
String root0 = "/apps";
String root1 = "/libs";
resourceResolver.setSearchPath(root0, root1);
// absolute resource type
resourceType = "/foo/bar";
resourceTypePath = ResourceUtil.resourceTypeToPath(resourceType);
resource.setResourceType(resourceType);
// set resource super type
resourceSuperType = "foo:superBar";
resourceSuperTypePath = ResourceUtil.resourceTypeToPath(resourceSuperType);
resource.setResourceSuperType(resourceSuperType);
final Resource r = request.getResource();
LocationIterator li = getLocationIterator(r.getResourceType(),
r.getResourceSuperType());
// 1. /foo/bar
assertTrue(li.hasNext());
assertEquals(resourceTypePath, li.next());
// 2. /apps/foo/superBar
assertTrue(li.hasNext());
assertEquals(root0 + "/" + resourceSuperTypePath, li.next());
// 3. /libs/foo/superBar
assertTrue(li.hasNext());
assertEquals(root1 + "/" + resourceSuperTypePath, li.next());
// 4. /apps/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 5. /libs/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 6. finished
assertFalse(li.hasNext());
}
public void testScriptNameWithoutResourceType() {
String root0 = "/apps";
String root1 = "/libs";
resourceResolver.setSearchPath(root0, root1);
LocationIterator li = getLocationIterator("",
null,
"");
assertTrue(li.hasNext());
assertEquals("/apps/", li.next());
assertTrue(li.hasNext());
assertEquals("/libs/", li.next());
assertFalse(li.hasNext());
}
public void testScriptNameWithResourceType() {
String root0 = "/apps";
String root1 = "/libs";
resourceResolver.setSearchPath(root0, root1);
LocationIterator li = getLocationIterator("a/b",
null);
assertTrue(li.hasNext());
assertEquals(root0 + "/a/b", li.next());
assertTrue(li.hasNext());
assertEquals(root1 + "/a/b", li.next());
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
assertTrue(li.hasNext());
assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
assertFalse(li.hasNext());
}
public void testScriptNameWithResourceTypeAndSuperType() {
String root0 = "/apps";
String root1 = "/libs";
resourceResolver.setSearchPath(root0, root1);
LocationIterator li = getLocationIterator("a/b",
"c/d");
assertTrue(li.hasNext());
assertEquals(root0 + "/a/b", li.next());
assertTrue(li.hasNext());
assertEquals(root1 + "/a/b", li.next());
assertTrue(li.hasNext());
assertEquals(root0 + "/c/d", li.next());
assertTrue(li.hasNext());
assertEquals(root1 + "/c/d", li.next());
assertTrue(li.hasNext());
assertEquals(root0 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
assertTrue(li.hasNext());
assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
assertFalse(li.hasNext());
}
public void testCircularResourceTypeHierarchy() {
final String root1 = "/libs";
resourceResolver.setSearchPath(root1);
// resource type and super type for start resource
final String resourceType = "foo/bar";
final String resourceSuperType = "foo/check1";
final String resourceSuperType2 = "foo/check2";
final Resource resource2 = new MockResource(resourceResolver,
root1 + '/' + resourceSuperType,
resourceType, resourceSuperType2);
resourceResolver.addResource(resource2);
final Resource resource3 = new MockResource(resourceResolver,
root1 + '/' + resourceSuperType2,
resourceType, resourceType);
resourceResolver.addResource(resource3);
LocationIterator li = getLocationIterator(resourceType,
resourceSuperType);
// 1. /libs/foo/bar
assertTrue(li.hasNext());
assertEquals(root1 + '/' + resourceType, li.next());
// 1. /libs/foo/check1
assertTrue(li.hasNext());
assertEquals(root1 + "/" + resourceSuperType, li.next());
// 3. /libs/foo/check2
assertTrue(li.hasNext());
assertEquals(root1 + "/" + resourceSuperType2, li.next());
// 4. /libs/sling/servlet/default
assertTrue(li.hasNext());
assertEquals(root1 + "/" + DEFAULT_RESOURCE_TYPE, li.next());
// 5. finished
assertFalse(li.hasNext());
}
}