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