/**
* Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.engine.marketdata.manipulator;
import java.util.Map;
import org.fudgemsg.FudgeField;
import org.fudgemsg.FudgeMsg;
import org.fudgemsg.MutableFudgeMsg;
import org.fudgemsg.mapping.FudgeDeserializer;
import org.fudgemsg.mapping.FudgeSerializer;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import com.opengamma.engine.function.FunctionParameters;
import com.opengamma.util.ArgumentChecker;
/**
* Simple immutable class defining a scenario which holds a map of the market
* data manipulation targets (e.g. USD 3M Yield Curve) and the manipulations
* to be performed (e.g. shift by +10bps).
*
* ScenarioDefinitions can be stored in the config master and used in the
* setup of ViewDefinitions.
*/
public class ScenarioDefinition implements ScenarioDefinitionFactory {
private static final String NAME = "name";
private static final String SELECTOR = "selector";
private static final String DEFINITION_MAP = "definitionMap";
private static final String FUNCTION_PARAMETERS = "functionParameters";
private final String _name;
private final Map<DistinctMarketDataSelector, FunctionParameters> _definitionMap;
public ScenarioDefinition(String name, Map<DistinctMarketDataSelector, FunctionParameters> definitionMap) {
ArgumentChecker.notEmpty(name, "name");
_name = name;
_definitionMap = ImmutableMap.copyOf(definitionMap);
}
/**
* Return an immutable map of the market data selectors to function parameters.
*
* @return market data to function parameters mapping
*/
public Map<DistinctMarketDataSelector, FunctionParameters> getDefinitionMap() {
return _definitionMap;
}
/**
* @return The scenario name, not null
*/
public String getName() {
return _name;
}
public MutableFudgeMsg toFudgeMsg(final FudgeSerializer serializer) {
MutableFudgeMsg msg = serializer.newMessage();
serializer.addToMessage(msg, NAME, null, _name);
MutableFudgeMsg mapMsg = serializer.newMessage();
for (Map.Entry<DistinctMarketDataSelector, FunctionParameters> entry : _definitionMap.entrySet()) {
MutableFudgeMsg entryMsg = serializer.newMessage();
DistinctMarketDataSelector selector = entry.getKey();
FunctionParameters parameters = entry.getValue();
serializer.addToMessageWithClassHeaders(entryMsg, SELECTOR, null, selector);
serializer.addToMessageWithClassHeaders(entryMsg, FUNCTION_PARAMETERS, null, parameters);
serializer.addToMessage(mapMsg, null, null, entryMsg);
}
serializer.addToMessage(msg, DEFINITION_MAP, null, mapMsg);
return msg;
}
public static ScenarioDefinition fromFudgeMsg(FudgeDeserializer deserializer, FudgeMsg msg) {
String name = deserializer.fieldValueToObject(String.class, msg.getByName(NAME));
Map<DistinctMarketDataSelector, FunctionParameters> definitionMap = Maps.newHashMap();
if (msg.hasField(DEFINITION_MAP)) {
FudgeMsg mapMsg = msg.getMessage(DEFINITION_MAP);
for (FudgeField field : mapMsg) {
FudgeMsg entryMsg = (FudgeMsg) field.getValue();
FudgeField selectorField = entryMsg.getByName(SELECTOR);
DistinctMarketDataSelector selector = deserializer.fieldValueToObject(DistinctMarketDataSelector.class, selectorField);
FudgeField paramsField = entryMsg.getByName(FUNCTION_PARAMETERS);
FunctionParameters parameters = deserializer.fieldValueToObject(FunctionParameters.class, paramsField);
definitionMap.put(selector, parameters);
}
}
return new ScenarioDefinition(name, definitionMap);
}
@Override
public ScenarioDefinition create(Map<String, Object> parameters) {
return this;
}
}