blob: 8a78b3ccab75a4310013ad05d9c37a4414bc8b2d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2014 Ericsson
*
* All rights reserved. This program and the accompanying materials are
* made available under the terms of the Eclipse Public License 2.0 which
* accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* Mathieu Denis <mathieu.denis@polymtl.ca> - Implementation and Initial API
* Alexandre Montplaisir - Merge TmfBaseStatisticsTree and AbsStatisticsTree
* Move the tree structure logic into the nodes
*******************************************************************************/
package org.eclipse.tracecompass.internal.tmf.ui.viewers.statistics.model;
/**
* Base class for the statistics storage. It allow to implement a tree structure
* while avoiding the need to run through the tree each time you need to add a
* node at a given place.
*
* @author Mathieu Denis
*/
public class TmfStatisticsTree {
/** Header for the event type categories. */
public static final String HEADER_EVENT_TYPES = Messages.TmfStatisticsData_EventTypes;
/** Root node of this tree */
private final TmfStatisticsTreeNode rootNode;
/**
* Default constructor. Creates base statistics tree for counting total
* number of events and number of events per event type.
*/
public TmfStatisticsTree() {
rootNode = new TmfStatisticsTreeNode(this, null, new String[0]);
}
/**
* Retrieve the root node of this tree.
*
* @return The root node
*/
public TmfStatisticsTreeNode getRootNode() {
return rootNode;
}
/**
* Get a node.
*
* @param path
* Path to the node.
* @return The node, or null if it doesn't current exist in the tree.
*/
public TmfStatisticsTreeNode getNode(String... path) {
TmfStatisticsTreeNode curNode = rootNode;
for (String pathElem : path) {
curNode = curNode.getChild(pathElem);
if (curNode == null) {
/* The requested path doesn't exist, return null */
break;
}
}
return curNode;
}
/**
* Get or create a node.
*
* @param path
* Path to the node.
* @return The requested node. Will be created if it didn't exist.
*/
public TmfStatisticsTreeNode getOrCreateNode(String... path) {
TmfStatisticsTreeNode curNode = rootNode;
TmfStatisticsTreeNode nextNode;
for (String pathElem : path) {
nextNode = curNode.getChild(pathElem);
if (nextNode == null) {
nextNode = curNode.addChild(pathElem);
}
curNode = nextNode;
}
return curNode;
}
/**
* Set the value to display in the "total" cells. This means the row
* indicating the total count of events for a trace.
*
* @param traceName
* The name of the trace (will be used as a sub-tree in the view)
* @param isGlobal
* Is this a for a global or a time range request? Determines if
* this goes in the Global column or the Selected Time Range one.
* @param qty
* The value to display
*/
public void setTotal(String traceName, boolean isGlobal, long qty) {
String[][] paths = getNormalPaths(traceName);
for (String path[] : paths) {
getOrCreateNode(path).getValues().setValue(isGlobal, qty);
}
}
/**
* Set the value to display in the "Type count" cells. These are the counts
* for each event types.
*
* @param traceName
* The name of the trace (will be used as a sub-tree in the view)
* @param type
* The event type
* @param isGlobal
* Is this a for a global or a time range request? Determines if
* this goes in the Global column or the Selected Time Range one.
* @param qty
* The value to display
*/
public void setTypeCount(String traceName, String type, boolean isGlobal, long qty) {
String[][] paths = getTypePaths(traceName, type);
for (String[] path : paths) {
getOrCreateNode(path).getValues().setValue(isGlobal, qty);
}
}
/**
* Get the event types paths.
*
* @param traceName
* The name of the trace (will be used as a sub-tree in the view)
* @param type
* The event type
* @return Array of arrays representing the paths
*/
protected String[][] getTypePaths(String traceName, String type) {
String[][] paths = { new String[] {traceName, HEADER_EVENT_TYPES, type } };
return paths;
}
/**
* Get the standard paths for an event.
*
* @param traceName
* The name of the trace (will be used as a sub-tree in the view)
* @return Array of arrays representing the paths
*/
protected String[][] getNormalPaths(String traceName) {
String[][] paths = { new String[] { traceName } };
return paths;
}
/**
* Function to merge many string more efficiently.
*
* @param strings
* Strings to merge.
* @return A new string containing all the strings.
*/
protected static String mergeString(String... strings) {
StringBuilder builder = new StringBuilder();
for (String s : strings) {
builder.append(s);
}
return builder.toString();
}
}