/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.core.marketdatasnapshot; import java.util.ArrayList; import java.util.List; 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 com.opengamma.id.ExternalId; import com.opengamma.id.ExternalIdBundle; /** * Encodes/decodes a {@link SnapshotDataBundle} to/from its Fudge representation. * * <pre> * message SnapshotDataBundle { * message { * required repeated ExternalId identifier; * required double value; * } data[]; * } * </pre> */ @FudgeBuilderFor(SnapshotDataBundle.class) public class SnapshotDataBundleFudgeBuilder implements FudgeBuilder<SnapshotDataBundle> { private static final String DATA_FIELD = "data"; private static final String IDENTIFIER_FIELD = "identifier"; private static final String VALUE_FIELD = "value"; @Override public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final SnapshotDataBundle object) { final MutableFudgeMsg msg = serializer.newMessage(); final MutableFudgeMsg data = msg.addSubMessage(DATA_FIELD, null); for (final Map.Entry<ExternalIdBundle, Double> dataValue : object.getDataPointSet()) { final MutableFudgeMsg dataMsg = data.addSubMessage(null, null); for (final ExternalId identifier : dataValue.getKey()) { serializer.addToMessage(dataMsg, IDENTIFIER_FIELD, null, identifier); } dataMsg.add(VALUE_FIELD, dataValue.getValue()); } return msg; } @Override public SnapshotDataBundle buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final SnapshotDataBundle object = new SnapshotDataBundle(); for (final FudgeField dataField : message.getMessage(DATA_FIELD)) { if (dataField.getValue() instanceof FudgeMsg) { final FudgeMsg dataMsg = (FudgeMsg) dataField.getValue(); final List<FudgeField> identifierFields = dataMsg.getAllByName(IDENTIFIER_FIELD); if (identifierFields.size() == 1) { object.setDataPoint(deserializer.fieldValueToObject(ExternalId.class, identifierFields.get(0)), dataMsg.getDouble(VALUE_FIELD)); } else { final List<ExternalId> identifiers = new ArrayList<ExternalId>(identifierFields.size()); for (final FudgeField identifier : identifierFields) { identifiers.add(deserializer.fieldValueToObject(ExternalId.class, identifier)); } object.setDataPoint(ExternalIdBundle.of(identifiers), dataMsg.getDouble(VALUE_FIELD)); } } } return object; } }