/**
* Copyright (C) 2012-2014 Gist Labs, LLC. (http://gistlabs.com)
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
package com.gistlabs.mechanize.parameters;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/**
* Representation of a parameter list being able to use multiple String values for a single parameter.
*
* @author Martin Kersten<Martin.Kersten.mk@gmail.com>
* @author John Heintz <john@gistlabs.com>
*/
public class Parameters implements Iterable<Parameter> {
private final LinkedHashMap<String, Parameter> parameters = new LinkedHashMap<String, Parameter>();
// private final List<Parameter> formParameters = new ArrayList<Parameter>();
// private final Map<String, Parameter> parameterNames = new HashMap<String, Parameter>();
public Parameters() {
}
public Parameters(final Map<String, Object> parameters) {
List<String> sortedKeys = new ArrayList<String>(parameters.keySet());
Collections.sort(sortedKeys);
for(String name : sortedKeys) {
Object value = parameters.get(name);
if(value != null && !(value instanceof String []))
add(name, value.toString());
else if(value instanceof String [])
add(name, (String [])value);
}
}
/** Returns true if at least one value is present for the given parameter name. */
public boolean has(final String name) {
return this.parameters.containsKey(name);
}
/** Returns the current values of the parameters in natural sort order or null if none. */
public String [] get(final String name) {
if(has(name)) {
List<String> values = parameters.get(name).getValues();
Collections.sort(values);
return values.toArray(new String [values.size()]);
}
else
return null;
}
/** Returns the parameter names in the order they where added. */
public String [] getNames() {
String [] result = new String[parameters.size()];
parameters.keySet().toArray(result);
return result;
}
public Parameters set(final String name, final String ... values) {
remove(name);
add(name, values);
return this;
}
public Parameters remove(final String name) {
parameters.remove(name);
return this;
}
public Parameters add(final String name, final String ... values) {
for(String value : values)
add(name, value);
return this;
}
public Parameters set(final String name, final String value) {
remove(name);
add(name, value);
return this;
}
public Parameters add(final String name, final String value) {
if(has(name))
parameters.get(name).addValue(value);
else
parameters.put(name, new Parameter(name, value));
return this;
}
public Collection<Parameter> getParameters() {
return parameters.values();
}
@Override
public Iterator<Parameter> iterator() {
return parameters.values().iterator();
}
/** Returns the sum of all values within the parameters. */
public int getValueCount() {
int count = 0;
for (Parameter parameter : this)
count += parameter.getValues().size();
return count;
}
@Override
public String toString() {
return parameters.toString();
}
}