/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.security.option;
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.ZonedDateTime;
import com.opengamma.util.fudgemsg.AbstractFudgeBuilder;
import com.opengamma.util.time.Expiry;
import com.opengamma.util.time.ExpiryFudgeBuilder;
import com.opengamma.util.time.ZonedDateTimeFudgeBuilder;
/**
* A Fudge builder for {@code PayoffStyle} implementations.
*/
public class PayoffStyleFudgeBuilder extends AbstractFudgeBuilder {
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code AssetOrNothingPayoffStyle}.
*/
@FudgeBuilderFor(AssetOrNothingPayoffStyle.class)
public static class AssetOrNothingPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<AssetOrNothingPayoffStyle> {
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, AssetOrNothingPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
return msg;
}
@Override
public AssetOrNothingPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
return new AssetOrNothingPayoffStyle();
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code AsymmetricPoweredPayoffStyle}.
*/
@FudgeBuilderFor(AsymmetricPoweredPayoffStyle.class)
public static class AsymmetricPoweredPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<AsymmetricPoweredPayoffStyle> {
/** Field name. */
public static final String POWER_FIELD_NAME = "power";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, AsymmetricPoweredPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
addToMessage(msg, POWER_FIELD_NAME, object.getPower());
return msg;
}
@Override
public AsymmetricPoweredPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
double power = msg.getDouble(POWER_FIELD_NAME);
return new AsymmetricPoweredPayoffStyle(power);
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code BarrierPayoffStyle}.
*/
@FudgeBuilderFor(BarrierPayoffStyle.class)
public static class BarrierPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<BarrierPayoffStyle> {
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, BarrierPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
return msg;
}
@Override
public BarrierPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
return new BarrierPayoffStyle();
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code CappedPoweredPayoffStyle}.
*/
@FudgeBuilderFor(CappedPoweredPayoffStyle.class)
public static class CappedPoweredPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<CappedPoweredPayoffStyle> {
/** Field name. */
public static final String POWER_FIELD_NAME = "power";
/** Field name. */
public static final String CAP_FIELD_NAME = "cap";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, CappedPoweredPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
addToMessage(msg, POWER_FIELD_NAME, object.getPower());
addToMessage(msg, CAP_FIELD_NAME, object.getCap());
return msg;
}
@Override
public CappedPoweredPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
double power = msg.getDouble(POWER_FIELD_NAME);
double cap = msg.getDouble(CAP_FIELD_NAME);
return new CappedPoweredPayoffStyle(power, cap);
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code CashOrNothingPayoffStyle}.
*/
@FudgeBuilderFor(CashOrNothingPayoffStyle.class)
public static class CashOrNothingPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<CashOrNothingPayoffStyle> {
/** Field name. */
public static final String PAYMENT_FIELD_NAME = "payment";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, CashOrNothingPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
addToMessage(msg, PAYMENT_FIELD_NAME, object.getPayment());
return msg;
}
@Override
public CashOrNothingPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
double payment = msg.getDouble(PAYMENT_FIELD_NAME);
return new CashOrNothingPayoffStyle(payment);
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code ExtremeSpreadPayoffStyle}.
*/
@FudgeBuilderFor(ExtremeSpreadPayoffStyle.class)
public static class ExtremeSpreadPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<ExtremeSpreadPayoffStyle> {
/** Field name. */
public static final String PERIOD_END_FIELD_NAME = "periodEnd";
/** Field name. */
public static final String IS_REVERSE_FIELD_NAME = "isReverse";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, ExtremeSpreadPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
addToMessage(msg, PERIOD_END_FIELD_NAME, ZonedDateTimeFudgeBuilder.toFudgeMsg(serializer, object.getPeriodEnd()));
addToMessage(msg, IS_REVERSE_FIELD_NAME, object.isReverse());
return msg;
}
@Override
public ExtremeSpreadPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
ZonedDateTime periodEnd = ZonedDateTimeFudgeBuilder.fromFudgeMsg(deserializer, msg.getMessage(PERIOD_END_FIELD_NAME));
boolean reverse = msg.getBoolean(IS_REVERSE_FIELD_NAME);
return new ExtremeSpreadPayoffStyle(periodEnd, reverse);
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code FadeInPayoffStyle}.
*/
@FudgeBuilderFor(FadeInPayoffStyle.class)
public static class FadeInPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<FadeInPayoffStyle> {
/** Field name. */
public static final String LOWER_BOUND_FIELD_NAME = "lowerBound";
/** Field name. */
public static final String UPPER_BOUND_FIELD_NAME = "upperBound";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, FadeInPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
addToMessage(msg, LOWER_BOUND_FIELD_NAME, object.getUpperBound());
addToMessage(msg, UPPER_BOUND_FIELD_NAME, object.getLowerBound());
return msg;
}
@Override
public FadeInPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
double upperBound = msg.getDouble(LOWER_BOUND_FIELD_NAME);
double lowerBound = msg.getDouble(UPPER_BOUND_FIELD_NAME);
return new FadeInPayoffStyle(upperBound, lowerBound);
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code FixedStrikeLookbackPayoffStyle}.
*/
@FudgeBuilderFor(FixedStrikeLookbackPayoffStyle.class)
public static class FixedStrikeLookbackPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<FixedStrikeLookbackPayoffStyle> {
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, FixedStrikeLookbackPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
return msg;
}
@Override
public FixedStrikeLookbackPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
return new FixedStrikeLookbackPayoffStyle();
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code FloatingStrikeLookbackPayoffStyle}.
*/
@FudgeBuilderFor(FloatingStrikeLookbackPayoffStyle.class)
public static class FloatingStrikeLookbackPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<FloatingStrikeLookbackPayoffStyle> {
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, FloatingStrikeLookbackPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
return msg;
}
@Override
public FloatingStrikeLookbackPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
return new FloatingStrikeLookbackPayoffStyle();
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code GapPayoffStyle}.
*/
@FudgeBuilderFor(GapPayoffStyle.class)
public static class GapPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<GapPayoffStyle> {
/** Field name. */
public static final String PAYMENT_FIELD_NAME = "payment";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, GapPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
addToMessage(msg, PAYMENT_FIELD_NAME, object.getPayment());
return msg;
}
@Override
public GapPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
double payment = msg.getDouble(PAYMENT_FIELD_NAME);
return new GapPayoffStyle(payment);
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code PoweredPayoffStyle}.
*/
@FudgeBuilderFor(PoweredPayoffStyle.class)
public static class PoweredPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<PoweredPayoffStyle> {
/** Field name. */
public static final String POWER_FIELD_NAME = "power";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, PoweredPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
addToMessage(msg, POWER_FIELD_NAME, object.getPower());
return msg;
}
@Override
public PoweredPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
double power = msg.getDouble(POWER_FIELD_NAME);
return new PoweredPayoffStyle(power);
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code SimpleChooserPayoffStyle}.
*/
@FudgeBuilderFor(SimpleChooserPayoffStyle.class)
public static class SimpleChooserPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<SimpleChooserPayoffStyle> {
/** Field name. */
public static final String CHOOSE_DATE_FIELD_NAME = "chooseDate";
/** Field name. */
public static final String UNDERLYING_STRIKE_FIELD_NAME = "underlyingStrike";
/** Field name. */
public static final String UNDERLYING_EXPIRY_FIELD_NAME = "underlyingExpiry";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, SimpleChooserPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
addToMessage(msg, CHOOSE_DATE_FIELD_NAME, ZonedDateTimeFudgeBuilder.toFudgeMsg(serializer, object.getChooseDate()));
addToMessage(msg, UNDERLYING_STRIKE_FIELD_NAME, object.getUnderlyingStrike());
addToMessage(msg, UNDERLYING_EXPIRY_FIELD_NAME, ExpiryFudgeBuilder.toFudgeMsg(serializer, object.getUnderlyingExpiry()));
return msg;
}
@Override
public SimpleChooserPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
ZonedDateTime chooseDate = ZonedDateTimeFudgeBuilder.fromFudgeMsg(deserializer, msg.getMessage(CHOOSE_DATE_FIELD_NAME));
double strike = msg.getDouble(UNDERLYING_STRIKE_FIELD_NAME);
Expiry expiry = ExpiryFudgeBuilder.fromFudgeMsg(deserializer, msg.getMessage(UNDERLYING_EXPIRY_FIELD_NAME));
return new SimpleChooserPayoffStyle(chooseDate, strike, expiry);
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code SupersharePayoffStyle}.
*/
@FudgeBuilderFor(SupersharePayoffStyle.class)
public static class SupersharePayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<SupersharePayoffStyle> {
/** Field name. */
public static final String LOWER_BOUND_FIELD_NAME = "lowerBound";
/** Field name. */
public static final String UPPER_BOUND_FIELD_NAME = "upperBound";
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, SupersharePayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
addToMessage(msg, LOWER_BOUND_FIELD_NAME, object.getUpperBound());
addToMessage(msg, UPPER_BOUND_FIELD_NAME, object.getLowerBound());
return msg;
}
@Override
public SupersharePayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
double upperBound = msg.getDouble(LOWER_BOUND_FIELD_NAME);
double lowerBound = msg.getDouble(UPPER_BOUND_FIELD_NAME);
return new SupersharePayoffStyle(upperBound, lowerBound);
}
}
//-------------------------------------------------------------------------
/**
* A Fudge builder for {@code VanillaPayoffStyle}.
*/
@FudgeBuilderFor(VanillaPayoffStyle.class)
public static class VanillaPayoffStyleBuilder extends PayoffStyleFudgeBuilder implements FudgeBuilder<VanillaPayoffStyle> {
@Override
public MutableFudgeMsg buildMessage(FudgeSerializer serializer, VanillaPayoffStyle object) {
final MutableFudgeMsg msg = serializer.newMessage();
return msg;
}
@Override
public VanillaPayoffStyle buildObject(FudgeDeserializer deserializer, FudgeMsg msg) {
return new VanillaPayoffStyle();
}
}
}