/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.provider.calculator.generic;
import com.opengamma.analytics.financial.commodity.derivative.AgricultureFutureOption;
import com.opengamma.analytics.financial.commodity.derivative.EnergyFutureOption;
import com.opengamma.analytics.financial.commodity.derivative.MetalFutureOption;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.AgricultureFutureSecurity;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.AgricultureFutureTransaction;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.CouponCommodityCashSettle;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.CouponCommodityPhysicalSettle;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.EnergyFutureSecurity;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.EnergyFutureTransaction;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.ForwardCommodityCashSettle;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.ForwardCommodityPhysicalSettle;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.MetalFutureSecurity;
import com.opengamma.analytics.financial.commodity.multicurvecommodity.derivative.MetalFutureTransaction;
import com.opengamma.analytics.financial.equity.option.EquityIndexFutureOption;
import com.opengamma.analytics.financial.equity.option.EquityIndexOption;
import com.opengamma.analytics.financial.equity.option.EquityOption;
import com.opengamma.analytics.financial.forex.derivative.Forex;
import com.opengamma.analytics.financial.forex.derivative.ForexSwap;
import com.opengamma.analytics.financial.interestrate.InstrumentDerivativeVisitorAdapter;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity;
import com.opengamma.analytics.financial.interestrate.annuity.derivative.AnnuityCouponFixed;
import com.opengamma.analytics.financial.interestrate.bond.definition.BillTransaction;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondFixedSecurity;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondFixedTransaction;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondIborSecurity;
import com.opengamma.analytics.financial.interestrate.bond.definition.BondIborTransaction;
import com.opengamma.analytics.financial.interestrate.cash.derivative.Cash;
import com.opengamma.analytics.financial.interestrate.cash.derivative.DepositCounterpart;
import com.opengamma.analytics.financial.interestrate.cash.derivative.DepositIbor;
import com.opengamma.analytics.financial.interestrate.cash.derivative.DepositZero;
import com.opengamma.analytics.financial.interestrate.fra.derivative.ForwardRateAgreement;
import com.opengamma.analytics.financial.interestrate.future.derivative.BondFuturesOptionPremiumSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.BondFuturesOptionPremiumTransaction;
import com.opengamma.analytics.financial.interestrate.future.derivative.FederalFundsFutureTransaction;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureOptionMarginSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureOptionMarginTransaction;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureOptionPremiumSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureOptionPremiumTransaction;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureSecurity;
import com.opengamma.analytics.financial.interestrate.future.derivative.InterestRateFutureTransaction;
import com.opengamma.analytics.financial.interestrate.future.derivative.SwapFuturesPriceDeliverableTransaction;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationYearOnYearInterpolation;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationYearOnYearMonthly;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponInterpolation;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponInterpolationGearing;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponMonthly;
import com.opengamma.analytics.financial.interestrate.inflation.derivative.CouponInflationZeroCouponMonthlyGearing;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponCMS;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixed;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixedAccruedCompounding;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponFixedCompounding;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIbor;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborCompounding;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborCompoundingFlatSpread;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborCompoundingSpread;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponIborSpread;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponON;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONArithmeticAverageSpread;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONArithmeticAverageSpreadSimplified;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONCompounded;
import com.opengamma.analytics.financial.interestrate.payments.derivative.CouponONSpread;
import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment;
import com.opengamma.analytics.financial.interestrate.payments.derivative.PaymentFixed;
import com.opengamma.analytics.financial.interestrate.swap.derivative.Swap;
import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapFixedCoupon;
import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapMultileg;
import com.opengamma.analytics.financial.interestrate.swaption.derivative.SwaptionCashFixedIbor;
/**
* Get the last time (in years from now) referenced in the instrument description.
*/
public class LastTimeCalculator extends InstrumentDerivativeVisitorAdapter<Object, Double> {
/** Static instance of this class */
private static final LastTimeCalculator CALCULATOR = new LastTimeCalculator();
/**
* @return A static instance of this class
*/
public static LastTimeCalculator getInstance() {
return CALCULATOR;
}
protected LastTimeCalculator() {
}
@Override
public Double visitCash(final Cash cash) {
return cash.getEndTime();
}
@Override
public Double visitDepositIbor(final DepositIbor deposit) {
return deposit.getEndTime();
}
@Override
public Double visitDepositCounterpart(final DepositCounterpart deposit) {
return deposit.getEndTime();
}
@Override
public Double visitFixedCouponSwap(final SwapFixedCoupon<?> swap) {
return visitSwap(swap);
}
@Override
public Double visitForwardRateAgreement(final ForwardRateAgreement fra) {
return fra.getFixingPeriodEndTime();
}
@Override
public Double visitInterestRateFutureTransaction(final InterestRateFutureTransaction future) {
return future.getUnderlyingSecurity().getFixingPeriodEndTime();
}
@Override
public Double visitFederalFundsFutureTransaction(final FederalFundsFutureTransaction future) {
final double[] fixingPeriods = future.getUnderlyingSecurity().getFixingPeriodTime();
return fixingPeriods[fixingPeriods.length - 1];
}
@Override
public Double visitInterestRateFutureSecurity(final InterestRateFutureSecurity future) {
return future.getFixingPeriodEndTime();
}
@Override
public Double visitSwapFuturesPriceDeliverableTransaction(final SwapFuturesPriceDeliverableTransaction future) {
return visitSwap(future.getUnderlyingSecurity().getUnderlyingSwap());
}
@Override
public Double visitFixedPayment(final PaymentFixed payment) {
return payment.getPaymentTime();
}
@Override
public Double visitCouponIbor(final CouponIbor payment) {
return Math.max(payment.getFixingPeriodEndTime(), payment.getPaymentTime());
}
@Override
public Double visitCouponIborSpread(final CouponIborSpread payment) {
return Math.max(payment.getFixingPeriodEndTime(), payment.getPaymentTime());
}
@Override
public Double visitCouponIborCompounding(final CouponIborCompounding payment) {
return Math.max(payment.getFixingPeriodEndTimes()[payment.getFixingPeriodEndTimes().length - 1], payment.getPaymentTime());
}
@Override
public Double visitCouponIborCompoundingSpread(final CouponIborCompoundingSpread payment) {
return Math.max(payment.getFixingPeriodEndTimes()[payment.getFixingPeriodEndTimes().length - 1], payment.getPaymentTime());
}
@Override
public Double visitCouponIborCompoundingFlatSpread(final CouponIborCompoundingFlatSpread payment) {
return Math.max(payment.getFixingPeriodEndTimes()[payment.getFixingPeriodEndTimes().length - 1], payment.getPaymentTime());
}
@Override
public Double visitGenericAnnuity(final Annuity<? extends Payment> annuity) {
return annuity.getNthPayment(annuity.getNumberOfPayments() - 1).accept(this);
}
@Override
public Double visitSwap(final Swap<?, ?> swap) {
final double a = swap.getFirstLeg().accept(this);
final double b = swap.getSecondLeg().accept(this);
return Math.max(a, b);
}
@Override
public Double visitSwapMultileg(final SwapMultileg swap) {
double timeMax = swap.getLegs()[0].accept(this);
for (int looleg = 1; looleg < swap.getLegs().length; looleg++) {
timeMax = Math.max(timeMax, swap.getLegs()[0].accept(this));
}
return timeMax;
}
@Override
public Double visitFixedCouponAnnuity(final AnnuityCouponFixed annuity) {
return visitGenericAnnuity(annuity);
}
@Override
public Double visitCouponFixed(final CouponFixed payment) {
return payment.getPaymentTime();
}
@Override
public Double visitCouponFixedCompounding(final CouponFixedCompounding payment) {
return payment.getPaymentTime();
}
@Override
public Double visitCouponFixedAccruedCompounding(final CouponFixedAccruedCompounding payment) {
return payment.getPaymentTime();
}
@Override
public Double visitCouponONCompounded(final CouponONCompounded payment) {
return payment.getPaymentTime();
}
@Override
public Double visitSwaptionCashFixedIbor(final SwaptionCashFixedIbor swaption) {
return visitSwap(swaption.getUnderlyingSwap());
}
@Override
public Double visitCouponCMS(final CouponCMS payment) {
final double swapLastTime = payment.getUnderlyingSwap().accept(this);
final double paymentTime = payment.getPaymentTime();
return Math.max(swapLastTime, paymentTime);
}
@Override
public Double visitCouponOIS(final CouponON payment) {
return payment.getPaymentTime();
}
@Override
public Double visitCouponONSpread(final CouponONSpread payment) {
return payment.getPaymentTime();
}
@Override
public Double visitCouponONArithmeticAverageSpreadSimplified(final CouponONArithmeticAverageSpreadSimplified payment) {
return payment.getPaymentTime();
}
@Override
public Double visitCouponONArithmeticAverageSpread(final CouponONArithmeticAverageSpread payment) {
return payment.getPaymentTime();
}
@Override
public Double visitDepositZero(final DepositZero deposit) {
return deposit.getEndTime();
}
// ----- Bond -----
@Override
public Double visitBondFixedSecurity(final BondFixedSecurity bond) {
return Math.max(bond.getCoupon().accept(this), bond.getNominal().accept(this));
}
@Override
public Double visitBondFixedTransaction(final BondFixedTransaction bond) {
return bond.getBondStandard().accept(this);
}
@Override
public Double visitBondIborSecurity(final BondIborSecurity bond) {
return Math.max(bond.getCoupon().accept(this), bond.getNominal().accept(this));
}
@Override
public Double visitBondIborTransaction(final BondIborTransaction bond) {
return bond.getBondStandard().accept(this);
}
// ----- Bill -----
@Override
public Double visitBillTransaction(final BillTransaction bill) {
return bill.getBillStandard().getEndTime();
}
// ----- Forex -----
@Override
public Double visitForexSwap(final ForexSwap fx) {
return fx.getFarLeg().getPaymentTime();
}
@Override
public Double visitForex(final Forex fx) {
return fx.getPaymentTime();
}
@Override
public Double visitAgricultureFutureOption(final AgricultureFutureOption option) {
return option.getExpiry();
}
@Override
public Double visitEnergyFutureOption(final EnergyFutureOption option) {
return option.getExpiry();
}
@Override
public Double visitMetalFutureOption(final MetalFutureOption option) {
return option.getExpiry();
}
@Override
public Double visitBondFutureOptionPremiumSecurity(final BondFuturesOptionPremiumSecurity option) {
return option.getExpirationTime();
}
@Override
public Double visitBondFutureOptionPremiumTransaction(final BondFuturesOptionPremiumTransaction option) {
return option.getUnderlyingOption().getExpirationTime();
}
@Override
public Double visitInterestRateFutureOptionMarginSecurity(final InterestRateFutureOptionMarginSecurity option) {
return option.getExpirationTime();
}
@Override
public Double visitInterestRateFutureOptionMarginTransaction(final InterestRateFutureOptionMarginTransaction option) {
return option.getUnderlyingSecurity().getExpirationTime();
}
@Override
public Double visitInterestRateFutureOptionPremiumSecurity(final InterestRateFutureOptionPremiumSecurity option) {
return option.getExpirationTime();
}
@Override
public Double visitInterestRateFutureOptionPremiumTransaction(final InterestRateFutureOptionPremiumTransaction option) {
return option.getUnderlyingSecurity().getExpirationTime();
}
@Override
public Double visitEquityIndexOption(final EquityIndexOption option) {
return option.getTimeToExpiry();
}
@Override
public Double visitEquityOption(final EquityOption option) {
return option.getTimeToExpiry();
}
@Override
public Double visitEquityIndexFutureOption(final EquityIndexFutureOption option) {
return option.getExpiry();
}
// ----- Inflation -----
@Override
public Double visitCouponInflationZeroCouponMonthly(final CouponInflationZeroCouponMonthly coupon) {
return coupon.getPaymentTime();
}
@Override
public Double visitCouponInflationZeroCouponMonthlyGearing(final CouponInflationZeroCouponMonthlyGearing coupon) {
return coupon.getPaymentTime();
}
@Override
public Double visitCouponInflationZeroCouponInterpolation(final CouponInflationZeroCouponInterpolation coupon) {
return coupon.getPaymentTime();
}
@Override
public Double visitCouponInflationZeroCouponInterpolationGearing(final CouponInflationZeroCouponInterpolationGearing coupon) {
return coupon.getPaymentTime();
}
@Override
public Double visitCouponInflationYearOnYearMonthly(final CouponInflationYearOnYearMonthly coupon) {
return coupon.getPaymentTime();
}
@Override
public Double visitCouponInflationYearOnYearInterpolation(final CouponInflationYearOnYearInterpolation coupon) {
return coupon.getPaymentTime();
}
//----- Commodity -----
@Override
public Double visitAgricultureFutureSecurity(final AgricultureFutureSecurity future) {
return future.getLastTradingTime();
}
@Override
public Double visitEnergyFutureSecurity(final EnergyFutureSecurity future) {
return future.getLastTradingTime();
}
@Override
public Double visitMetalFutureSecurity(final MetalFutureSecurity future) {
return future.getLastTradingTime();
}
@Override
public Double visitAgricultureFutureTransaction(final AgricultureFutureTransaction future) {
return future.getUnderlying().getLastTradingTime();
}
@Override
public Double visitEnergyFutureTransaction(final EnergyFutureTransaction future) {
return future.getUnderlying().getLastTradingTime();
}
@Override
public Double visitMetalFutureTransaction(final MetalFutureTransaction future) {
return future.getUnderlying().getLastTradingTime();
}
@Override
public Double visitCouponCommodityCashSettle(final CouponCommodityCashSettle future) {
return future.getSettlementTime();
}
@Override
public Double visitCouponCommodityPhysicalSettle(final CouponCommodityPhysicalSettle future) {
return future.getSettlementTime();
}
@Override
public Double visitForwardCommodityCashSettle(final ForwardCommodityCashSettle future) {
return future.getSettlementTime();
}
@Override
public Double visitForwardCommodityPhysicalSettle(final ForwardCommodityPhysicalSettle future) {
return future.getSettlementTime();
}
}