From static to instance-based PathContainer#subPath
This commit is contained in:
parent
9f7d57f933
commit
2f17c5f3b6
|
@ -69,7 +69,7 @@ class DefaultRequestPath implements RequestPath {
|
|||
counter += ((Segment) element).semicolonContent().length();
|
||||
}
|
||||
if (length == counter) {
|
||||
return DefaultPathContainer.subPath(path, 0, i + 1);
|
||||
return path.subPath(0, i + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -79,7 +79,7 @@ class DefaultRequestPath implements RequestPath {
|
|||
}
|
||||
|
||||
private static PathContainer extractPathWithinApplication(PathContainer fullPath, PathContainer contextPath) {
|
||||
return PathContainer.subPath(fullPath, contextPath.elements().size());
|
||||
return fullPath.subPath(contextPath.elements().size());
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -22,16 +22,21 @@ import java.util.List;
|
|||
import org.springframework.util.MultiValueMap;
|
||||
|
||||
/**
|
||||
* Structured path representation.
|
||||
* Structured representation of a path whose {@link Element Elements} are
|
||||
* accessible as a sequence of either {@link Separator Separator} and/or
|
||||
* {@link Segment Segment} (element) types.
|
||||
*
|
||||
* <p>Typically consumed via {@link ServerHttpRequest#getPath()} but can also
|
||||
* be created by parsing a path value via {@link #parse(String, Charset)}.
|
||||
* <p>Each {@code Segment} exposes its own structure decoded safely without the
|
||||
* risk of encoded reserved characters altering the path or segment structure.
|
||||
*
|
||||
* <p>An instance of this class can also be created via
|
||||
* {@link #parse(String, Charset)}. The path for an HTTP request is parsed once
|
||||
* and subsequently accessible via {@link ServerHttpRequest#getPath()}.
|
||||
*
|
||||
* @author Rossen Stoyanchev
|
||||
*/
|
||||
public interface PathContainer {
|
||||
|
||||
|
||||
/**
|
||||
* The original, raw (encoded) path value including path parameters.
|
||||
*/
|
||||
|
@ -42,6 +47,26 @@ public interface PathContainer {
|
|||
*/
|
||||
List<Element> elements();
|
||||
|
||||
/**
|
||||
* Extract a sub-path from the given offset into the elements list.
|
||||
* @param index the start element index (inclusive)
|
||||
* @return the sub-path
|
||||
*/
|
||||
default PathContainer subPath(int index) {
|
||||
return subPath(index, elements().size());
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract a sub-path from the given start offset (inclusive) into the
|
||||
* element list and to the end offset (exclusive).
|
||||
* @param startIndex the start element index (inclusive)
|
||||
* @param endIndex the end element index (exclusive)
|
||||
* @return the sub-path
|
||||
*/
|
||||
default PathContainer subPath(int startIndex, int endIndex) {
|
||||
return DefaultPathContainer.subPath(this, startIndex, endIndex);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Parse the given path value into a {@link PathContainer}.
|
||||
|
@ -53,29 +78,10 @@ public interface PathContainer {
|
|||
return DefaultPathContainer.parsePath(path, encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract a sub-path from the given offset into the path elements list.
|
||||
* @param path the path to extract from
|
||||
* @param index the start element index (inclusive)
|
||||
* @return the sub-path
|
||||
*/
|
||||
static PathContainer subPath(PathContainer path, int index) {
|
||||
return subPath(path, index, path.elements().size());
|
||||
}
|
||||
|
||||
/**
|
||||
* Extract a sub-path from the given start offset (inclusive) into the path
|
||||
* element list and to the end offset (exclusive).
|
||||
* @param path the path to extract from
|
||||
* @param startIndex the start element index (inclusive)
|
||||
* @param endIndex the end element index (exclusive)
|
||||
* @return the sub-path
|
||||
* Common representation of a path element, e.g. separator or segment.
|
||||
*/
|
||||
static PathContainer subPath(PathContainer path, int startIndex, int endIndex) {
|
||||
return DefaultPathContainer.subPath(path, startIndex, endIndex);
|
||||
}
|
||||
|
||||
|
||||
interface Element {
|
||||
|
||||
/**
|
||||
|
@ -86,14 +92,14 @@ public interface PathContainer {
|
|||
|
||||
|
||||
/**
|
||||
* A path separator element.
|
||||
* Path separator element.
|
||||
*/
|
||||
interface Separator extends Element {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* A path segment element.
|
||||
* Path segment element.
|
||||
*/
|
||||
interface Segment extends Element {
|
||||
|
||||
|
|
|
@ -205,7 +205,7 @@ public class PathPattern implements Comparable<PathPattern> {
|
|||
info = new PathRemainingMatchInfo(EMPTY_PATH, matchingContext.getPathMatchResult());
|
||||
}
|
||||
else {
|
||||
info = new PathRemainingMatchInfo(PathContainer.subPath(pathContainer, matchingContext.remainingPathIndex),
|
||||
info = new PathRemainingMatchInfo(pathContainer.subPath(matchingContext.remainingPathIndex),
|
||||
matchingContext.getPathMatchResult());
|
||||
}
|
||||
return info;
|
||||
|
|
|
@ -127,17 +127,17 @@ public class DefaultPathContainerTests {
|
|||
public void subPath() throws Exception {
|
||||
// basic
|
||||
PathContainer path = PathContainer.parse("/a/b/c", UTF_8);
|
||||
assertSame(path, PathContainer.subPath(path, 0));
|
||||
assertEquals("/b/c", PathContainer.subPath(path, 2).value());
|
||||
assertEquals("/c", PathContainer.subPath(path, 4).value());
|
||||
assertSame(path, path.subPath(0));
|
||||
assertEquals("/b/c", path.subPath(2).value());
|
||||
assertEquals("/c", path.subPath(4).value());
|
||||
|
||||
// root path
|
||||
path = PathContainer.parse("/", UTF_8);
|
||||
assertEquals("/", PathContainer.subPath(path, 0).value());
|
||||
assertEquals("/", path.subPath(0).value());
|
||||
|
||||
// trailing slash
|
||||
path = PathContainer.parse("/a/b/", UTF_8);
|
||||
assertEquals("/b/", PathContainer.subPath(path, 2).value());
|
||||
assertEquals("/b/", path.subPath(2).value());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -215,7 +215,7 @@ public class ResourceUrlProvider implements ApplicationListener<ContextRefreshed
|
|||
.map(entry -> {
|
||||
PathContainer path = entry.getKey().extractPathWithinPattern(lookupPath);
|
||||
int endIndex = lookupPath.elements().size() - path.elements().size();
|
||||
PathContainer mapping = PathContainer.subPath(lookupPath, 0, endIndex);
|
||||
PathContainer mapping = lookupPath.subPath(0, endIndex);
|
||||
if (logger.isTraceEnabled()) {
|
||||
logger.trace("Invoking ResourceResolverChain for URL pattern " +
|
||||
"\"" + entry.getKey() + "\"");
|
||||
|
|
Loading…
Reference in New Issue