I'm checking this in.

This adds a new 1.5 method to java.beans.

Tom

2006-03-04  Tom Tromey  <[EMAIL PROTECTED]>

        * java/beans/PropertyDescriptor.java (createPropertyEditor): New
        method.
        (findConstructor): Likewise.
        (instantiateClass): Likewise.

Index: java/beans/PropertyDescriptor.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/beans/PropertyDescriptor.java,v
retrieving revision 1.16
diff -u -r1.16 PropertyDescriptor.java
--- java/beans/PropertyDescriptor.java  29 Sep 2005 22:35:39 -0000      1.16
+++ java/beans/PropertyDescriptor.java  4 Mar 2006 20:24:30 -0000
@@ -37,6 +37,8 @@
 
 package java.beans;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 
 /**
@@ -344,6 +346,71 @@
         this.propertyEditorClass = propertyEditorClass;
     }
 
+    /**
+     * Instantiate a property editor using the property editor class.
+     * If no property editor class has been set, this will return null.
+     * If the editor class has a public constructor which takes a single
+     * argument, that will be used and the bean parameter will be passed
+     * to it.  Otherwise, a public no-argument constructor will be used,
+     * if available.  This method will return null if no constructor is
+     * found or if construction fails for any reason.
+     * @param bean the argument to the constructor
+     * @return a new PropertyEditor, or null on error
+     * @since 1.5
+     */
+    public PropertyEditor createPropertyEditor(Object bean)
+    {
+      if (propertyEditorClass == null)
+        return null;
+      Constructor c = findConstructor(propertyEditorClass,
+                                      new Class[] { Object.class });
+      if (c != null)
+        return instantiateClass(c, new Object[] { bean });
+      c = findConstructor(propertyEditorClass, null);
+      if (c != null)
+        return instantiateClass(c, null);
+      return null;
+    }
+
+    // Helper method to look up a constructor and return null if it is not
+    // found.
+    private Constructor findConstructor(Class k, Class[] argTypes)
+    {
+      try
+        {
+          return k.getConstructor(argTypes);
+        }
+      catch (NoSuchMethodException _)
+        {
+          return null;
+        }
+    }
+
+    // Helper method to instantiate an object but return null on error.
+    private PropertyEditor instantiateClass(Constructor c, Object[] args)
+    {
+      try
+        {
+          return (PropertyEditor) c.newInstance(args);
+        }
+      catch (InstantiationException _)
+        {
+          return null;
+        }
+      catch (InvocationTargetException _)
+        {
+          return null;
+        }
+      catch (IllegalAccessException _)
+        {
+          return null;
+        }
+      catch (ClassCastException _)
+        {
+          return null;
+        }
+    }
+
     private void findMethods(
         Class beanClass,
         String getMethodName1,

Reply via email to