25
25
26
26
package com .sun .tools .visualvm .heapviewer .java .impl ;
27
27
28
+ import com .sun .tools .visualvm .heapviewer .HeapContext ;
28
29
import com .sun .tools .visualvm .heapviewer .java .ClassNode ;
30
+ import com .sun .tools .visualvm .heapviewer .java .ClassNodeRenderer ;
29
31
import com .sun .tools .visualvm .heapviewer .java .ClassesContainer ;
32
+ import com .sun .tools .visualvm .heapviewer .java .JavaHeapFragment ;
30
33
import com .sun .tools .visualvm .heapviewer .model .DataType ;
31
34
import com .sun .tools .visualvm .heapviewer .model .HeapViewerNode ;
32
35
import com .sun .tools .visualvm .heapviewer .model .HeapViewerNodeFilter ;
33
36
import com .sun .tools .visualvm .heapviewer .model .Progress ;
34
37
import com .sun .tools .visualvm .heapviewer .model .TextNode ;
38
+ import com .sun .tools .visualvm .heapviewer .ui .HeapViewerRenderer ;
35
39
import com .sun .tools .visualvm .heapviewer .ui .UIThresholds ;
36
40
import com .sun .tools .visualvm .heapviewer .utils .NodesComputer ;
37
41
import com .sun .tools .visualvm .heapviewer .utils .ProgressIterator ;
41
45
import java .util .Iterator ;
42
46
import java .util .List ;
43
47
import java .util .Map ;
48
+ import javax .accessibility .AccessibleContext ;
49
+ import javax .swing .Icon ;
50
+ import javax .swing .JComponent ;
51
+ import javax .swing .JLabel ;
44
52
import javax .swing .SortOrder ;
53
+ import javax .swing .UIManager ;
45
54
import org .netbeans .lib .profiler .heap .Heap ;
46
55
import org .netbeans .lib .profiler .heap .Instance ;
47
56
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 ;
48
60
49
61
/**
50
62
*
@@ -116,11 +128,11 @@ static List<ClassNode> createDiffClasses(Heap h1, Heap h2, final boolean retaine
116
128
DataType .RETAINED_SIZE .computeValuesImmediately (h2 );
117
129
}
118
130
119
- Map <String , DiffClassNode > classes = new HashMap ();
131
+ Map <JavaClassID , DiffClassNode > classes = new HashMap ();
120
132
121
133
List <JavaClass > classes1 = h1 .getAllClasses ();
122
134
for (JavaClass jc1 : classes1 ) {
123
- String id1 = jc1 . getName ( );
135
+ JavaClassID id1 = JavaClassID . create ( jc1 );
124
136
DiffClassNode djc1 = classes .get (id1 );
125
137
if (djc1 == null ) {
126
138
djc1 = DiffClassNode .own (jc1 , retained );
@@ -132,7 +144,7 @@ static List<ClassNode> createDiffClasses(Heap h1, Heap h2, final boolean retaine
132
144
133
145
List <JavaClass > classes2 = h2 .getAllClasses ();
134
146
for (JavaClass jc2 : classes2 ) {
135
- String id2 = jc2 . getName ( );
147
+ JavaClassID id2 = JavaClassID . create ( jc2 );
136
148
DiffClassNode djc2 = classes .get (id2 );
137
149
if (djc2 == null ) {
138
150
djc2 = DiffClassNode .external (new ExternalJavaClass (jc2 , retained ), retained );
@@ -145,37 +157,71 @@ static List<ClassNode> createDiffClasses(Heap h1, Heap h2, final boolean retaine
145
157
return new ArrayList (classes .values ());
146
158
}
147
159
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
+
148
186
private static class DiffClassNode extends ClassNode {
149
187
150
188
private final boolean trackRetained ;
151
189
190
+ private final boolean ownClass ;
191
+
152
192
private int instancesCount ;
153
193
private long ownSize ;
154
194
private long retainedSize ;
155
195
156
196
157
197
static DiffClassNode own (JavaClass ownClass , boolean trackRetained ) {
158
- DiffClassNode dClass = new DiffClassNode (ownClass , trackRetained );
198
+ DiffClassNode dClass = new DiffClassNode (ownClass , true , trackRetained );
159
199
dClass .mergeOwn (ownClass );
160
200
return dClass ;
161
201
}
162
202
163
203
static DiffClassNode external (JavaClass externalClass , boolean trackRetained ) {
164
- DiffClassNode dClass = new DiffClassNode (externalClass , trackRetained );
204
+ DiffClassNode dClass = new DiffClassNode (externalClass , false , trackRetained );
165
205
dClass .mergeExternal (externalClass );
166
206
return dClass ;
167
207
}
168
208
169
209
170
- private DiffClassNode (JavaClass jClass , boolean trackRetained ) {
210
+ private DiffClassNode (JavaClass jClass , boolean ownClass , boolean trackRetained ) {
171
211
super (jClass );
172
212
173
213
this .trackRetained = trackRetained ;
214
+ this .ownClass = ownClass ;
174
215
175
216
setChildren (NO_NODES );
176
217
}
177
218
178
219
220
+ boolean isOwnClass () {
221
+ return this .ownClass ;
222
+ }
223
+
224
+
179
225
void mergeOwn (JavaClass ownClass ) {
180
226
instancesCount += ownClass .getInstancesCount ();
181
227
ownSize += ownClass .getAllInstancesSize ();
@@ -189,6 +235,10 @@ void mergeExternal(JavaClass externalClass) {
189
235
}
190
236
191
237
238
+ public JavaClass getJavaClass () {
239
+ return isOwnClass () ? super .getJavaClass () : null ;
240
+ }
241
+
192
242
public int getInstancesCount () {
193
243
return instancesCount ;
194
244
}
@@ -207,7 +257,19 @@ public boolean isLeaf() {
207
257
}
208
258
209
259
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 ();
211
273
}
212
274
213
275
@@ -248,6 +310,96 @@ public void add(ClassNode item, Heap heap) {
248
310
249
311
}
250
312
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
+
251
403
private static class ExternalJavaClass implements JavaClass {
252
404
253
405
private final long allInstancesSize ;
@@ -344,6 +496,18 @@ public JavaClass getSuperClass() {
344
496
return null ;
345
497
}
346
498
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
+
347
511
}
348
512
349
513
}
0 commit comments