/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.analytics.financial.greeks;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.NavigableMap;
import org.apache.commons.lang.Validate;
import com.opengamma.analytics.financial.pnl.UnderlyingType;
/**
*
*/
public class MixedOrderUnderlying implements Underlying {
private final List<NthOrderUnderlying> _orders;
private final List<UnderlyingType> _underlyings;
private final int _totalOrder;
public MixedOrderUnderlying(final NavigableMap<Integer, UnderlyingType> underlyings) {
Validate.notNull(underlyings, "underlyings");
if (underlyings.size() < 2) {
throw new IllegalArgumentException("Must have at least two underlying types to have mixed order");
}
_orders = new ArrayList<>();
_underlyings = new ArrayList<>();
int totalOrder = 0;
UnderlyingType underlying;
for (final Entry<Integer, UnderlyingType> entry : underlyings.entrySet()) {
final int key = entry.getKey();
if (key < 1) {
throw new IllegalArgumentException("Order must be at least one to have mixed order");
}
underlying = entry.getValue();
_orders.add(new NthOrderUnderlying(key, underlying));
_underlyings.add(underlying);
totalOrder += key;
}
_totalOrder = totalOrder;
}
public MixedOrderUnderlying(final List<NthOrderUnderlying> underlyings) {
Validate.notNull(underlyings, "underlyings");
if (underlyings.size() < 2) {
throw new IllegalArgumentException("Must have at least two nth order underlyings to have mixed order");
}
_orders = new ArrayList<>(underlyings);
_underlyings = new ArrayList<>();
int totalOrder = 0;
for (final NthOrderUnderlying nth : underlyings) {
if (nth.getOrder() < 1) {
throw new IllegalArgumentException("Order must be at least one to have mixed order");
}
totalOrder += nth.getOrder();
_underlyings.addAll(nth.getUnderlyings());
}
_totalOrder = totalOrder;
}
@Override
public int getOrder() {
return _totalOrder;
}
public List<NthOrderUnderlying> getUnderlyingOrders() {
return _orders;
}
@Override
public List<UnderlyingType> getUnderlyings() {
return _underlyings;
}
// NOTE: hashCode() and equals() are deliberately not overridden. Please do
// not implement them unless you want to
// break a load of code
}