1 /* 2 * Copyright (c) 2007, 2008, 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 %I% %G% 26 * @bug 4935607 27 * @summary Tests transient properties 28 * @author Sergey Malenkov 29 */ 30 31 import java.awt.Component; 32 import java.awt.Dimension; 33 import java.awt.Point; 34 import java.awt.Rectangle; 35 import java.awt.ScrollPane; 36 import java.awt.geom.RectangularShape; 37 import java.awt.im.InputContext; 38 39 import java.beans.FeatureDescriptor; 40 import java.beans.Transient; 41 42 import java.util.EventListener; 43 44 import javax.swing.AbstractButton; 45 import javax.swing.DefaultListSelectionModel; 46 import javax.swing.ImageIcon; 47 import javax.swing.JComboBox; 48 import javax.swing.JComponent; 49 import javax.swing.JLabel; 50 import javax.swing.JList; 51 import javax.swing.JMenuBar; 52 import javax.swing.JScrollPane; 53 import javax.swing.JTabbedPane; 54 import javax.swing.JViewport; 55 import javax.swing.table.JTableHeader; 56 import javax.swing.text.JTextComponent; 57 58 public class Test4935607 { main(String[] args)59 public static void main(String[] args) { 60 // test all possible cases 61 test(Null.class); 62 test(True.class); 63 test(False.class); 64 test(NullNull.class); 65 test(TrueNull.class); 66 test(FalseNull.class); 67 test(NullTrue.class); 68 test(TrueTrue.class); 69 test(FalseTrue.class); 70 test(NullFalse.class); 71 test(TrueFalse.class); 72 test(FalseFalse.class); 73 // test transient properties in AWT 74 test(RectangularShape.class, "frame"); // NON-NLS: getFrame() 75 test(Rectangle.class, "bounds"); // NON-NLS: getBounds() 76 test(Dimension.class, "size"); // NON-NLS: getSize() 77 test(Point.class, "location"); // NON-NLS: getLocation() 78 test(Component.class, "foreground"); // NON-NLS: getForeground() 79 test(Component.class, "background"); // NON-NLS: getBackground() 80 test(Component.class, "font"); // NON-NLS: getFont() 81 test(Component.class, "visible"); // NON-NLS: getVisible() 82 test(ScrollPane.class, "scrollPosition"); // NON-NLS: getScrollPosition() 83 test(InputContext.class, "compositionEnabled"); // NON-NLS: getCompositionEnabled() 84 // test transient properties in Swing 85 test(JComponent.class, "minimumSize"); // NON-NLS: getMinimumSize() 86 test(JComponent.class, "preferredSize"); // NON-NLS: getPreferredSize() 87 test(JComponent.class, "maximumSize"); // NON-NLS: getMaximumSize() 88 test(ImageIcon.class, "image"); // NON-NLS: getImage() 89 test(ImageIcon.class, "imageObserver"); // NON-NLS: getImageObserver() 90 test(JMenuBar.class, "helpMenu"); // NON-NLS: getHelpMenu() 91 test(JScrollPane.class, "verticalScrollBar"); // NON-NLS: getVerticalScrollBar() 92 test(JScrollPane.class, "horizontalScrollBar"); // NON-NLS: getHorizontalScrollBar() 93 test(JScrollPane.class, "rowHeader"); // NON-NLS: getRowHeader() 94 test(JScrollPane.class, "columnHeader"); // NON-NLS: getColumnHeader() 95 test(JViewport.class, "extentSize"); // NON-NLS: getExtentSize() 96 test(JTableHeader.class, "defaultRenderer"); // NON-NLS: getDefaultRenderer() 97 test(JList.class, "cellRenderer"); // NON-NLS: getCellRenderer() 98 test(JList.class, "selectedIndices"); // NON-NLS: getSelectedIndices() 99 test(DefaultListSelectionModel.class, "leadSelectionIndex"); // NON-NLS: getLeadSelectionIndex() 100 test(DefaultListSelectionModel.class, "anchorSelectionIndex"); // NON-NLS: getAnchorSelectionIndex() 101 test(JComboBox.class, "selectedIndex"); // NON-NLS: getSelectedIndex() 102 test(JTabbedPane.class, "selectedIndex"); // NON-NLS: getSelectedIndex() 103 test(JTabbedPane.class, "selectedComponent"); // NON-NLS: getSelectedComponent() 104 test(AbstractButton.class, "disabledIcon"); // NON-NLS: getDisabledIcon() 105 test(JLabel.class, "disabledIcon"); // NON-NLS: getDisabledIcon() 106 test(JTextComponent.class, "caret"); // NON-NLS: getCaret() 107 test(JTextComponent.class, "caretPosition"); // NON-NLS: getCaretPosition() 108 test(JTextComponent.class, "selectionStart"); // NON-NLS: getSelectionStart() 109 test(JTextComponent.class, "selectionEnd"); // NON-NLS: getSelectionEnd() 110 } 111 test(Class type)112 private static void test(Class type) { 113 Object value = getExpectedValue(type); 114 test(value, BeanUtils.getPropertyDescriptor(type, "property")); // NON-NLS: the property to check 115 test(value, BeanUtils.getEventSetDescriptor(type, "eventSet")); // NON-NLS: the event set to check 116 System.out.println(); 117 } 118 test(Class type, String property)119 private static void test(Class type, String property) { 120 System.out.print(type.getName() + ": "); 121 test(Boolean.TRUE, BeanUtils.getPropertyDescriptor(type, property)); 122 } 123 test(Object expected, FeatureDescriptor fd)124 private static void test(Object expected, FeatureDescriptor fd) { 125 System.out.println(fd.getName()); 126 Object actual = fd.getValue("transient"); // NON-NLS: the attribute name 127 if ((actual == null) ? (expected != null) : !actual.equals(expected)) 128 throw new Error("expected " + expected + " value, but actual value is " + actual); 129 } 130 getExpectedValue(Class type)131 private static Object getExpectedValue(Class type) { 132 try { 133 return type.getField("VALUE").get(type); // NON-NLS: the field name with expected value 134 } catch (NoSuchFieldException exception) { 135 return null; 136 } catch (IllegalAccessException exception) { 137 throw new Error("unexpected error", exception); 138 } 139 } 140 141 142 public static class Null { getProperty()143 public Object getProperty() { 144 return this; 145 } 146 setProperty(Object object)147 public void setProperty(Object object) { 148 } 149 addEventSetListener(EventSetListener listener)150 public void addEventSetListener(EventSetListener listener) { 151 } 152 removeEventSetListener(EventSetListener listener)153 public void removeEventSetListener(EventSetListener listener) { 154 } 155 } 156 157 public static class True { 158 public static final Boolean VALUE = Boolean.TRUE; 159 160 @Transient getProperty()161 public Object getProperty() { 162 return this; 163 } 164 165 @Transient setProperty(Object object)166 public void setProperty(Object object) { 167 } 168 169 @Transient addEventSetListener(EventSetListener listener)170 public void addEventSetListener(EventSetListener listener) { 171 } 172 173 @Transient removeEventSetListener(EventSetListener listener)174 public void removeEventSetListener(EventSetListener listener) { 175 } 176 } 177 178 public static class False { 179 public static final Boolean VALUE = Boolean.FALSE; 180 181 @Transient(false) getProperty()182 public Object getProperty() { 183 return this; 184 } 185 186 @Transient(false) setProperty(Object object)187 public void setProperty(Object object) { 188 } 189 190 @Transient(false) addEventSetListener(EventSetListener listener)191 public void addEventSetListener(EventSetListener listener) { 192 } 193 194 @Transient(false) removeEventSetListener(EventSetListener listener)195 public void removeEventSetListener(EventSetListener listener) { 196 } 197 } 198 199 public static class NullNull extends Null { 200 @Override getProperty()201 public Object getProperty() { 202 return this; 203 } 204 205 @Override setProperty(Object object)206 public void setProperty(Object object) { 207 } 208 209 @Override addEventSetListener(EventSetListener listener)210 public void addEventSetListener(EventSetListener listener) { 211 } 212 213 @Override removeEventSetListener(EventSetListener listener)214 public void removeEventSetListener(EventSetListener listener) { 215 } 216 } 217 218 public static class TrueNull extends Null { 219 public static final Boolean VALUE = Boolean.TRUE; 220 221 @Override 222 @Transient getProperty()223 public Object getProperty() { 224 return this; 225 } 226 227 @Override 228 @Transient setProperty(Object object)229 public void setProperty(Object object) { 230 } 231 232 @Override 233 @Transient addEventSetListener(EventSetListener listener)234 public void addEventSetListener(EventSetListener listener) { 235 } 236 237 @Override 238 @Transient removeEventSetListener(EventSetListener listener)239 public void removeEventSetListener(EventSetListener listener) { 240 } 241 } 242 243 public static class FalseNull extends Null { 244 public static final Boolean VALUE = Boolean.FALSE; 245 246 @Override 247 @Transient(false) getProperty()248 public Object getProperty() { 249 return this; 250 } 251 252 @Override 253 @Transient(false) setProperty(Object object)254 public void setProperty(Object object) { 255 } 256 257 @Override 258 @Transient(false) addEventSetListener(EventSetListener listener)259 public void addEventSetListener(EventSetListener listener) { 260 } 261 262 @Override 263 @Transient(false) removeEventSetListener(EventSetListener listener)264 public void removeEventSetListener(EventSetListener listener) { 265 } 266 } 267 268 public static class NullTrue extends True { 269 @Override getProperty()270 public Object getProperty() { 271 return this; 272 } 273 274 @Override setProperty(Object object)275 public void setProperty(Object object) { 276 } 277 278 @Override addEventSetListener(EventSetListener listener)279 public void addEventSetListener(EventSetListener listener) { 280 } 281 282 @Override removeEventSetListener(EventSetListener listener)283 public void removeEventSetListener(EventSetListener listener) { 284 } 285 } 286 287 public static class TrueTrue extends True { 288 @Override 289 @Transient getProperty()290 public Object getProperty() { 291 return this; 292 } 293 294 @Override 295 @Transient setProperty(Object object)296 public void setProperty(Object object) { 297 } 298 299 @Override 300 @Transient addEventSetListener(EventSetListener listener)301 public void addEventSetListener(EventSetListener listener) { 302 } 303 304 @Override 305 @Transient removeEventSetListener(EventSetListener listener)306 public void removeEventSetListener(EventSetListener listener) { 307 } 308 } 309 310 public static class FalseTrue extends True { 311 public static final Boolean VALUE = Boolean.FALSE; 312 313 @Override 314 @Transient(false) getProperty()315 public Object getProperty() { 316 return this; 317 } 318 319 @Override 320 @Transient(false) setProperty(Object object)321 public void setProperty(Object object) { 322 } 323 324 @Override 325 @Transient(false) addEventSetListener(EventSetListener listener)326 public void addEventSetListener(EventSetListener listener) { 327 } 328 329 @Override 330 @Transient(false) removeEventSetListener(EventSetListener listener)331 public void removeEventSetListener(EventSetListener listener) { 332 } 333 } 334 335 public static class NullFalse extends False { 336 @Override getProperty()337 public Object getProperty() { 338 return this; 339 } 340 341 @Override setProperty(Object object)342 public void setProperty(Object object) { 343 } 344 345 @Override addEventSetListener(EventSetListener listener)346 public void addEventSetListener(EventSetListener listener) { 347 } 348 349 @Override removeEventSetListener(EventSetListener listener)350 public void removeEventSetListener(EventSetListener listener) { 351 } 352 } 353 354 public static class TrueFalse extends False { 355 public static final Boolean VALUE = Boolean.TRUE; 356 357 @Override 358 @Transient getProperty()359 public Object getProperty() { 360 return this; 361 } 362 363 @Override 364 @Transient setProperty(Object object)365 public void setProperty(Object object) { 366 } 367 368 @Override 369 @Transient addEventSetListener(EventSetListener listener)370 public void addEventSetListener(EventSetListener listener) { 371 } 372 373 @Override 374 @Transient removeEventSetListener(EventSetListener listener)375 public void removeEventSetListener(EventSetListener listener) { 376 } 377 } 378 379 public static class FalseFalse extends False { 380 @Override 381 @Transient(false) getProperty()382 public Object getProperty() { 383 return this; 384 } 385 386 @Override 387 @Transient(false) setProperty(Object object)388 public void setProperty(Object object) { 389 } 390 391 @Override 392 @Transient(false) addEventSetListener(EventSetListener listener)393 public void addEventSetListener(EventSetListener listener) { 394 } 395 396 @Override 397 @Transient(false) removeEventSetListener(EventSetListener listener)398 public void removeEventSetListener(EventSetListener listener) { 399 } 400 } 401 402 public static final class EventSetListener implements EventListener { 403 } 404 } 405