Uploaded image for project: 'Commons BeanUtils'
  1. Commons BeanUtils
  2. BEANUTILS-172

[beanutils] BeanUtils and PropertyUtils toString function (code included)

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Minor
    • Resolution: Unresolved
    • None
    • 2.0.0
    • Bean / Property Utils
    • None
    • Operating System: All
      Platform: All

    • 21483

    Description

      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());
      }

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              barker@itgssi.com Ryan Barker
              Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

                Created:
                Updated: