64
64
import org .graalvm .visualvm .lib .profiler .heapwalk .details .api .DetailsSupport ;
65
65
import org .graalvm .visualvm .lib .ui .components .ProfilerToolbar ;
66
66
import org .graalvm .visualvm .lib .ui .swing .renderer .LabelRenderer ;
67
+ import org .graalvm .visualvm .lib .ui .swing .renderer .NormalBoldGrayRenderer ;
68
+ import org .graalvm .visualvm .lib .ui .swing .renderer .ProfilerRenderer ;
67
69
import org .openide .util .NbBundle ;
68
70
import org .openide .util .lookup .ServiceProvider ;
69
71
94
96
"JavaOverviewSummary_JavaVersionItemString=Java Version:" ,
95
97
"JavaOverviewSummary_JvmItemString=Java Name:" ,
96
98
"JavaOverviewSummary_JavaVendorItemString=Java Vendor:" ,
99
+ "JavaOverviewSummary_VmArgsSection=JVM Arguments" ,
97
100
"JavaOverviewSummary_SysPropsSection=System Properties" ,
98
101
"JavaOverviewSummary_LinkShow=show" ,
99
102
"JavaOverviewSummary_LinkHide=hide" ,
@@ -108,6 +111,7 @@ class JavaOverviewSummary extends HeapView {
108
111
109
112
private final Object [][] heapData ;
110
113
private final Object [][] environmentData ;
114
+ private final Object [][] vmArgsData ;
111
115
private final Object [][] syspropsData ;
112
116
113
117
private JComponent component ;
@@ -121,6 +125,7 @@ private JavaOverviewSummary(HeapContext context) {
121
125
122
126
heapData = computeHeapData (heap );
123
127
environmentData = computeEnvironmentData (heap , sysprops );
128
+ vmArgsData = computeVMArgs (heap );
124
129
syspropsData = computeSyspropsData (sysprops );
125
130
}
126
131
@@ -142,6 +147,7 @@ private void init() {
142
147
ResultsSnippet environmentSnippet = new ResultsSnippet (Bundle .JavaOverviewSummary_EnvironmentSection (), environmentData , 1 );
143
148
Splitter overviewRow = new Splitter (Splitter .HORIZONTAL_SPLIT , heapSnippet , environmentSnippet );
144
149
150
+ VMArgsSnippet vmArgsSnippet = vmArgsData == null ? null : new VMArgsSnippet (vmArgsData );
145
151
SyspropsSnippet syspropsSnippet = new SyspropsSnippet (syspropsData );
146
152
147
153
component = new JPanel (new VerticalLayout (false )) {
@@ -160,6 +166,7 @@ public Dimension getPreferredSize() {
160
166
component .setOpaque (false );
161
167
162
168
component .add (overviewRow );
169
+ if (vmArgsSnippet != null ) component .add (vmArgsSnippet );
163
170
component .add (syspropsSnippet );
164
171
}
165
172
@@ -303,26 +310,26 @@ private static long computeStartupTime(Heap heap) {
303
310
return -1 ;
304
311
}
305
312
306
- private List < String > computeVMArgs (Heap heap ) {
313
+ private Object [][] computeVMArgs (Heap heap ) {
307
314
List <String > vmArgsList = new ArrayList ();
308
315
JavaClass vmManagementClass = heap .getJavaClassByName ("sun.management.VMManagementImpl" ); // NOI18N
309
316
310
317
if (vmManagementClass != null ) {
311
318
if (vmManagementClass .getInstancesCount ()>0 ) {
312
319
Instance vmManagement = (Instance ) vmManagementClass .getInstancesIterator ().next ();
313
- Object vma = vmManagement .getValueOfField ("vmArgs" );
320
+ Object vma = vmManagement .getValueOfField ("vmArgs" ); // NOI18N
314
321
315
322
if (vma instanceof Instance ) {
316
323
Instance vmargs = (Instance ) vma ;
317
- Object list = vmargs .getValueOfField ("list" );
324
+ Object list = vmargs .getValueOfField ("list" ); // NOI18N
318
325
Object arr ;
319
326
Object size = null ;
320
327
321
328
if (list instanceof Instance ) {
322
- arr = ((Instance )list ).getValueOfField ("a" );
329
+ arr = ((Instance )list ).getValueOfField ("a" ); // NOI18N
323
330
} else {
324
- size = vmargs .getValueOfField ("size" );
325
- arr = vmargs .getValueOfField ("elementData" );
331
+ size = vmargs .getValueOfField ("size" ); // NOI18N
332
+ arr = vmargs .getValueOfField ("elementData" ); // NOI18N
326
333
}
327
334
if (arr instanceof ObjectArrayInstance ) {
328
335
ObjectArrayInstance vmArgsArr = (ObjectArrayInstance ) arr ;
@@ -337,7 +344,13 @@ private List<String> computeVMArgs(Heap heap) {
337
344
338
345
vmArgsList .add (DetailsSupport .getDetailsString (arg , heap ));
339
346
}
340
- return vmArgsList ;
347
+
348
+ if (vmArgsList .isEmpty ()) vmArgsList .add ("<no JVM arguments>" );
349
+
350
+ Object [][] data = new Object [vmArgsList .size ()][2 ];
351
+ for (int i = 0 ; i < data .length ; i ++)
352
+ data [i ][0 ] = vmArgsList .get (i );
353
+ return data ;
341
354
}
342
355
}
343
356
}
@@ -412,6 +425,138 @@ public Dimension getPreferredSize() {
412
425
413
426
}
414
427
428
+ private static class VMArgsSnippet extends JPanel {
429
+
430
+ VMArgsSnippet (final Object [][] data ) {
431
+ super (new GridBagLayout ());
432
+
433
+ setOpaque (false );
434
+ setBorder (BorderFactory .createEmptyBorder (0 , 5 , 15 , 5 ));
435
+
436
+ JLabel caption = new JLabel (Bundle .JavaOverviewSummary_VmArgsSection ());
437
+ caption .setFont (caption .getFont ().deriveFont (Font .BOLD ));
438
+ GridBagConstraints c = new GridBagConstraints ();
439
+ c .gridx = 0 ;
440
+ c .gridy = 0 ;
441
+ c .weighty = 1d ;
442
+ add (caption , c );
443
+
444
+ c = new GridBagConstraints ();
445
+ c .gridx = 1 ;
446
+ c .gridy = 0 ;
447
+ c .insets = new Insets (0 , 5 , 0 , 0 );
448
+ add (new JLabel ("[" ), c ); // NOI18N
449
+
450
+ if (data != null ) {
451
+ TableModel model = new DefaultTableModel (data , new Object [] { Bundle .JavaOverviewSummary_NameColumn () }) {
452
+ public boolean isCellEditable (int row , int column ) { return false ; }
453
+ };
454
+ final SummaryView .SimpleTable vmArgs = new SummaryView .SimpleTable (model , 0 );
455
+ vmArgs .setFocusable (false );
456
+ NormalBoldGrayRenderer r1 = new NormalBoldGrayRenderer () {
457
+ public void setValue (Object value , int row ) {
458
+ if (value == null ) {
459
+ setNormalValue ("" ); // NOI18N
460
+ setBoldValue ("" ); // NOI18N
461
+ } else {
462
+ String s = value .toString ();
463
+ int i = s .indexOf ('=' );
464
+ if (i > 0 ) {
465
+ setNormalValue (s .substring (i ));
466
+ setBoldValue (s .substring (0 , i ));
467
+ } else {
468
+ setNormalValue ("" ); // NOI18N
469
+ setBoldValue (s );
470
+ }
471
+ }
472
+ }
473
+
474
+ private ProfilerRenderer [] valueRenderers ;
475
+ protected ProfilerRenderer [] valueRenderers () {
476
+ if (valueRenderers == null ) {
477
+ valueRenderers = super .valueRenderers ();
478
+ if (valueRenderers != null ) {
479
+ LabelRenderer bold = (LabelRenderer )valueRenderers [1 ];
480
+ bold .setMargin (3 , 3 , 3 , 0 );
481
+ LabelRenderer normal = (LabelRenderer )valueRenderers [0 ];
482
+ normal .setMargin (3 , 0 , 3 , 3 );
483
+ valueRenderers = new ProfilerRenderer [] { bold , normal };
484
+ }
485
+ }
486
+ return valueRenderers ;
487
+ }
488
+ };
489
+ vmArgs .setColumnRenderer (0 , r1 , true );
490
+
491
+ LinkButton lb = new LinkButton () {
492
+ {
493
+ clicked (); // sets link text, hides properties table
494
+ }
495
+ @ Override
496
+ protected void clicked () {
497
+ if (vmArgs .isVisible ()) {
498
+ setText (Bundle .JavaOverviewSummary_LinkShow ());
499
+ vmArgs .setVisible (false );
500
+ } else {
501
+ setText (Bundle .JavaOverviewSummary_LinkHide ());
502
+ vmArgs .setVisible (true );
503
+ }
504
+ }
505
+ };
506
+ c = new GridBagConstraints ();
507
+ c .gridx = 2 ;
508
+ c .gridy = 0 ;
509
+ c .insets = new Insets (0 , 0 , 0 , 0 );
510
+ add (lb , c );
511
+
512
+ c = new GridBagConstraints ();
513
+ c .gridx = 0 ;
514
+ c .gridy = 1 ;
515
+ c .gridwidth = GridBagConstraints .REMAINDER ;
516
+ c .weightx = 1d ;
517
+ c .weighty = 1d ;
518
+ c .anchor = GridBagConstraints .NORTHWEST ;
519
+ c .fill = GridBagConstraints .BOTH ;
520
+ c .insets = new Insets (6 , 0 , 0 , 0 );
521
+ add (vmArgs , c );
522
+ } else {
523
+ JLabel nal = new JLabel (Bundle .JavaOverviewSummary_NotAvailable ());
524
+ nal .setBorder (new LinkButton ().getBorder ());
525
+ c = new GridBagConstraints ();
526
+ c .gridx = 2 ;
527
+ c .insets = new Insets (0 , 0 , 0 , 0 );
528
+ add (nal , c );
529
+ }
530
+
531
+ c = new GridBagConstraints ();
532
+ c .gridx = 3 ;
533
+ c .gridy = 0 ;
534
+ c .insets = new Insets (0 , 0 , 0 , 0 );
535
+ add (new JLabel ("]" ), c ); // NOI18N
536
+
537
+ c = new GridBagConstraints ();
538
+ c .gridx = 4 ;
539
+ c .gridy = 0 ;
540
+ c .weightx = 1d ;
541
+ c .fill = GridBagConstraints .HORIZONTAL ;
542
+ c .insets = new Insets (1 , 4 , 0 , 0 );
543
+ add (new SeparatorLine (), c );
544
+ }
545
+
546
+ public Dimension getMinimumSize () {
547
+ Dimension dim = super .getMinimumSize ();
548
+ dim .width = 0 ;
549
+ return dim ;
550
+ }
551
+
552
+ public Dimension getPreferredSize () {
553
+ Dimension dim = super .getPreferredSize ();
554
+ dim .width = 100 ;
555
+ return dim ;
556
+ }
557
+
558
+ }
559
+
415
560
private static class SyspropsSnippet extends JPanel {
416
561
417
562
SyspropsSnippet (final Object [][] data ) {
@@ -516,7 +661,7 @@ public Dimension getPreferredSize() {
516
661
517
662
}
518
663
519
-
664
+
520
665
@ ServiceProvider (service =SummaryView .ContentProvider .class , position = 100 )
521
666
public static class Provider extends SummaryView .ContentProvider {
522
667
0 commit comments