/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.analytics.financial.instrument; import java.util.HashMap; import java.util.Map; import org.threeten.bp.LocalDate; import com.opengamma.timeseries.DoubleTimeSeries; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.MultipleCurrencyAmount; /** * Returns the netted results of pay and receive cash-flows, where a negative value implies a net liability. */ public final class NettedFixedCashFlowVisitor extends InstrumentDefinitionVisitorSameMethodAdapter<DoubleTimeSeries<LocalDate>, Map<LocalDate, MultipleCurrencyAmount>> { private static final FixedPayCashFlowVisitor PAY_VISITOR = FixedPayCashFlowVisitor.getInstance(); private static final FixedReceiveCashFlowVisitor RECEIVE_VISITOR = FixedReceiveCashFlowVisitor.getInstance(); private static final NettedFixedCashFlowVisitor INSTANCE = new NettedFixedCashFlowVisitor(); public static InstrumentDefinitionVisitorSameMethodAdapter<DoubleTimeSeries<LocalDate>, Map<LocalDate, MultipleCurrencyAmount>> getVisitor() { return INSTANCE; } /** * Returns netted known cash-flows, including any floating cash-flows that have fixed. * @param instrument The instrument, not null * @return A map containing netted cash-flows. */ @Override public Map<LocalDate, MultipleCurrencyAmount> visit(final InstrumentDefinition<?> instrument) { return visit(instrument, null); } /** * Returns netted known cash-flows, including any floating cash-flows that have fixed. * @param instrument The instrument, not null * @param indexFixingTimeSeries The fixing time series * @return A map containing netted cash-flows. */ @Override public Map<LocalDate, MultipleCurrencyAmount> visit(final InstrumentDefinition<?> instrument, final DoubleTimeSeries<LocalDate> indexFixingTimeSeries) { ArgumentChecker.notNull(instrument, "instrument"); final Map<LocalDate, MultipleCurrencyAmount> payCashFlows = instrument.accept(PAY_VISITOR, indexFixingTimeSeries); final Map<LocalDate, MultipleCurrencyAmount> receiveCashFlows = instrument.accept(RECEIVE_VISITOR, indexFixingTimeSeries); return add(payCashFlows, receiveCashFlows); } private static Map<LocalDate, MultipleCurrencyAmount> add(final Map<LocalDate, MultipleCurrencyAmount> payCashFlows, final Map<LocalDate, MultipleCurrencyAmount> receiveCashFlows) { final Map<LocalDate, MultipleCurrencyAmount> result = new HashMap<>(receiveCashFlows); for (final Map.Entry<LocalDate, MultipleCurrencyAmount> entry : payCashFlows.entrySet()) { final MultipleCurrencyAmount mca = entry.getValue().multipliedBy(-1); final LocalDate date = entry.getKey(); if (result.containsKey(date)) { result.put(date, result.get(date).plus(mca)); } else { result.put(date, mca); } } return result; } }