Added: incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/ToStringBuilder.java URL: http://svn.apache.org/viewcvs/incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/ToStringBuilder.java?view=auto&rev=151131 ============================================================================== --- incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/ToStringBuilder.java (added) +++ incubator/directory/asn1/branches/rewrite/ber/src/java/org/apache/asn1/util/ToStringBuilder.java Wed Feb 2 23:18:42 2005 @@ -0,0 +1,1104 @@ +/* + * Copyright 2002-2004 The Apache Software Foundation. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.asn1.util; + + +/** + * <p>Assists in implementing [EMAIL PROTECTED] Object#toString()} methods.</p> + * <p/> + * <p>This class enables a good and consistent <code>toString()</code> to be + * built for any class or object. This class aims to simplify the process + * by:</p> <ul> <li>allowing field names</li> <li>handling all types + * consistently</li> <li>handling nulls consistently</li> <li>outputting arrays + * and multi-dimensional arrays</li> <li>enabling the detail level to be + * controlled for Objects and Collections</li> <li>handling class + * hierarchies</li> </ul> + * <p/> + * <p>To use this class write code as follows:</p> + * <p/> + * <pre> + * public class Person { + * String name; + * int age; + * boolean isSmoker; + * <p/> + * ... + * <p/> + * public String toString() { + * return new ToStringBuilder(this). + * append("name", name). + * append("age", age). + * append("smoker", smoker). + * toString(); + * } + * } + * </pre> + * <p/> + * <p>This will produce a toString of the format: <code>[EMAIL PROTECTED],age=29,smoker=false]</code></p> + * <p/> + * <p>To add the superclass <code>toString</code>, use [EMAIL PROTECTED] #appendSuper}. To + * append the <code>toString</code> from an object that is delegated to (or any + * other object), use [EMAIL PROTECTED] #appendToString}.</p> + * <p/> + * <p>Alternatively, there is a method that uses reflection to determine the + * fields to test. Because these fields are usually private, the method, + * <code>reflectionToString</code>, uses <code>AccessibleObject.setAccessible</code> + * to change the visibility of the fields. This will fail under a security + * manager, unless the appropriate permissions are set up correctly. It is also + * slower than testing explicitly.</p> + * <p/> + * <p>A typical invocation for this method would look like:</p> + * <p/> + * <pre> + * public String toString() { + * return ToStringBuilder.reflectionToString(this); + * } + * </pre> + * <p/> + * <p>You can also use the builder to debug 3rd party objects:</p> + * <p/> + * <pre> + * System.out.println("An object: " + ToStringBuilder.reflectionToString(anObject)); + * </pre> + * <p/> + * <p>The exact format of the <code>toString</code> is determined by the [EMAIL PROTECTED] + * ToStringStyle} passed into the constructor.</p> + * + * @author Stephen Colebourne + * @author Gary Gregory + * @author Pete Gieser + * @version $Id: ToStringBuilder.java,v 1.35 2004/07/01 17:40:10 ggregory Exp $ + * @since 1.0 + */ +public class ToStringBuilder +{ + + /** + * The default style of output to use. + */ + private static ToStringStyle defaultStyle = ToStringStyle.DEFAULT_STYLE; + + //---------------------------------------------------------------------------- + + /** + * <p>Gets the default <code>ToStringStyle</code> to use.</p> + * <p/> + * <p>This could allow the <code>ToStringStyle</code> to be controlled for + * an entire application with one call.</p> + * <p/> + * <p>This might be used to have a verbose <code>ToStringStyle</code> during + * development and a compact <code>ToStringStyle</code> in production.</p> + * + * @return the default <code>ToStringStyle</code> + */ + public static ToStringStyle getDefaultStyle() + { + return defaultStyle; + } + + + /** + * <p>Forwards to <code>ReflectionToStringBuilder</code>.</p> + * + * @see ReflectionToStringBuilder#toString(Object) + */ + public static String reflectionToString( Object object ) + { + return ReflectionToStringBuilder.toString( object ); + } + + + /** + * <p>Forwards to <code>ReflectionToStringBuilder</code>.</p> + * + * @see ReflectionToStringBuilder#toString(Object,ToStringStyle) + */ + public static String reflectionToString( Object object, ToStringStyle style ) + { + return ReflectionToStringBuilder.toString( object, style ); + } + + + /** + * <p>Forwards to <code>ReflectionToStringBuilder</code>.</p> + * + * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean) + */ + public static String reflectionToString( Object object, ToStringStyle style, boolean outputTransients ) + { + return ReflectionToStringBuilder.toString( object, style, outputTransients, false, null ); + } + + + /** + * <p>Forwards to <code>ReflectionToStringBuilder</code>.</p> + * + * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean,boolean,Class) + * @since 2.0 + */ + public static String reflectionToString( Object object, + ToStringStyle style, + boolean outputTransients, + Class reflectUpToClass ) + { + return ReflectionToStringBuilder.toString( object, style, outputTransients, false, reflectUpToClass ); + } + + + /** + * <p>Sets the default <code>ToStringStyle</code> to use.</p> + * + * @param style the default <code>ToStringStyle</code> + * @throws IllegalArgumentException if the style is <code>null</code> + */ + public static void setDefaultStyle( ToStringStyle style ) + { + if ( style == null ) + { + throw new IllegalArgumentException( "The style must not be null" ); + } + defaultStyle = style; + } + + + /** + * Current toString buffer. + */ + private final StringBuffer buffer; + + /** + * The object being output. + */ + private final Object object; + + /** + * The style of output to use. + */ + private final ToStringStyle style; + + + /** + * <p>Constructor for <code>ToStringBuilder</code>.</p> + * <p/> + * <p>This constructor outputs using the default style set with + * <code>setDefaultStyle</code>.</p> + * + * @param object the Object to build a <code>toString</code> for + * @throws IllegalArgumentException if the Object passed in is <code>null</code> + */ + public ToStringBuilder( Object object ) + { + this( object, getDefaultStyle(), null ); + } + + + /** + * <p>Constructor for <code>ToStringBuilder</code> specifying the output + * style.</p> + * <p/> + * <p>If the style is <code>null</code>, the default style is used.</p> + * + * @param object the Object to build a <code>toString</code> for + * @param style the style of the <code>toString</code> to create, may be + * <code>null</code> + * @throws IllegalArgumentException if the Object passed in is <code>null</code> + */ + public ToStringBuilder( Object object, ToStringStyle style ) + { + this( object, style, null ); + } + + + /** + * <p>Constructor for <code>ToStringBuilder</code>.</p> + * <p/> + * <p>If the style is <code>null</code>, the default style is used.</p> + * <p/> + * <p>If the buffer is <code>null</code>, a new one is created.</p> + * + * @param object the Object to build a <code>toString</code> for + * @param style the style of the <code>toString</code> to create, may be + * <code>null</code> + * @param buffer the <code>StringBuffer</code> to populate, may be + * <code>null</code> + */ + public ToStringBuilder( Object object, ToStringStyle style, StringBuffer buffer ) + { + if ( style == null ) + { + style = getDefaultStyle(); + } + if ( buffer == null ) + { + buffer = new StringBuffer( 512 ); + } + this.buffer = buffer; + this.style = style; + this.object = object; + + style.appendStart( buffer, object ); + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>boolean</code> value.</p> + * + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( boolean value ) + { + style.append( buffer, null, value ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>boolean</code> array.</p> + * + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( boolean[] array ) + { + style.append( buffer, null, array, null ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>byte</code> value.</p> + * + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( byte value ) + { + style.append( buffer, null, value ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>byte</code> array.</p> + * + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( byte[] array ) + { + style.append( buffer, null, array, null ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>char</code> value.</p> + * + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( char value ) + { + style.append( buffer, null, value ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>char</code> array.</p> + * + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( char[] array ) + { + style.append( buffer, null, array, null ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>double</code> value.</p> + * + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( double value ) + { + style.append( buffer, null, value ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>double</code> array.</p> + * + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( double[] array ) + { + style.append( buffer, null, array, null ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>float</code> value.</p> + * + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( float value ) + { + style.append( buffer, null, value ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>float</code> array.</p> + * + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( float[] array ) + { + style.append( buffer, null, array, null ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> an <code>int</code> value.</p> + * + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( int value ) + { + style.append( buffer, null, value ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> an <code>int</code> array.</p> + * + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( int[] array ) + { + style.append( buffer, null, array, null ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>long</code> value.</p> + * + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( long value ) + { + style.append( buffer, null, value ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>long</code> array.</p> + * + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( long[] array ) + { + style.append( buffer, null, array, null ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> an <code>Object</code> value.</p> + * + * @param object the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( Object object ) + { + style.append( buffer, null, object, null ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> an <code>Object</code> array.</p> + * + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( Object[] array ) + { + style.append( buffer, null, array, null ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>short</code> value.</p> + * + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( short value ) + { + style.append( buffer, null, value ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append to the <code>toString</code> a <code>short</code> array.</p> + * + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( short[] array ) + { + style.append( buffer, null, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>boolean</code> value.</p> + * + * @param fieldName the field name + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, boolean value ) + { + style.append( buffer, fieldName, value ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>boolean</code> array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>hashCode</code> + * @return this + */ + public ToStringBuilder append( String fieldName, boolean[] array ) + { + style.append( buffer, fieldName, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>boolean</code> array.</p> + * <p/> + * <p>A boolean parameter controls the level of detail to show. Setting + * <code>true</code> will output the array in full. Setting + * <code>false</code> will output a summary, typically the size of the + * array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, boolean[] array, boolean fullDetail ) + { + style.append( buffer, fieldName, array, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>byte</code> value.</p> + * + * @param fieldName the field name + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, byte value ) + { + style.append( buffer, fieldName, value ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>byte</code> array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, byte[] array ) + { + style.append( buffer, fieldName, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>byte</code> array.</p> + * <p/> + * <p>A boolean parameter controls the level of detail to show. Setting + * <code>true</code> will output the array in full. Setting + * <code>false</code> will output a summary, typically the size of the + * array. + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, byte[] array, boolean fullDetail ) + { + style.append( buffer, fieldName, array, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>char</code> value.</p> + * + * @param fieldName the field name + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, char value ) + { + style.append( buffer, fieldName, value ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>char</code> array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, char[] array ) + { + style.append( buffer, fieldName, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>char</code> array.</p> + * <p/> + * <p>A boolean parameter controls the level of detail to show. Setting + * <code>true</code> will output the array in full. Setting + * <code>false</code> will output a summary, typically the size of the + * array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, char[] array, boolean fullDetail ) + { + style.append( buffer, fieldName, array, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>double</code> value.</p> + * + * @param fieldName the field name + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, double value ) + { + style.append( buffer, fieldName, value ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>double</code> array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, double[] array ) + { + style.append( buffer, fieldName, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>double</code> array.</p> + * <p/> + * <p>A boolean parameter controls the level of detail to show. Setting + * <code>true</code> will output the array in full. Setting + * <code>false</code> will output a summary, typically the size of the + * array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, double[] array, boolean fullDetail ) + { + style.append( buffer, fieldName, array, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>float</code> value.</p> + * + * @param fieldName the field name + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, float value ) + { + style.append( buffer, fieldName, value ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>float</code> array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, float[] array ) + { + style.append( buffer, fieldName, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>float</code> array.</p> + * <p/> + * <p>A boolean parameter controls the level of detail to show. Setting + * <code>true</code> will output the array in full. Setting + * <code>false</code> will output a summary, typically the size of the + * array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, float[] array, boolean fullDetail ) + { + style.append( buffer, fieldName, array, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>int</code> value.</p> + * + * @param fieldName the field name + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, int value ) + { + style.append( buffer, fieldName, value ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>int</code> array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, int[] array ) + { + style.append( buffer, fieldName, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>int</code> array.</p> + * <p/> + * <p>A boolean parameter controls the level of detail to show. Setting + * <code>true</code> will output the array in full. Setting + * <code>false</code> will output a summary, typically the size of the + * array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, int[] array, boolean fullDetail ) + { + style.append( buffer, fieldName, array, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>long</code> value.</p> + * + * @param fieldName the field name + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, long value ) + { + style.append( buffer, fieldName, value ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>long</code> array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, long[] array ) + { + style.append( buffer, fieldName, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>long</code> array.</p> + * <p/> + * <p>A boolean parameter controls the level of detail to show. Setting + * <code>true</code> will output the array in full. Setting + * <code>false</code> will output a summary, typically the size of the + * array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, long[] array, boolean fullDetail ) + { + style.append( buffer, fieldName, array, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>Object</code> value.</p> + * + * @param fieldName the field name + * @param object the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, Object object ) + { + style.append( buffer, fieldName, object, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>Object</code> value.</p> + * + * @param fieldName the field name + * @param object the value to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, Object object, boolean fullDetail ) + { + style.append( buffer, fieldName, object, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>Object</code> array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, Object[] array ) + { + style.append( buffer, fieldName, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>Object</code> array.</p> + * <p/> + * <p>A boolean parameter controls the level of detail to show. Setting + * <code>true</code> will output the array in full. Setting + * <code>false</code> will output a summary, typically the size of the + * array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, Object[] array, boolean fullDetail ) + { + style.append( buffer, fieldName, array, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> an <code>short</code> value.</p> + * + * @param fieldName the field name + * @param value the value to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, short value ) + { + style.append( buffer, fieldName, value ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>short</code> array.</p> + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @return this + */ + public ToStringBuilder append( String fieldName, short[] array ) + { + style.append( buffer, fieldName, array, null ); + return this; + } + + + /** + * <p>Append to the <code>toString</code> a <code>short</code> array.</p> + * <p/> + * <p>A boolean parameter controls the level of detail to show. Setting + * <code>true</code> will output the array in full. Setting + * <code>false</code> will output a summary, typically the size of the + * array. + * + * @param fieldName the field name + * @param array the array to add to the <code>toString</code> + * @param fullDetail <code>true</code> for detail, <code>false</code> for + * summary info + * @return this + */ + public ToStringBuilder append( String fieldName, short[] array, boolean fullDetail ) + { + style.append( buffer, fieldName, array, BooleanUtils.toBooleanObject( fullDetail ) ); + return this; + } + + + /** + * <p>Appends with the same format as the default <code>Object toString() + * </code> method. Appends the class name followed by [EMAIL PROTECTED] + * System#identityHashCode(java.lang.Object)}.</p> + * + * @param object the <code>Object</code> whose class name and id to output + * @return this + * @since 2.0 + */ + public ToStringBuilder appendAsObjectToString( Object object ) + { + ObjectUtils.appendIdentityToString( this.getStringBuffer(), object ); + return this; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Append the <code>toString</code> from the superclass.</p> + * <p/> + * <p>This method assumes that the superclass uses the same + * <code>ToStringStyle</code> as this one.</p> + * <p/> + * <p>If <code>superToString</code> is <code>null</code>, no change is + * made.</p> + * + * @param superToString the result of <code>super.toString()</code> + * @return this + * @since 2.0 + */ + public ToStringBuilder appendSuper( String superToString ) + { + if ( superToString != null ) + { + style.appendSuper( buffer, superToString ); + } + return this; + } + + + /** + * <p>Append the <code>toString</code> from another object.</p> + * <p/> + * <p>This method is useful where a class delegates most of the + * implementation of its properties to another class. You can then call + * <code>toString()</code> on the other class and pass the result into this + * method.</p> + * <p/> + * <pre> + * private AnotherObject delegate; + * private String fieldInThisClass; + * <p/> + * public String toString() { + * return new ToStringBuilder(this). + * appendToString(delegate.toString()). + * append(fieldInThisClass). + * toString(); + * }</pre> + * <p/> + * <p>This method assumes that the other object uses the same + * <code>ToStringStyle</code> as this one.</p> + * <p/> + * <p>If the <code>toString</code> is <code>null</code>, no change is + * made.</p> + * + * @param toString the result of <code>toString()</code> on another object + * @return this + * @since 2.0 + */ + public ToStringBuilder appendToString( String toString ) + { + if ( toString != null ) + { + style.appendToString( buffer, toString ); + } + return this; + } + + + /** + * <p>Returns the <code>Object</code> being output.</p> + * + * @return The object being output. + * @since 2.0 + */ + public Object getObject() + { + return object; + } + + + /** + * <p>Gets the <code>StringBuffer</code> being populated.</p> + * + * @return the <code>StringBuffer</code> being populated + */ + public StringBuffer getStringBuffer() + { + return buffer; + } + + //---------------------------------------------------------------------------- + + /** + * <p>Gets the <code>ToStringStyle</code> being used.</p> + * + * @return the <code>ToStringStyle</code> being used + * @since 2.0 + */ + public ToStringStyle getStyle() + { + return style; + } + + + /** + * <p>Returns the built <code>toString</code>.</p> + * <p/> + * <p>This method appends the end of data indicator, and can only be called + * once. Use [EMAIL PROTECTED] #getStringBuffer} to get the current string state.</p> + * <p/> + * <p>If the object is <code>null</code>, return the style's + * <code>nullText</code></p> + * + * @return the String <code>toString</code> + */ + public String toString() + { + if ( this.getObject() == null ) + { + this.getStringBuffer().append( this.getStyle().getNullText() ); + } + else + { + style.appendEnd( this.getStringBuffer(), this.getObject() ); + } + return this.getStringBuffer().toString(); + } + +}
