/** * 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.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.FudgeBuilderFor; import org.fudgemsg.mapping.FudgeDeserializer; import org.fudgemsg.mapping.FudgeSerializer; import org.threeten.bp.Period; import com.opengamma.financial.analytics.parameters.G2ppParameters; import com.opengamma.id.ExternalId; import com.opengamma.id.UniqueId; import com.opengamma.util.money.Currency; import com.opengamma.util.time.Tenor; import com.opengamma.util.tuple.Pair; import com.opengamma.util.tuple.Pairs; /** * Fudge builder for {@link G2ppParameters} */ @FudgeBuilderFor(G2ppParameters.class) public class G2ppParametersBuilder extends AbstractFudgeBuilder<G2ppParameters> { /** The unique id field */ private static final String UNIQUE_ID = "uniqueId"; /** The currency field */ private static final String CURRENCY = "currency"; /** The first mean reversion id field */ private static final String FIRST_MEAN_REVERSION_ID = "firstMeanReversionId"; /** The second mean reversion id field */ private static final String SECOND_MEAN_REVERSION_ID = "secondMeanReversionId"; /** The first initial volatility id field */ private static final String FIRST_INITIAL_VOLATILITY_ID = "firstInitialVolatilityId"; /** The second initial volatility id field */ private static final String SECOND_INITIAL_VOLATILITY_ID = "secondInitialVolatilityId"; /** The tenor field */ private static final String TENOR = "tenor"; /** The first volatility parameter id field */ private static final String FIRST_VOLATILITY_PARAMETER_ID = "firstVolatilityParameterId"; /** The second volatility parameter id field */ private static final String SECOND_VOLATILITY_PARAMETER_ID = "secondVolatilityParameterId"; /** The correlation id */ private static final String CORRELATION_ID = "correlationId"; @Override public G2ppParameters buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final UniqueId uniqueId = deserializer.fieldValueToObject(UniqueId.class, message.getByName(UNIQUE_ID)); final Currency currency = deserializer.fieldValueToObject(Currency.class, message.getByName(CURRENCY)); final ExternalId firstMeanReversionId = deserializer.fieldValueToObject(ExternalId.class, message.getByName(FIRST_MEAN_REVERSION_ID)); final ExternalId secondMeanReversionId = deserializer.fieldValueToObject(ExternalId.class, message.getByName(SECOND_MEAN_REVERSION_ID)); final ExternalId firstInitialVolatilityId = deserializer.fieldValueToObject(ExternalId.class, message.getByName(FIRST_INITIAL_VOLATILITY_ID)); final ExternalId secondInitialVolatilityId = deserializer.fieldValueToObject(ExternalId.class, message.getByName(SECOND_INITIAL_VOLATILITY_ID)); final SortedMap<Tenor, Pair<ExternalId, ExternalId>> volatilityTermStructure = new TreeMap<>(); final List<FudgeField> tenors = message.getAllByName(TENOR); final List<FudgeField> firstVolatilityParameterIds = message.getAllByName(FIRST_VOLATILITY_PARAMETER_ID); final List<FudgeField> secondVolatilityParameterIds = message.getAllByName(SECOND_VOLATILITY_PARAMETER_ID); final int n = tenors.size(); if (n != firstVolatilityParameterIds.size()) { throw new IllegalStateException("Did not have one first volatility parameter id per tenor"); } if (n != secondVolatilityParameterIds.size()) { throw new IllegalStateException("Did not have one second volatility parameter id per tenor"); } for (int i = 0; i < n; i++) { final Tenor tenor = Tenor.of(Period.parse((String) tenors.get(i).getValue())); final ExternalId firstVolatilityParameterId = deserializer.fieldValueToObject(ExternalId.class, firstVolatilityParameterIds.get(i)); final ExternalId secondVolatilityParameterId = deserializer.fieldValueToObject(ExternalId.class, secondVolatilityParameterIds.get(i)); volatilityTermStructure.put(tenor, Pairs.of(firstVolatilityParameterId, secondVolatilityParameterId)); } final ExternalId correlationId = deserializer.fieldValueToObject(ExternalId.class, message.getByName(CORRELATION_ID)); final G2ppParameters parameters = new G2ppParameters(currency, firstMeanReversionId, secondMeanReversionId, firstInitialVolatilityId, secondInitialVolatilityId, volatilityTermStructure, correlationId); parameters.setUniqueId(uniqueId); return parameters; } @Override protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final G2ppParameters object) { serializer.addToMessage(message, UNIQUE_ID, null, object.getUniqueId()); serializer.addToMessage(message, CURRENCY, null, object.getCurrency()); serializer.addToMessage(message, FIRST_MEAN_REVERSION_ID, null, object.getFirstMeanReversionId()); serializer.addToMessage(message, SECOND_MEAN_REVERSION_ID, null, object.getSecondMeanReversionId()); serializer.addToMessage(message, FIRST_INITIAL_VOLATILITY_ID, null, object.getFirstInitialVolatilityId()); serializer.addToMessage(message, SECOND_INITIAL_VOLATILITY_ID, null, object.getSecondInitialVolatilityId()); for (final Map.Entry<Tenor, Pair<ExternalId, ExternalId>> entry : object.getVolatilityTermStructure().entrySet()) { message.add(TENOR, entry.getKey().getPeriod().toString()); serializer.addToMessage(message, FIRST_VOLATILITY_PARAMETER_ID, null, entry.getValue().getFirst()); serializer.addToMessage(message, SECOND_VOLATILITY_PARAMETER_ID, null, entry.getValue().getSecond()); } serializer.addToMessage(message, CORRELATION_ID, null, object.getCorrelationId()); } }