/* Notification.java -- A notification emitted by a bean.
   Copyright (C) 2006 Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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 for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */

package javax.management;

import java.util.Date;
import java.util.EventObject;

/**
 * <p>
 * A notification message that may be emitted by a bean.
 * Notifications have both a message and a type, so individual
 * notifications can be grouped by type.  They also incorporate
 * sequencing, so that the recipient can order the delivered
 * messages correctly (there is no guarantee that they will
 * be delivered in order).
 * </p>
 * <p>
 * Notifications also include a reference to the source of
 * the notification.  The source bean is represented either
 * by an {@link ObjectName} or by a direct reference to the
 * bean.  The former is preferable, and notifications emitted
 * via a {@link MBeanServer} will automatically have the source
 * transformed into an {@link ObjectName}.
 * </p>
 *
 * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
 * @since 1.5
 */
public class Notification
  extends EventObject
{

  /**
   * The notification message.
   *
   * @serial the notification message.
   */
  private String message;

  /**
   * The notification's sequence number, relative to the notifications
   * emitted by the bean.
   *
   * @serial the notification sequence number.
   */
  private long sequenceNumber;

  /**
   * The source of the notification.  This is redeclared in order to
   * replace the <code>source</code> variable in {@link java.util.EventObject}
   * with a non-transient version.
   *
   * @serial the notification source.
   */
  protected Object source;

  /**
   * The time the notification was generated.
   *
   * @serial the notification timestamp.
   */
  private long timeStamp;

  /**
   * The type of notification sent.  This utilises the same style
   * as Java property and package names.  For example,
   * <code>gnu.gcj.compiler</code> may be one type of notifications.
   *
   * @serial the notification type.
   */
  private String type;

  /**
   * The user data associated with the notification.  This includes
   * any additional data which should be transmitted with the notification,
   * but can't be achieved using the {@link java.lang.String} format
   * of the <code>message</code>.
   *
   * @serial the notification user data.
   */
  private Object userData;

  /**
   * Creates a new {@link Notification} object with the specified type,
   * source and sequence number.  The timestamp is created using the
   * current date and time.
   *
   * @param type the type of the notification.
   * @param source the source of the notification.
   * @param sequenceNumber the sequence number of the notifcation.
   */
  public Notification(String type, Object source, long sequenceNumber)
  {
    this(type, source, sequenceNumber, new Date().getTime());
  }

  /**
   * Creates a new {@link Notification} object with the specified type,
   * source, sequence number and timestamp.  
   *
   * @param type the type of the notification.
   * @param source the source of the notification.
   * @param sequenceNumber the sequence number of the notifcation.
   * @param timeStamp the time the notification was emitted.
   */
  public Notification(String type, Object source, long sequenceNumber,
		      long timeStamp)
  {
    this(type, source, sequenceNumber, timeStamp, null);
  }

  /**
   * Creates a new {@link Notification} object with the specified type,
   * source, sequence number, timestamp and message.  
   *
   * @param type the type of the notification.
   * @param source the source of the notification.
   * @param sequenceNumber the sequence number of the notifcation.
   * @param timeStamp the time the notification was emitted.
   * @param message the message contained in the notification.
   */
  public Notification(String type, Object source, long sequenceNumber,
		      long timeStamp, String message)
  {
    super(source);
    this.type = type;
    this.sequenceNumber = sequenceNumber;
    this.timeStamp = timeStamp;
    this.message = message;
  }

  /**
   * Creates a new {@link Notification} object with the specified type,
   * source, sequence number and message.  The timestamp is created using
   * the current date and time.
   *
   * @param type the type of the notification.
   * @param source the source of the notification.
   * @param sequenceNumber the sequence number of the notifcation.
   * @param message the message contained in the notification.
   */
  public Notification(String type, Object source, long sequenceNumber,
		      String message)
  {
    this(type, source, sequenceNumber, new Date().getTime(), message);
  }

  /**
   * Returns the message contained in this notification.  The message
   * is in {@link java.lang.String} form, and is thus intended for
   * display to the end-user.  Data transferred as part of the notification
   * which shouldn't be displayed is included in the <code>userData</code>
   * field.
   *
   * @return the notification message.
   * @see #getUserData()
   * @see #setUserData(java.lang.Object)
   */
  public String getMessage()
  {
    return message;
  }

  /**
   * Returns the sequence number of this notification.  This
   * can be used to determine the order in which notifications
   * were emitted by the broadcasting bean.
   *
   * @return the sequence number.
   * @see #setSequenceNumber(long)
   */
  public long getSequenceNumber()
  {
    return sequenceNumber;
  }

  /**
   * Returns the date and time at which this notification was
   * emitted.
   *
   * @return the notification timestamp.
   * @see #setTimeStamp(long)
   */
  public long getTimeStamp()
  {
    return timeStamp;
  }

  /**
   * Returns the type of this notification.  Types take the same
   * form as Java package and property names.
   *
   * @return the type of the notification.
   */
  public String getType()
  {
    return type;
  }

  /**
   * Returns the additional user data associated with the notification.
   * This is used to attach additional non-textual information to the
   * notification.
   *
   * @return the user data associated with the notification.
   * @see #setUserData(java.lang.Object)
   */
  public Object getUserData()
  {
    return userData;
  }

  /**
   * Sets the sequence number to the value specified.
   *
   * @param sequenceNumber the new sequence number.
   * @see #getSequenceNumber()
   */
  public void setSequenceNumber(long sequenceNumber)
  {
    this.sequenceNumber = sequenceNumber;
  }

  /**
   * Sets the source of this notification to the value
   * specified.
   *
   * @param source the new source of the notification.
   * @see java.util.EventSource#getSource()
   */
  public void setSource(Object source)
  {
    this.source = source;
  }

  /**
   * Sets the date and time at which this notification
   * was emitted.
   *
   * @param timeStamp the new time stamp of the notification.
   * @see #getTimeStamp()
   */
  public void setTimeStamp(long timeStamp)
  {
    this.timeStamp = timeStamp;
  }

  /**
   * Sets the additional user data associated with the notification
   * to the specified value.  This is used to attach additional
   * non-textual information to the notification.
   *
   * @param userData the new user data associated with the notification.
   * @see #getUserData()
   */
  public void setUserData(Object userData)
  {
    this.userData = userData;
  }

  /**
   * A textual representation of the notification.
   * 
   * @return the notification in {@link java.lang.String} form.
   */
  public String toString()
  {
    return getClass().getName()
      + "[message=" + message 
      + ", sequenceNumber=" + sequenceNumber 
      + ", source=" + source 
      + ", timeStamp=" + timeStamp
      + ", type=" + type
      + ", userData=" + userData
      + "]";
  }

}

