/** * 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.Collection; import java.util.HashMap; import java.util.LinkedList; import java.util.Map; import java.util.Queue; import org.fudgemsg.FudgeField; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import org.threeten.bp.Duration; import org.threeten.bp.Instant; import com.opengamma.engine.ComputationTargetSpecification; import com.opengamma.engine.value.ComputedValueResult; import com.opengamma.engine.view.ViewCalculationResultModel; import com.opengamma.engine.view.ViewResultModel; import com.opengamma.engine.view.execution.ViewCycleExecutionOptions; import com.opengamma.engine.view.impl.InMemoryViewResultModel; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; /** * Base operation for {@link ViewDeltaResultModelFudgeBuilder} and {@link ViewComputationResultModelFudgeBuilder}. */ public abstract class ViewResultModelFudgeBuilder { private static final String FIELD_VIEWPROCESSID = "viewProcessId"; private static final String FIELD_VIEWCYCLEID = "viewCycleId"; private static final String FIELD_VIEW_CYCLE_EXECUTION_OPTIONS = "viewCycleExecutionOptions"; private static final String FIELD_CALCULATION_TIME = "calculationTime"; private static final String FIELD_CALCULATION_DURATION = "calculationDuration"; private static final String FIELD_VERSION_CORRECTION = "versionCorrection"; private static final String FIELD_RESULTS = "results"; protected static MutableFudgeMsg createResultModelMessage(final FudgeSerializer serializer, final ViewResultModel resultModel) { final MutableFudgeMsg message = serializer.newMessage(); message.add(FIELD_VIEWPROCESSID, resultModel.getViewProcessId()); message.add(FIELD_VIEWCYCLEID, resultModel.getViewCycleId()); message.add(FIELD_CALCULATION_TIME, resultModel.getCalculationTime()); serializer.addToMessage(message, FIELD_VIEW_CYCLE_EXECUTION_OPTIONS, null, resultModel.getViewCycleExecutionOptions()); serializer.addToMessage(message, FIELD_CALCULATION_DURATION, null, resultModel.getCalculationDuration()); serializer.addToMessage(message, FIELD_VERSION_CORRECTION, null, resultModel.getVersionCorrection()); final Collection<String> calculationConfigurations = resultModel.getCalculationConfigurationNames(); final MutableFudgeMsg resultMsg = serializer.newMessage(); for (String calculationConfiguration : calculationConfigurations) { resultMsg.add(null, 1, calculationConfiguration); serializer.addToMessage(resultMsg, null, 2, resultModel.getCalculationResult(calculationConfiguration)); } message.add(FIELD_RESULTS, resultMsg); return message; } protected InMemoryViewResultModel bootstrapCommonDataFromMessage(final FudgeDeserializer deserializer, final FudgeMsg message) { final UniqueId viewProcessId = message.getValue(UniqueId.class, FIELD_VIEWPROCESSID); final UniqueId viewCycleId = message.getValue(UniqueId.class, FIELD_VIEWCYCLEID); final ViewCycleExecutionOptions viewCycleExecutionOptions = deserializer.fieldValueToObject(ViewCycleExecutionOptions.class, message.getByName(FIELD_VIEW_CYCLE_EXECUTION_OPTIONS)); final Instant calculationTime = message.getFieldValue(Instant.class, message.getByName(FIELD_CALCULATION_TIME)); FudgeField durationField = message.getByName(FIELD_CALCULATION_DURATION); final Duration calculationDuration = durationField != null ? deserializer.fieldValueToObject(Duration.class, durationField) : null; final VersionCorrection versionCorrection = deserializer.fieldValueToObject(VersionCorrection.class, message.getByName(FIELD_VERSION_CORRECTION)); final Map<String, ViewCalculationResultModel> configurationMap = new HashMap<String, ViewCalculationResultModel>(); final Queue<String> keys = new LinkedList<String>(); final Queue<ViewCalculationResultModel> values = new LinkedList<ViewCalculationResultModel>(); for (FudgeField field : message.getFieldValue(FudgeMsg.class, message.getByName(FIELD_RESULTS))) { if (field.getOrdinal() == 1) { final String key = deserializer.fieldValueToObject(String.class, field); if (values.isEmpty()) { keys.add(key); } else { configurationMap.put(key, values.remove()); } } else if (field.getOrdinal() == 2) { final ViewCalculationResultModel value = deserializer.fieldValueToObject(ViewCalculationResultModel.class, field); if (keys.isEmpty()) { values.add(value); } else { configurationMap.put(keys.remove(), value); } } } InMemoryViewResultModel resultModel = constructImpl(); for (Map.Entry<String, ViewCalculationResultModel> configurationEntry : configurationMap.entrySet()) { for (ComputationTargetSpecification targetSpec : configurationEntry.getValue().getAllTargets()) { for (ComputedValueResult value : configurationEntry.getValue().getAllValues(targetSpec)) { resultModel.addValue(configurationEntry.getKey(), value); } } } resultModel.setViewProcessId(viewProcessId); resultModel.setViewCycleId(viewCycleId); resultModel.setViewCycleExecutionOptions(viewCycleExecutionOptions); resultModel.setCalculationTime(calculationTime); resultModel.setCalculationDuration(calculationDuration); resultModel.setVersionCorrection(versionCorrection); return resultModel; } protected abstract InMemoryViewResultModel constructImpl(); }