/**
* Copyright (C) 2009 - 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 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.google.common.collect.Lists;
import com.opengamma.analytics.financial.model.interestrate.curve.DayPeriodPreCalculatedDiscountCurve;
import com.opengamma.analytics.financial.model.interestrate.curve.DiscountCurve;
import com.opengamma.analytics.financial.model.interestrate.curve.PriceIndexCurveSimple;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountAddZeroSpreadCurve;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldAndDiscountCurve;
import com.opengamma.analytics.financial.model.interestrate.curve.YieldCurve;
import com.opengamma.analytics.math.curve.DoublesCurve;
/**
* Holds Fudge builders for the interest rate curve model.
*/
/* package */ final class ModelInterestRateCurve {
/**
* Restricted constructor.
*/
private ModelInterestRateCurve() {
}
/**
* Fudge builder for {@link YieldCurve}
*/
@FudgeBuilderFor(YieldCurve.class)
public static final class YieldCurveBuilder extends AbstractFudgeBuilder<YieldCurve> {
/** The curve field */
private static final String CURVE_FIELD_NAME = "curve";
/** The name field */
private static final String NAME_FIELD_NAME = "name";
@Override
public YieldCurve buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final DoublesCurve curve = deserializer.fieldValueToObject(DoublesCurve.class, message.getByName(CURVE_FIELD_NAME));
final String name;
if (message.hasField(NAME_FIELD_NAME)) {
name = message.getString(NAME_FIELD_NAME);
} else {
name = curve.getName();
}
return new YieldCurve(name, curve);
}
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final YieldCurve object) {
serializer.addToMessageWithClassHeaders(message, CURVE_FIELD_NAME, null, object.getCurve(), DoublesCurve.class);
serializer.addToMessage(message, NAME_FIELD_NAME, null, object.getName());
}
}
/**
* Fudge builder for {@link DiscountCurve}
*/
@FudgeBuilderFor(DiscountCurve.class)
public static final class DiscountCurveBuilder extends AbstractFudgeBuilder<DiscountCurve> {
/** The curve field */
private static final String CURVE_FIELD_NAME = "curve";
/** The name field */
private static final String NAME_FIELD_NAME = "name";
@Override
public DiscountCurve buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final DoublesCurve curve = deserializer.fieldValueToObject(DoublesCurve.class, message.getByName(CURVE_FIELD_NAME));
final String name;
if (message.hasField(NAME_FIELD_NAME)) {
name = message.getString(NAME_FIELD_NAME);
} else {
name = curve.getName();
}
return new DiscountCurve(name, curve);
}
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final DiscountCurve object) {
serializer.addToMessageWithClassHeaders(message, CURVE_FIELD_NAME, null, object.getCurve(), DoublesCurve.class);
serializer.addToMessage(message, NAME_FIELD_NAME, null, object.getName());
}
}
/**
* Fudge builder for {@link DayPeriodPreCalculatedDiscountCurve}
*/
@FudgeBuilderFor(DayPeriodPreCalculatedDiscountCurve.class)
public static final class DayPeriodPreCalculatedDiscountCurveBuilder extends AbstractFudgeBuilder<DayPeriodPreCalculatedDiscountCurve> {
/** The curve field */
private static final String CURVE_FIELD_NAME = "curve";
/** The name field */
private static final String NAME_FIELD_NAME = "name";
@Override
public DayPeriodPreCalculatedDiscountCurve buildObject(FudgeDeserializer deserializer, FudgeMsg message) {
final DoublesCurve curve = deserializer.fieldValueToObject(DoublesCurve.class, message.getByName(CURVE_FIELD_NAME));
final String name;
if (message.hasField(NAME_FIELD_NAME)) {
name = message.getString(NAME_FIELD_NAME);
} else {
name = curve.getName();
}
return new DayPeriodPreCalculatedDiscountCurve(name, curve);
}
@Override
protected void buildMessage(FudgeSerializer serializer, MutableFudgeMsg message, DayPeriodPreCalculatedDiscountCurve object) {
serializer.addToMessageWithClassHeaders(message, CURVE_FIELD_NAME, null, object.getCurve(), DoublesCurve.class);
serializer.addToMessage(message, NAME_FIELD_NAME, null, object.getName());
}
}
/**
* Fudge builder for {@link PriceIndexCurveSimple}
*/
@FudgeBuilderFor(PriceIndexCurveSimple.class)
public static final class PriceIndexCurveBuilder extends AbstractFudgeBuilder<PriceIndexCurveSimple> {
/** The curve field */
private static final String CURVE_FIELD = "curve";
@Override
public PriceIndexCurveSimple buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final DoublesCurve curve = deserializer.fieldValueToObject(DoublesCurve.class, message.getByName(CURVE_FIELD));
return new PriceIndexCurveSimple(curve);
}
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final PriceIndexCurveSimple object) {
serializer.addToMessageWithClassHeaders(message, CURVE_FIELD, null, object.getCurve(), DoublesCurve.class);
}
}
/**
* Fudge builder for {@link YieldAndDiscountAddZeroSpreadCurve}. This will work as long as there are Fudge builders
* available for the delegate curve types.
*/
@FudgeBuilderFor(YieldAndDiscountAddZeroSpreadCurve.class)
public static final class YieldAndDiscountAddZeroSpreadCurveFudgeBuilder extends AbstractFudgeBuilder<YieldAndDiscountAddZeroSpreadCurve> {
/** The curve field */
private static final String CURVES_FIELD = "curves";
/** The name field */
private static final String NAME_FIELD = "name";
/** The subtract field */
private static final String SUBTRACT_FIELD = "subtract";
@Override
protected void buildMessage(FudgeSerializer serializer,
MutableFudgeMsg message,
YieldAndDiscountAddZeroSpreadCurve curve) {
serializer.addToMessage(message, NAME_FIELD, null, curve.getName());
serializer.addToMessage(message, SUBTRACT_FIELD, null, curve.getSign() < 0);
MutableFudgeMsg curvesMessage = serializer.newMessage();
for (YieldAndDiscountCurve yieldAndDiscountCurve : curve.getCurves()) {
serializer.addToMessage(curvesMessage, null, null, yieldAndDiscountCurve);
}
serializer.addToMessage(message, CURVES_FIELD, null, curvesMessage);
}
@Override
public YieldAndDiscountAddZeroSpreadCurve buildObject(FudgeDeserializer deserializer, FudgeMsg message) {
String name = deserializer.fieldValueToObject(String.class, message.getByName(NAME_FIELD));
FudgeMsg curvesMessage = message.getMessage(CURVES_FIELD);
List<YieldAndDiscountCurve> curves = Lists.newArrayList();
for (FudgeField field : curvesMessage) {
curves.add(deserializer.fieldValueToObject(YieldAndDiscountCurve.class, field));
}
boolean subtract = deserializer.fieldValueToObject(Boolean.class, message.getByName(SUBTRACT_FIELD));
YieldAndDiscountCurve[] curveArray = curves.toArray(new YieldAndDiscountCurve[curves.size()]);
return new YieldAndDiscountAddZeroSpreadCurve(name, subtract, curveArray);
}
}
}