public void mapToURL()

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