/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.fudgemsg; 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.ircurve.FixedIncomeStrip; import com.opengamma.financial.analytics.ircurve.IndexType; import com.opengamma.financial.analytics.ircurve.StripInstrumentType; import com.opengamma.util.time.Tenor; /** * Builder for converting FixedIncomeStrip instances to/from Fudge messages. */ @FudgeBuilderFor(FixedIncomeStrip.class) public class FixedIncomeStripFudgeBuilder implements FudgeBuilder<FixedIncomeStrip> { private static final String TYPE = "type"; private static final String TENOR = "tenor"; private static final String CONVENTION_NAME = "conventionName"; private static final String NUM_FUTURES = "numFutures"; private static final String PERIODS_PER_YEAR = "periodsPerYear"; private static final String PAY_TENOR = "payTenor"; private static final String RECEIVE_TENOR = "receiveTenor"; private static final String PAY_INDEX_TYPE = "payIndexType"; private static final String RECEIVE_INDEX_TYPE = "receiveIndexType"; private static final String RESET_TENOR = "resetTenor"; private static final String INDEX_TYPE = "indexType"; @Override public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final FixedIncomeStrip object) { final MutableFudgeMsg message = serializer.newMessage(); serializer.addToMessage(message, TYPE, null, object.getInstrumentType()); message.add(CONVENTION_NAME, object.getConventionName()); serializer.addToMessage(message, TENOR, null, object.getCurveNodePointTime()); if (object.getInstrumentType() == StripInstrumentType.FUTURE) { message.add(NUM_FUTURES, object.getNumberOfFuturesAfterTenor()); } else if (object.getInstrumentType() == StripInstrumentType.PERIODIC_ZERO_DEPOSIT) { message.add(PERIODS_PER_YEAR, object.getPeriodsPerYear()); } else if (object.getResetTenor() != null) { serializer.addToMessage(message, RESET_TENOR, null, object.getResetTenor()); serializer.addToMessage(message, INDEX_TYPE, null, object.getIndexType()); } else if (object.getInstrumentType() == StripInstrumentType.BASIS_SWAP) { serializer.addToMessage(message, PAY_TENOR, null, object.getPayTenor()); serializer.addToMessage(message, RECEIVE_TENOR, null, object.getReceiveTenor()); serializer.addToMessage(message, PAY_INDEX_TYPE, null, object.getPayIndexType()); serializer.addToMessage(message, RECEIVE_INDEX_TYPE, null, object.getReceiveIndexType()); } return message; } @Override public FixedIncomeStrip buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final StripInstrumentType type = deserializer.fieldValueToObject(StripInstrumentType.class, message.getByName(TYPE)); final String conventionName = message.getString(CONVENTION_NAME); final Tenor tenor = deserializer.fieldValueToObject(Tenor.class, message.getByName(TENOR)); if (type == StripInstrumentType.FUTURE) { final int numFutures = message.getInt(NUM_FUTURES); return new FixedIncomeStrip(type, tenor, numFutures, conventionName); } else if (type == StripInstrumentType.PERIODIC_ZERO_DEPOSIT) { final int periodsPerYear = message.getInt(PERIODS_PER_YEAR); return new FixedIncomeStrip(type, tenor, periodsPerYear, true, conventionName); } else if (message.hasField(RESET_TENOR)) { final Tenor resetTenor = deserializer.fieldValueToObject(Tenor.class, message.getByName(RESET_TENOR)); final IndexType indexType = deserializer.fieldValueToObject(IndexType.class, message.getByName(INDEX_TYPE)); return new FixedIncomeStrip(type, tenor, resetTenor, indexType, conventionName); } else if (type == StripInstrumentType.BASIS_SWAP) { final Tenor payTenor = deserializer.fieldValueToObject(Tenor.class, message.getByName(PAY_TENOR)); final Tenor receiveTenor = deserializer.fieldValueToObject(Tenor.class, message.getByName(RECEIVE_TENOR)); final IndexType payIndexType = deserializer.fieldValueToObject(IndexType.class, message.getByName(PAY_INDEX_TYPE)); final IndexType receiveIndexType = deserializer.fieldValueToObject(IndexType.class, message.getByName(RECEIVE_INDEX_TYPE)); return new FixedIncomeStrip(type, tenor, payTenor, receiveTenor, payIndexType, receiveIndexType, conventionName); } else { return new FixedIncomeStrip(type, tenor, conventionName); } } }