/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.security.index; import java.util.List; import java.util.Map; import java.util.SortedMap; import java.util.TreeMap; 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.master.security.ManageableSecurityFudgeBuilder; import com.opengamma.util.time.Tenor; /** * Fudge builder for {@link IndexFamily} */ @FudgeBuilderFor(IndexFamily.class) public class IndexFamilyBuilder implements FudgeBuilder<IndexFamily> { /** The exposure function name field */ private static final String TENOR_FIELD = "tenor"; /** The external id field */ private static final String EXTERNAL_ID_FIELD = "id"; @Override public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final IndexFamily object) { final MutableFudgeMsg message = serializer.newMessage(); ManageableSecurityFudgeBuilder.toFudgeMsg(serializer, object, message); //message.add(null, 0, object.getClass().getName()); for (final Map.Entry<Tenor, ExternalId> entry : object.getMembers().entrySet()) { serializer.addToMessage(message, TENOR_FIELD, null, entry.getKey()); serializer.addToMessage(message, EXTERNAL_ID_FIELD, null, entry.getValue()); } return message; } @Override public IndexFamily buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { IndexFamily indexFamily = new IndexFamily(); ManageableSecurityFudgeBuilder.fromFudgeMsg(deserializer, message, indexFamily); final SortedMap<Tenor, ExternalId> entries = new TreeMap<>(); final List<FudgeField> tenorFields = message.getAllByName(TENOR_FIELD); final List<FudgeField> idsFields = message.getAllByName(EXTERNAL_ID_FIELD); final int n = idsFields.size(); if (tenorFields.size() != n) { throw new IllegalStateException("Should have one tenor per external id"); } for (int i = 0; i < n; i++) { final Tenor tenor = deserializer.fieldValueToObject(Tenor.class, tenorFields.get(i)); final ExternalId id = deserializer.fieldValueToObject(ExternalId.class, idsFields.get(i)); entries.put(tenor, id); } indexFamily.setMembers(entries); return indexFamily; } }