/**
* 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 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.math.function.Function;
import com.opengamma.analytics.math.interpolation.Interpolator2D;
import com.opengamma.analytics.math.surface.ConstantDoublesSurface;
import com.opengamma.analytics.math.surface.FunctionalDoublesSurface;
import com.opengamma.analytics.math.surface.InterpolatedDoublesSurface;
/**
*
*/
final class MathSurface {
private MathSurface() {
}
/**
* Fudge builder for {@code ConstantDoublesSurface}
*/
@FudgeBuilderFor(ConstantDoublesSurface.class)
public static final class ConstantDoublesSurfaceBuilder extends AbstractFudgeBuilder<ConstantDoublesSurface> {
private static final String Z_VALUE_FIELD_NAME = "z value";
private static final String SURFACE_NAME_FIELD_NAME = "surface name";
@Override
public ConstantDoublesSurface buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
return ConstantDoublesSurface.from(message.getFieldValue(Double.class, message.getByName(Z_VALUE_FIELD_NAME)), message.getFieldValue(String.class, message.getByName(SURFACE_NAME_FIELD_NAME)));
}
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final ConstantDoublesSurface object) {
message.add(Z_VALUE_FIELD_NAME, null, object.getZValue(0., 0.));
message.add(SURFACE_NAME_FIELD_NAME, null, object.getName());
}
}
/**
* Fudge builder for {@code InterpolatedDoublesSurface}
*/
@FudgeBuilderFor(InterpolatedDoublesSurface.class)
public static final class InterpolatedDoublesSurfaceBuilder extends AbstractFudgeBuilder<InterpolatedDoublesSurface> {
private static final String X_DATA_FIELD_NAME = "x data";
private static final String Y_DATA_FIELD_NAME = "y data";
private static final String Z_DATA_FIELD_NAME = "z data";
private static final String INTERPOLATOR_FIELD_NAME = "interpolator";
private static final String SURFACE_NAME_FIELD_NAME = "surface name";
@Override
public InterpolatedDoublesSurface buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final double[] x = deserializer.fieldValueToObject(double[].class, message.getByName(X_DATA_FIELD_NAME));
final double[] y = deserializer.fieldValueToObject(double[].class, message.getByName(Y_DATA_FIELD_NAME));
final double[] z = deserializer.fieldValueToObject(double[].class, message.getByName(Z_DATA_FIELD_NAME));
final Interpolator2D interpolator = deserializer.fieldValueToObject(Interpolator2D.class, message.getByName(INTERPOLATOR_FIELD_NAME));
final String name = deserializer.fieldValueToObject(String.class, message.getByName(SURFACE_NAME_FIELD_NAME));
return InterpolatedDoublesSurface.from(x, y, z, interpolator, name);
}
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final InterpolatedDoublesSurface object) {
serializer.addToMessage(message, X_DATA_FIELD_NAME, null, object.getXDataAsPrimitive());
serializer.addToMessage(message, Y_DATA_FIELD_NAME, null, object.getYDataAsPrimitive());
serializer.addToMessage(message, Z_DATA_FIELD_NAME, null, object.getZDataAsPrimitive());
serializer.addToMessage(message, INTERPOLATOR_FIELD_NAME, null, object.getInterpolator());
serializer.addToMessage(message, SURFACE_NAME_FIELD_NAME, null, object.getName());
}
}
@FudgeBuilderFor(FunctionalDoublesSurface.class)
public static final class FunctionalDoublesSurfaceBuilder extends AbstractFudgeBuilder<FunctionalDoublesSurface> {
private static final String SURFACE_FUNCTION_FIELD_NAME = "function";
private static final String SURFACE_NAME_FIELD_NAME = "name";
@SuppressWarnings("unchecked")
@Override
public FunctionalDoublesSurface buildObject(final FudgeDeserializer deserializer, final FudgeMsg message) {
final String name = deserializer.fieldValueToObject(String.class, message.getByName(SURFACE_NAME_FIELD_NAME));
final Object function = deserializer.fieldValueToObject(message.getByName(SURFACE_FUNCTION_FIELD_NAME));
if (function instanceof Function) {
return FunctionalDoublesSurface.from((Function) function, name);
}
throw new OpenGammaRuntimeException("Expected serialized Function, got " + function);
}
@Override
protected void buildMessage(final FudgeSerializer serializer, final MutableFudgeMsg message, final FunctionalDoublesSurface object) {
serializer.addToMessage(message, SURFACE_NAME_FIELD_NAME, null, object.getName());
serializer.addToMessage(message, SURFACE_FUNCTION_FIELD_NAME, null, substituteObject(object.getFunction()));
return;
}
}
}