Skip to content

Commit 3b71cd3

Browse files
jisedlacthurka
authored andcommitted
Visually separate external heap dump classes in the comparison, open class in new tab, class hierarchy
1 parent 3cac45b commit 3b71cd3

File tree

4 files changed

+179
-10
lines changed

4 files changed

+179
-10
lines changed

visualvm/heapviewer/src/com/sun/tools/visualvm/heapviewer/java/ClassNodeRenderer.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import org.netbeans.modules.profiler.api.icons.Icons;
3131
import org.netbeans.modules.profiler.api.icons.LanguageIcons;
3232
import com.sun.tools.visualvm.heapviewer.ui.HeapViewerRenderer;
33+
import javax.swing.Icon;
3334

3435
/**
3536
*
@@ -38,7 +39,11 @@
3839
public class ClassNodeRenderer extends JavaNameRenderer implements HeapViewerRenderer {
3940

4041
public ClassNodeRenderer(Heap heap) {
41-
super(Icons.getIcon(LanguageIcons.CLASS));
42+
this(Icons.getIcon(LanguageIcons.CLASS), heap);
43+
}
44+
45+
public ClassNodeRenderer(Icon icon, Heap heap) {
46+
super(icon);
4247
}
4348

4449
public String getShortName() {

visualvm/heapviewer/src/com/sun/tools/visualvm/heapviewer/java/impl/ClassHierarchyPlugin.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ public boolean isLeaf() {
144144
public static class Provider extends HeapViewPlugin.Provider {
145145

146146
public HeapViewPlugin createPlugin(HeapContext context, HeapViewerActions actions, String viewID) {
147-
if (!viewID.startsWith("diff") && JavaHeapFragment.isJavaHeap(context)) return new ClassHierarchyPlugin(context, actions); // NOI18N
147+
if (JavaHeapFragment.isJavaHeap(context)) return new ClassHierarchyPlugin(context, actions); // NOI18N
148148
return null;
149149
}
150150

visualvm/heapviewer/src/com/sun/tools/visualvm/heapviewer/java/impl/JavaDiffClassesProvider.java

Lines changed: 171 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,17 @@
2525

2626
package com.sun.tools.visualvm.heapviewer.java.impl;
2727

28+
import com.sun.tools.visualvm.heapviewer.HeapContext;
2829
import com.sun.tools.visualvm.heapviewer.java.ClassNode;
30+
import com.sun.tools.visualvm.heapviewer.java.ClassNodeRenderer;
2931
import com.sun.tools.visualvm.heapviewer.java.ClassesContainer;
32+
import com.sun.tools.visualvm.heapviewer.java.JavaHeapFragment;
3033
import com.sun.tools.visualvm.heapviewer.model.DataType;
3134
import com.sun.tools.visualvm.heapviewer.model.HeapViewerNode;
3235
import com.sun.tools.visualvm.heapviewer.model.HeapViewerNodeFilter;
3336
import com.sun.tools.visualvm.heapviewer.model.Progress;
3437
import com.sun.tools.visualvm.heapviewer.model.TextNode;
38+
import com.sun.tools.visualvm.heapviewer.ui.HeapViewerRenderer;
3539
import com.sun.tools.visualvm.heapviewer.ui.UIThresholds;
3640
import com.sun.tools.visualvm.heapviewer.utils.NodesComputer;
3741
import com.sun.tools.visualvm.heapviewer.utils.ProgressIterator;
@@ -41,10 +45,18 @@
4145
import java.util.Iterator;
4246
import java.util.List;
4347
import java.util.Map;
48+
import javax.accessibility.AccessibleContext;
49+
import javax.swing.Icon;
50+
import javax.swing.JComponent;
51+
import javax.swing.JLabel;
4452
import javax.swing.SortOrder;
53+
import javax.swing.UIManager;
4554
import org.netbeans.lib.profiler.heap.Heap;
4655
import org.netbeans.lib.profiler.heap.Instance;
4756
import org.netbeans.lib.profiler.heap.JavaClass;
57+
import org.netbeans.modules.profiler.api.icons.Icons;
58+
import org.netbeans.modules.profiler.api.icons.LanguageIcons;
59+
import org.openide.util.lookup.ServiceProvider;
4860

4961
/**
5062
*
@@ -116,11 +128,11 @@ static List<ClassNode> createDiffClasses(Heap h1, Heap h2, final boolean retaine
116128
DataType.RETAINED_SIZE.computeValuesImmediately(h2);
117129
}
118130

119-
Map<String, DiffClassNode> classes = new HashMap();
131+
Map<JavaClassID, DiffClassNode> classes = new HashMap();
120132

121133
List<JavaClass> classes1 = h1.getAllClasses();
122134
for (JavaClass jc1 : classes1) {
123-
String id1 = jc1.getName();
135+
JavaClassID id1 = JavaClassID.create(jc1);
124136
DiffClassNode djc1 = classes.get(id1);
125137
if (djc1 == null) {
126138
djc1 = DiffClassNode.own(jc1, retained);
@@ -132,7 +144,7 @@ static List<ClassNode> createDiffClasses(Heap h1, Heap h2, final boolean retaine
132144

133145
List<JavaClass> classes2 = h2.getAllClasses();
134146
for (JavaClass jc2 : classes2) {
135-
String id2 = jc2.getName();
147+
JavaClassID id2 = JavaClassID.create(jc2);
136148
DiffClassNode djc2 = classes.get(id2);
137149
if (djc2 == null) {
138150
djc2 = DiffClassNode.external(new ExternalJavaClass(jc2, retained), retained);
@@ -145,37 +157,71 @@ static List<ClassNode> createDiffClasses(Heap h1, Heap h2, final boolean retaine
145157
return new ArrayList(classes.values());
146158
}
147159

160+
private static class JavaClassID {
161+
162+
static JavaClassID create(JavaClass jc) {
163+
return new JavaClassID(jc);
164+
}
165+
166+
167+
private final String id;
168+
169+
private JavaClassID(JavaClass jc) {
170+
id = jc.getName();
171+
}
172+
173+
@Override
174+
public boolean equals(Object o) {
175+
if (!(o instanceof JavaClassID)) return false;
176+
return id.equals(((JavaClassID)o).id);
177+
}
178+
179+
@Override
180+
public int hashCode() {
181+
return id.hashCode();
182+
}
183+
184+
}
185+
148186
private static class DiffClassNode extends ClassNode {
149187

150188
private final boolean trackRetained;
151189

190+
private final boolean ownClass;
191+
152192
private int instancesCount;
153193
private long ownSize;
154194
private long retainedSize;
155195

156196

157197
static DiffClassNode own(JavaClass ownClass, boolean trackRetained) {
158-
DiffClassNode dClass = new DiffClassNode(ownClass, trackRetained);
198+
DiffClassNode dClass = new DiffClassNode(ownClass, true, trackRetained);
159199
dClass.mergeOwn(ownClass);
160200
return dClass;
161201
}
162202

163203
static DiffClassNode external(JavaClass externalClass, boolean trackRetained) {
164-
DiffClassNode dClass = new DiffClassNode(externalClass, trackRetained);
204+
DiffClassNode dClass = new DiffClassNode(externalClass, false, trackRetained);
165205
dClass.mergeExternal(externalClass);
166206
return dClass;
167207
}
168208

169209

170-
private DiffClassNode(JavaClass jClass, boolean trackRetained) {
210+
private DiffClassNode(JavaClass jClass, boolean ownClass, boolean trackRetained) {
171211
super(jClass);
172212

173213
this.trackRetained = trackRetained;
214+
this.ownClass = ownClass;
174215

175216
setChildren(NO_NODES);
176217
}
177218

178219

220+
boolean isOwnClass() {
221+
return this.ownClass;
222+
}
223+
224+
179225
void mergeOwn(JavaClass ownClass) {
180226
instancesCount += ownClass.getInstancesCount();
181227
ownSize += ownClass.getAllInstancesSize();
@@ -189,6 +235,10 @@ void mergeExternal(JavaClass externalClass) {
189235
}
190236

191237

238+
public JavaClass getJavaClass() {
239+
return isOwnClass() ? super.getJavaClass() : null;
240+
}
241+
192242
public int getInstancesCount() {
193243
return instancesCount;
194244
}
@@ -207,7 +257,19 @@ public boolean isLeaf() {
207257
}
208258

209259
public ClassNode createCopy() {
210-
return null;
260+
return ownClass ? super.createCopy() : null;
261+
}
262+
263+
@Override
264+
public boolean equals(Object o) {
265+
if (o == this) return true;
266+
if (!(o instanceof ClassNode)) return false;
267+
return getName().equals(((ClassNode)o).getName());
268+
}
269+
270+
@Override
271+
public int hashCode() {
272+
return getName().hashCode();
211273
}
212274

213275

@@ -248,6 +310,96 @@ public void add(ClassNode item, Heap heap) {
248310

249311
}
250312

313+
private static class DiffClassNodeRenderer implements HeapViewerRenderer {
314+
315+
private final Heap heap;
316+
317+
private ClassNodeRenderer currentRenderer;
318+
private ClassNodeRenderer ownRenderer;
319+
private ClassNodeRenderer externalRenderer;
320+
321+
322+
public DiffClassNodeRenderer(Heap heap) {
323+
this.heap = heap;
324+
}
325+
326+
327+
328+
@Override
329+
public Icon getIcon() {
330+
return currentRenderer.getIcon();
331+
}
332+
333+
@Override
334+
public String getShortName() {
335+
return currentRenderer.getShortName();
336+
}
337+
338+
339+
@Override
340+
public void setValue(Object o, int i) {
341+
if (o == null) return;
342+
343+
DiffClassNode cdn = (DiffClassNode)o;
344+
currentRenderer = cdn.isOwnClass() ? ownRenderer() : externalRenderer();
345+
346+
currentRenderer.setValue(o, i);
347+
}
348+
349+
@Override
350+
public int getHorizontalAlignment() {
351+
return currentRenderer.getHorizontalAlignment();
352+
}
353+
354+
@Override
355+
public JComponent getComponent() {
356+
return currentRenderer.getComponent();
357+
}
358+
359+
@Override
360+
public void move(int i, int i1) {
361+
currentRenderer.move(i, i1);
362+
}
363+
364+
@Override
365+
public AccessibleContext getAccessibleContext() {
366+
return currentRenderer.getAccessibleContext();
367+
}
368+
369+
370+
private ClassNodeRenderer ownRenderer() {
371+
if (ownRenderer == null) ownRenderer = new ClassNodeRenderer(heap);
372+
return ownRenderer;
373+
}
374+
375+
private ClassNodeRenderer externalRenderer() {
376+
if (externalRenderer == null) {
377+
// Image dis = GrayFilter.createDisabledImage(Icons.getImage(LanguageIcons.CLASS));
378+
// Icon dis = ImageUtilities.createDisabledIcon(Icons.getIcon(LanguageIcons.CLASS));
379+
Icon dis = UIManager.getLookAndFeel().getDisabledIcon(new JLabel(), Icons.getIcon(LanguageIcons.CLASS));
380+
externalRenderer = new ClassNodeRenderer(dis, heap);
381+
}
382+
return externalRenderer;
383+
}
384+
385+
}
386+
387+
@ServiceProvider(service=HeapViewerRenderer.Provider.class)
388+
public static class DiffClassNodeRendererProvider extends HeapViewerRenderer.Provider {
389+
390+
public boolean supportsView(HeapContext context, String viewID) {
391+
return viewID.startsWith("diff") && JavaHeapFragment.isJavaHeap(context); // NOI18N
392+
}
393+
394+
public void registerRenderers(Map<Class<? extends HeapViewerNode>, HeapViewerRenderer> renderers, HeapContext context) {
395+
Heap heap = context.getFragment().getHeap();
396+
397+
DiffClassNodeRenderer dcnRenderer = new DiffClassNodeRenderer(heap);
398+
renderers.put(DiffClassNode.class, dcnRenderer);
399+
}
400+
401+
}
402+
251403
private static class ExternalJavaClass implements JavaClass {
252404

253405
private final long allInstancesSize;
@@ -344,6 +496,18 @@ public JavaClass getSuperClass() {
344496
return null;
345497
}
346498

499+
@Override
500+
public boolean equals(Object o) {
501+
if (o == this) return true;
502+
if (!(o instanceof JavaClass)) return false;
503+
return getName().equals(((JavaClass)o).getName());
504+
}
505+
506+
@Override
507+
public int hashCode() {
508+
return getName().hashCode();
509+
}
510+
347511
}
348512

349513
}

visualvm/heapviewer/src/com/sun/tools/visualvm/heapviewer/java/impl/JavaOpenNodeAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@
5050
public class JavaOpenNodeAction extends HeapViewerNodeAction.Provider {
5151

5252
public boolean supportsView(HeapContext context, String viewID) {
53-
return viewID.startsWith("java_") && JavaHeapFragment.getJavaContext(context) != null; // NOI18N
53+
return (viewID.startsWith("java_") || viewID.startsWith("diff_java_")) && JavaHeapFragment.getJavaContext(context) != null; // NOI18N
5454
}
5555

5656
public HeapViewerNodeAction[] getActions(HeapViewerNode node, HeapContext context, HeapViewerActions actions) {

0 commit comments

Comments
 (0)