1 /*
   2  * Copyright (c) 2015, 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 import java.awt.event.ActionListener;
  26 import java.awt.event.MouseListener;
  27 import java.beans.BeanDescriptor;
  28 import java.beans.BeanInfo;
  29 import java.beans.BeanProperty;
  30 import java.beans.EventSetDescriptor;
  31 import java.beans.IntrospectionException;
  32 import java.beans.Introspector;
  33 import java.beans.JavaBean;
  34 import java.beans.MethodDescriptor;
  35 import java.beans.PropertyDescriptor;
  36 import java.beans.SimpleBeanInfo;
  37 import javax.swing.SwingContainer;
  38 import java.util.Arrays;
  39 
  40 /**
  41  * @test
  42  * @bug 4058433 8131055
  43  * @summary Check if the user-defined bean info
  44  *          is not overridden with the annotated one.
  45  * @author a.stepanov
  46  */
  47 
  48 
  49 public class TestBeanInfoPriority {
  50 
  51     // ========== test bean (annotations must be ignored!) ==========
  52 
  53     @JavaBean(
  54             description = "annotation-description",
  55             defaultProperty = "other",
  56             defaultEventSet = "mouse")
  57     @SwingContainer(value = false)
  58     public static class TestClass {
  59 
  60         private int    value;
  61         private double other;
  62 
  63         @BeanProperty(
  64                 bound     = false,
  65                 expert    = false,
  66                 hidden    = false,
  67                 preferred = false,
  68                 required  = false,
  69                 visualUpdate = false,
  70                 description = "annotation-value",
  71                 enumerationValues = {
  72                     "javax.swing.SwingConstants.NORTH"}
  73                 )
  74         public void setValue(int v) { value = v; }
  75         public  int getValue()      { return value; }
  76 
  77 
  78         @BeanProperty(
  79             bound     = true,
  80             expert    = true,
  81             hidden    = true,
  82             preferred = true,
  83             required  = true,
  84             visualUpdate = true,
  85             description = "annotation-other",
  86             enumerationValues = {
  87                 "javax.swing.SwingConstants.LEFT",
  88                 "javax.swing.SwingConstants.RIGHT",
  89                 "javax.swing.SwingConstants.CENTER"}
  90             )
  91         public   void setOther(double o) { other = o; }
  92         public double getOther()         { return other; }
  93 
  94         public void addActionListener(ActionListener l) {}
  95         public void removeActionListener(ActionListener l) {}
  96 
  97         public void addMouseListener(MouseListener l) {}
  98         public void removeMouseListener(MouseListener l) {}
  99     }
 100 
 101     // ========== user-defined bean info ==========
 102 
 103     public static class TestClassBeanInfo extends SimpleBeanInfo {
 104 
 105         private static final int iOther = 0;
 106         private static final int iValue = 1;
 107 
 108         private static final int iAction = 0;
 109         private static final int iMouse  = 1;
 110 
 111 
 112         @Override
 113         public BeanDescriptor getBeanDescriptor() {
 114 
 115             BeanDescriptor bd = new BeanDescriptor(TestClass.class, null);
 116             bd.setShortDescription("user-defined-description");
 117             bd.setValue("isContainer", true);
 118             bd.setValue("containerDelegate", "user-defined-delegate");
 119 
 120             return bd;
 121         }
 122 
 123         @Override
 124         public PropertyDescriptor[] getPropertyDescriptors() {
 125 
 126             PropertyDescriptor[] p = new PropertyDescriptor[2];
 127 
 128             try {
 129 
 130                 // value
 131                 PropertyDescriptor pdValue = new PropertyDescriptor(
 132                     "value", TestClass.class, "getValue", "setValue");
 133                 pdValue.setBound(true);
 134                 pdValue.setConstrained(true);
 135                 pdValue.setExpert(true);
 136                 pdValue.setHidden(true);
 137                 pdValue.setPreferred(true);
 138                 pdValue.setValue("required", true);
 139                 pdValue.setValue("visualUpdate", true);
 140                 pdValue.setShortDescription("user-defined-value");
 141                 pdValue.setValue("enumerationValues", new Object[]{
 142                         "EAST", 3, "javax.swing.SwingConstants.EAST",
 143                         "WEST", 7, "javax.swing.SwingConstants.WEST"});
 144                 p[iValue] = pdValue;
 145 
 146                 // other
 147                 PropertyDescriptor pdOther = new PropertyDescriptor(
 148                         "other", TestClass.class, "getOther", "setOther");
 149                 pdOther.setBound(false);
 150                 pdOther.setConstrained(false);
 151                 pdOther.setExpert(false);
 152                 pdOther.setHidden(false);
 153                 pdOther.setPreferred(false);
 154                 pdOther.setValue("required", false);
 155                 pdOther.setValue("visualUpdate", false);
 156                 pdOther.setShortDescription("user-defined-other");
 157                 pdOther.setValue("enumerationValues", new Object[]{
 158                         "TOP", 1, "javax.swing.SwingConstants.TOP"});
 159                 p[iOther] = pdOther;
 160 
 161             } catch(IntrospectionException e) {
 162                 e.printStackTrace();
 163             }
 164 
 165             return p;
 166         }
 167 
 168         @Override
 169         public EventSetDescriptor[] getEventSetDescriptors() {
 170             EventSetDescriptor[] es = new EventSetDescriptor[2];
 171             try {
 172                 es[iAction] = new EventSetDescriptor(
 173                         TestClass.class,
 174                         "actionListener",
 175                         java.awt.event.ActionListener.class,
 176                         new String[] {"actionPerformed"},
 177                         "addActionListener",
 178                         "removeActionListener");
 179                 es[iMouse] = new EventSetDescriptor(
 180                         TestClass.class,
 181                         "mouseListener",
 182                         java.awt.event.MouseListener.class,
 183                         new String[] {"mouseClicked", "mousePressed", "mouseReleased", "mouseEntered", "mouseExited"},
 184                         "addMouseListener",
 185                         "removeMouseListener");
 186             } catch(IntrospectionException e) {
 187                 e.printStackTrace();
 188             }
 189             return es;
 190         }
 191 
 192         @Override
 193         public MethodDescriptor[] getMethodDescriptors() {
 194             MethodDescriptor[] m = new MethodDescriptor[0];
 195             return m;
 196         }
 197 
 198         @Override
 199         public int getDefaultPropertyIndex() { return iValue; } // default: value
 200 
 201         @Override
 202         public int getDefaultEventIndex() { return iAction; } // default: action
 203 
 204         @Override
 205         public java.awt.Image getIcon(int iconKind) { return null; }
 206     }
 207 
 208     // ========== auxiliary functions ==========
 209 
 210     static void checkEq(String what, Object v, Object ref) throws Exception {
 211 
 212         if ((v != null) && v.equals(ref)) {
 213             System.out.println(what + ": ok (" + ref.toString() + ")");
 214         } else {
 215             throw new Exception(
 216                 "invalid " + what + ", expected: \"" + ref + "\", got: \"" + v + "\"");
 217         }
 218     }
 219 
 220     static void checkEnumEq(String what, Object v, Object ref[]) throws Exception {
 221 
 222         what = "\"" + what + "\"";
 223         if (v == null) {
 224             throw new Exception("null " + what + " enumeration values");
 225         }
 226 
 227         String msg = "invalid " + what + " enumeration values";
 228         if (!(v instanceof Object[])) { throw new Exception(msg); }
 229 
 230         if (Arrays.equals((Object []) v, ref)) {
 231             System.out.println(what + " enumeration values: ok");
 232         } else { throw new Exception(msg); }
 233     }
 234 
 235 
 236     // ========== test ==========
 237 
 238 
 239     public static void main(String[] args) throws Exception {
 240 
 241         BeanInfo i = Introspector.getBeanInfo(TestClass.class, Object.class);
 242         BeanDescriptor bd = i.getBeanDescriptor();
 243 
 244         checkEq("description", bd.getShortDescription(), "user-defined-description");
 245         checkEq("default property index", i.getDefaultPropertyIndex(), 1);
 246         checkEq("default event index", i.getDefaultEventIndex(), 0);
 247 
 248         checkEq("isContainer", i.getBeanDescriptor().getValue("isContainer"), true);
 249         checkEq("containerDelegate",
 250             i.getBeanDescriptor().getValue("containerDelegate"), "user-defined-delegate");
 251         System.out.println("");
 252 
 253         PropertyDescriptor[] pds = i.getPropertyDescriptors();
 254         for (PropertyDescriptor pd: pds) {
 255             String name = pd.getName();
 256             switch (name) {
 257                 case "value":
 258                     checkEq("\"value\" isBound",       pd.isBound(),       true);
 259                     checkEq("\"value\" isConstrained", pd.isConstrained(), true);
 260                     checkEq("\"value\" isExpert",      pd.isExpert(),      true);
 261                     checkEq("\"value\" isHidden",      pd.isHidden(),      true);
 262                     checkEq("\"value\" isPreferred",   pd.isPreferred(),   true);
 263                     checkEq("\"value\" required",      pd.getValue("required"),     true);
 264                     checkEq("\"value\" visualUpdate",  pd.getValue("visualUpdate"), true);
 265 
 266                     checkEq("\"value\" description",   pd.getShortDescription(), "user-defined-value");
 267 
 268                     checkEnumEq(pd.getName(), pd.getValue("enumerationValues"),
 269                         new Object[]{
 270                         "EAST", 3, "javax.swing.SwingConstants.EAST",
 271                         "WEST", 7, "javax.swing.SwingConstants.WEST"});
 272                     System.out.println("");
 273                     break;
 274                 case "other":
 275                     checkEq("\"other\" isBound",       pd.isBound(),       false);
 276                     checkEq("\"other\" isConstrained", pd.isConstrained(), false);
 277                     checkEq("\"other\" isExpert",      pd.isExpert(),      false);
 278                     checkEq("\"other\" isHidden",      pd.isHidden(),      false);
 279                     checkEq("\"other\" isPreferred",   pd.isPreferred(),   false);
 280                     checkEq("\"other\" required",      pd.getValue("required"),     false);
 281                     checkEq("\"other\" visualUpdate",  pd.getValue("visualUpdate"), false);
 282 
 283                     checkEq("\"other\" description",   pd.getShortDescription(), "user-defined-other");
 284 
 285                     checkEnumEq(pd.getName(), pd.getValue("enumerationValues"),
 286                         new Object[]{"TOP", 1, "javax.swing.SwingConstants.TOP"});
 287                     System.out.println("");
 288                     break;
 289                 default:
 290                     throw new Exception("invalid property descriptor: " + name);
 291             }
 292         }
 293     }
 294 }