in src/java/org/apache/turbine/services/urlmapper/TurbineURLMapperService.java [131:209]
public void mapToURL(TurbineURI uri)
{
if (!uri.hasPathInfo() && !uri.hasQueryData())
{
return; // no mapping or mapping already done
}
List<URIParam> pathInfo = uri.getPathInfo();
List<URIParam> queryData = uri.getQueryData();
// Create map from list, taking only the first appearance of a key
// PathInfo takes precedence
Map<String, Object> uriParameterMap =
Stream.concat(pathInfo.stream(), queryData.stream())
.collect(Collectors.toMap(
URIParam::getKey,
URIParam::getValue,
(e1, e2) -> e1,
LinkedHashMap::new));
for (URLMapEntry urlMap : container.getMapEntries())
{
Set<String> keys = new HashSet<>(uriParameterMap.keySet());
keys.removeAll(urlMap.getIgnoreParameters().keySet());
Set<String> entryKeys = new HashSet<>(urlMap.getGroupNamesMap().keySet());
Set<String> implicitKeysFound = urlMap.getImplicitParameters().entrySet().stream()
.filter(entry -> Objects.equals(uriParameterMap.get(entry.getKey()), entry.getValue()))
.map(Map.Entry::getKey)
.collect(Collectors.toSet());
entryKeys.addAll(implicitKeysFound);
if (entryKeys.containsAll(keys))
{
Matcher matcher = NAMED_GROUPS_PATTERN.matcher(urlMap.getUrlPattern().pattern());
StringBuffer sb = new StringBuffer();
while (matcher.find())
{
String key = matcher.group(1);
if (CONTEXT_PATH_PARAMETER.equals(key))
{
// remove
matcher.appendReplacement(sb, "");
} else if (WEBAPP_ROOT_PARAMETER.equals(key))
{
matcher.appendReplacement(sb, uri.getScriptName());
} else
{
boolean ignore = urlMap.getIgnoreParameters().keySet().stream()
.anyMatch( x-> x.equals( key ) );
matcher.appendReplacement(sb,
Matcher.quoteReplacement(
(!ignore)? Objects.toString(uriParameterMap.get(key)):""));
// Remove handled parameters (all of them!)
pathInfo.removeIf(uriParam -> key.equals(uriParam.getKey()));
queryData.removeIf(uriParam -> key.equals(uriParam.getKey()));
}
}
matcher.appendTail(sb);
implicitKeysFound.forEach(key -> {
pathInfo.removeIf(uriParam -> key.equals(uriParam.getKey()));
queryData.removeIf(uriParam -> key.equals(uriParam.getKey()));
});
// Clean up
uri.setScriptName(MULTI_SLASH_PATTERN.matcher(sb).replaceAll("/").replaceFirst( "/$", "" ));
break;
}
}
log.debug("mapped to uri: {} ", uri);
}