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