1 /* 2 * Copyright (c) 2003, 2007, Oracle and/or its affiliates. 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 /* 25 * @test 26 * @bug 4274639 4305280 27 * @summary Tests PropertyDescriptor/PropertyEditorSupport improvements 28 * @author Mark Davidson 29 */ 30 31 import java.beans.IntrospectionException; 32 import java.beans.PropertyDescriptor; 33 import java.beans.PropertyEditor; 34 import java.beans.PropertyEditorSupport; 35 import java.beans.SimpleBeanInfo; 36 37 public class Test4274639 { 38 private static String STRING_PROPERTY = "string"; 39 private static String INTEGER_PROPERTY = "integer"; 40 41 private static String STRING_VALUE = "Test Text"; 42 private static Integer INTEGER_VALUE = 261074; 43 main(String[] args)44 public static void main(String[] args) { 45 TestBean bean = new TestBean(STRING_VALUE); 46 if (!STRING_VALUE.equals(bean.getString())) 47 throw new Error("unexpected string property: " + bean.getString()); 48 49 boolean string = false; 50 boolean integer = false; 51 for (PropertyDescriptor pd : BeanUtils.getPropertyDescriptors(bean.getClass())) { 52 String name = pd.getName(); 53 System.out.println(" - " + name); 54 if (name.equals(STRING_PROPERTY)) { 55 // This tests createPropertyEditor such that the PropertyEditor 56 // returned will have the bean as the source object. 57 Class type = pd.getPropertyEditorClass(); 58 if (!StringEditor.class.equals(type)) 59 throw new Error("unexpected property editor type: " + type); 60 61 PropertyEditor editor = pd.createPropertyEditor(bean); 62 if (editor == null) 63 throw new Error("property editor cannot be created"); 64 65 if (STRING_VALUE != editor.getValue()) 66 throw new Error("unexpected value: " + editor.getValue()); 67 68 Object source = ((PropertyEditorSupport) editor).getSource(); 69 if (source != bean) 70 throw new Error("unexpected source: " + source); 71 72 string = true; 73 } 74 if (name.equals(INTEGER_PROPERTY)) { 75 // This tests createPropertyEditor such that the PropertyEditor 76 // returned will be just a new instance 77 Class type = pd.getPropertyEditorClass(); 78 if (!IntegerEditor.class.equals(type)) 79 throw new Error("unexpected property editor type: " + type); 80 81 PropertyEditor editor = pd.createPropertyEditor(bean); 82 if (editor == null) 83 throw new Error("property editor cannot be created"); 84 85 if (INTEGER_VALUE != editor.getValue()) 86 throw new Error("unexpected value: " + editor.getValue()); 87 88 Object source = ((PropertyEditorSupport) editor).getSource(); 89 if (source != editor) 90 throw new Error("unexpected source: " + source); 91 92 integer = true; 93 } 94 } 95 if (!string) 96 throw new Error("string property is not tested"); 97 98 if (!integer) 99 throw new Error("integer property is not tested"); 100 } 101 102 public static final class TestBean { 103 private String string; 104 private int integer; 105 TestBean()106 public TestBean() { 107 this.string = "default"; 108 this.integer = 0; 109 } 110 TestBean(String string)111 public TestBean(String string) { 112 setString(string); 113 } 114 getString()115 public String getString() { 116 return this.string; 117 } 118 setString(String string)119 public void setString(String string) { 120 this.string = string; 121 } 122 getInteger()123 public int getInteger() { 124 return this.integer; 125 } 126 setInteger(int integer)127 public void setInteger(int integer) { 128 this.integer = integer; 129 } 130 } 131 132 public static final class TestBeanBeanInfo extends SimpleBeanInfo { getPropertyDescriptors()133 public PropertyDescriptor[] getPropertyDescriptors() { 134 PropertyDescriptor[] pds = new PropertyDescriptor[2]; 135 try { 136 pds[0] = new PropertyDescriptor(STRING_PROPERTY, TestBean.class); 137 pds[0].setPropertyEditorClass(StringEditor.class); 138 139 pds[1] = new PropertyDescriptor(INTEGER_PROPERTY, TestBean.class); 140 pds[1].setPropertyEditorClass(IntegerEditor.class); 141 142 } 143 catch (IntrospectionException exception) { 144 throw new Error("unexpected error", exception); 145 } 146 return pds; 147 } 148 } 149 150 // Public constructor was added for 4305280 151 public static final class StringEditor extends PropertyEditorSupport { StringEditor(Object source)152 public StringEditor(Object source) { 153 super(source); 154 155 if (source instanceof TestBean) { 156 TestBean test = (TestBean) source; 157 setValue(test.getString()); 158 } 159 } 160 } 161 162 // Will use the default public constructor 163 // that uses this property editor as the source. 164 public static final class IntegerEditor extends PropertyEditorSupport { getValue()165 public Object getValue() { 166 return INTEGER_VALUE; // default value is hard coded 167 } 168 } 169 } 170