/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.aggregation;
import java.util.Arrays;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import com.opengamma.core.position.Position;
import com.opengamma.core.position.impl.SimplePositionComparator;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.financial.security.FinancialSecurity;
import com.opengamma.financial.security.FinancialSecurityVisitor;
import com.opengamma.financial.security.FinancialSecurityVisitorSameValueAdapter;
import com.opengamma.financial.security.deposit.ContinuousZeroDepositSecurity;
import com.opengamma.financial.security.deposit.PeriodicZeroDepositSecurity;
import com.opengamma.financial.security.deposit.SimpleZeroDepositSecurity;
import com.opengamma.financial.security.equity.EquitySecurity;
import com.opengamma.financial.security.option.CommodityFutureOptionSecurity;
import com.opengamma.financial.security.option.EquityBarrierOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexDividendFutureOptionSecurity;
import com.opengamma.financial.security.option.EquityIndexOptionSecurity;
import com.opengamma.financial.security.option.EquityOptionSecurity;
import com.opengamma.financial.security.option.FXBarrierOptionSecurity;
import com.opengamma.financial.security.option.FXDigitalOptionSecurity;
import com.opengamma.financial.security.option.FXOptionSecurity;
import com.opengamma.financial.security.option.FxFutureOptionSecurity;
import com.opengamma.financial.security.option.IRFutureOptionSecurity;
import com.opengamma.financial.security.option.NonDeliverableFXDigitalOptionSecurity;
import com.opengamma.financial.security.option.NonDeliverableFXOptionSecurity;
import com.opengamma.financial.security.option.OptionType;
import com.opengamma.util.CompareUtils;
/**
* Function to classify positions by Currency.
*
*/
public class StocksPutsCallsAggregationFunction implements AggregationFunction<String> {
private static final String NAME = "Stocks/Puts/Calls";
private static final String NA = "N/A";
private static final String STOCKS = "Stocks";
private static final String PUTS = "Puts";
private static final String CALLS = "Calls";
private static final List<String> REQUIRED_ENTRIES = Arrays.asList(STOCKS, CALLS, PUTS, NA);
private final SecuritySource _secSource;
private final boolean _useAttributes;
/**
* Creates an instance that does not use attributes.
*
* @param secSource the security source, not null
*/
public StocksPutsCallsAggregationFunction(final SecuritySource secSource) {
this(secSource, false);
}
/**
* Creates an instance.
*
* @param secSource the security source, not null
* @param useAttributes whether to use attributes
*/
public StocksPutsCallsAggregationFunction(final SecuritySource secSource, final boolean useAttributes) {
_secSource = secSource;
_useAttributes = useAttributes;
}
//-------------------------------------------------------------------------
@Override
public String classifyPosition(final Position position) {
if (_useAttributes) {
final Map<String, String> attributes = position.getAttributes();
if (attributes.containsKey(getName())) {
return attributes.get(getName());
} else {
return NA;
}
} else {
position.getSecurityLink().resolve(_secSource);
final FinancialSecurityVisitor<String> visitor = new FinancialSecurityVisitorSameValueAdapter<String>(NA) {
@Override
public String visitEquitySecurity(final EquitySecurity security) {
return STOCKS;
}
@Override
public String visitEquityIndexOptionSecurity(final EquityIndexOptionSecurity security) {
return security.getOptionType() == OptionType.CALL ? CALLS : PUTS;
}
@Override
public String visitEquityOptionSecurity(final EquityOptionSecurity security) {
return security.getOptionType() == OptionType.CALL ? CALLS : PUTS;
}
@Override
public String visitEquityBarrierOptionSecurity(final EquityBarrierOptionSecurity security) {
return security.getOptionType() == OptionType.CALL ? CALLS : PUTS;
}
@Override
public String visitFXOptionSecurity(final FXOptionSecurity security) {
return security.getCallAmount() > 0 ? CALLS : PUTS; // check this!
}
@Override
public String visitNonDeliverableFXOptionSecurity(final NonDeliverableFXOptionSecurity security) {
return security.getCallAmount() > 0 ? CALLS : PUTS; // check this!
}
@Override
public String visitIRFutureOptionSecurity(final IRFutureOptionSecurity security) {
return security.getOptionType() == OptionType.CALL ? CALLS : PUTS;
}
@Override
public String visitCommodityFutureOptionSecurity(final CommodityFutureOptionSecurity security) {
return security.getOptionType() == OptionType.CALL ? CALLS : PUTS;
}
@Override
public String visitFxFutureOptionSecurity(final FxFutureOptionSecurity security) {
return security.getOptionType() == OptionType.CALL ? CALLS : PUTS;
}
@Override
public String visitEquityIndexDividendFutureOptionSecurity(
final EquityIndexDividendFutureOptionSecurity security) {
return security.getOptionType() == OptionType.CALL ? CALLS : PUTS;
}
@Override
public String visitFXBarrierOptionSecurity(final FXBarrierOptionSecurity security) {
return security.getCallAmount() > 0 ? CALLS : PUTS; // check this!
}
@Override
public String visitFXDigitalOptionSecurity(final FXDigitalOptionSecurity security) {
return security.getCallAmount() > 0 ? CALLS : PUTS; // check this!
}
@Override
public String visitNonDeliverableFXDigitalOptionSecurity(final NonDeliverableFXDigitalOptionSecurity security) {
return security.getCallAmount() > 0 ? CALLS : PUTS; // check this!
}
@Override
public String visitSimpleZeroDepositSecurity(final SimpleZeroDepositSecurity security) {
throw new UnsupportedOperationException("SimpleZeroDepositSecurity should not be used in a position");
}
@Override
public String visitPeriodicZeroDepositSecurity(final PeriodicZeroDepositSecurity security) {
throw new UnsupportedOperationException("PeriodicZeroDepositSecurity should not be used in a position");
}
@Override
public String visitContinuousZeroDepositSecurity(final ContinuousZeroDepositSecurity security) {
throw new UnsupportedOperationException("ContinuousZeroDepositSecurity should not be used in a position");
}
};
if (position.getSecurity() instanceof FinancialSecurity) {
final FinancialSecurity finSec = (FinancialSecurity) position.getSecurity();
return finSec.accept(visitor);
}
return NA;
}
}
@Override
public String getName() {
return NAME;
}
@Override
public Collection<String> getRequiredEntries() {
return REQUIRED_ENTRIES;
}
@Override
public int compare(final String entry1, final String entry2) {
return CompareUtils.compareByList(REQUIRED_ENTRIES, entry1, entry2);
}
@Override
public Comparator<Position> getPositionComparator() {
return new SimplePositionComparator();
}
}