1 /*
2 * Copyright 2000-2006 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Sun designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Sun in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
22 * CA 95054 USA or visit www.sun.com if you need additional information or
23 * have any questions.
24 */
25
26 package javax.management.relation;
27
28 import static com.sun.jmx.mbeanserver.Util.cast;
29 import com.sun.jmx.mbeanserver.GetPropertyAction;
30
31 import java.io.IOException;
32 import java.io.ObjectInputStream;
33 import java.io.ObjectOutputStream;
34 import java.io.ObjectStreamField;
35 import java.io.Serializable;
36
37 import java.security.AccessController;
38
39 import java.util.ArrayList;
40 import java.util.Iterator;
41 import java.util.List;
42
43 import javax.management.ObjectName;
44
45 /**
46 * Represents an unresolved role: a role not retrieved from a relation due
47 * to a problem. It provides the role name, value (if problem when trying to
48 * set the role) and an integer defining the problem (constants defined in
49 * RoleStatus).
50 *
51 * <p>The <b>serialVersionUID</b> of this class is <code>-48350262537070138L</code>.
52 *
53 * @since 1.5
54 */
55 @SuppressWarnings("serial") // serialVersionUID not constant
56 public class RoleUnresolved implements Serializable {
57
58 // Serialization compatibility stuff:
59 // Two serial forms are supported in this class. The selected form depends
60 // on system property "jmx.serial.form":
61 // - "1.0" for JMX 1.0
62 // - any other value for JMX 1.1 and higher
63 //
64 // Serial version for old serial form
65 private static final long oldSerialVersionUID = -9026457686611660144L;
66 //
67 // Serial version for new serial form
68 private static final long newSerialVersionUID = -48350262537070138L;
69 //
70 // Serializable fields in old serial form
71 private static final ObjectStreamField[] oldSerialPersistentFields =
72 {
73 new ObjectStreamField("myRoleName", String.class),
74 new ObjectStreamField("myRoleValue", ArrayList.class),
75 new ObjectStreamField("myPbType", int.class)
76 };
77 //
78 // Serializable fields in new serial form
79 private static final ObjectStreamField[] newSerialPersistentFields =
80 {
81 new ObjectStreamField("roleName", String.class),
82 new ObjectStreamField("roleValue", List.class),
83 new ObjectStreamField("problemType", int.class)
84 };
85 //
86 // Actual serial version and serial form
87 private static final long serialVersionUID;
88 /** @serialField roleName String Role name
89 * @serialField roleValue List Role value ({@link List} of {@link ObjectName} objects)
90 * @serialField problemType int Problem type
91 */
92 private static final ObjectStreamField[] serialPersistentFields;
93 private static boolean compat = false;
94 static {
95 try {
96 GetPropertyAction act = new GetPropertyAction("jmx.serial.form");
97 String form = AccessController.doPrivileged(act);
98 compat = (form != null && form.equals("1.0"));
99 } catch (Exception e) {
100 // OK : Too bad, no compat with 1.0
101 }
102 if (compat) {
103 serialPersistentFields = oldSerialPersistentFields;
104 serialVersionUID = oldSerialVersionUID;
105 } else {
106 serialPersistentFields = newSerialPersistentFields;
107 serialVersionUID = newSerialVersionUID;
108 }
109 }
110 //
111 // END Serialization compatibility stuff
112
113 //
114 // Private members
115 //
116
117 /**
118 * @serial Role name
119 */
120 private String roleName = null;
121
122 /**
123 * @serial Role value ({@link List} of {@link ObjectName} objects)
124 */
125 private List<ObjectName> roleValue = null;
126
127 /**
128 * @serial Problem type
129 */
130 private int problemType;
131
132 //
133 // Constructor
134 //
135
136 /**
137 * Constructor.
138 *
139 * @param name name of the role
140 * @param value value of the role (if problem when setting the
141 * role)
142 * @param pbType type of problem (according to known problem types,
143 * listed as static final members).
144 *
145 * @exception IllegalArgumentException if null parameter or incorrect
146 * problem type
147 */
148 public RoleUnresolved(String name,
149 List<ObjectName> value,
150 int pbType)
151 throws IllegalArgumentException {
152
153 if (name == null) {
154 String excMsg = "Invalid parameter.";
155 throw new IllegalArgumentException(excMsg);
156 }
157
158 setRoleName(name);
159 setRoleValue(value);
160 // Can throw IllegalArgumentException
161 setProblemType(pbType);
162 return;
163 }
164
165 //
166 // Accessors
167 //
168
169 /**
170 * Retrieves role name.
171 *
172 * @return the role name.
173 *
174 * @see #setRoleName
175 */
176 public String getRoleName() {
177 return roleName;
178 }
179
180 /**
181 * Retrieves role value.
182 *
183 * @return an ArrayList of ObjectName objects, the one provided to be set
184 * in given role. Null if the unresolved role is returned for a read
185 * access.
186 *
187 * @see #setRoleValue
188 */
189 public List<ObjectName> getRoleValue() {
190 return roleValue;
191 }
192
193 /**
194 * Retrieves problem type.
195 *
196 * @return an integer corresponding to a problem, those being described as
197 * static final members of current class.
198 *
199 * @see #setProblemType
200 */
201 public int getProblemType() {
202 return problemType;
203 }
204
205 /**
206 * Sets role name.
207 *
208 * @param name the new role name.
209 *
210 * @exception IllegalArgumentException if null parameter
211 *
212 * @see #getRoleName
213 */
214 public void setRoleName(String name)
215 throws IllegalArgumentException {
216
217 if (name == null) {
218 String excMsg = "Invalid parameter.";
219 throw new IllegalArgumentException(excMsg);
220 }
221
222 roleName = name;
223 return;
224 }
225
226 /**
227 * Sets role value.
228 *
229 * @param value List of ObjectName objects for referenced
230 * MBeans not set in role.
231 *
232 * @see #getRoleValue
233 */
234 public void setRoleValue(List<ObjectName> value) {
235
236 if (value != null) {
237 roleValue = new ArrayList<ObjectName>(value);
238 } else {
239 roleValue = null;
240 }
241 return;
242 }
243
244 /**
245 * Sets problem type.
246 *
247 * @param pbType integer corresponding to a problem. Must be one of
248 * those described as static final members of current class.
249 *
250 * @exception IllegalArgumentException if incorrect problem type
251 *
252 * @see #getProblemType
253 */
254 public void setProblemType(int pbType)
255 throws IllegalArgumentException {
256
257 if (!(RoleStatus.isRoleStatus(pbType))) {
258 String excMsg = "Incorrect problem type.";
259 throw new IllegalArgumentException(excMsg);
260 }
261 problemType = pbType;
262 return;
263 }
264
265 /**
266 * Clone this object.
267 *
268 * @return an independent clone.
269 */
270 public Object clone() {
271 try {
272 return new RoleUnresolved(roleName, roleValue, problemType);
273 } catch (IllegalArgumentException exc) {
274 return null; // :)
275 }
276 }
277
278 /**
279 * Return a string describing this object.
280 *
281 * @return a description of this RoleUnresolved object.
282 */
283 public String toString() {
284 StringBuilder result = new StringBuilder();
285 result.append("role name: " + roleName);
286 if (roleValue != null) {
287 result.append("; value: ");
288 for (Iterator objNameIter = roleValue.iterator();
289 objNameIter.hasNext();) {
290 ObjectName currObjName = (ObjectName)(objNameIter.next());
291 result.append(currObjName.toString());
292 if (objNameIter.hasNext()) {
293 result.append(", ");
294 }
295 }
296 }
297 result.append("; problem type: " + problemType);
298 return result.toString();
299 }
300
301 /**
302 * Deserializes a {@link RoleUnresolved} from an {@link ObjectInputStream}.
303 */
304 private void readObject(ObjectInputStream in)
305 throws IOException, ClassNotFoundException {
306 if (compat)
307 {
308 // Read an object serialized in the old serial form
309 //
310 ObjectInputStream.GetField fields = in.readFields();
311 roleName = (String) fields.get("myRoleName", null);
312 if (fields.defaulted("myRoleName"))
313 {
314 throw new NullPointerException("myRoleName");
315 }
316 roleValue = cast(fields.get("myRoleValue", null));
317 if (fields.defaulted("myRoleValue"))
318 {
319 throw new NullPointerException("myRoleValue");
320 }
321 problemType = fields.get("myPbType", 0);
322 if (fields.defaulted("myPbType"))
323 {
324 throw new NullPointerException("myPbType");
325 }
326 }
327 else
328 {
329 // Read an object serialized in the new serial form
330 //
331 in.defaultReadObject();
332 }
333 }
334
335
336 /**
337 * Serializes a {@link RoleUnresolved} to an {@link ObjectOutputStream}.
338 */
339 private void writeObject(ObjectOutputStream out)
340 throws IOException {
341 if (compat)
342 {
343 // Serializes this instance in the old serial form
344 //
345 ObjectOutputStream.PutField fields = out.putFields();
346 fields.put("myRoleName", roleName);
347 fields.put("myRoleValue", (ArrayList)roleValue);
348 fields.put("myPbType", problemType);
349 out.writeFields();
350 }
351 else
352 {
353 // Serializes this instance in the new serial form
354 //
355 out.defaultWriteObject();
356 }
357 }
358 }