blob: b36d53689c66d39a9014b3b054178c8b14ebb84a [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 1999-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
26package javax.management;
27
28import java.util.Arrays;
29
30/**
31 * <p>The <CODE>MBeanNotificationInfo</CODE> class is used to describe the
32 * characteristics of the different notification instances
33 * emitted by an MBean, for a given Java class of notification.
34 * If an MBean emits notifications that can be instances of different Java classes,
35 * then the metadata for that MBean should provide an <CODE>MBeanNotificationInfo</CODE>
36 * object for each of these notification Java classes.</p>
37 *
38 * <p>Instances of this class are immutable. Subclasses may be
39 * mutable but this is not recommended.</p>
40 *
41 * <p>This class extends <CODE>javax.management.MBeanFeatureInfo</CODE>
42 * and thus provides <CODE>name</CODE> and <CODE>description</CODE> fields.
43 * The <CODE>name</CODE> field should be the fully qualified Java class name of
44 * the notification objects described by this class.</p>
45 *
46 * <p>The <CODE>getNotifTypes</CODE> method returns an array of
47 * strings containing the notification types that the MBean may
48 * emit. The notification type is a dot-notation string which
49 * describes what the emitted notification is about, not the Java
50 * class of the notification. A single generic notification class can
51 * be used to send notifications of several types. All of these types
52 * are returned in the string array result of the
53 * <CODE>getNotifTypes</CODE> method.
54 *
55 * @since 1.5
56 */
57public class MBeanNotificationInfo extends MBeanFeatureInfo implements Cloneable {
58
59 /* Serial version */
60 static final long serialVersionUID = -3888371564530107064L;
61
62 private static final String[] NO_TYPES = new String[0];
63
64 static final MBeanNotificationInfo[] NO_NOTIFICATIONS =
65 new MBeanNotificationInfo[0];
66
67 /**
68 * @serial The different types of the notification.
69 */
70 private final String[] types;
71
72 /** @see MBeanInfo#arrayGettersSafe */
73 private final transient boolean arrayGettersSafe;
74
75 /**
76 * Constructs an <CODE>MBeanNotificationInfo</CODE> object.
77 *
78 * @param notifTypes The array of strings (in dot notation)
79 * containing the notification types that the MBean may emit.
80 * This may be null with the same effect as a zero-length array.
81 * @param name The fully qualified Java class name of the
82 * described notifications.
83 * @param description A human readable description of the data.
84 */
85 public MBeanNotificationInfo(String[] notifTypes,
86 String name,
87 String description) {
88 this(notifTypes, name, description, null);
89 }
90
91 /**
92 * Constructs an <CODE>MBeanNotificationInfo</CODE> object.
93 *
94 * @param notifTypes The array of strings (in dot notation)
95 * containing the notification types that the MBean may emit.
96 * This may be null with the same effect as a zero-length array.
97 * @param name The fully qualified Java class name of the
98 * described notifications.
99 * @param description A human readable description of the data.
100 * @param descriptor The descriptor for the notifications. This may be null
101 * which is equivalent to an empty descriptor.
102 *
103 * @since 1.6
104 */
105 public MBeanNotificationInfo(String[] notifTypes,
106 String name,
107 String description,
108 Descriptor descriptor) {
109 super(name, description, descriptor);
110
111 /* We do not validate the notifTypes, since the spec just says
112 they are dot-separated, not that they must look like Java
113 classes. E.g. the spec doesn't forbid "sun.prob.25" as a
114 notifType, though it doesn't explicitly allow it
115 either. */
116
117 if (notifTypes == null)
118 notifTypes = NO_TYPES;
119 this.types = notifTypes;
120 this.arrayGettersSafe =
121 MBeanInfo.arrayGettersSafe(this.getClass(),
122 MBeanNotificationInfo.class);
123 }
124
125
126 /**
127 * Returns a shallow clone of this instance.
128 * The clone is obtained by simply calling <tt>super.clone()</tt>,
129 * thus calling the default native shallow cloning mechanism
130 * implemented by <tt>Object.clone()</tt>.
131 * No deeper cloning of any internal field is made.
132 */
133 public Object clone () {
134 try {
135 return super.clone() ;
136 } catch (CloneNotSupportedException e) {
137 // should not happen as this class is cloneable
138 return null;
139 }
140 }
141
142
143 /**
144 * Returns the array of strings (in dot notation) containing the
145 * notification types that the MBean may emit.
146 *
147 * @return the array of strings. Changing the returned array has no
148 * effect on this MBeanNotificationInfo.
149 */
150 public String[] getNotifTypes() {
151 if (types.length == 0)
152 return NO_TYPES;
153 else
154 return types.clone();
155 }
156
157 private String[] fastGetNotifTypes() {
158 if (arrayGettersSafe)
159 return types;
160 else
161 return getNotifTypes();
162 }
163
164 public String toString() {
165 return
166 getClass().getName() + "[" +
167 "description=" + getDescription() + ", " +
168 "name=" + getName() + ", " +
169 "notifTypes=" + Arrays.asList(fastGetNotifTypes()) + ", " +
170 "descriptor=" + getDescriptor() +
171 "]";
172 }
173
174 /**
175 * Compare this MBeanNotificationInfo to another.
176 *
177 * @param o the object to compare to.
178 *
179 * @return true if and only if <code>o</code> is an MBeanNotificationInfo
180 * such that its {@link #getName()}, {@link #getDescription()},
181 * {@link #getDescriptor()},
182 * and {@link #getNotifTypes()} values are equal (not necessarily
183 * identical) to those of this MBeanNotificationInfo. Two
184 * notification type arrays are equal if their corresponding
185 * elements are equal. They are not equal if they have the same
186 * elements but in a different order.
187 */
188 public boolean equals(Object o) {
189 if (o == this)
190 return true;
191 if (!(o instanceof MBeanNotificationInfo))
192 return false;
193 MBeanNotificationInfo p = (MBeanNotificationInfo) o;
194 return (p.getName().equals(getName()) &&
195 p.getDescription().equals(getDescription()) &&
196 p.getDescriptor().equals(getDescriptor()) &&
197 Arrays.equals(p.fastGetNotifTypes(), fastGetNotifTypes()));
198 }
199
200 public int hashCode() {
201 int hash = getName().hashCode();
202 for (int i = 0; i < types.length; i++)
203 hash ^= types[i].hashCode();
204 return hash;
205 }
206}