/**
* Copyright (C) 2009 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.web.portfolio;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ExecutorService;
import org.joda.beans.impl.flexi.FlexiBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.opengamma.OpenGammaRuntimeException;
import com.opengamma.core.security.SecurityLink;
import com.opengamma.core.security.SecuritySource;
import com.opengamma.engine.view.compilation.SecurityLinkResolver;
import com.opengamma.id.VersionCorrection;
import com.opengamma.master.portfolio.PortfolioMaster;
import com.opengamma.master.position.ManageablePosition;
import com.opengamma.master.position.PositionMaster;
import com.opengamma.util.ArgumentChecker;
import com.opengamma.web.AbstractPerRequestWebResource;
import com.opengamma.web.position.WebPositionsData;
import com.opengamma.web.position.WebPositionsUris;
import com.opengamma.web.security.WebSecuritiesData;
import com.opengamma.web.security.WebSecuritiesUris;
/**
* Abstract base class for RESTful portfolio resources.
*/
public abstract class AbstractWebPortfolioResource
extends AbstractPerRequestWebResource<WebPortfoliosData> {
/**
* HTML ftl directory
*/
protected static final String HTML_DIR = "portfolios/html/";
/**
* JSON ftl directory
*/
protected static final String JSON_DIR = "portfolios/json/";
/** Logger. */
private static final Logger s_logger = LoggerFactory.getLogger(AbstractWebPortfolioResource.class);
/**
* The security link resolver.
*/
private SecurityLinkResolver _securityLinkResolver;
/**
* Creates the resource.
*
* @param portfolioMaster the portfolio master, not null
* @param positionMaster the position master, not null
* @param securitySource the security source, not null
* @param executor the executor service, not null
*/
protected AbstractWebPortfolioResource(final PortfolioMaster portfolioMaster, final PositionMaster positionMaster, final SecuritySource securitySource, final ExecutorService executor) {
super(new WebPortfoliosData());
ArgumentChecker.notNull(portfolioMaster, "portfolioMaster");
ArgumentChecker.notNull(positionMaster, "positionMaster");
ArgumentChecker.notNull(securitySource, "securitySource");
ArgumentChecker.notNull(executor, "executor");
data().setPortfolioMaster(portfolioMaster);
data().setPositionMaster(positionMaster);
_securityLinkResolver = new SecurityLinkResolver(executor, securitySource, VersionCorrection.LATEST);
}
/**
* Creates the resource.
*
* @param parent the parent resource, not null
*/
protected AbstractWebPortfolioResource(final AbstractWebPortfolioResource parent) {
super(parent);
_securityLinkResolver = parent._securityLinkResolver;
}
//-------------------------------------------------------------------------
/**
* Creates the output root data.
*
* @return the output root data, not null
*/
@Override
protected FlexiBean createRootData() {
FlexiBean out = super.createRootData();
out.put("uris", new WebPortfoliosUris(data()));
WebSecuritiesData secData = new WebSecuritiesData(data().getUriInfo());
out.put("securityUris", new WebSecuritiesUris(secData));
WebPositionsData posData = new WebPositionsData(data().getUriInfo());
out.put("positionUris", new WebPositionsUris(posData));
return out;
}
//-------------------------------------------------------------------------
protected void resolveSecurities(Collection<ManageablePosition> positions) {
Collection<SecurityLink> securityLinks = new ArrayList<SecurityLink>(positions.size());
for (ManageablePosition position : positions) {
securityLinks.add(position.getSecurityLink());
}
if (!securityLinks.isEmpty()) {
try {
_securityLinkResolver.resolveSecurities(securityLinks);
} catch (OpenGammaRuntimeException ex) {
s_logger.warn("Problem resolving securities in a position", ex);
}
}
}
}