You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by bu...@apache.org on 2003/07/11 01:39:50 UTC

DO NOT REPLY [Bug 21483] New: - BeanUtils and PropertyUtils toString function (code included)

DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG 
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=21483>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND 
INSERTED IN THE BUG DATABASE.

http://nagoya.apache.org/bugzilla/show_bug.cgi?id=21483

BeanUtils and PropertyUtils toString function (code included)

           Summary: BeanUtils and PropertyUtils toString function (code
                    included)
           Product: Commons
           Version: unspecified
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: Enhancement
          Priority: Other
         Component: Bean Utilities
        AssignedTo: commons-dev@jakarta.apache.org
        ReportedBy: barker@itgssi.com


I thought it would be nice if there was an easy way to have a toString function
that would take a bean and output a string, as writing toString functions for
the BeanUtils class gets old fast. So I went and wrote one based off the
toString function for org.apache.struts.action.DynaActionForm.

The following function will output the contents of a bean in a very verbose
manner. I would suggest that this version is suitable for PropertyUtils, while a
BeanUtils version would not have the code blocks for  the verbose List, Array
and Map strings. This code uses recursion to handle nested beans.

Feel free to email me regarding this code

////////////////////////////////////////////////
// Code Start
////////////////////////////////////////////////

   public static String toString(Object value) {
      if (value == null) {
         return "<NULL>";
      }
      StringBuffer sb = new StringBuffer();
      if (value.getClass().isArray()) {
         // verbose array output
         int n = Array.getLength(value);
         sb.append("{");
         for (int j = 0; j < n; j++) {
            if (j > 0) {
               sb.append(',');
            }
            sb.append(toString(Array.get(value, j)));
         }
         sb.append("}");
      } else if (value instanceof List) {
         // verbose list output
         int n = ((List) value).size();
         sb.append("{");
         for (Iterator j=((List) value).iterator(); j.hasNext(); ) {
            sb.append(toString(j.next()));
            if (j.hasNext()) {
               sb.append(',');
            }
         }
         sb.append("}");
      } else if (value instanceof Map) {
         // verbose map output
         Iterator j = ((Map) value).entrySet().iterator();
         sb.append("{");
         while (j.hasNext()) {
            Map.Entry e = (Map.Entry) j.next();
            sb.append(e.getKey());
            sb.append('=');
            sb.append(toString(e.getValue()));
            if (j.hasNext()) {
               sb.append(',');
            }
         }
         sb.append("}");
      } else if (ConvertUtils.lookup(value.getClass()) != null) {
         // use the convertutils for this parameter
         sb.append(ConvertUtils.convert(value));
      } else {
         // check if this class has a toString method declared anywhere for it
         Method toStringMethod =
MethodUtils.getAccessibleMethod(value.getClass(),"toString",new Class [0]);
         if (toStringMethod == null ||
toStringMethod.getDeclaringClass().getName().equals("java.lang.Object")) {
            // its a bean!
            sb.append("[className=");
            sb.append(value.getClass().getName());
            // find its properties
            Map props = null;
            try {
               props = PropertyUtils.describe(value);
            } catch (Exception e) {
               sb.append("<EXCEPTION>");
            }
            // and print them
            if (props != null) {
               for (Iterator i=props.entrySet().iterator(); i.hasNext(); ) {
                  Map.Entry entry = (Map.Entry) i.next();
                  Object entryValue = entry.getValue();
                  // dont print the class name twice
                  if (!(entryValue instanceof Class)) {
                     sb.append(',');
                     sb.append(entry.getKey());
                     sb.append('=');
                     sb.append(toString(entry.getValue()));
                  }
               }
            }
            sb.append("]");
         } else {
            // use the normal toString method
            sb.append(value.toString());
         }
      }
      return (sb.toString());
   }

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org