< prev index next >

src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java

Print this page




  62 
  63 import javax.management.JMX;
  64 import javax.management.ObjectName;
  65 import javax.management.openmbean.ArrayType;
  66 import javax.management.openmbean.CompositeData;
  67 import javax.management.openmbean.CompositeDataInvocationHandler;
  68 import javax.management.openmbean.CompositeDataSupport;
  69 import javax.management.openmbean.CompositeDataView;
  70 import javax.management.openmbean.CompositeType;
  71 import javax.management.openmbean.OpenDataException;
  72 import javax.management.openmbean.OpenType;
  73 import javax.management.openmbean.SimpleType;
  74 import javax.management.openmbean.TabularData;
  75 import javax.management.openmbean.TabularDataSupport;
  76 import javax.management.openmbean.TabularType;
  77 import sun.reflect.misc.MethodUtil;
  78 import sun.reflect.misc.ReflectUtil;
  79 
  80 /**
  81  *   <p>A converter between Java types and the limited set of classes
  82  *   defined by Open MBeans.</p>
  83  *
  84  *   <p>A Java type is an instance of java.lang.reflect.Type.  For our
  85  *   purposes, it is either a Class, such as String.class or int.class;
  86  *   or a ParameterizedType, such as List<String> or Map<Integer,
  87  *   String[]>.  On J2SE 1.4 and earlier, it can only be a Class.</p>

  88  *
  89  *   <p>Each Type is associated with an DefaultMXBeanMappingFactory.  The
  90  *   DefaultMXBeanMappingFactory defines an OpenType corresponding to the Type, plus a
  91  *   Java class corresponding to the OpenType.  For example:</p>

  92  *
  93  *   <pre>
  94  *   Type                     Open class     OpenType
  95  *   ----                     ----------     --------
  96  *   Integer                Integer        SimpleType.INTEGER
  97  *   int                            int            SimpleType.INTEGER
  98  *   Integer[]              Integer[]      ArrayType(1, SimpleType.INTEGER)
  99  *   int[]                  Integer[]      ArrayType(SimpleType.INTEGER, true)
 100  *   String[][]             String[][]     ArrayType(2, SimpleType.STRING)
 101  *   List<String>                   String[]       ArrayType(1, SimpleType.STRING)
 102  *   ThreadState (an Enum)    String         SimpleType.STRING
 103  *   Map<Integer, String[]>   TabularData          TabularType(
 104  *                                           CompositeType(
 105  *                                             {"key", SimpleType.INTEGER},
 106  *                                             {"value",
 107  *                                               ArrayType(1,
 108  *                                                SimpleType.STRING)}),
 109  *                                           indexNames={"key"})
 110  *   </pre>
 111  *
 112  *   <p>Apart from simple types, arrays, and collections, Java types are
 113  *   converted through introspection into CompositeType.  The Java type
 114  *   must have at least one getter (method such as "int getSize()" or
 115  *   "boolean isBig()"), and we must be able to deduce how to
 116  *   reconstruct an instance of the Java class from the values of the
 117  *   getters using one of various heuristics.</p>
 118  *
 119  * @since 1.6
 120  */
 121 public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory {
 122     static abstract class NonNullMXBeanMapping extends MXBeanMapping {
 123         NonNullMXBeanMapping(Type javaType, OpenType<?> openType) {
 124             super(javaType, openType);
 125         }
 126 
 127         @Override
 128         public final Object fromOpenValue(Object openValue)
 129         throws InvalidObjectException {
 130             if (openValue == null)
 131                 return null;
 132             else
 133                 return fromNonNullOpenValue(openValue);
 134         }
 135 
 136         @Override
 137         public final Object toOpenValue(Object javaValue) throws OpenDataException {
 138             if (javaValue == null)
 139                 return null;
 140             else
 141                 return toNonNullOpenValue(javaValue);
 142         }
 143 
 144         abstract Object fromNonNullOpenValue(Object openValue)
 145         throws InvalidObjectException;
 146 
 147         abstract Object toNonNullOpenValue(Object javaValue)
 148         throws OpenDataException;
 149 
 150         /**
 151          * <p>True if and only if this MXBeanMapping's toOpenValue and
 152          * fromOpenValue methods are the identity function.</p>
 153          */
 154         boolean isIdentity() {
 155             return false;
 156         }
 157     }
 158 
 159     static boolean isIdentity(MXBeanMapping mapping) {
 160         return (mapping instanceof NonNullMXBeanMapping &&
 161                 ((NonNullMXBeanMapping) mapping).isIdentity());
 162     }
 163 
 164     private static final class Mappings
 165         extends WeakHashMap<Type, WeakReference<MXBeanMapping>> {}
 166 
 167     private static final Mappings mappings = new Mappings();
 168 
 169     /** Following List simply serves to keep a reference to predefined
 170         MXBeanMappings so they don't get garbage collected. */
 171     private static final List<MXBeanMapping> permanentMappings = newList();
 172 




  62 
  63 import javax.management.JMX;
  64 import javax.management.ObjectName;
  65 import javax.management.openmbean.ArrayType;
  66 import javax.management.openmbean.CompositeData;
  67 import javax.management.openmbean.CompositeDataInvocationHandler;
  68 import javax.management.openmbean.CompositeDataSupport;
  69 import javax.management.openmbean.CompositeDataView;
  70 import javax.management.openmbean.CompositeType;
  71 import javax.management.openmbean.OpenDataException;
  72 import javax.management.openmbean.OpenType;
  73 import javax.management.openmbean.SimpleType;
  74 import javax.management.openmbean.TabularData;
  75 import javax.management.openmbean.TabularDataSupport;
  76 import javax.management.openmbean.TabularType;
  77 import sun.reflect.misc.MethodUtil;
  78 import sun.reflect.misc.ReflectUtil;
  79 
  80 /**
  81  *   <p>A converter between Java types and the limited set of classes
  82  *   defined by Open MBeans.
  83  *
  84  *   <p>A Java type is an instance of java.lang.reflect.Type. For our
  85  *   purposes, it is either a Class, such as String.class or int.class;
  86  *   or a ParameterizedType, such as {@code List<String>} or
  87  *   {@code Map<Integer, String[]>}.
  88  *   On J2SE 1.4 and earlier, it can only be a Class.
  89  *
  90  *   <p>Each Type is associated with an DefaultMXBeanMappingFactory. The
  91  *   DefaultMXBeanMappingFactory defines an
  92  *   OpenType corresponding to the Type, plus a
  93  *   Java class corresponding to the OpenType. For example:
  94  *
  95  *   <pre>{@code
  96  *   Type                     Open class     OpenType
  97  *   ----                     ----------     --------
  98  *   Integer                  Integer        SimpleType.INTEGER
  99  *   int                      int            SimpleType.INTEGER
 100  *   Integer[]                Integer[]      ArrayType(1, SimpleType.INTEGER)
 101  *   int[]                    Integer[]      ArrayType(SimpleType.INTEGER, true)
 102  *   String[][]               String[][]     ArrayType(2, SimpleType.STRING)
 103  *   List<String>             String[]       ArrayType(1, SimpleType.STRING)
 104  *   ThreadState (an Enum)    String         SimpleType.STRING
 105  *   Map<Integer, String[]>   TabularData    TabularType(
 106  *                                           CompositeType(
 107  *                                             {"key", SimpleType.INTEGER},
 108  *                                             {"value",
 109  *                                               ArrayType(1,
 110  *                                                SimpleType.STRING)}),
 111  *                                           indexNames={"key"})
 112  *   }</pre>
 113  *
 114  *   <p>Apart from simple types, arrays, and collections, Java types are
 115  *   converted through introspection into CompositeType.  The Java type
 116  *   must have at least one getter (method such as "int getSize()" or
 117  *   "boolean isBig()"), and we must be able to deduce how to
 118  *   reconstruct an instance of the Java class from the values of the
 119  *   getters using one of various heuristics.
 120  *
 121  *  @since 1.6
 122  */
 123 public class DefaultMXBeanMappingFactory extends MXBeanMappingFactory {
 124     static abstract class NonNullMXBeanMapping extends MXBeanMapping {
 125         NonNullMXBeanMapping(Type javaType, OpenType<?> openType) {
 126             super(javaType, openType);
 127         }
 128 
 129         @Override
 130         public final Object fromOpenValue(Object openValue)
 131         throws InvalidObjectException {
 132             if (openValue == null)
 133                 return null;
 134             else
 135                 return fromNonNullOpenValue(openValue);
 136         }
 137 
 138         @Override
 139         public final Object toOpenValue(Object javaValue) throws OpenDataException {
 140             if (javaValue == null)
 141                 return null;
 142             else
 143                 return toNonNullOpenValue(javaValue);
 144         }
 145 
 146         abstract Object fromNonNullOpenValue(Object openValue)
 147         throws InvalidObjectException;
 148 
 149         abstract Object toNonNullOpenValue(Object javaValue)
 150         throws OpenDataException;
 151 
 152         /**
 153          * True if and only if this MXBeanMapping's toOpenValue and
 154          * fromOpenValue methods are the identity function.
 155          */
 156         boolean isIdentity() {
 157             return false;
 158         }
 159     }
 160 
 161     static boolean isIdentity(MXBeanMapping mapping) {
 162         return (mapping instanceof NonNullMXBeanMapping &&
 163                 ((NonNullMXBeanMapping) mapping).isIdentity());
 164     }
 165 
 166     private static final class Mappings
 167         extends WeakHashMap<Type, WeakReference<MXBeanMapping>> {}
 168 
 169     private static final Mappings mappings = new Mappings();
 170 
 171     /** Following List simply serves to keep a reference to predefined
 172         MXBeanMappings so they don't get garbage collected. */
 173     private static final List<MXBeanMapping> permanentMappings = newList();
 174 


< prev index next >