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
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 import java.util.Iterator;
39
40 /**
41 * Represents the result of a multiple access to several roles of a relation
42 * (either for reading or writing).
43 *
44 * <p>The <b>serialVersionUID</b> of this class is <code>-6304063118040985512L</code>.
45 *
46 * @since 1.5
47 */
48 @SuppressWarnings("serial")
49 public class RoleResult implements Serializable {
50
51 // Serialization compatibility stuff:
52 // Two serial forms are supported in this class. The selected form depends
53 // on system property "jmx.serial.form":
54 // - "1.0" for JMX 1.0
55 // - any other value for JMX 1.1 and higher
56 //
57 // Serial version for old serial form
58 private static final long oldSerialVersionUID = 3786616013762091099L;
59 //
60 // Serial version for new serial form
61 private static final long newSerialVersionUID = -6304063118040985512L;
62 //
63 // Serializable fields in old serial form
64 private static final ObjectStreamField[] oldSerialPersistentFields =
65 {
66 new ObjectStreamField("myRoleList", RoleList.class),
67 new ObjectStreamField("myRoleUnresList", RoleUnresolvedList.class)
68 };
69 //
70 // Serializable fields in new serial form
71 private static final ObjectStreamField[] newSerialPersistentFields =
72 {
73 new ObjectStreamField("roleList", RoleList.class),
74 new ObjectStreamField("unresolvedRoleList", RoleUnresolvedList.class)
75 };
76 //
77 // Actual serial version and serial form
78 private static final long serialVersionUID;
79 /**
80 * @serialField roleList RoleList List of roles successfully accessed
81 * @serialField unresolvedRoleList RoleUnresolvedList List of roles unsuccessfully accessed
82 */
83 private static final ObjectStreamField[] serialPersistentFields;
84 private static boolean compat = false;
85 static {
86 try {
87 GetPropertyAction act = new GetPropertyAction("jmx.serial.form");
88 String form = AccessController.doPrivileged(act);
89 compat = (form != null && form.equals("1.0"));
90 } catch (Exception e) {
91 // OK : Too bad, no compat with 1.0
92 }
93 if (compat) {
94 serialPersistentFields = oldSerialPersistentFields;
95 serialVersionUID = oldSerialVersionUID;
96 } else {
97 serialPersistentFields = newSerialPersistentFields;
98 serialVersionUID = newSerialVersionUID;
99 }
100 }
101 //
102 // END Serialization compatibility stuff
103
104 //
105 // Private members
106 //
107
108 /**
109 * @serial List of roles successfully accessed
110 */
111 private RoleList roleList = null;
112
113 /**
114 * @serial List of roles unsuccessfully accessed
115 */
116 private RoleUnresolvedList unresolvedRoleList = null;
117
118 //
119 // Constructor
120 //
121
122 /**
123 * Constructor.
124 *
125 * @param list list of roles successfully accessed.
126 * @param unresolvedList list of roles not accessed (with problem
127 * descriptions).
128 */
129 public RoleResult(RoleList list,
130 RoleUnresolvedList unresolvedList) {
131
132 setRoles(list);
133 setRolesUnresolved(unresolvedList);
134 return;
135 }
136
137 //
138 // Accessors
139 //
140
141 /**
142 * Retrieves list of roles successfully accessed.
143 *
144 * @return a RoleList
145 *
146 * @see #setRoles
147 */
148 public RoleList getRoles() {
149 return roleList;
150 }
151
152 /**
153 * Retrieves list of roles unsuccessfully accessed.
154 *
155 * @return a RoleUnresolvedList.
156 *
157 * @see #setRolesUnresolved
158 */
159 public RoleUnresolvedList getRolesUnresolved() {
160 return unresolvedRoleList;
161 }
162
163 /**
164 * Sets list of roles successfully accessed.
165 *
166 * @param list list of roles successfully accessed
167 *
168 * @see #getRoles
169 */
170 public void setRoles(RoleList list) {
171 if (list != null) {
172
173 roleList = new RoleList();
174
175 for (Iterator roleIter = list.iterator();
176 roleIter.hasNext();) {
177 Role currRole = (Role)(roleIter.next());
178 roleList.add((Role)(currRole.clone()));
179 }
180 } else {
181 roleList = null;
182 }
183 return;
184 }
185
186 /**
187 * Sets list of roles unsuccessfully accessed.
188 *
189 * @param unresolvedList list of roles unsuccessfully accessed
190 *
191 * @see #getRolesUnresolved
192 */
193 public void setRolesUnresolved(RoleUnresolvedList unresolvedList) {
194 if (unresolvedList != null) {
195
196 unresolvedRoleList = new RoleUnresolvedList();
197
198 for (Iterator roleUnresIter = unresolvedList.iterator();
199 roleUnresIter.hasNext();) {
200 RoleUnresolved currRoleUnres =
201 (RoleUnresolved)(roleUnresIter.next());
202 unresolvedRoleList.add((RoleUnresolved)(currRoleUnres.clone()));
203 }
204 } else {
205 unresolvedRoleList = null;
206 }
207 return;
208 }
209
210 /**
211 * Deserializes a {@link RoleResult} from an {@link ObjectInputStream}.
212 */
213 private void readObject(ObjectInputStream in)
214 throws IOException, ClassNotFoundException {
215 if (compat)
216 {
217 // Read an object serialized in the old serial form
218 //
219 ObjectInputStream.GetField fields = in.readFields();
220 roleList = (RoleList) fields.get("myRoleList", null);
221 if (fields.defaulted("myRoleList"))
222 {
223 throw new NullPointerException("myRoleList");
224 }
225 unresolvedRoleList = (RoleUnresolvedList) fields.get("myRoleUnresList", null);
226 if (fields.defaulted("myRoleUnresList"))
227 {
228 throw new NullPointerException("myRoleUnresList");
229 }
230 }
231 else
232 {
233 // Read an object serialized in the new serial form
234 //
235 in.defaultReadObject();
236 }
237 }
238
239
240 /**
241 * Serializes a {@link RoleResult} to an {@link ObjectOutputStream}.
242 */
243 private void writeObject(ObjectOutputStream out)
244 throws IOException {
245 if (compat)
246 {
247 // Serializes this instance in the old serial form
248 //
249 ObjectOutputStream.PutField fields = out.putFields();
250 fields.put("myRoleList", roleList);
251 fields.put("myRoleUnresList", unresolvedRoleList);
252 out.writeFields();
253 }
254 else
255 {
256 // Serializes this instance in the new serial form
257 //
258 out.defaultWriteObject();
259 }
260 }
261 }