/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.fudgemsg;
import java.util.List;
import java.util.SortedSet;
import java.util.TreeSet;
import org.fudgemsg.FudgeField;
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.analytics.math.interpolation.Interpolator1DFactory;
import com.opengamma.financial.analytics.ircurve.FixedIncomeStrip;
import com.opengamma.financial.analytics.ircurve.YieldCurveDefinition;
import com.opengamma.id.ExternalId;
import com.opengamma.id.UniqueId;
import com.opengamma.util.money.Currency;
/**
* Builder for converting {@link YieldCurveDefinition} instances to/from Fudge messages.
*/
@FudgeBuilderFor(YieldCurveDefinition.class)
public class YieldCurveDefinitionFudgeBuilder implements FudgeBuilder<YieldCurveDefinition> {
private static final String CURRENCY_FIELD = "currency";
private static final String REGION_FIELD = "region";
private static final String NAME_FIELD = "name";
private static final String INTERPOLATOR_NAME_FIELD = "interpolatorName";
private static final String LEFT_EXTRAPOLATOR_NAME_FIELD = "leftExtrapolatorName";
private static final String RIGHT_EXTRAPOLATOR_NAME_FIELD = "rightExtrapolatorName";
private static final String INTERPOLATE_YIELDS_FIELD = "interpolateYields";
private static final String STRIP_FIELD = "strip";
private static final String UNIQUE_ID_FIELD = "uniqueId";
private static final String DEFAULT_LEFT_EXTRAPOLATOR_NAME = Interpolator1DFactory.LINEAR_EXTRAPOLATOR;
private static final String DEFAULT_RIGHT_EXTRAPOLATOR_NAME = Interpolator1DFactory.LINEAR_EXTRAPOLATOR;
private static final boolean DEFAULT_INTERPOLATE_YIELD_VALUE = true;
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final YieldCurveDefinition object) {
final MutableFudgeMsg message = serializer.newMessage();
serializer.addToMessage(message, CURRENCY_FIELD, null, object.getCurrency());
if (object.getRegionId() != null) {
serializer.addToMessage(message, REGION_FIELD, null, object.getRegionId());
}
message.add(NAME_FIELD, object.getName());
message.add(INTERPOLATOR_NAME_FIELD, object.getInterpolatorName());
message.add(LEFT_EXTRAPOLATOR_NAME_FIELD, object.getLeftExtrapolatorName());
message.add(RIGHT_EXTRAPOLATOR_NAME_FIELD, object.getRightExtrapolatorName());
message.add(INTERPOLATE_YIELDS_FIELD, object.isInterpolateYields());
for (final FixedIncomeStrip strip : object.getStrips()) {
serializer.addToMessage(message, STRIP_FIELD, null, strip);
}
serializer.addToMessageWithClassHeaders(message, UNIQUE_ID_FIELD, null, object.getUniqueId(), UniqueId.class);
return message;
}
@Override
public YieldCurveDefinition buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final Currency currency = deserializer.fieldValueToObject(Currency.class, message.getByName(CURRENCY_FIELD));
ExternalId region = null;
if (message.hasField(REGION_FIELD)) {
region = deserializer.fieldValueToObject(ExternalId.class, message.getByName(REGION_FIELD));
}
final String name = message.getString(NAME_FIELD);
final String interpolatorName = message.getString(INTERPOLATOR_NAME_FIELD);
final List<FudgeField> allByOrdinal = message.getAllByName(STRIP_FIELD);
final SortedSet<FixedIncomeStrip> strips = new TreeSet<FixedIncomeStrip>();
for (final FudgeField field : allByOrdinal) {
final FixedIncomeStrip strip = deserializer.fieldValueToObject(FixedIncomeStrip.class, field);
strips.add(strip);
}
final String leftExtrapolatorName;
if (message.hasField(LEFT_EXTRAPOLATOR_NAME_FIELD)) {
leftExtrapolatorName = message.getString(LEFT_EXTRAPOLATOR_NAME_FIELD);
} else {
leftExtrapolatorName = DEFAULT_LEFT_EXTRAPOLATOR_NAME;
}
final String rightExtrapolatorName;
if (message.hasField(RIGHT_EXTRAPOLATOR_NAME_FIELD)) {
rightExtrapolatorName = message.getString(RIGHT_EXTRAPOLATOR_NAME_FIELD);
} else {
rightExtrapolatorName = DEFAULT_RIGHT_EXTRAPOLATOR_NAME;
}
final boolean interpolateYields;
if (message.hasField(INTERPOLATE_YIELDS_FIELD)) {
interpolateYields = message.getBoolean(INTERPOLATE_YIELDS_FIELD);
} else {
interpolateYields = DEFAULT_INTERPOLATE_YIELD_VALUE;
}
final YieldCurveDefinition curveDefinition = new YieldCurveDefinition(currency, region, name, interpolatorName,
leftExtrapolatorName, rightExtrapolatorName, interpolateYields, strips);
final FudgeField uniqueId = message.getByName(UNIQUE_ID_FIELD);
if (uniqueId != null) {
curveDefinition.setUniqueId(deserializer.fieldValueToObject(UniqueId.class, uniqueId));
}
return curveDefinition;
}
}