| /* | |
| * 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.net.URI; | |
| import java.nio.file.FileSystem; | |
| import java.nio.file.FileSystems; | |
| import java.nio.file.FileVisitResult; | |
| import java.nio.file.Files; | |
| import java.nio.file.Path; | |
| import java.nio.file.SimpleFileVisitor; | |
| import java.nio.file.attribute.BasicFileAttributes; | |
| 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; | |
| /* | |
| * @test | |
| * @bug 4058433 | |
| * @summary Generates BeanInfo for public classes in AWT, Accessibility, and Swing | |
| * @author Sergey Malenkov | |
| */ | |
| public class Test4058433 implements Comparator<Object> { | |
| @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 { | |
| FileSystem fs = FileSystems.getFileSystem(URI.create("jrt:/")); | |
| fs.getFileStores(); | |
| TreeSet<Class<?>> types = new TreeSet<>(new Test4058433()); | |
| Files.walkFileTree(fs.getPath("/modules/java.desktop"), new SimpleFileVisitor<Path>() { | |
| @Override | |
| public FileVisitResult visitFile(Path file, | |
| BasicFileAttributes attrs) { | |
| file = file.subpath(2, file.getNameCount()); | |
| if (file.startsWith("java/awt/") | |
| || file.startsWith("javax/accessibility/") | |
| || file.startsWith("javax/swing/")) { | |
| String name =file.toString(); | |
| if (name.endsWith(".class")) { | |
| name = name.substring(0, name.indexOf(".")).replace('/', '.'); | |
| final Class<?> type; | |
| try { | |
| type = Class.forName(name); | |
| } catch (ClassNotFoundException e) { | |
| throw new RuntimeException(e); | |
| } | |
| if (!BeanInfo.class.isAssignableFrom(type) && !type.isInterface() | |
| && !type.isEnum() && !type.isAnnotation() | |
| && !type.isAnonymousClass()) { | |
| if (null == type.getDeclaringClass()) { | |
| types.add(type); | |
| } | |
| } | |
| } | |
| } | |
| return FileVisitResult.CONTINUE; | |
| } | |
| }); | |
| 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> 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<String,Object> map = new TreeMap<>(); | |
| Enumeration<String> enumeration = descriptor.attributeNames(); | |
| while (enumeration.hasMoreElements()) { | |
| String id = enumeration.nextElement(); | |
| Object value = descriptor.getValue(id); | |
| if (value.getClass().isArray()) { | |
| TreeSet<String> 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<String,Object> 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"); | |
| } | |
| } | |
| } |