/**
* 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.List;
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.tuple.Pair;
/**
*
*/
public class FloatingPaymentMatrix {
private final NavigableMap<LocalDate, List<Pair<CurrencyAmount, String>>> _values;
private final int _maxEntries;
public FloatingPaymentMatrix() {
_values = new TreeMap<LocalDate, List<Pair<CurrencyAmount, String>>>();
_maxEntries = 0;
}
public FloatingPaymentMatrix(final Map<LocalDate, List<Pair<CurrencyAmount, String>>> values) {
ArgumentChecker.notNull(values, "values");
_values = new TreeMap<LocalDate, List<Pair<CurrencyAmount, String>>>(values);
int count = 0;
for (final List<Pair<CurrencyAmount, String>> pairs : values.values()) {
if (pairs.size() > count) {
count = pairs.size();
}
}
_maxEntries = count;
}
public FloatingPaymentMatrix(final Map<LocalDate, List<Pair<CurrencyAmount, String>>> values, final int maxEntries) {
ArgumentChecker.notNull(values, "values");
ArgumentChecker.notNegative(maxEntries, "max entries");
_values = new TreeMap<LocalDate, List<Pair<CurrencyAmount, String>>>(values);
_maxEntries = maxEntries;
}
public FloatingPaymentMatrix add(final Map<LocalDate, List<Pair<CurrencyAmount, String>>> resets) {
ArgumentChecker.notNull(resets, "resets");
final Map<LocalDate, List<Pair<CurrencyAmount, String>>> values = new TreeMap<LocalDate, List<Pair<CurrencyAmount, String>>>(_values);
for (final Map.Entry<LocalDate, List<Pair<CurrencyAmount, String>>> entry : resets.entrySet()) {
final LocalDate date = entry.getKey();
final List<Pair<CurrencyAmount, String>> newList = entry.getValue();
if (values.containsKey(date)) {
final List<Pair<CurrencyAmount, String>> list = values.get(date);
list.addAll(newList);
values.put(date, list);
} else {
values.put(date, newList);
}
}
return new FloatingPaymentMatrix(values);
}
public FloatingPaymentMatrix add(final FloatingPaymentMatrix matrix) {
ArgumentChecker.notNull(matrix, "matrix");
return add(matrix.getValues());
}
public Map<LocalDate, List<Pair<CurrencyAmount, String>>> getValues() {
return _values;
}
public int getMaxEntries() {
return _maxEntries;
}
public LocalDate[] getDatesAsArray() {
return _values.keySet().toArray(new LocalDate[_values.size()]);
}
public String[][] getCurrencyAmountsAsStringArray() {
final String[][] matrix = new String[_values.size()][_maxEntries];
int i = 0;
for (final List<Pair<CurrencyAmount, String>> list : _values.values()) {
final int size = list.size();
for (int j = 0; j < getMaxEntries(); j++) {
if (j < size) {
final StringBuffer sb = new StringBuffer(list.get(j).getFirst().toString());
sb.append(", ");
sb.append(list.get(j).getSecond());
matrix[i][j] = sb.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 FloatingPaymentMatrix other = (FloatingPaymentMatrix) obj;
return ObjectUtils.equals(_values, other._values);
}
}