| /* | |
| * Copyright (c) 2016, 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.beans.BeanInfo; | |
| import java.beans.BeanProperty; | |
| import java.beans.IntrospectionException; | |
| import java.beans.Introspector; | |
| import java.beans.PropertyChangeListener; | |
| import java.beans.PropertyDescriptor; | |
| import java.util.Arrays; | |
| /** | |
| * @test | |
| * @bug 8132565 8155013 | |
| * @summary Some inheritance check for BeanProperty annotation | |
| * @author a.stepanov | |
| * @run main InheritanceBeanPropertyTest | |
| */ | |
| public class InheritanceBeanPropertyTest { | |
| private final static String DESCRIPTION = "TEST"; | |
| private final static boolean BOUND = true; | |
| private final static boolean EXPERT = false; | |
| private final static boolean HIDDEN = true; | |
| private final static boolean PREFERRED = false; | |
| private final static boolean REQUIRED = true; | |
| private final static boolean UPDATE = false; | |
| private final static double X = java.lang.Math.PI; | |
| private final static String | |
| V_NAME = "java.lang.Math.PI", | |
| V_SHORT = "PI", | |
| V = Double.toString(X); | |
| private final static String DESCRIPTION_2 = "XYZ"; | |
| // ---------- test cases ---------- | |
| public static class BaseGet { | |
| private final static String TESTCASE = "base getter"; | |
| public double getX() { return X; } | |
| } | |
| public static class OverloadGet extends BaseGet { | |
| private final static String TESTCASE = "overload getter"; | |
| private final double x[] = {X, X, X}; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public double getX(int i) { return x[i]; } // indexed | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static class BaseSet { | |
| private final static String TESTCASE = "base setter"; | |
| double u; | |
| public void setX(double v) { u = v; } | |
| } | |
| public static class OverloadSet extends BaseSet { | |
| private final static String TESTCASE = "overload setter"; | |
| private final double x[] = {X, X, X}; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public void setX(int i, double v) { x[i] = v; } // indexed | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static class BaseIGet { | |
| protected final double x[] = {X, X, X}; | |
| public double[] getX() { return x; } | |
| } | |
| public static class OverloadIGet extends BaseIGet { | |
| private final static String TESTCASE = "overload indexed getter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public double getX(int i) { return x[i]; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static class BaseISet { | |
| protected double x[] = {X, X, X}; | |
| public void setX(double a[]) { x = Arrays.copyOf(a, a.length); } | |
| } | |
| public static class OverloadISet extends BaseISet { | |
| private final static String TESTCASE = "overload indexed setter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public void setX(int i, double v) { x[i] = v; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static class BoolGet { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public boolean getX() { return false; } | |
| } | |
| public static class BoolGetIs extends BoolGet { | |
| private final static String TESTCASE = "base boolean getter + is"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE) | |
| public boolean isX() { return false; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static class BoolIs { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public boolean isX() { return false; } | |
| } | |
| public static class BoolIsGet extends BoolIs { | |
| private final static String TESTCASE = "base is + boolean getter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE) | |
| public boolean getX() { return false; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static class AnnotatedGet { | |
| private final static String TESTCASE = "annotated super getter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public double getX() { return 0.; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public static class OverrideAnnotatedGet extends AnnotatedGet { | |
| private final static String TESTCASE = "override annotated getter"; | |
| @Override | |
| public double getX() { return X; } | |
| } | |
| // ---------- | |
| public static class AnnotatedIs { | |
| private final static String TESTCASE = "annotated super is"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public boolean isX() { return false; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public static class OverrideAnnotatedIs extends AnnotatedIs { | |
| private final static String TESTCASE = "override annotated is"; | |
| @Override | |
| public boolean isX() { return false; } | |
| } | |
| // ---------- | |
| public static class AnnotatedSet { | |
| private final static String TESTCASE = "annotated super set"; | |
| protected double x; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public void setX(double v) { x = -v; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public static class OverrideAnnotatedSet extends AnnotatedSet { | |
| private final static String TESTCASE = "override annotated setter"; | |
| @Override | |
| public void setX(double v) { x = v; } | |
| } | |
| // ---------- | |
| public static class AnnotatedGet2 { | |
| protected double x; | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public double getX() { return 0.; } | |
| } | |
| public static class OverrideAnnotatedGet2 extends AnnotatedGet2 { | |
| private final static String TESTCASE = "override annotated getter - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| @Override | |
| public double getX() { return X; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public static class AnnotatedGet2Ext extends AnnotatedGet2 { | |
| private final static String TESTCASE = "extend annotated getter - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public void setX(double v) { x = v; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static class AnnotatedIs2 { | |
| protected boolean b = false; | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public boolean isX() { return false; } | |
| } | |
| public static class OverrideAnnotatedIs2 extends AnnotatedIs2 { | |
| private final static String TESTCASE = "override annotated is - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE) | |
| @Override | |
| public boolean isX() { return b; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public static class AnnotatedIs2Ext extends AnnotatedIs2 { | |
| private final static String TESTCASE = "extend annotated is - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE) | |
| public void setX(boolean v) { b = v; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static class AnnotatedSet2 { | |
| protected double x; | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public void setX(double v) { x = -v; } | |
| } | |
| public static class OverrideAnnotatedSet2 extends AnnotatedSet2 { | |
| private final static String TESTCASE = "override annotated setter - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| @Override | |
| public void setX(double v) { x = v; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public static class AnnotatedSet2Ext extends AnnotatedSet2 { | |
| private final static String TESTCASE = "extend annotated setter - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public double getX() { return x; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public abstract static class AbstractGet { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public abstract double getX(); | |
| } | |
| public static class OverrideAbstractGet extends AbstractGet { | |
| private final static String TESTCASE = | |
| "override abstract annotated getter"; | |
| @Override | |
| public double getX() { return X; } | |
| } | |
| public static class OverrideAbstractGet2 extends AbstractGet { | |
| private final static String TESTCASE = | |
| "override abstract annotated getter - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| @Override | |
| public double getX() { return X; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public abstract static class AbstractGetExt extends AbstractGet { | |
| private final static String TESTCASE = | |
| "extend abstract annotated getter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public abstract void setX(double v); | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public abstract static class AbstractIs { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public abstract boolean isX(); | |
| } | |
| public static class OverrideAbstractIs extends AbstractIs { | |
| private final static String TESTCASE = | |
| "override abstract annotated is"; | |
| @Override | |
| public boolean isX() { return true; } | |
| } | |
| public static class OverrideAbstractIs2 extends AbstractIs { | |
| private final static String TESTCASE = | |
| "override abstract annotated is - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE) | |
| @Override | |
| public boolean isX() { return true; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public abstract static class AbstractIsExt extends AbstractIs { | |
| private final static String TESTCASE = | |
| "extend abstract annotated is"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE) | |
| public abstract boolean getX(); | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public abstract static class AbstractSet { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public abstract void setX(double v); | |
| } | |
| public static class OverrideAbstractSet extends AbstractSet { | |
| private final static String TESTCASE = | |
| "override abstract annotated setter"; | |
| private double x; | |
| @Override | |
| public void setX(double v) { x = v; } | |
| } | |
| public static class OverrideAbstractSet2 extends AbstractSet { | |
| private final static String TESTCASE = | |
| "override abstract annotated setter - 2"; | |
| private double x; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| @Override | |
| public void setX(double v) { x = v; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public abstract static class AbstractSetExt extends AbstractSet { | |
| private final static String TESTCASE = | |
| "extend abstract annotated setter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public abstract void setX(double v[]); | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static abstract class AbstractGet2 { | |
| private final static String TESTCASE = "abstract super getter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public abstract double getX(); | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public static abstract class AbstractGet2Ext extends AbstractGet2 { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public abstract void setX(double a[]); | |
| } | |
| // ---------- | |
| public static interface IGet { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| double getX(); | |
| } | |
| public static class IGetImpl implements IGet { | |
| private final static String TESTCASE = "implement getter interface"; | |
| @Override | |
| public double getX() { return X; } | |
| } | |
| public static class IGetImpl2 implements IGet { | |
| private final static String TESTCASE = "implement getter interface - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| @Override | |
| public double getX() { return X; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public abstract static class IGetImpl3 implements IGet { | |
| private final static String TESTCASE = "implement getter interface - 3"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public abstract void setX(double v); | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static interface IIs { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public boolean isX(); | |
| } | |
| public static class IIsImpl implements IIs { | |
| private final static String TESTCASE = "implement is interface"; | |
| @Override | |
| public boolean isX() { return true; } | |
| } | |
| public static class IIsImpl2 implements IIs { | |
| private final static String TESTCASE = "implement is interface - 2"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE) | |
| @Override | |
| public boolean isX() { return true; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public abstract static class IIsImpl3 implements IIs { | |
| private final static String TESTCASE = "implement is interface - 3"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE) | |
| public abstract void setX(boolean v); | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static interface ISet { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public void setX(double v); | |
| } | |
| public static class ISetImpl implements ISet { | |
| private final static String TESTCASE = "implement getter interface"; | |
| private double x; | |
| @Override | |
| public void setX(double v) { x = v; } | |
| } | |
| public static class ISetImpl2 implements ISet { | |
| private final static String TESTCASE = "implement getter interface - 2"; | |
| private double x; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| @Override | |
| public void setX(double v) { x = v; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| public abstract static class ISetImpl3 implements ISet { | |
| private final static String TESTCASE = "implement getter interface - 3"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public abstract double getX(); | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static interface ISet2 { | |
| final static String TESTCASE = "super interface - setter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public void setX(double v); | |
| public void addPropertyChangeListener(PropertyChangeListener l); | |
| public void removePropertyChangeListener(PropertyChangeListener l); | |
| } | |
| public static class ISet2Impl implements ISet2 { | |
| private double x; | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| @Override | |
| public void setX(double v) { x = v; } | |
| @Override | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| @Override | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static interface IGet2 { | |
| final static String TESTCASE = "super interface - indexed getter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| public double[] getX(); | |
| public void addPropertyChangeListener(PropertyChangeListener l); | |
| public void removePropertyChangeListener(PropertyChangeListener l); | |
| } | |
| public static class IGet2Impl implements IGet2 { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| @Override | |
| public double[] getX() { return new double[]{X, X}; } | |
| @Override | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| @Override | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| public static class ProtectedGet { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| protected double getX() { return 0.; } | |
| } | |
| public static class OverrideProtectedGet extends ProtectedGet { | |
| final static String TESTCASE = "override protected getter"; | |
| @BeanProperty( | |
| description = DESCRIPTION, | |
| bound = BOUND, | |
| expert = EXPERT, | |
| hidden = HIDDEN, | |
| preferred = PREFERRED, | |
| required = REQUIRED, | |
| visualUpdate = UPDATE, | |
| enumerationValues = {V_NAME}) | |
| @Override | |
| public double getX() { return X; } | |
| public void addPropertyChangeListener(PropertyChangeListener l) {} | |
| public void removePropertyChangeListener(PropertyChangeListener l) {} | |
| } | |
| // ---------- | |
| // static getter - see also JDK-8154938 | |
| public static class StaticGet { | |
| @BeanProperty( | |
| description = DESCRIPTION_2, | |
| bound = !BOUND, | |
| expert = !EXPERT, | |
| hidden = !HIDDEN, | |
| preferred = !PREFERRED, | |
| required = !REQUIRED, | |
| visualUpdate = !UPDATE) | |
| public static double getProp() { return 0.; } | |
| } | |
| public static class HideStaticGet extends StaticGet { | |
| final static String TESTCASE = "hide static getter"; | |
| public double getX() { return X; } // add to get the "default" info | |
| public static double getProp() { return X; } | |
| } | |
| // TODO: if 8154938 is considered to be a real issue, | |
| // create one more test case "HideStaticGet2 extends StaticGet" with an | |
| // annotated getter and check the correctness of the corresponding bean info | |
| // ---------- checks ---------- | |
| private static boolean check(String what, boolean v, boolean ref) { | |
| boolean ok = (v == ref); | |
| if (!ok) { System.out.println( | |
| "invalid " + what + ": " + v + ", expected: " + ref); } | |
| return ok; | |
| } | |
| private static boolean checkInfo(BeanInfo i, boolean ignoreValsCheck) { | |
| System.out.println("checking info..."); | |
| PropertyDescriptor descriptors[] = i.getPropertyDescriptors(); | |
| int nd = descriptors.length; | |
| if (nd != 1) { | |
| System.out.println("invalid number of descriptors: " + nd); | |
| return false; | |
| } | |
| PropertyDescriptor d = descriptors[0]; | |
| String descr = d.getShortDescription(); | |
| boolean ok = descr.equals(DESCRIPTION); | |
| if (!ok) { System.out.println("invalid description: " + descr + | |
| ", expected: " + DESCRIPTION); } | |
| ok &= check("isBound", d.isBound(), BOUND); | |
| ok &= check("isExpert", d.isExpert(), EXPERT); | |
| ok &= check("isHidden", d.isHidden(), HIDDEN); | |
| ok &= check("isPreferred", d.isPreferred(), PREFERRED); | |
| ok &= check("required", (boolean) d.getValue("required"), REQUIRED); | |
| ok &= check("visualUpdate", | |
| (boolean) d.getValue("visualUpdate"), UPDATE); | |
| if (ignoreValsCheck) { return ok; } | |
| Object vals[] = (Object[]) d.getValue("enumerationValues"); | |
| if (vals == null) { | |
| System.out.println("null enumerationValues"); | |
| return false; | |
| } | |
| boolean okVals = ( | |
| (vals.length == 3) && | |
| vals[0].toString().equals(V_SHORT) && | |
| vals[1].toString().equals(V) && | |
| vals[2].toString().equals(V_NAME)); | |
| if (!okVals) { System.out.println("invalid enumerationValues"); } | |
| return (ok && okVals); | |
| } | |
| private static boolean checkDefault(BeanInfo i) { | |
| System.out.println("checking default info..."); | |
| PropertyDescriptor descriptors[] = i.getPropertyDescriptors(); | |
| int nd = descriptors.length; | |
| if (nd != 1) { | |
| System.out.println("invalid number of descriptors: " + nd); | |
| return false; | |
| } | |
| PropertyDescriptor d = descriptors[0]; | |
| String descr = d.getShortDescription(); | |
| boolean ok = descr.equals("x"); | |
| if (!ok) { System.out.println("invalid description: " + descr + | |
| ", expected: x"); } | |
| ok &= check("isBound", d.isBound(), false); | |
| ok &= check("isExpert", d.isExpert(), false); | |
| ok &= check("isHidden", d.isHidden(), false); | |
| ok &= check("isPreferred", d.isPreferred(), false); | |
| ok &= check("required", (boolean) d.getValue("required"), false); | |
| ok &= check("visualUpdate", | |
| (boolean) d.getValue("visualUpdate"), false); | |
| Object vals[] = (Object[]) d.getValue("enumerationValues"); | |
| if (vals != null && vals.length > 0) { | |
| System.out.println("non-empty enumerationValues"); | |
| ok = false; | |
| } | |
| return ok; | |
| } | |
| // do not check enumerationValues for these classes | |
| private static boolean ignoreVals(Class<?> c) { | |
| return ( | |
| c.equals(BoolGetIs.class) || | |
| c.equals(BoolIsGet.class) || | |
| c.equals(AnnotatedIs.class) || | |
| c.equals(OverrideAnnotatedIs2.class) || | |
| c.equals(AnnotatedIs2Ext.class) || | |
| c.equals(OverrideAbstractIs.class) || | |
| c.equals(OverrideAbstractIs2.class) || | |
| c.equals(AbstractIsExt.class) || | |
| c.equals(OverrideAbstractIs.class) || | |
| c.equals(IIsImpl.class) || | |
| c.equals(IIsImpl2.class) || | |
| c.equals(IIsImpl3.class) | |
| ); | |
| } | |
| // default property descriptor data are expected for these classes | |
| private static boolean isDefault(Class<?> c) { | |
| return ( | |
| c.equals(OverrideAnnotatedGet.class) || | |
| c.equals(OverrideAnnotatedIs.class ) || | |
| c.equals(OverrideAnnotatedSet.class) || | |
| c.equals(OverrideAbstractGet.class) || | |
| c.equals(OverrideAbstractIs.class) || | |
| c.equals(OverrideAbstractSet.class) || | |
| c.equals(IGetImpl.class) || | |
| c.equals(IIsImpl.class) || | |
| c.equals(ISetImpl.class) || | |
| c.equals(BaseGet.class) || | |
| c.equals(BaseSet.class) || | |
| c.equals(HideStaticGet.class) | |
| ); | |
| } | |
| // ---------- run test ---------- | |
| public static void main(String[] args) throws Exception { | |
| Class<?> | |
| ic1 = ISet2Impl.class.getInterfaces()[0], | |
| ic2 = IGet2Impl.class.getInterfaces()[0]; | |
| Class<?> cases[] = { | |
| OverloadGet.class, | |
| OverloadGet.class.getSuperclass(), | |
| OverloadSet.class, | |
| OverloadSet.class.getSuperclass(), | |
| OverloadIGet.class, | |
| OverloadISet.class, | |
| // TODO: uncomment/update after 8132565 fix | |
| //BoolGetIs.class, | |
| //BoolIsGet.class, | |
| //OverrideAnnotatedGet.class, | |
| //OverrideAnnotatedIs.class, | |
| //OverrideAnnotatedSet.class, | |
| //OverrideAnnotatedGet2.class, | |
| //AnnotatedGet2Ext.class, | |
| //OverrideAnnotatedIs2.class | |
| //AnnotatedIs2Ext.class, | |
| //OverrideAnnotatedSet2.class, | |
| //AnnotatedSet2Ext.class, | |
| OverrideAnnotatedGet.class.getSuperclass(), | |
| OverrideAnnotatedIs.class.getSuperclass(), | |
| OverrideAnnotatedSet.class.getSuperclass(), | |
| // TODO: uncomment/update after 8132565 fix | |
| //OverrideAbstractGet.class, | |
| //OverrideAbstractGet2.class, | |
| //AbstractGetExt.class, | |
| //OverrideAbstractIs.class, | |
| //OverrideAbstractIs2.class, | |
| //AbstractIsExt.class | |
| //OverrideAbstractSet.class, | |
| //OverrideAbstractSet2.class, | |
| //AbstractSetExt.class, | |
| AbstractGet2Ext.class.getSuperclass(), | |
| IGetImpl.class, | |
| IGetImpl2.class, | |
| IGetImpl3.class, | |
| IIsImpl.class, | |
| IIsImpl2.class, | |
| IIsImpl3.class, | |
| ISetImpl.class, | |
| ISetImpl2.class, | |
| ISetImpl3.class, | |
| ic1, | |
| // ic2, // TODO: uncomment/update after 8155013 fix | |
| OverrideProtectedGet.class, | |
| HideStaticGet.class | |
| }; | |
| boolean passed = true; | |
| for (Class<?> c: cases) { | |
| java.lang.reflect.Field f = c.getDeclaredField("TESTCASE"); | |
| f.setAccessible(true); | |
| String descr = f.get(c).toString(); | |
| System.out.println("\n" + c.getSimpleName() + " (" + descr + "):"); | |
| BeanInfo i; | |
| try { | |
| i = Introspector.getBeanInfo(c, | |
| (c.equals(ic1) || c.equals(ic2)) ? null : Object.class); | |
| } | |
| catch (IntrospectionException e) { throw new RuntimeException(e); } | |
| boolean ok; | |
| if (isDefault(c)) { | |
| ok = checkDefault(i); | |
| } else { | |
| ok = checkInfo(i, ignoreVals(c)); | |
| } | |
| System.out.println(ok ? "OK" : "NOK"); | |
| passed = passed && ok; | |
| } | |
| if (!passed) { throw new RuntimeException("test failed"); } | |
| System.out.println("\ntest passed"); | |
| } | |
| } |