/* (c) 2016 Open Source Geospatial Foundation - all rights reserved * This code is licensed under the GPL 2.0 license, available at the root * application directory. */ package org.geoserver.params.extractor; import java.net.URLEncoder; import java.util.*; public class UrlTransform { private final Map<String, String> normalizedNames = new HashMap<>(); private final Map<String, String[]> parameters = new HashMap<>(); private final String requestUri; private final List<String> replacements = new ArrayList<>(); public UrlTransform(String requestUri, Map<String, String[]> parameters) { this.requestUri = requestUri; for (Map.Entry<String, String[]> entry : parameters.entrySet()) { normalizedNames.put(entry.getKey().toLowerCase(), entry.getKey()); this.parameters.put(entry.getKey(), Arrays.copyOf(entry.getValue(), entry.getValue().length)); } } public String getOriginalRequestUri() { return requestUri; } public String getRequestUri() { String updatedRequestUri = requestUri; for (String replacement : replacements) { updatedRequestUri = updatedRequestUri.replace(replacement, ""); } return updatedRequestUri; } public String getQueryString() { StringBuilder queryStringBuilder = new StringBuilder(); for (Map.Entry<String, String[]> parameter : parameters.entrySet()) { queryStringBuilder.append(parameter.getKey()) .append("=").append(URLEncoder.encode(parameter.getValue()[0])).append("&"); } if (queryStringBuilder.length() == 0) { return ""; } queryStringBuilder.deleteCharAt(queryStringBuilder.length() - 1); return queryStringBuilder.toString(); } public void addParameter(String name, String value, Optional<String> combine) { String rawName = getRawName(name); String[] existingValues = parameters.get(rawName); if (existingValues != null && combine.isPresent()) { String combinedValue = combine.get().replace("$1", existingValues[0]); combinedValue = combinedValue.replace("$2", value); existingValues[0] = combinedValue; } else { parameters.put(rawName, new String[]{value}); } } private String getRawName(String name) { String rawName = normalizedNames.get(name.toLowerCase()); if (rawName != null) { return rawName; } normalizedNames.put(name.toLowerCase(), name); return name; } public void removeMatch(String matchedText) { replacements.add(matchedText); } public Map<String, String[]> getParameters() { return parameters; } public boolean haveChanged() { return !(replacements.isEmpty()); } @Override public String toString() { String updatedQueryString = getQueryString(); if (updatedQueryString.isEmpty()) { return getRequestUri(); } return getRequestUri() + "?" + getQueryString(); } }