| /* |
| * Copyright (c) 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.event.ActionListener; |
| import java.awt.event.MouseListener; |
| import java.beans.BeanDescriptor; |
| import java.beans.BeanInfo; |
| import java.beans.BeanProperty; |
| import java.beans.EventSetDescriptor; |
| import java.beans.IntrospectionException; |
| import java.beans.Introspector; |
| import java.beans.JavaBean; |
| import java.beans.MethodDescriptor; |
| import java.beans.PropertyDescriptor; |
| import java.beans.SimpleBeanInfo; |
| import javax.swing.SwingContainer; |
| import java.util.Arrays; |
| |
| /** |
| * @test |
| * @bug 4058433 8131055 |
| * @summary Check if the user-defined bean info |
| * is not overridden with the annotated one. |
| * @author a.stepanov |
| */ |
| |
| |
| public class TestBeanInfoPriority { |
| |
| // ========== test bean (annotations must be ignored!) ========== |
| |
| @JavaBean( |
| description = "annotation-description", |
| defaultProperty = "other", |
| defaultEventSet = "mouse") |
| @SwingContainer(value = false) |
| public static class TestClass { |
| |
| private int value; |
| private double other; |
| |
| @BeanProperty( |
| bound = false, |
| expert = false, |
| hidden = false, |
| preferred = false, |
| required = false, |
| visualUpdate = false, |
| description = "annotation-value", |
| enumerationValues = { |
| "javax.swing.SwingConstants.NORTH"} |
| ) |
| public void setValue(int v) { value = v; } |
| public int getValue() { return value; } |
| |
| |
| @BeanProperty( |
| bound = true, |
| expert = true, |
| hidden = true, |
| preferred = true, |
| required = true, |
| visualUpdate = true, |
| description = "annotation-other", |
| enumerationValues = { |
| "javax.swing.SwingConstants.LEFT", |
| "javax.swing.SwingConstants.RIGHT", |
| "javax.swing.SwingConstants.CENTER"} |
| ) |
| public void setOther(double o) { other = o; } |
| public double getOther() { return other; } |
| |
| public void addActionListener(ActionListener l) {} |
| public void removeActionListener(ActionListener l) {} |
| |
| public void addMouseListener(MouseListener l) {} |
| public void removeMouseListener(MouseListener l) {} |
| } |
| |
| // ========== user-defined bean info ========== |
| |
| public static class TestClassBeanInfo extends SimpleBeanInfo { |
| |
| private static final int iOther = 0; |
| private static final int iValue = 1; |
| |
| private static final int iAction = 0; |
| private static final int iMouse = 1; |
| |
| |
| @Override |
| public BeanDescriptor getBeanDescriptor() { |
| |
| BeanDescriptor bd = new BeanDescriptor(TestClass.class, null); |
| bd.setShortDescription("user-defined-description"); |
| bd.setValue("isContainer", true); |
| bd.setValue("containerDelegate", "user-defined-delegate"); |
| |
| return bd; |
| } |
| |
| @Override |
| public PropertyDescriptor[] getPropertyDescriptors() { |
| |
| PropertyDescriptor[] p = new PropertyDescriptor[2]; |
| |
| try { |
| |
| // value |
| PropertyDescriptor pdValue = new PropertyDescriptor( |
| "value", TestClass.class, "getValue", "setValue"); |
| pdValue.setBound(true); |
| pdValue.setConstrained(true); |
| pdValue.setExpert(true); |
| pdValue.setHidden(true); |
| pdValue.setPreferred(true); |
| pdValue.setValue("required", true); |
| pdValue.setValue("visualUpdate", true); |
| pdValue.setShortDescription("user-defined-value"); |
| pdValue.setValue("enumerationValues", new Object[]{ |
| "EAST", 3, "javax.swing.SwingConstants.EAST", |
| "WEST", 7, "javax.swing.SwingConstants.WEST"}); |
| p[iValue] = pdValue; |
| |
| // other |
| PropertyDescriptor pdOther = new PropertyDescriptor( |
| "other", TestClass.class, "getOther", "setOther"); |
| pdOther.setBound(false); |
| pdOther.setConstrained(false); |
| pdOther.setExpert(false); |
| pdOther.setHidden(false); |
| pdOther.setPreferred(false); |
| pdOther.setValue("required", false); |
| pdOther.setValue("visualUpdate", false); |
| pdOther.setShortDescription("user-defined-other"); |
| pdOther.setValue("enumerationValues", new Object[]{ |
| "TOP", 1, "javax.swing.SwingConstants.TOP"}); |
| p[iOther] = pdOther; |
| |
| } catch(IntrospectionException e) { |
| e.printStackTrace(); |
| } |
| |
| return p; |
| } |
| |
| @Override |
| public EventSetDescriptor[] getEventSetDescriptors() { |
| EventSetDescriptor[] es = new EventSetDescriptor[2]; |
| try { |
| es[iAction] = new EventSetDescriptor( |
| TestClass.class, |
| "actionListener", |
| java.awt.event.ActionListener.class, |
| new String[] {"actionPerformed"}, |
| "addActionListener", |
| "removeActionListener"); |
| es[iMouse] = new EventSetDescriptor( |
| TestClass.class, |
| "mouseListener", |
| java.awt.event.MouseListener.class, |
| new String[] {"mouseClicked", "mousePressed", "mouseReleased", "mouseEntered", "mouseExited"}, |
| "addMouseListener", |
| "removeMouseListener"); |
| } catch(IntrospectionException e) { |
| e.printStackTrace(); |
| } |
| return es; |
| } |
| |
| @Override |
| public MethodDescriptor[] getMethodDescriptors() { |
| MethodDescriptor[] m = new MethodDescriptor[0]; |
| return m; |
| } |
| |
| @Override |
| public int getDefaultPropertyIndex() { return iValue; } // default: value |
| |
| @Override |
| public int getDefaultEventIndex() { return iAction; } // default: action |
| |
| @Override |
| public java.awt.Image getIcon(int iconKind) { return null; } |
| } |
| |
| // ========== auxiliary functions ========== |
| |
| static void checkEq(String what, Object v, Object ref) throws Exception { |
| |
| if ((v != null) && v.equals(ref)) { |
| System.out.println(what + ": ok (" + ref.toString() + ")"); |
| } else { |
| throw new Exception( |
| "invalid " + what + ", expected: \"" + ref + "\", got: \"" + v + "\""); |
| } |
| } |
| |
| static void checkEnumEq(String what, Object v, Object ref[]) throws Exception { |
| |
| what = "\"" + what + "\""; |
| if (v == null) { |
| throw new Exception("null " + what + " enumeration values"); |
| } |
| |
| String msg = "invalid " + what + " enumeration values"; |
| if (!(v instanceof Object[])) { throw new Exception(msg); } |
| |
| if (Arrays.equals((Object []) v, ref)) { |
| System.out.println(what + " enumeration values: ok"); |
| } else { throw new Exception(msg); } |
| } |
| |
| |
| // ========== test ========== |
| |
| |
| public static void main(String[] args) throws Exception { |
| |
| BeanInfo i = Introspector.getBeanInfo(TestClass.class, Object.class); |
| BeanDescriptor bd = i.getBeanDescriptor(); |
| |
| checkEq("description", bd.getShortDescription(), "user-defined-description"); |
| checkEq("default property index", i.getDefaultPropertyIndex(), 1); |
| checkEq("default event index", i.getDefaultEventIndex(), 0); |
| |
| checkEq("isContainer", i.getBeanDescriptor().getValue("isContainer"), true); |
| checkEq("containerDelegate", |
| i.getBeanDescriptor().getValue("containerDelegate"), "user-defined-delegate"); |
| System.out.println(""); |
| |
| PropertyDescriptor[] pds = i.getPropertyDescriptors(); |
| for (PropertyDescriptor pd: pds) { |
| String name = pd.getName(); |
| switch (name) { |
| case "value": |
| checkEq("\"value\" isBound", pd.isBound(), true); |
| checkEq("\"value\" isConstrained", pd.isConstrained(), true); |
| checkEq("\"value\" isExpert", pd.isExpert(), true); |
| checkEq("\"value\" isHidden", pd.isHidden(), true); |
| checkEq("\"value\" isPreferred", pd.isPreferred(), true); |
| checkEq("\"value\" required", pd.getValue("required"), true); |
| checkEq("\"value\" visualUpdate", pd.getValue("visualUpdate"), true); |
| |
| checkEq("\"value\" description", pd.getShortDescription(), "user-defined-value"); |
| |
| checkEnumEq(pd.getName(), pd.getValue("enumerationValues"), |
| new Object[]{ |
| "EAST", 3, "javax.swing.SwingConstants.EAST", |
| "WEST", 7, "javax.swing.SwingConstants.WEST"}); |
| System.out.println(""); |
| break; |
| case "other": |
| checkEq("\"other\" isBound", pd.isBound(), false); |
| checkEq("\"other\" isConstrained", pd.isConstrained(), false); |
| checkEq("\"other\" isExpert", pd.isExpert(), false); |
| checkEq("\"other\" isHidden", pd.isHidden(), false); |
| checkEq("\"other\" isPreferred", pd.isPreferred(), false); |
| checkEq("\"other\" required", pd.getValue("required"), false); |
| checkEq("\"other\" visualUpdate", pd.getValue("visualUpdate"), false); |
| |
| checkEq("\"other\" description", pd.getShortDescription(), "user-defined-other"); |
| |
| checkEnumEq(pd.getName(), pd.getValue("enumerationValues"), |
| new Object[]{"TOP", 1, "javax.swing.SwingConstants.TOP"}); |
| System.out.println(""); |
| break; |
| default: |
| throw new Exception("invalid property descriptor: " + name); |
| } |
| } |
| } |
| } |