in src/main/java/org/apache/sling/api/resource/path/Path.java [115:160]
public boolean matches(final String otherPath) {
if ( otherPath.startsWith(GLOB_PREFIX) ) {
if ( this.isPattern ) {
// both are patterns, then they must be equal.
// need to compare Pattern.pattern() as that class does
// not implement a semantic equals(...) method
final Path oPath = new Path(otherPath);
return this.regexPattern.pattern().equals(oPath.regexPattern.pattern());
}
// this is path, provided argument is a pattern
// simple check, if this is root, everything is a sub pattern
if ( "/".equals(this.path) ) {
return true;
}
// simplest case - the prefix of the glob pattern matches already
// for example: this path = /apps
// glob = /apps/**
// then we iterate by removing the last path segment
String subPath = otherPath;
while ( subPath != null ) {
final Path oPath = new Path(subPath);
if ( oPath.matches(this.path) ) {
return true;
}
final int lastSlash = subPath.lastIndexOf('/');
if ( lastSlash == GLOB_PREFIX.length() ) {
subPath = null;
} else {
subPath = subPath.substring(0, lastSlash);
}
}
return false;
}
// provided argument is a path
if ( !otherPath.startsWith("/") ) {
throw new IllegalArgumentException("Path must be absolute: " + otherPath);
}
if (isPattern) {
return this.regexPattern.matcher(otherPath).matches();
}
return this.path.equals(otherPath) || otherPath.startsWith(this.prefix);
}