8129215: com.sun.jmx.mbeanserver.Introspector may provide results inconsistent with the JavaBeans Introspector
Reviewed-by: dfuchs
--- a/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/Introspector.java Thu Jul 30 16:29:13 2015 +0300
+++ b/jdk/src/java.management/share/classes/com/sun/jmx/mbeanserver/Introspector.java Fri Jul 31 15:29:34 2015 +0200
@@ -552,8 +552,10 @@
// Java Beans introspection
//
Class<?> clazz = complex.getClass();
- Method readMethod = JavaBeansAccessor.getReadMethod(clazz, element);
- if (readMethod == null) {
+ Method readMethod;
+ if (JavaBeansAccessor.isAvailable()) {
+ readMethod = JavaBeansAccessor.getReadMethod(clazz, element);
+ } else {
// Java Beans not available so use simple introspection
// to locate method
readMethod = SimpleIntrospector.getReadMethod(clazz, element);
@@ -676,7 +678,12 @@
* {@code null} if no method is found.
*/
static Method getReadMethod(Class<?> clazz, String property) {
- // first character in uppercase (compatibility with JavaBeans)
+ if (Character.isUpperCase(property.charAt(0))) {
+ // the property name must start with a lower-case letter
+ return null;
+ }
+ // first character after 'get/is' prefix must be in uppercase
+ // (compatibility with JavaBeans)
property = property.substring(0, 1).toUpperCase(Locale.ENGLISH) +
property.substring(1);
String getMethod = GET_METHOD_PREFIX + property;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/jmx/mbeanserver/introspector/BeanClass.java Fri Jul 31 15:29:34 2015 +0200
@@ -0,0 +1,28 @@
+/*
+ * 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.
+ */
+public class BeanClass {
+ public int getNumber() {return 1;}
+ public boolean isAvailable() {return false;}
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/com/sun/jmx/mbeanserver/introspector/SimpleIntrospectorTest.java Fri Jul 31 15:29:34 2015 +0200
@@ -0,0 +1,104 @@
+
+/*
+ * 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.
+ */
+import java.lang.reflect.Method;
+
+/*
+ * @test
+ * @bug 8129215
+ * @summary The test checks whether the SimpleIntrospector is honoring the
+ * the JavaBeans property naming convention of always starting
+ * with a lower-case letter
+ *
+ * @author Jaroslav Bachorik
+ * @modules java.management
+ * @run clean SimpleIntrospectorTest
+ * @run build SimpleIntrospectorTest BeanClass
+ * @run main SimpleIntrospectorTest
+ */
+public class SimpleIntrospectorTest {
+ private static Method INTROSPECT_GETTER;
+
+ public static void main(String ... args) throws Exception {
+ Class clz = Class.forName(
+ "com.sun.jmx.mbeanserver.Introspector$SimpleIntrospector"
+ );
+ INTROSPECT_GETTER = clz.getDeclaredMethod(
+ "getReadMethod",
+ Class.class,
+ String.class
+ );
+ INTROSPECT_GETTER.setAccessible(true);
+ boolean result = true;
+ result &= checkNumberValid();
+ result &= checkNumberInvalid();
+ result &= checkAvailableValid();
+ result &= checkAvailableInvalid();
+
+ if (!result) {
+ throw new Error();
+ }
+ }
+
+ private static boolean checkNumberValid() throws Exception {
+ return checkGetter(false, "number");
+ }
+
+ private static boolean checkNumberInvalid() throws Exception {
+ return checkGetter(true, "Number");
+ }
+
+ private static boolean checkAvailableValid() throws Exception {
+ return checkGetter(false, "available");
+ }
+
+ private static boolean checkAvailableInvalid() throws Exception {
+ return checkGetter(true, "Available");
+ }
+
+ private static boolean checkGetter(boolean nullExpected, String name)
+ throws Exception {
+ Method m = getReadMethod(BeanClass.class, name);
+ boolean result = (m != null);
+ if (nullExpected) result = !result;
+
+ if (result) {
+ return true;
+ }
+ if (nullExpected) {
+ System.err.println("SimpleIntrospector resolved an unknown getter " +
+ "for attribute '"+ name +"'");
+ } else {
+ System.err.println("SimpleIntrospector fails to resolve getter " +
+ "for attribute '"+ name +"'");
+ }
+ return false;
+ }
+
+ private static Method getReadMethod(Class clz, String attr)
+ throws Exception {
+ return (Method)INTROSPECT_GETTER.invoke(null, clz, attr);
+ }
+}