package aQute.libg.uri; import java.io.File; import java.net.URI; import java.net.URISyntaxException; import java.util.regex.Matcher; import java.util.regex.Pattern; public final class URIUtil { private static final Pattern DRIVE_LETTER_PATTERN = Pattern.compile("([a-zA-Z]):\\\\(.*)"); /** * Resolves a URI reference against a base URI. Work-around for bugs in * java.net.URI * (e.g.http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4708535) * * @param baseURI * @param reference * @return the resolved {@code URI} * @throws URISyntaxException */ public static URI resolve(URI baseURI, String reference) throws URISyntaxException { URI resolved; boolean emptyRef = reference.isEmpty(); if (emptyRef) { resolved = baseURI.resolve(URI.create("#")); String resolvedStr = resolved.toASCIIString(); resolved = URI.create(resolvedStr.substring(0, resolvedStr.indexOf('#'))); } else { // A Windows path such as "C:\Users" is interpreted as a URI with // a scheme of "C". Use a regex that matches the colon-backslash // combination to handle this specifically as an absolute file URI. Matcher driveLetterMatcher = DRIVE_LETTER_PATTERN.matcher(reference); if (driveLetterMatcher.matches()) { resolved = new File(reference).toURI(); } else { resolved = baseURI.resolve(reference.replace('\\', '/')); } } return resolved; } }