scolebourne 2002/09/17 15:07:20
Added: lang/src/java/org/apache/commons/lang/builder
ToStringBuilder.java ToStringStyle.java
StandardToStringStyle.java
Log:
Initial checkin of ToStringBuilder and assistants
Revision Changes Path
1.1
jakarta-commons/lang/src/java/org/apache/commons/lang/builder/ToStringBuilder.java
Index: ToStringBuilder.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.commons.lang.builder;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import java.util.Collection;
import java.util.Map;
/**
* <code>ToString</code> generation routine.
* <p>
* This class enables a good toString to be built for any class. This class aims
* to simplify the process by:
* <ul>
* <li>allowing field names
* <li>handling all types consistently
* <li>handling nulls consistently
* <li>outputting arrays and multi-dimensional arrays
* <li>enabling the detail level to be controlled for objects and collections
* </ul>
* <p>
* To use this class write code as follows:
* <code>
* public class Person {
* String name;
* int age;
* boolean isSmoker;
*
* ...
*
* public String toString() {
* return new ToStringBuilder(this).
* append(name, "name").
* append(age, "age").
* append(smoker, "smoker").
* toString();
* }
* }
* </code>
* This will produce a toString of the format:
* <code>Person@7f54[name=Stephen,age=29,smoker=false]</code>
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephen Colebourne</a>
* @version $Id: ToStringBuilder.java,v 1.1 2002/09/17 22:07:20 scolebourne Exp $
*/
public class ToStringBuilder {
/**
* The default style of output to use
*/
private static ToStringStyle defaultStyle;
/**
* Current toString buffer
*/
private final StringBuffer buffer;
/**
* The style of output to use
*/
private final ToStringStyle style;
/**
* The object being output
*/
private final Object object;
/**
* Constructor for ToStringBuilder.
* This constructor outputs using the default style set with
* <code>setDefaultStyle</code>.
*
* @param object the object to build a toString for, must not be null
* @throws IllegalArgumentException if the object passed in is null
*/
public ToStringBuilder(Object object) {
this(object, getDefaultStyle(), null);
}
/**
* Constructor for ToStringBuilder specifying the output style.
* <p>
* If the style is null, the default style is used.
*
* @param object the object to build a toString for, must not be null
* @param style the style of the toString to create, may be null
* @throws IllegalArgumentException if the object passed in is null
*/
public ToStringBuilder(Object object, ToStringStyle style) {
this(object, style, null);
}
/**
* Constructor for ToStringBuilder.
* <p>
* If the style is null, the default style is used.
* If the buffer is null, a new one is created.
*
* @param object the object to build a toString for, must not be null
* @param style the style of the toString to create, may be null
* @param buffer the string buffer to populate, may be null
* @throws IllegalArgumentException if the object passed in is null
*/
public ToStringBuilder(Object object, ToStringStyle style, StringBuffer buffer) {
super();
if (object == null) {
throw new IllegalArgumentException("The object to create a toString for
must not be null");
}
if (style == null) {
style = ToStringStyle.DEFAULT_STYLE;
}
if (buffer == null) {
buffer = new StringBuffer(512);
}
this.buffer = buffer;
this.style = style;
this.object = object;
style.appendStart(buffer, object);
}
//----------------------------------------------------------------------------
/**
* Gets the default style to use.
* <p>
* This could allow the toString style to be controlled for an entire
* application with one call. This might be used to have a verbose toString
* during development and a compact toString in production.
*
* @return the default toString style
*/
public static ToStringStyle getDefaultStyle() {
return defaultStyle;
}
/**
* Sets the default style to use.
*
* @param style the default toString style
* @throws IllegalArgumentException if the style is null
*/
public static void setDefaultStyle(ToStringStyle style) {
if (style == null) {
throw new IllegalArgumentException("The style must not be null");
}
defaultStyle = style;
}
//-------------------------------------------------------------------------
/**
* This method uses reflection to build a suitable toString using the default
style.
* <p>
* It uses Field.setAccessible to gain access to private fields. This means
* that it will throw a security exception if run under a security manger, if
* the permissions are not set up.
* It is also not as efficient as testing explicitly.
* Transient members will be not be included, as they are likely derived.
* Static fields will be not be included.
* fields, and not part of the value of the object.
*
* @param object the object to be output
* @return the String result
* @throws IllegalArgumentException if the object is null
*/
public static String reflectionToString(Object object) {
return reflectionToString(object, null, false);
}
/**
* This method uses reflection to build a suitable toString.
* <p>
* It uses Field.setAccessible to gain access to private fields. This means
* that it will throw a security exception if run under a security manger, if
* the permissions are not set up.
* It is also not as efficient as testing explicitly.
* Transient members will be not be included, as they are likely derived.
* Static fields will be not be included.
* fields, and not part of the value of the object.
* <p>
* If the style is null, the default style is used.
*
* @param object the object to be output
* @param style the style of the toString to create, may be null
* @return the String result
* @throws IllegalArgumentException if the object or style is null
*/
public static String reflectionToString(Object object, ToStringStyle style) {
return reflectionToString(object, style, false);
}
/**
* This method uses reflection to build a suitable toString.
* <p>
* It uses Field.setAccessible to gain access to private fields. This means
* that it will throw a security exception if run under a security manger, if
* the permissions are not set up.
* It is also not as efficient as testing explicitly.
* If the outputTransients parameter is set to true, transient members will be
* output, otherwise they are ignored, as they are likely derived fields, and
* not part of the value of the object.
* Static fields will not be tested.
* <p>
* If the style is null, the default style is used.
*
* @param object the object to be output
* @param style the style of the toString to create, may be null
* @param outputTransients whether to include transient fields
* @return the String result
* @throws IllegalArgumentException if the object or style is null
*/
public static String reflectionToString(Object object, ToStringStyle style,
boolean outputTransients) {
if (object == null) {
throw new IllegalArgumentException("The object must not be null");
}
if (style == null) {
style = getDefaultStyle();
}
Field[] fields = object.getClass().getDeclaredFields();
Field.setAccessible(fields, true);
ToStringBuilder builder = new ToStringBuilder(object, style);
for (int i = 0; i < fields.length; ++i) {
Field f = fields[i];
if (outputTransients || !Modifier.isTransient(f.getModifiers())) {
if (!Modifier.isStatic(f.getModifiers())) {
try {
builder.append(f.getName(), f.get(object));
} catch (IllegalAccessException ex) {
//this can't happen. Would get a Security exception instead
//throw a runtime exception in case the impossible happens.
throw new InternalError("Unexpected IllegalAccessException");
}
}
}
}
return builder.toString();
}
//----------------------------------------------------------------------------
/**
* Append to the toString an Object value.
*
* @param value the value to add to the toString
* @return this
*/
public ToStringBuilder append(Object object) {
style.append(buffer, null, object, null);
return this;
}
/**
* Append to the toString an Object value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, Object object) {
style.append(buffer, fieldName, object, null);
return this;
}
/**
* Append to the toString an Object value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, Object object, boolean
fullDetail) {
style.append(buffer, fieldName, object, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a long value.
*
* @param value the value to add to the toString
* @return this
*/
public ToStringBuilder append(long value) {
style.append(buffer, null, value);
return this;
}
/**
* Append to the toString a long value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, long value) {
style.append(buffer, fieldName, value);
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString an int value.
*
* @param value the value to add to the toString
* @return this
*/
public ToStringBuilder append(int value) {
style.append(buffer, null, value);
return this;
}
/**
* Append to the toString an int value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, int value) {
style.append(buffer, fieldName, value);
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a short value.
*
* @param value the value to add to the toString
* @return this
*/
public ToStringBuilder append(short value) {
style.append(buffer, null, value);
return this;
}
/**
* Append to the toString a short value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, short value) {
style.append(buffer, fieldName, value);
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a char value.
*
* @param value the value to add to the toString
* @return this
*/
public ToStringBuilder append(char value) {
style.append(buffer, null, value);
return this;
}
/**
* Append to the toString a char value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, char value) {
style.append(buffer, fieldName, value);
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a byte value.
*
* @param value the value to add to the toString
* @return this
*/
public ToStringBuilder append(byte value) {
style.append(buffer, null, value);
return this;
}
/**
* Append to the toString a byte value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, byte value) {
style.append(buffer, fieldName, value);
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a double value.
*
* @param value the value to add to the toString
* @return this
*/
public ToStringBuilder append(double value) {
style.append(buffer, null, value);
return this;
}
/**
* Append to the toString a double value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, double value) {
style.append(buffer, fieldName, value);
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a float value.
*
* @param value the value to add to the toString
* @return this
*/
public ToStringBuilder append(float value) {
style.append(buffer, null, value);
return this;
}
/**
* Append to the toString a float value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, float value) {
style.append(buffer, fieldName, value);
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a boolean value.
*
* @param value the value to add to the toString
* @return this
*/
public ToStringBuilder append(boolean value) {
style.append(buffer, null, value);
return this;
}
/**
* Append to the toString a boolean value.
*
* @param value the value to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, boolean value) {
style.append(buffer, fieldName, value);
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString an Object array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(Object[] array) {
style.append(buffer, null, array, null);
return this;
}
/**
* Append to the toString an Object array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(String fieldName, Object[] array) {
style.append(buffer, fieldName, array, null);
return this;
}
/**
* Append to the toString an Object array.
* <p>
* A boolean parameter controls the level of detail to show. Setting true
* will output the array in full. Setting false will output a summary,
* typically the size of the array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, Object[] array, boolean
fullDetail) {
style.append(buffer, fieldName, array, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a long array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(long[] array) {
style.append(buffer, null, array, null);
return this;
}
/**
* Append a hashCode for a long array.
*
* @param array the array to add to the hashCode
* @return this
*/
public ToStringBuilder append(String fieldName, long[] array) {
style.append(buffer, fieldName, array, null);
return this;
}
/**
* Append to the toString a long array.
* <p>
* A boolean parameter controls the level of detail to show. Setting true
* will output the array in full. Setting false will output a summary,
* typically the size of the array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, long[] array, boolean
fullDetail) {
style.append(buffer, fieldName, array, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a int array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(int[] array) {
style.append(buffer, null, array, null);
return this;
}
/**
* Append a hashCode for an int array.
*
* @param array the array to add to the hashCode
* @return this
*/
public ToStringBuilder append(String fieldName, int[] array) {
style.append(buffer, fieldName, array, null);
return this;
}
/**
* Append to the toString an int array.
* <p>
* A boolean parameter controls the level of detail to show. Setting true
* will output the array in full. Setting false will output a summary,
* typically the size of the array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, int[] array, boolean fullDetail)
{
style.append(buffer, fieldName, array, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a short array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(short[] array) {
style.append(buffer, null, array, null);
return this;
}
/**
* Append a hashCode for a short array.
*
* @param array the array to add to the hashCode
* @return this
*/
public ToStringBuilder append(String fieldName, short[] array) {
style.append(buffer, fieldName, array, null);
return this;
}
/**
* Append to the toString a short array.
* <p>
* A boolean parameter controls the level of detail to show. Setting true
* will output the array in full. Setting false will output a summary,
* typically the size of the array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, short[] array, boolean
fullDetail) {
style.append(buffer, fieldName, array, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a char array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(char[] array) {
style.append(buffer, null, array, null);
return this;
}
/**
* Append a hashCode for a char array.
*
* @param array the array to add to the hashCode
* @return this
*/
public ToStringBuilder append(String fieldName, char[] array) {
style.append(buffer, fieldName, array, null);
return this;
}
/**
* Append to the toString a char array.
* <p>
* A boolean parameter controls the level of detail to show. Setting true
* will output the array in full. Setting false will output a summary,
* typically the size of the array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, char[] array, boolean
fullDetail) {
style.append(buffer, fieldName, array, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a byte array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(byte[] array) {
style.append(buffer, null, array, null);
return this;
}
/**
* Append a hashCode for a byte array.
*
* @param array the array to add to the hashCode
* @return this
*/
public ToStringBuilder append(String fieldName, byte[] array) {
style.append(buffer, fieldName, array, null);
return this;
}
/**
* Append to the toString a byte array.
* <p>
* A boolean parameter controls the level of detail to show. Setting true
* will output the array in full. Setting false will output a summary,
* typically the size of the array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, byte[] array, boolean
fullDetail) {
style.append(buffer, fieldName, array, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a double array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(double[] array) {
style.append(buffer, null, array, null);
return this;
}
/**
* Append a hashCode for a double array.
*
* @param array the array to add to the hashCode
* @return this
*/
public ToStringBuilder append(String fieldName, double[] array) {
style.append(buffer, fieldName, array, null);
return this;
}
/**
* Append to the toString a double array.
* <p>
* A boolean parameter controls the level of detail to show. Setting true
* will output the array in full. Setting false will output a summary,
* typically the size of the array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, double[] array, boolean
fullDetail) {
style.append(buffer, fieldName, array, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a float array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(float[] array) {
style.append(buffer, null, array, null);
return this;
}
/**
* Append a hashCode for a float array.
*
* @param array the array to add to the hashCode
* @return this
*/
public ToStringBuilder append(String fieldName, float[] array) {
style.append(buffer, fieldName, array, null);
return this;
}
/**
* Append to the toString a float array.
* <p>
* A boolean parameter controls the level of detail to show. Setting true
* will output the array in full. Setting false will output a summary,
* typically the size of the array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, float[] array, boolean
fullDetail) {
style.append(buffer, fieldName, array, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Append to the toString a boolean array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @return this
*/
public ToStringBuilder append(boolean[] array) {
style.append(buffer, null, array, null);
return this;
}
/**
* Append a hashCode for a boolean array.
*
* @param array the array to add to the hashCode
* @return this
*/
public ToStringBuilder append(String fieldName, boolean[] array) {
style.append(buffer, fieldName, array, null);
return this;
}
/**
* Append to the toString a boolean array.
* <p>
* A boolean parameter controls the level of detail to show. Setting true
* will output the array in full. Setting false will output a summary,
* typically the size of the array.
*
* @param array the array to add to the toString
* @param fieldName the field name
* @param fullDetail true for detail, false for summary info
* @return this
*/
public ToStringBuilder append(String fieldName, boolean[] array, boolean
fullDetail) {
style.append(buffer, fieldName, array, new Boolean(fullDetail));
return this;
}
//----------------------------------------------------------------------------
/**
* Gets the buffer being populated
*
* @return the StringBuffer being populated
*/
public StringBuffer getStringBuffer() {
return buffer;
}
/**
* Returns the built toString
*
* @return the String toString
*/
public String toString() {
style.appendEnd(buffer, object);
return buffer.toString();
}
}
1.1
jakarta-commons/lang/src/java/org/apache/commons/lang/builder/ToStringStyle.java
Index: ToStringStyle.java
===================================================================
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
// package org.apache.commons.lang.builder
package org.apache.commons.lang.builder;
import java.io.Serializable;
import java.util.Collection;
import java.util.Map;
import org.apache.commons.lang.SystemUtils;
/**
* <code>ToStringStyle</code> works with ToStringBuilder to create a
* toString.
* <p>
* These classes are intended to be used as singletons. There is no need
* to instantiate a new style each time. A prohram will generally use one
* of the predefined constants on this class. Alternatively, the
* {@link StandardToStringStyle} class can be used to set the individual
* settings.
* <P>
* If necessary, this class can be subclassed to provide specific toString
* designs. The main public interface is always via ToStringBuilder however.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephen Colebourne</a>
* @version $Id: ToStringStyle.java,v 1.1 2002/09/17 22:07:20 scolebourne Exp $
*/
public abstract class ToStringStyle implements Serializable {
/**
* The default toString style.
*/
public static final ToStringStyle DEFAULT_STYLE = new DefaultToStringStyle();
/**
* The multi line toString style.
*/
public static final ToStringStyle MULTI_LINE_STYLE = new
MultiLineToStringStyle();
/**
* The no field names toString style.
*/
public static final ToStringStyle NO_FIELD_NAMES_STYLE = new
NoFieldNameToStringStyle();
/**
* The simple toString style.
*/
public static final ToStringStyle SIMPLE_STYLE = new SimpleToStringStyle();
/**
* Whether to use the field names 'true'
*/
protected boolean useFieldNames = true;
/**
* Whether to use the class name 'true'
*/
protected boolean useClassName = true;
/**
* Whether to use short class names 'false'
*/
protected boolean useShortClassName = false;
/**
* Whether to use the identity hash code 'true'
*/
protected boolean useIdentityHashCode = true;
/**
* The content start '['
*/
protected String contentStart = "[";
/**
* The content end ']'
*/
protected String contentEnd = "]";
/**
* The field name value separator '='
*/
protected String fieldNameValueSeparator = "=";
/**
* The field separator ','
*/
protected String fieldSeparator = ",";
/**
* The array start '{'
*/
protected String arrayStart = "{";
/**
* The array separator ','
*/
protected String arraySeparator = ",";
/**
* The detail for array content
*/
protected boolean arrayContentDetail = true;
/**
* The array end '}'
*/
protected String arrayEnd = "}";
/**
* The value to use when fullDetail is null 'true'
*/
protected boolean defaultFullDetail = true;
/**
* The null text '<null>'
*/
protected String nullText = "<null>";
/**
* The summary size text start '<size'
*/
protected String sizeStartText = "<size=";
/**
* The summary size text start '>'
*/
protected String sizeEndText = ">";
/**
* The summary object text start '<'
*/
protected String summaryObjectStartText = "<";
/**
* The summary object text start '>'
*/
protected String summaryObjectEndText = ">";
//----------------------------------------------------------------------------
/**
* Constructor.
*/
protected ToStringStyle() {
super();
}
//----------------------------------------------------------------------------
/**
* Append the start of data indicator.
*
* @param buffer the StringBuffer to populate
* @param object the object to build a toString for, must not be null
*/
public void appendStart(StringBuffer buffer, Object object) {
appendClassName(buffer, object);
appendIdentityHashCode(buffer, object);
appendContentStart(buffer);
}
/**
* Append the end of data indicator.
*
* @param buffer the StringBuffer to populate
* @param object the object to build a toString for, must not be null
*/
public void appendEnd(StringBuffer buffer, Object object) {
appendContentEnd(buffer);
}
//----------------------------------------------------------------------------
/**
* Append to the toString an Object value, printing the full
* toString of the object passed in.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param value the value to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, Object value, Boolean
fullDetail) {
appendFieldStart(buffer, fieldName);
if (value == null) {
appendNullText(buffer, fieldName);
} else {
appendInternal(buffer, fieldName, value, isFullDetail(fullDetail));
}
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString an Object, correctly interpretting its type.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString, not null
* @param detail output detail or not
*/
protected void appendInternal(StringBuffer buffer, String fieldName, Object
value, boolean detail) {
if (value instanceof Collection) {
if (detail) {
appendDetail(buffer, fieldName, (Collection) value);
} else {
appendSummarySize(buffer, fieldName, ((Collection) value).size());
}
} else if (value instanceof Map) {
if (detail) {
appendDetail(buffer, fieldName, (Map) value);
} else {
appendSummarySize(buffer, fieldName, ((Map) value).size());
}
} else if (value instanceof long[]) {
if (detail) {
appendDetail(buffer, fieldName, (long[]) value);
} else {
appendSummary(buffer, fieldName, (long[]) value);
}
} else if (value instanceof int[]) {
if (detail) {
appendDetail(buffer, fieldName, (int[]) value);
} else {
appendSummary(buffer, fieldName, (int[]) value);
}
} else if (value instanceof short[]) {
if (detail) {
appendDetail(buffer, fieldName, (short[]) value);
} else {
appendSummary(buffer, fieldName, (short[]) value);
}
} else if (value instanceof byte[]) {
if (detail) {
appendDetail(buffer, fieldName, (byte[]) value);
} else {
appendSummary(buffer, fieldName, (byte[]) value);
}
} else if (value instanceof char[]) {
if (detail) {
appendDetail(buffer, fieldName, (char[]) value);
} else {
appendSummary(buffer, fieldName, (char[]) value);
}
} else if (value instanceof double[]) {
if (detail) {
appendDetail(buffer, fieldName, (double[]) value);
} else {
appendSummary(buffer, fieldName, (double[]) value);
}
} else if (value instanceof float[]) {
if (detail) {
appendDetail(buffer, fieldName, (float[]) value);
} else {
appendSummary(buffer, fieldName, (float[]) value);
}
} else if (value instanceof boolean[]) {
if (detail) {
appendDetail(buffer, fieldName, (boolean[]) value);
} else {
appendSummary(buffer, fieldName, (boolean[]) value);
}
} else if (value.getClass().isArray()) {
if (detail) {
appendDetail(buffer, fieldName, (Object[]) value);
} else {
appendSummary(buffer, fieldName, (Object[]) value);
}
} else {
if (detail) {
appendDetail(buffer, fieldName, (Object) value);
} else {
appendSummary(buffer, fieldName, (Object) value);
}
}
}
/**
* Append to the toString an Object value, printing the full detail of the
object.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, Object value)
{
buffer.append(value);
}
/**
* Append to the toString a Collection.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param coll the collection to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, Collection
coll) {
buffer.append(coll);
}
/**
* Append to the toString a Map.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param map the maps to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, Map map) {
buffer.append(map);
}
/**
* Append to the toString an Object value, printing a summary of the object.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, Object
value) {
buffer.append(summaryObjectStartText);
buffer.append(getShortClassName(value.getClass()));
buffer.append(summaryObjectEndText);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a long value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param value the value to add to the toString
*/
public void append(StringBuffer buffer, String fieldName, long value) {
appendFieldStart(buffer, fieldName);
appendDetail(buffer, fieldName, value);
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString a long value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString
*/
protected void appendDetail(StringBuffer buffer, String fieldName, long value) {
buffer.append(value);
}
//----------------------------------------------------------------------------
/**
* Append to the toString an int value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param value the value to add to the toString
*/
public void append(StringBuffer buffer, String fieldName, int value) {
appendFieldStart(buffer, fieldName);
appendDetail(buffer, fieldName, value);
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString an int value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString
*/
protected void appendDetail(StringBuffer buffer, String fieldName, int value) {
buffer.append(value);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a short value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param value the value to add to the toString
*/
public void append(StringBuffer buffer, String fieldName, short value) {
appendFieldStart(buffer, fieldName);
appendDetail(buffer, fieldName, value);
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString a short value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString
*/
protected void appendDetail(StringBuffer buffer, String fieldName, short value) {
buffer.append(value);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a byte value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param value the value to add to the toString
*/
public void append(StringBuffer buffer, String fieldName, byte value) {
appendFieldStart(buffer, fieldName);
appendDetail(buffer, fieldName, value);
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString a byte value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString
*/
protected void appendDetail(StringBuffer buffer, String fieldName, byte value) {
buffer.append(value);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a char value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param value the value to add to the toString
*/
public void append(StringBuffer buffer, String fieldName, char value) {
appendFieldStart(buffer, fieldName);
appendDetail(buffer, fieldName, value);
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString a char value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString
*/
protected void appendDetail(StringBuffer buffer, String fieldName, char value) {
buffer.append(value);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a double value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param value the value to add to the toString
*/
public void append(StringBuffer buffer, String fieldName, double value) {
appendFieldStart(buffer, fieldName);
appendDetail(buffer, fieldName, value);
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString a double value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString
*/
protected void appendDetail(StringBuffer buffer, String fieldName, double value)
{
buffer.append(value);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a float value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param value the value to add to the toString
*/
public void append(StringBuffer buffer, String fieldName, float value) {
appendFieldStart(buffer, fieldName);
appendDetail(buffer, fieldName, value);
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString a float value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString
*/
protected void appendDetail(StringBuffer buffer, String fieldName, float value) {
buffer.append(value);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a boolean value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param value the value to add to the toString
*/
public void append(StringBuffer buffer, String fieldName, boolean value) {
appendFieldStart(buffer, fieldName);
appendDetail(buffer, fieldName, value);
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString a boolean value.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param value the value to add to the toString
*/
protected void appendDetail(StringBuffer buffer, String fieldName, boolean
value) {
buffer.append(value);
}
/**
* Append to the toString an Object array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param array the array to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, Object[] array,
Boolean fullDetail) {
appendFieldStart(buffer, fieldName);
if (array == null) {
appendNullText(buffer, fieldName);
} else if (isFullDetail(fullDetail)) {
appendDetail(buffer, fieldName, array);
} else {
appendSummary(buffer, fieldName, array);
}
appendFieldEnd(buffer, fieldName);
}
//----------------------------------------------------------------------------
/**
* Append to the toString the detail of an Object array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, Object[]
array) {
buffer.append(arrayStart);
for (int i = 0; i < array.length; i++) {
Object item = array[i];
if (i > 0) {
buffer.append(arraySeparator);
}
if (item == null) {
appendNullText(buffer, fieldName);
} else {
appendInternal(buffer, fieldName, item, arrayContentDetail);
}
}
buffer.append(arrayEnd);
}
/**
* Append to the toString a summary of an Object array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, Object[]
array) {
appendSummarySize(buffer, fieldName, array.length);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a long array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param array the array to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, long[] array, Boolean
fullDetail) {
appendFieldStart(buffer, fieldName);
if (array == null) {
appendNullText(buffer, fieldName);
} else if (isFullDetail(fullDetail)) {
appendDetail(buffer, fieldName, array);
} else {
appendSummary(buffer, fieldName, array);
}
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString the detail of a long array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, long[] array)
{
buffer.append(arrayStart);
for (int i = 0; i < array.length; i++) {
if (i > 0) {
buffer.append(arraySeparator);
}
appendDetail(buffer, fieldName, array[i]);
}
buffer.append(arrayEnd);
}
/**
* Append to the toString a summary of a long array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, long[]
array) {
appendSummarySize(buffer, fieldName, array.length);
}
//----------------------------------------------------------------------------
/**
* Append to the toString an int array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param array the array to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, int[] array, Boolean
fullDetail) {
appendFieldStart(buffer, fieldName);
if (array == null) {
appendNullText(buffer, fieldName);
} else if (isFullDetail(fullDetail)) {
appendDetail(buffer, fieldName, array);
} else {
appendSummary(buffer, fieldName, array);
}
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString the detail of an int array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, int[] array) {
buffer.append(arrayStart);
for (int i = 0; i < array.length; i++) {
if (i > 0) {
buffer.append(arraySeparator);
}
appendDetail(buffer, fieldName, array[i]);
}
buffer.append(arrayEnd);
}
/**
* Append to the toString a summary of an int array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, int[] array)
{
appendSummarySize(buffer, fieldName, array.length);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a short array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param array the array to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, short[] array, Boolean
fullDetail) {
appendFieldStart(buffer, fieldName);
if (array == null) {
appendNullText(buffer, fieldName);
} else if (isFullDetail(fullDetail)) {
appendDetail(buffer, fieldName, array);
} else {
appendSummary(buffer, fieldName, array);
}
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString the detail of a short array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, short[]
array) {
buffer.append(arrayStart);
for (int i = 0; i < array.length; i++) {
if (i > 0) {
buffer.append(arraySeparator);
}
appendDetail(buffer, fieldName, array[i]);
}
buffer.append(arrayEnd);
}
/**
* Append to the toString a summary of a short array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, short[]
array) {
appendSummarySize(buffer, fieldName, array.length);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a byte array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param array the array to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, byte[] array, Boolean
fullDetail) {
appendFieldStart(buffer, fieldName);
if (array == null) {
appendNullText(buffer, fieldName);
} else if (isFullDetail(fullDetail)) {
appendDetail(buffer, fieldName, array);
} else {
appendSummary(buffer, fieldName, array);
}
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString the detail of a byte array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, byte[] array)
{
buffer.append(arrayStart);
for (int i = 0; i < array.length; i++) {
if (i > 0) {
buffer.append(arraySeparator);
}
appendDetail(buffer, fieldName, array[i]);
}
buffer.append(arrayEnd);
}
/**
* Append to the toString a summary of a byte array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, byte[]
array) {
appendSummarySize(buffer, fieldName, array.length);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a char array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param array the array to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, char[] array, Boolean
fullDetail) {
appendFieldStart(buffer, fieldName);
if (array == null) {
appendNullText(buffer, fieldName);
} else if (isFullDetail(fullDetail)) {
appendDetail(buffer, fieldName, array);
} else {
appendSummary(buffer, fieldName, array);
}
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString the detail of a char array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, char[] array)
{
buffer.append(arrayStart);
for (int i = 0; i < array.length; i++) {
if (i > 0) {
buffer.append(arraySeparator);
}
appendDetail(buffer, fieldName, array[i]);
}
buffer.append(arrayEnd);
}
/**
* Append to the toString a summary of a char array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, char[]
array) {
appendSummarySize(buffer, fieldName, array.length);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a double array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param array the array to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, double[] array,
Boolean fullDetail) {
appendFieldStart(buffer, fieldName);
if (array == null) {
appendNullText(buffer, fieldName);
} else if (isFullDetail(fullDetail)) {
appendDetail(buffer, fieldName, array);
} else {
appendSummary(buffer, fieldName, array);
}
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString the detail of a double array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, double[]
array) {
buffer.append(arrayStart);
for (int i = 0; i < array.length; i++) {
if (i > 0) {
buffer.append(arraySeparator);
}
appendDetail(buffer, fieldName, array[i]);
}
buffer.append(arrayEnd);
}
/**
* Append to the toString a summary of a double array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, double[]
array) {
appendSummarySize(buffer, fieldName, array.length);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a float array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param array the array to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, float[] array, Boolean
fullDetail) {
appendFieldStart(buffer, fieldName);
if (array == null) {
appendNullText(buffer, fieldName);
} else if (isFullDetail(fullDetail)) {
appendDetail(buffer, fieldName, array);
} else {
appendSummary(buffer, fieldName, array);
}
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString the detail of a float array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, float[]
array) {
buffer.append(arrayStart);
for (int i = 0; i < array.length; i++) {
if (i > 0) {
buffer.append(arraySeparator);
}
appendDetail(buffer, fieldName, array[i]);
}
buffer.append(arrayEnd);
}
/**
* Append to the toString a summary of a float array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, float[]
array) {
appendSummarySize(buffer, fieldName, array.length);
}
//----------------------------------------------------------------------------
/**
* Append to the toString a boolean array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
* @param array the array to add to the toString
* @param fullDetail true for detail, false for summary info, null for style
decides
*/
public void append(StringBuffer buffer, String fieldName, boolean[] array,
Boolean fullDetail) {
appendFieldStart(buffer, fieldName);
if (array == null) {
appendNullText(buffer, fieldName);
} else if (isFullDetail(fullDetail)) {
appendDetail(buffer, fieldName, array);
} else {
appendSummary(buffer, fieldName, array);
}
appendFieldEnd(buffer, fieldName);
}
/**
* Append to the toString the detail of a boolean array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendDetail(StringBuffer buffer, String fieldName, boolean[]
array) {
buffer.append(arrayStart);
for (int i = 0; i < array.length; i++) {
if (i > 0) {
buffer.append(arraySeparator);
}
appendDetail(buffer, fieldName, array[i]);
}
buffer.append(arrayEnd);
}
/**
* Append to the toString a summary of a boolean array.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param array the array to add to the toString, not null
*/
protected void appendSummary(StringBuffer buffer, String fieldName, boolean[]
array) {
appendSummarySize(buffer, fieldName, array.length);
}
//----------------------------------------------------------------------------
/**
* Append the class name.
*
* @param object the object whose name to output
*/
protected void appendClassName(StringBuffer buffer, Object object) {
if (useClassName) {
if (useShortClassName) {
buffer.append(getShortClassName(object.getClass()));
} else {
buffer.append(object.getClass().getName());
}
}
}
/**
* Append the IdentityHashCode.
*
* @param object the object whose id to output
*/
protected void appendIdentityHashCode(StringBuffer buffer, Object object) {
if (useIdentityHashCode) {
buffer.append('@');
buffer.append(Integer.toHexString(System.identityHashCode(object)));
}
}
/**
* Append the content start to the buffer.
*
* @param buffer the StringBuffer to populate
*/
protected void appendContentStart(StringBuffer buffer) {
buffer.append(contentStart);
}
/**
* Append the content end to the buffer.
*
* @param buffer the StringBuffer to populate
*/
protected void appendContentEnd(StringBuffer buffer) {
int len = buffer.length();
int sepLen = fieldSeparator.length();
if (len > 0 && sepLen > 0 && len >= sepLen && buffer.charAt(len - 1) ==
fieldSeparator.charAt(sepLen - 1)) {
buffer.setLength(len - sepLen);
}
buffer.append(contentEnd);
}
/**
* Append an indicator for null to the buffer.
* Default output is '<null>'.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
*/
protected void appendNullText(StringBuffer buffer, String fieldName) {
buffer.append(nullText);
}
/**
* Append the field separator to the buffer.
*
* @param buffer the StringBuffer to populate
*/
protected void appendFieldSeparator(StringBuffer buffer) {
buffer.append(fieldSeparator);
}
/**
* Append the field start to the buffer.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name
*/
protected void appendFieldStart(StringBuffer buffer, String fieldName) {
if (useFieldNames && fieldName != null) {
buffer.append(fieldName);
buffer.append(fieldNameValueSeparator);
}
}
/**
* Append the field end to the buffer.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
*/
protected void appendFieldEnd(StringBuffer buffer, String fieldName) {
appendFieldSeparator(buffer);
}
/**
* Append to the toString a size summary.
*
* @param buffer the StringBuffer to populate
* @param fieldName the field name, typically not used as already appended
* @param size the size to append
*/
protected void appendSummarySize(StringBuffer buffer, String fieldName, int
size) {
buffer.append(sizeStartText);
buffer.append(size);
buffer.append(sizeEndText);
}
/**
* Is this field to be output in full detail.
*
* @param fullDetail the detail level requested
* @return whether full detail is to be shown
*/
protected boolean isFullDetail(Boolean fullDetailRequest) {
if (fullDetailRequest == null) {
return defaultFullDetail;
}
return fullDetailRequest.booleanValue();
}
/**
* Gets the short class name for a class.
*
* @param cls the class to get the short name of
* @return the short name
*/
protected String getShortClassName(Class cls) {
String name = cls.getName();
int pos = name.lastIndexOf('.');
if (pos == -1) {
return name;
}
return name.substring(pos + 1);
}
//----------------------------------------------------------------------------
/**
* Default ToStringStyle.
* This is an inner class rather than using StandardToStringStyle to
* ensure its immutability.
*/
private static class DefaultToStringStyle extends ToStringStyle {
/**
* Constructor - use the static constant rather than instantiating.
*/
private DefaultToStringStyle() {
super();
}
/**
* Ensure singleton after serialization.
*/
private Object readResolve() {
return ToStringStyle.DEFAULT_STYLE;
}
}
//----------------------------------------------------------------------------
/**
* ToStringStyle that does not print out the field names.
* This is an inner class rather than using StandardToStringStyle to
* ensure its immutability.
*/
private static class NoFieldNameToStringStyle extends ToStringStyle {
/**
* Constructor - use the static constant rather than instantiating.
*/
private NoFieldNameToStringStyle() {
super();
useFieldNames = false;
}
/**
* Ensure singleton after serialization.
*/
private Object readResolve() {
return ToStringStyle.NO_FIELD_NAMES_STYLE;
}
}
//----------------------------------------------------------------------------
/**
* ToStringStyle that does not print out the classname, identity hashcode,
* content start or field name.
* This is an inner class rather than using StandardToStringStyle to
* ensure its immutability.
*/
private static class SimpleToStringStyle extends ToStringStyle {
/**
* Constructor - use the static constant rather than instantiating.
*/
private SimpleToStringStyle() {
super();
useClassName = false;
useIdentityHashCode = false;
useFieldNames = false;
contentStart = "";
contentEnd = "";
}
/**
* Ensure singleton after serialization.
*/
private Object readResolve() {
return ToStringStyle.SIMPLE_STYLE;
}
}
//----------------------------------------------------------------------------
/**
* ToStringStyle that outputs on multiple lines.
* This is an inner class rather than using StandardToStringStyle to
* ensure its immutability.
*/
private static class MultiLineToStringStyle extends ToStringStyle {
/**
* Constructor - use the static constant rather than instantiating.
*/
private MultiLineToStringStyle() {
super();
contentStart = "[" + SystemUtils.LINE_SEPARATOR + " ";
fieldSeparator = SystemUtils.LINE_SEPARATOR + " ";
contentEnd = SystemUtils.LINE_SEPARATOR + "]";
}
/**
* Ensure singleton after serialization.
*/
private Object readResolve() {
return ToStringStyle.MULTI_LINE_STYLE;
}
}
//----------------------------------------------------------------------------
// Removed, as the XML style needs more work for escaping characters, arrays,
// collections, maps and embedded beans.
// /**
// * ToStringStyle that outputs in XML style
// */
// private static class XMLToStringStyle extends ToStringStyle {
//
// /**
// * Constructor - use the static constant rather than instantiating.
// */
// private XMLToStringStyle() {
// super();
// nullText = "null";
// sizeStartText = "size=";
// sizeEndText = "";
// }
//
// /**
// * @see ToStringStyle#appendStart(StringBuffer, Object)
// */
// public void appendStart(StringBuffer buffer, Object object) {
// buffer.append('<');
// buffer.append(getShortClassName(object.getClass()));
// buffer.append(" class=\"");
// appendClassName(buffer, object);
// buffer.append("\" hashCode=\"");
// appendIdentityHashCode(buffer, object);
// buffer.append("\">");
// buffer.append(SystemUtils.LINE_SEPARATOR);
// buffer.append(" ");
// }
//
// /**
// * @see ToStringStyle#appendFieldStart(StringBuffer, String)
// */
// protected void appendFieldStart(StringBuffer buffer, String fieldName) {
// buffer.append('<');
// buffer.append(fieldName);
// buffer.append('>');
// }
//
// /**
// * @see ToStringStyle#appendFieldEnd(StringBuffer, String)
// */
// protected void appendFieldEnd(StringBuffer buffer, String fieldName) {
// buffer.append("</");
// buffer.append(fieldName);
// buffer.append('>');
// buffer.append(SystemUtils.LINE_SEPARATOR);
// buffer.append(" ");
// }
//
// /**
// * @see ToStringStyle#appendEnd(StringBuffer, Object)
// */
// public void appendEnd(StringBuffer buffer, Object object) {
// int len = buffer.length();
// if (len > 2 && buffer.charAt(len - 1) == ' ' && buffer.charAt(len - 2)
== ' ') {
// buffer.setLength(len - 2);
// }
// buffer.append("</");
// buffer.append(getShortClassName(object.getClass()));
// buffer.append("\">");
// }
//
// }
}
1.1
jakarta-commons/lang/src/java/org/apache/commons/lang/builder/StandardToStringStyle.java
Index: StandardToStringStyle.java
===================================================================
package org.apache.commons.lang.builder;
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2002 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution, if
* any, must include the following acknowlegement:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowlegement may appear in the software itself,
* if and wherever such third-party acknowlegements normally appear.
*
* 4. The names "The Jakarta Project", "Commons", and "Apache Software
* Foundation" must not be used to endorse or promote products derived
* from this software without prior written permission. For written
* permission, please contact [EMAIL PROTECTED]
*
* 5. Products derived from this software may not be called "Apache"
* nor may "Apache" appear in their names without prior written
* permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
// package org.apache.commons.lang.builder
/**
* <code>StandardToStringStyle</code> works with ToStringBuilder to create a
* toString.
* <p>
* This class is intended to be used as a singleton. There is no need
* to instantiate a new style each time. Your code should instantiate the class
* once, customize the values as required, and then store the result in a
* public static final variable for the rest of the program to access.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Stephen Colebourne</a>
* @version $Id: StandardToStringStyle.java,v 1.1 2002/09/17 22:07:20 scolebourne
Exp $
*/
public class StandardToStringStyle extends ToStringStyle {
/**
* Constructor.
*/
public StandardToStringStyle() {
super();
}
//---------------------------------------------------------------------
/**
* Gets whether to use the class name.
* @return the current useClassName flag
*/
public boolean isUseClassName() {
return useClassName;
}
/**
* Sets whether to use the class name.
* @param useClassName the new useClassName flag
*/
public void setUseClassName(boolean useClassName) {
this.useClassName = useClassName;
}
//---------------------------------------------------------------------
/**
* Gets whether to output short or long class names.
* @return the current shortClassName flag
*/
public boolean isShortClassName() {
return useShortClassName;
}
/**
* Sets whether to output short or long class names.
* @param shortClassName the new shortClassName flag
*/
public void setShortClassName(boolean shortClassName) {
this.useShortClassName = shortClassName;
}
//---------------------------------------------------------------------
/**
* Gets whether to use the identity hash code.
* @return the current useIdentityHashCode flag
*/
public boolean isUseIdentityHashCode() {
return useIdentityHashCode;
}
/**
* Sets whether to use the identity hash code.
* @param useFieldNames the new useIdentityHashCode flag
*/
public void setUseIdentityHashCode(boolean useIdentityHashCode) {
this.useIdentityHashCode = useIdentityHashCode;
}
//---------------------------------------------------------------------
/**
* Gets whether to use the field names passed in.
* @return the current useFieldNames flag
*/
public boolean isUseFieldNames() {
return useFieldNames;
}
/**
* Sets whether to use the field names passed in.
* @param useFieldNames the new useFieldNames flag
*/
public void setUseFieldNames(boolean useFieldNames) {
this.useFieldNames = useFieldNames;
}
//---------------------------------------------------------------------
/**
* Gets whether to use full detail when the caller doesn't specify.
* @return the current defaultFullDetail flag
*/
public boolean isDefaultFullDetail() {
return defaultFullDetail;
}
/**
* Sets whether to use full detail when the caller doesn't specify.
* @param defaultFullDetail the new defaultFullDetail flag
*/
public void setDefaultFullDetail(boolean defaultFullDetail) {
this.defaultFullDetail = defaultFullDetail;
}
//---------------------------------------------------------------------
/**
* Gets whether to output array content detail.
* @return the current array content detail setting
*/
public boolean isArrayContentDetail() {
return arrayContentDetail;
}
/**
* Sets whether to output array content detail.
* @param arrayContentDetail the new arrayContentDetail flag
*/
public void setArrayContentDetail(boolean arrayContentDetail) {
this.arrayContentDetail = arrayContentDetail;
}
//---------------------------------------------------------------------
/**
* Gets the array start text.
* @return the current array start text
*/
public String getArrayStart() {
return arrayStart;
}
/**
* Sets the array start text.
* Null is accepted, but will be converted to a blank string.
* @param arrayStart the new array start text
*/
public void setArrayStart(String arrayStart) {
if (arrayStart == null) {
arrayStart = "";
}
this.arrayStart = arrayStart;
}
//---------------------------------------------------------------------
/**
* Gets the array end text.
* @return the current array end text
*/
public String getArrayEnd() {
return arrayEnd;
}
/**
* Sets the array end text.
* Null is accepted, but will be converted to a blank string.
* @param arrayEnd the new array end text
*/
public void setArrayEnd(String arrayEnd) {
if (arrayStart == null) {
arrayStart = "";
}
this.arrayEnd = arrayEnd;
}
//---------------------------------------------------------------------
/**
* Gets the array separator text.
* @return the current array separator text
*/
public String getArraySeparator() {
return arraySeparator;
}
/**
* Sets the array separator text.
* Null is accepted, but will be converted to a blank string.
* @param arraySeparator the new array separator text
*/
public void setArraySeparator(String arraySeparator) {
if (arraySeparator == null) {
arraySeparator = "";
}
this.arraySeparator = arraySeparator;
}
//---------------------------------------------------------------------
/**
* Gets the content start text.
* @return the current content start text
*/
public String getContentStart() {
return contentStart;
}
/**
* Sets the content start text.
* Null is accepted, but will be converted to a blank string.
* @param contentStart the new content start text
*/
public void setContentStart(String contentStart) {
if (contentStart == null) {
contentStart = "";
}
this.contentStart = contentStart;
}
//---------------------------------------------------------------------
/**
* Gets the content end text.
* @return the current content end text
*/
public String getContentEnd() {
return contentEnd;
}
/**
* Sets the content end text.
* Null is accepted, but will be converted to a blank string.
* @param contentEnd the new content end text
*/
public void setContentEnd(String contentEnd) {
if (contentEnd == null) {
contentEnd = "";
}
this.contentEnd = contentEnd;
}
//---------------------------------------------------------------------
/**
* Gets the field name value separator text.
* @return the current field name value separator text
*/
public String getFieldNameValueSeparator() {
return fieldNameValueSeparator;
}
/**
* Sets the field name value separator text.
* Null is accepted, but will be converted to a blank string.
* @param fieldNameValueSeparator the new field name value separator text
*/
public void setFieldNameValueSeparator(String fieldNameValueSeparator) {
if (fieldNameValueSeparator == null) {
fieldNameValueSeparator = "";
}
this.fieldNameValueSeparator = fieldNameValueSeparator;
}
//---------------------------------------------------------------------
/**
* Gets the field separator text.
* @return the current field separator text
*/
public String getFieldSeparator() {
return fieldSeparator;
}
/**
* Sets the field separator text.
* Null is accepted, but will be converted to a blank string.
* @param fieldSeparator the new field separator text
*/
public void setFieldSeparator(String fieldSeparator) {
if (fieldSeparator == null) {
fieldSeparator = "";
}
this.fieldSeparator = fieldSeparator;
}
//---------------------------------------------------------------------
/**
* Gets the text to output when null found.
* @return the current text to output when null found
*/
public String getNullText() {
return nullText;
}
/**
* Sets the text to output when null found.
* Null is accepted, but will be converted to a blank string.
* @param nullText the new text to output when null found
*/
public void setNullText(String nullText) {
if (nullText == null) {
nullText = "";
}
this.nullText = nullText;
}
//---------------------------------------------------------------------
/**
* Gets the text to output when a Collection, Map or Array size is output.
* This is output before the size value.
* @return the current start of size text
*/
public String getSizeStartText() {
return sizeStartText;
}
/**
* Sets the text to output when a Collection, Map or Array size is output.
* This is output before the size value.
* Null is accepted, but will be converted to a blank string.
* @param sizeStartText the new start of size text
*/
public void setSizeStartText(String sizeStartText) {
if (sizeStartText == null) {
sizeStartText = "";
}
this.sizeStartText = sizeStartText;
}
//---------------------------------------------------------------------
/**
* Gets the text to output when a Collection, Map or Array size is output.
* This is output after the size value.
* @return the current end of size text
*/
public String getSizeEndText() {
return sizeEndText;
}
/**
* Sets the text to output when a Collection, Map or Array size is output.
* This is output after the size value.
* Null is accepted, but will be converted to a blank string.
* @param sizeEndText the new end of size text
*/
public void setSizeEndText(String sizeEndText) {
if (sizeEndText == null) {
sizeEndText = "";
}
this.sizeEndText = sizeEndText;
}
//---------------------------------------------------------------------
/**
* Gets the text to output when an Object is output in summary mode.
* This is output before the size value.
* @return the current start of summary text
*/
public String getSummaryObjectStartText() {
return summaryObjectStartText;
}
/**
* Sets the text to output when an Object is output in summary mode.
* This is output before the size value.
* Null is accepted, but will be converted to a blank string.
* @param summaryObjectStartText the new start of summary text
*/
public void setSummaryObjectStartText(String summaryObjectStartText) {
if (summaryObjectStartText == null) {
summaryObjectStartText = "";
}
this.summaryObjectStartText = summaryObjectStartText;
}
//---------------------------------------------------------------------
/**
* Gets the text to output when an Object is output in summary mode.
* This is output after the size value.
* @return the current end of summary text
*/
public String getSummaryObjectEndText() {
return summaryObjectEndText;
}
/**
* Sets the text to output when an Object is output in summary mode.
* This is output after the size value.
* Null is accepted, but will be converted to a blank string.
* @param summaryObjectEndText the new end of summary text
*/
public void setSummaryObjectEndText(String summaryObjectEndText) {
if (summaryObjectEndText == null) {
summaryObjectEndText = "";
}
this.summaryObjectEndText = summaryObjectEndText;
}
//---------------------------------------------------------------------
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>