/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.engine.fudgemsg; import java.util.ArrayList; import java.util.Map; import org.fudgemsg.FudgeField; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeBuilder; import org.fudgemsg.mapping.FudgeBuilderFor; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import org.threeten.bp.Instant; import com.google.common.collect.Maps; import com.opengamma.engine.function.FunctionParameters; import com.opengamma.engine.marketdata.manipulator.DistinctMarketDataSelector; import com.opengamma.engine.marketdata.manipulator.MarketDataSelector; import com.opengamma.engine.marketdata.spec.MarketDataSpecification; import com.opengamma.engine.view.execution.ViewCycleExecutionOptions; import com.opengamma.id.VersionCorrection; /** * Fudge message builder for {@link ViewCycleExecutionOptions} */ @FudgeBuilderFor(ViewCycleExecutionOptions.class) public class ViewCycleExecutionOptionsFudgeBuilder implements FudgeBuilder<ViewCycleExecutionOptions> { private static final String NAME = "name"; private static final String VALUATION_TIME_FIELD = "valuation"; private static final String RESOLVER_VERSION_CORRECTION = "resolverVersionCorrection"; private static final String MARKET_DATA_SPECIFICATION = "marketDataSpecification"; private static final String MARKET_DATA_SELECTOR = "marketDataSelector"; private static final String FUNCTION_PARAMETERS = "functionParameters"; private static final String SELECTOR = "selector"; @Override public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final ViewCycleExecutionOptions object) { final MutableFudgeMsg msg = serializer.newMessage(); serializer.addToMessage(msg, NAME, null, object.getName()); serializer.addToMessage(msg, VALUATION_TIME_FIELD, null, object.getValuationTime()); for (final MarketDataSpecification spec : object.getMarketDataSpecifications()) { serializer.addToMessageWithClassHeaders(msg, MARKET_DATA_SPECIFICATION, null, spec); } serializer.addToMessageWithClassHeaders(msg, MARKET_DATA_SELECTOR, null, object.getMarketDataSelector()); serializer.addToMessage(msg, RESOLVER_VERSION_CORRECTION, null, object.getResolverVersionCorrection()); if (!object.getFunctionParameters().isEmpty()) { MutableFudgeMsg parametersMsg = serializer.newMessage(); for (Map.Entry<DistinctMarketDataSelector, FunctionParameters> entry : object.getFunctionParameters().entrySet()) { MutableFudgeMsg entryMsg = serializer.newMessage(); serializer.addToMessageWithClassHeaders(entryMsg, SELECTOR, null, entry.getKey()); serializer.addToMessageWithClassHeaders(entryMsg, FUNCTION_PARAMETERS, null, entry.getValue()); serializer.addToMessage(parametersMsg, FUNCTION_PARAMETERS, null, entryMsg); } serializer.addToMessage(msg, FUNCTION_PARAMETERS, null, parametersMsg); } return msg; } @Override public ViewCycleExecutionOptions buildObject(final FudgeDeserializer deserializer, final FudgeMsg msg) { final ViewCycleExecutionOptions.Builder builder = ViewCycleExecutionOptions.builder(); FudgeField field; field = msg.getByName(NAME); if (field != null) { builder.setName(deserializer.fieldValueToObject(String.class, field)); } field = msg.getByName(VALUATION_TIME_FIELD); if (field != null) { builder.setValuationTime(deserializer.fieldValueToObject(Instant.class, field)); } final ArrayList<MarketDataSpecification> specs = new ArrayList<>(); for (final FudgeField marketDataSpecificationField : msg.getAllByName(MARKET_DATA_SPECIFICATION)) { specs.add(deserializer.fieldValueToObject(MarketDataSpecification.class, marketDataSpecificationField)); } builder.setMarketDataSpecifications(specs); field = msg.getByName(MARKET_DATA_SELECTOR); if (field != null) { builder.setMarketDataSelector(deserializer.fieldValueToObject(MarketDataSelector.class, field)); } field = msg.getByName(RESOLVER_VERSION_CORRECTION); if (field != null) { builder.setResolverVersionCorrection(deserializer.fieldValueToObject(VersionCorrection.class, field)); } field = msg.getByName(FUNCTION_PARAMETERS); if (field != null) { Map<DistinctMarketDataSelector, FunctionParameters> paramMap = Maps.newHashMap(); FudgeMsg paramsMsg = (FudgeMsg) field.getValue(); for (FudgeField paramsField : paramsMsg) { FudgeMsg paramMsg = (FudgeMsg) paramsField.getValue(); DistinctMarketDataSelector selector = deserializer.fieldValueToObject(DistinctMarketDataSelector.class, paramMsg.getByName(SELECTOR)); FunctionParameters params = deserializer.fieldValueToObject(FunctionParameters.class, paramMsg.getByName(FUNCTION_PARAMETERS)); paramMap.put(selector, params); } builder.setFunctionParameters(paramMap); } return builder.create(); } }