/** * Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.filtering; import java.util.Collection; import com.opengamma.core.position.Portfolio; import com.opengamma.core.position.PortfolioNode; import com.opengamma.core.position.Position; import com.opengamma.core.position.impl.SimplePortfolio; import com.opengamma.core.position.impl.SimplePortfolioNode; import com.opengamma.id.UniqueId; import com.opengamma.id.UniqueIdSupplier; /** * A filter of portfolios. One or more filters are applied to a portfolio to remove trades, positions, or * nodes from it. */ public class PortfolioFilter implements FilteringFunction { private static final UniqueIdSupplier s_syntheticIdentifiers = new UniqueIdSupplier("PortfolioFilter"); private final FilteringFunction[] _filteringFunctions; public PortfolioFilter(final FilteringFunction filteringFunction) { _filteringFunctions = new FilteringFunction[] {filteringFunction }; } public PortfolioFilter(final FilteringFunction... filteringFunctions) { _filteringFunctions = new FilteringFunction[filteringFunctions.length]; System.arraycopy(filteringFunctions, 0, _filteringFunctions, 0, filteringFunctions.length); } public PortfolioFilter(final Collection<FilteringFunction> filteringFunctions) { _filteringFunctions = filteringFunctions.toArray(new FilteringFunction[filteringFunctions.size()]); } private static UniqueId createSyntheticIdentifier() { return s_syntheticIdentifiers.get(); } private FilteringFunction[] getFilteringFunctions() { return _filteringFunctions; } @Override public boolean acceptPosition(final Position position) { for (FilteringFunction function : getFilteringFunctions()) { if (!function.acceptPosition(position)) { return false; } } return true; } @Override public boolean acceptPortfolioNode(final PortfolioNode portfolioNode) { for (FilteringFunction function : getFilteringFunctions()) { if (!function.acceptPortfolioNode(portfolioNode)) { return false; } } return true; } protected SimplePortfolioNode filter(final PortfolioNode inputPortfolioNode) { final SimplePortfolioNode newPortfolioNode = new SimplePortfolioNode(); newPortfolioNode.setUniqueId(createSyntheticIdentifier()); newPortfolioNode.setName(inputPortfolioNode.getName()); for (Position position : inputPortfolioNode.getPositions()) { if (acceptPosition(position)) { newPortfolioNode.addPosition(position); } } for (PortfolioNode portfolioNode : inputPortfolioNode.getChildNodes()) { final SimplePortfolioNode filteredPortfolioNode = filter(portfolioNode); if (acceptPortfolioNode(filteredPortfolioNode)) { filteredPortfolioNode.setParentNodeId(newPortfolioNode.getUniqueId()); newPortfolioNode.addChildNode(filteredPortfolioNode); } } return newPortfolioNode; } public Portfolio filter(final Portfolio inputPortfolio) { return new SimplePortfolio(UniqueId.of(inputPortfolio.getUniqueId().getScheme(), buildPortfolioName(inputPortfolio.getUniqueId().getValue())), buildPortfolioName(inputPortfolio.getName()), filter(inputPortfolio.getRootNode())); } protected String buildPortfolioName(final String existingName) { return existingName + " filtered by " + getName(); } @Override public String getName() { StringBuilder name = new StringBuilder(); boolean comma = false; for (FilteringFunction function : getFilteringFunctions()) { if (comma) { name.append(", "); } else { comma = true; } name.append(function.getName()); } return name.toString(); } }