package org.jbehave.core.steps;
import java.lang.reflect.Type;
import java.util.Map;
/**
* Implementation of Parameters that uses {@link ParameterConverters} to convert
* values.
*/
public class ConvertedParameters implements Parameters {
private final Map<String, String> values;
private final ParameterConverters parameterConverters;
/**
* Creates an instance of ConvertedParameters from a Row which provides the
* values
*
* @param row the Row to get the values from
* @param parameterConverters the ParameterConverters used for conversion
*/
public ConvertedParameters(Row row, ParameterConverters parameterConverters) {
this(row.values(), parameterConverters);
}
/**
* Creates an instance of ConvertedParameters with given values
*
* @param values the Map<String,String> of values
* @param parameterConverters the ParameterConverters used for conversion
*/
public ConvertedParameters(Map<String, String> values, ParameterConverters parameterConverters) {
this.values = values;
this.parameterConverters = parameterConverters;
}
public <T> T valueAs(String name, Type type) {
return convert(valueFor(name), type);
}
public <T> T valueAs(String name, Type type, T defaultValue) {
if (values.containsKey(name)) {
return valueAs(name, type);
}
return defaultValue;
}
@SuppressWarnings("unchecked")
private <T> T convert(String value, Type type) {
return (T) parameterConverters.convert(value, type);
}
private String valueFor(String name) {
if ( !values.containsKey(name) ){
throw new ValueNotFound(name);
}
return values.get(name);
}
public Map<String, String> values() {
return values;
}
@SuppressWarnings("serial")
public static class ValueNotFound extends RuntimeException {
public ValueNotFound(String name) {
super(name);
}
}
}