/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.fudgemsg; import java.util.LinkedHashMap; 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 com.google.common.collect.Maps; import com.opengamma.analytics.financial.forex.method.FXMatrix; import com.opengamma.analytics.financial.interestrate.YieldCurveBundle; import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve; import com.opengamma.util.money.Currency; /** * Fudge builder for {@code YieldCurveBundle}. */ @FudgeBuilderFor(YieldCurveBundle.class) public final class YieldCurveBundleBuilder extends AbstractFudgeBuilder<YieldCurveBundle> { private static final String CURVES_FIELD_NAME = "curve"; private static final String CURVES_NAME_FIELD_NAME = "curveName"; private static final String CURRENCY_FIELD_NAME = "ccy"; private static final String CURRENCY_CURVE_FIELD_NAME = "ccyCurve"; private static final String FX_MATRIX_FIELD_NAME = "FXMatrix"; @Override public YieldCurveBundle buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { // note name in curve & name in bundle may be different! final List<FudgeField> curveFields = message.getAllByName(CURVES_FIELD_NAME); final List<FudgeField> curveNameFields = message.getAllByName(CURVES_NAME_FIELD_NAME); final List<FudgeField> ccyFields = message.getAllByName(CURRENCY_FIELD_NAME); final List<FudgeField> ccyCurveFields = message.getAllByName(CURRENCY_CURVE_FIELD_NAME); final Map<String, YieldAndDiscountCurve> curves = new LinkedHashMap<>(curveFields.size()); final Map<String, Currency> curveCurrencys = Maps.newHashMapWithExpectedSize(ccyFields.size()); final FXMatrix fxMatrix = deserializer.fieldValueToObject(FXMatrix.class, message.getByName(FX_MATRIX_FIELD_NAME)); for (int i = 0; i < curveFields.size(); i++) { final YieldAndDiscountCurve curve = deserializer.fieldValueToObject(YieldAndDiscountCurve.class, curveFields.get(i)); final String name = deserializer.fieldValueToObject(String.class, curveNameFields.get(i)); curves.put(name, curve); } for (int i = 0; i < ccyFields.size(); i++) { final String name = deserializer.fieldValueToObject(String.class, ccyCurveFields.get(i)); final Currency ccy = deserializer.fieldValueToObject(Currency.class, ccyFields.get(i)); curveCurrencys.put(name, ccy); } return new YieldCurveBundle(fxMatrix, curveCurrencys, curves); } @Override protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final YieldCurveBundle object) { serializer.addToMessageWithClassHeaders(message, FX_MATRIX_FIELD_NAME, null, object.getFxRates()); for (final String curve : object.getAllNames()) { serializer.addToMessageWithClassHeaders(message, CURVES_FIELD_NAME, null, object.getCurve(curve)); serializer.addToMessageWithClassHeaders(message, CURVES_NAME_FIELD_NAME, null, curve); } for (Map.Entry<String, Currency> ccyEntry : object.getCurrencyMap().entrySet()) { serializer.addToMessage(message, CURRENCY_CURVE_FIELD_NAME, null, ccyEntry.getKey()); serializer.addToMessageWithClassHeaders(message, CURRENCY_FIELD_NAME, null, ccyEntry.getValue()); } } }