public String renderRelativeUrl()

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;
	}