private static void transformSegments()

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;
        }
    }