Skip to content

Commit 2553d6e

Browse files
committed
Introducing InstancesWrapper, code cleanup
1 parent 63a796b commit 2553d6e

File tree

7 files changed

+102
-90
lines changed

7 files changed

+102
-90
lines changed

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/ClassNode.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,13 @@ protected Object getValue(DataType type, Heap heap) {
105105

106106
if (type == DataType.OBJECT_ID) return getJavaClass().getJavaClassId();
107107

108+
if (type == DataType.INSTANCES_WRAPPER) return new InstancesWrapper.Simple(getJavaClass(), getInstancesCount()) {
109+
@Override
110+
public Iterator<Instance> getInstancesIterator() {
111+
return ClassNode.this.getInstancesIterator();
112+
}
113+
};
114+
108115
return super.getValue(type, heap);
109116
}
110117

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/InstancesContainer.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,13 @@ protected String getNodesContainerString(String firstNodeIdx, String lastNodeIdx
9797

9898
protected Object getValue(DataType type, Heap heap) {
9999
if (type == DataType.CLASS) return getJavaClass();
100+
101+
if (type == DataType.INSTANCES_WRAPPER) return new InstancesWrapper.Simple(getJavaClass(), getCount()) {
102+
@Override
103+
public Iterator<Instance> getInstancesIterator() {
104+
return Objects.this.getInstancesIterator();
105+
}
106+
};
100107

101108
return super.getValue(type, heap);
102109
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
/*
2+
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation. Oracle designates this
8+
* particular file as subject to the "Classpath" exception as provided
9+
* by Oracle in the LICENSE file that accompanied this code.
10+
*
11+
* This code is distributed in the hope that it will be useful, but WITHOUT
12+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14+
* version 2 for more details (a copy is included in the LICENSE file that
15+
* accompanied this code).
16+
*
17+
* You should have received a copy of the GNU General Public License version
18+
* 2 along with this work; if not, write to the Free Software Foundation,
19+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20+
*
21+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22+
* or visit www.oracle.com if you need additional information or have any
23+
* questions.
24+
*/
25+
26+
package org.graalvm.visualvm.heapviewer.java;
27+
28+
import java.util.Iterator;
29+
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
30+
import org.graalvm.visualvm.lib.jfluid.heap.JavaClass;
31+
32+
/**
33+
*
34+
* @author Jiri Sedlacek
35+
*/
36+
public abstract class InstancesWrapper {
37+
38+
public abstract JavaClass getJavaClass();
39+
40+
public abstract int getInstancesCount();
41+
42+
public abstract Iterator<Instance> getInstancesIterator();
43+
44+
45+
public static abstract class Simple extends InstancesWrapper {
46+
47+
private final JavaClass jclass;
48+
49+
private final int instancesCount;
50+
51+
52+
public Simple(JavaClass jclass, int instancesCount) {
53+
this.jclass = jclass;
54+
this.instancesCount = instancesCount;
55+
}
56+
57+
58+
@Override
59+
public final JavaClass getJavaClass() {
60+
return jclass;
61+
}
62+
63+
@Override
64+
public final int getInstancesCount() {
65+
return instancesCount;
66+
}
67+
68+
}
69+
70+
}

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaFieldsPlugin.java

Lines changed: 5 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,8 @@
4747
import org.graalvm.visualvm.lib.profiler.api.icons.Icons;
4848
import org.graalvm.visualvm.lib.profiler.api.icons.ProfilerIcons;
4949
import org.graalvm.visualvm.heapviewer.HeapContext;
50-
import org.graalvm.visualvm.heapviewer.java.ClassNode;
5150
import org.graalvm.visualvm.heapviewer.java.InstanceNode;
52-
import org.graalvm.visualvm.heapviewer.java.InstancesContainer;
51+
import org.graalvm.visualvm.heapviewer.java.InstancesWrapper;
5352
import org.graalvm.visualvm.heapviewer.java.JavaHeapFragment;
5453
import org.graalvm.visualvm.heapviewer.model.DataType;
5554
import org.graalvm.visualvm.heapviewer.model.HeapViewerNode;
@@ -151,19 +150,19 @@ protected HeapViewerNode[] computeData(RootNode root, Heap heap, String viewID,
151150
boolean filtered = false;
152151
HeapViewerNode[] nodes = null;
153152

154-
if (_selected instanceof ClassNode || selected instanceof InstancesContainer.Objects) {
153+
InstancesWrapper wrapper = HeapViewerNode.getValue(_selected, DataType.INSTANCES_WRAPPER, heap);
154+
if (wrapper != null) {
155155
List<HeapViewerNode> fieldNodes = new ArrayList();
156156

157157
if (cFieldsHisto) {
158-
InstancesWrapper iwrapper = InstancesWrapper.fromNode(_selected);
159-
HeapViewerNode[] histo = getClassFieldsHistogram(iwrapper, root, heap, viewID, viewFilter, dataTypes, sortOrders, progress);
158+
HeapViewerNode[] histo = getClassFieldsHistogram(wrapper, root, heap, viewID, viewFilter, dataTypes, sortOrders, progress);
160159
fieldNodes.addAll(Arrays.asList(histo));
161160
} else {
162161
filtered = true;
163162
}
164163

165164
if (cStaticFields) {
166-
JavaClass jclass = HeapViewerNode.getValue(_selected, DataType.CLASS, heap);
165+
JavaClass jclass = wrapper.getJavaClass();
167166
if (jclass != null) { // Note: GCTypeNode returns null here
168167
List<FieldValue> fields = jclass.getStaticFieldValues();
169168
fieldNodes.addAll(Arrays.asList(JavaFieldsProvider.getNodes(fields, root, heap, viewID, viewFilter, dataTypes, sortOrders, progress)));
@@ -279,39 +278,6 @@ protected JComponent createComponent() {
279278
}
280279

281280

282-
private static abstract class InstancesWrapper {
283-
abstract JavaClass getJavaClass();
284-
abstract int getInstancesCount();
285-
abstract Iterator<Instance> getInstancesIterator();
286-
287-
private static InstancesWrapper fromClassNode(final ClassNode node) {
288-
return new InstancesWrapper() {
289-
@Override
290-
JavaClass getJavaClass() { return node.getJavaClass(); }
291-
@Override
292-
int getInstancesCount() { return node.getInstancesCount(); }
293-
@Override
294-
Iterator<Instance> getInstancesIterator() { return node.getInstancesIterator(); }
295-
};
296-
}
297-
private static InstancesWrapper fromInstancesContainer(final InstancesContainer.Objects node) {
298-
return new InstancesWrapper() {
299-
@Override
300-
JavaClass getJavaClass() { return node.getJavaClass(); }
301-
@Override
302-
int getInstancesCount() { return node.getCount(); }
303-
@Override
304-
Iterator<Instance> getInstancesIterator() { return node.getInstancesIterator(); }
305-
};
306-
}
307-
static InstancesWrapper fromNode(HeapViewerNode node) {
308-
if (node instanceof ClassNode) return fromClassNode((ClassNode)node);
309-
else if (node instanceof InstancesContainer.Objects) return fromInstancesContainer((InstancesContainer.Objects)node);
310-
else return null;
311-
}
312-
}
313-
314-
315281
private HeapViewerNode[] getClassFieldsHistogram(final InstancesWrapper instances, HeapViewerNode parent, Heap heap, String viewID, HeapViewerNodeFilter viewFilter, List<DataType> dataTypes, List<SortOrder> sortOrders, Progress progress) throws InterruptedException {
316282
final List<Field> fields = getAllInstanceFields(instances.getJavaClass());
317283
NodesComputer<Field> computer = new NodesComputer<Field>(fields.size(), UIThresholds.MAX_INSTANCE_FIELDS) {

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/JavaReferencesPlugin.java

Lines changed: 4 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,10 @@
4545
import org.graalvm.visualvm.lib.profiler.api.icons.Icons;
4646
import org.graalvm.visualvm.lib.profiler.api.icons.ProfilerIcons;
4747
import org.graalvm.visualvm.heapviewer.HeapContext;
48-
import org.graalvm.visualvm.heapviewer.java.ClassNode;
4948
import org.graalvm.visualvm.heapviewer.java.InstanceNode;
5049
import org.graalvm.visualvm.heapviewer.java.InstanceNodeRenderer;
5150
import org.graalvm.visualvm.heapviewer.java.InstanceReferenceNode;
52-
import org.graalvm.visualvm.heapviewer.java.InstancesContainer;
51+
import org.graalvm.visualvm.heapviewer.java.InstancesWrapper;
5352
import org.graalvm.visualvm.heapviewer.java.JavaHeapFragment;
5453
import org.graalvm.visualvm.heapviewer.model.DataType;
5554
import org.graalvm.visualvm.heapviewer.model.HeapViewerNode;
@@ -132,7 +131,8 @@ protected HeapViewerNode[] computeData(RootNode root, Heap heap, String viewID,
132131

133132
if (_selected == null) return new HeapViewerNode[] { new TextNode(Bundle.JavaReferencesPlugin_NoSelection()) };
134133

135-
if (_selected instanceof ClassNode || _selected instanceof InstancesContainer.Objects) {
134+
InstancesWrapper wrapper = HeapViewerNode.getValue(_selected, DataType.INSTANCES_WRAPPER, heap);
135+
if (wrapper != null) {
136136
SwingUtilities.invokeLater(new Runnable() {
137137
public void run() {
138138
if (!mergedReferences && !CCONF_INSTANCE.equals(objectsView.getCurrentColumnConfiguration()))
@@ -144,7 +144,7 @@ else if (mergedReferences && !CCONF_CLASS.equals(objectsView.getCurrentColumnCon
144144

145145
if (!mergedReferences) return new HeapViewerNode[] { new TextNode(Bundle.JavaReferencesPlugin_NoReferencesFiltered()) };
146146

147-
return computeInstancesReferences(InstancesWrapper.fromNode(_selected), root, heap, viewID, null, dataTypes, sortOrders, progress);
147+
return computeInstancesReferences(wrapper, root, heap, viewID, null, dataTypes, sortOrders, progress);
148148
} else {
149149
SwingUtilities.invokeLater(new Runnable() {
150150
public void run() {
@@ -289,39 +289,6 @@ private static void storeItem(String itemName, boolean value) {
289289
}
290290

291291

292-
private static abstract class InstancesWrapper {
293-
abstract JavaClass getJavaClass();
294-
abstract int getInstancesCount();
295-
abstract Iterator<Instance> getInstancesIterator();
296-
297-
private static InstancesWrapper fromClassNode(final ClassNode node) {
298-
return new InstancesWrapper() {
299-
@Override
300-
JavaClass getJavaClass() { return node.getJavaClass(); }
301-
@Override
302-
int getInstancesCount() { return node.getInstancesCount(); }
303-
@Override
304-
Iterator<Instance> getInstancesIterator() { return node.getInstancesIterator(); }
305-
};
306-
}
307-
private static InstancesWrapper fromInstancesContainer(final InstancesContainer.Objects node) {
308-
return new InstancesWrapper() {
309-
@Override
310-
JavaClass getJavaClass() { return node.getJavaClass(); }
311-
@Override
312-
int getInstancesCount() { return node.getCount(); }
313-
@Override
314-
Iterator<Instance> getInstancesIterator() { return node.getInstancesIterator(); }
315-
};
316-
}
317-
static InstancesWrapper fromNode(HeapViewerNode node) {
318-
if (node instanceof ClassNode) return fromClassNode((ClassNode)node);
319-
else if (node instanceof InstancesContainer.Objects) return fromInstancesContainer((InstancesContainer.Objects)node);
320-
else return null;
321-
}
322-
}
323-
324-
325292
@NbBundle.Messages({
326293
"ReferenceNode_MoreNodes=<another {0} instances left>",
327294
"ReferenceNode_SamplesContainer=<sample {0} instances>",

visualvm/heapviewer/src/org/graalvm/visualvm/heapviewer/java/impl/PathToGCRootPlugin.java

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,11 +37,9 @@
3737
import org.graalvm.visualvm.lib.profiler.api.icons.Icons;
3838
import org.graalvm.visualvm.lib.profiler.api.icons.ProfilerIcons;
3939
import org.graalvm.visualvm.heapviewer.HeapContext;
40-
import org.graalvm.visualvm.heapviewer.java.ClassNode;
4140
import org.graalvm.visualvm.heapviewer.java.InstanceNode;
4241
import org.graalvm.visualvm.heapviewer.java.InstanceNodeRenderer;
4342
import org.graalvm.visualvm.heapviewer.java.InstanceReferenceNode;
44-
import org.graalvm.visualvm.heapviewer.java.InstancesContainer;
4543
import org.graalvm.visualvm.heapviewer.java.JavaHeapFragment;
4644
import org.graalvm.visualvm.heapviewer.model.DataType;
4745
import org.graalvm.visualvm.heapviewer.model.HeapViewerNode;
@@ -66,6 +64,7 @@
6664
import javax.swing.JCheckBoxMenuItem;
6765
import javax.swing.JPopupMenu;
6866
import javax.swing.SwingUtilities;
67+
import org.graalvm.visualvm.heapviewer.java.InstancesWrapper;
6968
import org.graalvm.visualvm.heapviewer.utils.HeapOperations;
7069
import org.openide.util.NbBundle;
7170
import org.openide.util.NbPreferences;
@@ -124,7 +123,8 @@ protected HeapViewerNode[] computeData(RootNode root, Heap heap, String viewID,
124123
if (_selected == null) return new HeapViewerNode[] { new TextNode(Bundle.PathToGCRootPlugin_NoSelection()) };
125124

126125
Instance instance;
127-
if (_selected instanceof ClassNode || _selected instanceof InstancesContainer.Objects) {
126+
InstancesWrapper wrapper = HeapViewerNode.getValue(_selected, DataType.INSTANCES_WRAPPER, heap);
127+
if (wrapper != null) {
128128
instance = null;
129129

130130
SwingUtilities.invokeLater(new Runnable() {
@@ -147,9 +147,7 @@ public void run() {
147147
}
148148
});
149149

150-
if (instance == null) {
151-
return new HeapViewerNode[] { new TextNode(Bundle.PathToGCRootPlugin_NoSelection()) };
152-
}
150+
if (instance == null) return new HeapViewerNode[] { new TextNode(Bundle.PathToGCRootPlugin_NoSelection()) };
153151
}
154152

155153
HeapOperations.initializeGCRoots(heap);
@@ -158,13 +156,8 @@ public void run() {
158156
if (instance != null) {
159157
data = computeInstanceRoots(instance, progress);
160158
if (data != null) showingClass = false;
161-
} else if (_selected instanceof ClassNode) {
162-
ClassNode node = (ClassNode)_selected;
163-
data = computeInstancesRoots(node.getInstancesIterator(), node.getInstancesCount(), progress);
164-
if (data != null) showingClass = true;
165-
} else {
166-
InstancesContainer.Objects node = (InstancesContainer.Objects)_selected;
167-
data = computeInstancesRoots(node.getInstancesIterator(), node.getCount(), progress);
159+
} else {
160+
data = computeInstancesRoots(wrapper.getInstancesIterator(), wrapper.getInstancesCount(), progress);
168161
if (data != null) showingClass = true;
169162
}
170163

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import java.util.Set;
3333
import java.util.WeakHashMap;
3434
import javax.swing.SwingUtilities;
35+
import org.graalvm.visualvm.heapviewer.java.InstancesWrapper;
3536
import org.graalvm.visualvm.heapviewer.utils.HeapOperations;
3637
import org.graalvm.visualvm.lib.jfluid.heap.Heap;
3738
import org.graalvm.visualvm.lib.jfluid.heap.Instance;
@@ -70,14 +71,15 @@ public class DataType<T> {
7071

7172
public static final DataType<JavaClass> CLASS = new DataType<JavaClass>(JavaClass.class, null, null);
7273
public static final DataType<Instance> INSTANCE = new DataType<Instance>(Instance.class, null, null);
74+
public static final DataType<InstancesWrapper> INSTANCES_WRAPPER = new DataType<InstancesWrapper>(InstancesWrapper.class, null, null);
7375

7476
public static final DataType<HeapViewerNode> LOOP = new DataType<HeapViewerNode>(HeapViewerNode.class, null, null);
7577
public static final DataType<HeapViewerNode> LOOP_ORIGIN = new DataType<HeapViewerNode>(HeapViewerNode.class, null, null);
7678

7779

7880
static final Set<DataType> DEFAULT_TYPES = new HashSet(Arrays.asList(
7981
NAME, COUNT, OWN_SIZE, RETAINED_SIZE, LOGICAL_VALUE, OBJECT_ID,
80-
CLASS, INSTANCE, LOOP, LOOP_ORIGIN
82+
CLASS, INSTANCE, INSTANCES_WRAPPER, LOOP, LOOP_ORIGIN
8183
));
8284

8385

0 commit comments

Comments
 (0)