blob: 9fddfd92c317737b0da24a14b6dca343f1751045 [file] [log] [blame]
// Copyright 2014 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.profiler.chart;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Data of a Gantt Chart to visualize the data of a profiled build.
*/
public class Chart {
/** The type that is returned when an unknown type is looked up. */
public static final ChartBarType UNKNOWN_TYPE = new ChartBarType("Unknown type", Color.RED);
/** The rows of the chart. */
private final Map<Long, ChartRow> rows = new HashMap<>();
/** The columns on the chart. */
private final List<ChartColumn> columns = new ArrayList<>();
/** The lines on the chart. */
private final List<ChartLine> lines = new ArrayList<>();
/** The types of the bars in the chart. */
private final Map<String, ChartBarType> types = new HashMap<>();
/** The running index of the rows in the chart. */
private int rowIndex = 0;
/** The maximum stop value of any bar in the chart. */
private long maxStop;
/**
* Adds a bar to a row of the chart. If a row with the given id already
* exists, the bar is added to the row, otherwise a new row is created and the
* bar is added to it.
*
* @param id the id of the row the new bar belongs to
* @param start the start value of the bar
* @param stop the stop value of the bar
* @param type the type of the bar
* @param highlight emphasize the bar
* @param label the label of the bar
*/
public void addBar(long id, long start, long stop, ChartBarType type, boolean highlight,
String label) {
ChartRow slot = addSlotIfAbsent(id);
ChartBar bar = new ChartBar(slot, start, stop, type, highlight, label);
slot.addBar(bar);
maxStop = Math.max(maxStop, stop);
}
/**
* Adds a bar to a row of the chart. If a row with the given id already
* exists, the bar is added to the row, otherwise a new row is created and the
* bar is added to it.
*
* @param id the id of the row the new bar belongs to
* @param start the start value of the bar
* @param stop the stop value of the bar
* @param type the type of the bar
* @param label the label of the bar
*/
public void addBar(long id, long start, long stop, ChartBarType type, String label) {
addBar(id, start, stop, type, false, label);
}
/**
* Adds a vertical line to the chart.
*/
public void addVerticalLine(long startId, long stopId, long pos) {
ChartRow startSlot = addSlotIfAbsent(startId);
ChartRow stopSlot = addSlotIfAbsent(stopId);
ChartLine line = new ChartLine(startSlot, stopSlot, pos, pos);
lines.add(line);
}
/**
* Adds a column to the chart.
*
* @param start the start value of the bar
* @param stop the stop value of the bar
* @param type the type of the bar
* @param label the label of the bar
*/
public void addTimeRange(long start, long stop, ChartBarType type, String label) {
ChartColumn column = new ChartColumn(start, stop, type, label);
columns.add(column);
maxStop = Math.max(maxStop, stop);
}
/**
* Creates a new {@link ChartBarType} and adds it to the list of types of the
* chart.
*
* @param name the name of the type
* @param color the color of the chart
* @return the newly created type
*/
public ChartBarType createType(String name, Color color) {
ChartBarType type = new ChartBarType(name, color);
types.put(name, type);
return type;
}
/**
* Returns the type with the given name. If no type with the given name
* exists, a type with name 'Unknown type' is added to the chart and returned.
*
* @param name the name of the type to look up
*/
public ChartBarType lookUpType(String name) {
ChartBarType type = types.get(name);
if (type == null) {
type = UNKNOWN_TYPE;
types.put(type.getName(), type);
}
return type;
}
/**
* Creates a new row with the given id if no row with this id existed.
* Otherwise the existing row with the given id is returned.
*
* @param id the ID of the row
* @return the existing row, if it was already present, the newly created one
* otherwise
*/
private ChartRow addSlotIfAbsent(long id) {
ChartRow slot = rows.computeIfAbsent(id, k -> new ChartRow(Long.toString(k), rowIndex++));
return slot;
}
/**
* Accepts a {@link ChartVisitor}. Calls {@link ChartVisitor#visit(Chart)},
* delegates the visitor to the rows of the chart and calls
* {@link ChartVisitor#endVisit(Chart)}.
*
* @param visitor the visitor to accept
*/
public void accept(ChartVisitor visitor) {
visitor.visit(this);
for (ChartRow slot : rows.values()) {
slot.accept(visitor);
}
int rowCount = getRowCount();
for (ChartColumn column : columns) {
column.setRowCount(rowCount);
column.accept(visitor);
}
for (ChartLine line : lines) {
line.accept(visitor);
}
visitor.endVisit(this);
}
/**
* Returns the {@link ChartBarType}s, sorted by name.
*/
public List<ChartBarType> getSortedTypes() {
List<ChartBarType> list = new ArrayList<>(types.values());
Collections.sort(list);
return list;
}
/**
* Returns the {@link ChartRow}s, sorted by their index.
*/
public List<ChartRow> getSortedRows() {
List<ChartRow> list = new ArrayList<>(rows.values());
Collections.sort(list);
return list;
}
public int getRowCount() {
return rows.size();
}
public long getMaxStop() {
return maxStop;
}
}