/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.financial.functiondoc; import java.util.ArrayList; import java.util.Collection; import java.util.concurrent.ExecutorService; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.opengamma.OpenGammaRuntimeException; import com.opengamma.core.position.Portfolio; import com.opengamma.core.position.PositionSource; import com.opengamma.core.security.SecuritySource; import com.opengamma.engine.function.CompiledFunctionRepository; import com.opengamma.engine.function.exclusion.FunctionExclusionGroups; import com.opengamma.engine.view.compilation.PortfolioCompiler; import com.opengamma.id.UniqueId; import com.opengamma.id.VersionCorrection; 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.util.ArgumentChecker; import com.opengamma.util.MdcAwareThreadPoolExecutor; import com.opengamma.util.NamedThreadPoolFactory; /** * Utility template for generating documentation from a function repository by iterating through * the defined portfolios. */ public class PortfolioDocumentation extends AbstractDocumentation { private static final Logger s_logger = LoggerFactory.getLogger(PortfolioDocumentation.class); private final PortfolioMaster _portfolioMaster; private final PositionSource _positionSource; private final SecuritySource _securitySource; private final ExecutorService _executorService; public PortfolioDocumentation(final CompiledFunctionRepository functionRepository, final FunctionExclusionGroups functionExclusionGroups, final PortfolioMaster portfolioMaster, final PositionSource positionSource, final SecuritySource securitySource) { super(functionRepository, functionExclusionGroups); ArgumentChecker.notNull(portfolioMaster, "portfolioMaster"); ArgumentChecker.notNull(portfolioMaster, "positionSource"); ArgumentChecker.notNull(securitySource, "securitySource"); _portfolioMaster = portfolioMaster; _positionSource = positionSource; _securitySource = securitySource; final int threads = 32; final ThreadPoolExecutor executor = new MdcAwareThreadPoolExecutor(threads, threads, 3, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadPoolFactory("doc")); executor.allowCoreThreadTimeOut(true); _executorService = executor; } protected PortfolioMaster getPortfolioMaster() { return _portfolioMaster; } protected PositionSource getPositionSource() { return _positionSource; } protected SecuritySource getSecuritySource() { return _securitySource; } protected ExecutorService getExecutorService() { return _executorService; } protected Collection<UniqueId> getPortfolios() { s_logger.debug("Querying portfolios available"); final PortfolioSearchRequest request = new PortfolioSearchRequest(); request.setDepth(0); request.setIncludePositions(false); request.setName(null); final Collection<UniqueId> result = new ArrayList<UniqueId>(); for (PortfolioDocument document : PortfolioSearchIterator.iterable(_portfolioMaster, request)) { result.add(document.getUniqueId()); } s_logger.info("Found {} portfolios", result.size()); return result; } @Override public void run() { int count = Integer.MIN_VALUE; // set to e.g. -10 to just consider the first 10 portfolios found for (final UniqueId portfolioId : getPortfolios()) { try { final long t1 = System.nanoTime(); final Portfolio rawPortfolio = getPositionSource().getPortfolio(portfolioId, VersionCorrection.LATEST); final long t2 = System.nanoTime(); final Portfolio resolvedPortfolio = PortfolioCompiler.resolvePortfolio(rawPortfolio, getExecutorService(), getSecuritySource()); final long t3 = System.nanoTime(); s_logger.debug("Got portfolio {} in {}ms", portfolioId, (double) (t2 - t1) / 1e6); s_logger.debug("Resolved portfolio {} in {}ms", portfolioId, (double) (t3 - t2) / 1e6); getExecutorService().execute(new Runnable() { @Override public void run() { processAvailablePortfolioOutputs(resolvedPortfolio); } }); if ((++count) > 0) { break; } } catch (OpenGammaRuntimeException e) { s_logger.debug("Couldn't resolve {} - {}", portfolioId, e); } } try { s_logger.info("Waiting for portfolio analysis"); getExecutorService().shutdown(); getExecutorService().awaitTermination(30, TimeUnit.MINUTES); } catch (InterruptedException e) { throw new OpenGammaRuntimeException("Interrupted", e); } super.run(); } }