Java URI to Relative URI getRelativeURI(URI base, URI uri)

Here you can find the source of getRelativeURI(URI base, URI uri)

Description

Return the uri for the uri relative to the base uri.

License

Open Source License

Parameter

Parameter Description
base the base uri.
uri the file location to get the relative path for.

Return

the relative uri.

Declaration

public static URI getRelativeURI(URI base, URI uri) 

Method Source Code


//package com.java2s;

import java.io.UnsupportedEncodingException;
import java.net.URI;
import java.util.StringTokenizer;

public class Main {
    /**//from w  w  w . j a va2  s  . c  o  m
     * Return the uri for the uri relative to the base uri.
     *
     * @param base the base uri.
     * @param uri the file location to get the relative path for.
     *
     * @return the relative uri.
     */
    public static URI getRelativeURI(URI base, URI uri) {
        if (base != null && uri != null && (uri.getScheme() == null || uri.getScheme().equals(base.getScheme()))) {
            StringTokenizer baseParts = tokenizeBase(base);
            StringTokenizer uriParts = new StringTokenizer(uri.getSchemeSpecificPart(), "/");
            StringBuffer relativePath = new StringBuffer();
            String part = null;
            boolean first = true;
            if (!baseParts.hasMoreTokens()) {
                return uri;
            }
            while (baseParts.hasMoreTokens() && uriParts.hasMoreTokens()) {
                String baseDir = baseParts.nextToken();
                part = uriParts.nextToken();
                if ((baseDir.equals(part) && baseDir.contains(":")) && first) {
                    baseDir = baseParts.nextToken();
                    part = uriParts.nextToken();
                }
                if (!baseDir.equals(part)) { // || (baseDir.equals(part) && baseDir.contains(":"))) {
                    if (first) {
                        return uri;
                    }
                    relativePath.append("../");
                    break;
                }
                part = null;
                first = false;
            }
            while (baseParts.hasMoreTokens()) {
                relativePath.append("../");
                baseParts.nextToken();
            }
            if (part != null) {
                relativePath.append(part);
                if (uriParts.hasMoreTokens()) {
                    relativePath.append("/");
                }
            }
            while (uriParts.hasMoreTokens()) {
                relativePath.append(uriParts.nextToken());
                if (uriParts.hasMoreTokens()) {
                    relativePath.append("/");
                }
            }
            return createURI(relativePath.toString());
        }
        return uri;
    }

    private static StringTokenizer tokenizeBase(URI uri) {
        String scheme = uri.getSchemeSpecificPart();
        int index = scheme.lastIndexOf("/");
        if (index != -1) {
            scheme = scheme.substring(0, index + 1);
        }
        return new StringTokenizer(scheme, "/");
    }

    /**
     * Creates a URI from a path, the path can be relative or absolute, '\' and '/' are normalised.
     *
     * @param path the path to create the URI for.
     * @return a new URI.
     */
    public static URI createURI(String path) {
        path = path.replace('\\', '/');
        return URI.create(encodeURI(path));
    }

    /**
     * Creates a String from a URI, the URI can be relative or absolute, the URI is decoded.
     *
     * TODO Why can't I just return uri.toString()???
     *
     * @param uri the URI to return the string representation for.
     * @return a string representation of the URI.
     */
    public static String toString(URI uri) {
        StringBuffer buffer = new StringBuffer();
        if (uri.getScheme() != null) {
            buffer.append(uri.getScheme());
            buffer.append(":");
        }
        buffer.append(uri.getSchemeSpecificPart());
        if (uri.getFragment() != null) {
            buffer.append("#");
            buffer.append(uri.getFragment());
        }
        return buffer.toString();
    }

    private static String encodeURI(String url) {
        StringBuffer uri = new StringBuffer(url.length());
        int length = url.length();
        for (int i = 0; i < length; i++) {
            char c = url.charAt(i);

            switch (c) {
            case '!':
            case '#':
            case '$':
            case '%':
            case '&':
            case '\'':
            case '(':
            case ')':
            case '*':
            case '+':
            case ',':
            case '-':
            case '.':
            case '/':
            case '0':
            case '1':
            case '2':
            case '3':
            case '4':
            case '5':
            case '6':
            case '7':
            case '8':
            case '9':
            case ':':
            case ';':
            case '=':
            case '?':
            case '@':
            case 'A':
            case 'B':
            case 'C':
            case 'D':
            case 'E':
            case 'F':
            case 'G':
            case 'H':
            case 'I':
            case 'J':
            case 'K':
            case 'L':
            case 'M':
            case 'N':
            case 'O':
            case 'P':
            case 'Q':
            case 'R':
            case 'S':
            case 'T':
            case 'U':
            case 'V':
            case 'W':
            case 'X':
            case 'Y':
            case 'Z':
            case '[':
            case ']':
            case '_':
            case 'a':
            case 'b':
            case 'c':
            case 'd':
            case 'e':
            case 'f':
            case 'g':
            case 'h':
            case 'i':
            case 'j':
            case 'k':
            case 'l':
            case 'm':
            case 'n':
            case 'o':
            case 'p':
            case 'q':
            case 'r':
            case 's':
            case 't':
            case 'u':
            case 'v':
            case 'w':
            case 'x':
            case 'y':
            case 'z':
            case '~':
                uri.append(c);
                break;
            default:
                StringBuffer result = new StringBuffer(3);
                String s = String.valueOf(c);
                try {
                    byte[] data = s.getBytes("UTF8");
                    for (int j = 0; j < data.length; j++) {
                        result.append('%');
                        String hex = Integer.toHexString(data[j]);
                        result.append(hex.substring(hex.length() - 2));
                    }
                    uri.append(result.toString());
                } catch (UnsupportedEncodingException ex) {
                    // should never happen
                }
            }
        }

        return uri.toString();
    }
}

Related

  1. getRelativeName(File file, URI directory)
  2. getRelativePath(URI base, File file)
  3. getRelativePath(URI targetURI, URI baseURI)
  4. getRelativePath(URI targetUri, URI baseUri)
  5. getRelativeURI(String href)
  6. getRelativeURI(URI repositoryXml, URI bundleJar)
  7. getRelativeUri(URI rootURI, File file)
  8. getRelativeURI(URI uri, URI relativeTo)
  9. relativeConfig(URI uri)