/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.analytics.cashflow; import java.util.Map; import java.util.NavigableMap; import java.util.TreeMap; import org.apache.commons.lang.ObjectUtils; import org.apache.commons.lang.StringUtils; import org.threeten.bp.LocalDate; import com.opengamma.util.ArgumentChecker; import com.opengamma.util.money.CurrencyAmount; import com.opengamma.util.money.MultipleCurrencyAmount; /** * */ public class FixedPaymentMatrix { private final NavigableMap<LocalDate, MultipleCurrencyAmount> _values; private final int _maxCurrencyAmounts; public FixedPaymentMatrix() { _values = new TreeMap<LocalDate, MultipleCurrencyAmount>(); _maxCurrencyAmounts = 0; } public FixedPaymentMatrix(final Map<LocalDate, MultipleCurrencyAmount> values) { ArgumentChecker.notNull(values, "values"); _values = new TreeMap<LocalDate, MultipleCurrencyAmount>(values); int count = 0; for (final MultipleCurrencyAmount mca : values.values()) { if (mca.size() > count) { count = mca.size(); } } _maxCurrencyAmounts = count; } public FixedPaymentMatrix(final Map<LocalDate, MultipleCurrencyAmount> values, final int maxCurrencyAmounts) { ArgumentChecker.notNull(values, "values"); ArgumentChecker.notNegative(maxCurrencyAmounts, "max currency amounts"); _values = new TreeMap<LocalDate, MultipleCurrencyAmount>(values); _maxCurrencyAmounts = maxCurrencyAmounts; } public FixedPaymentMatrix add(final Map<LocalDate, MultipleCurrencyAmount> payments) { ArgumentChecker.notNull(payments, "payments"); final Map<LocalDate, MultipleCurrencyAmount> values = new TreeMap<LocalDate, MultipleCurrencyAmount>(_values); int count = getMaxCurrencyAmounts(); for (final Map.Entry<LocalDate, MultipleCurrencyAmount> entry : payments.entrySet()) { final LocalDate date = entry.getKey(); final MultipleCurrencyAmount mca = entry.getValue(); if (mca.size() > count) { count = mca.size(); } if (values.containsKey(date)) { values.put(date, values.get(date).plus(mca)); } else { values.put(date, mca); } } return new FixedPaymentMatrix(values, count); } public FixedPaymentMatrix add(final FixedPaymentMatrix matrix) { ArgumentChecker.notNull(matrix, "matrix"); return add(matrix.getValues()); } public Map<LocalDate, MultipleCurrencyAmount> getValues() { return _values; } public int getMaxCurrencyAmounts() { return _maxCurrencyAmounts; } public LocalDate[] getDatesAsArray() { return _values.keySet().toArray(new LocalDate[_values.size()]); } public String[][] getCurrencyAmountsAsStringArray() { final String[][] matrix = new String[_values.size()][getMaxCurrencyAmounts()]; int i = 0; for (final MultipleCurrencyAmount mca : _values.values()) { final CurrencyAmount[] ca = mca.getCurrencyAmounts(); for (int j = 0; j < getMaxCurrencyAmounts(); j++) { if (j < mca.size()) { matrix[i][j] = ca.toString(); } else { matrix[i][j] = StringUtils.EMPTY; } } i++; } return matrix; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + _values.hashCode(); return result; } @Override public boolean equals(final Object obj) { if (this == obj) { return true; } if (obj == null) { return false; } if (getClass() != obj.getClass()) { return false; } final FixedPaymentMatrix other = (FixedPaymentMatrix) obj; return ObjectUtils.equals(_values, other._values); } }