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 }
|