in dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/mapping/condition/PathParser.java [249:391]
private static void transformSegments(List<PathSegment> segments, String path) {
ListIterator<PathSegment> iterator = segments.listIterator();
PathSegment curr, prev = null;
while (iterator.hasNext()) {
curr = iterator.next();
String value = curr.getValue();
Type type = curr.getType();
switch (type) {
case SLASH:
if (prev != null) {
switch (prev.getType()) {
case LITERAL:
case VARIABLE:
case PATTERN:
prev = curr;
break;
case PATTERN_MULTI:
if (!".*".equals(prev.getValue())) {
prev.setValue(prev.getValue() + '/');
}
break;
default:
}
}
iterator.remove();
continue;
case WILDCARD:
if ("*".equals(value)) {
type = Type.VARIABLE;
value = StringUtils.EMPTY_STRING;
} else if ("**".equals(value)) {
if (!iterator.hasNext()) {
type = Type.WILDCARD_TAIL;
value = StringUtils.EMPTY_STRING;
} else {
type = Type.PATTERN_MULTI;
value = ".*";
}
} else {
type = Type.PATTERN;
value = toRegex(value);
}
curr.setType(type);
curr.setValue(value);
break;
case WILDCARD_TAIL:
break;
case PATTERN:
case PATTERN_MULTI:
curr.setValue("(?<" + curr.getVariable() + '>' + value + ')');
break;
default:
}
if (prev == null) {
prev = curr;
continue;
}
String pValue = prev.getValue();
switch (prev.getType()) {
case LITERAL:
switch (type) {
case VARIABLE:
prev.setType(Type.PATTERN);
prev.setValue(quoteRegex(pValue) + "(?<" + curr.getVariable() + ">[^/]+)");
prev.setVariables(curr.getVariables());
iterator.remove();
continue;
case PATTERN:
case PATTERN_MULTI:
prev.setType(type);
prev.setValue(quoteRegex(pValue) + "(?<" + curr.getVariable() + '>' + value + ')');
prev.setVariables(curr.getVariables());
iterator.remove();
continue;
default:
}
break;
case VARIABLE:
switch (type) {
case LITERAL:
prev.setType(Type.PATTERN);
prev.setValue("(?<" + prev.getVariable() + ">[^/]+)" + quoteRegex(value));
iterator.remove();
continue;
case VARIABLE:
throw new PathParserException(Messages.ILLEGAL_DOUBLE_CAPTURE, path);
case PATTERN:
case PATTERN_MULTI:
String var = curr.getVariable();
prev.addVariable(var);
prev.setType(type);
prev.setValue("(?<" + prev.getVariable() + ">[^/]+)(?<" + var + '>' + value + ')');
iterator.remove();
continue;
default:
}
break;
case PATTERN:
case PATTERN_MULTI:
switch (type) {
case LITERAL:
prev.setValue(pValue + quoteRegex(value));
iterator.remove();
continue;
case WILDCARD_TAIL:
if (curr.getVariables() == null) {
prev.setValue(pValue + ".*");
} else {
prev.addVariable(curr.getVariable());
prev.setValue(pValue + "(?<" + curr.getVariable() + ">.*)");
}
prev.setType(Type.PATTERN_MULTI);
iterator.remove();
continue;
case VARIABLE:
if (value.isEmpty()) {
prev.setValue(pValue + "[^/]+");
iterator.remove();
continue;
}
prev.addVariable(curr.getVariable());
prev.setValue(pValue + "(?<" + curr.getVariable() + ">[^/]+)");
iterator.remove();
continue;
case PATTERN_MULTI:
prev.setType(Type.PATTERN_MULTI);
case PATTERN:
if (curr.getVariables() == null) {
prev.setValue(pValue + value);
} else {
prev.addVariable(curr.getVariable());
prev.setValue(pValue + "(?<" + curr.getVariable() + '>' + value + ')');
}
iterator.remove();
continue;
default:
}
break;
default:
}
prev = curr;
}
}