in wicket-request/src/main/java/org/apache/wicket/request/UrlRenderer.java [232:311]
public String renderRelativeUrl(final Url url)
{
Args.notNull(url, "url");
if (url instanceof IUrlRenderer)
{
IUrlRenderer renderer = (IUrlRenderer)url;
return renderer.renderRelativeUrl(url, getBaseUrl());
}
List<String> baseUrlSegments = new ArrayList<>(getBaseUrl().getSegments());
List<String> urlSegments = new ArrayList<>(url.getSegments());
if (!getBaseUrl().isContextRelative())
{
// so we remove any possible filter/context segments
removeCommonPrefixes(request, baseUrlSegments);
}
removeCommonPrefixes(request, urlSegments);
List<String> newSegments = new ArrayList<>();
int common = 0;
String last = null;
for (String s : baseUrlSegments)
{
if (!urlSegments.isEmpty() && s.equals(urlSegments.get(0)))
{
++common;
last = urlSegments.remove(0);
}
else
{
break;
}
}
// we want the new URL to have at least one segment (other than possible ../)
if ((last != null) && (urlSegments.isEmpty() || (baseUrlSegments.size() == common)))
{
--common;
urlSegments.add(0, last);
}
int baseUrlSize = baseUrlSegments.size();
if (common + 1 == baseUrlSize && urlSegments.isEmpty())
{
newSegments.add(".");
}
else
{
for (int i = common + 1; i < baseUrlSize; ++i)
{
newSegments.add("..");
}
}
newSegments.addAll(urlSegments);
Url relativeUrl = new Url(newSegments, url.getQueryParameters());
relativeUrl.setFragment(url.getFragment());
String renderedUrl = relativeUrl.toString();
// sanitize start
if (renderedUrl.startsWith("...") || (!renderedUrl.startsWith("..") && !renderedUrl.equals(".")))
{
// WICKET-4260
renderedUrl = "./" + renderedUrl;
}
// add trailing slash if the url has no query string and ends with ..
if (renderedUrl.indexOf('?') == -1 && (renderedUrl.endsWith("..") && renderedUrl.endsWith("...") == false))
{
// WICKET-4401
renderedUrl = renderedUrl + '/';
}
return renderedUrl;
}