/**
* 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.ArrayList;
import java.util.List;
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 org.threeten.bp.LocalDate;
import com.opengamma.financial.analytics.curve.AbstractCurveSpecification;
import com.opengamma.financial.analytics.curve.ConstantCurveSpecification;
import com.opengamma.financial.analytics.curve.CurveSpecification;
import com.opengamma.financial.analytics.curve.InterpolatedCurveSpecification;
import com.opengamma.financial.analytics.curve.SpreadCurveSpecification;
import com.opengamma.financial.analytics.ircurve.strips.CurveNodeWithIdentifier;
import com.opengamma.id.ExternalId;
/**
* Contains fudge builders for descendant classes of {@link AbstractCurveSpecification}.
*/
public final class CurveSpecificationBuilders {
/** The curve date field */
private static final String CURVE_DATE_FIELD = "curveDate";
/** The curve name field */
private static final String NAME_FIELD = "name";
/** The strips field */
private static final String RESOLVED_STRIPS_FIELD = "resolvedStrips";
/**
* Private constructor
*/
private CurveSpecificationBuilders() {
}
/**
* Builder for converting {@link CurveSpecification} instances to/from Fudge messages.
*/
@FudgeBuilderFor(CurveSpecification.class)
public static final class CurveSpecificationBuilder implements FudgeBuilder<CurveSpecification> {
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final CurveSpecification object) {
final MutableFudgeMsg message = serializer.newMessage();
message.add(null, 0, object.getClass().getName());
serializer.addToMessage(message, CURVE_DATE_FIELD, null, object.getCurveDate());
message.add(NAME_FIELD, object.getName());
for (final CurveNodeWithIdentifier resolvedStrip : object.getNodes()) {
serializer.addToMessageWithClassHeaders(message, RESOLVED_STRIPS_FIELD, null, resolvedStrip, CurveNodeWithIdentifier.class);
}
return message;
}
@Override
public CurveSpecification buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final LocalDate curveDate = deserializer.fieldValueToObject(LocalDate.class, message.getByName(CURVE_DATE_FIELD));
final String name = message.getString(NAME_FIELD);
final List<FudgeField> nodeFields = message.getAllByName(RESOLVED_STRIPS_FIELD);
final List<CurveNodeWithIdentifier> nodes = new ArrayList<>();
for (final FudgeField resolvedStripField : nodeFields) {
nodes.add(deserializer.fieldValueToObject(CurveNodeWithIdentifier.class, resolvedStripField));
}
return new CurveSpecification(curveDate, name, nodes);
}
}
/**
* Builder for converting {@link InterpolatedCurveSpecification} instances to/from Fudge messages.
*/
@FudgeBuilderFor(InterpolatedCurveSpecification.class)
public static final class InterpolatedCurveSpecificationBuilder implements FudgeBuilder<InterpolatedCurveSpecification> {
/** The interpolator name field */
private static final String INTERPOLATOR_NAME_FIELD = "interpolatorName";
/** The right extrapolator name field */
private static final String RIGHT_EXTRAPOLATOR_NAME_FIELD = "rightExtrapolatorName";
/** The left extrapolator name field */
private static final String LEFT_EXTRAPOLATOR_NAME_FIELD = "leftExtrapolatorName";
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final InterpolatedCurveSpecification object) {
final MutableFudgeMsg message = serializer.newMessage();
message.add(null, 0, object.getClass().getName());
serializer.addToMessage(message, CURVE_DATE_FIELD, null, object.getCurveDate());
message.add(NAME_FIELD, object.getName());
for (final CurveNodeWithIdentifier resolvedStrip : object.getNodes()) {
serializer.addToMessageWithClassHeaders(message, RESOLVED_STRIPS_FIELD, null, resolvedStrip, CurveNodeWithIdentifier.class);
}
message.add(INTERPOLATOR_NAME_FIELD, object.getInterpolatorName());
message.add(RIGHT_EXTRAPOLATOR_NAME_FIELD, object.getRightExtrapolatorName());
message.add(LEFT_EXTRAPOLATOR_NAME_FIELD, object.getLeftExtrapolatorName());
return message;
}
@Override
public InterpolatedCurveSpecification buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final LocalDate curveDate = deserializer.fieldValueToObject(LocalDate.class, message.getByName(CURVE_DATE_FIELD));
final String name = message.getString(NAME_FIELD);
final List<FudgeField> nodeFields = message.getAllByName(RESOLVED_STRIPS_FIELD);
final List<CurveNodeWithIdentifier> nodes = new ArrayList<>();
for (final FudgeField resolvedStripField : nodeFields) {
nodes.add(deserializer.fieldValueToObject(CurveNodeWithIdentifier.class, resolvedStripField));
}
final String interpolatorName = message.getString(INTERPOLATOR_NAME_FIELD);
final String rightExtrapolatorName = message.getString(RIGHT_EXTRAPOLATOR_NAME_FIELD);
final String leftExtrapolatorName = message.getString(LEFT_EXTRAPOLATOR_NAME_FIELD);
return new InterpolatedCurveSpecification(curveDate, name, nodes, interpolatorName, rightExtrapolatorName, leftExtrapolatorName);
}
}
/**
* Builder for converting {@link ConstantCurveSpecification} instances to / from Fudge messages.
*/
@FudgeBuilderFor(ConstantCurveSpecification.class)
public static final class ConstantCurveSpecificationBuilder implements FudgeBuilder<ConstantCurveSpecification> {
/** The data id field */
private static final String DATA_ID_FIELD = "dataId";
/** The data field */
private static final String DATA_FIELD = "data";
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final ConstantCurveSpecification object) {
final MutableFudgeMsg message = serializer.newMessage();
message.add(null, 0, object.getClass().getName());
serializer.addToMessage(message, CURVE_DATE_FIELD, null, object.getCurveDate());
message.add(NAME_FIELD, object.getName());
serializer.addToMessage(message, DATA_ID_FIELD, null, object.getIdentifier());
message.add(DATA_FIELD, null, object.getDataField());
return message;
}
@Override
public ConstantCurveSpecification buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final LocalDate curveDate = deserializer.fieldValueToObject(LocalDate.class, message.getByName(CURVE_DATE_FIELD));
final String name = message.getString(NAME_FIELD);
final ExternalId dataId = deserializer.fieldValueToObject(ExternalId.class, message.getByName(DATA_ID_FIELD));
final String dataField = message.getString(DATA_FIELD);
return new ConstantCurveSpecification(curveDate, name, dataId, dataField);
}
}
/**
* Builder for converting {@link SpreadCurveSpecification} instances to / from Fudge messages.
*/
@FudgeBuilderFor(SpreadCurveSpecification.class)
public static final class SpreadCurveSpecificationBuilder implements FudgeBuilder<SpreadCurveSpecification> {
/** The first curve field */
private static final String FIRST_CURVE_FIELD = "firstCurve";
/** The second curve field */
private static final String SECOND_CURVE_FIELD = "secondCurve";
/** The operation field */
private static final String OPERATION_FIELD = "operation";
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final SpreadCurveSpecification object) {
final MutableFudgeMsg message = serializer.newMessage();
message.add(null, 0, object.getClass().getName());
serializer.addToMessage(message, CURVE_DATE_FIELD, null, object.getCurveDate());
message.add(NAME_FIELD, object.getName());
serializer.addToMessage(message, FIRST_CURVE_FIELD, null, object.getFirstCurve());
message.add(OPERATION_FIELD, object.getOperation());
serializer.addToMessage(message, SECOND_CURVE_FIELD, null, object.getSecondCurve());
return message;
}
@Override
public SpreadCurveSpecification buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final LocalDate curveDate = deserializer.fieldValueToObject(LocalDate.class, message.getByName(CURVE_DATE_FIELD));
final String name = message.getString(NAME_FIELD);
final AbstractCurveSpecification firstCurve = deserializer.fieldValueToObject(AbstractCurveSpecification.class, message.getByName(FIRST_CURVE_FIELD));
final String operation = message.getString(OPERATION_FIELD);
final AbstractCurveSpecification secondCurve = deserializer.fieldValueToObject(AbstractCurveSpecification.class, message.getByName(SECOND_CURVE_FIELD));
return new SpreadCurveSpecification(curveDate, name, firstCurve, secondCurve, operation);
}
}
}