/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.fudgemsg; import java.util.List; import java.util.Map; import org.fudgemsg.FudgeField; import org.fudgemsg.FudgeMsg; import org.fudgemsg.MutableFudgeMsg; import org.fudgemsg.mapping.FudgeBuilderFor; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import org.threeten.bp.LocalDate; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.opengamma.financial.analytics.cashflow.FloatingPaymentMatrix; import com.opengamma.util.money.CurrencyAmount; import com.opengamma.util.tuple.Pair; import com.opengamma.util.tuple.Pairs; /** * */ @FudgeBuilderFor(FloatingPaymentMatrix.class) public class FloatingPaymentMatrixBuilder extends AbstractFudgeBuilder<FloatingPaymentMatrix> { private static final String DATES_FIELD = "dates"; private static final String PAIRS_FIELD = "pairs"; private static final String CA_FIELD = "ca"; private static final String RESET_INDEX_FIELD = "resetIndex"; private static final String MAX_AMOUNTS_FIELD = "maxAmounts"; @Override public FloatingPaymentMatrix buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final List<FudgeField> dateFields = message.getAllByName(DATES_FIELD); final List<FudgeField> pairsField = message.getAllByName(PAIRS_FIELD); final Map<LocalDate, List<Pair<CurrencyAmount, String>>> values = Maps.newHashMapWithExpectedSize(dateFields.size()); for (int i = 0; i < dateFields.size(); i++) { final LocalDate date = deserializer.fieldValueToObject(LocalDate.class, dateFields.get(i)); final FudgeMsg perDateMessage = (FudgeMsg) pairsField.get(i).getValue(); final List<FudgeField> caMessage = perDateMessage.getAllByName(CA_FIELD); final List<FudgeField> resetIndexMessage = perDateMessage.getAllByName(RESET_INDEX_FIELD); final List<Pair<CurrencyAmount, String>> list = Lists.newArrayListWithCapacity(caMessage.size()); for (int j = 0; j < caMessage.size(); j++) { final CurrencyAmount ca = deserializer.fieldValueToObject(CurrencyAmount.class, caMessage.get(j)); final String resetIndex = (String) deserializer.fieldValueToObject(String.class, resetIndexMessage.get(j)); list.add(Pairs.of(ca, resetIndex)); } values.put(date, list); } final int maxAmounts = message.getInt(MAX_AMOUNTS_FIELD); return new FloatingPaymentMatrix(values, maxAmounts); } @Override protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final FloatingPaymentMatrix object) { for (final Map.Entry<LocalDate, List<Pair<CurrencyAmount, String>>> entry : object.getValues().entrySet()) { serializer.addToMessageWithClassHeaders(message, DATES_FIELD, null, entry.getKey()); final MutableFudgeMsg perDateMessage = serializer.newMessage(); for (final Pair<CurrencyAmount, String> pair : entry.getValue()) { serializer.addToMessageWithClassHeaders(perDateMessage, CA_FIELD, null, pair.getFirst()); perDateMessage.add(RESET_INDEX_FIELD, pair.getSecond()); } message.add(PAIRS_FIELD, perDateMessage); } message.add(MAX_AMOUNTS_FIELD, object.getMaxEntries()); } }