Use Tree Navigation
public class

RoleInfo

extends Object
implements Serializable
/*
 * Copyright (c) 2000, 2006, 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.relation;


import com.sun.jmx.mbeanserver.GetPropertyAction;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.ObjectStreamField;
import java.io.Serializable;
import java.security.AccessController;

import javax.management.MBeanServer;

import javax.management.NotCompliantMBeanException;

/**
 * A RoleInfo object summarises a role in a relation type.
 *
 * <p>The <b>serialVersionUID</b> of this class is <code>2504952983494636987L</code>.
 *
 * @since 1.5
 */

@SuppressWarnings("serial")  // serialVersionUID not constant
public class RoleInfo implements Serializable {

   
// 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 = 7227256952085334351L;
   
//
   
// Serial version for new serial form
   
private static final long newSerialVersionUID = 2504952983494636987L;
   
//
   
// Serializable fields in old serial form
   
private static final ObjectStreamField[] oldSerialPersistentFields =
   
{
     
new ObjectStreamField("myName", String.class),
     
new ObjectStreamField("myIsReadableFlg", boolean.class),
     
new ObjectStreamField("myIsWritableFlg", boolean.class),
     
new ObjectStreamField("myDescription", String.class),
     
new ObjectStreamField("myMinDegree", int.class),
     
new ObjectStreamField("myMaxDegree", int.class),
     
new ObjectStreamField("myRefMBeanClassName", String.class)
   
};
   
//
   
// Serializable fields in new serial form
   
private static final ObjectStreamField[] newSerialPersistentFields =
   
{
     
new ObjectStreamField("name", String.class),
     
new ObjectStreamField("isReadable", boolean.class),
     
new ObjectStreamField("isWritable", boolean.class),
     
new ObjectStreamField("description", String.class),
     
new ObjectStreamField("minDegree", int.class),
     
new ObjectStreamField("maxDegree", int.class),
     
new ObjectStreamField("referencedMBeanClassName", String.class)
   
};
   
//
   
// Actual serial version and serial form
   
private static final long serialVersionUID;
   
/**
     * @serialField name String Role name
     * @serialField isReadable boolean Read access mode: <code>true</code> if role is readable
     * @serialField isWritable boolean Write access mode: <code>true</code> if role is writable
     * @serialField description String Role description
     * @serialField minDegree int Minimum degree (i.e. minimum number of referenced MBeans in corresponding role)
     * @serialField maxDegree int Maximum degree (i.e. maximum number of referenced MBeans in corresponding role)
     * @serialField referencedMBeanClassName String Name of class of MBean(s) expected to be referenced in corresponding role
     */

   
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 : Too bad, no compat with 1.0
       
}
       
if (compat) {
            serialPersistentFields
= oldSerialPersistentFields;
            serialVersionUID
= oldSerialVersionUID;
       
} else {
            serialPersistentFields
= newSerialPersistentFields;
            serialVersionUID
= newSerialVersionUID;
       
}
   
}
   
//
   
// END Serialization compatibility stuff

   
//
   
// Public constants
   
//

   
/**
     * To specify an unlimited cardinality.
     */

   
public static final int ROLE_CARDINALITY_INFINITY = -1;

   
//
   
// Private members
   
//

   
/**
     * @serial Role name
     */

   
private String name = null;

   
/**
     * @serial Read access mode: <code>true</code> if role is readable
     */

   
private boolean isReadable;

   
/**
     * @serial Write access mode: <code>true</code> if role is writable
     */

   
private boolean isWritable;

   
/**
     * @serial Role description
     */

   
private String description = null;

   
/**
     * @serial Minimum degree (i.e. minimum number of referenced MBeans in corresponding role)
     */

   
private int minDegree;

   
/**
     * @serial Maximum degree (i.e. maximum number of referenced MBeans in corresponding role)
     */

   
private int maxDegree;

   
/**
     * @serial Name of class of MBean(s) expected to be referenced in corresponding role
     */

   
private String referencedMBeanClassName = null;

   
//
   
// Constructors
   
//

   
/**
     * Constructor.
     *
     * @param roleName  name of the role.
     * @param mbeanClassName  name of the class of MBean(s) expected to
     * be referenced in corresponding role.  If an MBean <em>M</em> is in
     * this role, then the MBean server must return true for
     * {@link MBeanServer#isInstanceOf isInstanceOf(M, mbeanClassName)}.
     * @param read  flag to indicate if the corresponding role
     * can be read
     * @param write  flag to indicate if the corresponding role
     * can be set
     * @param min  minimum degree for role, i.e. minimum number of
     * MBeans to provide in corresponding role
     * Must be less than or equal to <tt>max</tt>.
     * (ROLE_CARDINALITY_INFINITY for unlimited)
     * @param max  maximum degree for role, i.e. maximum number of
     * MBeans to provide in corresponding role
     * Must be greater than or equal to <tt>min</tt>
     * (ROLE_CARDINALITY_INFINITY for unlimited)
     * @param descr  description of the role (can be null)
     *
     * @exception IllegalArgumentException  if null parameter
     * @exception InvalidRoleInfoException  if the minimum degree is
     * greater than the maximum degree.
     * @exception ClassNotFoundException As of JMX 1.2, this exception
     * can no longer be thrown.  It is retained in the declaration of
     * this class for compatibility with existing code.
     * @exception NotCompliantMBeanException  if the class mbeanClassName
     * is not a MBean class.
     */

   
public RoleInfo(String roleName,
                   
String mbeanClassName,
                   
boolean read,
                   
boolean write,
                   
int min,
                   
int max,
                   
String descr)
   
throws IllegalArgumentException,
           
InvalidRoleInfoException,
           
ClassNotFoundException,
           
NotCompliantMBeanException {

        init
(roleName,
             mbeanClassName
,
             read
,
             write
,
             min
,
             max
,
             descr
);
       
return;
   
}

   
/**
     * Constructor.
     *
     * @param roleName  name of the role
     * @param mbeanClassName  name of the class of MBean(s) expected to
     * be referenced in corresponding role.  If an MBean <em>M</em> is in
     * this role, then the MBean server must return true for
     * {@link MBeanServer#isInstanceOf isInstanceOf(M, mbeanClassName)}.
     * @param read  flag to indicate if the corresponding role
     * can be read
     * @param write  flag to indicate if the corresponding role
     * can be set
     *
     * <P>Minimum and maximum degrees defaulted to 1.
     * <P>Description of role defaulted to null.
     *
     * @exception IllegalArgumentException  if null parameter
     * @exception ClassNotFoundException As of JMX 1.2, this exception
     * can no longer be thrown.  It is retained in the declaration of
     * this class for compatibility with existing code.
     * @exception NotCompliantMBeanException As of JMX 1.2, this
     * exception can no longer be thrown.  It is retained in the
     * declaration of this class for compatibility with existing code.
     */

   
public RoleInfo(String roleName,
                   
String mbeanClassName,
                   
boolean read,
                   
boolean write)
   
throws IllegalArgumentException,
           
ClassNotFoundException,
           
NotCompliantMBeanException {

       
try {
            init
(roleName,
                 mbeanClassName
,
                 read
,
                 write
,
                 
1,
                 
1,
                 
null);
       
} catch (InvalidRoleInfoException exc) {
           
// OK : Can never happen as the minimum
           
//      degree equals the maximum degree.
       
}

       
return;
   
}

   
/**
     * Constructor.
     *
     * @param roleName  name of the role
     * @param mbeanClassName  name of the class of MBean(s) expected to
     * be referenced in corresponding role.  If an MBean <em>M</em> is in
     * this role, then the MBean server must return true for
     * {@link MBeanServer#isInstanceOf isInstanceOf(M, mbeanClassName)}.
     *
     * <P>IsReadable and IsWritable defaulted to true.
     * <P>Minimum and maximum degrees defaulted to 1.
     * <P>Description of role defaulted to null.
     *
     * @exception IllegalArgumentException  if null parameter
     * @exception ClassNotFoundException As of JMX 1.2, this exception
     * can no longer be thrown.  It is retained in the declaration of
     * this class for compatibility with existing code.
     * @exception NotCompliantMBeanException As of JMX 1.2, this
     * exception can no longer be thrown.  It is retained in the
     * declaration of this class for compatibility with existing code.
      */

   
public RoleInfo(String roleName,
                   
String mbeanClassName)
   
throws IllegalArgumentException,
           
ClassNotFoundException,
           
NotCompliantMBeanException {

       
try {
            init
(roleName,
                 mbeanClassName
,
                 
true,
                 
true,
                 
1,
                 
1,
                 
null);
       
} catch (InvalidRoleInfoException exc) {
           
// OK : Can never happen as the minimum
           
//      degree equals the maximum degree.
       
}

       
return;
   
}

   
/**
     * Copy constructor.
     *
     * @param roleInfo the <tt>RoleInfo</tt> instance to be copied.
     *
     * @exception IllegalArgumentException  if null parameter
     */

   
public RoleInfo(RoleInfo roleInfo)
       
throws IllegalArgumentException {

       
if (roleInfo == null) {
           
// Revisit [cebro] Localize message
           
String excMsg = "Invalid parameter.";
           
throw new IllegalArgumentException(excMsg);
       
}

       
try {
            init
(roleInfo.getName(),
                 roleInfo
.getRefMBeanClassName(),
                 roleInfo
.isReadable(),
                 roleInfo
.isWritable(),
                 roleInfo
.getMinDegree(),
                 roleInfo
.getMaxDegree(),
                 roleInfo
.getDescription());
       
} catch (InvalidRoleInfoException exc3) {
           
// OK : Can never happen as the minimum degree and the maximum
           
//      degree were already checked at the time the roleInfo
           
//      instance was created.
       
}
   
}

   
//
   
// Accessors
   
//

   
/**
     * Returns the name of the role.
     *
     * @return the name of the role.
     */

   
public String getName() {
       
return name;
   
}

   
/**
     * Returns read access mode for the role (true if it is readable).
     *
     * @return true if the role is readable.
     */

   
public boolean isReadable() {
       
return isReadable;
   
}

   
/**
     * Returns write access mode for the role (true if it is writable).
     *
     * @return true if the role is writable.
     */

   
public boolean isWritable() {
       
return isWritable;
   
}

   
/**
     * Returns description text for the role.
     *
     * @return the description of the role.
     */

   
public String getDescription() {
       
return description;
   
}

   
/**
     * Returns minimum degree for corresponding role reference.
     *
     * @return the minimum degree.
     */

   
public int getMinDegree() {
       
return minDegree;
   
}

   
/**
     * Returns maximum degree for corresponding role reference.
     *
     * @return the maximum degree.
     */

   
public int getMaxDegree() {
       
return maxDegree;
   
}

   
/**
     * <p>Returns name of type of MBean expected to be referenced in
     * corresponding role.</p>
     *
     * @return the name of the referenced type.
     */

   
public String getRefMBeanClassName() {
       
return referencedMBeanClassName;
   
}

   
/**
     * Returns true if the <tt>value</tt> parameter is greater than or equal to
     * the expected minimum degree, false otherwise.
     *
     * @param value  the value to be checked
     *
     * @return true if greater than or equal to minimum degree, false otherwise.
     */

   
public boolean checkMinDegree(int value) {
       
if (value >= ROLE_CARDINALITY_INFINITY &&
           
(minDegree == ROLE_CARDINALITY_INFINITY
             
|| value >= minDegree)) {
           
return true;
       
} else {
           
return false;
       
}
   
}

   
/**
     * Returns true if the <tt>value</tt> parameter is lower than or equal to
     * the expected maximum degree, false otherwise.
     *
     * @param value  the value to be checked
     *
     * @return true if lower than or equal to maximum degree, false otherwise.
     */

   
public boolean checkMaxDegree(int value) {
       
if (value >= ROLE_CARDINALITY_INFINITY &&
           
(maxDegree == ROLE_CARDINALITY_INFINITY ||
             
(value != ROLE_CARDINALITY_INFINITY &&
              value
<= maxDegree))) {
           
return true;
       
} else {
           
return false;
       
}
   
}

   
/**
     * Returns a string describing the role info.
     *
     * @return a description of the role info.
     */

   
public String toString() {
       
StringBuilder result = new StringBuilder();
        result
.append("role info name: " + name);
        result
.append("; isReadable: " + isReadable);
        result
.append("; isWritable: " + isWritable);
        result
.append("; description: " + description);
        result
.append("; minimum degree: " + minDegree);
        result
.append("; maximum degree: " + maxDegree);
        result
.append("; MBean class: " + referencedMBeanClassName);
       
return result.toString();
   
}

   
//
   
// Misc
   
//

   
// Initialization
   
private void init(String roleName,
                     
String mbeanClassName,
                     
boolean read,
                     
boolean write,
                     
int min,
                     
int max,
                     
String descr)
           
throws IllegalArgumentException,
                   
InvalidRoleInfoException {

       
if (roleName == null ||
            mbeanClassName
== null) {
           
// Revisit [cebro] Localize message
           
String excMsg = "Invalid parameter.";
           
throw new IllegalArgumentException(excMsg);
       
}

        name
= roleName;
        isReadable
= read;
        isWritable
= write;
       
if (descr != null) {
            description
= descr;
       
}

       
boolean invalidRoleInfoFlg = false;
       
StringBuilder excMsgStrB = new StringBuilder();
       
if (max != ROLE_CARDINALITY_INFINITY &&
           
(min == ROLE_CARDINALITY_INFINITY ||
             min
> max)) {
           
// Revisit [cebro] Localize message
            excMsgStrB
.append("Minimum degree ");
            excMsgStrB
.append(min);
            excMsgStrB
.append(" is greater than maximum degree ");
            excMsgStrB
.append(max);
            invalidRoleInfoFlg
= true;

       
} else if (min < ROLE_CARDINALITY_INFINITY ||
                   max
< ROLE_CARDINALITY_INFINITY) {
           
// Revisit [cebro] Localize message
            excMsgStrB
.append("Minimum or maximum degree has an illegal value, must be [0, ROLE_CARDINALITY_INFINITY].");
            invalidRoleInfoFlg
= true;
       
}
       
if (invalidRoleInfoFlg) {
           
throw new InvalidRoleInfoException(excMsgStrB.toString());
       
}
        minDegree
= min;
        maxDegree
= max;

        referencedMBeanClassName
= mbeanClassName;

       
return;
   
}

   
/**
     * Deserializes a {@link RoleInfo} from an {@link ObjectInputStream}.
     */

   
private void readObject(ObjectInputStream in)
           
throws IOException, ClassNotFoundException {
     
if (compat)
     
{
       
// Read an object serialized in the old serial form
       
//
       
ObjectInputStream.GetField fields = in.readFields();
        name
= (String) fields.get("myName", null);
       
if (fields.defaulted("myName"))
       
{
         
throw new NullPointerException("myName");
       
}
        isReadable
= fields.get("myIsReadableFlg", false);
       
if (fields.defaulted("myIsReadableFlg"))
       
{
         
throw new NullPointerException("myIsReadableFlg");
       
}
        isWritable
= fields.get("myIsWritableFlg", false);
       
if (fields.defaulted("myIsWritableFlg"))
       
{
         
throw new NullPointerException("myIsWritableFlg");
       
}
        description
= (String) fields.get("myDescription", null);
       
if (fields.defaulted("myDescription"))
       
{
         
throw new NullPointerException("myDescription");
       
}
        minDegree
= fields.get("myMinDegree", 0);
       
if (fields.defaulted("myMinDegree"))
       
{
         
throw new NullPointerException("myMinDegree");
       
}
        maxDegree
= fields.get("myMaxDegree", 0);
       
if (fields.defaulted("myMaxDegree"))
       
{
         
throw new NullPointerException("myMaxDegree");
       
}
        referencedMBeanClassName
= (String) fields.get("myRefMBeanClassName", null);
       
if (fields.defaulted("myRefMBeanClassName"))
       
{
         
throw new NullPointerException("myRefMBeanClassName");
       
}
     
}
     
else
     
{
       
// Read an object serialized in the new serial form
       
//
       
in.defaultReadObject();
     
}
   
}


   
/**
     * Serializes a {@link RoleInfo} 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("myName", name);
        fields
.put("myIsReadableFlg", isReadable);
        fields
.put("myIsWritableFlg", isWritable);
        fields
.put("myDescription", description);
        fields
.put("myMinDegree", minDegree);
        fields
.put("myMaxDegree", maxDegree);
        fields
.put("myRefMBeanClassName", referencedMBeanClassName);
       
out.writeFields();
     
}
     
else
     
{
       
// Serializes this instance in the new serial form
       
//
       
out.defaultWriteObject();
     
}
   
}

}