...
Code Block |
---|
String path = ...; // the absolute path Resource current = getResource("/"); String[] segements = path.split("/"); for (String segment: segments) { Resource child = getResource(current, segement); if (child == null) { Iterator<Resource> children = listChildren(current); current = null; while (children.hasNext()) { child = children.next(); if (segment.equals(getSlingAlias(child))) { current = child; break; } } if (current == null) { // fail break; } } else { current = child; } } |
Redirection Values
The result of matching the request path and getting the redirection is either a path into the resource tree or another URL. If the result is an URL, it is converted into a path again and matched against the mapping entries. This may be taking place repeatedly until an absolute or relative path into the resource tree results.
The following pseudo code summarizes this behaviour:
Code Block |
---|
String path = ....;
String result = path;
do {
result = applyMapEntries(result);
} while (isURL(result));
|
As soon as the result of applying the map entries is an absolute or relative path (or no more map entries match), Root Level Mapping terminates and the next step in resource resolution, resource tree access, takes place.
Resource Tree Access
The result of Root Level Mapping is an absolute or relative path to a resource. If the path is relative – e.g. myproject/docroot/sample.gif
– the resource resolver search path (ResourceResolver.getSearchPath()
is used to build absolute paths and resolve the resource. In this case the first resource found is used. If the result of Root Level Mapping is an absolute path, the path is used as is.
Accessing the resource tree after applying the Root Level Mappings has four options:
- Check whether the path addresses a so called Star Resource. A Star Resource is a resource whose path ends with or contains
/*
. Such resources are used by theSlingPostServlet
to create new content below an existing resource. If the path after Root Level Mapping is absolute, it is made absolute by prepending the first search path entry. - Check whether the path exists in the repository. if the path is absolute, it is tried directly. Otherwise the search path entries are prepended to the path until a resource is found or the search path is exhausted without finding a resource.
- Drill down the resource tree starting from the root, optionally using the search path until a resource is found.
- If no resource can be resolved, a Missing Resource is returned.
Drilling Down the Resource Tree
Drilling down the resource tree starts at the root and for each segement in the path checks whether a child resource of the given name exists or not. If not, a child resource is looked up, which has a sling:alias
property whose value matches the given name. If neither exists, the search is terminated and the resource cannot be resolved.
The following pseudo code shows this algorithm assuming the path is absolute:
Code Block |
---|
String path = ...; // the absolute path
Resource current = getResource("/");
String[] segements = path.split("/");
for (String segment: segments) {
Resource child = getResource(current, segement);
if (child == null) {
Iterator<Resource> children = listChildren(current);
current = null;
while (children.hasNext()) {
child = children.next();
if (segment.equals(getSlingAlias(child))) {
current = child;
break;
}
}
if (current == null) {
// fail
break;
}
} else {
current = child;
}
}
|