/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.instrument.swap; import java.util.Arrays; import org.threeten.bp.ZonedDateTime; import com.opengamma.analytics.financial.instrument.InstrumentDefinitionVisitor; import com.opengamma.analytics.financial.instrument.InstrumentDefinitionWithData; import com.opengamma.analytics.financial.instrument.annuity.AnnuityDefinition; import com.opengamma.analytics.financial.instrument.payment.PaymentDefinition; import com.opengamma.analytics.financial.interestrate.annuity.derivative.Annuity; import com.opengamma.analytics.financial.interestrate.payments.derivative.Payment; import com.opengamma.analytics.financial.interestrate.swap.derivative.SwapMultileg; import com.opengamma.timeseries.precise.zdt.ZonedDateTimeDoubleTimeSeries; import com.opengamma.util.ArgumentChecker; /** * Class describing a generic swap with multiple legs. */ public class SwapMultilegDefinition implements InstrumentDefinitionWithData<SwapMultileg, ZonedDateTimeDoubleTimeSeries[]> { /** * The swap legs. */ private final AnnuityDefinition<? extends PaymentDefinition>[] _legs; public SwapMultilegDefinition(final AnnuityDefinition<? extends PaymentDefinition>[] legs) { ArgumentChecker.noNulls(legs, "legs"); ArgumentChecker.isTrue(legs.length > 0, "SwapMultileg should have at least one leg"); _legs = legs; } /** * Returns the legs. * @return The legs. */ public AnnuityDefinition<? extends PaymentDefinition>[] getLegs() { return _legs; } @Override public SwapMultileg toDerivative(ZonedDateTime date) { ArgumentChecker.notNull(date, "date"); final int nbLegs = _legs.length; @SuppressWarnings("unchecked") final Annuity<? extends Payment>[] legs = new Annuity[nbLegs]; for (int loopleg = 0; loopleg < nbLegs; loopleg++) { legs[loopleg] = _legs[loopleg].toDerivative(date); } return new SwapMultileg(legs); } @Override public SwapMultileg toDerivative(ZonedDateTime date, ZonedDateTimeDoubleTimeSeries[] data) { ArgumentChecker.notNull(date, "date"); ArgumentChecker.noNulls(data, "times series"); final int nbLegs = _legs.length; ArgumentChecker.isTrue(data.length == nbLegs, "Data has not the same length as number of legs."); @SuppressWarnings("unchecked") final Annuity<? extends Payment>[] legs = new Annuity[nbLegs]; for (int loopleg = 0; loopleg < nbLegs; loopleg++) { legs[loopleg] = _legs[loopleg].toDerivative(date, data[loopleg]); } return new SwapMultileg(legs); } @Override public <U, V> V accept(InstrumentDefinitionVisitor<U, V> visitor, U data) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitSwapMultilegDefinition(this, data); } @Override public <V> V accept(InstrumentDefinitionVisitor<?, V> visitor) { ArgumentChecker.notNull(visitor, "visitor"); return visitor.visitSwapMultilegDefinition(this); } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + Arrays.hashCode(_legs); return result; } @Override public boolean equals(Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } SwapMultilegDefinition other = (SwapMultilegDefinition) obj; if (!Arrays.equals(_legs, other._legs)) { return false; } return true; } }