package cutils.reflection;


public class IntrospectUtil extends ReflectUtil {
  private java.beans.MethodDescriptor methodDescriptors[];
  private java.beans.BeanInfo bi = null;
  private java.beans.PropertyDescriptor propertyDescriptors[];
  private java.lang.reflect.Method readMethods[];
  private java.lang.reflect.Method writeMethods[];

  IntrospectUtil(Object _o) {
    super(_o);
    try {
      bi = java.beans.Introspector.getBeanInfo(getC());
      methodDescriptors = bi.getMethodDescriptors();
      propertyDescriptors = bi.getPropertyDescriptors();
      readMethods = getReadMethods();
      writeMethods = getWriteMethods();
    } catch (java.beans.IntrospectionException e) {
      e.printStackTrace();
    }
  }
  
  public static void testIndexedPropertyDescriptors() 
        throws java.beans.IntrospectionException {
    print(getIndexedPropertyDescriptors(new java.util.Date()));
  }  
  
  public static void print(java.beans.IndexedPropertyDescriptor ipd[]) {
    System.out.println("Property Names\tProperty Type");
    for (int i=0;i < ipd.length;i++) {
        System.out.println(
            ipd[i].getName()
            + "\t\t"
            + ipd[i].getPropertyType());
    }
  }

  public static java.beans.PropertyDescriptor[] getIndexedPropertyDescriptors(Object o) 
        throws java.beans.IntrospectionException {
    Class c = o.getClass();
    java.beans.BeanInfo bi = java.beans.Introspector.getBeanInfo(c);
    java.beans.PropertyDescriptor pd[] = bi.getPropertyDescriptors();
    return bi.getPropertyDescriptors();
  }

  
  public static void testPropertyDescriptors() 
        throws java.beans.IntrospectionException {
    print(getPropertyDescriptors(new java.util.Date()));
  }  
  
  public static void print(java.beans.PropertyDescriptor pd[]) {
    System.out.println("Property Names\tProperty Type");
    for (int i=0;i < pd.length;i++) {
        System.out.println(
            pd[i].getName()
            + "\t\t"
            + pd[i].getPropertyType());
    }
  }

  public static java.beans.PropertyDescriptor[] getPropertyDescriptors(Object o) 
        throws java.beans.IntrospectionException {
    Class c = o.getClass();
    java.beans.BeanInfo bi = java.beans.Introspector.getBeanInfo(c);
    return bi.getPropertyDescriptors();
  }

 
  public static void testMethodDescriptors() 
        throws java.beans.IntrospectionException {
    print(getMethodDescriptors(new java.util.Date()));
  }  

  public static void print(java.beans.MethodDescriptor md[]) {
    System.out.println("Method Names");
    for (int i=0;i<md.length;i++) {
        System.out.print(md[i].getName()+" ");
    }
  }
 
  public static java.beans.MethodDescriptor[] getMethodDescriptors(Object o) 
        throws java.beans.IntrospectionException {
    Class c = o.getClass();
    java.beans.BeanInfo bi = java.beans.Introspector.getBeanInfo(c);
    return bi.getMethodDescriptors();
  }


  public String getBeanInfo() {
    return "BeanInfo:"
        + getBeanDescriptorString(bi) + "\n"
        + bi.getEventSetDescriptors() + "\n"
        + bi.getPropertyDescriptors();
  }
  // cutils.reflection.IntrospectUtil
  public static void main(String args[]) {
    try {
        testPropertyDescriptors();
    } catch(java.beans.IntrospectionException e) {
        e.printStackTrace();
    }
  }
  public static void testEventSetDescriptors() 
        throws java.beans.IntrospectionException {
    print(getEventSetDescriptors(new javax.swing.JButton()));
  }  
  public static java.beans.EventSetDescriptor[] getEventSetDescriptors(Object o) 
        throws java.beans.IntrospectionException {
    Class c = o.getClass();
    java.beans.BeanInfo bi = java.beans.Introspector.getBeanInfo(c);
    return bi.getEventSetDescriptors();
  }


  public static void print(java.beans.EventSetDescriptor esd[]) {
     System.out.println ("\n\tListeners\n\t---------");
     for (int i=0;i<esd.length;i++) {   
        System.out.println (
            "(" + (i+1) + ")\t"
            + esd[i].getName() 
            + " - " 
            + esd[i].getListenerType());
      }
  }
  

  public static String getBeanDescriptorString(java.beans.BeanInfo bi) {
    java.beans.BeanDescriptor bd = bi.getBeanDescriptor();
    return bd.getBeanClass().toString()
        + "\n"
        + "name=" + bd.getName()
        + "\ngetDisplayName=" + bd.getDisplayName()
        + "\nisHidden=" + bd.isHidden()
        + "\ngetShortDescription=" + bd.getShortDescription();
  }

  public void print() {
    print(getBeanInfo());
  }

  public void print(Object o) {
    System.out.println(o);
  }

  public java.lang.reflect.Method[] getReadMethods() {
    for (int i = 0; i < propertyDescriptors.length; i++) {

    }
    return null;
  }

  public java.lang.reflect.Method[] getWriteMethods() {
    return null;
  }

  public static void testIntrospectUtil() {
    IntrospectUtil iu = new IntrospectUtil(new java.util.Vector());
    iu.print();
    DelegateSynthesizer ds = new DelegateSynthesizer();
    ds.add(iu.bi);
    ds.add(iu.methodDescriptors[0]);
    ds.add(iu.propertyDescriptors[0]);
    ds.print();
  }
}