/** * 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.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.opengamma.util.ArgumentChecker; /** * */ /* package */ final class ViewportNodeStructure { private static final Logger s_logger = LoggerFactory.getLogger(ViewportNodeStructure.class); private final AnalyticsNode _rootNode; private final Map<Integer, List<String>> _rowToPath = Maps.newHashMap(); /* package */ ViewportNodeStructure(AnalyticsNode root, TargetLookup targetLookup) { Set<List<String>> expandedNodes = new HashSet<>(); _rootNode = createNode(root, targetLookup, expandedNodes); } /* package */ ViewportNodeStructure(AnalyticsNode root, TargetLookup targetLookup, Set<List<String>> expandedNodes) { _rootNode = createNode(root, targetLookup, expandedNodes); } /* package */ AnalyticsNode createNode(AnalyticsNode root, TargetLookup targetLookup, Set<List<String>> expandedNodes) { ArgumentChecker.notNull(targetLookup, "targetLookup"); // root can be null if a view only contains primitives and doesn't have a portfolio if (root == null) { return null; } else { return createNode(root, Collections.<String>emptyList(), targetLookup, expandedNodes); } } private AnalyticsNode createNode(AnalyticsNode gridStructureNode, List<String> parentPath, TargetLookup targetLookup, Set<List<String>> expandedNodes) { List<String> path = Lists.newArrayList(parentPath); path.add(targetLookup.getRow(gridStructureNode.getStartRow()).getName()); boolean expanded = expandedNodes.contains(path); if (expanded) { s_logger.debug("Building expanded node {}", path); } List<AnalyticsNode> viewportStructureChildNodes = Lists.newArrayList(); for (AnalyticsNode gridStructureChildNode : gridStructureNode.getChildren()) { AnalyticsNode viewportStructureChildNode = createNode(gridStructureChildNode, path, targetLookup, expandedNodes); viewportStructureChildNodes.add(viewportStructureChildNode); } _rowToPath.put(gridStructureNode.getStartRow(), Collections.unmodifiableList(path)); return new AnalyticsNode(gridStructureNode.getStartRow(), gridStructureNode.getEndRow(), viewportStructureChildNodes, !expanded); } /* package */ List<String> getPathForRow(int rowIndex) { return _rowToPath.get(rowIndex); } /* package */ AnalyticsNode getRootNode() { return _rootNode; } }