Package com.opengamma.financial.analytics.fudgemsg

Source Code of com.opengamma.financial.analytics.fudgemsg.CurveResultBuilders$CurveBuildingBlockBundleBuilder

/**
* 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.ArrayList;
import java.util.HashMap;
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.opengamma.OpenGammaRuntimeException;
import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlock;
import com.opengamma.analytics.financial.provider.curve.CurveBuildingBlockBundle;
import com.opengamma.analytics.financial.provider.sensitivity.inflation.InflationSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.inflation.MultipleCurrencyInflationSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.ForwardSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MulticurveSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyMulticurveSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.MultipleCurrencyParameterSensitivity;
import com.opengamma.analytics.financial.provider.sensitivity.multicurve.SimpleParameterSensitivity;
import com.opengamma.analytics.math.matrix.DoubleMatrix1D;
import com.opengamma.analytics.math.matrix.DoubleMatrix2D;
import com.opengamma.util.money.Currency;
import com.opengamma.util.tuple.DoublesPair;
import com.opengamma.util.tuple.Pair;

/**
* Contains results of calculations associated with curves
*/
/* package */ final class CurveResultBuilders {

  private CurveResultBuilders() {
  }

  /**
   * Fudge builder for {@link ForwardSensitivity}
   */
  @FudgeBuilderFor(ForwardSensitivity.class)
  public static final class ForwardSensitivityBuilder extends AbstractFudgeBuilder<ForwardSensitivity> {
    /** The start time field */
    private static final String START_TIME = "startTime";
    /** The end time field */
    private static final String END_TIME = "endTime";
    /** The accrual factor */
    private static final String ACCRUAL_FACTOR = "accrualFactor";
    /** The value */
    private static final String VALUE = "value";

    @Override
    public ForwardSensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final double startTime = message.getDouble(START_TIME);
      final double endTime = message.getDouble(END_TIME);
      final double accrualFactor = message.getDouble(ACCRUAL_FACTOR);
      final double value = message.getDouble(VALUE);
      return new ForwardSensitivity(startTime, endTime, accrualFactor, value);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final ForwardSensitivity object) {
      message.add(START_TIME, object.getStartTime());
      message.add(END_TIME, object.getEndTime());
      message.add(ACCRUAL_FACTOR, object.getAccrualFactor());
      message.add(VALUE, object.getValue());
    }

  }

  /**
   * Fudge builder for {@link MulticurveSensitivity}
   */
  @FudgeBuilderFor(MulticurveSensitivity.class)
  public static final class MulticurveSensitivityBuilder extends AbstractFudgeBuilder<MulticurveSensitivity> {
    /** The yield curve name field */
    private static final String YIELD_CURVE_NAME = "yieldCurveName";
    /** Field for the map containing the sensitivities to yield curves */
    private static final String SENSITIVITY_TO_YIELD_DATA = "allSensitivityToYieldData";
    /** Field for the cash flow times of the sensitivities to a particular yield curve */
    private static final String SENSITIVITY_TO_YIELD_TIME = "cashFlowTimeForYield";
    /** Field for the sensitivity to a particular yield curve at a given time */
    private static final String SENSITIVITY_TO_YIELD_VALUE = "sensitivityForYield";
    /** The forward curve name field */
    private static final String FORWARD_CURVE_NAME = "forwardCurveName";
    /** Field for the map containing the sensitivities to the forward curve */
    private static final String SENSITIVITY_TO_FORWARD_DATA = "allSensitivityToForwardData";
    /** Field for the sensitivity to a particular forward curve at a given time */
    private static final String SENSITIVITY_TO_FORWARD_VALUE = "sensitivityForForward";

    @Override
    public MulticurveSensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final Map<String, List<DoublesPair>> yieldCurveSensitivities = new HashMap<>();
      final Map<String, List<ForwardSensitivity>> forwardCurveSensitivities = new HashMap<>();
      final List<FudgeField> yieldCurveFields = message.getAllByName(SENSITIVITY_TO_YIELD_DATA);
      for (final FudgeField yieldCurveField : yieldCurveFields) {
        final FudgeMsg perCurveMessage = (FudgeMsg) yieldCurveField.getValue();
        final String yieldCurveName = perCurveMessage.getString(YIELD_CURVE_NAME);
        final List<FudgeField> timeFields = perCurveMessage.getAllByName(SENSITIVITY_TO_YIELD_TIME);
        final List<FudgeField> valueFields = perCurveMessage.getAllByName(SENSITIVITY_TO_YIELD_VALUE);
        if (timeFields.size() != valueFields.size()) {
          throw new OpenGammaRuntimeException("number of times and values not equal");
        }
        final List<DoublesPair> sensitivities = new ArrayList<>();
        for (int i = 0; i < timeFields.size(); i++) {
          final Double time = deserializer.fieldValueToObject(Double.class, timeFields.get(i));
          final Double sensitivity = deserializer.fieldValueToObject(Double.class, valueFields.get(i));
          sensitivities.add(new DoublesPair(time, sensitivity));
        }
        yieldCurveSensitivities.put(yieldCurveName, sensitivities);
      }
      final List<FudgeField> forwardCurveFields = message.getAllByName(SENSITIVITY_TO_FORWARD_DATA);
      for (final FudgeField forwardCurveField : forwardCurveFields) {
        final FudgeMsg perCurveMessage = (FudgeMsg) forwardCurveField.getValue();
        final String forwardCurveName = perCurveMessage.getString(FORWARD_CURVE_NAME);
        final List<FudgeField> valueFields = perCurveMessage.getAllByName(SENSITIVITY_TO_FORWARD_VALUE);
        final List<ForwardSensitivity> sensitivities = new ArrayList<>();
        for (int i = 0; i < valueFields.size(); i++) {
          final ForwardSensitivity sensitivity = deserializer.fieldValueToObject(ForwardSensitivity.class, valueFields.get(i));
          sensitivities.add(sensitivity);
        }
        forwardCurveSensitivities.put(forwardCurveName, sensitivities);
      }
      return MulticurveSensitivity.of(yieldCurveSensitivities, forwardCurveSensitivities);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final MulticurveSensitivity object) {
      final Map<String, List<DoublesPair>> yieldCurveSensitivities = object.getYieldDiscountingSensitivities();
      final Map<String, List<ForwardSensitivity>> forwardSensitivities = object.getForwardSensitivities();
      for (final Map.Entry<String, List<DoublesPair>> entry : yieldCurveSensitivities.entrySet()) {
        final MutableFudgeMsg perCurveMessage = serializer.newMessage();
        perCurveMessage.add(YIELD_CURVE_NAME, entry.getKey());
        for (final DoublesPair pair : entry.getValue()) {
          perCurveMessage.add(SENSITIVITY_TO_YIELD_TIME, pair.first);
          perCurveMessage.add(SENSITIVITY_TO_YIELD_VALUE, pair.second);
        }
        message.add(SENSITIVITY_TO_YIELD_DATA, perCurveMessage);
      }
      for (final Map.Entry<String, List<ForwardSensitivity>> entry : forwardSensitivities.entrySet()) {
        final MutableFudgeMsg perCurveMessage = serializer.newMessage();
        perCurveMessage.add(FORWARD_CURVE_NAME, entry.getKey());
        for (final ForwardSensitivity sensitivity : entry.getValue()) {
          serializer.addToMessageWithClassHeaders(perCurveMessage, SENSITIVITY_TO_FORWARD_VALUE, null, sensitivity);
        }
        message.add(SENSITIVITY_TO_FORWARD_DATA, perCurveMessage);
      }
    }

  }

  /**
   * Fudge builder for {@link MultipleCurrencyMulticurveSensitivity}
   */
  @FudgeBuilderFor(MultipleCurrencyMulticurveSensitivity.class)
  public static final class MultipleCurrencyMulticurveSensitivityBuilder extends AbstractFudgeBuilder<MultipleCurrencyMulticurveSensitivity> {
    /** The currencies field */
    private static final String CURRENCY = "currency";
    /** The sensitivities field */
    private static final String SENSITIVITIES = "sensitivities";

    @Override
    public MultipleCurrencyMulticurveSensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final List<FudgeField> currencies = message.getAllByName(CURRENCY);
      final List<FudgeField> sensitivities = message.getAllByName(SENSITIVITIES);
      if (currencies.size() != sensitivities.size()) {
        throw new OpenGammaRuntimeException("Should have same number of sensitivities as currencies");
      }
      MultipleCurrencyMulticurveSensitivity result = new MultipleCurrencyMulticurveSensitivity();
      for (int i = 0; i < currencies.size(); i++) {
        final Currency currency = Currency.of((String) currencies.get(i).getValue());
        final MulticurveSensitivity sensitivity = deserializer.fieldValueToObject(MulticurveSensitivity.class, sensitivities.get(i));
        result = result.plus(currency, sensitivity);
      }
      return result;
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final MultipleCurrencyMulticurveSensitivity object) {
      final Map<Currency, MulticurveSensitivity> sensitivities = object.getSensitivities();
      for (final Map.Entry<Currency, MulticurveSensitivity> entry : sensitivities.entrySet()) {
        message.add(CURRENCY, entry.getKey().getCode());
        serializer.addToMessageWithClassHeaders(message, SENSITIVITIES, null, entry.getValue());
      }
    }

  }

  /**
   * Fudge builder for {@link SimpleParameterSensitivity}
   */
  @FudgeBuilderFor(SimpleParameterSensitivity.class)
  public static final class SimpleParameterSensitivityBuilder extends AbstractFudgeBuilder<SimpleParameterSensitivity> {
    /** The curve name field */
    private static final String CURVE_NAME = "curveName";
    /** The sensitivity field */
    private static final String SENSITIVITY = "sensitivity";
    /** The sensitivity vector per curve field */
    private static final String SENSITIVITIES_FOR_CURVE = "sensitivitiesForCurve";

    @Override
    public SimpleParameterSensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final LinkedHashMap<String, DoubleMatrix1D> sensitivities = new LinkedHashMap<>();
      final List<FudgeField> curves = message.getAllByName(CURVE_NAME);
      final List<FudgeField> sensitivitiesPerCurve = message.getAllByName(SENSITIVITIES_FOR_CURVE);
      if (curves.size() != sensitivitiesPerCurve.size()) {
        throw new OpenGammaRuntimeException("Should have a vector of sensitivities for each curve name");
      }
      for (int i = 0; i < curves.size(); i++) {
        final String curve = (String) curves.get(i).getValue();
        final FudgeMsg perCurveMessage = (FudgeMsg) sensitivitiesPerCurve.get(i).getValue();
        final List<FudgeField> perCurveFields = perCurveMessage.getAllByName(SENSITIVITY);
        final double[] values = new double[perCurveFields.size()];
        for (int j = 0; j < perCurveFields.size(); j++) {
          values[j] = (Double) perCurveFields.get(j).getValue();
        }
        sensitivities.put(curve, new DoubleMatrix1D(values));
      }
      return new SimpleParameterSensitivity(sensitivities);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final SimpleParameterSensitivity object) {
      final Map<String, DoubleMatrix1D> sensitivities = object.getSensitivities();
      for (final Map.Entry<String, DoubleMatrix1D> entry : sensitivities.entrySet()) {
        final MutableFudgeMsg perCurveMessage = serializer.newMessage();
        message.add(CURVE_NAME, entry.getKey());
        final double[] sensitivity = entry.getValue().getData();
        for (final double d : sensitivity) {
          perCurveMessage.add(SENSITIVITY, d);
        }
        message.add(SENSITIVITIES_FOR_CURVE, perCurveMessage);
      }
    }

  }

  /**
   * Fudge builder for {@link MultipleCurrencyParameterSensitivity}
   */
  @FudgeBuilderFor(MultipleCurrencyParameterSensitivity.class)
  public static final class MultipleCurrencyParameterSensitivityBuilder extends AbstractFudgeBuilder<MultipleCurrencyParameterSensitivity> {
    /** The curve name field */
    private static final String CURVE_NAME = "curveName";
    /** The currency field */
    private static final String CURRENCY = "currency";
    /** The sensitivities for a curve / currency pair field */
    private static final String SENSITIVITIES_FOR_PAIR = "sensitivitiesForPair";
    /** The sensitivities field */
    private static final String SENSITIVITY = "sensitivity";

    @Override
    public MultipleCurrencyParameterSensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final LinkedHashMap<Pair<String, Currency>, DoubleMatrix1D> sensitivities = new LinkedHashMap<>();
      final List<FudgeField> curves = message.getAllByName(CURVE_NAME);
      final List<FudgeField> currencies = message.getAllByName(CURRENCY);
      if (curves.size() != currencies.size()) {
        throw new OpenGammaRuntimeException("Should have a currency for each curve name");
      }
      final List<FudgeField> sensitivitiesPerCurve = message.getAllByName(SENSITIVITIES_FOR_PAIR);
      if (curves.size() != sensitivitiesPerCurve.size()) {
        throw new OpenGammaRuntimeException("Should have a vector of sensitivities for each curve name");
      }
      for (int i = 0; i < curves.size(); i++) {
        final String curve = (String) curves.get(i).getValue();
        final Currency currency = Currency.of((String) currencies.get(i).getValue());
        final FudgeMsg perCurveMessage = (FudgeMsg) sensitivitiesPerCurve.get(i).getValue();
        final List<FudgeField> perCurveFields = perCurveMessage.getAllByName(SENSITIVITY);
        final double[] values = new double[perCurveFields.size()];
        for (int j = 0; j < perCurveFields.size(); j++) {
          values[j] = (Double) perCurveFields.get(j).getValue();
        }
        sensitivities.put(Pair.of(curve, currency), new DoubleMatrix1D(values));
      }
      return MultipleCurrencyParameterSensitivity.of(sensitivities);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final MultipleCurrencyParameterSensitivity object) {
      final Map<Pair<String, Currency>, DoubleMatrix1D> sensitivities = object.getSensitivities();
      for (final Map.Entry<Pair<String, Currency>, DoubleMatrix1D> entry : sensitivities.entrySet()) {
        final MutableFudgeMsg perCurveMessage = serializer.newMessage();
        message.add(CURVE_NAME, entry.getKey().getFirst());
        message.add(CURRENCY, entry.getKey().getSecond().getCode());
        final double[] sensitivity = entry.getValue().getData();
        for (final double d : sensitivity) {
          perCurveMessage.add(SENSITIVITY, d);
        }
        message.add(SENSITIVITIES_FOR_PAIR, perCurveMessage);
      }
    }

  }

  /**
   * Fudge builders for {@link CurveBuildingBlock}
   */
  @FudgeBuilderFor(CurveBuildingBlock.class)
  public static final class CurveBuildingBlockBuilder extends AbstractFudgeBuilder<CurveBuildingBlock> {
    /** The curve name field */
    private static final String CURVE_NAME = "curveName";
    /** The starting point of the curve parameters field */
    private static final String START_POINT = "startPoint";
    /** The number of parameters field */
    private static final String N_PARAMETERS = "nParameters";

    @Override
    public CurveBuildingBlock buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final LinkedHashMap<String, Pair<Integer, Integer>> data = new LinkedHashMap<>();
      final List<FudgeField> curveFields = message.getAllByName(CURVE_NAME);
      final List<FudgeField> startPointFields = message.getAllByName(START_POINT);
      final int size = curveFields.size();
      if (size != startPointFields.size()) {
        throw new OpenGammaRuntimeException("Should have one start point per curve name");
      }
      final List<FudgeField> nParametersFields = message.getAllByName(N_PARAMETERS);
      if (size != nParametersFields.size()) {
        throw new OpenGammaRuntimeException("Should have one number of parameters per curve name");
      }
      for (int i = 0; i < size; i++) {
        final String curveName = (String) curveFields.get(i).getValue();
        final Number startPointNumber = (Number) startPointFields.get(i).getValue();
        final Number nParametersNumber = (Number) nParametersFields.get(i).getValue();
        final Integer startPoint = startPointNumber.intValue();
        final Integer nParameters = nParametersNumber.intValue();
        data.put(curveName, Pair.of(startPoint, nParameters));
      }
      return new CurveBuildingBlock(data);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final CurveBuildingBlock object) {
      for (final Map.Entry<String, Pair<Integer, Integer>> entry : object.getData().entrySet()) {
        message.add(CURVE_NAME, entry.getKey());
        message.add(START_POINT, entry.getValue().getFirst());
        message.add(N_PARAMETERS, entry.getValue().getSecond());
      }
    }

  }

  /**
   * Fudge builder for {@link CurveBuildingBlockBundle}
   */
  @FudgeBuilderFor(CurveBuildingBlockBundle.class)
  public static final class CurveBuildingBlockBundleBuilder extends AbstractFudgeBuilder<CurveBuildingBlockBundle> {
    /** The curve name field */
    private static final String CURVE_NAME = "curveName";
    /** The curve building block field */
    private static final String CURVE_BUILDING_BLOCK = "curveBuildingBlock";
    /** The Jacobian field */
    private static final String JACOBIAN = "jacobian";

    @Override
    public CurveBuildingBlockBundle buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final LinkedHashMap<String, Pair<CurveBuildingBlock, DoubleMatrix2D>> data = new LinkedHashMap<>();
      final List<FudgeField> curveNameFields = message.getAllByName(CURVE_NAME);
      final List<FudgeField> curveBuildingBlockFields = message.getAllByName(CURVE_BUILDING_BLOCK);
      final int size = curveNameFields.size();
      if (size != curveBuildingBlockFields.size()) {
        throw new OpenGammaRuntimeException("Should have one curve building block per curve name");
      }
      final List<FudgeField> jacobianFields = message.getAllByName(JACOBIAN);
      if (size != jacobianFields.size()) {
        throw new OpenGammaRuntimeException("Should have one Jacobian per curve name");
      }
      for (int i = 0; i < size; i++) {
        final String curveName = (String) curveNameFields.get(i).getValue();
        final CurveBuildingBlock curveBuildingBlock = deserializer.fieldValueToObject(CurveBuildingBlock.class, curveBuildingBlockFields.get(i));
        final DoubleMatrix2D jacobian = deserializer.fieldValueToObject(DoubleMatrix2D.class, jacobianFields.get(i));
        data.put(curveName, Pair.of(curveBuildingBlock, jacobian));
      }
      return new CurveBuildingBlockBundle(data);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final CurveBuildingBlockBundle object) {
      for (final Map.Entry<String, Pair<CurveBuildingBlock, DoubleMatrix2D>> entry : object.getData().entrySet()) {
        message.add(CURVE_NAME, entry.getKey());
        serializer.addToMessageWithClassHeaders(message, CURVE_BUILDING_BLOCK, null, entry.getValue().getFirst());
        serializer.addToMessageWithClassHeaders(message, JACOBIAN, null, entry.getValue().getSecond());
      }
    }

  }

  /**
   * Fudge builder for {@link InflationSensitivity}
   */
  @FudgeBuilderFor(InflationSensitivity.class)
  public static final class InflationSensitivityBuilder extends AbstractFudgeBuilder<InflationSensitivity> {
    /** The sensitivity field */
    private static final String IR_CURVE_SENSITIVITY = "irCurveSensitivity";
    /** The price curve name field */
    private static final String PRICE_CURVE_NAME = "priceCurveName";
    /** The price curve sensitivities per price curve name */
    private static final String SENSITIVITIES_PER_PRICE_CURVE = "sensitivitiesPerPriceCurve";
    /** The time field */
    private static final String TIME = "time";
    /** The sensitivity field*/
    private static final String SENSITIVITY = "sensitivity";

    @Override
    public InflationSensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final MulticurveSensitivity multicurveSensitivity = deserializer.fieldValueToObject(MulticurveSensitivity.class, message.getByName(IR_CURVE_SENSITIVITY));
      final Map<String, List<DoublesPair>> priceCurveSensitivity = new HashMap<>();
      final List<FudgeField> priceCurveNameFields = message.getAllByName(PRICE_CURVE_NAME);
      final List<FudgeField> sensitivitiesPerCurve = message.getAllByName(SENSITIVITIES_PER_PRICE_CURVE);
      if (priceCurveNameFields.size() != sensitivitiesPerCurve.size()) {
        throw new OpenGammaRuntimeException("Should have one set of price curve sensitivities per price curve name");
      }
      for (int i = 0; i < priceCurveNameFields.size(); i++) {
        final String priceCurveName = (String) priceCurveNameFields.get(i).getValue();
        final FudgeMsg priceCurveSensitivities = (FudgeMsg) sensitivitiesPerCurve.get(i).getValue();
        final List<DoublesPair> sensitivities = new ArrayList<>();
        final List<FudgeField> times = priceCurveSensitivities.getAllByName(TIME);
        final List<FudgeField> sensitivity = priceCurveSensitivities.getAllByName(SENSITIVITY);
        if (times.size() != sensitivity.size()) {
          throw new OpenGammaRuntimeException("Should have one sensitivity per time");
        }
        for (int j = 0; j < times.size(); j++) {
          sensitivities.add(new DoublesPair((Double) times.get(j).getValue(), (Double) sensitivity.get(j).getValue()));
        }
        priceCurveSensitivity.put(priceCurveName, sensitivities);
      }
      return InflationSensitivity.of(multicurveSensitivity, priceCurveSensitivity);
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final InflationSensitivity object) {
      serializer.addToMessageWithClassHeaders(message, IR_CURVE_SENSITIVITY, null, object.getMulticurveSensitivities());
      for (final Map.Entry<String, List<DoublesPair>> entry : object.getPriceCurveSensitivities().entrySet()) {
        message.add(PRICE_CURVE_NAME, entry.getKey());
        final MutableFudgeMsg perCurveMessage = serializer.newMessage();
        for (final DoublesPair pair : entry.getValue()) {
          perCurveMessage.add(TIME, pair.getFirst());
          perCurveMessage.add(SENSITIVITY, pair.getSecond());
        }
        message.add(SENSITIVITIES_PER_PRICE_CURVE, perCurveMessage);
      }
    }

  }

  /**
   * Fudge builder for {@link MultipleCurrencyInflationSensitivity}
   */
  @FudgeBuilderFor(MultipleCurrencyInflationSensitivity.class)
  public static final class MultipleCurrencyInflationSensitivityBuilder extends AbstractFudgeBuilder<MultipleCurrencyInflationSensitivity> {
    /** The currencies field */
    private static final String CURRENCY = "currency";
    /** The sensitivities field */
    private static final String SENSITIVITIES = "sensitivities";

    @Override
    public MultipleCurrencyInflationSensitivity buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
      final List<FudgeField> currencies = message.getAllByName(CURRENCY);
      final List<FudgeField> sensitivities = message.getAllByName(SENSITIVITIES);
      if (currencies.size() != sensitivities.size()) {
        throw new OpenGammaRuntimeException("Should have same number of sensitivities as currencies");
      }
      MultipleCurrencyInflationSensitivity result = new MultipleCurrencyInflationSensitivity();
      for (int i = 0; i < currencies.size(); i++) {
        final Currency currency = Currency.of((String) currencies.get(i).getValue());
        final InflationSensitivity sensitivity = deserializer.fieldValueToObject(InflationSensitivity.class, sensitivities.get(i));
        result = result.plus(currency, sensitivity);
      }
      return result;
    }

    @Override
    protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final MultipleCurrencyInflationSensitivity object) {
      final Map<Currency, InflationSensitivity> sensitivities = object.getSensitivities();
      for (final Map.Entry<Currency, InflationSensitivity> entry : sensitivities.entrySet()) {
        message.add(CURRENCY, entry.getKey().getCode());
        serializer.addToMessageWithClassHeaders(message, SENSITIVITIES, null, entry.getValue());
      }
    }
  }
}
TOP

Related Classes of com.opengamma.financial.analytics.fudgemsg.CurveResultBuilders$CurveBuildingBlockBundleBuilder

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.