/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.core.marketdatasnapshot.impl; 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.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.marketdatasnapshot.ValueSnapshot; import com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; /** * Fudge message builder for {@link ManageableUnstructuredMarketDataSnapshot} * * <pre> * message { * repeated message { // set * ExternalIdBundle identifiers; * string valueName; * ValueSnapshot value; * } value = 1; * } * </pre> */ @FudgeBuilderFor(ManageableUnstructuredMarketDataSnapshot.class) public class ManageableUnstructuredMarketDataSnapshotBuilder implements FudgeBuilder<ManageableUnstructuredMarketDataSnapshot> { private static final Logger s_logger = LoggerFactory.getLogger(ManageableUnstructuredMarketDataSnapshot.class); /** Field name. */ public static final String IDENTIFIERS_FIELD_NAME = "identifiers"; /** Field name. */ public static final String VALUE_NAME_FIELD_NAME = "valueName"; /** Field name. */ public static final String VALUE_FIELD_NAME = "value"; /** Field name. */ public static final String VALUE_SPEC_NAME = "valueSpec"; /** Field name. */ public static final String UNIQUE_ID_NAME = "uniqueId"; // TODO: This is not the most efficient representation. Either keep the repeat and use a 3-tuple approach rather // than a set for the outer message, or use a map of value specs to a map of names and values. Which is the more // concise depends on how likely there are to be multiple named values for each given specification. @Override public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final ManageableUnstructuredMarketDataSnapshot object) { final MutableFudgeMsg ret = serializer.newMessage(); for (final ExternalIdBundle target : object.getTargets()) { for (final Map.Entry<String, ValueSnapshot> targetEntry : object.getTargetValues(target).entrySet()) { final MutableFudgeMsg msg = serializer.newMessage(); serializer.addToMessage(msg, IDENTIFIERS_FIELD_NAME, null, target); serializer.addToMessage(msg, VALUE_NAME_FIELD_NAME, null, targetEntry.getKey()); serializer.addToMessage(msg, VALUE_FIELD_NAME, null, targetEntry.getValue()); ret.add(1, msg); } } return ret; } @Override public ManageableUnstructuredMarketDataSnapshot buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final ManageableUnstructuredMarketDataSnapshot object = new ManageableUnstructuredMarketDataSnapshot(); for (final FudgeField fudgeField : message.getAllByOrdinal(1)) { final FudgeMsg innerValue = (FudgeMsg) fudgeField.getValue(); ExternalIdBundle identifiers; if (innerValue.hasField(VALUE_SPEC_NAME)) { s_logger.warn("Massively old version of snapshot deserializer being used, trying to convert..."); FudgeMsg valueSpec = (FudgeMsg) innerValue.getValue(VALUE_SPEC_NAME); if (innerValue.hasField(UNIQUE_ID_NAME)) { identifiers = ExternalId.parse(valueSpec.getString(UNIQUE_ID_NAME)).toBundle(); } else { throw new OpenGammaRuntimeException("Detected out of date unstructured snapshot encoding, tried to convert but failed"); } } else { identifiers = deserializer.fieldValueToObject(ExternalIdBundle.class, innerValue.getByName(IDENTIFIERS_FIELD_NAME)); } final String valueName = innerValue.getFieldValue(String.class, innerValue.getByName(VALUE_NAME_FIELD_NAME)); final FudgeField valueField = innerValue.getByName(VALUE_FIELD_NAME); final ValueSnapshot value = valueField == null ? null : deserializer.fieldValueToObject(ValueSnapshot.class, valueField); object.putValue(identifiers, valueName, value); } return object; } }