/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.fudgemsg; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; 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.opengamma.OpenGammaRuntimeException; import com.opengamma.analytics.financial.forex.method.MultipleCurrencyInterestRateCurveSensitivity; import com.opengamma.analytics.financial.forex.method.PresentValueForexBlackVolatilitySensitivity; import com.opengamma.analytics.financial.interestrate.InterestRateCurveSensitivity; import com.opengamma.analytics.util.amount.SurfaceValue; import com.opengamma.util.money.Currency; import com.opengamma.util.tuple.DoublesPair; import com.opengamma.util.tuple.Pair; /** * */ /* package */final class AnalyticsResultBuilder { private AnalyticsResultBuilder() { } @FudgeBuilderFor(InterestRateCurveSensitivity.class) public static final class PresentValueSensitivityBuilder extends AbstractFudgeBuilder<InterestRateCurveSensitivity> { private static final String CURVE_FIELD_NAME = "CurveName"; private static final String PAIR_FIELD_NAME = "Pair"; private static final String SENSITIVITIES_FIELD_NAME = "Sensitivities"; @Override public InterestRateCurveSensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final List<FudgeField> curveNameFields = message.getAllByName(CURVE_FIELD_NAME); final List<FudgeField> sensitivitiesFields = message.getAllByName(SENSITIVITIES_FIELD_NAME); final Map<String, List<DoublesPair>> data = new HashMap<String, List<DoublesPair>>(); final int n = curveNameFields.size(); if (sensitivitiesFields.size() != n) { throw new OpenGammaRuntimeException("Sensitivities list not same size as names list"); } for (int i = 0; i < n; i++) { final FudgeField nameField = curveNameFields.get(i); final String name = deserializer.fieldValueToObject(String.class, nameField); final FudgeField listField = sensitivitiesFields.get(i); final List<DoublesPair> pairs = new ArrayList<DoublesPair>(); final List<FudgeField> pairsField = ((FudgeMsg) listField.getValue()).getAllByName(PAIR_FIELD_NAME); for (final FudgeField pair : pairsField) { pairs.add((DoublesPair) deserializer.fieldValueToObject(Pair.class, pair)); } data.put(name, pairs); } return new InterestRateCurveSensitivity(data); } @Override protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final InterestRateCurveSensitivity object) { final Map<String, List<DoublesPair>> data = object.getSensitivities(); for (final Map.Entry<String, List<DoublesPair>> entry : data.entrySet()) { message.add(CURVE_FIELD_NAME, null, FudgeSerializer.addClassHeader(serializer.objectToFudgeMsg(entry.getKey()), entry.getKey().getClass())); final MutableFudgeMsg perPairMessage = serializer.newMessage(); for (final DoublesPair pair : entry.getValue()) { perPairMessage.add(PAIR_FIELD_NAME, null, FudgeSerializer.addClassHeader(serializer.objectToFudgeMsg(pair), pair.getClass())); } message.add(SENSITIVITIES_FIELD_NAME, null, perPairMessage); } } } @FudgeBuilderFor(MultipleCurrencyInterestRateCurveSensitivity.class) public static final class MultipleCurrencyInterestRateCurveSensitivityBuilder extends AbstractFudgeBuilder<MultipleCurrencyInterestRateCurveSensitivity> { private static final String CURRENCY_FIELD_NAME = "Currencies"; private static final String SENSITIVITIES_FIELD_NAME = "Sensitivities"; @Override public MultipleCurrencyInterestRateCurveSensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final List<FudgeField> currencyNameFields = message.getAllByName(CURRENCY_FIELD_NAME); final List<FudgeField> sensitivitiesFields = message.getAllByName(SENSITIVITIES_FIELD_NAME); MultipleCurrencyInterestRateCurveSensitivity result = null; for (int i = 0; i < currencyNameFields.size(); i++) { final Currency ccy = deserializer.fieldValueToObject(Currency.class, currencyNameFields.get(i)); final InterestRateCurveSensitivity sensitivity = deserializer.fieldValueToObject(InterestRateCurveSensitivity.class, sensitivitiesFields.get(i)); if (result == null) { result = MultipleCurrencyInterestRateCurveSensitivity.of(ccy, sensitivity); } else { result = result.plus(ccy, sensitivity); } } return result; } @Override protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final MultipleCurrencyInterestRateCurveSensitivity object) { final Set<Currency> currencies = object.getCurrencies(); for (final Currency ccy : currencies) { serializer.addToMessage(message, CURRENCY_FIELD_NAME, null, ccy); serializer.addToMessage(message, SENSITIVITIES_FIELD_NAME, null, object.getSensitivity(ccy)); } } } @FudgeBuilderFor(PresentValueForexBlackVolatilitySensitivity.class) public static final class PresentValueForexBlackVolatilitySensitivityBuilder extends AbstractFudgeBuilder<PresentValueForexBlackVolatilitySensitivity> { private static final String FIRST_CURRENCY_FIELD_NAME = "firstCurrency"; private static final String SECOND_CURRENCY_FIELD_NAME = "secondCurrency"; private static final String TIME_FIELD_NAME = "time"; private static final String STRIKE_FIELD_NAME = "strike"; private static final String VEGA_FIELD_NAME = "vega"; private static final String VEGA_ENTRY_NAME = "vegaEntry"; @Override public PresentValueForexBlackVolatilitySensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) { final Currency firstCurrency = Currency.of(message.getString(FIRST_CURRENCY_FIELD_NAME)); final Currency secondCurrency = Currency.of(message.getString(SECOND_CURRENCY_FIELD_NAME)); final SurfaceValue vega = new SurfaceValue(); final List<FudgeField> vegaEntryFields = message.getAllByName(VEGA_ENTRY_NAME); for (int i = 0; i < vegaEntryFields.size(); i++) { final double time = ((FudgeMsg) vegaEntryFields.get(i).getValue()).getDouble(TIME_FIELD_NAME); final double strike = ((FudgeMsg) vegaEntryFields.get(i).getValue()).getDouble(STRIKE_FIELD_NAME); final Double vegaValue = ((FudgeMsg) vegaEntryFields.get(i).getValue()).getDouble(VEGA_FIELD_NAME); vega.add(DoublesPair.of(time, strike), vegaValue); } return new PresentValueForexBlackVolatilitySensitivity(firstCurrency, secondCurrency, vega); } @Override protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final PresentValueForexBlackVolatilitySensitivity object) { final Pair<Currency, Currency> currencies = object.getCurrencyPair(); message.add(FIRST_CURRENCY_FIELD_NAME, currencies.getFirst().getCode()); message.add(SECOND_CURRENCY_FIELD_NAME, currencies.getSecond().getCode()); final SurfaceValue vegas = object.getVega(); final HashMap<DoublesPair, Double> map = vegas.getMap(); for (final Map.Entry<DoublesPair, Double> entry : map.entrySet()) { final MutableFudgeMsg perEntryMessage = serializer.newMessage(); perEntryMessage.add(TIME_FIELD_NAME, entry.getKey().first); perEntryMessage.add(STRIKE_FIELD_NAME, entry.getKey().second); perEntryMessage.add(VEGA_FIELD_NAME, entry.getValue()); message.add(VEGA_ENTRY_NAME, null, perEntryMessage); } } } }