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.io.IOException;
025: import java.io.ObjectInputStream;
026: import java.io.ObjectOutputStream;
027: import java.io.ObjectStreamField;
028: import java.io.StreamCorruptedException;
029:
030: import javax.management.MBeanNotificationInfo;
031: import javax.management.Descriptor;
032: import javax.management.DescriptorAccess;
033: import javax.management.RuntimeOperationsException;
034:
035: import org.jboss.mx.modelmbean.ModelMBeanConstants;
036: import org.jboss.mx.util.Serialization;
037:
038: /**
039: * Represents a notification in a Model MBean's management interface.
040: *
041: * @see javax.management.modelmbean.ModelMBeanInfo
042: * @see javax.management.modelmbean.ModelMBeanAttributeInfo
043: *
044: * @author <a href="mailto:juha@jboss.org">Juha Lindfors</a>.
045: * @author <a href="mailto:adrian.brock@happeningtimes.com">Adrian Brock</a>.
046: * @author <a href="mailto:thomas.diesler@jboss.com">Thomas Diesler</a>.
047: * @version $Revision: 57200 $
048: *
049: */
050: public class ModelMBeanNotificationInfo extends MBeanNotificationInfo
051: implements DescriptorAccess, Cloneable {
052:
053: // Attributes ----------------------------------------------------
054: private Descriptor descriptor = null;
055:
056: // Static --------------------------------------------------------
057:
058: private static final long serialVersionUID;
059: private static final ObjectStreamField[] serialPersistentFields;
060:
061: static {
062: switch (Serialization.version) {
063: case Serialization.V1R0:
064: serialVersionUID = -5211564525059047097L;
065: serialPersistentFields = new ObjectStreamField[] { new ObjectStreamField(
066: "ntfyDescriptor", Descriptor.class) };
067: break;
068: default:
069: serialVersionUID = -7445681389570207141L;
070: serialPersistentFields = new ObjectStreamField[] { new ObjectStreamField(
071: "notificationDescriptor", Descriptor.class) };
072: }
073: }
074:
075: // Constructors --------------------------------------------------
076: public ModelMBeanNotificationInfo(String[] notifTypes, String name,
077: String description) {
078: super (notifTypes, name, description);
079: setDescriptor(createDefaultDescriptor());
080: }
081:
082: public ModelMBeanNotificationInfo(String[] notifTypes, String name,
083: String description, Descriptor descriptor) {
084: super (notifTypes, name, description);
085: setDescriptor(descriptor);
086: }
087:
088: public ModelMBeanNotificationInfo(ModelMBeanNotificationInfo info) {
089: this (info.getNotifTypes(), info.getName(), info
090: .getDescription(), info.getDescriptor());
091: }
092:
093: // Public --------------------------------------------------------
094: public Descriptor getDescriptor() {
095: return (Descriptor) descriptor.clone();
096: }
097:
098: public void setDescriptor(Descriptor inDescriptor) {
099: if (inDescriptor == null)
100: inDescriptor = createDefaultDescriptor();
101:
102: if (inDescriptor.isValid()
103: && isNotificationDescriptorValid(inDescriptor))
104: this .descriptor = inDescriptor;
105: }
106:
107: /**
108: * Validate the descriptor in the context of an attribute
109: */
110: private boolean isNotificationDescriptorValid(
111: Descriptor inDescriptor) {
112: String name = (String) inDescriptor
113: .getFieldValue(ModelMBeanConstants.NAME);
114: if (name.equals(getName()) == false)
115: throw new RuntimeOperationsException(
116: new IllegalArgumentException(
117: "Invalid name, expected '" + getName()
118: + "' but got: " + name));
119:
120: String descriptorType = (String) inDescriptor
121: .getFieldValue(ModelMBeanConstants.DESCRIPTOR_TYPE);
122: if (ModelMBeanConstants.NOTIFICATION_DESCRIPTOR
123: .equalsIgnoreCase(descriptorType) == false)
124: throw new RuntimeOperationsException(
125: new IllegalArgumentException(
126: "Invalid descriptorType, for notification '"
127: + name
128: + "' expected 'notification' but got: "
129: + descriptorType));
130:
131: return true;
132: }
133:
134: // Cloneable implementation --------------------------------------
135: public Object clone() {
136: ModelMBeanNotificationInfo clone = (ModelMBeanNotificationInfo) super
137: .clone();
138: clone.descriptor = (Descriptor) this .descriptor.clone();
139: return clone;
140: }
141:
142: // Object overrides ----------------------------------------------
143: public String toString() {
144: // FIXME: human readable string
145: return super .toString();
146: }
147:
148: // Private -------------------------------------------------------
149:
150: /**
151: * The default descriptor contains the name, descriptorType, displayName and severity(=5) fields.
152: */
153: private Descriptor createDefaultDescriptor() {
154: DescriptorSupport descr = new DescriptorSupport();
155: descr.setField(ModelMBeanConstants.NAME, getName());
156: descr.setField(ModelMBeanConstants.DISPLAY_NAME, getName());
157: descr.setField(ModelMBeanConstants.SEVERITY,
158: ModelMBeanConstants.SEVERITY_WARNING);
159: descr.setField(ModelMBeanConstants.DESCRIPTOR_TYPE,
160: ModelMBeanConstants.NOTIFICATION_DESCRIPTOR);
161: return descr;
162: }
163:
164: private void readObject(ObjectInputStream ois) throws IOException,
165: ClassNotFoundException {
166: ObjectInputStream.GetField getField = ois.readFields();
167: switch (Serialization.version) {
168: case Serialization.V1R0:
169: descriptor = (Descriptor) getField.get("ntfyDescriptor",
170: null);
171: break;
172: default:
173: descriptor = (Descriptor) getField.get(
174: "notificationDescriptor", null);
175: }
176: if (descriptor == null)
177: throw new StreamCorruptedException("Null descriptor?");
178: }
179:
180: private void writeObject(ObjectOutputStream oos) throws IOException {
181: ObjectOutputStream.PutField putField = oos.putFields();
182: switch (Serialization.version) {
183: case Serialization.V1R0:
184: putField.put("ntfyDescriptor", descriptor);
185: break;
186: default:
187: putField.put("notificationDescriptor", descriptor);
188: }
189: oos.writeFields();
190: }
191: }
|