Skip to content

Commit 3563a70

Browse files
committed
GH-413 action to pick different sample added
1 parent 2fb1e12 commit 3563a70

File tree

4 files changed

+82
-10
lines changed

4 files changed

+82
-10
lines changed

visualvm/heapviewer/manifest.mf

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ AutoUpdate-Show-In-Client: false
33
AutoUpdate-Essential-Module: true
44
OpenIDE-Module: org.graalvm.visualvm.heapviewer/2
55
OpenIDE-Module-Localizing-Bundle: org/graalvm/visualvm/heapviewer/Bundle.properties
6-
OpenIDE-Module-Specification-Version: 2.4
6+
OpenIDE-Module-Specification-Version: 2.5
77

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/model/RootNode.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,9 @@ public abstract class RootNode extends HeapViewerNode {
6262
public abstract void refreshNode(HeapViewerNode node);
6363

6464

65-
protected abstract void updateChildren(HeapViewerNode node);
65+
public abstract void updateChildren(HeapViewerNode node);
6666

67-
protected abstract HeapViewerNode[] retrieveChildren(HeapViewerNode node);
67+
public abstract HeapViewerNode[] retrieveChildren(HeapViewerNode node);
6868

6969

7070
public abstract HeapViewerRenderer resolveRenderer(HeapViewerNode node);

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/ui/TreeTableView.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public TreeTableView(String viewID, HeapContext context, HeapViewerActions actio
143143
public List<SortOrder> getSortOrders() { return sortOrders; }
144144
public void refreshNode(HeapViewerNode node) { if (treeTable != null) treeTable.repaint(); };
145145
public void updateChildren(HeapViewerNode node) { if (model != null) model.childrenChanged(root); childrenChanged(); /*if (treeTable != null) treeTable.resetExpandedNodes();*/ }
146-
protected HeapViewerNode[] retrieveChildren(HeapViewerNode node) { return nodesCache.retrieveChildren(node); }
146+
public HeapViewerNode[] retrieveChildren(HeapViewerNode node) { return nodesCache.retrieveChildren(node); }
147147
protected HeapViewerNode[] lazilyComputeChildren(Heap heap, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException { return TreeTableView.this.computeData(root, heap, viewID, viewFilter, dataTypes, sortOrders, progress); }
148148
public HeapViewerRenderer resolveRenderer(HeapViewerNode node) { return TreeTableView.this.resolveNodeRenderer(node); }
149149
protected void handleOOME(OutOfMemoryError e) { super.handleOOME(e); TreeTableView.this.handleOOME(e); }

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/utils/MoreObjectsNode.java

Lines changed: 78 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,20 +25,29 @@
2525

2626
package org.graalvm.visualvm.heapviewer.utils;
2727

28+
import java.awt.event.ActionEvent;
2829
import java.text.Format;
2930
import java.util.Iterator;
3031
import java.util.List;
32+
import java.util.Random;
33+
import java.util.SortedSet;
34+
import java.util.TreeSet;
3135
import javax.swing.SortOrder;
36+
import org.graalvm.visualvm.heapviewer.HeapContext;
3237
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
3338
import org.graalvm.visualvm.lib.ui.Formatters;
3439
import org.graalvm.visualvm.heapviewer.model.DataType;
3540
import org.graalvm.visualvm.heapviewer.model.HeapViewerNode;
3641
import org.graalvm.visualvm.heapviewer.model.HeapViewerNodeFilter;
3742
import org.graalvm.visualvm.heapviewer.model.MoreNodesNode;
3843
import org.graalvm.visualvm.heapviewer.model.Progress;
44+
import org.graalvm.visualvm.heapviewer.model.RootNode;
3945
import org.graalvm.visualvm.heapviewer.model.TextNode;
46+
import org.graalvm.visualvm.heapviewer.ui.HeapViewerActions;
47+
import org.graalvm.visualvm.heapviewer.ui.HeapViewerNodeAction;
4048
import org.graalvm.visualvm.heapviewer.ui.UIThresholds;
4149
import org.openide.util.NbBundle;
50+
import org.openide.util.lookup.ServiceProvider;
4251

4352
/**
4453
*
@@ -294,10 +303,9 @@ private HeapViewerNode[] computeChildren(int containerIndex, Heap heap, String v
294303
// }
295304
}
296305

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 {
298307
// TODO: use random-access for indexable version
299308
int index = 0;
300-
int nextHit = 0;
301309
int step = objectsCount / (count - 1);
302310

303311
HeapViewerNode[] nodes;
@@ -306,14 +314,28 @@ private HeapViewerNode[] computeSampleChildren(int count, Heap heap, String view
306314
progress.setupKnownSteps(iteratorObjectsCount);
307315

308316
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+
}
309332
nodes = new HeapViewerNode[count];
310333
Iterator<T> objectsIt = objectsIterator(0, progress);
311-
while (i < objectsCount && objectsIt.hasNext()) {
334+
while (index < count && i < objectsCount && objectsIt.hasNext()) {
312335
T object = objectsIt.next();
313336

314-
if (i == nextHit) {
337+
if (i == indexes[index]) {
315338
nodes[index++] = createNode(object);
316-
nextHit = index == count - 1 ? objectsCount - 1 : nextHit + step;
317339
}
318340

319341
i++;
@@ -331,6 +353,7 @@ private HeapViewerNode[] computeSampleChildren(int count, Heap heap, String view
331353
private class SampleContainer extends TextNode {
332354

333355
private final int count;
356+
private int type;
334357

335358
SampleContainer(String text, int count) {
336359
super(text);
@@ -339,11 +362,60 @@ private class SampleContainer extends TextNode {
339362
}
340363

341364
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);
343366
}
344367

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+
}
345378
}
346379

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+
347419
private class ObjectsContainer extends TextNode {
348420

349421
private final int containerIndex;

0 commit comments

Comments
 (0)