
import java.beans.*;

public class Test {

    private static class A {
        public int getX() { return -1; }
    }

    public static class ABeanInfo extends SimpleBeanInfo {
        @Override
        public PropertyDescriptor[] getPropertyDescriptors() {
            PropertyDescriptor[] p = new PropertyDescriptor[1];

            try {
                p[0] = new PropertyDescriptor ("test getter", A.class, "getX", null);
                p[0].setExpert(true);
                p[0].setPreferred(true);
                p[0].setValue("required", false);
                p[0].setValue("visualUpdate", true);
            } catch(IntrospectionException e) { throw new RuntimeException(e); }
            return p;
        }
    }

    private static class C extends A {
        @Override
        public int getX() { return 42; }
    }


    // --- annotated ---

    private static class A2 {

        @BeanProperty(
            description  = "annotated getter",
            bound        = false,
            expert       = true,
            hidden       = false,
            preferred    = true,
            required     = false,
            visualUpdate = true)
        public int getX() { return -1; }
    }

    private static class C2 extends A2 {
        @Override
        public int getX() { return 42; }
    }



    private static void Test(Class<?> c, String what) {

        System.out.println("\n=== testing " + what + " ===");

        BeanInfo i;
        try { i = Introspector.getBeanInfo(c, Object.class); }
        catch (IntrospectionException e) { throw new RuntimeException(e); }

        PropertyDescriptor descriptors[] = i.getPropertyDescriptors();
        for (PropertyDescriptor d: descriptors) {
            System.out.println();
            System.out.println(d.getShortDescription());
            System.out.println("isBound = " + d.isBound());
            System.out.println("isExpert = " + d.isExpert());
            System.out.println("isHidden = " + d.isHidden());
            System.out.println("isPreferred = " + d.isPreferred());
            System.out.println("required = " + (boolean) d.getValue("required"));
            System.out.println("visualUpdate = " + (boolean) d.getValue("visualUpdate"));
        }
    }


    public static void main(String[] args) {

        Test(A.class, "A");
        Test(C.class, "C");

        Test(A2.class, "A2");
        Test(C2.class, "C2");
    }
}
