< prev index next >
application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/common/ThreadGraphLanes.java
Print this page
*** 1,7 ****
/*
! * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The contents of this file are subject to the terms of either the Universal Permissive License
* v 1.0 as shown at http://oss.oracle.com/licenses/upl
--- 1,8 ----
/*
! * Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
! * Copyright (c) 2019, Red Hat Inc. All rights reserved.
*
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* The contents of this file are subject to the terms of either the Universal Permissive License
* v 1.0 as shown at http://oss.oracle.com/licenses/upl
*** 40,49 ****
--- 41,51 ----
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
+ import java.util.Set;
import java.util.function.Predicate;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;
*** 59,68 ****
--- 61,71 ----
import org.openjdk.jmc.common.item.IItem;
import org.openjdk.jmc.common.item.IItemCollection;
import org.openjdk.jmc.common.item.IItemFilter;
import org.openjdk.jmc.common.item.IItemIterable;
import org.openjdk.jmc.common.item.ItemFilters;
+ import org.openjdk.jmc.common.item.ItemFilters.Types;
import org.openjdk.jmc.common.unit.IQuantity;
import org.openjdk.jmc.flightrecorder.JfrAttributes;
import org.openjdk.jmc.flightrecorder.jdk.JdkFilters;
import org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs;
import org.openjdk.jmc.flightrecorder.ui.EventTypeFolderNode;
*** 92,111 ****
private List<LaneDefinition> naLanes;
private Supplier<StreamModel> dataSourceSupplier;
private Runnable buildChart;
private List<IAction> actions;
private String tooltipTitle;
public ThreadGraphLanes(Supplier<StreamModel> dataSourceSupplier, Runnable buildChart) {
this.dataSourceSupplier = dataSourceSupplier;
this.buildChart = buildChart;
this.actions = new ArrayList<>();
}
public void openEditLanesDialog(MCContextMenuManager mm, boolean isLegendMenu) {
// FIXME: Might there be other interesting events that don't really have duration?
! EventTypeFolderNode typeTree = dataSourceSupplier.get().getTypeTree(ItemCollectionToolkit
.stream(dataSourceSupplier.get().getItems()).filter(this::typeWithThreadAndDuration));
laneDefs = LaneEditor.openDialog(typeTree, laneDefs.stream().collect(Collectors.toList()),
Messages.JavaApplicationPage_EDIT_THREAD_LANES_DIALOG_TITLE,
Messages.JavaApplicationPage_EDIT_THREAD_LANES_DIALOG_MESSAGE);
updateContextMenu(mm, isLegendMenu);
--- 95,123 ----
private List<LaneDefinition> naLanes;
private Supplier<StreamModel> dataSourceSupplier;
private Runnable buildChart;
private List<IAction> actions;
private String tooltipTitle;
+ private EventTypeFolderNode typeTree;
+ private boolean quickFilterExist;
public ThreadGraphLanes(Supplier<StreamModel> dataSourceSupplier, Runnable buildChart) {
this.dataSourceSupplier = dataSourceSupplier;
this.buildChart = buildChart;
this.actions = new ArrayList<>();
+ this.quickFilterExist = false;
+ this.typeTree = dataSourceSupplier.get().getTypeTree(ItemCollectionToolkit
+ .stream(dataSourceSupplier.get().getItems()).filter(this::typeWithThreadAndDuration));
+ }
+
+ protected EventTypeFolderNode getTypeTree() {
+ return typeTree;
}
public void openEditLanesDialog(MCContextMenuManager mm, boolean isLegendMenu) {
// FIXME: Might there be other interesting events that don't really have duration?
! typeTree = dataSourceSupplier.get().getTypeTree(ItemCollectionToolkit
.stream(dataSourceSupplier.get().getItems()).filter(this::typeWithThreadAndDuration));
laneDefs = LaneEditor.openDialog(typeTree, laneDefs.stream().collect(Collectors.toList()),
Messages.JavaApplicationPage_EDIT_THREAD_LANES_DIALOG_TITLE,
Messages.JavaApplicationPage_EDIT_THREAD_LANES_DIALOG_MESSAGE);
updateContextMenu(mm, isLegendMenu);
*** 125,134 ****
--- 137,159 ----
.filter((Predicate<? super LaneDefinition>) LaneDefinition::isEnabled).map(ld -> ld.getFilter())
.collect(Collectors.toList());
return ItemFilters.or(laneFilters.toArray(new IItemFilter[laneFilters.size()]));
}
+ /**
+ * Retrieves the set of lane names that are currently enabled.<br>
+ * Note: The "Rest lane" is of type ItemFilters$Composite, and cannot be cast to Types,
+ * so it gets filtered out of the end result.
+ * @return the enabled lanes independent from the rest lane
+ */
+ public Set<String> getEnabledLanes() {
+ List<IItemFilter> laneFilters = laneDefs.stream()
+ .filter((Predicate<? super LaneDefinition>) LaneDefinition::isEnabledAndNotRestLane).map(ld -> ld.getFilter())
+ .collect(Collectors.toList());
+ return ((Types) ItemFilters.or(laneFilters.toArray(new IItemFilter[laneFilters.size()]))).getTypes();
+ }
+
private void setTooltipTitle(String description) {
this.tooltipTitle = description;
}
private String getTooltipTitle() {
*** 137,146 ****
--- 162,202 ----
private void resetTooltipTitle() {
this.tooltipTitle = null;
}
+ /**
+ * Introduces a "Quick Filter" to the lane definitions which is controlled by the
+ * dropdown lane filter. Initially, the enabled activity lanes will be a copy of
+ * the currently enabled lanes. When initially used, the "Quick Filter" will be
+ * the only active lane definition in an attempt to preserve the lane activity of
+ * the existing lane definitions. The "Quick Filter" is meant for easy viewing of
+ * activities, and will not be persisted.
+ */
+ public void useDropdownFilter(LaneDefinition quickFilterDef) {
+ if (quickFilterExist) {
+ for (int i = 0; i < laneDefs.size(); i++) {
+ if (quickFilterDef.getName().equals(laneDefs.get(i).getName())) {
+ laneDefs.remove(laneDefs.get(i));
+ laneDefs.add(i, quickFilterDef);
+ }
+ }
+ } else {
+ for (int i = 0; i < laneDefs.size(); i++) {
+ setLaneDefinitionEnablement(laneDefs.get(i), i, false);
+ }
+ laneDefs.add(0, quickFilterDef);
+ quickFilterExist = true;
+ }
+ buildChart.run();
+ }
+
+ private void setLaneDefinitionEnablement(LaneDefinition oldLd, int laneIndex, boolean isEnabled) {
+ LaneDefinition newLd = new LaneDefinition(oldLd.getName(), isEnabled, oldLd.getFilter(), oldLd.isRestLane());
+ laneDefs.set(laneIndex, newLd);
+ }
+
public IXDataRenderer buildThreadRenderer(Object thread, IItemCollection items) {
this.resetTooltipTitle();
String threadName = thread == null ? "" : ((IMCThread) thread).getThreadName(); //$NON-NLS-1$
// FIXME: Workaround since this method can be called from super class constructor. Refactor to avoid this.
List<LaneDefinition> laneFilters = this.laneDefs == null ? Collections.emptyList() : this.laneDefs;
*** 266,278 ****
Action checkAction = new Action(ld.getName(), IAction.AS_CHECK_BOX) {
int laneIndex = laneDefs.indexOf(ld);
@Override
public void run() {
! LaneDefinition newLd = new LaneDefinition(ld.getName(), isChecked(), ld.getFilter(),
! ld.isRestLane());
! laneDefs.set(laneIndex, newLd);
buildChart.run();
}
};
String identifier = ld.getName() + checkAction.hashCode();
checkAction.setId(identifier);
--- 322,332 ----
Action checkAction = new Action(ld.getName(), IAction.AS_CHECK_BOX) {
int laneIndex = laneDefs.indexOf(ld);
@Override
public void run() {
! setLaneDefinitionEnablement(ld, laneIndex, isChecked());
buildChart.run();
}
};
String identifier = ld.getName() + checkAction.hashCode();
checkAction.setId(identifier);
< prev index next >