| /* |
| * Copyright (c) 1999, 2008, Oracle and/or its affiliates. All rights reserved. |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
| * |
| * This code is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 only, as |
| * published by the Free Software Foundation. Oracle designates this |
| * particular file as subject to the "Classpath" exception as provided |
| * by Oracle in the LICENSE file that accompanied this code. |
| * |
| * This code is distributed in the hope that it will be useful, but WITHOUT |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
| * version 2 for more details (a copy is included in the LICENSE file that |
| * accompanied this code). |
| * |
| * You should have received a copy of the GNU General Public License version |
| * 2 along with this work; if not, write to the Free Software Foundation, |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
| * |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
| * or visit www.oracle.com if you need additional information or have any |
| * questions. |
| */ |
| |
| package javax.management; |
| |
| import java.io.IOException; |
| import java.io.ObjectInputStream; |
| import java.io.ObjectOutputStream; |
| import java.io.ObjectStreamField; |
| import java.util.EventObject; |
| |
| import java.security.AccessController; |
| |
| import com.sun.jmx.mbeanserver.GetPropertyAction; |
| |
| /** |
| * <p>The Notification class represents a notification emitted by an |
| * MBean. It contains a reference to the source MBean: if the |
| * notification has been forwarded through the MBean server, and the |
| * original source of the notification was a reference to the emitting |
| * MBean object, then the MBean server replaces it by the MBean's |
| * ObjectName. If the listener has registered directly with the |
| * MBean, this is either the object name or a direct reference to the |
| * MBean.</p> |
| * |
| * <p>It is strongly recommended that notification senders use the |
| * object name rather than a reference to the MBean object as the |
| * source.</p> |
| * |
| * <p>The <b>serialVersionUID</b> of this class is <code>-7516092053498031989L</code>. |
| * |
| * @since 1.5 |
| */ |
| @SuppressWarnings("serial") // serialVersionUID is not constant |
| public class Notification extends EventObject { |
| |
| // Serialization compatibility stuff: |
| // Two serial forms are supported in this class. The selected form depends |
| // on system property "jmx.serial.form": |
| // - "1.0" for JMX 1.0 |
| // - any other value for JMX 1.1 and higher |
| // |
| // Serial version for old serial form |
| private static final long oldSerialVersionUID = 1716977971058914352L; |
| // |
| // Serial version for new serial form |
| private static final long newSerialVersionUID = -7516092053498031989L; |
| // |
| // Serializable fields in old serial form |
| private static final ObjectStreamField[] oldSerialPersistentFields = |
| { |
| new ObjectStreamField("message", String.class), |
| new ObjectStreamField("sequenceNumber", Long.TYPE), |
| new ObjectStreamField("source", Object.class), |
| new ObjectStreamField("sourceObjectName", ObjectName.class), |
| new ObjectStreamField("timeStamp", Long.TYPE), |
| new ObjectStreamField("type", String.class), |
| new ObjectStreamField("userData", Object.class) |
| }; |
| // |
| // Serializable fields in new serial form |
| private static final ObjectStreamField[] newSerialPersistentFields = |
| { |
| new ObjectStreamField("message", String.class), |
| new ObjectStreamField("sequenceNumber", Long.TYPE), |
| new ObjectStreamField("source", Object.class), |
| new ObjectStreamField("timeStamp", Long.TYPE), |
| new ObjectStreamField("type", String.class), |
| new ObjectStreamField("userData", Object.class) |
| }; |
| // |
| // Actual serial version and serial form |
| private static final long serialVersionUID; |
| /** |
| * @serialField type String The notification type. |
| * A string expressed in a dot notation similar to Java properties. |
| * An example of a notification type is network.alarm.router |
| * @serialField sequenceNumber long The notification sequence number. |
| * A serial number which identify particular instance |
| * of notification in the context of the notification source. |
| * @serialField timeStamp long The notification timestamp. |
| * Indicating when the notification was generated |
| * @serialField userData Object The notification user data. |
| * Used for whatever other data the notification |
| * source wishes to communicate to its consumers |
| * @serialField message String The notification message. |
| * @serialField source Object The object on which the notification initially occurred. |
| */ |
| private static final ObjectStreamField[] serialPersistentFields; |
| private static boolean compat = false; |
| static { |
| try { |
| GetPropertyAction act = new GetPropertyAction("jmx.serial.form"); |
| String form = AccessController.doPrivileged(act); |
| compat = (form != null && form.equals("1.0")); |
| } catch (Exception e) { |
| // OK: exception means no compat with 1.0, too bad |
| } |
| if (compat) { |
| serialPersistentFields = oldSerialPersistentFields; |
| serialVersionUID = oldSerialVersionUID; |
| } else { |
| serialPersistentFields = newSerialPersistentFields; |
| serialVersionUID = newSerialVersionUID; |
| } |
| } |
| // |
| // END Serialization compatibility stuff |
| |
| /** |
| * @serial The notification type. |
| * A string expressed in a dot notation similar to Java properties. |
| * An example of a notification type is network.alarm.router |
| */ |
| private String type; |
| |
| /** |
| * @serial The notification sequence number. |
| * A serial number which identify particular instance |
| * of notification in the context of the notification source. |
| */ |
| private long sequenceNumber; |
| |
| /** |
| * @serial The notification timestamp. |
| * Indicating when the notification was generated |
| */ |
| private long timeStamp; |
| |
| /** |
| * @serial The notification user data. |
| * Used for whatever other data the notification |
| * source wishes to communicate to its consumers |
| */ |
| private Object userData = null; |
| |
| /** |
| * @serial The notification message. |
| */ |
| private String message = ""; |
| |
| /** |
| * <p>This field hides the {@link EventObject#source} field in the |
| * parent class to make it non-transient and therefore part of the |
| * serialized form.</p> |
| * |
| * @serial The object on which the notification initially occurred. |
| */ |
| protected Object source = null; |
| |
| |
| /** |
| * Creates a Notification object. |
| * The notification timeStamp is set to the current date. |
| * |
| * @param type The notification type. |
| * @param source The notification source. |
| * @param sequenceNumber The notification sequence number within the source object. |
| * |
| */ |
| public Notification(String type, Object source, long sequenceNumber) { |
| super (source) ; |
| this.source = source; |
| this.type = type; |
| this.sequenceNumber = sequenceNumber ; |
| this.timeStamp = (new java.util.Date()).getTime() ; |
| } |
| |
| /** |
| * Creates a Notification object. |
| * The notification timeStamp is set to the current date. |
| * |
| * @param type The notification type. |
| * @param source The notification source. |
| * @param sequenceNumber The notification sequence number within the source object. |
| * @param message The detailed message. |
| * |
| */ |
| public Notification(String type, Object source, long sequenceNumber, String message) { |
| super (source) ; |
| this.source = source; |
| this.type = type; |
| this.sequenceNumber = sequenceNumber ; |
| this.timeStamp = (new java.util.Date()).getTime() ; |
| this.message = message ; |
| } |
| |
| /** |
| * Creates a Notification object. |
| * |
| * @param type The notification type. |
| * @param source The notification source. |
| * @param sequenceNumber The notification sequence number within the source object. |
| * @param timeStamp The notification emission date. |
| * |
| */ |
| public Notification(String type, Object source, long sequenceNumber, long timeStamp) { |
| super (source) ; |
| this.source = source; |
| this.type = type ; |
| this.sequenceNumber = sequenceNumber ; |
| this.timeStamp = timeStamp ; |
| } |
| |
| /** |
| * Creates a Notification object. |
| * |
| * @param type The notification type. |
| * @param source The notification source. |
| * @param sequenceNumber The notification sequence number within the source object. |
| * @param timeStamp The notification emission date. |
| * @param message The detailed message. |
| * |
| */ |
| public Notification(String type, Object source, long sequenceNumber, long timeStamp, String message) { |
| super (source) ; |
| this.source = source; |
| this.type = type ; |
| this.sequenceNumber = sequenceNumber ; |
| this.timeStamp = timeStamp ; |
| this.message = message ; |
| } |
| |
| /** |
| * Sets the source. |
| * |
| * @param source the new source for this object. |
| * |
| * @see EventObject#getSource |
| */ |
| public void setSource(Object source) { |
| super.source = source; |
| this.source = source; |
| } |
| |
| /** |
| * Get the notification sequence number. |
| * |
| * @return The notification sequence number within the source object. It's a serial number |
| * identifying a particular instance of notification in the context of the notification source. |
| * The notification model does not assume that notifications will be received in the same order |
| * that they are sent. The sequence number helps listeners to sort received notifications. |
| * |
| * @see #setSequenceNumber |
| */ |
| public long getSequenceNumber() { |
| return sequenceNumber ; |
| } |
| |
| /** |
| * Set the notification sequence number. |
| * |
| * @param sequenceNumber The notification sequence number within the source object. It is |
| * a serial number identifying a particular instance of notification in the |
| * context of the notification source. |
| * |
| * @see #getSequenceNumber |
| */ |
| public void setSequenceNumber(long sequenceNumber) { |
| this.sequenceNumber = sequenceNumber; |
| } |
| |
| /** |
| * Get the notification type. |
| * |
| * @return The notification type. It's a string expressed in a dot notation |
| * similar to Java properties. It is recommended that the notification type |
| * should follow the reverse-domain-name convention used by Java package |
| * names. An example of a notification type is com.example.alarm.router. |
| */ |
| public String getType() { |
| return type ; |
| } |
| |
| /** |
| * Get the notification timestamp. |
| * |
| * @return The notification timestamp. |
| * |
| * @see #setTimeStamp |
| */ |
| public long getTimeStamp() { |
| return timeStamp ; |
| } |
| |
| /** |
| * Set the notification timestamp. |
| * |
| * @param timeStamp The notification timestamp. It indicates when the notification was generated. |
| * |
| * @see #getTimeStamp |
| */ |
| public void setTimeStamp(long timeStamp) { |
| this.timeStamp = timeStamp; |
| } |
| |
| /** |
| * Get the notification message. |
| * |
| * @return The message string of this notification object. |
| * |
| */ |
| public String getMessage() { |
| return message ; |
| } |
| |
| /** |
| * Get the user data. |
| * |
| * @return The user data object. It is used for whatever data |
| * the notification source wishes to communicate to its consumers. |
| * |
| * @see #setUserData |
| */ |
| public Object getUserData() { |
| return userData ; |
| } |
| |
| /** |
| * Set the user data. |
| * |
| * @param userData The user data object. It is used for whatever data |
| * the notification source wishes to communicate to its consumers. |
| * |
| * @see #getUserData |
| */ |
| public void setUserData(Object userData) { |
| |
| this.userData = userData ; |
| } |
| |
| /** |
| * Returns a String representation of this notification. |
| * |
| * @return A String representation of this notification. |
| */ |
| @Override |
| public String toString() { |
| return super.toString()+"[type="+type+"][message="+message+"]"; |
| } |
| |
| /** |
| * Deserializes a {@link Notification} from an {@link ObjectInputStream}. |
| */ |
| private void readObject(ObjectInputStream in) |
| throws IOException, ClassNotFoundException { |
| // New serial form ignores extra field "sourceObjectName" |
| in.defaultReadObject(); |
| super.source = source; |
| } |
| |
| |
| /** |
| * Serializes a {@link Notification} to an {@link ObjectOutputStream}. |
| */ |
| private void writeObject(ObjectOutputStream out) |
| throws IOException { |
| if (compat) { |
| // Serializes this instance in the old serial form |
| // |
| ObjectOutputStream.PutField fields = out.putFields(); |
| fields.put("type", type); |
| fields.put("sequenceNumber", sequenceNumber); |
| fields.put("timeStamp", timeStamp); |
| fields.put("userData", userData); |
| fields.put("message", message); |
| fields.put("source", source); |
| out.writeFields(); |
| } else { |
| // Serializes this instance in the new serial form |
| // |
| out.defaultWriteObject(); |
| } |
| } |
| } |