25
25
26
26
package org .graalvm .visualvm .heapviewer .utils ;
27
27
28
+ import java .awt .event .ActionEvent ;
28
29
import java .text .Format ;
29
30
import java .util .Iterator ;
30
31
import java .util .List ;
32
+ import java .util .Random ;
33
+ import java .util .SortedSet ;
34
+ import java .util .TreeSet ;
31
35
import javax .swing .SortOrder ;
36
+ import org .graalvm .visualvm .heapviewer .HeapContext ;
32
37
import org .graalvm .visualvm .lib .jfluid .heap .Heap ;
33
38
import org .graalvm .visualvm .lib .ui .Formatters ;
34
39
import org .graalvm .visualvm .heapviewer .model .DataType ;
35
40
import org .graalvm .visualvm .heapviewer .model .HeapViewerNode ;
36
41
import org .graalvm .visualvm .heapviewer .model .HeapViewerNodeFilter ;
37
42
import org .graalvm .visualvm .heapviewer .model .MoreNodesNode ;
38
43
import org .graalvm .visualvm .heapviewer .model .Progress ;
44
+ import org .graalvm .visualvm .heapviewer .model .RootNode ;
39
45
import org .graalvm .visualvm .heapviewer .model .TextNode ;
46
+ import org .graalvm .visualvm .heapviewer .ui .HeapViewerActions ;
47
+ import org .graalvm .visualvm .heapviewer .ui .HeapViewerNodeAction ;
40
48
import org .graalvm .visualvm .heapviewer .ui .UIThresholds ;
41
49
import org .openide .util .NbBundle ;
50
+ import org .openide .util .lookup .ServiceProvider ;
42
51
43
52
/**
44
53
*
@@ -294,10 +303,9 @@ private HeapViewerNode[] computeChildren(int containerIndex, Heap heap, String v
294
303
// }
295
304
}
296
305
297
- private HeapViewerNode [] computeSampleChildren (int count , Heap heap , String viewID , HeapViewerNodeFilter viewFilter , List <DataType > dataTypes , List <SortOrder > sortOrders , Progress progress ) throws InterruptedException {
306
+ private HeapViewerNode [] computeSampleChildren (int type , int count , Heap heap , String viewID , HeapViewerNodeFilter viewFilter , List <DataType > dataTypes , List <SortOrder > sortOrders , Progress progress ) throws InterruptedException {
298
307
// TODO: use random-access for indexable version
299
308
int index = 0 ;
300
- int nextHit = 0 ;
301
309
int step = objectsCount / (count - 1 );
302
310
303
311
HeapViewerNode [] nodes ;
@@ -306,14 +314,28 @@ private HeapViewerNode[] computeSampleChildren(int count, Heap heap, String view
306
314
progress .setupKnownSteps (iteratorObjectsCount );
307
315
308
316
int i = 0 ;
317
+ Integer [] indexes = new Integer [count ];
318
+ if (type == 0 ) {
319
+ int hitIndex = 0 ;
320
+ for (int j = 0 ; j < count ; j ++) {
321
+ indexes [j ] = hitIndex ;
322
+ hitIndex = j == count - 2 ? objectsCount - 1 : hitIndex + step ;
323
+ }
324
+ } else {
325
+ Random r = new Random (type *7 );
326
+ SortedSet <Integer > idSet = new TreeSet ();
327
+ while (idSet .size () < count ) {
328
+ idSet .add (r .nextInt (objectsCount ));
329
+ }
330
+ idSet .toArray (indexes );
331
+ }
309
332
nodes = new HeapViewerNode [count ];
310
333
Iterator <T > objectsIt = objectsIterator (0 , progress );
311
- while (i < objectsCount && objectsIt .hasNext ()) {
334
+ while (index < count && i < objectsCount && objectsIt .hasNext ()) {
312
335
T object = objectsIt .next ();
313
336
314
- if (i == nextHit ) {
337
+ if (i == indexes [ index ] ) {
315
338
nodes [index ++] = createNode (object );
316
- nextHit = index == count - 1 ? objectsCount - 1 : nextHit + step ;
317
339
}
318
340
319
341
i ++;
@@ -331,6 +353,7 @@ private HeapViewerNode[] computeSampleChildren(int count, Heap heap, String view
331
353
private class SampleContainer extends TextNode {
332
354
333
355
private final int count ;
356
+ private int type ;
334
357
335
358
SampleContainer (String text , int count ) {
336
359
super (text );
@@ -339,11 +362,60 @@ private class SampleContainer extends TextNode {
339
362
}
340
363
341
364
protected HeapViewerNode [] lazilyComputeChildren (Heap heap , String viewID , HeapViewerNodeFilter viewFilter , List <DataType > dataTypes , List <SortOrder > sortOrders , Progress progress ) throws InterruptedException {
342
- return MoreObjectsNode .this .computeSampleChildren (count , heap , viewID , viewFilter , dataTypes , sortOrders , progress );
365
+ return MoreObjectsNode .this .computeSampleChildren (type , count , heap , viewID , viewFilter , dataTypes , sortOrders , progress );
343
366
}
344
367
368
+ void incrementType () {
369
+ type ++;
370
+ resetChildren ();
371
+ RootNode root = RootNode .get (this );
372
+ if (root != null ) {
373
+ // clear node cache
374
+ root .retrieveChildren (this );
375
+ root .updateChildren (root );
376
+ }
377
+ }
345
378
}
346
379
380
+ @ ServiceProvider (service =HeapViewerNodeAction .Provider .class )
381
+ public static class ShuffleActionProvider extends HeapViewerNodeAction .Provider {
382
+
383
+ @ Override
384
+ public boolean supportsView (HeapContext context , String viewID ) {
385
+ return true ;
386
+ }
387
+
388
+ @ Override
389
+ public HeapViewerNodeAction [] getActions (HeapViewerNode node , HeapContext context , HeapViewerActions actions ) {
390
+ if (node instanceof MoreObjectsNode .SampleContainer ) {
391
+ return new HeapViewerNodeAction []{new ShuffleAction ((MoreObjectsNode .SampleContainer )node )};
392
+ }
393
+ return null ;
394
+ }
395
+ }
396
+
397
+ @ NbBundle .Messages ("MoreObjectsNode_ShuffleAction=Different Sample" )
398
+ private static class ShuffleAction extends HeapViewerNodeAction {
399
+
400
+ private final MoreObjectsNode .SampleContainer node ;
401
+
402
+ ShuffleAction (MoreObjectsNode .SampleContainer node ) {
403
+ super (org .graalvm .visualvm .heapviewer .utils .Bundle .MoreObjectsNode_ShuffleAction (), 110 );
404
+ this .node = node ;
405
+ setEnabled (!node .isLeaf ());
406
+ }
407
+
408
+ public boolean isMiddleButtonDefault (ActionEvent e ) {
409
+ int modifiers = e .getModifiers ();
410
+ return (modifiers & ActionEvent .CTRL_MASK ) == ActionEvent .CTRL_MASK &&
411
+ (modifiers & ActionEvent .SHIFT_MASK ) != ActionEvent .SHIFT_MASK ;
412
+ }
413
+
414
+ public void actionPerformed (ActionEvent e ) {
415
+ node .incrementType ();
416
+ }
417
+ }
418
+
347
419
private class ObjectsContainer extends TextNode {
348
420
349
421
private final int containerIndex ;
0 commit comments