60 import org.eclipse.swt.custom.SashForm;
61 import org.eclipse.swt.events.MenuDetectEvent;
62 import org.eclipse.swt.events.MenuDetectListener;
63 import org.eclipse.swt.widgets.Composite;
64 import org.eclipse.ui.IMemento;
65 import org.eclipse.ui.ISelectionListener;
66 import org.eclipse.ui.IViewSite;
67 import org.eclipse.ui.IWorkbenchPart;
68 import org.eclipse.ui.PartInitException;
69 import org.eclipse.ui.part.ViewPart;
70 import org.openjdk.jmc.common.item.IItemCollection;
71 import org.openjdk.jmc.common.util.StringToolkit;
72 import org.openjdk.jmc.flightrecorder.flameview.tree.TraceNode;
73 import org.openjdk.jmc.flightrecorder.flameview.tree.TraceTreeUtils;
74 import org.openjdk.jmc.flightrecorder.stacktrace.FrameSeparator;
75 import org.openjdk.jmc.flightrecorder.stacktrace.FrameSeparator.FrameCategorization;
76 import org.openjdk.jmc.flightrecorder.ui.FlightRecorderUI;
77 import org.openjdk.jmc.flightrecorder.ui.messages.internal.Messages;
78 import org.openjdk.jmc.ui.CoreImages;
79 import org.openjdk.jmc.ui.common.util.AdapterUtil;
80 import org.openjdk.jmc.ui.handlers.MCContextMenuManager;
81 import org.openjdk.jmc.ui.misc.DisplayToolkit;
82
83 public class FlameGraphView extends ViewPart implements ISelectionListener {
84 private static final String UNCLASSIFIABLE_FRAME = getStacktraceMessage(STACKTRACE_UNCLASSIFIABLE_FRAME);
85 private static final String UNCLASSIFIABLE_FRAME_DESC = getStacktraceMessage(STACKTRACE_UNCLASSIFIABLE_FRAME_DESC);
86 private static final String HTML_PAGE;
87 static {
88 // from: https://cdn.jsdelivr.net/gh/spiermar/d3-flame-graph@2.0.3/dist/d3-flamegraph.css
89 String cssD3Flamegraph = "jslibs/d3-flamegraph.css";
90 // from: https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js
91 String jsHtml5shiv = "jslibs/html5shiv.min.js";
92 // from: https://oss.maxcdn.com/respond/1.4.2/respond.min.js
93 String jsRespond = "jslibs/respond.min.js";
94 // from: https://d3js.org/d3.v4.min.js
95 String jsD3V4 = "jslibs/d3.v4.min.js";
96 // from: https://cdnjs.cloudflare.com/ajax/libs/d3-tip/0.9.1/d3-tip.min.js
97 String jsD3Tip = "jslibs/d3-tip.min.js";
98 // from: https://cdn.jsdelivr.net/gh/spiermar/d3-flame-graph@2.0.3/dist/d3-flamegraph.min.js
99 String jsD3FlameGraph = "jslibs/d3-flamegraph.min.js";
100 // jmc flameview coloring functions
101 String jsFlameviewColoring = "flameviewColoring.js";
102
103 String jsIeLibraries = loadLibraries(jsHtml5shiv, jsRespond);
104 String jsD3Libraries = loadLibraries(jsD3V4, jsD3Tip, jsD3FlameGraph);
105
106 // formatter arguments for the template: %1 - CSSs, %2 - IE9 specific scripts, %3 - 3rd party scripts %4 - 4th Flameview Coloring
107 HTML_PAGE = String.format(fileContent("page.template"), fileContent(cssD3Flamegraph), jsIeLibraries,
108 jsD3Libraries, fileContent(jsFlameviewColoring));
109 }
110
111 private static final ExecutorService MODEL_EXECUTOR = Executors.newFixedThreadPool(1);
112 private FrameSeparator frameSeparator;
113
114 private Browser browser;
115 private SashForm container;
116 private TraceNode currentRoot;
117 private CompletableFuture<TraceNode> currentModelCalculator;
118 private boolean threadRootAtTop = true;
119 private IItemCollection currentItems;
120 private GroupByAction[] groupByActions;
121
122 private class GroupByAction extends Action {
123
124 private final boolean fromThreadRootAction;
125
126 GroupByAction(boolean fromRoot) {
127 super(fromRoot ? Messages.STACKTRACE_VIEW_THREAD_ROOT : Messages.STACKTRACE_VIEW_LAST_FRAME,
|
60 import org.eclipse.swt.custom.SashForm;
61 import org.eclipse.swt.events.MenuDetectEvent;
62 import org.eclipse.swt.events.MenuDetectListener;
63 import org.eclipse.swt.widgets.Composite;
64 import org.eclipse.ui.IMemento;
65 import org.eclipse.ui.ISelectionListener;
66 import org.eclipse.ui.IViewSite;
67 import org.eclipse.ui.IWorkbenchPart;
68 import org.eclipse.ui.PartInitException;
69 import org.eclipse.ui.part.ViewPart;
70 import org.openjdk.jmc.common.item.IItemCollection;
71 import org.openjdk.jmc.common.util.StringToolkit;
72 import org.openjdk.jmc.flightrecorder.flameview.tree.TraceNode;
73 import org.openjdk.jmc.flightrecorder.flameview.tree.TraceTreeUtils;
74 import org.openjdk.jmc.flightrecorder.stacktrace.FrameSeparator;
75 import org.openjdk.jmc.flightrecorder.stacktrace.FrameSeparator.FrameCategorization;
76 import org.openjdk.jmc.flightrecorder.ui.FlightRecorderUI;
77 import org.openjdk.jmc.flightrecorder.ui.messages.internal.Messages;
78 import org.openjdk.jmc.ui.CoreImages;
79 import org.openjdk.jmc.ui.common.util.AdapterUtil;
80 import org.openjdk.jmc.ui.common.util.Environment;
81 import org.openjdk.jmc.ui.common.util.Environment.OSType;
82 import org.openjdk.jmc.ui.handlers.MCContextMenuManager;
83 import org.openjdk.jmc.ui.misc.DisplayToolkit;
84
85 public class FlameGraphView extends ViewPart implements ISelectionListener {
86 private static final String UNCLASSIFIABLE_FRAME = getStacktraceMessage(STACKTRACE_UNCLASSIFIABLE_FRAME);
87 private static final String UNCLASSIFIABLE_FRAME_DESC = getStacktraceMessage(STACKTRACE_UNCLASSIFIABLE_FRAME_DESC);
88 private static final String HTML_PAGE;
89 static {
90 // from: https://cdn.jsdelivr.net/gh/spiermar/d3-flame-graph@2.0.3/dist/d3-flamegraph.css
91 String cssD3Flamegraph = "jslibs/d3-flamegraph.css";
92 // from: https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js
93 String jsHtml5shiv = "jslibs/html5shiv.min.js";
94 // from: https://oss.maxcdn.com/respond/1.4.2/respond.min.js
95 String jsRespond = "jslibs/respond.min.js";
96 // from: https://d3js.org/d3.v4.min.js
97 String jsD3V4 = "jslibs/d3.v4.min.js";
98 // from: https://cdnjs.cloudflare.com/ajax/libs/d3-tip/0.9.1/d3-tip.min.js
99 String jsD3Tip = "jslibs/d3-tip.min.js";
100 // from: https://cdn.jsdelivr.net/gh/spiermar/d3-flame-graph@2.0.3/dist/d3-flamegraph.min.js
101 String jsD3FlameGraph = "jslibs/d3-flamegraph.min.js";
102 // from: https://cdn.jsdelivr.net/gh/aptmac/d3-flame-graph@internet-explorer-compatibility/dist/d3-flamegraph-ie.min.js
103 String jsD3FlameGraphIE = "jslibs/d3-flamegraph-ie.min.js";
104 // jmc flameview coloring functions
105 String jsFlameviewColoring = "flameviewColoring.js";
106
107 if (Environment.getOSType().equals(OSType.WINDOWS)) {
108 jsD3FlameGraph = jsD3FlameGraphIE;
109 }
110
111 String jsIeLibraries = loadLibraries(jsHtml5shiv, jsRespond);
112 String jsD3Libraries = loadLibraries(jsD3V4, jsD3Tip, jsD3FlameGraph);
113
114 // formatter arguments for the template: %1 - CSSs, %2 - IE9 specific scripts, %3 - 3rd party scripts %4 - 4th Flameview Coloring
115 HTML_PAGE = String.format(fileContent("template.html"), fileContent(cssD3Flamegraph), jsIeLibraries,
116 jsD3Libraries, fileContent(jsFlameviewColoring));
117 }
118
119 private static final ExecutorService MODEL_EXECUTOR = Executors.newFixedThreadPool(1);
120 private FrameSeparator frameSeparator;
121
122 private Browser browser;
123 private SashForm container;
124 private TraceNode currentRoot;
125 private CompletableFuture<TraceNode> currentModelCalculator;
126 private boolean threadRootAtTop = true;
127 private IItemCollection currentItems;
128 private GroupByAction[] groupByActions;
129
130 private class GroupByAction extends Action {
131
132 private final boolean fromThreadRootAction;
133
134 GroupByAction(boolean fromRoot) {
135 super(fromRoot ? Messages.STACKTRACE_VIEW_THREAD_ROOT : Messages.STACKTRACE_VIEW_LAST_FRAME,
|