in doxia-integration-tools/src/main/java/org/apache/maven/doxia/tools/DefaultSiteTool.java [186:262]
public String getRelativePath(String to, String from) {
Objects.requireNonNull(to, "to cannot be null");
Objects.requireNonNull(from, "from cannot be null");
if (to.contains(":") && from.contains(":")) {
String toScheme = to.substring(0, to.lastIndexOf(':'));
String fromScheme = from.substring(0, from.lastIndexOf(':'));
if (!toScheme.equals(fromScheme)) {
return to;
}
}
URL toUrl = null;
URL fromUrl = null;
String toPath = to;
String fromPath = from;
try {
toUrl = new URL(to);
} catch (MalformedURLException e) {
try {
toUrl = new File(getNormalizedPath(to)).toURI().toURL();
} catch (MalformedURLException e1) {
LOGGER.warn("Unable to load a URL for '" + to + "'", e);
return to;
}
}
try {
fromUrl = new URL(from);
} catch (MalformedURLException e) {
try {
fromUrl = new File(getNormalizedPath(from)).toURI().toURL();
} catch (MalformedURLException e1) {
LOGGER.warn("Unable to load a URL for '" + from + "'", e);
return to;
}
}
if (toUrl != null && fromUrl != null) {
// URLs, determine if they share protocol and domain info
if ((toUrl.getProtocol().equalsIgnoreCase(fromUrl.getProtocol()))
&& (toUrl.getHost().equalsIgnoreCase(fromUrl.getHost()))
&& (toUrl.getPort() == fromUrl.getPort())) {
// shared URL domain details, use URI to determine relative path
toPath = toUrl.getFile();
fromPath = fromUrl.getFile();
} else {
// don't share basic URL information, no relative available
return to;
}
} else if ((toUrl != null && fromUrl == null) || (toUrl == null && fromUrl != null)) {
// one is a URL and the other isn't, no relative available.
return to;
}
// either the two locations are not URLs or if they are they
// share the common protocol and domain info and we are left
// with their URI information
String relativePath = getRelativeFilePath(fromPath, toPath);
if (relativePath == null) {
relativePath = to;
}
if (LOGGER.isDebugEnabled() && !relativePath.toString().equals(to)) {
LOGGER.debug("Mapped url: " + to + " to relative path: " + relativePath);
}
return relativePath;
}