/**
* 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 java.util.Set;
import org.apache.commons.lang.StringUtils;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import com.opengamma.engine.ComputationTargetSpecification;
import com.opengamma.engine.target.ComputationTargetReference;
import com.opengamma.engine.target.ComputationTargetReferenceVisitor;
import com.opengamma.engine.target.ComputationTargetRequirement;
import com.opengamma.engine.target.ComputationTargetType;
import com.opengamma.engine.value.ValueProperties;
import com.opengamma.engine.value.ValueRequirement;
import com.opengamma.engine.view.ViewCalculationConfiguration;
import com.opengamma.engine.view.ViewDefinition;
import com.opengamma.engine.view.compilation.CompiledViewDefinition;
/**
*
*/
public final class PrimitivesGridStructure extends MainGridStructure {
/** Target type for anything that isn't part of a portoflio structure. */
private static final ComputationTargetType NON_PRIMITIVE =
ComputationTargetType.PORTFOLIO_NODE
.or(ComputationTargetType.POSITION)
.or(ComputationTargetType.TRADE)
.or(ComputationTargetType.SECURITY);
/** Creates names for the label column in the grid. */
private static final ComputationTargetReferenceVisitor<String> s_nameVisitor = new ComputationTargetReferenceVisitor<String>() {
@Override
public String visitComputationTargetRequirement(ComputationTargetRequirement requirement) {
return StringUtils.join(requirement.getIdentifiers().iterator(), ", ");
}
@Override
public String visitComputationTargetSpecification(ComputationTargetSpecification specification) {
if (specification.getUniqueId() != null) {
return specification.getUniqueId().toString();
} else {
return "No target";
}
}
};
private PrimitivesGridStructure() {
}
private PrimitivesGridStructure(GridColumnGroup fixedColumns,
GridColumnGroups nonFixedColumns,
TargetLookup targetLookup,
UnversionedValueMappings valueMappings) {
super(fixedColumns, nonFixedColumns, targetLookup, valueMappings);
}
/* package */ static PrimitivesGridStructure create(CompiledViewDefinition compiledViewDef) {
List<MainGridStructure.Row> rows = rows(compiledViewDef);
GridColumn labelColumn = new GridColumn("Name", "", String.class, new PrimitivesLabelRenderer(rows));
GridColumnGroup fixedColumns = new GridColumnGroup("fixed", ImmutableList.of(labelColumn), false);
UnversionedValueMappings valueMappings = new UnversionedValueMappings(compiledViewDef);
TargetLookup targetLookup = new TargetLookup(valueMappings, rows);
List<GridColumnGroup> analyticsColumns = buildAnalyticsColumns(compiledViewDef.getViewDefinition(), targetLookup);
return new PrimitivesGridStructure(fixedColumns, new GridColumnGroups(analyticsColumns), targetLookup, valueMappings);
}
private static List<GridColumnGroup> buildAnalyticsColumns(ViewDefinition viewDef, TargetLookup targetLookup) {
List<GridColumnGroup> columnGroups = Lists.newArrayList();
Set<ColumnSpecification> columnSpecs = Sets.newHashSet();
for (ViewCalculationConfiguration calcConfig : viewDef.getAllCalculationConfigurations()) {
List<GridColumn> columns = Lists.newArrayList();
for (ValueRequirement specificRequirement : calcConfig.getSpecificRequirements()) {
if (!specificRequirement.getTargetReference().getType().isTargetType(NON_PRIMITIVE)) {
String valueName = specificRequirement.getValueName();
Class<?> columnType = ValueTypes.getTypeForValueName(valueName);
ValueProperties constraints = specificRequirement.getConstraints();
ColumnSpecification columnSpec = new ColumnSpecification(calcConfig.getName(), valueName, constraints);
// ensure columnSpec isn't a duplicate
if (columnSpecs.add(columnSpec)) {
columns.add(GridColumn.forSpec(columnSpec, columnType, targetLookup));
}
}
}
if (!columns.isEmpty()) {
columnGroups.add(new GridColumnGroup(calcConfig.getName(), columns, true));
}
}
return columnGroups;
}
private static List<MainGridStructure.Row> rows(CompiledViewDefinition compiledViewDef) {
Set<ComputationTargetReference> targetRefs = Sets.newLinkedHashSet();
for (ViewCalculationConfiguration calcConfig : compiledViewDef.getViewDefinition().getAllCalculationConfigurations()) {
for (ValueRequirement specificRequirement : calcConfig.getSpecificRequirements()) {
targetRefs.add(specificRequirement.getTargetReference());
}
}
List<MainGridStructure.Row> rows = Lists.newArrayList();
for (ComputationTargetReference targetRef : targetRefs) {
rows.add(new Row(targetRef, targetRef.accept(s_nameVisitor)));
}
return rows;
}
/* package */ static PrimitivesGridStructure empty() {
return new PrimitivesGridStructure();
}
}