Source for javax.management.MBeanAttributeInfo

   1: /* MBeanAttributeInfo.java -- Information about an attribute of a bean.
   2:    Copyright (C) 2006 Free Software Foundation, Inc.
   3: 
   4: This file is part of GNU Classpath.
   5: 
   6: GNU Classpath is free software; you can redistribute it and/or modify
   7: it under the terms of the GNU General Public License as published by
   8: the Free Software Foundation; either version 2, or (at your option)
   9: any later version.
  10: 
  11: GNU Classpath is distributed in the hope that it will be useful, but
  12: WITHOUT ANY WARRANTY; without even the implied warranty of
  13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14: General Public License for more details.
  15: 
  16: You should have received a copy of the GNU General Public License
  17: along with GNU Classpath; see the file COPYING.  If not, write to the
  18: Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  19: 02110-1301 USA.
  20: 
  21: Linking this library statically or dynamically with other modules is
  22: making a combined work based on this library.  Thus, the terms and
  23: conditions of the GNU General Public License cover the whole
  24: combination.
  25: 
  26: As a special exception, the copyright holders of this library give you
  27: permission to link this library with independent modules to produce an
  28: executable, regardless of the license terms of these independent
  29: modules, and to copy and distribute the resulting executable under
  30: terms of your choice, provided that you also meet, for each linked
  31: independent module, the terms and conditions of the license of that
  32: module.  An independent module is a module which is not derived from
  33: or based on this library.  If you modify this library, you may extend
  34: this exception to your version of the library, but you are not
  35: obligated to do so.  If you do not wish to do so, delete this
  36: exception statement from your version. */
  37: 
  38: package javax.management;
  39: 
  40: import java.lang.reflect.Method;
  41: import java.lang.reflect.Type;
  42: 
  43: /**
  44:  * Describes the attributes of a management bean.
  45:  * The information in this class is immutable as standard.
  46:  * Of course, subclasses may change this, but this
  47:  * behaviour is not recommended.
  48:  *
  49:  * @author Andrew John Hughes (gnu_andrew@member.fsf.org)
  50:  * @since 1.5
  51:  */
  52: public class MBeanAttributeInfo
  53:   extends MBeanFeatureInfo
  54:   implements Cloneable
  55: {
  56: 
  57:   /**
  58:    * Compatible with JDK 1.6
  59:    */
  60:   private static final long serialVersionUID = 8644704819898565848L;
  61: 
  62:   /**
  63:    * The type of the attribute.
  64:    *
  65:    * @serial the attribute type.
  66:    */
  67:   private String attributeType;
  68: 
  69:   /**
  70:    * True if the attribute's value can be changed.
  71:    *
  72:    * @serial true if the value can be changed.
  73:    */
  74:   private boolean isWrite;
  75: 
  76:   /**
  77:    * True if the attribute's value can be read.
  78:    *
  79:    * @serial true if the value can be read.
  80:    */
  81:   private boolean isRead;
  82: 
  83:   /**
  84:    * True if the attribute is a boolean and thus
  85:    * has a isXXX accessor rather than a getXXX accessor.
  86:    *
  87:    * @serial true if the attribute has an isXXX accessor.
  88:    */
  89:   private boolean is;
  90: 
  91:   /**
  92:    * Constructs a new {@link MBeanAttributeInfo} using the specified
  93:    * name and description, with the given accessor and mutator
  94:    * methods.  A <code>null</code> value for the accessor method
  95:    * indicates that the value can not be read.  A <code>null</code>
  96:    * value for the mutator method indicates that the value can not be
  97:    * changed.
  98:    *
  99:    * @param name the name of the attribute.
 100:    * @param desc a description of the attribute.
 101:    * @param getter the accessor method, or <code>null</code> if the value
 102:    *               can not be read.
 103:    * @param setter the mutator method, or <code>null</code> if the value
 104:    *               can not be changed.
 105:    * @throws IntrospectionException if both the accessor and mutator method
 106:    *                                are <code>null</code>.
 107:    */
 108:   public MBeanAttributeInfo(String name, String desc,
 109:                             Method getter, Method setter)
 110:     throws IntrospectionException
 111:   {
 112:     super(name, desc);
 113:     if (getter == null && setter == null)
 114:       throw new IntrospectionException("Both the getter and setter methods can " +
 115:                                        "not be null.");
 116:     if (getter == null)
 117:       {
 118:         Type t = setter.getGenericParameterTypes()[0];
 119:         if (t instanceof Class)
 120:           attributeType = ((Class<?>) t).getName();
 121:         else
 122:           attributeType = t.toString();
 123:         isRead = false;
 124:         is = false;
 125:       }
 126:     else
 127:       {
 128:         Type t = getter.getGenericReturnType();
 129:         if (t instanceof Class)
 130:           attributeType = ((Class<?>) t).getName();
 131:         else
 132:           attributeType = t.toString();
 133:         isRead = true;
 134:         is = getter.getName().startsWith("is");
 135:       }
 136:     if (setter != null)
 137:       isWrite = true;
 138:   }
 139: 
 140:   /**
 141:    * Constructs a new {@link MBeanAttributeInfo} using the specified
 142:    * name, description and type with the given settings for the accessor
 143:    * and mutator methods.
 144:    *
 145:    * @param name the name of the attribute.
 146:    * @param type the type of the attribute, in the form of its class name.
 147:    * @param desc a description of the attribute.
 148:    * @param isReadable true if the attribute's value can be read.
 149:    * @param isWritable true if the attribute's value can be changed.
 150:    * @param isIs true if the attribute uses an accessor of the form isXXX.
 151:    * @throws IllegalArgumentException if the attribute is both unreadable
 152:    *                                  and unwritable.
 153:    */
 154:   public MBeanAttributeInfo(String name, String type, String desc,
 155:                             boolean isReadable, boolean isWritable,
 156:                             boolean isIs)
 157:   {
 158:     super(name, desc);
 159:     if (!isReadable && !isWritable)
 160:       throw new IllegalArgumentException("The attribute can not be both " +
 161:                                          "unreadable and unwritable.");
 162:     attributeType = type;
 163:     isRead = isReadable;
 164:     isWrite = isWritable;
 165:     is = isIs;
 166:   }
 167: 
 168:   /**
 169:    * Returns a clone of this instance.  The clone is created
 170:    * using just the method provided by {@link java.lang.Object}.
 171:    * Thus, the clone is just a shallow clone as returned by
 172:    * that method, and does not contain any deeper cloning based
 173:    * on the subject of this class.
 174:    *
 175:    * @return a clone of this instance.
 176:    * @see java.lang.Cloneable
 177:    */
 178:   public Object clone()
 179:   {
 180:     try
 181:       {
 182:         return super.clone();
 183:       }
 184:     catch (CloneNotSupportedException e)
 185:       {
 186:         /* This shouldn't happen; we implement Cloneable */
 187:         throw new IllegalStateException("clone() called on " +
 188:                                         "non-cloneable object.");
 189:       }
 190:   }
 191: 
 192:   /**
 193:    * Compares this feature with the supplied object.  This
 194:    * returns true iff the object is an instance of
 195:    * {@link MBeanAttributeInfo}, {@link Object#equals()}
 196:    * returns true for a comparison of both the name and
 197:    * description of this attribute  with that of the specified
 198:    * object (performed by the superclass), and the type and
 199:    * boolean flags of the two instances are equal.
 200:    *
 201:    * @param obj the object to compare.
 202:    * @return true if the object is a {@link MBeanAttributeInfo}
 203:    *         instance,
 204:    *         <code>name.equals(object.getName())</code>,
 205:    *         <code>description.equals(object.getDescription())</code>,
 206:    *         <code>attributeType.equals(object.getType())</code>,
 207:    *         <code>isRead == object.isReadable()</code>,
 208:    *         <code>isWrite == object.isWritable()</code>,
 209:    *         <code>is == object.isIs()</code>
 210:    */
 211:   public boolean equals(Object obj)
 212:   {
 213:     if (!(obj instanceof MBeanAttributeInfo))
 214:       return false;
 215:     if (!(super.equals(obj)))
 216:       return false;
 217:     MBeanAttributeInfo o = (MBeanAttributeInfo) obj;
 218:     return (attributeType.equals(o.getType()) &&
 219:             isRead == o.isReadable() &&
 220:             isWrite == o.isWritable() &&
 221:             is == o.isIs());
 222:   }
 223: 
 224:   /**
 225:    * Returns the type of this attribute, in the form of its class name.
 226:    *
 227:    * @return the type of this attribute.
 228:    */
 229:   public String getType()
 230:   {
 231:     return attributeType;
 232:   }
 233: 
 234:   /**
 235:    * Returns the hashcode of the attribute information as the sum of
 236:    * the hashcode of the superclass, the hashcode of the type,
 237:    * the hashcode of {@link #isReadable()}, twice the hashcode
 238:    * of {@link #isWritable()} and four times the hashcode
 239:    * of {@link #isIs()}.
 240:    *
 241:    * @return the hashcode of the attribute information.
 242:    */
 243:   public int hashCode()
 244:   {
 245:     return super.hashCode() + attributeType.hashCode()
 246:       + Boolean.valueOf(isRead).hashCode()
 247:       + (2 * Boolean.valueOf(isWrite).hashCode())
 248:       + (4 * Boolean.valueOf(is).hashCode());
 249:   }
 250: 
 251:   /**
 252:    * Returns true if the accessor method of this attribute
 253:    * is of the form <code>isXXX</code>.
 254:    *
 255:    * @return true if the accessor takes the form <code>isXXX</code>.
 256:    */
 257:   public boolean isIs()
 258:   {
 259:     return is;
 260:   }
 261: 
 262:   /**
 263:    * Returns true if value of this attribute can be read.
 264:    *
 265:    * @return true if the value of the attribute can be read.
 266:    */
 267:   public boolean isReadable()
 268:   {
 269:     return isRead;
 270:   }
 271: 
 272:   /**
 273:    * Returns true if the value of this attribute can be changed.
 274:    *
 275:    * @return true if the value of the attribute can be changed.
 276:    */
 277:   public boolean isWritable()
 278:   {
 279:     return isWrite;
 280:   }
 281: 
 282:   /**
 283:    * <p>
 284:    * Returns a textual representation of this instance.  This
 285:    * is constructed using the class name
 286:    * (<code>javax.management.MBeanAttributeInfo</code>),
 287:    * the name, description and type of the attribute and the
 288:    * current settings of the {@link #isReadable()},
 289:    * {@link #isWritable()} and {@link #isIs()} properties.
 290:    * </p>
 291:    * <p>
 292:    * As instances of this class are immutable, the return value
 293:    * is computed just once for each instance and reused
 294:    * throughout its life.
 295:    * </p>
 296:    *
 297:    * @return a @link{java.lang.String} instance representing
 298:    *         the instance in textual form.
 299:    */
 300:   public String toString()
 301:   {
 302:     if (string == null)
 303:       {
 304:         super.toString();
 305:         string = string.substring(0, string.length() - 1)
 306:           + ",type=" + attributeType
 307:           + ",isReadable=" + (isRead ? "yes" : "no")
 308:           + ",isWritable=" + (isWrite ? "yes" : "no")
 309:           + ",isIs=" + (is ? "yes" : "no")
 310:           + "]";
 311:       }
 312:     return string;
 313:   }
 314: 
 315: }