--- old/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/FileIOPage.java 2019-05-23 17:07:12.390798588 -0400 +++ new/application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/FileIOPage.java 2019-05-23 17:07:12.287798219 -0400 @@ -74,6 +74,8 @@ import org.openjdk.jmc.flightrecorder.ui.StreamModel; import org.openjdk.jmc.flightrecorder.ui.common.AbstractDataPage; import org.openjdk.jmc.flightrecorder.ui.common.DataPageToolkit; +import org.openjdk.jmc.flightrecorder.ui.common.DurationPercentileTable; +import org.openjdk.jmc.flightrecorder.ui.common.DurationPercentileTable.DurationPercentileTableBuilder; import org.openjdk.jmc.flightrecorder.ui.common.FilterComponent; import org.openjdk.jmc.flightrecorder.ui.common.FlavorSelector; import org.openjdk.jmc.flightrecorder.ui.common.FlavorSelector.FlavorSelectorState; @@ -94,6 +96,8 @@ import org.openjdk.jmc.ui.column.TableSettings; import org.openjdk.jmc.ui.column.TableSettings.ColumnSettings; import org.openjdk.jmc.ui.handlers.MCContextMenuManager; +import org.openjdk.jmc.ui.layout.SimpleLayout; +import org.openjdk.jmc.ui.layout.SimpleLayoutData; import org.openjdk.jmc.ui.misc.ChartCanvas; import org.openjdk.jmc.ui.misc.PersistableSashForm; @@ -136,9 +140,14 @@ private static final String READ_SIZE = "readSize"; //$NON-NLS-1$ private static final String WRITE_SIZE = "writeSize"; //$NON-NLS-1$ private static final String READ_EOF = "endOfFile"; //$NON-NLS-1$ + private static final String PERCENTILE_READ_TIME = "percentileReadTime"; //$NON-NLS-1$ + private static final String PERCENTILE_READ_COUNT = "percentileReadCount"; //$NON-NLS-1$ + private static final String PERCENTILE_WRITE_TIME = "percentileWriteTime"; //$NON-NLS-1$ + private static final String PERCENTILE_WRITE_COUNT = "percentileWriteCount"; //$NON-NLS-1$ private static final ItemHistogramBuilder HISTOGRAM = new ItemHistogramBuilder(); private static final ItemListBuilder LIST = new ItemListBuilder(); + private static final DurationPercentileTableBuilder PERCENTILES = new DurationPercentileTableBuilder(); static { HISTOGRAM.addCountColumn(); @@ -158,6 +167,11 @@ LIST.addColumn(JdkAttributes.IO_FILE_BYTES_WRITTEN); LIST.addColumn(JfrAttributes.EVENT_THREAD); LIST.addColumn(JdkAttributes.IO_FILE_READ_EOF); + + PERCENTILES.addSeries(PERCENTILE_READ_TIME, Messages.FileIOPage_ROW_FILE_READ, + PERCENTILE_READ_COUNT, JdkAggregators.FILE_READ_COUNT.getName(), JdkTypeIDs.FILE_READ); + PERCENTILES.addSeries(PERCENTILE_WRITE_TIME, Messages.FileIOPage_ROW_FILE_WRITE, + PERCENTILE_WRITE_COUNT, JdkAggregators.FILE_WRITE_COUNT.getName(), JdkTypeIDs.FILE_WRITE); } private class IOPageUi implements IPageUI { @@ -166,6 +180,7 @@ private static final String SASH_ELEMENT = "sash"; //$NON-NLS-1$ private static final String LIST_ELEMENT = "eventList"; //$NON-NLS-1$ private static final String TABLE_ELEMENT = "table"; //$NON-NLS-1$ + private static final String PERCENTILE_TABLE_ELEMENT = "percentileTable"; //$NON-NLS-1$ private final ChartCanvas timelineCanvas; private final ChartCanvas durationCanvas; @@ -180,6 +195,8 @@ private FilterComponent tableFilter; private FilterComponent itemListFilter; private FlavorSelector flavorSelector; + private DurationPercentileTable percentileTable; + private Composite durationParent; IOPageUi(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) { this.pageContainer = pageContainer; @@ -214,12 +231,25 @@ DataPageToolkit.createChartTimestampTooltip(timelineCanvas); CTabItem t2 = new CTabItem(tabFolder, SWT.NONE); + durationParent = toolkit.createComposite(tabFolder); + durationParent.setLayout(new SimpleLayout()); t2.setToolTipText(Messages.IO_PAGE_DURATIONS_DESCRIPTION); - durationCanvas = new ChartCanvas(tabFolder); - t2.setText(Messages.PAGES_DURATIONS); - t2.setControl(durationCanvas); + durationCanvas = new ChartCanvas(durationParent); + durationCanvas.setLayoutData(new SimpleLayoutData(3.5f)); DataPageToolkit.createChartTooltip(durationCanvas); + percentileTable = PERCENTILES.build(durationParent, + TableSettings.forState(state.getChild(PERCENTILE_TABLE_ELEMENT))); + percentileTable.getManager().getViewer().getControl().setLayoutData(new SimpleLayoutData(6.5f)); + MCContextMenuManager percentileTableMm = MCContextMenuManager + .create(percentileTable.getManager().getViewer().getControl()); + ColumnMenusFactory.addDefaultMenus(percentileTable.getManager(), percentileTableMm); + SelectionStoreActionToolkit.addSelectionStoreActions(percentileTable.getManager().getViewer(), + pageContainer.getSelectionStore(), percentileTable::getSelectedItems, + Messages.FileIOPage_PERCENTILE_SELECTION, percentileTableMm); + t2.setText(Messages.PAGES_DURATIONS); + t2.setControl(durationParent); + CTabItem t3 = new CTabItem(tabFolder, SWT.NONE); t3.setToolTipText(Messages.IO_PAGE_SIZE_DESCRIPTION); sizeCanvas = new ChartCanvas(tabFolder); @@ -264,6 +294,7 @@ pageContainer, this::onInputSelected, this::onShowFlavor, flavorSelectorState); table.getManager().setSelectionState(tableSelection); + percentileTable.getManager().setSelectionState(percentileSelection); itemList.getManager().setSelectionState(itemListSelection); } @@ -292,6 +323,7 @@ tableFilter.saveState(writableState.createChild(FILE_IO_TABLE)); itemList.getManager().getSettings().saveState(writableState.createChild(LIST_ELEMENT)); itemListFilter.saveState(writableState.createChild(FILE_IO_LIST)); + percentileTable.getManager().getSettings().saveState(writableState.createChild(PERCENTILE_TABLE_ELEMENT)); saveToLocal(); } @@ -300,6 +332,7 @@ tableSelection = table.getManager().getSelectionState(); itemListSelection = itemList.getManager().getSelectionState(); flavorSelectorState = flavorSelector.getFlavorSelectorState(); + percentileSelection = percentileTable.getManager().getSelectionState(); } private void onShowFlavor(Boolean show) { @@ -374,6 +407,7 @@ SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), durationChart, JfrAttributes.DURATION, Messages.FileIOPage_DURATION_SELECTION, durationCanvas.getContextMenu()); itemList.show(selectedItems); + percentileTable.update(selectedItems); IXDataRenderer sizeRoot = RendererToolkit.uniformRows(sizeRows); IQuantity sizeMax = selectedItems.getAggregate(JdkAggregators.FILE_READ_LARGEST); @@ -412,6 +446,7 @@ private SelectionState tableSelection; private SelectionState itemListSelection; + private SelectionState percentileSelection; private IItemFilter tableFilter = null; private IItemFilter itemListFilter = null; private int tabFolderIndex = 0;