Save This Page
Home » openjdk-7 » javax » management » [javadoc | source]
    1   /*
    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   
   26   package javax.management;
   27   
   28   import 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    */
   57   public 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   }

Save This Page
Home » openjdk-7 » javax » management » [javadoc | source]