001    /*
002     * Licensed to the Apache Software Foundation (ASF) under one or more
003     * contributor license agreements.  See the NOTICE file distributed with
004     * this work for additional information regarding copyright ownership.
005     * The ASF licenses this file to You under the Apache License, Version 2.0
006     * (the "License"); you may not use this file except in compliance with
007     * the License.  You may obtain a copy of the License at
008     * 
009     *      http://www.apache.org/licenses/LICENSE-2.0
010     * 
011     * Unless required by applicable law or agreed to in writing, software
012     * distributed under the License is distributed on an "AS IS" BASIS,
013     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014     * See the License for the specific language governing permissions and
015     * limitations under the License.
016     */
017    package org.apache.commons.lang3.builder;
018    
019    import org.apache.commons.lang3.ObjectUtils;
020    
021    /**
022     * <p>Assists in implementing {@link Object#toString()} methods.</p>
023     *
024     * <p>This class enables a good and consistent <code>toString()</code> to be built for any
025     * class or object. This class aims to simplify the process by:</p>
026     * <ul>
027     *  <li>allowing field names</li>
028     *  <li>handling all types consistently</li>
029     *  <li>handling nulls consistently</li>
030     *  <li>outputting arrays and multi-dimensional arrays</li>
031     *  <li>enabling the detail level to be controlled for Objects and Collections</li>
032     *  <li>handling class hierarchies</li>
033     * </ul>
034     *
035     * <p>To use this class write code as follows:</p>
036     *
037     * <pre>
038     * public class Person {
039     *   String name;
040     *   int age;
041     *   boolean smoker;
042     * 
043     *   ...
044     * 
045     *   public String toString() {
046     *     return new ToStringBuilder(this).
047     *       append("name", name).
048     *       append("age", age).
049     *       append("smoker", smoker).
050     *       toString();
051     *   }
052     * }
053     * </pre>
054     *
055     * <p>This will produce a toString of the format:
056     * <code>Person@7f54[name=Stephen,age=29,smoker=false]</code></p>
057     * 
058     * <p>To add the superclass <code>toString</code>, use {@link #appendSuper}.
059     * To append the <code>toString</code> from an object that is delegated
060     * to (or any other object), use {@link #appendToString}.</p>
061     *
062     * <p>Alternatively, there is a method that uses reflection to determine
063     * the fields to test. Because these fields are usually private, the method, 
064     * <code>reflectionToString</code>, uses <code>AccessibleObject.setAccessible</code> to
065     * change the visibility of the fields. This will fail under a security manager,
066     * unless the appropriate permissions are set up correctly. It is also
067     * slower than testing explicitly.</p>
068     *
069     * <p>A typical invocation for this method would look like:</p>
070     *
071     * <pre>
072     * public String toString() {
073     *   return ToStringBuilder.reflectionToString(this);
074     * }
075     * </pre>
076     *
077     * <p>You can also use the builder to debug 3rd party objects:</p>
078     *
079     * <pre>
080     * System.out.println("An object: " + ToStringBuilder.reflectionToString(anObject));
081     * </pre>
082     * 
083     * <p>The exact format of the <code>toString</code> is determined by
084     * the {@link ToStringStyle} passed into the constructor.</p>
085     *
086     * @author Apache Software Foundation
087     * @author Gary Gregory
088     * @author Pete Gieser
089     * @since 1.0
090     * @version $Id: ToStringBuilder.java 925674 2010-03-20 20:20:26Z bayard $
091     */
092    public class ToStringBuilder implements Builder<String> {
093    
094        /**
095         * The default style of output to use, not null.
096         */
097        private static volatile ToStringStyle defaultStyle = ToStringStyle.DEFAULT_STYLE;
098    
099        //----------------------------------------------------------------------------
100    
101        /**
102         * <p>Gets the default <code>ToStringStyle</code> to use.</p>
103         * 
104         * <p>This method gets a singleton default value, typically for the whole JVM.
105         * Changing this default should generally only be done during application startup.
106         * It is recommended to pass a <code>ToStringStyle</code> to the constructor instead
107         * of using this global default.</p>
108         * 
109         * <p>This method can be used from multiple threads.
110         * Internally, a <code>volatile</code> variable is used to provide the guarantee
111         * that the latest value set using {@link #setDefaultStyle} is the value returned.
112         * It is strongly recommended that the default style is only changed during application startup.</p>
113         * 
114         * <p>One reason for changing the default could be to have a verbose style during
115         * development and a compact style in production.</p>
116         * 
117         * @return the default <code>ToStringStyle</code>, never null
118         */
119        public static ToStringStyle getDefaultStyle() {
120            return defaultStyle;
121        }
122    
123        /**
124         * <p>Sets the default <code>ToStringStyle</code> to use.</p>
125         * 
126         * <p>This method sets a singleton default value, typically for the whole JVM.
127         * Changing this default should generally only be done during application startup.
128         * It is recommended to pass a <code>ToStringStyle</code> to the constructor instead
129         * of changing this global default.</p>
130         * 
131         * <p>This method is not intended for use from multiple threads.
132         * Internally, a <code>volatile</code> variable is used to provide the guarantee
133         * that the latest value set is the value returned from {@link #getDefaultStyle}.</p>
134         * 
135         * @param style  the default <code>ToStringStyle</code>
136         * @throws IllegalArgumentException if the style is <code>null</code>
137         */
138        public static void setDefaultStyle(ToStringStyle style) {
139            if (style == null) {
140                throw new IllegalArgumentException("The style must not be null");
141            }
142            defaultStyle = style;
143        }
144    
145        //----------------------------------------------------------------------------
146        /**
147         * <p>Uses <code>ReflectionToStringBuilder</code> to generate a
148         * <code>toString</code> for the specified object.</p>
149         * 
150         * @param object  the Object to be output
151         * @return the String result
152         * @see ReflectionToStringBuilder#toString(Object)
153         */
154        public static String reflectionToString(Object object) {
155            return ReflectionToStringBuilder.toString(object);
156        }
157    
158        /**
159         * <p>Uses <code>ReflectionToStringBuilder</code> to generate a
160         * <code>toString</code> for the specified object.</p>
161         * 
162         * @param object  the Object to be output
163         * @param style  the style of the <code>toString</code> to create, may be <code>null</code>
164         * @return the String result
165         * @see ReflectionToStringBuilder#toString(Object,ToStringStyle)
166         */
167        public static String reflectionToString(Object object, ToStringStyle style) {
168            return ReflectionToStringBuilder.toString(object, style);
169        }
170    
171        /**
172         * <p>Uses <code>ReflectionToStringBuilder</code> to generate a
173         * <code>toString</code> for the specified object.</p>
174         * 
175         * @param object  the Object to be output
176         * @param style  the style of the <code>toString</code> to create, may be <code>null</code>
177         * @param outputTransients  whether to include transient fields
178         * @return the String result
179         * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean)
180         */
181        public static String reflectionToString(Object object, ToStringStyle style, boolean outputTransients) {
182            return ReflectionToStringBuilder.toString(object, style, outputTransients, false, null);
183        }
184    
185        /**
186         * <p>Uses <code>ReflectionToStringBuilder</code> to generate a
187         * <code>toString</code> for the specified object.</p>
188         * 
189         * @param object  the Object to be output
190         * @param style  the style of the <code>toString</code> to create, may be <code>null</code>
191         * @param outputTransients  whether to include transient fields
192         * @param reflectUpToClass  the superclass to reflect up to (inclusive), may be <code>null</code>
193         * @return the String result
194         * @see ReflectionToStringBuilder#toString(Object,ToStringStyle,boolean,boolean,Class)
195         * @since 2.0
196         */
197        public static <T> String reflectionToString(
198            T object,
199            ToStringStyle style,
200            boolean outputTransients,
201            Class<? super T> reflectUpToClass) {
202            return ReflectionToStringBuilder.toString(object, style, outputTransients, false, reflectUpToClass);
203        }
204    
205        //----------------------------------------------------------------------------
206    
207        /**
208         * Current toString buffer, not null.
209         */
210        private final StringBuffer buffer;
211        /**
212         * The object being output, may be null.
213         */
214        private final Object object;
215        /**
216         * The style of output to use, not null.
217         */
218        private final ToStringStyle style;
219    
220        /**
221         * <p>Constructs a builder for the specified object using the default output style.</p>
222         *
223         * <p>This default style is obtained from {@link #getDefaultStyle()}.</p>
224         * 
225         * @param object  the Object to build a <code>toString</code> for, not recommended to be null
226         */
227        public ToStringBuilder(Object object) {
228            this(object, null, null);
229        }
230    
231        /**
232         * <p>Constructs a builder for the specified object using the a defined output style.</p>
233         *
234         * <p>If the style is <code>null</code>, the default style is used.</p>
235         * 
236         * @param object  the Object to build a <code>toString</code> for, not recommended to be null
237         * @param style  the style of the <code>toString</code> to create, null uses the default style
238         */
239        public ToStringBuilder(Object object, ToStringStyle style) {
240            this(object, style, null);
241        }
242    
243        /**
244         * <p>Constructs a builder for the specified object.</p>
245         *
246         * <p>If the style is <code>null</code>, the default style is used.</p>
247         *
248         * <p>If the buffer is <code>null</code>, a new one is created.</p>
249         * 
250         * @param object  the Object to build a <code>toString</code> for, not recommended to be null
251         * @param style  the style of the <code>toString</code> to create, null uses the default style
252         * @param buffer  the <code>StringBuffer</code> to populate, may be null
253         */
254        public ToStringBuilder(Object object, ToStringStyle style, StringBuffer buffer) {
255            if (style == null) {
256                style = getDefaultStyle();
257            }
258            if (buffer == null) {
259                buffer = new StringBuffer(512);
260            }
261            this.buffer = buffer;
262            this.style = style;
263            this.object = object;
264    
265            style.appendStart(buffer, object);
266        }
267    
268        //----------------------------------------------------------------------------
269    
270        /**
271         * <p>Append to the <code>toString</code> a <code>boolean</code>
272         * value.</p>
273         *
274         * @param value  the value to add to the <code>toString</code>
275         * @return this
276         */
277        public ToStringBuilder append(boolean value) {
278            style.append(buffer, null, value);
279            return this;
280        }
281    
282        //----------------------------------------------------------------------------
283    
284        /**
285         * <p>Append to the <code>toString</code> a <code>boolean</code>
286         * array.</p>
287         *
288         * @param array  the array to add to the <code>toString</code>
289         * @return this
290         */
291        public ToStringBuilder append(boolean[] array) {
292            style.append(buffer, null, array, null);
293            return this;
294        }
295    
296        //----------------------------------------------------------------------------
297    
298        /**
299         * <p>Append to the <code>toString</code> a <code>byte</code>
300         * value.</p>
301         *
302         * @param value  the value to add to the <code>toString</code>
303         * @return this
304         */
305        public ToStringBuilder append(byte value) {
306            style.append(buffer, null, value);
307            return this;
308        }
309    
310        //----------------------------------------------------------------------------
311    
312        /**
313         * <p>Append to the <code>toString</code> a <code>byte</code>
314         * array.</p>
315         *
316         * @param array  the array to add to the <code>toString</code>
317         * @return this
318         */
319        public ToStringBuilder append(byte[] array) {
320            style.append(buffer, null, array, null);
321            return this;
322        }
323    
324        //----------------------------------------------------------------------------
325    
326        /**
327         * <p>Append to the <code>toString</code> a <code>char</code>
328         * value.</p>
329         *
330         * @param value  the value to add to the <code>toString</code>
331         * @return this
332         */
333        public ToStringBuilder append(char value) {
334            style.append(buffer, null, value);
335            return this;
336        }
337    
338        //----------------------------------------------------------------------------
339    
340        /**
341         * <p>Append to the <code>toString</code> a <code>char</code>
342         * array.</p>
343         *
344         * @param array  the array to add to the <code>toString</code>
345         * @return this
346         */
347        public ToStringBuilder append(char[] array) {
348            style.append(buffer, null, array, null);
349            return this;
350        }
351    
352        //----------------------------------------------------------------------------
353    
354        /**
355         * <p>Append to the <code>toString</code> a <code>double</code>
356         * value.</p>
357         *
358         * @param value  the value to add to the <code>toString</code>
359         * @return this
360         */
361        public ToStringBuilder append(double value) {
362            style.append(buffer, null, value);
363            return this;
364        }
365    
366        //----------------------------------------------------------------------------
367    
368        /**
369         * <p>Append to the <code>toString</code> a <code>double</code>
370         * array.</p>
371         *
372         * @param array  the array to add to the <code>toString</code>
373         * @return this
374         */
375        public ToStringBuilder append(double[] array) {
376            style.append(buffer, null, array, null);
377            return this;
378        }
379    
380        //----------------------------------------------------------------------------
381    
382        /**
383         * <p>Append to the <code>toString</code> a <code>float</code>
384         * value.</p>
385         *
386         * @param value  the value to add to the <code>toString</code>
387         * @return this
388         */
389        public ToStringBuilder append(float value) {
390            style.append(buffer, null, value);
391            return this;
392        }
393    
394        //----------------------------------------------------------------------------
395    
396        /**
397         * <p>Append to the <code>toString</code> a <code>float</code>
398         * array.</p>
399         *
400         * @param array  the array to add to the <code>toString</code>
401         * @return this
402         */
403        public ToStringBuilder append(float[] array) {
404            style.append(buffer, null, array, null);
405            return this;
406        }
407    
408        //----------------------------------------------------------------------------
409    
410        /**
411         * <p>Append to the <code>toString</code> an <code>int</code>
412         * value.</p>
413         *
414         * @param value  the value to add to the <code>toString</code>
415         * @return this
416         */
417        public ToStringBuilder append(int value) {
418            style.append(buffer, null, value);
419            return this;
420        }
421    
422        //----------------------------------------------------------------------------
423    
424        /**
425         * <p>Append to the <code>toString</code> an <code>int</code>
426         * array.</p>
427         *
428         * @param array  the array to add to the <code>toString</code>
429         * @return this
430         */
431        public ToStringBuilder append(int[] array) {
432            style.append(buffer, null, array, null);
433            return this;
434        }
435    
436        //----------------------------------------------------------------------------
437    
438        /**
439         * <p>Append to the <code>toString</code> a <code>long</code>
440         * value.</p>
441         *
442         * @param value  the value to add to the <code>toString</code>
443         * @return this
444         */
445        public ToStringBuilder append(long value) {
446            style.append(buffer, null, value);
447            return this;
448        }
449    
450        //----------------------------------------------------------------------------
451    
452        /**
453         * <p>Append to the <code>toString</code> a <code>long</code>
454         * array.</p>
455         *
456         * @param array  the array to add to the <code>toString</code>
457         * @return this
458         */
459        public ToStringBuilder append(long[] array) {
460            style.append(buffer, null, array, null);
461            return this;
462        }
463    
464        //----------------------------------------------------------------------------
465    
466        /**
467         * <p>Append to the <code>toString</code> an <code>Object</code>
468         * value.</p>
469         *
470         * @param obj  the value to add to the <code>toString</code>
471         * @return this
472         */
473        public ToStringBuilder append(Object obj) {
474            style.append(buffer, null, obj, null);
475            return this;
476        }
477    
478        //----------------------------------------------------------------------------
479    
480        /**
481         * <p>Append to the <code>toString</code> an <code>Object</code>
482         * array.</p>
483         *
484         * @param array  the array to add to the <code>toString</code>
485         * @return this
486         */
487        public ToStringBuilder append(Object[] array) {
488            style.append(buffer, null, array, null);
489            return this;
490        }
491    
492        //----------------------------------------------------------------------------
493    
494        /**
495         * <p>Append to the <code>toString</code> a <code>short</code>
496         * value.</p>
497         *
498         * @param value  the value to add to the <code>toString</code>
499         * @return this
500         */
501        public ToStringBuilder append(short value) {
502            style.append(buffer, null, value);
503            return this;
504        }
505    
506        //----------------------------------------------------------------------------
507    
508        /**
509         * <p>Append to the <code>toString</code> a <code>short</code>
510         * array.</p>
511         *
512         * @param array  the array to add to the <code>toString</code>
513         * @return this
514         */
515        public ToStringBuilder append(short[] array) {
516            style.append(buffer, null, array, null);
517            return this;
518        }
519    
520        /**
521         * <p>Append to the <code>toString</code> a <code>boolean</code>
522         * value.</p>
523         *
524         * @param fieldName  the field name
525         * @param value  the value to add to the <code>toString</code>
526         * @return this
527         */
528        public ToStringBuilder append(String fieldName, boolean value) {
529            style.append(buffer, fieldName, value);
530            return this;
531        }
532    
533        /**
534         * <p>Append to the <code>toString</code> a <code>boolean</code>
535         * array.</p>
536         *
537         * @param fieldName  the field name
538         * @param array  the array to add to the <code>hashCode</code>
539         * @return this
540         */
541        public ToStringBuilder append(String fieldName, boolean[] array) {
542            style.append(buffer, fieldName, array, null);
543            return this;
544        }
545    
546        /**
547         * <p>Append to the <code>toString</code> a <code>boolean</code>
548         * array.</p>
549         *
550         * <p>A boolean parameter controls the level of detail to show.
551         * Setting <code>true</code> will output the array in full. Setting
552         * <code>false</code> will output a summary, typically the size of
553         * the array.</p>
554         *
555         * @param fieldName  the field name
556         * @param array  the array to add to the <code>toString</code>
557         * @param fullDetail  <code>true</code> for detail, <code>false</code>
558         *  for summary info
559         * @return this
560         */
561        public ToStringBuilder append(String fieldName, boolean[] array, boolean fullDetail) {
562            style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
563            return this;
564        }
565    
566        /**
567         * <p>Append to the <code>toString</code> an <code>byte</code>
568         * value.</p>
569         *
570         * @param fieldName  the field name
571         * @param value  the value to add to the <code>toString</code>
572         * @return this
573         */
574        public ToStringBuilder append(String fieldName, byte value) {
575            style.append(buffer, fieldName, value);
576            return this;
577        }
578    
579        /**
580         * <p>Append to the <code>toString</code> a <code>byte</code> array.</p>
581         *
582         * @param fieldName  the field name
583         * @param array  the array to add to the <code>toString</code>
584         * @return this
585         */
586        public ToStringBuilder append(String fieldName, byte[] array) {
587            style.append(buffer, fieldName, array, null);
588            return this;
589        }
590    
591        /**
592         * <p>Append to the <code>toString</code> a <code>byte</code>
593         * array.</p>
594         *
595         * <p>A boolean parameter controls the level of detail to show.
596         * Setting <code>true</code> will output the array in full. Setting
597         * <code>false</code> will output a summary, typically the size of
598         * the array.
599         *
600         * @param fieldName  the field name
601         * @param array  the array to add to the <code>toString</code>
602         * @param fullDetail  <code>true</code> for detail, <code>false</code>
603         *  for summary info
604         * @return this
605         */
606        public ToStringBuilder append(String fieldName, byte[] array, boolean fullDetail) {
607            style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
608            return this;
609        }
610    
611        /**
612         * <p>Append to the <code>toString</code> a <code>char</code>
613         * value.</p>
614         *
615         * @param fieldName  the field name
616         * @param value  the value to add to the <code>toString</code>
617         * @return this
618         */
619        public ToStringBuilder append(String fieldName, char value) {
620            style.append(buffer, fieldName, value);
621            return this;
622        }
623    
624        /**
625         * <p>Append to the <code>toString</code> a <code>char</code>
626         * array.</p>
627         *
628         * @param fieldName  the field name
629         * @param array  the array to add to the <code>toString</code>
630         * @return this
631         */
632        public ToStringBuilder append(String fieldName, char[] array) {
633            style.append(buffer, fieldName, array, null);
634            return this;
635        }
636    
637        /**
638         * <p>Append to the <code>toString</code> a <code>char</code>
639         * array.</p>
640         *
641         * <p>A boolean parameter controls the level of detail to show.
642         * Setting <code>true</code> will output the array in full. Setting
643         * <code>false</code> will output a summary, typically the size of
644         * the array.</p>
645         *
646         * @param fieldName  the field name
647         * @param array  the array to add to the <code>toString</code>
648         * @param fullDetail  <code>true</code> for detail, <code>false</code>
649         *  for summary info
650         * @return this
651         */
652        public ToStringBuilder append(String fieldName, char[] array, boolean fullDetail) {
653            style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
654            return this;
655        }
656    
657        /**
658         * <p>Append to the <code>toString</code> a <code>double</code>
659         * value.</p>
660         *
661         * @param fieldName  the field name
662         * @param value  the value to add to the <code>toString</code>
663         * @return this
664         */
665        public ToStringBuilder append(String fieldName, double value) {
666            style.append(buffer, fieldName, value);
667            return this;
668        }
669    
670        /**
671         * <p>Append to the <code>toString</code> a <code>double</code>
672         * array.</p>
673         *
674         * @param fieldName  the field name
675         * @param array  the array to add to the <code>toString</code>
676         * @return this
677         */
678        public ToStringBuilder append(String fieldName, double[] array) {
679            style.append(buffer, fieldName, array, null);
680            return this;
681        }
682    
683        /**
684         * <p>Append to the <code>toString</code> a <code>double</code>
685         * array.</p>
686         *
687         * <p>A boolean parameter controls the level of detail to show.
688         * Setting <code>true</code> will output the array in full. Setting
689         * <code>false</code> will output a summary, typically the size of
690         * the array.</p>
691         *
692         * @param fieldName  the field name
693         * @param array  the array to add to the <code>toString</code>
694         * @param fullDetail  <code>true</code> for detail, <code>false</code>
695         *  for summary info
696         * @return this
697         */
698        public ToStringBuilder append(String fieldName, double[] array, boolean fullDetail) {
699            style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
700            return this;
701        }
702    
703        /**
704         * <p>Append to the <code>toString</code> an <code>float</code>
705         * value.</p>
706         *
707         * @param fieldName  the field name
708         * @param value  the value to add to the <code>toString</code>
709         * @return this
710         */
711        public ToStringBuilder append(String fieldName, float value) {
712            style.append(buffer, fieldName, value);
713            return this;
714        }
715    
716        /**
717         * <p>Append to the <code>toString</code> a <code>float</code>
718         * array.</p>
719         *
720         * @param fieldName  the field name
721         * @param array  the array to add to the <code>toString</code>
722         * @return this
723         */
724        public ToStringBuilder append(String fieldName, float[] array) {
725            style.append(buffer, fieldName, array, null);
726            return this;
727        }
728    
729        /**
730         * <p>Append to the <code>toString</code> a <code>float</code>
731         * array.</p>
732         *
733         * <p>A boolean parameter controls the level of detail to show.
734         * Setting <code>true</code> will output the array in full. Setting
735         * <code>false</code> will output a summary, typically the size of
736         * the array.</p>
737         *
738         * @param fieldName  the field name
739         * @param array  the array to add to the <code>toString</code>
740         * @param fullDetail  <code>true</code> for detail, <code>false</code>
741         *  for summary info
742         * @return this
743         */
744        public ToStringBuilder append(String fieldName, float[] array, boolean fullDetail) {
745            style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
746            return this;
747        }
748    
749        /**
750         * <p>Append to the <code>toString</code> an <code>int</code>
751         * value.</p>
752         *
753         * @param fieldName  the field name
754         * @param value  the value to add to the <code>toString</code>
755         * @return this
756         */
757        public ToStringBuilder append(String fieldName, int value) {
758            style.append(buffer, fieldName, value);
759            return this;
760        }
761    
762        /**
763         * <p>Append to the <code>toString</code> an <code>int</code>
764         * array.</p>
765         *
766         * @param fieldName  the field name
767         * @param array  the array to add to the <code>toString</code>
768         * @return this
769         */
770        public ToStringBuilder append(String fieldName, int[] array) {
771            style.append(buffer, fieldName, array, null);
772            return this;
773        }
774    
775        /**
776         * <p>Append to the <code>toString</code> an <code>int</code>
777         * array.</p>
778         *
779         * <p>A boolean parameter controls the level of detail to show.
780         * Setting <code>true</code> will output the array in full. Setting
781         * <code>false</code> will output a summary, typically the size of
782         * the array.</p>
783         *
784         * @param fieldName  the field name
785         * @param array  the array to add to the <code>toString</code>
786         * @param fullDetail  <code>true</code> for detail, <code>false</code>
787         *  for summary info
788         * @return this
789         */
790        public ToStringBuilder append(String fieldName, int[] array, boolean fullDetail) {
791            style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
792            return this;
793        }
794    
795        /**
796         * <p>Append to the <code>toString</code> a <code>long</code>
797         * value.</p>
798         *
799         * @param fieldName  the field name
800         * @param value  the value to add to the <code>toString</code>
801         * @return this
802         */
803        public ToStringBuilder append(String fieldName, long value) {
804            style.append(buffer, fieldName, value);
805            return this;
806        }
807    
808        /**
809         * <p>Append to the <code>toString</code> a <code>long</code>
810         * array.</p>
811         *
812         * @param fieldName  the field name
813         * @param array  the array to add to the <code>toString</code>
814         * @return this
815         */
816        public ToStringBuilder append(String fieldName, long[] array) {
817            style.append(buffer, fieldName, array, null);
818            return this;
819        }
820    
821        /**
822         * <p>Append to the <code>toString</code> a <code>long</code>
823         * array.</p>
824         *
825         * <p>A boolean parameter controls the level of detail to show.
826         * Setting <code>true</code> will output the array in full. Setting
827         * <code>false</code> will output a summary, typically the size of
828         * the array.</p>
829         *
830         * @param fieldName  the field name
831         * @param array  the array to add to the <code>toString</code>
832         * @param fullDetail  <code>true</code> for detail, <code>false</code>
833         *  for summary info
834         * @return this
835         */
836        public ToStringBuilder append(String fieldName, long[] array, boolean fullDetail) {
837            style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
838            return this;
839        }
840    
841        /**
842         * <p>Append to the <code>toString</code> an <code>Object</code>
843         * value.</p>
844         *
845         * @param fieldName  the field name
846         * @param obj  the value to add to the <code>toString</code>
847         * @return this
848         */
849        public ToStringBuilder append(String fieldName, Object obj) {
850            style.append(buffer, fieldName, obj, null);
851            return this;
852        }
853    
854        /**
855         * <p>Append to the <code>toString</code> an <code>Object</code>
856         * value.</p>
857         *
858         * @param fieldName  the field name
859         * @param obj  the value to add to the <code>toString</code>
860         * @param fullDetail  <code>true</code> for detail,
861         *  <code>false</code> for summary info
862         * @return this
863         */
864        public ToStringBuilder append(String fieldName, Object obj, boolean fullDetail) {
865            style.append(buffer, fieldName, obj, Boolean.valueOf(fullDetail));
866            return this;
867        }
868    
869        /**
870         * <p>Append to the <code>toString</code> an <code>Object</code>
871         * array.</p>
872         *
873         * @param fieldName  the field name
874         * @param array  the array to add to the <code>toString</code>
875         * @return this
876         */
877        public ToStringBuilder append(String fieldName, Object[] array) {
878            style.append(buffer, fieldName, array, null);
879            return this;
880        }
881    
882        /**
883         * <p>Append to the <code>toString</code> an <code>Object</code>
884         * array.</p>
885         *
886         * <p>A boolean parameter controls the level of detail to show.
887         * Setting <code>true</code> will output the array in full. Setting
888         * <code>false</code> will output a summary, typically the size of
889         * the array.</p>
890         *
891         * @param fieldName  the field name
892         * @param array  the array to add to the <code>toString</code>
893         * @param fullDetail  <code>true</code> for detail, <code>false</code>
894         *  for summary info
895         * @return this
896         */
897        public ToStringBuilder append(String fieldName, Object[] array, boolean fullDetail) {
898            style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
899            return this;
900        }
901    
902        /**
903         * <p>Append to the <code>toString</code> an <code>short</code>
904         * value.</p>
905         *
906         * @param fieldName  the field name
907         * @param value  the value to add to the <code>toString</code>
908         * @return this
909         */
910        public ToStringBuilder append(String fieldName, short value) {
911            style.append(buffer, fieldName, value);
912            return this;
913        }
914    
915        /**
916         * <p>Append to the <code>toString</code> a <code>short</code>
917         * array.</p>
918         *
919         * @param fieldName  the field name
920         * @param array  the array to add to the <code>toString</code>
921         * @return this
922         */
923        public ToStringBuilder append(String fieldName, short[] array) {
924            style.append(buffer, fieldName, array, null);
925            return this;
926        }
927    
928        /**
929         * <p>Append to the <code>toString</code> a <code>short</code>
930         * array.</p>
931         *
932         * <p>A boolean parameter controls the level of detail to show.
933         * Setting <code>true</code> will output the array in full. Setting
934         * <code>false</code> will output a summary, typically the size of
935         * the array.
936         *
937         * @param fieldName  the field name
938         * @param array  the array to add to the <code>toString</code>
939         * @param fullDetail  <code>true</code> for detail, <code>false</code>
940         *  for summary info
941         * @return this
942         */
943        public ToStringBuilder append(String fieldName, short[] array, boolean fullDetail) {
944            style.append(buffer, fieldName, array, Boolean.valueOf(fullDetail));
945            return this;
946        }
947    
948        /**
949         * <p>Appends with the same format as the default <code>Object toString()
950         * </code> method. Appends the class name followed by 
951         * {@link System#identityHashCode(java.lang.Object)}.</p>
952         * 
953         * @param object  the <code>Object</code> whose class name and id to output
954         * @return this
955         * @since 2.0
956         */
957        public ToStringBuilder appendAsObjectToString(Object object) {
958            ObjectUtils.identityToString(this.getStringBuffer(), object);
959            return this;
960        }
961    
962        //----------------------------------------------------------------------------
963    
964        /**
965         * <p>Append the <code>toString</code> from the superclass.</p>
966         * 
967         * <p>This method assumes that the superclass uses the same <code>ToStringStyle</code>
968         * as this one.</p>
969         * 
970         * <p>If <code>superToString</code> is <code>null</code>, no change is made.</p>
971         *
972         * @param superToString  the result of <code>super.toString()</code>
973         * @return this
974         * @since 2.0
975         */
976        public ToStringBuilder appendSuper(String superToString) {
977            if (superToString != null) {
978                style.appendSuper(buffer, superToString);
979            }
980            return this;
981        }
982    
983        /**
984         * <p>Append the <code>toString</code> from another object.</p>
985         * 
986         * <p>This method is useful where a class delegates most of the implementation of
987         * its properties to another class. You can then call <code>toString()</code> on
988         * the other class and pass the result into this method.</p>
989         * 
990         * <pre>
991         *   private AnotherObject delegate;
992         *   private String fieldInThisClass;
993         * 
994         *   public String toString() {
995         *     return new ToStringBuilder(this).
996         *       appendToString(delegate.toString()).
997         *       append(fieldInThisClass).
998         *       toString();
999         *   }</pre>
1000         * 
1001         * <p>This method assumes that the other object uses the same <code>ToStringStyle</code>
1002         * as this one.</p>
1003         * 
1004         * <p>If the <code>toString</code> is <code>null</code>, no change is made.</p>
1005         *
1006         * @param toString  the result of <code>toString()</code> on another object
1007         * @return this
1008         * @since 2.0
1009         */
1010        public ToStringBuilder appendToString(String toString) {
1011            if (toString != null) {
1012                style.appendToString(buffer, toString);
1013            }
1014            return this;
1015        }
1016    
1017        /**
1018         * <p>Returns the <code>Object</code> being output.</p>
1019         * 
1020         * @return The object being output.
1021         * @since 2.0
1022         */
1023        public Object getObject() {
1024            return object;
1025        }
1026    
1027        /**
1028         * <p>Gets the <code>StringBuffer</code> being populated.</p>
1029         * 
1030         * @return the <code>StringBuffer</code> being populated
1031         */
1032        public StringBuffer getStringBuffer() {
1033            return buffer;
1034        }
1035    
1036        //----------------------------------------------------------------------------
1037    
1038        /**
1039         * <p>Gets the <code>ToStringStyle</code> being used.</p>
1040         * 
1041         * @return the <code>ToStringStyle</code> being used
1042         * @since 2.0
1043         */
1044        public ToStringStyle getStyle() {
1045            return style;
1046        }
1047    
1048        /**
1049         * <p>Returns the built <code>toString</code>.</p>
1050         * 
1051         * <p>This method appends the end of data indicator, and can only be called once.
1052         * Use {@link #getStringBuffer} to get the current string state.</p>
1053         * 
1054         * <p>If the object is <code>null</code>, return the style's <code>nullText</code></p>
1055         * 
1056         * @return the String <code>toString</code>
1057         */
1058        @Override
1059        public String toString() {
1060            if (this.getObject() == null) {
1061                this.getStringBuffer().append(this.getStyle().getNullText());
1062            } else {
1063                style.appendEnd(this.getStringBuffer(), this.getObject());
1064            }
1065            return this.getStringBuffer().toString();
1066        }
1067    
1068        /**
1069         * Returns the String that was build as an object representation. The 
1070         * default implementation utilizes the {@link #toString()} implementation.
1071         * 
1072         * @return the String <code>toString</code>
1073         * 
1074         * @see #toString()
1075         * 
1076         * @since 3.0
1077         */
1078        public String build() {
1079            return toString();
1080        }
1081    }