/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.web.analytics; import java.util.List; import com.google.common.collect.Lists; import com.opengamma.core.position.Portfolio; import com.opengamma.engine.ComputationTargetResolver; import com.opengamma.engine.function.config.FunctionRepositoryFactory; import com.opengamma.engine.view.compilation.CompiledViewDefinition; import com.opengamma.financial.security.lookup.SecurityAttributeMapper; import com.opengamma.id.ObjectId; /** * A grid for displaying portfolio analytics data. */ /* package */class PortfolioAnalyticsGrid extends MainAnalyticsGrid<PortfolioGridViewport> { private final PortfolioGridStructure _gridStructure; /* package */PortfolioAnalyticsGrid(PortfolioGridStructure gridStructure, String gridId, ComputationTargetResolver targetResolver, FunctionRepositoryFactory functions, ViewportListener viewportListener) { super(AnalyticsView.GridType.PORTFOLIO, gridId, targetResolver, functions, viewportListener); _gridStructure = gridStructure; } /** * Creates a new grid when the structure is updated using an existing grid as the basis * * @param gridStructure The updated grid structure * @param previousGrid The old grid whose state is the basis for the new grid */ /* package */PortfolioAnalyticsGrid(PortfolioGridStructure gridStructure, PortfolioAnalyticsGrid previousGrid, CompiledViewDefinition compiledViewDef) { super(AnalyticsView.GridType.PORTFOLIO, previousGrid, compiledViewDef, gridStructure.getValueMappings()); _gridStructure = gridStructure; } /* package */PortfolioAnalyticsGrid withUpdatedRows(Portfolio portfolio) { PortfolioGridStructure updatedStructure = _gridStructure.withUpdatedRows(portfolio); return new PortfolioAnalyticsGrid(updatedStructure, getCallbackId(), getTargetResolver(), getFunctionRepository(), getViewportListener()); } /** * Updates with changed structure when the view recompiles * * @param portfolio the portfolio of positions * @param compiledViewDef the basic state required for computation of a view * @return new PortfolioAnalyticsGrid */ /* package */PortfolioAnalyticsGrid withUpdatedStructure(CompiledViewDefinition compiledViewDef, Portfolio portfolio) { PortfolioGridStructure updatedStructure = _gridStructure.withUpdatedStructure(compiledViewDef, portfolio); for (PortfolioGridViewport viewport : getViewports().values()) { viewport.updateResultsAndStructure(updatedStructure); } return new PortfolioAnalyticsGrid(updatedStructure, this, compiledViewDef); } /** * Updates on for each tick, returns this if structure remains the same * * @param cache the result cache * @return PortfolioAnalyticsGrid */ /* package */PortfolioAnalyticsGrid withUpdatedTickAndPossiblyStructure(ResultsCache cache) { PortfolioGridStructure updatedStructure = _gridStructure.withUpdatedStructure(cache); // TODO this smells bad but avoids throwing away any viewports, depgraphs etc // TODO implement equals()? if (updatedStructure == _gridStructure) { return this; } else { return new PortfolioAnalyticsGrid(updatedStructure, this, getViewCycle().getCompiledViewDefinition()); } } /* package */static PortfolioAnalyticsGrid forAnalytics(String gridId, Portfolio portfolio, ComputationTargetResolver targetResolver, FunctionRepositoryFactory functions, ViewportListener viewportListener) { PortfolioGridStructure gridStructure = PortfolioGridStructure.create(portfolio, new UnversionedValueMappings()); return new PortfolioAnalyticsGrid(gridStructure, gridId, targetResolver, functions, viewportListener); } /* package */static PortfolioAnalyticsGrid forBlotter(String gridId, Portfolio portfolio, ComputationTargetResolver targetResolver, FunctionRepositoryFactory functions, ViewportListener viewportListener, SecurityAttributeMapper blotterColumnMapper) { PortfolioGridStructure gridStructure = BlotterGridStructure.create(portfolio, blotterColumnMapper); return new PortfolioAnalyticsGrid(gridStructure, gridId, targetResolver, functions, viewportListener); } /* package */List<String> updateEntities(ResultsCache cache, List<ObjectId> entityIds) { List<String> ids = Lists.newArrayList(); for (MainGridViewport viewport : getViewports().values()) { viewport.updateResults(cache); ids.add(viewport.getCallbackId()); } return ids; } @Override PortfolioGridViewport createViewport(ViewportDefinition viewportDefinition, String callbackId, String structureCallbackId, ResultsCache cache) { return new PortfolioGridViewport(_gridStructure, callbackId, structureCallbackId, viewportDefinition, getViewCycle(), cache); } @Override MainGridStructure getGridStructure() { return _gridStructure; } }