/** * 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.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import com.opengamma.core.position.Position; import com.opengamma.core.position.impl.SimplePositionComparator; import com.opengamma.core.security.Security; import com.opengamma.core.security.SecuritySource; import com.opengamma.financial.security.CurrenciesVisitor; import com.opengamma.financial.security.FinancialSecurityUtils; import com.opengamma.util.money.Currency; import com.opengamma.util.money.UnorderedCurrencyPair; /** * Function to classify positions by Currency. * */ public class CurrenciesAggregationFunction implements AggregationFunction<String> { private static final String NAME = "Currencies"; /** * Name for No currency */ public static final String NO_CURRENCY = "No currency"; private final Comparator<Position> _comparator = new SimplePositionComparator(); private final SecuritySource _secSource; public CurrenciesAggregationFunction(final SecuritySource secSource) { _secSource = secSource; } /** * Gets the security source. * @return The security source */ protected SecuritySource getSecuritySource() { return _secSource; } @Override public String classifyPosition(final Position position) { return classifyBasedOnSecurity(position.getSecurity(), _secSource); } public static String classifyBasedOnSecurity(final Security security, final SecuritySource securitySource) { try { final Collection<Currency> currencies = CurrenciesVisitor.getCurrencies(security, securitySource); if (currencies == null || currencies.size() == 0) { return NO_CURRENCY; } switch (currencies.size()) { case 0: return NO_CURRENCY; case 1: return currencies.iterator().next().getCode(); case 2: { final Iterator<Currency> iter = currencies.iterator(); final Currency base = iter.next(); final Currency counter = iter.next(); final UnorderedCurrencyPair unordered = UnorderedCurrencyPair.of(base, counter); final StringBuilder sb = new StringBuilder(); sb.append(unordered.getFirstCurrency().getCode()); sb.append("/"); sb.append(unordered.getSecondCurrency().getCode()); return sb.toString(); } default: { final StringBuilder sb = new StringBuilder(); final Iterator<Currency> iterator = currencies.iterator(); while (iterator.hasNext()) { sb.append(iterator.next()); if (iterator.hasNext()) { sb.append("/"); } } return sb.toString(); } } } catch (final UnsupportedOperationException ex) { return NO_CURRENCY; } } @Override public String getName() { return NAME; } @Override public Collection<String> getRequiredEntries() { return Collections.emptyList(); } @Override public int compare(final String currency1, final String currency2) { return currency1.compareTo(currency2); } @Override public Comparator<Position> getPositionComparator() { return _comparator; } }