42
42
*/
43
43
package org .graalvm .visualvm .lib .profiler .heapwalk .details .jdk ;
44
44
45
+ import java .util .ArrayList ;
45
46
import java .util .Date ;
47
+ import java .util .List ;
48
+ import java .util .logging .Formatter ;
49
+ import java .util .logging .Level ;
50
+ import java .util .logging .LogRecord ;
51
+ import java .util .logging .SimpleFormatter ;
46
52
import org .graalvm .visualvm .lib .jfluid .heap .Heap ;
47
53
import org .graalvm .visualvm .lib .jfluid .heap .Instance ;
54
+ import org .graalvm .visualvm .lib .jfluid .heap .ObjectArrayInstance ;
48
55
import org .graalvm .visualvm .lib .profiler .heapwalk .details .spi .DetailsProvider ;
49
56
import org .graalvm .visualvm .lib .profiler .heapwalk .details .spi .DetailsUtils ;
50
57
import org .openide .util .lookup .ServiceProvider ;
51
58
52
59
/**
53
60
*
54
61
* @author Jiri Sedlacek
62
+ * @author Tomas Hurka
55
63
*/
56
64
@ ServiceProvider (service =DetailsProvider .class )
57
65
public final class UtilDetailsProvider extends DetailsProvider .Basic {
@@ -63,11 +71,14 @@ public final class UtilDetailsProvider extends DetailsProvider.Basic {
63
71
private static final String TIMEZONE_MASK = "java.util.TimeZone+" ; // NOI18N
64
72
private static final String PATTERN_MASK = "java.util.regex.Pattern" ; // NOI18N
65
73
private static final String CURRENCY_MASK = "java.util.Currency" ; // NOI18N
66
- private static final String ZIPENTRY_MASK = "java.util.zip.ZipEntry+" ; // NOI18N
74
+ private static final String ZIPENTRY_MASK = "java.util.zip.ZipEntry+" ; // NOI18N
75
+ private static final String LOGRECORD_MASK = "java.util.logging.LogRecord" ; // NOI18N
67
76
77
+ private Formatter formatter = new SimpleFormatter ();
78
+
68
79
public UtilDetailsProvider () {
69
80
super (LOGGER_MASK , LEVEL_MASK , LOCALE_MASK , DATE_MASK , TIMEZONE_MASK ,
70
- PATTERN_MASK , CURRENCY_MASK , ZIPENTRY_MASK );
81
+ PATTERN_MASK , CURRENCY_MASK , ZIPENTRY_MASK , LOGRECORD_MASK );
71
82
}
72
83
73
84
public String getDetailsString (String className , Instance instance , Heap heap ) {
@@ -109,8 +120,74 @@ public String getDetailsString(String className, Instance instance, Heap heap) {
109
120
return String .format ("%s, size=%d" , name , size ); // NOI18N
110
121
}
111
122
return name ;
123
+ } else if (LOGRECORD_MASK .equals (className )) {
124
+ return formatter .format (new DetailsLogRecord (instance , heap ));
112
125
}
113
126
return null ;
114
127
}
115
128
129
+ private class DetailsLogRecord extends LogRecord {
130
+ private final Instance record ;
131
+ private final Heap heap ;
132
+
133
+ private DetailsLogRecord (Instance rec , Heap h ) {
134
+ super (Level .ALL , null );
135
+ record = rec ;
136
+ heap = h ;
137
+ }
138
+
139
+ @ Override
140
+ public long getMillis () {
141
+ Object time = record .getValueOfField ("millis" );
142
+ if (time instanceof Number ) {
143
+ return ((Number )time ).longValue ();
144
+ }
145
+ return 0 ;
146
+ }
147
+
148
+ @ Override
149
+ public String getSourceClassName () {
150
+ return DetailsUtils .getInstanceFieldString (record , "sourceClassName" , heap ); // NOI18N
151
+ }
152
+
153
+ @ Override
154
+ public String getSourceMethodName () {
155
+ return DetailsUtils .getInstanceFieldString (record , "sourceMethodName" , heap ); // NOI18N
156
+ }
157
+
158
+ @ Override
159
+ public String getLoggerName () {
160
+ return DetailsUtils .getInstanceFieldString (record , "loggerName" , heap ); // NOI18N
161
+ }
162
+
163
+ @ Override
164
+ public String getMessage () {
165
+ return DetailsUtils .getInstanceFieldString (record , "message" , heap ); // NOI18N
166
+ }
167
+
168
+ @ Override
169
+ public Object [] getParameters () {
170
+ Object pars = record .getValueOfField ("parameters" );
171
+ if (pars instanceof ObjectArrayInstance ) {
172
+ List parameters = new ArrayList ();
173
+
174
+ for (Object o : ((ObjectArrayInstance )pars ).getValues ()) {
175
+ String par = null ;
176
+ if (o instanceof Instance ) {
177
+ par = DetailsUtils .getInstanceString ((Instance ) o , heap );
178
+ }
179
+ if (par == null ) par = "" ;
180
+ parameters .add (par );
181
+ }
182
+ return parameters .toArray ();
183
+ }
184
+ return null ;
185
+ }
186
+
187
+ @ Override
188
+ public Level getLevel () {
189
+ String level = DetailsUtils .getInstanceFieldString (record , "level" , heap ); // NOI18N
190
+ return Level .parse (level );
191
+ }
192
+ }
116
193
}
0 commit comments