/** * Copyright (C) 2013 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.web.analytics; import java.util.Collections; import java.util.List; import com.google.common.collect.Lists; import com.opengamma.core.position.PortfolioNode; import com.opengamma.core.position.Position; import com.opengamma.core.position.Trade; import com.opengamma.core.position.impl.PortfolioMapperFunction; import com.opengamma.core.security.Security; import com.opengamma.financial.security.FinancialSecurity; import com.opengamma.id.UniqueIdentifiable; import com.opengamma.id.VersionCorrection; import com.opengamma.master.security.ManageableSecurity; import com.opengamma.master.security.SecurityMaster; import com.opengamma.util.ArgumentChecker; import com.opengamma.web.analytics.blotter.UnderlyingSecurityVisitor; /** * Extracts positions, securities and trades from a fully resolved portfolio. Also looks up underlying securities * for OTCs with an OTC underlying (e.g. swaptions). */ /* package */ class PortfolioEntityExtractor implements PortfolioMapperFunction<List<UniqueIdentifiable>> { /** For getting underlying securities for OTCs with OTC underlyings. */ private final UnderlyingSecurityVisitor _underlyingVisitor; /* package */ PortfolioEntityExtractor(VersionCorrection versionCorrection, SecurityMaster securityMaster) { ArgumentChecker.notNull(versionCorrection, "versionCorrection"); ArgumentChecker.notNull(securityMaster, "securityMaster"); _underlyingVisitor = new UnderlyingSecurityVisitor(versionCorrection, securityMaster); } @Override public List<UniqueIdentifiable> apply(PortfolioNode node) { return Collections.emptyList(); } @Override public List<UniqueIdentifiable> apply(PortfolioNode parent, Position position) { List<UniqueIdentifiable> entities = Lists.newArrayList(); entities.add(position); Security security = position.getSecurityLink().getTarget(); entities.add(security); if (security instanceof FinancialSecurity) { ManageableSecurity underlying = ((FinancialSecurity) security).accept(_underlyingVisitor); if (underlying != null) { entities.add(underlying); } } for (Trade trade : position.getTrades()) { entities.add(trade); } return entities; } }