commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Henri Yandell <flame...@gmail.com>
Subject Re: svn commit: r906673 - /commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
Date Fri, 05 Feb 2010 04:32:35 GMT
+1 :)

On Thu, Feb 4, 2010 at 4:17 PM, Niall Pemberton
<niall.pemberton@gmail.com> wrote:
> Matt,
>
> Can you stop mixing up style/format changes with real functional
> changes - it makes it harder to follow along when you change a few
> lines and theres 10 pages in the commit email, I guess this is
> probably an IDE setting to remove trailing spaces. Can you either
> change your IDE or if you do want to change the format then do it as a
> separate commit before you make any functional changes.
>
> Thanks
>
> Niall
>
> On Thu, Feb 4, 2010 at 9:46 PM,  <mbenson@apache.org> wrote:
>> Author: mbenson
>> Date: Thu Feb  4 21:46:22 2010
>> New Revision: 906673
>>
>> URL: http://svn.apache.org/viewvc?rev=906673&view=rev
>> Log:
>> [LANG-586] clear ThreadLocal recursion registry (compatibly with existing tests,
first pass)
>>
>> Modified:
>>    commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
>>
>> Modified: commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
>> URL: http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java?rev=906673&r1=906672&r2=906673&view=diff
>> ==============================================================================
>> --- commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
(original)
>> +++ commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java
Thu Feb  4 21:46:22 2010
>> @@ -5,9 +5,9 @@
>>  * The ASF licenses this file to You under the Apache License, Version 2.0
>>  * (the "License"); you may not use this file except in compliance with
>>  * the License.  You may obtain a copy of the License at
>> - *
>> + *
>>  *      http://www.apache.org/licenses/LICENSE-2.0
>> - *
>> + *
>>  * Unless required by applicable law or agreed to in writing, software
>>  * distributed under the License is distributed on an "AS IS" BASIS,
>>  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>> @@ -19,9 +19,10 @@
>>  import java.io.Serializable;
>>  import java.lang.reflect.Array;
>>  import java.util.Collection;
>> -import java.util.HashSet;
>> +import java.util.Collections;
>>  import java.util.Map;
>>  import java.util.Set;
>> +import java.util.WeakHashMap;
>>
>>  import org.apache.commons.lang3.ClassUtils;
>>  import org.apache.commons.lang3.ObjectUtils;
>> @@ -46,7 +47,7 @@
>>  * <p>For example, the detail version of the array based methods will
>>  * output the whole array, whereas the summary method will just output
>>  * the array length.</p>
>> - *
>> + *
>>  * <p>If you want to format the output of certain objects, such as dates,
you
>>  * must create a subclass and override a method.
>>  * <pre>
>> @@ -73,17 +74,17 @@
>>     /**
>>      * The default toString style. Using the Using the <code>Person</code>
>>      * example from {@link ToStringBuilder}, the output would look like this:
>> -     *
>> +     *
>>      * <pre>
>>      * Person@182f0db[name=John Doe,age=33,smoker=false]
>>      * </pre>
>>      */
>>     public static final ToStringStyle DEFAULT_STYLE = new DefaultToStringStyle();
>> -
>> +
>>     /**
>>      * The multi line toString style. Using the Using the <code>Person</code>
>>      * example from {@link ToStringBuilder}, the output would look like this:
>> -     *
>> +     *
>>      * <pre>
>>      * Person@182f0db[
>>      *   name=John Doe
>> @@ -93,26 +94,26 @@
>>      * </pre>
>>      */
>>     public static final ToStringStyle MULTI_LINE_STYLE = new MultiLineToStringStyle();
>> -
>> +
>>     /**
>>      * The no field names toString style. Using the Using the
>>      * <code>Person</code> example from {@link ToStringBuilder}, the
output
>>      * would look like this:
>> -     *
>> +     *
>>      * <pre>
>>      * Person@182f0db[John Doe,33,false]
>>      * </pre>
>>      */
>>     public static final ToStringStyle NO_FIELD_NAMES_STYLE = new NoFieldNameToStringStyle();
>> -
>> +
>>     /**
>>      * The short prefix toString style. Using the <code>Person</code>
example
>>      * from {@link ToStringBuilder}, the output would look like this:
>> -     *
>> +     *
>>      * <pre>
>>      * Person[name=John Doe,age=33,smoker=false]
>>      * </pre>
>> -     *
>> +     *
>>      * @since 2.1
>>      */
>>     public static final ToStringStyle SHORT_PREFIX_STYLE = new ShortPrefixToStringStyle();
>> @@ -120,38 +121,32 @@
>>     /**
>>      * The simple toString style. Using the Using the <code>Person</code>
>>      * example from {@link ToStringBuilder}, the output would look like this:
>> -     *
>> +     *
>>      * <pre>
>>      * John Doe,33,false
>>      * </pre>
>>      */
>>     public static final ToStringStyle SIMPLE_STYLE = new SimpleToStringStyle();
>> -
>> +
>>     /**
>>      * <p>
>>      * A registry of objects used by <code>reflectionToString</code>
methods
>>      * to detect cyclical object references and avoid infinite loops.
>>      * </p>
>>      */
>> -    private static final ThreadLocal<Set<Object>> registry = new ThreadLocal<Set<Object>>()
{
>> -        @Override
>> -        protected Set<Object> initialValue() {
>> -            // The HashSet implementation is not synchronized,
>> -            // which is just what we need here.
>> -            return new HashSet<Object>();
>> -        }
>> -    };
>> +    private static final ThreadLocal<WeakHashMap<Object, Object>>
REGISTRY = new ThreadLocal<WeakHashMap<Object,Object>>();
>>
>>     /**
>>      * <p>
>>      * Returns the registry of objects being traversed by the <code>reflectionToString</code>
>>      * methods in the current thread.
>>      * </p>
>> -     *
>> +     *
>>      * @return Set the registry of objects being traversed
>>      */
>>     static Set<Object> getRegistry() {
>> -        return registry.get();
>> +        WeakHashMap<Object, Object> m = REGISTRY.get();
>> +        return m == null ? Collections.<Object> emptySet() : m.keySet();
>>     }
>>
>>     /**
>> @@ -159,7 +154,7 @@
>>      * Returns <code>true</code> if the registry contains the given
object.
>>      * Used by the reflection methods to avoid infinite loops.
>>      * </p>
>> -     *
>> +     *
>>      * @param value
>>      *                  The object to lookup in the registry.
>>      * @return boolean <code>true</code> if the registry contains
the given
>> @@ -174,13 +169,21 @@
>>      * Registers the given object. Used by the reflection methods to avoid
>>      * infinite loops.
>>      * </p>
>> -     *
>> +     *
>>      * @param value
>>      *                  The object to register.
>>      */
>>     static void register(Object value) {
>>         if (value != null) {
>> -            getRegistry().add(value);
>> +            WeakHashMap<Object, Object> m;
>> +            synchronized (ToStringStyle.class) {
>> +                m = REGISTRY.get();
>> +                if (m == null) {
>> +                    m = new WeakHashMap<Object, Object>();
>> +                    REGISTRY.set(m);
>> +                }
>> +            }
>> +            m.put(value, null);
>>         }
>>     }
>>
>> @@ -188,33 +191,44 @@
>>      * <p>
>>      * Unregisters the given object.
>>      * </p>
>> -     *
>> +     *
>>      * <p>
>>      * Used by the reflection methods to avoid infinite loops.
>>      * </p>
>> -     *
>> +     *
>>      * @param value
>>      *                  The object to unregister.
>>      */
>>     static void unregister(Object value) {
>> -        getRegistry().remove(value);
>> +        if (value != null) {
>> +            WeakHashMap<Object, Object> m;
>> +            synchronized (ToStringStyle.class) {
>> +                m = REGISTRY.get();
>> +                if (m != null) {
>> +                    m.remove(value);
>> +                    if (m.isEmpty()) {
>> +                        REGISTRY.remove();
>> +                    }
>> +                }
>> +            }
>> +        }
>>     }
>>
>>     /**
>>      * Whether to use the field names, the default is <code>true</code>.
>>      */
>>     private boolean useFieldNames = true;
>> -
>> +
>>     /**
>>      * Whether to use the class name, the default is <code>true</code>.
>>      */
>>     private boolean useClassName = true;
>> -
>> +
>>     /**
>>      * Whether to use short class names, the default is <code>false</code>.
>>      */
>>     private boolean useShortClassName = false;
>> -
>> +
>>     /**
>>      * Whether to use the identity hash code, the default is <code>true</code>.
>>      */
>> @@ -224,78 +238,78 @@
>>      * The content start <code>'['</code>.
>>      */
>>     private String contentStart = "[";
>> -
>> +
>>     /**
>>      * The content end <code>']'</code>.
>>      */
>>     private String contentEnd = "]";
>> -
>> +
>>     /**
>>      * The field name value separator <code>'='</code>.
>>      */
>>     private String fieldNameValueSeparator = "=";
>> -
>> +
>>     /**
>>      * Whether the field separator should be added before any other fields.
>>      */
>>     private boolean fieldSeparatorAtStart = false;
>> -
>> +
>>     /**
>>      * Whether the field separator should be added after any other fields.
>>      */
>>     private boolean fieldSeparatorAtEnd = false;
>> -
>> +
>>     /**
>>      * The field separator <code>','</code>.
>>      */
>>     private String fieldSeparator = ",";
>> -
>> +
>>     /**
>>      * The array start <code>'{'</code>.
>>      */
>>     private String arrayStart = "{";
>> -
>> +
>>     /**
>>      * The array separator <code>','</code>.
>>      */
>>     private String arraySeparator = ",";
>> -
>> +
>>     /**
>>      * The detail for array content.
>>      */
>>     private boolean arrayContentDetail = true;
>> -
>> +
>>     /**
>>      * The array end <code>'}'</code>.
>>      */
>>     private String arrayEnd = "}";
>> -
>> +
>>     /**
>>      * The value to use when fullDetail is <code>null</code>,
>>      * the default value is <code>true</code>.
>>      */
>>     private boolean defaultFullDetail = true;
>> -
>> +
>>     /**
>>      * The <code>null</code> text <code>'&lt;null&gt;'</code>.
>>      */
>>     private String nullText = "<null>";
>> -
>> +
>>     /**
>>      * The summary size text start <code>'<size'</code>.
>>      */
>>     private String sizeStartText = "<size=";
>> -
>> +
>>     /**
>>      * The summary size text start <code>'&gt;'</code>.
>>      */
>>     private String sizeEndText = ">";
>> -
>> +
>>     /**
>>      * The summary object text start <code>'&lt;'</code>.
>>      */
>>     private String summaryObjectStartText = "<";
>> -
>> +
>>     /**
>>      * The summary object text start <code>'&gt;'</code>.
>>      */
>> @@ -315,9 +329,9 @@
>>     /**
>>      * <p>Append to the <code>toString</code> the superclass
toString.</p>
>>      * <p>NOTE: It assumes that the toString has been created from the same
ToStringStyle. </p>
>> -     *
>> +     *
>>      * <p>A <code>null</code> <code>superToString</code>
is ignored.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param superToString  the <code>super.toString()</code>
>>      * @since 2.0
>> @@ -329,9 +343,9 @@
>>     /**
>>      * <p>Append to the <code>toString</code> another toString.</p>
>>      * <p>NOTE: It assumes that the toString has been created from the same
ToStringStyle. </p>
>> -     *
>> +     *
>>      * <p>A <code>null</code> <code>toString</code>
is ignored.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param toString  the additional <code>toString</code>
>>      * @since 2.0
>> @@ -353,7 +367,7 @@
>>
>>     /**
>>      * <p>Append to the <code>toString</code> the start of data
indicator.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param object  the <code>Object</code> to build a <code>toString</code>
for
>>      */
>> @@ -370,7 +384,7 @@
>>
>>     /**
>>      * <p>Append to the <code>toString</code> the end of data
indicator.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param object  the <code>Object</code> to build a
>>      *  <code>toString</code> for.
>> @@ -385,7 +399,7 @@
>>
>>     /**
>>      * <p>Remove the last field separator from the buffer.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @since 2.0
>>      */
>> @@ -456,7 +470,7 @@
>>             && !(value instanceof Number || value instanceof Boolean
|| value instanceof Character)) {
>>            appendCyclicObject(buffer, fieldName, value);
>>            return;
>> -        }
>> +        }
>>
>>         register(value);
>>
>> @@ -467,77 +481,77 @@
>>                 } 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, value);
>> @@ -549,17 +563,17 @@
>>             unregister(value);
>>         }
>>     }
>> -
>> +
>>     /**
>>      * <p>Append to the <code>toString</code> an <code>Object</code>
>>      * value that has been detected to participate in a cycle. This
>>      * implementation will print the standard string value of the value.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param fieldName  the field name, typically not used as already appended
>>      * @param value  the value to add to the <code>toString</code>,
>>      *  not <code>null</code>
>> -     *
>> +     *
>>      * @since 2.2
>>      */
>>     protected void appendCyclicObject(StringBuffer buffer, String fieldName, Object
value) {
>> @@ -1428,7 +1442,7 @@
>>
>>     /**
>>      * <p>Append to the <code>toString</code> the class name.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param object  the <code>Object</code> whose name to output
>>      */
>> @@ -1445,7 +1459,7 @@
>>
>>     /**
>>      * <p>Append the {@link System#identityHashCode(java.lang.Object)}.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param object  the <code>Object</code> whose id to output
>>      */
>> @@ -1459,7 +1473,7 @@
>>
>>     /**
>>      * <p>Append to the <code>toString</code> the content start.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      */
>>     protected void appendContentStart(StringBuffer buffer) {
>> @@ -1468,7 +1482,7 @@
>>
>>     /**
>>      * <p>Append to the <code>toString</code> the content end.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      */
>>     protected void appendContentEnd(StringBuffer buffer) {
>> @@ -1479,7 +1493,7 @@
>>      * <p>Append to the <code>toString</code> an indicator for
<code>null</code>.</p>
>>      *
>>      * <p>The default indicator is <code>'&lt;null&gt;'</code>.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param fieldName  the field name, typically not used as already appended
>>      */
>> @@ -1489,7 +1503,7 @@
>>
>>     /**
>>      * <p>Append to the <code>toString</code> the field separator.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      */
>>     protected void appendFieldSeparator(StringBuffer buffer) {
>> @@ -1498,7 +1512,7 @@
>>
>>     /**
>>      * <p>Append to the <code>toString</code> the field start.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param fieldName  the field name
>>      */
>> @@ -1511,7 +1525,7 @@
>>
>>     /**
>>      * <p>Append to the <code>toString<code> the field end.</p>
>> -     *
>> +     *
>>      * @param buffer  the <code>StringBuffer</code> to populate
>>      * @param fieldName  the field name, typically not used as already appended
>>      */
>> @@ -1550,7 +1564,7 @@
>>      * <code>null</code> indicating that it doesn't care about
>>      * the detail level. In this case the default detail level is
>>      * used.</p>
>> -     *
>> +     *
>>      * @param fullDetailRequest  the detail level requested
>>      * @return whether full detail is to be shown
>>      */
>> @@ -1886,9 +1900,9 @@
>>     //---------------------------------------------------------------------
>>
>>     /**
>> -     * <p>Gets whether the field separator should be added at the start
>> +     * <p>Gets whether the field separator should be added at the start
>>      * of each buffer.</p>
>> -     *
>> +     *
>>      * @return the fieldSeparatorAtStart flag
>>      * @since 2.0
>>      */
>> @@ -1897,9 +1911,9 @@
>>     }
>>
>>     /**
>> -     * <p>Sets whether the field separator should be added at the start
>> +     * <p>Sets whether the field separator should be added at the start
>>      * of each buffer.</p>
>> -     *
>> +     *
>>      * @param fieldSeparatorAtStart  the fieldSeparatorAtStart flag
>>      * @since 2.0
>>      */
>> @@ -1910,9 +1924,9 @@
>>     //---------------------------------------------------------------------
>>
>>     /**
>> -     * <p>Gets whether the field separator should be added at the end
>> +     * <p>Gets whether the field separator should be added at the end
>>      * of each buffer.</p>
>> -     *
>> +     *
>>      * @return fieldSeparatorAtEnd flag
>>      * @since 2.0
>>      */
>> @@ -1921,9 +1935,9 @@
>>     }
>>
>>     /**
>> -     * <p>Sets whether the field separator should be added at the end
>> +     * <p>Sets whether the field separator should be added at the end
>>      * of each buffer.</p>
>> -     *
>> +     *
>>      * @param fieldSeparatorAtEnd  the fieldSeparatorAtEnd flag
>>      * @since 2.0
>>      */
>> @@ -2097,7 +2111,7 @@
>>
>>         /**
>>          * Required for serialization support.
>> -         *
>> +         *
>>          * @see java.io.Serializable
>>          */
>>         private static final long serialVersionUID = 1L;
>> @@ -2157,7 +2171,7 @@
>>     }
>>
>>     //----------------------------------------------------------------------------
>> -
>> +
>>     /**
>>      * <p><code>ToStringStyle</code> that prints out the short
>>      * class name and no identity hashcode.</p>
>>
>>
>>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
For additional commands, e-mail: dev-help@commons.apache.org


Mime
View raw message