View Javadoc
1   /*
2    * Created on May 13, 2005
3    *
4    * TODO To change the template for this generated file go to
5    * Window - Preferences - Java - Code Style - Code Templates
6    */
7   package net.sf.mindoro.commons.util;
8   
9   import java.lang.reflect.InvocationTargetException;
10  import java.lang.reflect.Method;
11  import java.lang.reflect.Modifier;
12  
13  import org.apache.commons.logging.Log;
14  import org.apache.commons.logging.LogFactory;
15  
16  /***
17   * @author aisrael
18   * 
19   * TODO To change the template for this generated type comment go to Window -
20   * Preferences - Java - Code Style - Code Templates
21   */
22  public final class BeanUtils {
23  
24      private static final Log log = LogFactory.getLog(BeanUtils.class);
25  
26      /***
27       * BeanUtils instances should not be constructed in regular programming.
28       */
29      private BeanUtils() {
30          // noop
31      }
32  
33      /***
34       * Return a String representation of the given object listing all public
35       * properties (suitable for logging or debugging).
36       * 
37       * @param obj
38       *            any Object
39       * @return a String representation of this object listing all public
40       *         properties
41       */
42      public static String beanToString(final Object obj) {
43          final StringBuffer sb = new StringBuffer();
44  
45          sb.append('(');
46          if (null == obj) {
47              sb.append("null");
48          } else {
49              final Class objClass = obj.getClass();
50              sb.append(objClass.getName()).append(' ');
51  
52              final Method[] methods = objClass.getDeclaredMethods();
53              for (int i = 0; i < methods.length; ++i) {
54                  final Method method = methods[i];
55                  if (Modifier.isPublic(method.getModifiers()) && method.getName().startsWith("get")
56                          && method.getParameterTypes().length == 0) {
57                      // most probably a public property getter
58                      extractPropertyValue(sb, obj, method);
59                  }
60              }
61          }
62          sb.append(')');
63          return sb.toString();
64      }
65  
66      /***
67       * @param sb
68       *            StringBuffer
69       * @param obj
70       *            Object
71       * @param method
72       *            Method
73       */
74      private static void extractPropertyValue(final StringBuffer sb, final Object obj, final Method method) {
75          try {
76              final Object value = method.invoke(obj, new Object[0]);
77              sb.append('(').append(getFriendlyName(method.getName())).append(' ');
78  
79              if (null == value) {
80                  sb.append("null");
81              } else {
82                  final String valueToString = value.toString();
83                  if (value.getClass() == java.lang.String.class) {
84                      sb.append('"').append(valueToString).append('"');
85                  } else {
86                      sb.append(valueToString);
87                  }
88              }
89              sb.append(')');
90          } catch (final IllegalArgumentException e) {
91              log.error("IllegalArgumentException caught invoking \"" + method.getName() + "\" on "
92                      + obj.toString(), e);
93          } catch (final IllegalAccessException e) {
94              log.error("IllegalAccessException caught invoking \"" + method.getName() + "\" on "
95                      + obj.toString(), e);
96          } catch (final InvocationTargetException e) {
97              log.error("InvocationTargetException caught invoking \"" + method.getName() + "\" on "
98                      + obj.toString(), e);
99          }
100     }
101 
102     /***
103      * @param name
104      *            getXXX() method name
105      * @return 'friendly name
106      */
107     private static String getFriendlyName(final String name) {
108         final String result;
109 
110         if (name.startsWith("get")) {
111             result = name.substring(3, 4).toLowerCase() + name.substring(4, name.length());
112         } else {
113             result = name;
114         }
115 
116         return result;
117     }
118 }