# HG changeset patch # User amurillo # Date 1432838234 25200 # Node ID c064fa28311d0ee3363cbc5372677335c135598b # Parent 56133cf1bf0071abfade474a2297aa77605d52af# Parent 1b67cbb0adcee297f6bfdb908046dbac4471a9ce Merge diff -r 56133cf1bf00 -r c064fa28311d jdk/src/java.base/share/classes/sun/misc/JavaBeansAccess.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.base/share/classes/sun/misc/JavaBeansAccess.java Thu May 28 11:37:14 2015 -0700 @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2014, 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 sun.misc; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; + +public interface JavaBeansAccess { + /** + * Returns the getter method for a property of the given name + * @param clazz The JavaBeans class + * @param property The property name + * @return The resolved property getter method + * @throws Exception + */ + Method getReadMethod(Class clazz, String property) throws Exception; + + /** + * Return the value attribute of the associated + * @ConstructorProperties annotation if that is present. + * @param ctr The constructor to extract the annotation value from + * @return The {@code value} attribute of the @ConstructorProperties + * annotation or {@code null} if the constructor is not annotated by + * this annotation or the annotation is not accessible. + */ + String[] getConstructorPropertiesValue(Constructor ctr); +} diff -r 56133cf1bf00 -r c064fa28311d jdk/src/java.base/share/classes/sun/misc/JavaBeansIntrospectorAccess.java --- a/jdk/src/java.base/share/classes/sun/misc/JavaBeansIntrospectorAccess.java Thu May 28 10:00:51 2015 -0700 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2014, 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 sun.misc; - -import java.lang.reflect.Method; - -public interface JavaBeansIntrospectorAccess { - Method getReadMethod(Class clazz, String property) throws Exception; -} diff -r 56133cf1bf00 -r c064fa28311d jdk/src/java.base/share/classes/sun/misc/SharedSecrets.java --- a/jdk/src/java.base/share/classes/sun/misc/SharedSecrets.java Thu May 28 10:00:51 2015 -0700 +++ b/jdk/src/java.base/share/classes/sun/misc/SharedSecrets.java Thu May 28 11:37:14 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2002, 2015, 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 @@ -56,7 +56,7 @@ private static JavaUtilZipFileAccess javaUtilZipFileAccess; private static JavaAWTAccess javaAWTAccess; private static JavaAWTFontAccess javaAWTFontAccess; - private static JavaBeansIntrospectorAccess javaBeansIntrospectorAccess; + private static JavaBeansAccess javaBeansAccess; public static JavaUtilJarAccess javaUtilJarAccess() { if (javaUtilJarAccess == null) { @@ -194,11 +194,11 @@ return javaAWTFontAccess; } - public static JavaBeansIntrospectorAccess getJavaBeansIntrospectorAccess() { - return javaBeansIntrospectorAccess; + public static JavaBeansAccess getJavaBeansAccess() { + return javaBeansAccess; } - public static void setJavaBeansIntrospectorAccess(JavaBeansIntrospectorAccess access) { - javaBeansIntrospectorAccess = access; + public static void setJavaBeansAccess(JavaBeansAccess access) { + javaBeansAccess = access; } } diff -r 56133cf1bf00 -r c064fa28311d jdk/src/java.desktop/share/classes/java/beans/Introspector.java --- a/jdk/src/java.desktop/share/classes/java/beans/Introspector.java Thu May 28 10:00:51 2015 -0700 +++ b/jdk/src/java.desktop/share/classes/java/beans/Introspector.java Thu May 28 11:37:14 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1996, 2014, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1996, 2015, 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 @@ -35,16 +35,19 @@ import java.lang.ref.Reference; import java.lang.ref.SoftReference; +import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Type; import java.util.Map; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import java.util.EventObject; import java.util.List; import java.util.TreeMap; +import sun.misc.JavaBeansAccess; import sun.misc.SharedSecrets; import sun.reflect.misc.ReflectUtil; @@ -146,15 +149,25 @@ // register with SharedSecrets for JMX usage static { - SharedSecrets.setJavaBeansIntrospectorAccess((clazz, property) -> { - BeanInfo bi = Introspector.getBeanInfo(clazz); - PropertyDescriptor[] pds = bi.getPropertyDescriptors(); - for (PropertyDescriptor pd: pds) { - if (pd.getName().equals(property)) { - return pd.getReadMethod(); + SharedSecrets.setJavaBeansAccess(new JavaBeansAccess() { + @Override + public Method getReadMethod(Class clazz, String property) throws Exception { + BeanInfo bi = Introspector.getBeanInfo(clazz); + PropertyDescriptor[] pds = bi.getPropertyDescriptors(); + for (PropertyDescriptor pd: pds) { + if (pd.getName().equals(property)) { + return pd.getReadMethod(); + } } + return null; } - return null; + + @Override + public String[] getConstructorPropertiesValue(Constructor ctr) { + ConstructorProperties cp = ctr.getAnnotation(ConstructorProperties.class); + String [] ret = cp != null ? cp.value() : null; + return ret; + } }); } diff -r 56133cf1bf00 -r c064fa28311d jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java --- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java Thu May 28 10:00:51 2015 -0700 +++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/DefaultMXBeanMappingFactory.java Thu May 28 11:37:14 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2005, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2005, 2015, 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 @@ -33,14 +33,12 @@ import com.sun.jmx.remote.util.EnvHelp; import java.io.InvalidObjectException; -import java.lang.annotation.Annotation; import java.lang.annotation.ElementType; import java.lang.ref.WeakReference; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.GenericArrayType; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.lang.reflect.ParameterizedType; @@ -1138,55 +1136,13 @@ to getters. */ private static final class CompositeBuilderViaConstructor extends CompositeBuilder { - static class AnnotationHelper { - private static Class constructorPropertiesClass; - private static Method valueMethod; - static { - findConstructorPropertiesClass(); - } - - @SuppressWarnings("unchecked") - private static void findConstructorPropertiesClass() { - try { - constructorPropertiesClass = (Class) - Class.forName("java.beans.ConstructorProperties", false, - DefaultMXBeanMappingFactory.class.getClassLoader()); - valueMethod = constructorPropertiesClass.getMethod("value"); - } catch (ClassNotFoundException cnf) { - // java.beans not present - } catch (NoSuchMethodException e) { - // should not reach here - throw new InternalError(e); - } - } - - static boolean isAvailable() { - return constructorPropertiesClass != null; - } - - static String[] getPropertyNames(Constructor constr) { - if (!isAvailable()) - return null; - - Annotation a = constr.getAnnotation(constructorPropertiesClass); - if (a == null) return null; - - try { - return (String[]) valueMethod.invoke(a); - } catch (InvocationTargetException e) { - throw new InternalError(e); - } catch (IllegalAccessException e) { - throw new InternalError(e); - } - } - } CompositeBuilderViaConstructor(Class targetClass, String[] itemNames) { super(targetClass, itemNames); } String applicable(Method[] getters) throws InvalidObjectException { - if (!AnnotationHelper.isAvailable()) + if (!JavaBeansAccessor.isAvailable()) return "@ConstructorProperties annotation not available"; Class targetClass = getTargetClass(); @@ -1196,7 +1152,7 @@ List> annotatedConstrList = newList(); for (Constructor constr : constrs) { if (Modifier.isPublic(constr.getModifiers()) - && AnnotationHelper.getPropertyNames(constr) != null) + && JavaBeansAccessor.getConstructorPropertiesValue(constr) != null) annotatedConstrList.add(constr); } @@ -1225,7 +1181,7 @@ // so we can test unambiguity. Set getterIndexSets = newSet(); for (Constructor constr : annotatedConstrList) { - String[] propertyNames = AnnotationHelper.getPropertyNames(constr); + String[] propertyNames = JavaBeansAccessor.getConstructorPropertiesValue(constr); Type[] paramTypes = constr.getGenericParameterTypes(); if (paramTypes.length != propertyNames.length) { diff -r 56133cf1bf00 -r c064fa28311d jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/Introspector.java --- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/Introspector.java Thu May 28 10:00:51 2015 -0700 +++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/Introspector.java Thu May 28 11:37:14 2015 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2015, 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 @@ -56,7 +56,7 @@ import javax.management.AttributeNotFoundException; import javax.management.openmbean.CompositeData; -import sun.misc.JavaBeansIntrospectorAccess; +import sun.misc.JavaBeansAccess; import sun.misc.SharedSecrets; import sun.reflect.misc.MethodUtil; import sun.reflect.misc.ReflectUtil; @@ -552,10 +552,8 @@ // Java Beans introspection // Class clazz = complex.getClass(); - Method readMethod; - if (BeansIntrospector.isAvailable()) { - readMethod = BeansIntrospector.getReadMethod(clazz, element); - } else { + Method readMethod = JavaBeansAccessor.getReadMethod(clazz, element); + if (readMethod == null) { // Java Beans not available so use simple introspection // to locate method readMethod = SimpleIntrospector.getReadMethod(clazz, element); @@ -580,30 +578,6 @@ } /** - * Provides access to java.beans.Introspector if available. - */ - private static class BeansIntrospector { - private static final JavaBeansIntrospectorAccess JBIA; - static { - // ensure that java.beans.Introspector is initialized (if present) - try { - Class.forName("java.beans.Introspector", true, - BeansIntrospector.class.getClassLoader()); - } catch (ClassNotFoundException ignore) { } - - JBIA = SharedSecrets.getJavaBeansIntrospectorAccess(); - } - - static boolean isAvailable() { - return JBIA != null; - } - - static Method getReadMethod(Class clazz, String property) throws Exception { - return JBIA.getReadMethod(clazz, property); - } - } - - /** * A simple introspector that uses reflection to analyze a class and * identify its "getter" methods. This class is intended for use only when * Java Beans is not present (which implies that there isn't explicit diff -r 56133cf1bf00 -r c064fa28311d jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/JavaBeansAccessor.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/JavaBeansAccessor.java Thu May 28 11:37:14 2015 -0700 @@ -0,0 +1,78 @@ +/* + * Copyright (c) 2015, 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 com.sun.jmx.mbeanserver; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Method; +import sun.misc.JavaBeansAccess; +import sun.misc.SharedSecrets; + +/** + * A centralized place for gaining access to java.beans related functionality - + * if available. + */ +class JavaBeansAccessor { + static { + // ensure that java.beans.Introspector is initialized (if present) + // it will fill in the SharedSecrets + try { + Class.forName("java.beans.Introspector", true, + JavaBeansAccessor.class.getClassLoader()); + } catch (ClassNotFoundException ignore) { } + } + + private static JavaBeansAccess getJavaBeansAccess() { + return SharedSecrets.getJavaBeansAccess(); + } + + static boolean isAvailable() { + return getJavaBeansAccess() != null; + } + + /** + * Returns the getter method for a property of the given name + * @param clazz The JavaBeans class + * @param property The property name + * @return The resolved property getter name or null + * @throws Exception + */ + static Method getReadMethod(Class clazz, String property) throws Exception { + JavaBeansAccess jba = getJavaBeansAccess(); + return jba != null ? jba.getReadMethod(clazz, property) : null; + } + + /** + * Return the value attribute of the associated + * @ConstructorProperties annotation if that is present. + * @param ctr The constructor to extract the annotation value from + * @return The {@code value} attribute of the @ConstructorProperties + * annotation or {@code null} if the constructor is not annotated by + * this annotation or the annotation is not accessible. + */ + static String[] getConstructorPropertiesValue(Constructor ctr) { + JavaBeansAccess jba = getJavaBeansAccess(); + return jba != null ? jba.getConstructorPropertiesValue(ctr) : null; + } +}