/**
* Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.integration.tool.portfolio;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.common.collect.Sets;
import com.opengamma.id.ObjectId;
import com.opengamma.id.UniqueId;
import com.opengamma.master.portfolio.ManageablePortfolioNode;
import com.opengamma.master.portfolio.PortfolioDocument;
import com.opengamma.master.portfolio.PortfolioMaster;
import com.opengamma.master.portfolio.PortfolioSearchRequest;
import com.opengamma.master.portfolio.impl.PortfolioSearchIterator;
import com.opengamma.master.position.PositionDocument;
import com.opengamma.master.position.PositionMaster;
import com.opengamma.master.position.PositionSearchRequest;
import com.opengamma.master.position.impl.PositionSearchIterator;
import com.opengamma.util.ArgumentChecker;
/**
* Deletes positions that are not currently in a portfolio
*/
public class OrphanedPositionRemover {
private static final Logger s_logger = LoggerFactory.getLogger(OrphanedPositionRemover.class);
private final PortfolioMaster _portfolioMaster;
private final PositionMaster _positionMaster;
public OrphanedPositionRemover(PortfolioMaster portfolioMaster, PositionMaster positionMaster) {
ArgumentChecker.notNull(positionMaster, "position master");
ArgumentChecker.notNull(portfolioMaster, "portfolio master");
_portfolioMaster = portfolioMaster;
_positionMaster = positionMaster;
}
public void run() {
final Set<ObjectId> validPositions = getValidPositions();
final Set<UniqueId> orphanedPositions = getOrphanedPositions(validPositions);
removePositions(orphanedPositions);
}
private void removePositions(Set<UniqueId> orphanedPositions) {
s_logger.info("removing {} orphaned positions", orphanedPositions.size());
for (UniqueId orphanId : orphanedPositions) {
_positionMaster.remove(orphanId);
s_logger.info("removed position {}", orphanId);
}
}
private Set<UniqueId> getOrphanedPositions(Set<ObjectId> validPositions) {
final Set<UniqueId> result = Sets.newHashSet();
PositionSearchRequest searchRequest = new PositionSearchRequest();
for (PositionDocument positionDocument : PositionSearchIterator.iterable(_positionMaster, searchRequest)) {
UniqueId positionId = positionDocument.getPosition().getUniqueId();
if (!validPositions.contains(positionId.getObjectId())) {
result.add(positionId);
}
}
return result;
}
private Set<ObjectId> getValidPositions() {
final Set<ObjectId> result = Sets.newHashSet();
PortfolioSearchRequest searchRequest = new PortfolioSearchRequest();
for (PortfolioDocument portfolioDocument : PortfolioSearchIterator.iterable(_portfolioMaster, searchRequest)) {
accumulatePositionIdentifiers(portfolioDocument.getPortfolio().getRootNode(), result);
}
return result;
}
private void accumulatePositionIdentifiers(final ManageablePortfolioNode node, final Set<ObjectId> positions) {
positions.addAll(node.getPositionIds());
for (ManageablePortfolioNode childNode : node.getChildNodes()) {
accumulatePositionIdentifiers(childNode, positions);
}
}
}