1
1
/*
2
- * Copyright 2013-2016 the original author or authors.
2
+ * Copyright 2013-2019 the original author or authors.
3
3
*
4
4
* Licensed under the Apache License, Version 2.0 (the "License");
5
5
* you may not use this file except in compliance with the License.
35
35
import org .apache .commons .logging .Log ;
36
36
import org .apache .commons .logging .LogFactory ;
37
37
38
+ import org .springframework .util .Assert ;
39
+
38
40
/**
39
41
* @author Stuart Williams
42
+ * @author Artem Bilan
43
+ *
40
44
* @since 3.0
41
45
*
42
46
*/
43
47
public class DefaultMBeanObjectConverter implements MBeanObjectConverter {
44
48
45
- private static final Log log = LogFactory .getLog (DefaultMBeanObjectConverter .class );
49
+ private static final Log LOGGER = LogFactory .getLog (DefaultMBeanObjectConverter .class );
46
50
47
51
private final MBeanAttributeFilter filter ;
48
52
@@ -51,12 +55,13 @@ public DefaultMBeanObjectConverter() {
51
55
}
52
56
53
57
public DefaultMBeanObjectConverter (MBeanAttributeFilter filter ) {
58
+ Assert .notNull (filter , "'filter' must not be null." );
54
59
this .filter = filter ;
55
60
}
56
61
57
62
@ Override
58
63
public Object convert (MBeanServerConnection connection , ObjectInstance instance ) {
59
- Map <String , Object > attributeMap = new HashMap <String , Object >();
64
+ Map <String , Object > attributeMap = new HashMap <>();
60
65
61
66
try {
62
67
ObjectName objName = instance .getObjectName ();
@@ -81,8 +86,8 @@ public Object convert(MBeanServerConnection connection, ObjectInstance instance)
81
86
// N.B. standard MemoryUsage MBeans will throw an exception when some
82
87
// measurement is unsupported. Logging at trace rather than debug to
83
88
// avoid confusion.
84
- if (log .isTraceEnabled ()) {
85
- log .trace ("Error getting attribute '" + attrInfo .getName () + "' on '" + objName + "'" , e );
89
+ if (LOGGER .isTraceEnabled ()) {
90
+ LOGGER .trace ("Error getting attribute '" + attrInfo .getName () + "' on '" + objName + "'" , e );
86
91
}
87
92
88
93
// try to unwrap the exception somewhat; not sure this is ideal
@@ -104,90 +109,95 @@ public Object convert(MBeanServerConnection connection, ObjectInstance instance)
104
109
return attributeMap ;
105
110
}
106
111
107
- /**
108
- * @param input
109
- * @return recursively mapped object
110
- */
111
112
private Object checkAndConvert (Object input ) {
112
- if (input == null ) {
113
+ Object converted = null ;
114
+ if (input instanceof CompositeData ) {
115
+ converted = convertFromCompositeData ((CompositeData ) input );
116
+ }
117
+ else if (input instanceof TabularData ) {
118
+ converted = convertFromTabularData ((TabularData ) input );
119
+ }
120
+ else if (input != null && input .getClass ().isArray ()) {
121
+ converted = convertFromArray (input );
122
+ }
123
+
124
+ if (converted != null ) {
125
+ return converted ;
126
+ }
127
+ else {
113
128
return input ;
114
129
}
115
- else if (input .getClass ().isArray ()) {
116
-
117
- if (CompositeData .class .isAssignableFrom (input .getClass ().getComponentType ())) {
118
- List <Object > converted = new ArrayList <Object >();
119
- int length = Array .getLength (input );
120
- for (int i = 0 ; i < length ; i ++) {
121
- Object value = checkAndConvert (Array .get (input , i ));
122
- converted .add (value );
123
- }
124
- return converted ;
125
- }
126
- if (TabularData .class .isAssignableFrom (input .getClass ().getComponentType ())) {
127
- // TODO haven't hit this yet, but expect to
128
- log .warn ("TabularData.isAssignableFrom(getComponentType) for " + input .toString ());
130
+ }
131
+
132
+ private Object convertFromArray (Object input ) {
133
+ if (CompositeData .class .isAssignableFrom (input .getClass ().getComponentType ())) {
134
+ List <Object > converted = new ArrayList <>();
135
+ int length = Array .getLength (input );
136
+ for (int i = 0 ; i < length ; i ++) {
137
+ Object value = checkAndConvert (Array .get (input , i ));
138
+ converted .add (value );
129
139
}
140
+ return converted ;
141
+ }
142
+ if (TabularData .class .isAssignableFrom (input .getClass ().getComponentType ())) {
143
+ // TODO haven't hit this yet, but expect to
144
+ LOGGER .warn ("TabularData.isAssignableFrom(getComponentType) for " + input .toString ());
130
145
}
131
- else if ( input instanceof CompositeData ) {
132
- CompositeData data = ( CompositeData ) input ;
146
+ return null ;
147
+ }
133
148
134
- if (data .getCompositeType ().isArray ()) {
135
- // TODO? I haven't found an example where this gets thrown - but need to test it on Tomcat/Jetty or
136
- // something
137
- log .warn ("(data.getCompositeType().isArray for " + input .toString ());
138
- }
139
- else {
140
- Map <String , Object > returnable = new HashMap <String , Object >();
141
- Set <String > keys = data .getCompositeType ().keySet ();
142
- for (String key : keys ) {
143
- // we don't need to repeat name of this as an attribute
144
- if ("ObjectName" .equals (key )) {
145
- continue ;
146
- }
147
- Object value = checkAndConvert (data .get (key ));
148
- returnable .put (key , value );
149
+ private Object convertFromCompositeData (CompositeData data ) {
150
+ if (data .getCompositeType ().isArray ()) {
151
+ // TODO? I haven't found an example where this gets thrown - but need to test it on Tomcat/Jetty or
152
+ // something
153
+ LOGGER .warn ("(data.getCompositeType().isArray for " + data .toString ());
154
+ return null ;
155
+ }
156
+ else {
157
+ Map <String , Object > returnable = new HashMap <>();
158
+ Set <String > keys = data .getCompositeType ().keySet ();
159
+ for (String key : keys ) {
160
+ // we don't need to repeat name of this as an attribute
161
+ if ("ObjectName" .equals (key )) {
162
+ continue ;
149
163
}
150
- return returnable ;
164
+ Object value = checkAndConvert (data .get (key ));
165
+ returnable .put (key , value );
151
166
}
167
+ return returnable ;
152
168
}
153
- else if (input instanceof TabularData ) {
154
- TabularData data = (TabularData ) input ;
169
+ }
155
170
156
- if (data .getTabularType ().isArray ()) {
157
- // TODO? I haven't found an example where this gets thrown, so might not be required
158
- log .warn ("TabularData.isArray for " + input .toString ());
159
- }
160
- else {
161
-
162
- Map <Object , Object > returnable = new HashMap <Object , Object >();
163
- @ SuppressWarnings ("unchecked" )
164
- Set <List <?>> keySet = (Set <List <?>>) data .keySet ();
165
- for (List <?> keys : keySet ) {
166
- CompositeData cd = data .get (keys .toArray ());
167
- Object value = checkAndConvert (cd );
168
-
169
- if (keys .size () == 1 && (value instanceof Map ) && ((Map <?, ?>) value ).size () == 2 ) {
170
-
171
- Object actualKey = keys .get (0 );
172
- Map <?, ?> valueMap = (Map <?, ?>) value ;
173
-
174
- if (valueMap .containsKey ("key" ) && valueMap .containsKey ("value" )
175
- && actualKey .equals (valueMap .get ("key" ))) {
176
- returnable .put (valueMap .get ("key" ), valueMap .get ("value" ));
177
- }
178
- else {
179
- returnable .put (actualKey , value );
180
- }
171
+ private Object convertFromTabularData (TabularData data ) {
172
+ if (data .getTabularType ().isArray ()) {
173
+ // TODO? I haven't found an example where this gets thrown, so might not be required
174
+ LOGGER .warn ("TabularData.isArray for " + data .toString ());
175
+ return null ;
176
+ }
177
+ else {
178
+ Map <Object , Object > returnable = new HashMap <>();
179
+ @ SuppressWarnings ("unchecked" )
180
+ Set <List <?>> keySet = (Set <List <?>>) data .keySet ();
181
+ for (List <?> keys : keySet ) {
182
+ CompositeData cd = data .get (keys .toArray ());
183
+ Object value = checkAndConvert (cd );
184
+ if (keys .size () == 1 && (value instanceof Map ) && ((Map <?, ?>) value ).size () == 2 ) {
185
+ Object actualKey = keys .get (0 );
186
+ Map <?, ?> valueMap = (Map <?, ?>) value ;
187
+ if (valueMap .containsKey ("key" ) && valueMap .containsKey ("value" )
188
+ && actualKey .equals (valueMap .get ("key" ))) {
189
+ returnable .put (valueMap .get ("key" ), valueMap .get ("value" ));
181
190
}
182
191
else {
183
- returnable .put (keys , value );
192
+ returnable .put (actualKey , value );
184
193
}
185
194
}
186
-
187
- return returnable ;
195
+ else {
196
+ returnable .put (keys , value );
197
+ }
188
198
}
199
+ return returnable ;
189
200
}
190
-
191
- return input ;
192
201
}
202
+
193
203
}
0 commit comments