commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Matt Benson <gudnabr...@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 15:30:02 GMT
Sorry, guys.  I found the offending setting and disabled it.  -Matt

On Feb 4, 2010, at 10:32 PM, Henri Yandell wrote:

> +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
>


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


Mime
View raw message