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 |