52 import org.eclipse.swt.custom.CTabFolder;
53 import org.eclipse.swt.custom.CTabItem;
54 import org.eclipse.swt.custom.SashForm;
55 import org.eclipse.swt.layout.FillLayout;
56 import org.eclipse.swt.widgets.Composite;
57 import org.eclipse.swt.widgets.Control;
58 import org.eclipse.ui.forms.widgets.Form;
59 import org.eclipse.ui.forms.widgets.FormToolkit;
60
61 import org.openjdk.jmc.common.IDisplayable;
62 import org.openjdk.jmc.common.IState;
63 import org.openjdk.jmc.common.IWritableState;
64 import org.openjdk.jmc.common.item.IAccessorFactory;
65 import org.openjdk.jmc.common.item.IAttribute;
66 import org.openjdk.jmc.common.item.IItem;
67 import org.openjdk.jmc.common.item.IItemCollection;
68 import org.openjdk.jmc.common.item.IItemFilter;
69 import org.openjdk.jmc.common.item.ItemFilters;
70 import org.openjdk.jmc.common.unit.IQuantity;
71 import org.openjdk.jmc.common.unit.IRange;
72 import org.openjdk.jmc.common.unit.UnitLookup;
73 import org.openjdk.jmc.common.util.ColorToolkit;
74 import org.openjdk.jmc.common.util.StateToolkit;
75 import org.openjdk.jmc.flightrecorder.JfrAttributes;
76 import org.openjdk.jmc.flightrecorder.jdk.JdkAggregators;
77 import org.openjdk.jmc.flightrecorder.jdk.JdkAttributes;
78 import org.openjdk.jmc.flightrecorder.jdk.JdkFilters;
79 import org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs;
80 import org.openjdk.jmc.flightrecorder.rules.util.JfrRuleTopics;
81 import org.openjdk.jmc.flightrecorder.ui.FlightRecorderUI;
82 import org.openjdk.jmc.flightrecorder.ui.IDataPageFactory;
83 import org.openjdk.jmc.flightrecorder.ui.IDisplayablePage;
84 import org.openjdk.jmc.flightrecorder.ui.IPageContainer;
85 import org.openjdk.jmc.flightrecorder.ui.IPageDefinition;
86 import org.openjdk.jmc.flightrecorder.ui.IPageUI;
87 import org.openjdk.jmc.flightrecorder.ui.ItemCollectionToolkit;
88 import org.openjdk.jmc.flightrecorder.ui.StreamModel;
89 import org.openjdk.jmc.flightrecorder.ui.common.AbstractDataPage;
90 import org.openjdk.jmc.flightrecorder.ui.common.CompositeKeyAccessorFactory;
91 import org.openjdk.jmc.flightrecorder.ui.common.DataPageToolkit;
184 LIST.addColumn(JdkAttributes.IO_SOCKET_READ_EOS);
185 LIST.addColumn(JdkAttributes.IO_TIMEOUT);
186 }
187
188 private enum HistogramType {
189 HOST, PORT, HOST_AND_PORT
190 }
191
192 private class IOPageUi implements IPageUI {
193 private static final String PRIMARY_FILTER = "primaryFilter"; //$NON-NLS-1$
194 private static final String SECONDARY_FILTER = "secondaryFilter"; //$NON-NLS-1$
195 private static final String EVENT_FILTER = "eventFilter"; //$NON-NLS-1$
196 private static final String SASH_ELEMENT = "sash"; //$NON-NLS-1$
197 private static final String LIST_ELEMENT = "eventList"; //$NON-NLS-1$
198 private static final String SOCKETIO_TABLE_ELEMENT = "socketTable"; //$NON-NLS-1$
199 private static final String SECONDARY_SOCKETIO_TABLE_ELEMENT = "secondarySocketTable"; //$NON-NLS-1$
200 private static final String HISTGRAM_TYPE = "histogramType"; //$NON-NLS-1$
201
202 private final ChartCanvas timelineCanvas;
203 private final ChartCanvas durationCanvas;
204 private final ItemList itemList;
205
206 private final SashForm sash;
207 private final IPageContainer pageContainer;
208 private final Composite histogramParent;
209 private ItemHistogram primaryHistogram;
210 private Supplier<TableSettings> secondaryHistogramSettings;
211 private Consumer<IItemCollection> itemConsumerRoot;
212 private HistogramType histogramType;
213 private ItemHistogram secondaryHistogram;
214 private FilterComponent primaryFilter;
215 private FilterComponent secondaryFilter;
216 private FilterComponent eventFilter;
217 private IRange<IQuantity> timeRange;
218 private IItemCollection selectionItems;
219 private XYChart timelineChart;
220 private XYChart durationChart;
221 private CTabFolder tabFolder;
222 private FlavorSelector flavorSelector;
223
224 IOPageUi(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
225 this.pageContainer = pageContainer;
226 Form form = DataPageToolkit.createForm(parent, toolkit, getName(), getIcon());
227 sash = new SashForm(form.getBody(), SWT.VERTICAL);
228 toolkit.adapt(sash);
229 histogramParent = toolkit.createComposite(sash);
230 histogramParent.setLayout(new FillLayout(SWT.VERTICAL));
231 histogramType = StateToolkit.readEnum(state, HISTGRAM_TYPE, HistogramType.HOST, HistogramType.class);
232 buildHistograms(TableSettings.forState(state.getChild(SOCKETIO_TABLE_ELEMENT)),
233 TableSettings.forState(state.getChild(SECONDARY_SOCKETIO_TABLE_ELEMENT)));
234
235 tabFolder = new CTabFolder(sash, SWT.NONE);
236 toolkit.adapt(tabFolder);
237 CTabItem t1 = new CTabItem(tabFolder, SWT.NONE);
238 t1.setToolTipText(Messages.IO_PAGE_TIMELINE_DESCRIPTION);
239 timelineCanvas = new ChartCanvas(tabFolder);
240 t1.setText(Messages.PAGES_TIMELINE);
247 // FIXME: X-auto-range should be done properly
248 IQuantity max = socketItems.getAggregate(JdkAggregators.LONGEST_EVENT);
249 // FIXME: Workaround to make max value included
250 max = max == null ? UnitLookup.MILLISECOND.quantity(20) : max.add(UnitLookup.MILLISECOND.quantity(20));
251 durationChart = new XYChart(UnitLookup.MILLISECOND.quantity(0), max, RendererToolkit.empty(), 180);
252 durationChart.setVisibleRange(durationRange.getStart(), durationRange.getEnd());
253 durationChart.addVisibleRangeListener(r -> durationRange = r);
254 buildChart();
255
256 CTabItem t2 = new CTabItem(tabFolder, SWT.NONE);
257 t2.setToolTipText(Messages.IO_PAGE_DURATIONS_DESCRIPTION);
258 durationCanvas = new ChartCanvas(tabFolder);
259 t2.setText(Messages.PAGES_DURATIONS);
260 t2.setControl(durationCanvas);
261 DataPageToolkit.createChartTooltip(durationCanvas);
262 DataPageToolkit.setChart(durationCanvas, durationChart, JfrAttributes.DURATION,
263 pageContainer::showSelection);
264 SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), durationChart,
265 JfrAttributes.DURATION, Messages.SocketIOPage_DURATION_SELECTION, durationCanvas.getContextMenu());
266
267 CTabItem t3 = new CTabItem(tabFolder, SWT.NONE);
268 t3.setToolTipText(Messages.IO_PAGE_EVENT_LOG_DESCRIPTION);
269 itemList = LIST.buildWithoutBorder(tabFolder, getTableSettings(state.getChild(LIST_ELEMENT)));
270 MCContextMenuManager itemListMm = MCContextMenuManager
271 .create(itemList.getManager().getViewer().getControl());
272 ColumnMenusFactory.addDefaultMenus(itemList.getManager(), itemListMm);
273 SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), itemList,
274 Messages.SocketIOPage_LOG_SELECTION, itemListMm);
275 itemList.getManager().getViewer().addSelectionChangedListener(
276 e -> pageContainer.showSelection(ItemCollectionToolkit.build(itemList.getSelection().get())));
277 t3.setText(Messages.PAGES_EVENT_LOG);
278 eventFilter = FilterComponent.createFilterComponent(itemList, itemListFilter,
279 getDataSource().getItems().apply(TABLE_ITEMS), pageContainer.getSelectionStore()::getSelections,
280 this::onEventFilterChange);
281 itemListMm.add(eventFilter.getShowFilterAction());
282 itemListMm.add(eventFilter.getShowSearchAction());
283 t3.setControl(eventFilter.getComponent());
284 eventFilter.loadState(state.getChild(EVENT_FILTER));
285 onEventFilterChange(itemListFilter);
286 itemList.getManager().setSelectionState(itemListSelection);
287
288 tabFolder.setSelection(tabFolderIndex);
289
290 PersistableSashForm.loadState(sash, state.getChild(SASH_ELEMENT));
291
292 flavorSelector = FlavorSelector.itemsWithTimerange(form, TABLE_ITEMS, getDataSource().getItems(),
293 pageContainer, this::onInputSelected, this::onUseRange, flavorSelectorState);
294
295 form.getToolBarManager()
296 .appendToGroup(DataPageToolkit.FORM_TOOLBAR_PAGE_SETUP, buildHistogramTypeAction(HistogramType.HOST,
297 Messages.SocketIOPage_BY_HOST_ACTION,
298 FlightRecorderUI.getDefault().getMCImageDescriptor(ImageConstants.ICON_IO_BY_HOST)));
299 form.getToolBarManager()
300 .appendToGroup(DataPageToolkit.FORM_TOOLBAR_PAGE_SETUP, buildHistogramTypeAction(HistogramType.PORT,
301 Messages.SocketIOPage_BY_PORT_ACTION,
302 FlightRecorderUI.getDefault().getMCImageDescriptor(ImageConstants.ICON_IO_BY_PORT)));
303 form.getToolBarManager().appendToGroup(DataPageToolkit.FORM_TOOLBAR_PAGE_SETUP, buildHistogramTypeAction(
442 SelectionStoreActionToolkit.addSelectionStoreRangeActions(pageContainer.getSelectionStore(), timelineChart,
443 JfrAttributes.LIFETIME, Messages.SocketIOPage_TIMELINE_SELECTION, timelineCanvas.getContextMenu());
444 }
445
446 private void onInputSelected(IItemCollection items, IRange<IQuantity> timeRange) {
447 this.selectionItems = items;
448 this.timeRange = timeRange;
449 refreshPageItems();
450 }
451
452 private void refreshPageItems() {
453 IItemCollection items = selectionItems != null ? selectionItems : getDataSource().getItems();
454 itemConsumerRoot.accept(items.apply(JdkFilters.SOCKET_READ_OR_WRITE));
455 }
456
457 private void updateChartAndListDetails(IItemCollection selectedItems) {
458 String hostCount = hostPortCount();
459
460 List<IXDataRenderer> timelineRows = new ArrayList<>();
461 List<IXDataRenderer> durationRows = new ArrayList<>();
462 IItemCollection readItems = selectedItems.apply(JdkFilters.SOCKET_READ);
463 if (readItems.hasItems()) {
464 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.SocketIOPage_ROW_SOCKET_READ + hostCount,
465 JdkAggregators.SOCKET_READ_SIZE.getDescription(), readItems, JdkAggregators.SOCKET_READ_SIZE,
466 READ_COLOR, SocketIOPage::getColor));
467 durationRows
468 .add(DataPageToolkit.buildDurationHistogram(Messages.SocketIOPage_ROW_SOCKET_READ + hostCount,
469 JdkAggregators.SOCKET_READ_COUNT.getDescription(), readItems,
470 JdkAggregators.SOCKET_READ_COUNT, READ_COLOR));
471 }
472 IItemCollection writeItems = selectedItems.apply(JdkFilters.SOCKET_WRITE);
473 if (writeItems.hasItems()) {
474 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.SocketIOPage_ROW_SOCKET_WRITE + hostCount,
475 JdkAggregators.SOCKET_WRITE_SIZE.getDescription(), writeItems, JdkAggregators.SOCKET_WRITE_SIZE,
476 WRITE_COLOR, SocketIOPage::getColor));
477 durationRows
478 .add(DataPageToolkit.buildDurationHistogram(Messages.SocketIOPage_ROW_SOCKET_WRITE + hostCount,
479 JdkAggregators.SOCKET_WRITE_COUNT.getDescription(), writeItems,
480 JdkAggregators.SOCKET_WRITE_COUNT, WRITE_COLOR));
481 }
482 if (timelineCanvas != null) {
483 timelineCanvas.replaceRenderer(RendererToolkit.uniformRows(timelineRows));
484 durationCanvas.replaceRenderer(RendererToolkit.uniformRows(durationRows));
485
486 itemList.show(selectedItems);
487 pageContainer.showSelection(selectedItems);
488 }
489 }
490
491 public String hostPortCount() {
492 HistogramSelection hostSelection = histogramType == HistogramType.HOST ? primaryHistogram.getSelection()
493 : histogramType == HistogramType.PORT ? secondaryHistogram.getSelection() : null;
494 HistogramSelection portSelection = histogramType == HistogramType.PORT ? primaryHistogram.getSelection()
495 : histogramType == HistogramType.HOST ? secondaryHistogram.getSelection() : null;
496 HistogramSelection hostPortSelection = histogramType == HistogramType.HOST_AND_PORT
497 ? primaryHistogram.getSelection() : null;
498
499 return hostPortCount(hostSelection != null ? hostSelection.getRowCount() : 0,
500 portSelection != null ? portSelection.getRowCount() : 0,
501 hostPortSelection != null ? hostPortSelection.getRowCount() : 0);
502 }
503
504 public String hostPortCount(int hostCount, int portCount, int hostPortCount) {
551 new ColumnSettings(READ_SIZE, false, 120, false), new ColumnSettings(WRITE_SIZE, false, 120, false),
552 new ColumnSettings(READ_EOS, false, 80, false), new ColumnSettings(IO_TIMEOUT, false, 50, false)));
553 } else {
554 return new TableSettings(state);
555 }
556 }
557
558 @Override
559 public IPageUI display(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
560 return new IOPageUi(parent, toolkit, pageContainer, state);
561 }
562
563 private Map<HistogramType, SelectionState> primaryTableSelection;
564 private Map<HistogramType, SelectionState> secondaryTableSelection;
565 private SelectionState itemListSelection;
566 private Map<HistogramType, IItemFilter> primaryTableFilter;
567 private Map<HistogramType, IItemFilter> secondaryTableFilter;
568 private IItemFilter itemListFilter;
569 private IRange<IQuantity> timelineRange;
570 private IRange<IQuantity> durationRange;
571 private int tabFolderIndex = 0;
572 public FlavorSelectorState flavorSelectorState;
573
574 public SocketIOPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) {
575 super(dpd, items, editor);
576 primaryTableSelection = new HashMap<>();
577 secondaryTableSelection = new HashMap<>();
578 primaryTableFilter = new HashMap<>();
579 secondaryTableFilter = new HashMap<>();
580 timelineRange = editor.getRecordingRange();
581 durationRange = editor.getRecordingRange();
582 }
583
584 @Override
585 public IItemFilter getDefaultSelectionFilter() {
586 return TABLE_ITEMS;
587 }
588
589 private static Color getColor(IItem item) {
590 return JdkTypeIDs.SOCKET_READ.equals(item.getType().getIdentifier()) ? READ_ALPHA_COLOR : WRITE_ALPHA_COLOR;
591 }
592
593 }
|
52 import org.eclipse.swt.custom.CTabFolder;
53 import org.eclipse.swt.custom.CTabItem;
54 import org.eclipse.swt.custom.SashForm;
55 import org.eclipse.swt.layout.FillLayout;
56 import org.eclipse.swt.widgets.Composite;
57 import org.eclipse.swt.widgets.Control;
58 import org.eclipse.ui.forms.widgets.Form;
59 import org.eclipse.ui.forms.widgets.FormToolkit;
60
61 import org.openjdk.jmc.common.IDisplayable;
62 import org.openjdk.jmc.common.IState;
63 import org.openjdk.jmc.common.IWritableState;
64 import org.openjdk.jmc.common.item.IAccessorFactory;
65 import org.openjdk.jmc.common.item.IAttribute;
66 import org.openjdk.jmc.common.item.IItem;
67 import org.openjdk.jmc.common.item.IItemCollection;
68 import org.openjdk.jmc.common.item.IItemFilter;
69 import org.openjdk.jmc.common.item.ItemFilters;
70 import org.openjdk.jmc.common.unit.IQuantity;
71 import org.openjdk.jmc.common.unit.IRange;
72 import org.openjdk.jmc.common.unit.QuantitiesToolkit;
73 import org.openjdk.jmc.common.unit.UnitLookup;
74 import org.openjdk.jmc.common.util.ColorToolkit;
75 import org.openjdk.jmc.common.util.StateToolkit;
76 import org.openjdk.jmc.flightrecorder.JfrAttributes;
77 import org.openjdk.jmc.flightrecorder.jdk.JdkAggregators;
78 import org.openjdk.jmc.flightrecorder.jdk.JdkAttributes;
79 import org.openjdk.jmc.flightrecorder.jdk.JdkFilters;
80 import org.openjdk.jmc.flightrecorder.jdk.JdkTypeIDs;
81 import org.openjdk.jmc.flightrecorder.rules.util.JfrRuleTopics;
82 import org.openjdk.jmc.flightrecorder.ui.FlightRecorderUI;
83 import org.openjdk.jmc.flightrecorder.ui.IDataPageFactory;
84 import org.openjdk.jmc.flightrecorder.ui.IDisplayablePage;
85 import org.openjdk.jmc.flightrecorder.ui.IPageContainer;
86 import org.openjdk.jmc.flightrecorder.ui.IPageDefinition;
87 import org.openjdk.jmc.flightrecorder.ui.IPageUI;
88 import org.openjdk.jmc.flightrecorder.ui.ItemCollectionToolkit;
89 import org.openjdk.jmc.flightrecorder.ui.StreamModel;
90 import org.openjdk.jmc.flightrecorder.ui.common.AbstractDataPage;
91 import org.openjdk.jmc.flightrecorder.ui.common.CompositeKeyAccessorFactory;
92 import org.openjdk.jmc.flightrecorder.ui.common.DataPageToolkit;
185 LIST.addColumn(JdkAttributes.IO_SOCKET_READ_EOS);
186 LIST.addColumn(JdkAttributes.IO_TIMEOUT);
187 }
188
189 private enum HistogramType {
190 HOST, PORT, HOST_AND_PORT
191 }
192
193 private class IOPageUi implements IPageUI {
194 private static final String PRIMARY_FILTER = "primaryFilter"; //$NON-NLS-1$
195 private static final String SECONDARY_FILTER = "secondaryFilter"; //$NON-NLS-1$
196 private static final String EVENT_FILTER = "eventFilter"; //$NON-NLS-1$
197 private static final String SASH_ELEMENT = "sash"; //$NON-NLS-1$
198 private static final String LIST_ELEMENT = "eventList"; //$NON-NLS-1$
199 private static final String SOCKETIO_TABLE_ELEMENT = "socketTable"; //$NON-NLS-1$
200 private static final String SECONDARY_SOCKETIO_TABLE_ELEMENT = "secondarySocketTable"; //$NON-NLS-1$
201 private static final String HISTGRAM_TYPE = "histogramType"; //$NON-NLS-1$
202
203 private final ChartCanvas timelineCanvas;
204 private final ChartCanvas durationCanvas;
205 private final ChartCanvas sizeCanvas;
206 private final ItemList itemList;
207
208 private final SashForm sash;
209 private final IPageContainer pageContainer;
210 private final Composite histogramParent;
211 private ItemHistogram primaryHistogram;
212 private Supplier<TableSettings> secondaryHistogramSettings;
213 private Consumer<IItemCollection> itemConsumerRoot;
214 private HistogramType histogramType;
215 private ItemHistogram secondaryHistogram;
216 private FilterComponent primaryFilter;
217 private FilterComponent secondaryFilter;
218 private FilterComponent eventFilter;
219 private IRange<IQuantity> timeRange;
220 private IItemCollection selectionItems;
221 private XYChart timelineChart;
222 private XYChart durationChart;
223 private XYChart sizeChart;
224 private CTabFolder tabFolder;
225 private FlavorSelector flavorSelector;
226
227 IOPageUi(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
228 this.pageContainer = pageContainer;
229 Form form = DataPageToolkit.createForm(parent, toolkit, getName(), getIcon());
230 sash = new SashForm(form.getBody(), SWT.VERTICAL);
231 toolkit.adapt(sash);
232 histogramParent = toolkit.createComposite(sash);
233 histogramParent.setLayout(new FillLayout(SWT.VERTICAL));
234 histogramType = StateToolkit.readEnum(state, HISTGRAM_TYPE, HistogramType.HOST, HistogramType.class);
235 buildHistograms(TableSettings.forState(state.getChild(SOCKETIO_TABLE_ELEMENT)),
236 TableSettings.forState(state.getChild(SECONDARY_SOCKETIO_TABLE_ELEMENT)));
237
238 tabFolder = new CTabFolder(sash, SWT.NONE);
239 toolkit.adapt(tabFolder);
240 CTabItem t1 = new CTabItem(tabFolder, SWT.NONE);
241 t1.setToolTipText(Messages.IO_PAGE_TIMELINE_DESCRIPTION);
242 timelineCanvas = new ChartCanvas(tabFolder);
243 t1.setText(Messages.PAGES_TIMELINE);
250 // FIXME: X-auto-range should be done properly
251 IQuantity max = socketItems.getAggregate(JdkAggregators.LONGEST_EVENT);
252 // FIXME: Workaround to make max value included
253 max = max == null ? UnitLookup.MILLISECOND.quantity(20) : max.add(UnitLookup.MILLISECOND.quantity(20));
254 durationChart = new XYChart(UnitLookup.MILLISECOND.quantity(0), max, RendererToolkit.empty(), 180);
255 durationChart.setVisibleRange(durationRange.getStart(), durationRange.getEnd());
256 durationChart.addVisibleRangeListener(r -> durationRange = r);
257 buildChart();
258
259 CTabItem t2 = new CTabItem(tabFolder, SWT.NONE);
260 t2.setToolTipText(Messages.IO_PAGE_DURATIONS_DESCRIPTION);
261 durationCanvas = new ChartCanvas(tabFolder);
262 t2.setText(Messages.PAGES_DURATIONS);
263 t2.setControl(durationCanvas);
264 DataPageToolkit.createChartTooltip(durationCanvas);
265 DataPageToolkit.setChart(durationCanvas, durationChart, JfrAttributes.DURATION,
266 pageContainer::showSelection);
267 SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), durationChart,
268 JfrAttributes.DURATION, Messages.SocketIOPage_DURATION_SELECTION, durationCanvas.getContextMenu());
269
270 IQuantity sizeMax = QuantitiesToolkit.maxPresent(socketItems.getAggregate(JdkAggregators.SOCKET_READ_LARGEST),
271 socketItems.getAggregate(JdkAggregators.SOCKET_WRITE_LARGEST));
272 // FIXME: Workaround to make max value included
273 sizeMax = sizeMax == null ? UnitLookup.BYTE.quantity(64): sizeMax.add(UnitLookup.BYTE.quantity(64));
274 sizeChart = new XYChart(UnitLookup.BYTE.quantity(0), sizeMax, RendererToolkit.empty(), 180);
275 sizeChart.setVisibleRange(sizeRange.getStart(), sizeMax);
276 sizeChart.addVisibleRangeListener(range -> sizeRange = range);
277
278 CTabItem t3 = new CTabItem(tabFolder, SWT.NONE);
279 t3.setToolTipText(Messages.IO_PAGE_SIZE_DESCRIPTION);
280 sizeCanvas = new ChartCanvas(tabFolder);
281 t3.setText(Messages.PAGES_SIZE);
282 t3.setControl(sizeCanvas);
283 DataPageToolkit.createChartTooltip(sizeCanvas);
284 DataPageToolkit.setChart(sizeCanvas, sizeChart, JdkAttributes.IO_SIZE,
285 pageContainer::showSelection);
286 SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), sizeChart,
287 JdkAttributes.IO_SIZE, Messages.SocketIOPage_SIZE_SELECTION, sizeCanvas.getContextMenu());
288
289 CTabItem t4 = new CTabItem(tabFolder, SWT.NONE);
290 t4.setToolTipText(Messages.IO_PAGE_EVENT_LOG_DESCRIPTION);
291 itemList = LIST.buildWithoutBorder(tabFolder, getTableSettings(state.getChild(LIST_ELEMENT)));
292 MCContextMenuManager itemListMm = MCContextMenuManager
293 .create(itemList.getManager().getViewer().getControl());
294 ColumnMenusFactory.addDefaultMenus(itemList.getManager(), itemListMm);
295 SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), itemList,
296 Messages.SocketIOPage_LOG_SELECTION, itemListMm);
297 itemList.getManager().getViewer().addSelectionChangedListener(
298 e -> pageContainer.showSelection(ItemCollectionToolkit.build(itemList.getSelection().get())));
299 t4.setText(Messages.PAGES_EVENT_LOG);
300 eventFilter = FilterComponent.createFilterComponent(itemList, itemListFilter,
301 getDataSource().getItems().apply(TABLE_ITEMS), pageContainer.getSelectionStore()::getSelections,
302 this::onEventFilterChange);
303 itemListMm.add(eventFilter.getShowFilterAction());
304 itemListMm.add(eventFilter.getShowSearchAction());
305 t4.setControl(eventFilter.getComponent());
306 eventFilter.loadState(state.getChild(EVENT_FILTER));
307 onEventFilterChange(itemListFilter);
308 itemList.getManager().setSelectionState(itemListSelection);
309
310 tabFolder.setSelection(tabFolderIndex);
311
312 PersistableSashForm.loadState(sash, state.getChild(SASH_ELEMENT));
313
314 flavorSelector = FlavorSelector.itemsWithTimerange(form, TABLE_ITEMS, getDataSource().getItems(),
315 pageContainer, this::onInputSelected, this::onUseRange, flavorSelectorState);
316
317 form.getToolBarManager()
318 .appendToGroup(DataPageToolkit.FORM_TOOLBAR_PAGE_SETUP, buildHistogramTypeAction(HistogramType.HOST,
319 Messages.SocketIOPage_BY_HOST_ACTION,
320 FlightRecorderUI.getDefault().getMCImageDescriptor(ImageConstants.ICON_IO_BY_HOST)));
321 form.getToolBarManager()
322 .appendToGroup(DataPageToolkit.FORM_TOOLBAR_PAGE_SETUP, buildHistogramTypeAction(HistogramType.PORT,
323 Messages.SocketIOPage_BY_PORT_ACTION,
324 FlightRecorderUI.getDefault().getMCImageDescriptor(ImageConstants.ICON_IO_BY_PORT)));
325 form.getToolBarManager().appendToGroup(DataPageToolkit.FORM_TOOLBAR_PAGE_SETUP, buildHistogramTypeAction(
464 SelectionStoreActionToolkit.addSelectionStoreRangeActions(pageContainer.getSelectionStore(), timelineChart,
465 JfrAttributes.LIFETIME, Messages.SocketIOPage_TIMELINE_SELECTION, timelineCanvas.getContextMenu());
466 }
467
468 private void onInputSelected(IItemCollection items, IRange<IQuantity> timeRange) {
469 this.selectionItems = items;
470 this.timeRange = timeRange;
471 refreshPageItems();
472 }
473
474 private void refreshPageItems() {
475 IItemCollection items = selectionItems != null ? selectionItems : getDataSource().getItems();
476 itemConsumerRoot.accept(items.apply(JdkFilters.SOCKET_READ_OR_WRITE));
477 }
478
479 private void updateChartAndListDetails(IItemCollection selectedItems) {
480 String hostCount = hostPortCount();
481
482 List<IXDataRenderer> timelineRows = new ArrayList<>();
483 List<IXDataRenderer> durationRows = new ArrayList<>();
484 List<IXDataRenderer> sizeRows = new ArrayList<>();
485 IItemCollection readItems = selectedItems.apply(JdkFilters.SOCKET_READ);
486 if (readItems.hasItems()) {
487 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.SocketIOPage_ROW_SOCKET_READ + hostCount,
488 JdkAggregators.SOCKET_READ_SIZE.getDescription(), readItems, JdkAggregators.SOCKET_READ_SIZE,
489 READ_COLOR, SocketIOPage::getColor));
490 durationRows
491 .add(DataPageToolkit.buildDurationHistogram(Messages.SocketIOPage_ROW_SOCKET_READ + hostCount,
492 JdkAggregators.SOCKET_READ_COUNT.getDescription(), readItems,
493 JdkAggregators.SOCKET_READ_COUNT, READ_COLOR));
494 sizeRows.add(DataPageToolkit.buildSizeHistogram(Messages.SocketIOPage_ROW_SOCKET_READ + hostCount,
495 JdkAggregators.SOCKET_READ_COUNT.getDescription(), readItems,
496 JdkAggregators.SOCKET_READ_COUNT, READ_COLOR, JdkAttributes.IO_SOCKET_BYTES_READ));
497 }
498 IItemCollection writeItems = selectedItems.apply(JdkFilters.SOCKET_WRITE);
499 if (writeItems.hasItems()) {
500 timelineRows.add(DataPageToolkit.buildSizeRow(Messages.SocketIOPage_ROW_SOCKET_WRITE + hostCount,
501 JdkAggregators.SOCKET_WRITE_SIZE.getDescription(), writeItems, JdkAggregators.SOCKET_WRITE_SIZE,
502 WRITE_COLOR, SocketIOPage::getColor));
503 durationRows
504 .add(DataPageToolkit.buildDurationHistogram(Messages.SocketIOPage_ROW_SOCKET_WRITE + hostCount,
505 JdkAggregators.SOCKET_WRITE_COUNT.getDescription(), writeItems,
506 JdkAggregators.SOCKET_WRITE_COUNT, WRITE_COLOR));
507 sizeRows.add(DataPageToolkit.buildSizeHistogram(Messages.SocketIOPage_ROW_SOCKET_WRITE + hostCount,
508 JdkAggregators.SOCKET_WRITE_COUNT.getDescription(), writeItems,
509 JdkAggregators.SOCKET_WRITE_COUNT, WRITE_COLOR, JdkAttributes.IO_SOCKET_BYTES_WRITTEN));
510 }
511 if (timelineCanvas != null) {
512 timelineCanvas.replaceRenderer(RendererToolkit.uniformRows(timelineRows));
513 durationCanvas.replaceRenderer(RendererToolkit.uniformRows(durationRows));
514 sizeCanvas.replaceRenderer(RendererToolkit.uniformRows(sizeRows));
515
516 itemList.show(selectedItems);
517 pageContainer.showSelection(selectedItems);
518 }
519 }
520
521 public String hostPortCount() {
522 HistogramSelection hostSelection = histogramType == HistogramType.HOST ? primaryHistogram.getSelection()
523 : histogramType == HistogramType.PORT ? secondaryHistogram.getSelection() : null;
524 HistogramSelection portSelection = histogramType == HistogramType.PORT ? primaryHistogram.getSelection()
525 : histogramType == HistogramType.HOST ? secondaryHistogram.getSelection() : null;
526 HistogramSelection hostPortSelection = histogramType == HistogramType.HOST_AND_PORT
527 ? primaryHistogram.getSelection() : null;
528
529 return hostPortCount(hostSelection != null ? hostSelection.getRowCount() : 0,
530 portSelection != null ? portSelection.getRowCount() : 0,
531 hostPortSelection != null ? hostPortSelection.getRowCount() : 0);
532 }
533
534 public String hostPortCount(int hostCount, int portCount, int hostPortCount) {
581 new ColumnSettings(READ_SIZE, false, 120, false), new ColumnSettings(WRITE_SIZE, false, 120, false),
582 new ColumnSettings(READ_EOS, false, 80, false), new ColumnSettings(IO_TIMEOUT, false, 50, false)));
583 } else {
584 return new TableSettings(state);
585 }
586 }
587
588 @Override
589 public IPageUI display(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
590 return new IOPageUi(parent, toolkit, pageContainer, state);
591 }
592
593 private Map<HistogramType, SelectionState> primaryTableSelection;
594 private Map<HistogramType, SelectionState> secondaryTableSelection;
595 private SelectionState itemListSelection;
596 private Map<HistogramType, IItemFilter> primaryTableFilter;
597 private Map<HistogramType, IItemFilter> secondaryTableFilter;
598 private IItemFilter itemListFilter;
599 private IRange<IQuantity> timelineRange;
600 private IRange<IQuantity> durationRange;
601 private IRange<IQuantity> sizeRange;
602 private int tabFolderIndex = 0;
603 public FlavorSelectorState flavorSelectorState;
604
605 public SocketIOPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) {
606 super(dpd, items, editor);
607 primaryTableSelection = new HashMap<>();
608 secondaryTableSelection = new HashMap<>();
609 primaryTableFilter = new HashMap<>();
610 secondaryTableFilter = new HashMap<>();
611 timelineRange = editor.getRecordingRange();
612 durationRange = editor.getRecordingRange();
613 sizeRange = DataPageToolkit.buildSizeRange(items.getItems(), true);
614 }
615
616 @Override
617 public IItemFilter getDefaultSelectionFilter() {
618 return TABLE_ITEMS;
619 }
620
621 private static Color getColor(IItem item) {
622 return JdkTypeIDs.SOCKET_READ.equals(item.getType().getIdentifier()) ? READ_ALPHA_COLOR : WRITE_ALPHA_COLOR;
623 }
624
625 }
|