/* * Copyright (c) 2014, 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. * * 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.awt.Image; import java.beans.BeanDescriptor; import java.beans.BeanInfo; import java.beans.EventSetDescriptor; import java.beans.FeatureDescriptor; import java.beans.IndexedPropertyDescriptor; import java.beans.Introspector; import java.beans.MethodDescriptor; import java.beans.ParameterDescriptor; import java.beans.PropertyDescriptor; import java.lang.reflect.Array; import java.lang.reflect.Method; import java.util.Arrays; import java.util.Comparator; import java.util.Enumeration; import java.util.Map.Entry; import java.util.Objects; import java.util.TreeMap; import java.util.TreeSet; import java.util.jar.JarEntry; import java.util.jar.JarFile; import java.util.regex.Matcher; import java.util.regex.Pattern; /* * @test * @bug 4058433 * @summary Generates BeanInfo for public classes in AWT, Accessibility, and Swing * @author Sergey Malenkov * @modules java.base/sun.reflect.generics.reflectiveObjects * java.desktop/com.sun.beans * java.desktop/com.sun.beans.util * @run main/manual Test4058433 */ public class Test4058433 implements Comparator { @Override public int compare(Object one, Object two) { if (one instanceof Method && two instanceof Method) { Method oneMethod = (Method) one; Method twoMethod = (Method) two; int result = oneMethod.getName().compareTo(twoMethod.getName()); if (result != 0) { return result; } } if (one instanceof FeatureDescriptor && two instanceof FeatureDescriptor) { FeatureDescriptor oneFD = (FeatureDescriptor) one; FeatureDescriptor twoFD = (FeatureDescriptor) two; int result = oneFD.getName().compareTo(twoFD.getName()); if (result != 0) { return result; } } return one.toString().compareTo(two.toString()); } public static void main(String[] args) throws Exception { String resource = ClassLoader.getSystemResource("java/lang/Object.class").toString(); Pattern pattern = Pattern.compile("jar:file:(.*)!.*"); Matcher matcher = pattern.matcher(resource); matcher.matches(); resource = matcher.group(1); TreeSet> types = new TreeSet<>(new Test4058433()); try (JarFile jarFile = new JarFile(resource.replaceAll("%20", " "))) { Enumeration entries = jarFile.entries(); while (entries.hasMoreElements()) { String name = entries.nextElement().getName(); if (name.startsWith("java/awt/") || name.startsWith("javax/accessibility/") || name.startsWith("javax/swing/")) { if (name.endsWith(".class")) { name = name.substring(0, name.indexOf(".")).replace('/', '.'); Class type = Class.forName(name); if (!type.isInterface() && !type.isEnum() && !type.isAnnotation() && !type.isAnonymousClass()) { if (null == type.getDeclaringClass()) { types.add(type); } } } } } } System.out.println("found " + types.size() + " classes"); long time = -System.currentTimeMillis(); for (Class type : types) { System.out.println("========================================"); BeanInfo info = Introspector.getBeanInfo(type); BeanDescriptor bd = info.getBeanDescriptor(); System.out.println(bd.getBeanClass()); print("customizer", bd.getCustomizerClass()); print(bd); print("mono 16x16", info.getIcon(BeanInfo.ICON_MONO_16x16)); print("mono 32x32", info.getIcon(BeanInfo.ICON_MONO_32x32)); print("color 16x16", info.getIcon(BeanInfo.ICON_COLOR_16x16)); print("color 32x32", info.getIcon(BeanInfo.ICON_COLOR_32x32)); PropertyDescriptor[] pds = info.getPropertyDescriptors(); PropertyDescriptor dpd = getDefault(pds, info.getDefaultPropertyIndex()); System.out.println(pds.length + " property descriptors"); Arrays.sort(pds, new Test4058433()); for (PropertyDescriptor pd : pds) { print(pd); if (dpd == pd) { System.out.println("default property"); } print("bound", pd.isBound()); print("constrained", pd.isConstrained()); print("property editor", pd.getPropertyEditorClass()); print("property type", pd.getPropertyType()); print("read method", pd.getReadMethod()); print("write method", pd.getWriteMethod()); if (pd instanceof IndexedPropertyDescriptor) { IndexedPropertyDescriptor ipd = (IndexedPropertyDescriptor) pd; print("indexed property type", ipd.getIndexedPropertyType()); print("indexed read method", ipd.getIndexedReadMethod()); print("indexed write method", ipd.getIndexedWriteMethod()); } } EventSetDescriptor[] esds = info.getEventSetDescriptors(); EventSetDescriptor desd = getDefault(esds, info.getDefaultEventIndex()); System.out.println(esds.length + " event set descriptors"); Arrays.sort(esds, new Test4058433()); for (EventSetDescriptor esd : esds) { print(esd); if (desd == esd) { System.out.println("default event set"); } print("in default", esd.isInDefaultEventSet()); print("unicast", esd.isUnicast()); print("listener type", esd.getListenerType()); print("get listener method", esd.getGetListenerMethod()); print("add listener method", esd.getAddListenerMethod()); print("remove listener method", esd.getRemoveListenerMethod()); Method[] methods = esd.getListenerMethods(); Arrays.sort(methods, new Test4058433()); for (Method method : methods) { print("listener method", method); } print(esd.getListenerMethodDescriptors()); } print(info.getMethodDescriptors()); } time += System.currentTimeMillis(); System.out.println("DONE IN " + time + " MS"); } private static T getDefault(T[] array, int index) { return (index == -1) ? null : array[index]; } private static void print(MethodDescriptor[] mds) { System.out.println(mds.length + " method descriptors"); Arrays.sort(mds, new Test4058433()); for (MethodDescriptor md : mds) { print(md); print("method", md.getMethod()); ParameterDescriptor[] pds = md.getParameterDescriptors(); if (pds != null) { System.out.println(pds.length + " parameter descriptors"); for (ParameterDescriptor pd : pds) { print(pd); } } } } private static void print(FeatureDescriptor descriptor) { String name = descriptor.getName(); String display = descriptor.getDisplayName(); String description = descriptor.getShortDescription(); System.out.println("name: " + name); if (!Objects.equals(name, display)) { System.out.println("display name: " + display); } if (!Objects.equals(display, description)) { System.out.println("description: " + description.trim()); } print("expert", descriptor.isExpert()); print("hidden", descriptor.isHidden()); print("preferred", descriptor.isPreferred()); TreeMap map = new TreeMap<>(); Enumeration enumeration = descriptor.attributeNames(); while (enumeration.hasMoreElements()) { String id = enumeration.nextElement(); Object value = descriptor.getValue(id); if (value.getClass().isArray()) { TreeSet set = new TreeSet<>(); int index = 0; int length = Array.getLength(value); while (index < length) { set.add(Array.get(value, index++) + ", " + Array.get(value, index++) + ", " + Array.get(value, index++)); } value = set.toString(); } map.put(id, value); } for (Entry entry : map.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } } private static void print(String id, boolean flag) { if (flag) { System.out.println(id + " is set"); } } private static void print(String id, Class type) { if (type != null) { System.out.println(id + ": " + type.getName()); } } private static void print(String id, Method method) { if (method != null) { System.out.println(id + ": " + method); } } private static void print(String name, Image image) { if (image != null) { System.out.println(name + " icon is exist"); } } }