/**
* 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.Portfolio;
import com.opengamma.engine.view.ViewDefinition;
import com.opengamma.engine.view.compilation.CompiledViewDefinition;
import com.opengamma.financial.security.lookup.SecurityAttribute;
import com.opengamma.financial.security.lookup.SecurityAttributeMapper;
import com.opengamma.util.ArgumentChecker;
/**
*
*/
public class BlotterGridStructure extends PortfolioGridStructure {
/** Maps the shared blotter columns to properties in the different security types. */
private final SecurityAttributeMapper _columnMapper;
/** The view definition that's driving the grid. */
private final ViewDefinition _viewDef;
/* package */ BlotterGridStructure(List<PortfolioGridRow> rows,
GridColumnGroup fixedColumns,
GridColumnGroup blotterColumns,
List<GridColumnGroup> analyticsColumns,
AnalyticsNode rootNode,
TargetLookup targetLookup,
SecurityAttributeMapper columnMapper,
UnversionedValueMappings valueMappings,
ViewDefinition viewDef) {
super(rows, fixedColumns, createGroups(blotterColumns, analyticsColumns), rootNode, targetLookup, valueMappings, viewDef);
ArgumentChecker.notNull(columnMapper, "columnMapper");
ArgumentChecker.notNull(viewDef, "viewDef");
_viewDef = viewDef;
_columnMapper = columnMapper;
}
private static GridColumnGroups createGroups(GridColumnGroup blotterColumns, List<GridColumnGroup> analyticsColumns) {
List<GridColumnGroup> groups = Lists.newArrayList(blotterColumns);
groups.addAll(analyticsColumns);
return new GridColumnGroups(groups);
}
/* package */ static BlotterGridStructure create(Portfolio portfolio, SecurityAttributeMapper columnMapper) {
List<PortfolioGridRow> rows = buildRows(portfolio);
UnversionedValueMappings valueMappings = new UnversionedValueMappings();
TargetLookup targetLookup = new TargetLookup(valueMappings, rows);
return new BlotterGridStructure(rows,
GridColumnGroup.empty(),
GridColumnGroup.empty(),
Collections.<GridColumnGroup>emptyList(),
AnalyticsNode.portfolioRoot(portfolio),
targetLookup,
columnMapper,
valueMappings,
new ViewDefinition("empty", "dummy"));
}
private static GridColumnGroup buildBlotterColumns(SecurityAttributeMapper columnMapper, List<PortfolioGridRow> rows) {
GridColumn quantityColumn = new GridColumn(SecurityAttribute.QUANTITY.getName(), "", Double.class,
new BlotterColumnRenderer(SecurityAttribute.QUANTITY, columnMapper, rows));
List<GridColumn> columns = Lists.newArrayList(
blotterColumn(SecurityAttribute.TYPE, columnMapper, rows),
blotterColumn(SecurityAttribute.PRODUCT, columnMapper, rows),
quantityColumn,
blotterColumn(SecurityAttribute.DIRECTION, columnMapper, rows),
blotterColumn(SecurityAttribute.START, columnMapper, rows),
blotterColumn(SecurityAttribute.MATURITY, columnMapper, rows),
blotterColumn(SecurityAttribute.RATE, columnMapper, rows),
blotterColumn(SecurityAttribute.INDEX, columnMapper, rows),
blotterColumn(SecurityAttribute.FREQUENCY, columnMapper, rows),
blotterColumn(SecurityAttribute.FLOAT_FREQUENCY, columnMapper, rows));
return new GridColumnGroup("Blotter", columns, false);
}
private static GridColumn blotterColumn(SecurityAttribute column,
SecurityAttributeMapper columnMappings,
List<PortfolioGridRow> rows) {
return new GridColumn(column.getName(), "", String.class, new BlotterColumnRenderer(column, columnMappings, rows));
}
// TODO combine with the method below
@Override
/* package */ BlotterGridStructure withUpdatedRows(Portfolio portfolio) {
AnalyticsNode rootNode = AnalyticsNode.portfolioRoot(portfolio);
List<PortfolioGridRow> rows = buildRows(portfolio);
TargetLookup targetLookup = new TargetLookup(getValueMappings(), rows);
GridColumnGroup fixedColumns = buildFixedColumns(rows);
GridColumnGroup blotterColumns = buildBlotterColumns(_columnMapper, rows);
List<GridColumnGroup> analyticsColumns = Collections.emptyList();
//List<GridColumnGroup> analyticsColumns = buildAnalyticsColumns(_viewDef, targetLookup);
return new BlotterGridStructure(rows, fixedColumns, blotterColumns, analyticsColumns, rootNode, targetLookup,
_columnMapper, getValueMappings(), _viewDef);
}
@Override
/* package */ BlotterGridStructure withUpdatedStructure(CompiledViewDefinition compiledViewDef, Portfolio portfolio) {
AnalyticsNode rootNode = AnalyticsNode.portfolioRoot(portfolio);
List<PortfolioGridRow> rows = buildRows(portfolio);
UnversionedValueMappings valueMappings = new UnversionedValueMappings(compiledViewDef);
TargetLookup targetLookup = new TargetLookup(valueMappings, rows);
ViewDefinition viewDef = compiledViewDef.getViewDefinition();
List<GridColumnGroup> analyticsColumns = Collections.emptyList();
//List<GridColumnGroup> analyticsColumns = buildAnalyticsColumns(viewDef, targetLookup);
GridColumnGroup fixedColumns = buildFixedColumns(rows);
GridColumnGroup blotterColumns = buildBlotterColumns(_columnMapper, rows);
return new BlotterGridStructure(rows, fixedColumns, blotterColumns, analyticsColumns, rootNode, targetLookup,
_columnMapper, valueMappings, viewDef);
}
// TODO handle inlining of values into columns
@Override
PortfolioGridStructure withUpdatedStructure(ResultsCache cache) {
return this;
}
}