/**
* Copyright (C) 2013 - 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 java.util.Set;
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 org.threeten.bp.LocalDate;
import com.opengamma.financial.analytics.curve.CurveDefinition;
import com.opengamma.financial.analytics.curve.FixedDateInterpolatedCurveDefinition;
import com.opengamma.financial.analytics.curve.InterpolatedCurveDefinition;
import com.opengamma.financial.analytics.ircurve.strips.CurveNode;
import com.opengamma.id.UniqueId;
/**
* Contains builders for all classes that extend {@link CurveDefinition}
*/
public final class CurveDefinitionBuilders {
/** The unique id field name */
private static final String UNIQUE_ID_FIELD = "uniqueId";
/** The name field name */
private static final String NAME_FIELD = "name";
/** The node field name */
private static final String NODE_FIELD = "node";
/**
* Private constructor.
*/
private CurveDefinitionBuilders() {
}
/**
* Fudge builder for a {@link CurveDefinition}
*/
@FudgeBuilderFor(CurveDefinition.class)
public static final class CurveDefinitionFudgeBuilder implements FudgeBuilder<CurveDefinition> {
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final CurveDefinition object) {
final MutableFudgeMsg message = serializer.newMessage();
message.add(null, 0, object.getClass().getName());
serializer.addToMessageWithClassHeaders(message, UNIQUE_ID_FIELD, null, object.getUniqueId(), UniqueId.class);
message.add(NAME_FIELD, object.getName());
for (final CurveNode node : object.getNodes()) {
serializer.addToMessage(message, NODE_FIELD, null, node);
}
return message;
}
@Override
public CurveDefinition buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final String name = message.getString(NAME_FIELD);
final Set<CurveNode> nodes = new TreeSet<>();
final List<FudgeField> nodesFields = message.getAllByName(NODE_FIELD);
for (final FudgeField nodeField : nodesFields) {
final Object obj = deserializer.fieldValueToObject(nodeField);
nodes.add((CurveNode) obj);
}
final CurveDefinition curveDefinition = new CurveDefinition(name, nodes);
final FudgeField uniqueId = message.getByName(UNIQUE_ID_FIELD);
if (uniqueId != null) {
curveDefinition.setUniqueId(deserializer.fieldValueToObject(UniqueId.class, uniqueId));
}
return curveDefinition;
}
}
/**
* Fudge builder for a {@link InterpolatedCurveDefinition}
*/
@FudgeBuilderFor(InterpolatedCurveDefinition.class)
public static final class InterpolatedCurveDefinitionFudgeBuilder implements FudgeBuilder<InterpolatedCurveDefinition> {
/** Interpolator field name */
private static final String INTERPOLATOR_NAME_FIELD = "interpolatorName";
/** Right extrapolator field name */
private static final String RIGHT_EXTRAPOLATOR_NAME_FIELD = "rightExtrapolatorName";
/** Left extrapolator field name */
private static final String LEFT_EXTRAPOLATOR_NAME_FIELD = "leftExtrapolatorName";
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final InterpolatedCurveDefinition object) {
final MutableFudgeMsg message = serializer.newMessage();
message.add(null, 0, object.getClass().getName());
serializer.addToMessageWithClassHeaders(message, UNIQUE_ID_FIELD, null, object.getUniqueId(), UniqueId.class);
message.add(NAME_FIELD, object.getName());
for (final CurveNode node : object.getNodes()) {
serializer.addToMessage(message, NODE_FIELD, null, node);
}
message.add(INTERPOLATOR_NAME_FIELD, object.getInterpolatorName());
if (object.getRightExtrapolatorName() != null) {
message.add(RIGHT_EXTRAPOLATOR_NAME_FIELD, object.getRightExtrapolatorName());
message.add(LEFT_EXTRAPOLATOR_NAME_FIELD, object.getLeftExtrapolatorName());
}
return message;
}
@Override
public InterpolatedCurveDefinition buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final String name = message.getString(NAME_FIELD);
final Set<CurveNode> nodes = new TreeSet<>();
final List<FudgeField> nodesFields = message.getAllByName(NODE_FIELD);
for (final FudgeField nodeField : nodesFields) {
final Object obj = deserializer.fieldValueToObject(nodeField);
nodes.add((CurveNode) obj);
}
final String interpolatorName = message.getString(INTERPOLATOR_NAME_FIELD);
final InterpolatedCurveDefinition curveDefinition;
if (message.hasField(RIGHT_EXTRAPOLATOR_NAME_FIELD)) {
final String rightExtrapolatorName = message.getString(RIGHT_EXTRAPOLATOR_NAME_FIELD);
final String leftExtrapolatorName = message.getString(LEFT_EXTRAPOLATOR_NAME_FIELD);
curveDefinition = new InterpolatedCurveDefinition(name, nodes, interpolatorName, rightExtrapolatorName, leftExtrapolatorName);
} else {
curveDefinition = new InterpolatedCurveDefinition(name, nodes, interpolatorName);
}
final FudgeField uniqueId = message.getByName(UNIQUE_ID_FIELD);
if (uniqueId != null) {
curveDefinition.setUniqueId(deserializer.fieldValueToObject(UniqueId.class, uniqueId));
}
return curveDefinition;
}
}
/**
* Fudge builder for a {@link FixedDateInterpolatedCurveDefinition}
*/
@FudgeBuilderFor(FixedDateInterpolatedCurveDefinition.class)
public static final class FixedDateInterpolatedCurveDefintion implements FudgeBuilder<FixedDateInterpolatedCurveDefinition> {
/** Interpolator field name */
private static final String INTERPOLATOR_NAME_FIELD = "interpolatorName";
/** Right extrapolator field name */
private static final String RIGHT_EXTRAPOLATOR_NAME_FIELD = "rightExtrapolatorName";
/** Left extrapolator field name */
private static final String LEFT_EXTRAPOLATOR_NAME_FIELD = "leftExtrapolatorName";
/** Fixed dates field name */
private static final String FIXED_DATE_FIELD = "fixedDate";
@Override
public MutableFudgeMsg buildMessage(final FudgeSerializer serializer, final FixedDateInterpolatedCurveDefinition object) {
final MutableFudgeMsg message = serializer.newMessage();
message.add(null, 0, object.getClass().getName());
serializer.addToMessageWithClassHeaders(message, UNIQUE_ID_FIELD, null, object.getUniqueId(), UniqueId.class);
message.add(NAME_FIELD, object.getName());
for (final CurveNode node : object.getNodes()) {
serializer.addToMessage(message, NODE_FIELD, null, node);
}
message.add(INTERPOLATOR_NAME_FIELD, object.getInterpolatorName());
if (object.getRightExtrapolatorName() != null) {
message.add(RIGHT_EXTRAPOLATOR_NAME_FIELD, object.getRightExtrapolatorName());
message.add(LEFT_EXTRAPOLATOR_NAME_FIELD, object.getLeftExtrapolatorName());
}
final List<LocalDate> fixedDates = object.getFixedDates();
for (final LocalDate fixedDate : fixedDates) {
serializer.addToMessageWithClassHeaders(message, FIXED_DATE_FIELD, null, fixedDate, LocalDate.class);
}
return message;
}
@Override
public FixedDateInterpolatedCurveDefinition buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final String name = message.getString(NAME_FIELD);
final Set<CurveNode> nodes = new TreeSet<>();
final List<FudgeField> nodesFields = message.getAllByName(NODE_FIELD);
for (final FudgeField nodeField : nodesFields) {
final Object obj = deserializer.fieldValueToObject(nodeField);
nodes.add((CurveNode) obj);
}
final String interpolatorName = message.getString(INTERPOLATOR_NAME_FIELD);
final FixedDateInterpolatedCurveDefinition curveDefinition;
final List<FudgeField> fixedDatesFields = message.getAllByName(FIXED_DATE_FIELD);
final List<LocalDate> fixedDates = new ArrayList<>();
for (final FudgeField fixedDateField : fixedDatesFields) {
fixedDates.add(deserializer.fieldValueToObject(LocalDate.class, fixedDateField));
}
if (message.hasField(RIGHT_EXTRAPOLATOR_NAME_FIELD)) {
final String rightExtrapolatorName = message.getString(RIGHT_EXTRAPOLATOR_NAME_FIELD);
final String leftExtrapolatorName = message.getString(LEFT_EXTRAPOLATOR_NAME_FIELD);
curveDefinition = new FixedDateInterpolatedCurveDefinition(name, nodes, interpolatorName, rightExtrapolatorName, leftExtrapolatorName, fixedDates);
} else {
curveDefinition = new FixedDateInterpolatedCurveDefinition(name, nodes, interpolatorName, fixedDates);
}
final FudgeField uniqueId = message.getByName(UNIQUE_ID_FIELD);
if (uniqueId != null) {
curveDefinition.setUniqueId(deserializer.fieldValueToObject(UniqueId.class, uniqueId));
}
return curveDefinition;
}
}
}