/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.core.position.impl;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import com.opengamma.core.position.PortfolioNode;
import com.opengamma.core.position.Position;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.util.PublicAPI;
/**
* Recursively loads all positions under a particular {@link PortfolioNode}.
*/
@PublicAPI
public class PositionAccumulator {
/**
* The set of positions.
*/
private final Set<Position> _positions = new HashSet<Position>();
/**
* Gets all the positions beneath the starting node.
*
* @param startNode the starting node, not null
* @return All positions accumulated during execution
*/
public static Set<Position> getAccumulatedPositions(PortfolioNode startNode) {
return new PositionAccumulator(startNode).getPositions();
}
//-------------------------------------------------------------------------
/**
* Creates an accumulator starting from the specified node.
*
* @param startNode the starting node, not null
*/
public PositionAccumulator(PortfolioNode startNode) {
ArgumentChecker.notNull(startNode, "Portfolio Node");
PortfolioNodeTraverser.depthFirst(new Callback()).traverse(startNode);
}
/**
* Gets the positions that were found.
*
* @return the positions, not null
*/
public Set<Position> getPositions() {
return Collections.unmodifiableSet(_positions);
}
/**
* Callback to match the positions.
*/
private class Callback extends AbstractPortfolioNodeTraversalCallback {
@Override
public void preOrderOperation(final PortfolioNode parentNode, final Position position) {
_positions.add(position);
}
}
}