in src/main/java/org/apache/sling/resourceresolver/impl/params/PathParser.java [68:155]
public void parse(String path) {
this.rawPath = path;
this.parameters = Collections.emptyMap();
if (path == null) {
return;
}
// indexOf shortcut for the most common case
final int si = path.indexOf(';');
if (si == -1) {
return;
}
final int di = path.indexOf('.');
final char[] chars = path.toCharArray();
final ParametersParser parametersParser = new ParametersParser();
ParserState state = ParserState.INIT;
int paramsStart = -1, paramsEnd = -1;
int i = (di != -1) ? ((si != -1) ? Math.min(di, si) : di) : si;
for (; i <= chars.length; i++) {
final char c;
if (i == chars.length) {
c = 0;
} else {
c = chars[i];
}
switch (state) {
case INIT:
if (c == '.') {
state = ParserState.V1_EXTENSION;
} else if (c == ';') {
paramsStart = i;
i = parametersParser.parseParameters(chars, i, false);
paramsEnd = i--;
state = parametersParser.isInvalid() ? ParserState.INVALID : ParserState.V2_PARAMS;
}
break;
case V1_EXTENSION:
if (c == '/') {
state = ParserState.SUFFIX;
} else if (c == ';') {
paramsStart = i;
i = parametersParser.parseParameters(chars, i, true);
paramsEnd = i--;
state = parametersParser.isInvalid() ? ParserState.INVALID : ParserState.V1_PARAMS;
}
break;
case V1_PARAMS:
if (c == '/') {
state = ParserState.SUFFIX;
} else if (c == '.') {
state = ParserState.INVALID; // no dots after params
}
break;
case V2_PARAMS:
if (c == '/') {
state = ParserState.INVALID; // there was no extension, so no suffix is allowed
} else if (c == '.') {
state = ParserState.V2_EXTENSION;
}
break;
case V2_EXTENSION:
if (c == '/') {
state = ParserState.SUFFIX;
}
break;
case SUFFIX:
case INVALID:
break;
}
}
if (state == ParserState.INVALID) {
paramsStart = paramsEnd = -1;
} else {
cutPath(path, paramsStart, paramsEnd);
parameters = Collections.unmodifiableMap(parametersParser.getParameters());
}
}