public static String combine()

in dubbo-rpc/dubbo-rpc-triple/src/main/java/org/apache/dubbo/rpc/protocol/tri/rest/util/PathUtils.java [96:153]


    public static String combine(@Nonnull String path1, @Nonnull String path2) {
        if (path1.isEmpty()) {
            return path2.isEmpty() ? StringUtils.EMPTY_STRING : path2;
        }
        if (path2.isEmpty()) {
            return path1;
        }

        int len1 = path1.length();
        char last1 = path1.charAt(len1 - 1);
        if (len1 == 1) {
            if (last1 == '/' || last1 == '*') {
                return path2;
            }
        } else if (path1.indexOf('{') == -1) {
            if (path1.indexOf('*') != -1) {
                if (PathExpression.parse(path1).match(path2) != null) {
                    return path2;
                }
            }

            int starDotPos1 = path1.lastIndexOf("*.");
            if (starDotPos1 > -1) {
                String ext1 = path1.substring(starDotPos1 + 1);
                int dotPos2 = path2.lastIndexOf('.');
                String file2, ext2;
                if (dotPos2 == -1) {
                    file2 = path2;
                    ext2 = StringUtils.EMPTY_STRING;
                } else {
                    file2 = path2.substring(0, dotPos2);
                    ext2 = path2.substring(dotPos2);
                }
                boolean ext1All = ext1.equals(".*") || ext1.isEmpty();
                boolean ext2All = ext2.equals(".*") || ext2.isEmpty();
                if (!ext1All && !ext2All) {
                    throw new PathParserException(Messages.CANNOT_COMBINE_PATHS, path1, path2);
                }
                return file2 + (ext1All ? ext2 : ext1);
            }
        }
        if (last1 == '*' && path1.charAt(len1 - 2) == '/') {
            path1 = path1.substring(0, len1 - 2);
        }

        boolean slash1 = last1 == '/';
        boolean slash2 = path2.charAt(0) == '/';
        if (slash2 && path2.length() > 1 && path2.charAt(1) == '/') {
            return path2.substring(1);
        }
        if (slash1) {
            return slash2 ? path1 + path2.substring(1) : path1 + path2;
        }
        if (slash2) {
            return path1 + path2;
        }
        return path1 + '/' + path2;
    }