blob: e42fa6228f3291b2db029206f2503916f0e582c6 [file] [log] [blame]
/*
* 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");
}
}