001: /*
002: * JBoss, Home of Professional Open Source.
003: * Copyright 2006, Red Hat Middleware LLC, and individual contributors
004: * as indicated by the @author tags. See the copyright.txt file in the
005: * distribution for a full listing of individual contributors.
006: *
007: * This is free software; you can redistribute it and/or modify it
008: * under the terms of the GNU Lesser General Public License as
009: * published by the Free Software Foundation; either version 2.1 of
010: * the License, or (at your option) any later version.
011: *
012: * This software is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015: * Lesser General Public License for more details.
016: *
017: * You should have received a copy of the GNU Lesser General Public
018: * License along with this software; if not, write to the Free
019: * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
021: */
022: package javax.management.modelmbean;
023:
024: import java.lang.reflect.Constructor;
025:
026: import java.io.IOException;
027: import java.io.ObjectInputStream;
028: import java.io.ObjectOutputStream;
029: import java.io.ObjectStreamField;
030: import java.io.StreamCorruptedException;
031:
032: import java.util.Arrays;
033:
034: import javax.management.Descriptor;
035: import javax.management.DescriptorAccess;
036: import javax.management.MBeanConstructorInfo;
037: import javax.management.MBeanParameterInfo;
038: import javax.management.RuntimeOperationsException;
039:
040: import org.jboss.mx.modelmbean.ModelMBeanConstants;
041: import org.jboss.mx.util.Serialization;
042:
043: /**
044: * Represents constructor.
045: *
046: * @see javax.management.modelmbean.ModelMBeanInfo
047: * @see javax.management.modelmbean.ModelMBeanInfoSupport
048: *
049: * @author <a href="mailto:juha@jboss.org">Juha Lindfors</a>.
050: * @author <a href="mailto:adrian.brock@happeningtimes.com">Adrian Brock</a>.
051: * @author <a href="mailto:thomas.diesler@jboss.com">Thomas Diesler</a>.
052: * @version $Revision: 57200 $
053: *
054: * <p><b>20020715 Adrian Brock:</b>
055: * <ul>
056: * <li> Serialization
057: * </ul>
058: */
059: public class ModelMBeanConstructorInfo extends MBeanConstructorInfo
060: implements DescriptorAccess, Cloneable {
061:
062: // Attributes ----------------------------------------------------
063:
064: /**
065: * The descriptor associated with this constructor.
066: */
067: private Descriptor descriptor = null;
068:
069: // Static --------------------------------------------------------
070:
071: private static final long serialVersionUID;
072: private static final ObjectStreamField[] serialPersistentFields;
073:
074: static {
075: switch (Serialization.version) {
076: case Serialization.V1R0:
077: serialVersionUID = -4440125391095574518L;
078: break;
079: default:
080: serialVersionUID = 3862947819818064362L;
081: }
082: serialPersistentFields = new ObjectStreamField[] { new ObjectStreamField(
083: "consDescriptor", Descriptor.class) };
084: }
085:
086: // Constructors --------------------------------------------------
087: /**
088: * Creates a new constructor info with a default descriptor.
089: *
090: * @param description human readable description string
091: * @param constructorMethod a <tt>Constructor</tt> instance representing the MBean constructor
092: */
093: public ModelMBeanConstructorInfo(String description,
094: Constructor constructorMethod) {
095: super (description, constructorMethod);
096: setDescriptor(createDefaultDescriptor());
097: }
098:
099: /**
100: * Creates a new constructor info with a given descriptor. If a <tt>null</tt> or invalid descriptor
101: * is passed as a parameter, a default descriptor will be created for the constructor.
102: *
103: * @param description human readable description string
104: * @param constructorMethod a <tt>Constructor</tt> instance representing the MBean constructor
105: * @param descriptor a descriptor to associate with this constructor
106: */
107: public ModelMBeanConstructorInfo(String description,
108: Constructor constructorMethod, Descriptor descriptor) {
109: super (description, constructorMethod);
110: setDescriptor(descriptor);
111: }
112:
113: /**
114: * Creates a new constructor info with default descriptor.
115: *
116: * @param name name for the constructor
117: * @param description human readable description string
118: * @param signature constructor signature
119: */
120: public ModelMBeanConstructorInfo(String name, String description,
121: MBeanParameterInfo[] signature) {
122: super (name, description, signature);
123: setDescriptor(createDefaultDescriptor());
124: }
125:
126: /**
127: * Creates a new constructor info with a given descriptor. If a <tt>null</tt> or invalid descriptor
128: * is passed as a parameter, a default descriptor will be created for the constructor.
129: *
130: * @param name name for the constructor
131: * @param description human readable description string
132: * @param signature constructor signature
133: * @param descriptor a descriptor to associate with this constructor
134: */
135: public ModelMBeanConstructorInfo(String name, String description,
136: MBeanParameterInfo[] signature, Descriptor descriptor) {
137: this (name, description, signature);
138: setDescriptor(descriptor);
139: }
140:
141: // DescriptorAccess implementation -------------------------------
142:
143: /**
144: * Returns a copy of the descriptor associated with this constructor.
145: *
146: * @return a copy of this constructor's descriptor instance
147: */
148: public Descriptor getDescriptor() {
149: return (Descriptor) descriptor.clone();
150: }
151:
152: /**
153: * Replaces the descriptor associated with this constructor. If the <tt>inDescriptor</tt>
154: * argument is <tt>null</tt> then the existing descriptor is replaced with a default
155: * descriptor.
156: *
157: * @param inDescriptor descriptor used for replacing the existing constructor descriptor
158: * @throws IllegalArgumentException if the new descriptor is not valid
159: */
160: public void setDescriptor(Descriptor inDescriptor) {
161: if (inDescriptor == null)
162: inDescriptor = createDefaultDescriptor();
163:
164: if (inDescriptor.isValid()
165: && isConstructorDescriptorValid(inDescriptor))
166: this .descriptor = inDescriptor;
167: }
168:
169: /**
170: * Validate the descriptor in the context of an attribute
171: */
172: private boolean isConstructorDescriptorValid(Descriptor inDescriptor) {
173: String name = (String) inDescriptor
174: .getFieldValue(ModelMBeanConstants.NAME);
175: if (name.equals(getName()) == false)
176: throw new RuntimeOperationsException(
177: new IllegalArgumentException(
178: "Invalid name, expected '" + getName()
179: + "' but got: " + name));
180:
181: String descriptorType = (String) inDescriptor
182: .getFieldValue(ModelMBeanConstants.DESCRIPTOR_TYPE);
183: if (ModelMBeanConstants.OPERATION_DESCRIPTOR
184: .equalsIgnoreCase(descriptorType) == false)
185: throw new RuntimeOperationsException(
186: new IllegalArgumentException(
187: "Invalid descriptorType, for constructor '"
188: + name
189: + "' expected 'operation' but got: "
190: + descriptorType));
191:
192: String role = (String) inDescriptor
193: .getFieldValue(ModelMBeanConstants.ROLE);
194: if (ModelMBeanConstants.ROLE_CONSTRUCTOR.equals(role) == false)
195: throw new RuntimeOperationsException(
196: new IllegalArgumentException(
197: "Invalid role, for constructor '"
198: + name
199: + "' expected 'constructor' but got: "
200: + role));
201:
202: return true;
203: }
204:
205: // Cloneable implementation --------------------------------------
206:
207: public synchronized Object clone() {
208: return (ModelMBeanConstructorInfo) super .clone();
209: }
210:
211: // Object overrides ----------------------------------------------
212:
213: /**
214: * @return a human readable string
215: */
216: public String toString() {
217: StringBuffer buffer = new StringBuffer(100);
218: buffer.append(getClass().getName()).append(":");
219: buffer.append(" name=").append(getName());
220: buffer.append(" description=").append(getDescription());
221: buffer.append(" signature=").append(
222: Arrays.asList(getSignature()));
223: buffer.append(" descriptor=").append(descriptor);
224: return buffer.toString();
225: }
226:
227: // Private -------------------------------------------------------
228: private Descriptor createDefaultDescriptor() {
229: DescriptorSupport descr = new DescriptorSupport();
230: descr.setField(ModelMBeanConstants.NAME, super .getName());
231: descr.setField(ModelMBeanConstants.DESCRIPTOR_TYPE,
232: ModelMBeanConstants.OPERATION_DESCRIPTOR);
233: descr.setField(ModelMBeanConstants.DISPLAY_NAME, super
234: .getName());
235: descr.setField(ModelMBeanConstants.ROLE,
236: ModelMBeanConstants.ROLE_CONSTRUCTOR);
237: return descr;
238: }
239:
240: private void readObject(ObjectInputStream ois) throws IOException,
241: ClassNotFoundException {
242: ObjectInputStream.GetField getField = ois.readFields();
243: descriptor = (Descriptor) getField.get("consDescriptor", null);
244: if (descriptor == null)
245: throw new StreamCorruptedException("Null descriptor?");
246: }
247:
248: private void writeObject(ObjectOutputStream oos) throws IOException {
249: ObjectOutputStream.PutField putField = oos.putFields();
250: putField.put("consDescriptor", descriptor);
251: oos.writeFields();
252: }
253:
254: }
|