- /*
- * @(#)OpenType.java 3.27 03/12/19
- *
- * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
- * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
- */
-
-
- package javax.management.openmbean;
-
-
- // java import
- //
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.Serializable;
-
- // jmx import
- //
-
-
- /**
- * The <code>OpenType</code> class is the parent abstract class of all classes which describe the actual <i>open type</i>
- * of open data values.
- * <p>
- * An <i>open type</i> is defined by:
- * <ul>
- * <li>the fully qualified Java class name of the open data values this type describes;
- * note that only a limited set of Java classes is allowed for open data values
- * (see {@link #ALLOWED_CLASSNAMES ALLOWED_CLASSNAMES}),</li>
- * <li>its name,</li>
- * <li>its description.</li>
- * </ul>
- *
- * @version 3.27 03/12/19
- * @author Sun Microsystems, Inc.
- *
- * @since 1.5
- * @since.unbundled JMX 1.1
- */
- public abstract class OpenType implements Serializable {
-
- /* Serial version */
- static final long serialVersionUID = -9195195325186646468L;
-
-
- /**
- * List of the fully qualified names of the Java classes allowed for open data values.
- * A multidimensional array of any one of these classes is also an allowed for open data values.
- *
- <pre>ALLOWED_CLASSNAMES = {
- "java.lang.Void",
- "java.lang.Boolean",
- "java.lang.Character",
- "java.lang.Byte",
- "java.lang.Short",
- "java.lang.Integer",
- "java.lang.Long",
- "java.lang.Float",
- "java.lang.Double",
- "java.lang.String",
- "java.math.BigDecimal",
- "java.math.BigInteger",
- "java.util.Date",
- "javax.management.ObjectName",
- CompositeData.class.getName(),
- TabularData.class.getName() } ;
- </pre>
- *
- */
- public static final String[] ALLOWED_CLASSNAMES = {
- "java.lang.Void",
- "java.lang.Boolean",
- "java.lang.Character",
- "java.lang.Byte",
- "java.lang.Short",
- "java.lang.Integer",
- "java.lang.Long",
- "java.lang.Float",
- "java.lang.Double",
- "java.lang.String",
- "java.math.BigDecimal",
- "java.math.BigInteger",
- "java.util.Date",
- "javax.management.ObjectName",
- CompositeData.class.getName(), // better refer to these two class names like this, rather than hardcoding a string,
- TabularData.class.getName() } ; // in case the package of these classes should change (who knows...)
-
-
- /**
- * @serial The fully qualified Java class name of open data values this type describes.
- */
- private String className;
-
- /**
- * @serial The type description (should not be null or empty).
- */
- private String description;
-
- /**
- * @serial The name given to this type (should not be null or empty).
- */
- private String typeName;
-
- /**
- * @serial Tells if this type describes an array (checked in constructor).
- */
- private transient boolean isArray = false;
-
-
- /* *** Constructor *** */
-
- /**
- * Constructs an <code>OpenType</code> instance (actually a subclass instance as <code>OpenType</code> is abstract),
- * checking for the validity of the given parameters.
- * The validity constraints are described below for each parameter.
- * <br>
- * @param className The fully qualified Java class name of the open data values this open type describes.
- * The valid Java class names allowed for open data values are listed in
- * {@link #ALLOWED_CLASSNAMES ALLOWED_CLASSNAMES}.
- * A multidimensional array of any one of these classes is also an allowed class,
- * in which case the class name follows the rules defined by the method
- * {@link Class#getName() getName()} of <code>java.lang.Class</code>.
- * For example, a 3-dimensional array of Strings has for class name
- * "<code>[[[Ljava.lang.String;</code>" (without the quotes).
- * <br>
- * @param typeName The name given to the open type this instance represents; cannot be a null or empty string.
- * <br>
- * @param description The human readable description of the open type this instance represents;
- * cannot be a null or empty string.
- * <br>
- * @throws IllegalArgumentException if <var>className</var>, <var>typeName</var> or <var>description</var>
- * is a null or empty string
- * <br>
- * @throws OpenDataException if <var>className</var> is not one of the allowed Java class names for open data
- */
- protected OpenType(String className,
- String typeName,
- String description) throws OpenDataException {
-
- // Check parameters that cannot be null or empty
- //
- if ( (className == null) || (className.trim().equals("")) ) {
- throw new IllegalArgumentException("Argument className cannot be null or empty.");
- }
- if ( (typeName == null) || (typeName.trim().equals("")) ) {
- throw new IllegalArgumentException("Argument typeName cannot be null or empty.");
- }
- if ( (description == null) || (description.trim().equals("")) ) {
- throw new IllegalArgumentException("Argument description cannot be null or empty.");
- }
-
- // remove leading and trailing white spaces, if any
- //
- className = className.trim();
- typeName = typeName.trim();
- description = description.trim();
-
- // Check if className describes an array class, and determines its elements' class name.
- // (eg: a 3-dimensional array of Strings has for class name: "[[[Ljava.lang.String;")
- //
- int n = 0;
- while (className.startsWith("[", n)) {
- n++;
- }
- String eltClassName; // class name of array elements
- boolean isArray = false;
- if (n > 0) {
- // removes the n leading '[' + the 'L' characters and the last ';' character
- eltClassName = className.substring(n+1, className.length()-1); // see javadoc of String.substring(begin,end)
- isArray = true;
- } else {
- // not an array
- eltClassName = className;
- }
-
- // Check that eltClassName's value is one of the allowed basic data types for open data
- //
- boolean ok = false;
- for (int i=0; i<ALLOWED_CLASSNAMES.length; i++) {
- if (ALLOWED_CLASSNAMES[i].equals(eltClassName)) {
- ok = true;
- break;
- }
- }
- if ( ! ok ) {
- throw new OpenDataException("Argument className=\""+ className +
- "\" is not one of the allowed Java class names for open data.");
- }
-
- // Now initializes this OpenType instance
- //
- this.className = className;
- this.typeName = typeName;
- this.description = description;
- this.isArray = isArray;
- }
-
-
- /* *** Open type information methods *** */
-
- /**
- * Returns the fully qualified Java class name of the open data values this open type describes.
- * The only possible Java class names for open data values are listed in
- * {@link #ALLOWED_CLASSNAMES ALLOWED_CLASSNAMES}.
- * A multidimensional array of any one of these classes is also an allowed class,
- * in which case the class name follows the rules defined by the method
- * {@link Class#getName() getName()} of <code>java.lang.Class</code>.
- * For example, a 3-dimensional array of Strings has for class name
- * "<code>[[[Ljava.lang.String;</code>" (without the quotes).
- *
- * @return the class name.
- */
- public String getClassName() {
-
- return className;
- }
-
- /**
- * Returns the name of this <code>OpenType</code> instance.
- *
- * @return the type name.
- */
- public String getTypeName() {
-
- return typeName;
- }
-
- /**
- * Returns the text description of this <code>OpenType</code> instance.
- *
- * @return the description.
- */
- public String getDescription() {
-
- return description;
- }
-
- /**
- * Returns <code>true</code> if the open data values this open
- * type describes are arrays, <code>false</code> otherwise.
- *
- * @return true if this is an array type.
- */
- public boolean isArray() {
-
- return isArray;
- }
-
- /**
- * Tests whether <var>obj</var> is a value for this open type.
- *
- * @param obj the object to be tested for validity.
- *
- * @return <code>true</code> if <var>obj</var> is a value for this
- * open type, <code>false</code> otherwise.
- */
- public abstract boolean isValue(Object obj) ;
-
-
- /* *** Methods overriden from class Object *** */
-
- /**
- * Compares the specified <code>obj</code> parameter with this
- * open type instance for equality.
- *
- * @param obj the object to compare to.
- *
- * @return true if this object and <code>obj</code> are equal.
- */
- public abstract boolean equals(Object obj) ;
-
- public abstract int hashCode() ;
-
- /**
- * Returns a string representation of this open type instance.
- *
- * @return the string representation.
- */
- public abstract String toString() ;
-
- /**
- * Deserializes an {@link OpenType} from an {@link ObjectInputStream}.
- */
- private void readObject(ObjectInputStream in)
- throws IOException, ClassNotFoundException {
- in.defaultReadObject();
- isArray = (className.startsWith("["));
- }
-
- }
-