blob: 577a360a2ca0454efe180c7a794d6bd3c2cc35e1 [file] [log] [blame]
J. Duke319a3b92007-12-01 00:00:00 +00001/*
2 * Copyright 2003-2007 Sun Microsystems, Inc. All Rights Reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
20 * CA 95054 USA or visit www.sun.com if you need additional information or
21 * have any questions.
22 */
23
24/*
25 * @test
26 * @bug 4508780
27 * @summary Tests shared access to the Introspector cache
28 * @author Mark Davidson
29 */
30
31import java.beans.IntrospectionException;
32import java.beans.Introspector;
33import java.beans.PropertyDescriptor;
34
35import java.lang.reflect.Method;
36
37/**
38 * Multiple classloader test to ensure that methods
39 * returned by the BeanInfo classes are unique to the classloader.
40 */
41public class Test4508780 implements Runnable {
42 /**
43 * This is here to force the bean classes to be compiled
44 */
45 private static final Class[] COMPILE = {
46 Bean.class,
47 Bean2.class,
48 Bean3.class,
49 Bean4.class,
50 };
51
52 public static void main(String[] args) {
53 for (int i = 0; i < 10; i++) test();
54 }
55
56 private static void test() {
57 test("Bean", "Bean2", "Bean3", "Bean4");
58 test("Bean4", "Bean", "Bean2", "Bean3");
59 test("Bean3", "Bean4", "Bean", "Bean2");
60 test("Bean2", "Bean3", "Bean4", "Bean");
61 Introspector.flushCaches();
62 }
63
64 private static void test(String... names) {
65 new Thread(new Test4508780(names)).start();
66 }
67
68 private final ClassLoader loader = new SimpleClassLoader();
69 private final String[] names;
70
71 private Test4508780(String... names) {
72 this.names = names;
73 }
74
75 public void run() {
76 for (String name : this.names) {
77 Object bean;
78 try {
79 bean = this.loader.loadClass(name).newInstance();
80 } catch (Exception exception) {
81 throw new Error("could not instantiate bean: " + name, exception);
82 }
83 if (this.loader != bean.getClass().getClassLoader()) {
84 throw new Error("bean class loader is not equal to default one");
85 }
86 PropertyDescriptor[] pds = getPropertyDescriptors(bean);
87 for (PropertyDescriptor pd : pds) {
88 Class type = pd.getPropertyType();
89 Method setter = pd.getWriteMethod();
90 Method getter = pd.getReadMethod();
91
92 if (type.equals(String.class)) {
93 executeMethod(setter, bean, "Foo");
94 } else if (type.equals(int.class)) {
95 executeMethod(setter, bean, Integer.valueOf(1));
96 }
97 executeMethod(getter, bean);
98 }
99 }
100 }
101
102 private static void executeMethod(Method method, Object bean, Object... args) {
103 if (method == null) {
104 throw new Error("method is null");
105 }
106 if (bean == null) {
107 throw new Error("target bean is null");
108 }
109 try {
110 method.invoke(bean, args);
111 } catch (Exception exception) {
112 throw new Error("could not execute method: " + method, exception);
113 }
114 }
115
116 private static PropertyDescriptor[] getPropertyDescriptors(Object object) {
117 Class type = object.getClass();
118 synchronized (System.out) {
119 System.out.println(type);
120 ClassLoader loader = type.getClassLoader();
121 while (loader != null) {
122 System.out.println(" - loader: " + loader);
123 loader = loader.getParent();
124 }
125 }
126 try {
127 return Introspector.getBeanInfo(type).getPropertyDescriptors();
128 } catch (IntrospectionException exception) {
129 throw new Error("unexpected exception", exception);
130 }
131 }
132}