< prev index next >

application/org.openjdk.jmc.flightrecorder.ui/src/main/java/org/openjdk/jmc/flightrecorder/ui/pages/ClassLoadingPage.java

Print this page




 114                 public ImageDescriptor getImageDescriptor(IState state) {
 115                         return FlightRecorderUI.getDefault().getMCImageDescriptor(ImageConstants.PAGE_CLASSLOADING);
 116                 }
 117 
 118                 @Override
 119                 public String[] getTopics(IState state) {
 120                         return new String[] {JfrRuleTopics.CLASS_LOADING_TOPIC};
 121                 }
 122 
 123                 @Override
 124                 public IDisplayablePage createPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) {
 125                         return new ClassLoadingPage(dpd, items, editor);
 126                 }
 127         }
 128 
 129         private static final IItemFilter TABLE_FILTER = ItemFilters.or(JdkQueries.CLASS_LOAD.getFilter(),
 130                         JdkQueries.CLASS_UNLOAD.getFilter());
 131         private static final ItemHistogramBuilder CLASSLOADER_HISTOGRAM = new ItemHistogramBuilder();
 132         private static final ItemListBuilder CLASS_LOADING_LIST = new ItemListBuilder();
 133         private static final ItemListBuilder CLASS_UNLOADING_LIST = new ItemListBuilder();


 134         private static final Map<String, Boolean> LEGEND_ITEMS = new LinkedHashMap<>();
 135         private static final String LOADED_COUNT = "loadedCount"; //$NON-NLS-1$
 136         private static final String UNLOADED_COUNT = "unloadedCount"; //$NON-NLS-1$
 137         private static final String CLASS_LOAD = "classLoad"; //$NON-NLS-1$
 138         private static final String CLASS_UNLOAD = "classUnload"; //$NON-NLS-1$
 139 
 140         static {
 141                 CLASSLOADER_HISTOGRAM.addColumn(LOADED_COUNT,
 142                                 Aggregators.count(Messages.ClassLoadingPage_AGGR_CLASSES_LOADED_BY_CLASSLOADER,
 143                                                 Messages.ClassLoadingPage_AGGR_CLASSES_LOADED_BY_CLASSLOADER_DESC,
 144                                                 ItemFilters.type(JdkTypeIDs.CLASS_LOAD)));
 145                 CLASSLOADER_HISTOGRAM.addColumn(UNLOADED_COUNT,
 146                                 Aggregators.count(Messages.ClassLoadingPage_AGGR_CLASSES_UNLOADED_BY_CLASSLOADER,
 147                                                 Messages.ClassLoadingPage_AGGR_CLASSES_UNLOADED_BY_CLASSLOADER_DESC,
 148                                                 ItemFilters.type(JdkTypeIDs.CLASS_UNLOAD)));
 149 
 150                 CLASS_LOADING_LIST.addColumn(JdkAttributes.CLASS_LOADED);
 151                 CLASS_LOADING_LIST.addColumn(JdkAttributes.CLASS_DEFINING_CLASSLOADER);
 152                 CLASS_LOADING_LIST.addColumn(JdkAttributes.CLASS_INITIATING_CLASSLOADER);
 153                 CLASS_LOADING_LIST.addColumn(JfrAttributes.START_TIME);
 154                 CLASS_LOADING_LIST.addColumn(JfrAttributes.DURATION);
 155                 CLASS_LOADING_LIST.addColumn(JfrAttributes.END_TIME);
 156                 CLASS_LOADING_LIST.addColumn(JfrAttributes.EVENT_THREAD);
 157                 CLASS_UNLOADING_LIST.addColumn(JfrAttributes.EVENT_TIMESTAMP);
 158                 CLASS_UNLOADING_LIST.addColumn(JfrAttributes.EVENT_THREAD);
 159                 CLASS_UNLOADING_LIST.addColumn(JdkAttributes.CLASS_UNLOADED);
 160                 CLASS_UNLOADING_LIST.addColumn(JdkAttributes.CLASS_DEFINING_CLASSLOADER);
 161 













 162                 // FIXME: Need to make a label provider for this
 163                 // FIXME: Want to have this in the same order
 164 
 165                 LEGEND_ITEMS.put(JdkAttributes.CLASSLOADER_LOADED_COUNT.getIdentifier(), Boolean.TRUE);
 166                 LEGEND_ITEMS.put(JdkAttributes.CLASSLOADER_UNLOADED_COUNT.getIdentifier(), Boolean.FALSE);
 167                 LEGEND_ITEMS.put(CLASS_LOAD, Boolean.TRUE);
 168                 LEGEND_ITEMS.put(CLASS_UNLOAD, Boolean.FALSE);
 169         }
 170 
 171         private class ClassLoadingUi implements IPageUI {
 172 
 173                 private final ChartCanvas classLoadingChart;
 174                 private final ItemList classLoadingTable;
 175                 private final ItemList classUnloadingTable;


 176                 private FilterComponent classLoadingFilter;
 177                 private FilterComponent classUnloadingFilter;


 178                 private final SashForm sash;
 179                 private final IPageContainer pageContainer;
 180                 private IItemCollection selectionItems;
 181                 private ItemHistogram classloaderHistogram;
 182                 private FilterComponent classloaderHistogramFilter;
 183                 private final IAction classLoadAction = DataPageToolkit.createTypeCheckAction(CLASS_LOAD, JdkTypeIDs.CLASS_LOAD,
 184                                 Messages.ClassLoadingPage_CLASS_LOADING_ACTION, Messages.ClassLoadingPage_CLASS_LOADING_ACTION_DESC,
 185                                 b -> updateChart());
 186                 private final IAction classUnloadAction = DataPageToolkit.createTypeCheckAction(CLASS_UNLOAD,
 187                                 JdkTypeIDs.CLASS_UNLOAD, Messages.ClassLoadingPage_CLASS_UNLOADING_ACTION,
 188                                 Messages.ClassLoadingPage_CLASS_UNLOADING_ACTION_DESC, b -> updateChart());
 189                 private final Stream<IAction> statsActions = Stream
 190                                 .of(JdkAttributes.CLASSLOADER_LOADED_COUNT, JdkAttributes.CLASSLOADER_UNLOADED_COUNT)
 191                                 .map(a -> DataPageToolkit.createAttributeCheckAction(a, b -> updateChart()));
 192                 private final List<IAction> allChartSeriesActions = Stream
 193                                 .concat(Stream.of(classLoadAction, classUnloadAction), statsActions).collect(Collectors.toList());
 194                 private CTabFolder tabFolder;
 195                 private XYChart chart;
 196                 private IRange<IQuantity> timeRange;
 197                 private FlavorSelector flavorSelector;


 242                         tabFolder = new CTabFolder(sash, SWT.NONE);
 243 
 244                         classLoadingTable = CLASS_LOADING_LIST.buildWithoutBorder(tabFolder,
 245                                         TableSettings.forState(state.getChild(CLASS_LOADING_TABLE)));
 246                         classLoadingTable.getManager().getViewer().addSelectionChangedListener(e -> pageContainer
 247                                         .showSelection(ItemCollectionToolkit.build(classLoadingTable.getSelection().get())));
 248                         classLoadingFilter = FilterComponent.createFilterComponent(classLoadingTable, null,
 249                                         getDataSource().getItems().apply(JdkFilters.CLASS_LOAD),
 250                                         pageContainer.getSelectionStore()::getSelections, this::onClassLoadFilterChange);
 251                         MCContextMenuManager classLoadingTableMm = MCContextMenuManager
 252                                         .create(classLoadingTable.getManager().getViewer().getControl());
 253                         ColumnMenusFactory.addDefaultMenus(classLoadingTable.getManager(), classLoadingTableMm);
 254                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), classLoadingTable,
 255                                         Messages.ClassLoadingPage_CLASS_LOADING_LIST_SELECTION, classLoadingTableMm);
 256                         classLoadingTableMm.add(classLoadingFilter.getShowFilterAction());
 257                         classLoadingTableMm.add(classLoadingFilter.getShowSearchAction());
 258                         classLoadingFilter.loadState(state.getChild(CLASS_LOADING_FILTER));
 259                         DataPageToolkit.addTabItem(tabFolder, classLoadingFilter.getComponent(),
 260                                         Messages.ClassLoadingPage_CLASS_LOADING_TAB_TITLE);
 261 




































 262                         classUnloadingTable = CLASS_UNLOADING_LIST.buildWithoutBorder(tabFolder,
 263                                         TableSettings.forState(state.getChild(CLASS_UNLOADING_TABLE)));
 264                         classUnloadingTable.getManager().getViewer().addSelectionChangedListener(e -> pageContainer
 265                                         .showSelection(ItemCollectionToolkit.build(classUnloadingTable.getSelection().get())));
 266                         classUnloadingFilter = FilterComponent.createFilterComponent(classUnloadingTable, null,
 267                                         getDataSource().getItems().apply(JdkFilters.CLASS_UNLOAD),
 268                                         pageContainer.getSelectionStore()::getSelections, this::onClassUnloadFilterChange);
 269                         MCContextMenuManager classUnloadingTableMm = MCContextMenuManager
 270                                         .create(classUnloadingTable.getManager().getViewer().getControl());
 271                         ColumnMenusFactory.addDefaultMenus(classUnloadingTable.getManager(), classUnloadingTableMm);
 272                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), classUnloadingTable,
 273                                         Messages.ClassLoadingPage_CLASS_UNLOADING_LIST_SELECTION, classUnloadingTableMm);
 274                         classUnloadingTableMm.add(classUnloadingFilter.getShowFilterAction());
 275                         classUnloadingTableMm.add(classUnloadingFilter.getShowSearchAction());
 276                         classUnloadingFilter.loadState(state.getChild(CLASS_UNLOADING_FILTER));
 277                         DataPageToolkit.addTabItem(tabFolder, classUnloadingFilter.getComponent(),
 278                                         Messages.ClassLoadingPage_CLASS_UNLOADING_TAB_TITLE);
 279 
 280                         tabFolder.setSelection(tabFolderIndex);
 281 
 282                         PersistableSashForm.loadState(sash, state.getChild(SASH));
 283                         flavorSelector = FlavorSelector.itemsWithTimerange(form, TABLE_FILTER, getDataSource().getItems(),
 284                                         pageContainer, this::onInputSelected, this::onShow, flavorSelectorState);
 285                         addResultActions(form);
 286 
 287                         onHistogramFilterChange(histogramFilter);
 288                         onClassLoadFilterChange(classLoadTableFilter);
 289                         onClassUnloadFilterChange(classUnloadTableFilter);


 290 
 291                         classloaderHistogram.getManager().setSelectionState(histogramSelection);
 292                         classLoadingTable.getManager().setSelectionState(classLoadingTableSelection);
 293                         classUnloadingTable.getManager().setSelectionState(classUnloadingTableSelection);


 294                 }
 295 
 296                 private void onHistogramFilterChange(IItemFilter filter) {
 297                         classloaderHistogramFilter.filterChangeHelper(filter, classloaderHistogram,
 298                                         getDataSource().getItems().apply(JdkFilters.CLASS_LOAD_OR_UNLOAD));
 299                         if (classLoadingFilter != null) {
 300                                 classLoadingFilter.notifyListener();
 301                         }
 302                         if (classUnloadingFilter != null) {
 303                                 classUnloadingFilter.notifyListener();
 304                         }






 305                         histogramFilter = filter;
 306                 }
 307 
 308                 private void onClassLoadFilterChange(IItemFilter filter) {
 309                         classLoadingFilter.filterChangeHelper(filter, classLoadingTable,
 310                                         getDataSource().getItems().apply(JdkFilters.CLASS_LOAD));
 311                         classLoadTableFilter = filter;
 312                 }
 313 
 314                 private void onClassUnloadFilterChange(IItemFilter filter) {
 315                         classUnloadingFilter.filterChangeHelper(filter, classUnloadingTable,
 316                                         getDataSource().getItems().apply(JdkFilters.CLASS_UNLOAD));
 317                         classUnloadTableFilter = filter;
 318                 }
 319 












 320                 @Override
 321                 public void saveTo(IWritableState state) {
 322                         PersistableSashForm.saveState(sash, state.createChild(SASH));
 323                         classloaderHistogram.getManager().getSettings().saveState(state.createChild(HISTOGRAM));
 324                         classLoadingTable.getManager().getSettings().saveState(state.createChild(CLASS_LOADING_TABLE));
 325                         classUnloadingTable.getManager().getSettings().saveState(state.createChild(CLASS_UNLOADING_TABLE));


 326                         classloaderHistogramFilter.saveState(state.createChild(HISTOGRAM_FILTER));
 327                         classLoadingFilter.saveState(state.createChild(CLASS_LOADING_FILTER));
 328                         classUnloadingFilter.saveState(state.createChild(CLASS_UNLOADING_FILTER));


 329                         ActionToolkit.saveCheckState(state.createChild(CHART), allChartSeriesActions.stream());
 330 
 331                         saveToLocal();
 332                 }
 333 
 334                 private void saveToLocal() {
 335                         histogramSelection = classloaderHistogram.getManager().getSelectionState();
 336                         classLoadingTableSelection = classLoadingTable.getManager().getSelectionState();
 337                         classUnloadingTableSelection = classUnloadingTable.getManager().getSelectionState();


 338                         tabFolderIndex = tabFolder.getSelectionIndex();
 339                         flavorSelectorState = flavorSelector.getFlavorSelectorState();
 340                 }
 341 
 342                 private void onShow(Boolean show) {
 343                         IRange<IQuantity> range = show ? timeRange : pageContainer.getRecordingRange();
 344                         chart.setVisibleRange(range.getStart(), range.getEnd());
 345                         updateChart();
 346                 }
 347 
 348                 private void onInputSelected(IItemCollection items, IRange<IQuantity> timeRange) {
 349                         selectionItems = items;
 350                         this.timeRange = timeRange;
 351                         updateHistogram(getItems());
 352                         updateTables(getItems());
 353                         updateChart();
 354                 }
 355 
 356                 private IItemCollection getItems() {
 357                         return selectionItems != null ? selectionItems : getDataSource().getItems();


 400                                 classUnloadingTable.show(selectedItems.apply(JdkQueries.CLASS_UNLOAD.getFilter()));
 401                         }
 402                 }
 403 
 404                 private void onChartSelection(IRange<IQuantity> range) {
 405                         // FIXME: Make this depend on the legend as well? And maybe on which chart row has been selected?
 406                         IItemCollection itemsInRange = range != null ? getItems().apply(ItemFilters
 407                                         .matchRange(RangeMatchPolicy.CENTER_CONTAINED_IN_RIGHT_OPEN, JfrAttributes.LIFETIME, range))
 408                                         : getItems();
 409                         updateTables(itemsInRange);
 410                         updateHistogram(itemsInRange);
 411                 }
 412 
 413         }
 414 
 415         private static final String SASH = "sash"; //$NON-NLS-1$
 416         private static final String HISTOGRAM = "histogram"; //$NON-NLS-1$
 417         private static final String HISTOGRAM_FILTER = "histogramFilter"; //$NON-NLS-1$
 418         private static final String CLASS_LOADING_TABLE = "classLoadingTable"; //$NON-NLS-1$
 419         private static final String CLASS_UNLOADING_TABLE = "classUnloadingTable"; //$NON-NLS-1$


 420         private static final String CLASS_LOADING_FILTER = "classLoadingFilter"; //$NON-NLS-1$
 421         private static final String CLASS_UNLOADING_FILTER = "classUnloadingFilter"; //$NON-NLS-1$


 422         private static final String CHART = "chart"; //$NON-NLS-1$
 423 
 424         @Override
 425         public IPageUI display(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
 426                 return new ClassLoadingUi(parent, toolkit, pageContainer, state);
 427         }
 428 
 429         private SelectionState histogramSelection;
 430         private SelectionState classLoadingTableSelection;
 431         private SelectionState classUnloadingTableSelection;


 432         private IItemFilter histogramFilter;
 433         private IItemFilter classLoadTableFilter;
 434         private IItemFilter classUnloadTableFilter;


 435         private int tabFolderIndex = 0;
 436         private IRange<IQuantity> timelineRange;
 437         private FlavorSelectorState flavorSelectorState;
 438 
 439         public ClassLoadingPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) {
 440                 super(dpd, items, editor);
 441                 timelineRange = editor.getRecordingRange();
 442         }
 443 
 444         @Override
 445         public IItemFilter getDefaultSelectionFilter() {
 446                 return ItemFilters.or(TABLE_FILTER, JdkFilters.CLASS_LOAD_STATISTICS);
 447         }
 448 
 449 }


 114                 public ImageDescriptor getImageDescriptor(IState state) {
 115                         return FlightRecorderUI.getDefault().getMCImageDescriptor(ImageConstants.PAGE_CLASSLOADING);
 116                 }
 117 
 118                 @Override
 119                 public String[] getTopics(IState state) {
 120                         return new String[] {JfrRuleTopics.CLASS_LOADING_TOPIC};
 121                 }
 122 
 123                 @Override
 124                 public IDisplayablePage createPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) {
 125                         return new ClassLoadingPage(dpd, items, editor);
 126                 }
 127         }
 128 
 129         private static final IItemFilter TABLE_FILTER = ItemFilters.or(JdkQueries.CLASS_LOAD.getFilter(),
 130                         JdkQueries.CLASS_UNLOAD.getFilter());
 131         private static final ItemHistogramBuilder CLASSLOADER_HISTOGRAM = new ItemHistogramBuilder();
 132         private static final ItemListBuilder CLASS_LOADING_LIST = new ItemListBuilder();
 133         private static final ItemListBuilder CLASS_UNLOADING_LIST = new ItemListBuilder();
 134         private static final ItemListBuilder CLASS_DEFINE_LIST = new ItemListBuilder();
 135         private static final ItemListBuilder CLASS_LOADER_STATISTICS_LIST = new ItemListBuilder();
 136         private static final Map<String, Boolean> LEGEND_ITEMS = new LinkedHashMap<>();
 137         private static final String LOADED_COUNT = "loadedCount"; //$NON-NLS-1$
 138         private static final String UNLOADED_COUNT = "unloadedCount"; //$NON-NLS-1$
 139         private static final String CLASS_LOAD = "classLoad"; //$NON-NLS-1$
 140         private static final String CLASS_UNLOAD = "classUnload"; //$NON-NLS-1$
 141 
 142         static {
 143                 CLASSLOADER_HISTOGRAM.addColumn(LOADED_COUNT,
 144                                 Aggregators.count(Messages.ClassLoadingPage_AGGR_CLASSES_LOADED_BY_CLASSLOADER,
 145                                                 Messages.ClassLoadingPage_AGGR_CLASSES_LOADED_BY_CLASSLOADER_DESC,
 146                                                 ItemFilters.type(JdkTypeIDs.CLASS_LOAD)));
 147                 CLASSLOADER_HISTOGRAM.addColumn(UNLOADED_COUNT,
 148                                 Aggregators.count(Messages.ClassLoadingPage_AGGR_CLASSES_UNLOADED_BY_CLASSLOADER,
 149                                                 Messages.ClassLoadingPage_AGGR_CLASSES_UNLOADED_BY_CLASSLOADER_DESC,
 150                                                 ItemFilters.type(JdkTypeIDs.CLASS_UNLOAD)));
 151 
 152                 CLASS_LOADING_LIST.addColumn(JdkAttributes.CLASS_LOADED);
 153                 CLASS_LOADING_LIST.addColumn(JdkAttributes.CLASS_DEFINING_CLASSLOADER);
 154                 CLASS_LOADING_LIST.addColumn(JdkAttributes.CLASS_INITIATING_CLASSLOADER);
 155                 CLASS_LOADING_LIST.addColumn(JfrAttributes.START_TIME);
 156                 CLASS_LOADING_LIST.addColumn(JfrAttributes.DURATION);
 157                 CLASS_LOADING_LIST.addColumn(JfrAttributes.END_TIME);
 158                 CLASS_LOADING_LIST.addColumn(JfrAttributes.EVENT_THREAD);
 159                 CLASS_UNLOADING_LIST.addColumn(JfrAttributes.EVENT_TIMESTAMP);
 160                 CLASS_UNLOADING_LIST.addColumn(JfrAttributes.EVENT_THREAD);
 161                 CLASS_UNLOADING_LIST.addColumn(JdkAttributes.CLASS_UNLOADED);
 162                 CLASS_UNLOADING_LIST.addColumn(JdkAttributes.CLASS_DEFINING_CLASSLOADER);
 163                 CLASS_DEFINE_LIST.addColumn(JdkAttributes.CLASS_DEFINING_CLASSLOADER);
 164                 CLASS_DEFINE_LIST.addColumn(JdkAttributes.CLASS_DEFINED);
 165                 CLASS_DEFINE_LIST.addColumn(JfrAttributes.EVENT_THREAD);
 166                 CLASS_DEFINE_LIST.addColumn(JfrAttributes.START_TIME);
 167                 CLASS_LOADER_STATISTICS_LIST.addColumn(JdkAttributes.ANONYMOUS_BLOCK_SIZE);
 168                 CLASS_LOADER_STATISTICS_LIST.addColumn(JdkAttributes.ANONYMOUS_CHUNK_SIZE);
 169                 CLASS_LOADER_STATISTICS_LIST.addColumn(JdkAttributes.ANONYMOUS_CLASS_COUNT);
 170                 CLASS_LOADER_STATISTICS_LIST.addColumn(JdkAttributes.BLOCK_SIZE);
 171                 CLASS_LOADER_STATISTICS_LIST.addColumn(JdkAttributes.CHUNK_SIZE);
 172                 CLASS_LOADER_STATISTICS_LIST.addColumn(JdkAttributes.CLASS_COUNT);
 173                 CLASS_LOADER_STATISTICS_LIST.addColumn(JdkAttributes.CLASS_LOADER_DATA);
 174                 CLASS_LOADER_STATISTICS_LIST.addColumn(JdkAttributes.PARENT_CLASSLOADER);
 175                 CLASS_LOADER_STATISTICS_LIST.addColumn(JdkAttributes.CLASSLOADER);
 176                 CLASS_LOADER_STATISTICS_LIST.addColumn(JfrAttributes.START_TIME);
 177                 // FIXME: Need to make a label provider for this
 178                 // FIXME: Want to have this in the same order
 179 
 180                 LEGEND_ITEMS.put(JdkAttributes.CLASSLOADER_LOADED_COUNT.getIdentifier(), Boolean.TRUE);
 181                 LEGEND_ITEMS.put(JdkAttributes.CLASSLOADER_UNLOADED_COUNT.getIdentifier(), Boolean.FALSE);
 182                 LEGEND_ITEMS.put(CLASS_LOAD, Boolean.TRUE);
 183                 LEGEND_ITEMS.put(CLASS_UNLOAD, Boolean.FALSE);
 184         }
 185 
 186         private class ClassLoadingUi implements IPageUI {
 187 
 188                 private final ChartCanvas classLoadingChart;
 189                 private final ItemList classLoadingTable;
 190                 private final ItemList classUnloadingTable;
 191                 private final ItemList classDefineTable;
 192                 private final ItemList classLoaderStatisticsTable;
 193                 private FilterComponent classLoadingFilter;
 194                 private FilterComponent classUnloadingFilter;
 195                 private FilterComponent classDefineFilter;
 196                 private FilterComponent classLoaderStatisticsFilter;
 197                 private final SashForm sash;
 198                 private final IPageContainer pageContainer;
 199                 private IItemCollection selectionItems;
 200                 private ItemHistogram classloaderHistogram;
 201                 private FilterComponent classloaderHistogramFilter;
 202                 private final IAction classLoadAction = DataPageToolkit.createTypeCheckAction(CLASS_LOAD, JdkTypeIDs.CLASS_LOAD,
 203                                 Messages.ClassLoadingPage_CLASS_LOADING_ACTION, Messages.ClassLoadingPage_CLASS_LOADING_ACTION_DESC,
 204                                 b -> updateChart());
 205                 private final IAction classUnloadAction = DataPageToolkit.createTypeCheckAction(CLASS_UNLOAD,
 206                                 JdkTypeIDs.CLASS_UNLOAD, Messages.ClassLoadingPage_CLASS_UNLOADING_ACTION,
 207                                 Messages.ClassLoadingPage_CLASS_UNLOADING_ACTION_DESC, b -> updateChart());
 208                 private final Stream<IAction> statsActions = Stream
 209                                 .of(JdkAttributes.CLASSLOADER_LOADED_COUNT, JdkAttributes.CLASSLOADER_UNLOADED_COUNT)
 210                                 .map(a -> DataPageToolkit.createAttributeCheckAction(a, b -> updateChart()));
 211                 private final List<IAction> allChartSeriesActions = Stream
 212                                 .concat(Stream.of(classLoadAction, classUnloadAction), statsActions).collect(Collectors.toList());
 213                 private CTabFolder tabFolder;
 214                 private XYChart chart;
 215                 private IRange<IQuantity> timeRange;
 216                 private FlavorSelector flavorSelector;


 261                         tabFolder = new CTabFolder(sash, SWT.NONE);
 262 
 263                         classLoadingTable = CLASS_LOADING_LIST.buildWithoutBorder(tabFolder,
 264                                         TableSettings.forState(state.getChild(CLASS_LOADING_TABLE)));
 265                         classLoadingTable.getManager().getViewer().addSelectionChangedListener(e -> pageContainer
 266                                         .showSelection(ItemCollectionToolkit.build(classLoadingTable.getSelection().get())));
 267                         classLoadingFilter = FilterComponent.createFilterComponent(classLoadingTable, null,
 268                                         getDataSource().getItems().apply(JdkFilters.CLASS_LOAD),
 269                                         pageContainer.getSelectionStore()::getSelections, this::onClassLoadFilterChange);
 270                         MCContextMenuManager classLoadingTableMm = MCContextMenuManager
 271                                         .create(classLoadingTable.getManager().getViewer().getControl());
 272                         ColumnMenusFactory.addDefaultMenus(classLoadingTable.getManager(), classLoadingTableMm);
 273                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), classLoadingTable,
 274                                         Messages.ClassLoadingPage_CLASS_LOADING_LIST_SELECTION, classLoadingTableMm);
 275                         classLoadingTableMm.add(classLoadingFilter.getShowFilterAction());
 276                         classLoadingTableMm.add(classLoadingFilter.getShowSearchAction());
 277                         classLoadingFilter.loadState(state.getChild(CLASS_LOADING_FILTER));
 278                         DataPageToolkit.addTabItem(tabFolder, classLoadingFilter.getComponent(),
 279                                         Messages.ClassLoadingPage_CLASS_LOADING_TAB_TITLE);
 280                         
 281                         classLoaderStatisticsTable = CLASS_LOADER_STATISTICS_LIST.buildWithoutBorder(tabFolder,
 282                                         TableSettings.forState(state.getChild(CLASS_LOADER_STATISTICS_TABLE)));
 283                         classLoaderStatisticsTable.getManager().getViewer().addSelectionChangedListener(e -> pageContainer
 284                                         .showSelection(ItemCollectionToolkit.build(classLoaderStatisticsTable.getSelection().get())));
 285                         classLoaderStatisticsFilter = FilterComponent.createFilterComponent(classLoaderStatisticsTable, null,
 286                                         getDataSource().getItems().apply(JdkFilters.CLASS_LOADER_STATISTICS),
 287                                         pageContainer.getSelectionStore()::getSelections, this::onClassLoadFilterChange);
 288                         MCContextMenuManager classLoaderStatisticsTableMm = MCContextMenuManager
 289                                         .create(classLoaderStatisticsTable.getManager().getViewer().getControl());
 290                         ColumnMenusFactory.addDefaultMenus(classLoaderStatisticsTable.getManager(), classLoaderStatisticsTableMm);
 291                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), classLoaderStatisticsTable,
 292                                         Messages.ClassLoadingPage_CLASS_LOADER_STATISTICS_LIST_SELECTION, classLoaderStatisticsTableMm);
 293                         classLoaderStatisticsTableMm.add(classLoaderStatisticsFilter.getShowFilterAction());
 294                         classLoaderStatisticsTableMm.add(classLoaderStatisticsFilter.getShowSearchAction());
 295                         classLoaderStatisticsFilter.loadState(state.getChild(CLASS_LOADER_STATISTICS_FILTER));
 296                         DataPageToolkit.addTabItem(tabFolder, classLoaderStatisticsFilter.getComponent(),
 297                                         Messages.ClassLoadingPage_CLASS_LOADER_STATISTICS_TAB_TITLE);
 298                         
 299                         classDefineTable = CLASS_DEFINE_LIST.buildWithoutBorder(tabFolder,
 300                                         TableSettings.forState(state.getChild(CLASS_DEFINE_TABLE)));
 301                         classDefineTable.getManager().getViewer().addSelectionChangedListener(e -> pageContainer
 302                                         .showSelection(ItemCollectionToolkit.build(classDefineTable.getSelection().get())));
 303                         classDefineFilter = FilterComponent.createFilterComponent(classDefineTable, null,
 304                                         getDataSource().getItems().apply(JdkFilters.CLASS_DEFINE),
 305                                         pageContainer.getSelectionStore()::getSelections, this::onClassLoadFilterChange);
 306                         MCContextMenuManager classDefineTableMm = MCContextMenuManager
 307                                         .create(classDefineTable.getManager().getViewer().getControl());
 308                         ColumnMenusFactory.addDefaultMenus(classDefineTable.getManager(), classDefineTableMm);
 309                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), classDefineTable,
 310                                         Messages.ClassLoadingPage_CLASS_DEFINE_LIST_SELECTION, classDefineTableMm);
 311                         classDefineTableMm.add(classDefineFilter.getShowFilterAction());
 312                         classDefineTableMm.add(classDefineFilter.getShowSearchAction());
 313                         classDefineFilter.loadState(state.getChild(CLASS_DEFINE_FILTER));
 314                         DataPageToolkit.addTabItem(tabFolder, classDefineFilter.getComponent(),
 315                                         Messages.ClassLoadingPage_CLASS_DEFINE_TAB_TITLE);
 316 
 317                         classUnloadingTable = CLASS_UNLOADING_LIST.buildWithoutBorder(tabFolder,
 318                                         TableSettings.forState(state.getChild(CLASS_UNLOADING_TABLE)));
 319                         classUnloadingTable.getManager().getViewer().addSelectionChangedListener(e -> pageContainer
 320                                         .showSelection(ItemCollectionToolkit.build(classUnloadingTable.getSelection().get())));
 321                         classUnloadingFilter = FilterComponent.createFilterComponent(classUnloadingTable, null,
 322                                         getDataSource().getItems().apply(JdkFilters.CLASS_UNLOAD),
 323                                         pageContainer.getSelectionStore()::getSelections, this::onClassUnloadFilterChange);
 324                         MCContextMenuManager classUnloadingTableMm = MCContextMenuManager
 325                                         .create(classUnloadingTable.getManager().getViewer().getControl());
 326                         ColumnMenusFactory.addDefaultMenus(classUnloadingTable.getManager(), classUnloadingTableMm);
 327                         SelectionStoreActionToolkit.addSelectionStoreActions(pageContainer.getSelectionStore(), classUnloadingTable,
 328                                         Messages.ClassLoadingPage_CLASS_UNLOADING_LIST_SELECTION, classUnloadingTableMm);
 329                         classUnloadingTableMm.add(classUnloadingFilter.getShowFilterAction());
 330                         classUnloadingTableMm.add(classUnloadingFilter.getShowSearchAction());
 331                         classUnloadingFilter.loadState(state.getChild(CLASS_UNLOADING_FILTER));
 332                         DataPageToolkit.addTabItem(tabFolder, classUnloadingFilter.getComponent(),
 333                                         Messages.ClassLoadingPage_CLASS_UNLOADING_TAB_TITLE);
 334 
 335                         tabFolder.setSelection(tabFolderIndex);
 336 
 337                         PersistableSashForm.loadState(sash, state.getChild(SASH));
 338                         flavorSelector = FlavorSelector.itemsWithTimerange(form, TABLE_FILTER, getDataSource().getItems(),
 339                                         pageContainer, this::onInputSelected, this::onShow, flavorSelectorState);
 340                         addResultActions(form);
 341 
 342                         onHistogramFilterChange(histogramFilter);
 343                         onClassLoadFilterChange(classLoadTableFilter);
 344                         onClassUnloadFilterChange(classUnloadTableFilter);
 345                         onClassDefineFilterChange(classDefineTableFilter);
 346                         onClassLoaderStatisticsFilterChange(classLoaderStatisticsTableFilter);
 347 
 348                         classloaderHistogram.getManager().setSelectionState(histogramSelection);
 349                         classLoadingTable.getManager().setSelectionState(classLoadingTableSelection);
 350                         classUnloadingTable.getManager().setSelectionState(classUnloadingTableSelection);
 351                         classDefineTable.getManager().setSelectionState(classDefineTableSelection);
 352                         classLoaderStatisticsTable.getManager().setSelectionState(classLoaderStatisticsTableSelection);
 353                 }
 354 
 355                 private void onHistogramFilterChange(IItemFilter filter) {
 356                         classloaderHistogramFilter.filterChangeHelper(filter, classloaderHistogram,
 357                                         getDataSource().getItems().apply(JdkFilters.CLASS_LOAD_OR_UNLOAD));
 358                         if (classLoadingFilter != null) {
 359                                 classLoadingFilter.notifyListener();
 360                         }
 361                         if (classUnloadingFilter != null) {
 362                                 classUnloadingFilter.notifyListener();
 363                         }
 364                         if (classDefineFilter != null) {
 365                                 classDefineFilter.notifyListener();
 366                         }
 367                         if (classLoaderStatisticsFilter != null) {
 368                                 classLoaderStatisticsFilter.notifyListener();
 369                         }
 370                         histogramFilter = filter;
 371                 }
 372 
 373                 private void onClassLoadFilterChange(IItemFilter filter) {
 374                         classLoadingFilter.filterChangeHelper(filter, classLoadingTable,
 375                                         getDataSource().getItems().apply(JdkFilters.CLASS_LOAD));
 376                         classLoadTableFilter = filter;
 377                 }
 378 
 379                 private void onClassUnloadFilterChange(IItemFilter filter) {
 380                         classUnloadingFilter.filterChangeHelper(filter, classUnloadingTable,
 381                                         getDataSource().getItems().apply(JdkFilters.CLASS_UNLOAD));
 382                         classUnloadTableFilter = filter;
 383                 }
 384                 
 385                 private void onClassDefineFilterChange(IItemFilter filter) {
 386                         classDefineFilter.filterChangeHelper(filter, classDefineTable,
 387                                         getDataSource().getItems().apply(JdkFilters.CLASS_DEFINE));
 388                         classDefineTableFilter = filter;
 389                 }
 390                 
 391                 private void onClassLoaderStatisticsFilterChange(IItemFilter filter) {
 392                         classLoaderStatisticsFilter.filterChangeHelper(filter, classLoaderStatisticsTable,
 393                                         getDataSource().getItems().apply(JdkFilters.CLASS_LOADER_STATISTICS));
 394                         classLoaderStatisticsTableFilter = filter;
 395                 }
 396 
 397                 @Override
 398                 public void saveTo(IWritableState state) {
 399                         PersistableSashForm.saveState(sash, state.createChild(SASH));
 400                         classloaderHistogram.getManager().getSettings().saveState(state.createChild(HISTOGRAM));
 401                         classLoadingTable.getManager().getSettings().saveState(state.createChild(CLASS_LOADING_TABLE));
 402                         classUnloadingTable.getManager().getSettings().saveState(state.createChild(CLASS_UNLOADING_TABLE));
 403                         classDefineTable.getManager().getSettings().saveState(state.createChild(CLASS_DEFINE_TABLE));
 404                         classLoaderStatisticsTable.getManager().getSettings().saveState(state.createChild(CLASS_LOADER_STATISTICS_TABLE));
 405                         classloaderHistogramFilter.saveState(state.createChild(HISTOGRAM_FILTER));
 406                         classLoadingFilter.saveState(state.createChild(CLASS_LOADING_FILTER));
 407                         classUnloadingFilter.saveState(state.createChild(CLASS_UNLOADING_FILTER));
 408                         classDefineFilter.saveState(state.createChild(CLASS_DEFINE_FILTER));
 409                         classLoaderStatisticsFilter.saveState(state.createChild(CLASS_LOADER_STATISTICS_FILTER));
 410                         ActionToolkit.saveCheckState(state.createChild(CHART), allChartSeriesActions.stream());
 411 
 412                         saveToLocal();
 413                 }
 414 
 415                 private void saveToLocal() {
 416                         histogramSelection = classloaderHistogram.getManager().getSelectionState();
 417                         classLoadingTableSelection = classLoadingTable.getManager().getSelectionState();
 418                         classUnloadingTableSelection = classUnloadingTable.getManager().getSelectionState();
 419                         classDefineTableSelection = classDefineTable.getManager().getSelectionState();
 420                         classLoaderStatisticsTableSelection = classLoaderStatisticsTable.getManager().getSelectionState();
 421                         tabFolderIndex = tabFolder.getSelectionIndex();
 422                         flavorSelectorState = flavorSelector.getFlavorSelectorState();
 423                 }
 424 
 425                 private void onShow(Boolean show) {
 426                         IRange<IQuantity> range = show ? timeRange : pageContainer.getRecordingRange();
 427                         chart.setVisibleRange(range.getStart(), range.getEnd());
 428                         updateChart();
 429                 }
 430 
 431                 private void onInputSelected(IItemCollection items, IRange<IQuantity> timeRange) {
 432                         selectionItems = items;
 433                         this.timeRange = timeRange;
 434                         updateHistogram(getItems());
 435                         updateTables(getItems());
 436                         updateChart();
 437                 }
 438 
 439                 private IItemCollection getItems() {
 440                         return selectionItems != null ? selectionItems : getDataSource().getItems();


 483                                 classUnloadingTable.show(selectedItems.apply(JdkQueries.CLASS_UNLOAD.getFilter()));
 484                         }
 485                 }
 486 
 487                 private void onChartSelection(IRange<IQuantity> range) {
 488                         // FIXME: Make this depend on the legend as well? And maybe on which chart row has been selected?
 489                         IItemCollection itemsInRange = range != null ? getItems().apply(ItemFilters
 490                                         .matchRange(RangeMatchPolicy.CENTER_CONTAINED_IN_RIGHT_OPEN, JfrAttributes.LIFETIME, range))
 491                                         : getItems();
 492                         updateTables(itemsInRange);
 493                         updateHistogram(itemsInRange);
 494                 }
 495 
 496         }
 497 
 498         private static final String SASH = "sash"; //$NON-NLS-1$
 499         private static final String HISTOGRAM = "histogram"; //$NON-NLS-1$
 500         private static final String HISTOGRAM_FILTER = "histogramFilter"; //$NON-NLS-1$
 501         private static final String CLASS_LOADING_TABLE = "classLoadingTable"; //$NON-NLS-1$
 502         private static final String CLASS_UNLOADING_TABLE = "classUnloadingTable"; //$NON-NLS-1$
 503         private static final String CLASS_DEFINE_TABLE = "classDefineTable"; //$NON-NLS-1$
 504         private static final String CLASS_LOADER_STATISTICS_TABLE = "classLoaderStatisticsTable"; //$NON-NLS-1$
 505         private static final String CLASS_LOADING_FILTER = "classLoadingFilter"; //$NON-NLS-1$
 506         private static final String CLASS_UNLOADING_FILTER = "classUnloadingFilter"; //$NON-NLS-1$
 507         private static final String CLASS_DEFINE_FILTER = "classDefineFilter"; //$NON-NLS-1$
 508         private static final String CLASS_LOADER_STATISTICS_FILTER = "classLoaderStatisticsFilter"; //$NON-NLS-1$
 509         private static final String CHART = "chart"; //$NON-NLS-1$
 510 
 511         @Override
 512         public IPageUI display(Composite parent, FormToolkit toolkit, IPageContainer pageContainer, IState state) {
 513                 return new ClassLoadingUi(parent, toolkit, pageContainer, state);
 514         }
 515 
 516         private SelectionState histogramSelection;
 517         private SelectionState classLoadingTableSelection;
 518         private SelectionState classUnloadingTableSelection;
 519         private SelectionState classDefineTableSelection;
 520         private SelectionState classLoaderStatisticsTableSelection;
 521         private IItemFilter histogramFilter;
 522         private IItemFilter classLoadTableFilter;
 523         private IItemFilter classUnloadTableFilter;
 524         private IItemFilter classDefineTableFilter;
 525         private IItemFilter classLoaderStatisticsTableFilter;
 526         private int tabFolderIndex = 0;
 527         private IRange<IQuantity> timelineRange;
 528         private FlavorSelectorState flavorSelectorState;
 529 
 530         public ClassLoadingPage(IPageDefinition dpd, StreamModel items, IPageContainer editor) {
 531                 super(dpd, items, editor);
 532                 timelineRange = editor.getRecordingRange();
 533         }
 534 
 535         @Override
 536         public IItemFilter getDefaultSelectionFilter() {
 537                 return ItemFilters.or(TABLE_FILTER, JdkFilters.CLASS_LOAD_STATISTICS);
 538         }
 539 
 540 }
< prev index next >