diff --git a/core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java b/core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java new file mode 100644 index 000000000..ae003f975 --- /dev/null +++ b/core/src/main/java/org/apache/struts2/dispatcher/HttpParameters.java @@ -0,0 +1,124 @@ +package org.apache.struts2.dispatcher; + +import java.util.Comparator; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.TreeSet; + +public class HttpParameters implements Cloneable { + + private Map parameters; + + public HttpParameters(Map parameters) { + this.parameters = parameters; + } + + public static Builder create(Map requestParameterMap) { + return new Builder(requestParameterMap); + } + + public static Builder createEmpty() { + return new Builder(new HashMap()); + } + + public Parameter get(String name) { + if (parameters.containsKey(name)) { + return parameters.get(name); + } else { + return new Parameter.EmptyHttpParameter(name); + } + } + + public Set getNames() { + return parameters.keySet(); + } + + public HttpParameters remove(Set paramsToRemove) { + for (String paramName : paramsToRemove) { + for (String param : parameters.keySet()) { + if ((param + ".").startsWith(paramName + ".")) { + parameters.remove(param); + } + } + } + return this; + } + + public HttpParameters remove(final String paramsToRemove) { + return remove(new HashSet() {{ + add(paramsToRemove); + }}); + } + + public boolean contains(String name) { + return parameters.containsKey(name); + } + + public HttpParameters clone(Map newParams) { + return HttpParameters.createEmpty().withParent(this).withExtraParams(newParams).build(); + } + + public static class Builder { + private Map requestParameterMap; + private HttpParameters parent; + + protected Builder(Map requestParameterMap) { + this.requestParameterMap = toStringArrayMpa(requestParameterMap); + } + + private Map toStringArrayMpa(Map map) { + Map result = new TreeMap<>(); + for (Map.Entry entry : map.entrySet()) { + Object value = entry.getValue(); + if (value != null && value.getClass().isArray()) { + Object[] values = (Object[]) value; + Set strValues = new TreeSet<>(); + for (Object v : values) { + strValues.add(String.valueOf(v)); + } + result.put(entry.getKey(), strValues.toArray(new String[strValues.size()])); + } else if (value != null) { + result.put(entry.getKey(), new String[]{String.valueOf(value)}); + } + } + return result; + } + + public Builder withParent(HttpParameters parentParams) { + if (parentParams != null) { + parent = parentParams; + } + return this; + } + + public Builder withExtraParams(Map params) { + if (params != null) { + requestParameterMap.putAll(toStringArrayMpa(params)); + } + return this; + } + + public HttpParameters build() { + Map parameters = (parent == null) + ? new HashMap() + : parent.parameters; + + for (Object o : requestParameterMap.entrySet()) { + Map.Entry entry = (Map.Entry) o; + String name = String.valueOf(entry.getKey()); + String[] value = (String[]) entry.getValue(); + parameters.put(name, new Parameter.Request(name, value)); + + } + return new HttpParameters(parameters); + } + + public Builder withComparator(Comparator orderedComparator) { + requestParameterMap = new TreeMap<>(orderedComparator); + return this; + } + } +} diff --git a/core/src/main/java/org/apache/struts2/dispatcher/Parameter.java b/core/src/main/java/org/apache/struts2/dispatcher/Parameter.java new file mode 100644 index 000000000..17cb80d0e --- /dev/null +++ b/core/src/main/java/org/apache/struts2/dispatcher/Parameter.java @@ -0,0 +1,97 @@ +package org.apache.struts2.dispatcher; + +public interface Parameter { + + String getName(); + + String getValue(); + + boolean isExpression(); + + boolean isDefined(); + + boolean isMultiple(); + + String[] getMultipleValue(); + + class Request implements Parameter { + + private final String name; + private final String[] value; + + public Request(String name, String[] value) { + this.name = name; + this.value = value; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue() { + return (value != null && value.length > 0) ? value[0] : null; + } + + @Override + public boolean isExpression() { + return false; + } + + @Override + public boolean isDefined() { + return value != null && value.length > 0; + } + + @Override + public boolean isMultiple() { + return isDefined() && value.length > 1; + } + + @Override + public String[] getMultipleValue() { + return value; + } + } + + class EmptyHttpParameter implements Parameter { + + private String name; + + public EmptyHttpParameter(String name) { + this.name = name; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue() { + return null; + } + + @Override + public boolean isExpression() { + return false; + } + + @Override + public boolean isDefined() { + return false; + } + + @Override + public boolean isMultiple() { + return false; + } + + @Override + public String[] getMultipleValue() { + return new String[0]; + } + } + +}