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