/** * Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.comparison; import java.util.Collection; import java.util.LinkedList; import org.fudgemsg.FudgeContext; import com.opengamma.core.position.Portfolio; import com.opengamma.core.position.PortfolioNode; import com.opengamma.core.position.Position; import com.opengamma.core.position.impl.AbstractPortfolioNodeTraversalCallback; import com.opengamma.core.position.impl.PortfolioNodeTraverser; import com.opengamma.id.UniqueId; /** * Provides comparison operations between {@link Portfolio} objects. */ public class PortfolioComparator extends PositionSetComparator { public PortfolioComparator(final FudgeContext fudgeContext) { super(fudgeContext); } public static Collection<Position> getFlattenedPositions(final Portfolio portfolio) { final Collection<Position> positions = new LinkedList<Position>(); PortfolioNodeTraverser.depthFirst(new AbstractPortfolioNodeTraversalCallback() { @Override public void preOrderOperation(final PortfolioNode parentNode, final Position position) { positions.add(position); } }).traverse(portfolio.getRootNode()); return positions; } public PortfolioComparison compare(final Portfolio first, final Portfolio second) { UniqueId firstId = first.getUniqueId(); UniqueId secondId = second.getUniqueId(); String firstName; String secondName; // if they are two versions of the same portfolio the names need to include the version otherwise the generated // portfolio name won't make much sense if (firstId != null && secondId != null && firstId.getObjectId().equals(secondId.getObjectId())) { firstName = first.getName() + " (version " + firstId.getVersion() + ")"; secondName = second.getName() + " (version " + secondId.getVersion() + ")"; } else { firstName = first.getName(); secondName = second.getName(); } return new PortfolioComparison(compare(getFlattenedPositions(first), getFlattenedPositions(second)), firstName, secondName); } }