/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.fudgemsg; import java.util.HashMap; 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.financial.analytics.curve.CurveNodeIdMapper; import com.opengamma.financial.analytics.ircurve.CurveInstrumentProvider; import com.opengamma.util.time.Tenor; /** * Fudge builder for {@link CurveNodeIdMapper} */ @FudgeBuilderFor(CurveNodeIdMapper.class) public class CurveNodeIdMapperBuilder implements FudgeBuilder<CurveNodeIdMapper> { /** The name field */ public static final String NAME_FIELD = "name"; /** The bill ids field */ public static final String BILL_NODE_FIELD = "billIds"; /** The bond ids field */ public static final String BOND_NODE_FIELD = "bondIds"; /** The calendar swap ids field */ public static final String CALENDAR_SWAP_NODE_FIELD = "calendarSwapIds"; /** The cash ids field */ public static final String CASH_NODE_FIELD = "cashIds"; /** The continuously compounded node field */ public static final String CONTINUOUSLY_COMPOUNDED_NODE_FIELD = "continuouslyCompoundedIds"; /** The periodically compounded node field */ public static final String PERIODICALLY_COMPOUNDED_NODE_FIELD = "periodicallyCompoundedIds"; /** The credit spread node field */ public static final String CREDIT_SPREAD_NODE_FIELD = "creditSpreadIds"; /** The deliverable swap future node field */ public static final String DELIVERABLE_SWAP_FUTURE_NODE_FIELD = "deliverableSwapFutureIds"; /** The discount factor node field */ public static final String DISCOUNT_FACTOR_NODE_FIELD = "discountFactorIds"; /** The FRA node field */ public static final String FRA_NODE_FIELD = "fraIds"; /** The FX forward node field */ public static final String FX_FORWARD_NODE_FIELD = "fxForwardIds"; /** The IMM FRA node field */ public static final String ROLL_DATE_FRA_NODE_FIELD = "rollDateFRAIds"; /** The IMM swap node field */ public static final String ROLL_DATE_SWAP_NODE_FIELD = "rollDateSwapIds"; /** The rate future node field */ public static final String RATE_FUTURE_FIELD = "rateFutureIds"; /** The swap node field */ public static final String SWAP_NODE_FIELD = "swapIds"; /** The three-leg basis swap node field */ public static final String THREE_LEG_BASIS_SWAP_NODE_FIELD = "threeLegBasisSwapIds"; /** The zero coupon inflation node field */ public static final String ZERO_COUPON_INFLATION_NODE_FIELD = "zeroCouponInflationIds"; @Override public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final CurveNodeIdMapper object) { final MutableFudgeMsg message = serializer.newMessage(); message.add(null, 0, object.getClass().getName()); message.add(NAME_FIELD, object.getName()); if (object.getBillNodeIds() != null) { message.add(BILL_NODE_FIELD, getMessageForField(serializer, object.getBillNodeIds())); } if (object.getBondNodeIds() != null) { message.add(BOND_NODE_FIELD, getMessageForField(serializer, object.getBondNodeIds())); } if (object.getCalendarSwapNodeIds() != null) { message.add(CALENDAR_SWAP_NODE_FIELD, getMessageForField(serializer, object.getCalendarSwapNodeIds())); } if (object.getCashNodeIds() != null) { message.add(CASH_NODE_FIELD, getMessageForField(serializer, object.getCashNodeIds())); } if (object.getContinuouslyCompoundedRateNodeIds() != null) { message.add(CONTINUOUSLY_COMPOUNDED_NODE_FIELD, getMessageForField(serializer, object.getContinuouslyCompoundedRateNodeIds())); } if (object.getPeriodicallyCompoundedRateNodeIds() != null) { message.add(PERIODICALLY_COMPOUNDED_NODE_FIELD, getMessageForField(serializer, object.getPeriodicallyCompoundedRateNodeIds())); } if (object.getCreditSpreadNodeIds() != null) { message.add(CREDIT_SPREAD_NODE_FIELD, getMessageForField(serializer, object.getCreditSpreadNodeIds())); } if (object.getDeliverableSwapFutureNodeIds() != null) { message.add(DELIVERABLE_SWAP_FUTURE_NODE_FIELD, getMessageForField(serializer, object.getDeliverableSwapFutureNodeIds())); } if (object.getDiscountFactorNodeIds() != null) { message.add(DISCOUNT_FACTOR_NODE_FIELD, getMessageForField(serializer, object.getDiscountFactorNodeIds())); } if (object.getFRANodeIds() != null) { message.add(FRA_NODE_FIELD, getMessageForField(serializer, object.getFRANodeIds())); } if (object.getFXForwardNodeIds() != null) { message.add(FX_FORWARD_NODE_FIELD, getMessageForField(serializer, object.getFXForwardNodeIds())); } if (object.getIMMFRANodeIds() != null) { message.add(ROLL_DATE_FRA_NODE_FIELD, getMessageForField(serializer, object.getIMMFRANodeIds())); } if (object.getIMMSwapNodeIds() != null) { message.add(ROLL_DATE_SWAP_NODE_FIELD, getMessageForField(serializer, object.getIMMSwapNodeIds())); } if (object.getRateFutureNodeIds() != null) { message.add(RATE_FUTURE_FIELD, getMessageForField(serializer, object.getRateFutureNodeIds())); } if (object.getSwapNodeIds() != null) { message.add(SWAP_NODE_FIELD, getMessageForField(serializer, object.getSwapNodeIds())); } if (object.getThreeLegBasisSwapNodeIds() != null) { message.add(THREE_LEG_BASIS_SWAP_NODE_FIELD, getMessageForField(serializer, object.getThreeLegBasisSwapNodeIds())); } if (object.getZeroCouponInflationNodeIds() != null) { message.add(ZERO_COUPON_INFLATION_NODE_FIELD, getMessageForField(serializer, object.getZeroCouponInflationNodeIds())); } return message; } @Override public CurveNodeIdMapper buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final String name; if (message.hasField(NAME_FIELD)) { name = message.getString(NAME_FIELD); } else { name = null; } final Map<Tenor, CurveInstrumentProvider> billNodeIds = getMapForField(BILL_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> bondNodeIds = getMapForField(BOND_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> calendarSwapNodeIds = getMapForField(CALENDAR_SWAP_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> cashNodeIds = getMapForField(CASH_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> continuouslyCompoundedRateNodeIds = getMapForField(CONTINUOUSLY_COMPOUNDED_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> periodicallyCompoundedRateNodeIds = getMapForField(PERIODICALLY_COMPOUNDED_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> creditSpreadNodeIds = getMapForField(CREDIT_SPREAD_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> deliverableSwapFutureNodeIds = getMapForField(DELIVERABLE_SWAP_FUTURE_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> discountFactorNodeIds = getMapForField(DISCOUNT_FACTOR_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> fraNodeIds = getMapForField(FRA_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> fxForwardNodeIds = getMapForField(FX_FORWARD_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> immFRANodeIds = getMapForField(ROLL_DATE_FRA_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> immSwapNodeIds = getMapForField(ROLL_DATE_SWAP_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> rateFutureNodeIds = getMapForField(RATE_FUTURE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> swapNodeIds = getMapForField(SWAP_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> threeLegBasisSwapNodeIds = getMapForField(THREE_LEG_BASIS_SWAP_NODE_FIELD, deserializer, message); final Map<Tenor, CurveInstrumentProvider> zeroCouponInflationNodeIds = getMapForField(ZERO_COUPON_INFLATION_NODE_FIELD, deserializer, message); final CurveNodeIdMapper idMapper = CurveNodeIdMapper.builder(). billNodeIds(billNodeIds). bondNodeIds(bondNodeIds). cashNodeIds(cashNodeIds). calendarSwapNodeIds(calendarSwapNodeIds). continuouslyCompoundedRateNodeIds(continuouslyCompoundedRateNodeIds). periodicallyCompoundedRateNodeIds(periodicallyCompoundedRateNodeIds). creditSpreadNodeIds(creditSpreadNodeIds). deliverableSwapFutureNodeIds(deliverableSwapFutureNodeIds). discountFactorNodeIds(discountFactorNodeIds). fraNodeIds(fraNodeIds). fxForwardNodeIds(fxForwardNodeIds). immFRANodeIds(immFRANodeIds). immSwapNodeIds(immSwapNodeIds). rateFutureNodeIds(rateFutureNodeIds). name(name). swapNodeIds(swapNodeIds). threeLegBasisSwapNodeIds(threeLegBasisSwapNodeIds). zeroCouponInflationNodeIds(zeroCouponInflationNodeIds). build(); return idMapper; } /** * Adds (tenor, curve instrument providers) to the Fudge message. * @param serializer The serializer * @param idMap A map of tenors to curve instrument providers * @return The message */ public static FudgeMsg getMessageForField(final FudgeSerializer serializer, final Map<Tenor, CurveInstrumentProvider> idMap) { final MutableFudgeMsg idsMessage = serializer.newMessage(); for (final Map.Entry<Tenor, CurveInstrumentProvider> entry : idMap.entrySet()) { serializer.addToMessageWithClassHeaders(idsMessage, entry.getKey().toFormattedString(), null, entry.getValue(), CurveInstrumentProvider.class); //entry.getKey().getPeriod().toString() } return idsMessage; } /** * Creates a (tenor, curve instrument provider) map from a Fudge message. * @param fieldName The field name * @param deserializer The deserializer * @param message The message * @return The map */ public static Map<Tenor, CurveInstrumentProvider> getMapForField(final String fieldName, final FudgeDeserializer deserializer, final FudgeMsg message) { if (message.hasField(fieldName)) { final Map<Tenor, CurveInstrumentProvider> nodeIds = new HashMap<>(); final FudgeMsg idsMessage = message.getMessage(fieldName); for (final FudgeField field : idsMessage.getAllFields()) { nodeIds.put(Tenor.parse(field.getName()), deserializer.fieldValueToObject(CurveInstrumentProvider.class, field)); } return nodeIds; } return null; } }