/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.function;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.fudgemsg.FudgeField;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeSerializer;
/**
* An implementation of {@link FunctionParameters} that is a trivial map of strings to values. The values must be Fudge serializable. The Fudge encoding of simple parameters is a message with one
* field per parameter, with the field name equal to the parameter name and the value equal to the value. There is thus a limit of 255 characters on a parameter name.
*/
public class SimpleFunctionParameters implements FunctionParameters {
private static final long serialVersionUID = 1L;
private final ConcurrentMap<String, Object> _parameters;
public SimpleFunctionParameters(final Map<String, ?> parameters) {
_parameters = new ConcurrentHashMap<String, Object>(parameters);
}
public SimpleFunctionParameters() {
_parameters = new ConcurrentHashMap<String, Object>();
}
public <T> void setValue(final String parameter, final T value) {
if (parameter.length() > 255) {
// 255 char limit from the Fudge encoding
throw new IllegalArgumentException("parameter too long");
}
_parameters.put(parameter, value);
}
@SuppressWarnings("unchecked")
public <T> T getValue(final String parameter) {
return (T) _parameters.get(parameter);
}
@Override
public boolean equals(final Object o) {
if (o == this) {
return true;
}
if (!(o instanceof SimpleFunctionParameters)) {
return false;
}
return _parameters.equals(((SimpleFunctionParameters) o)._parameters);
}
@Override
public int hashCode() {
return _parameters.hashCode();
}
public void toFudgeMsg(final FudgeSerializer serializer, final MutableFudgeMsg message) {
for (final Map.Entry<String, Object> parameter : _parameters.entrySet()) {
serializer.addToMessageWithClassHeaders(message, parameter.getKey(), null, parameter.getValue());
}
}
public static SimpleFunctionParameters fromFudgeMsg(final FudgeDeserializer deserializer, final FudgeMsg message) {
final SimpleFunctionParameters parameters = new SimpleFunctionParameters();
for (final FudgeField field : message) {
if (field.getName() != null) {
parameters.setValue(field.getName(), deserializer.fieldValueToObject(field));
}
}
return parameters;
}
@Override
public String toString() {
return "SimpleFunctionParameters [" +
"_parameters=" + _parameters +
"]";
}
}