Hi Bruno,

you have to set svn:keywords with the svn ps command. I've done this for
your new files in r1569053.

Beside that it looks this is more of type "update" or "add". But I don't
know for sure. Can you comment on this?

Benedikt


2014-02-17 16:45 GMT+01:00 <ki...@apache.org>:

> Author: kinow
> Date: Mon Feb 17 15:45:17 2014
> New Revision: 1569028
>
> URL: http://svn.apache.org/r1569028
> Log:
> LANG-621: ReflectionToStringBuilder.toString does not debug 3rd party
> object fields within 3rd party object. Suggested by Philip Hodges. Final
> patch from Thomas Neidhart.
>
> Added:
>
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/RecursiveToStringStyle.java
>
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
> Modified:
>     commons/proper/lang/trunk/src/changes/changes.xml
>
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
>
> Modified: commons/proper/lang/trunk/src/changes/changes.xml
> URL:
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/changes/changes.xml?rev=1569028&r1=1569027&r2=1569028&view=diff
>
> ==============================================================================
> --- commons/proper/lang/trunk/src/changes/changes.xml [utf-8] (original)
> +++ commons/proper/lang/trunk/src/changes/changes.xml [utf-8] Mon Feb 17
> 15:45:17 2014
> @@ -22,6 +22,7 @@
>    <body>
>
>    <release version="3.3" date="TBA" description="Bugfix and Feature
> release">
> +    <action issue="LANG-621" type="fix" dev="kinow" due-to="Philip
> Hodges, Thomas Neidhart">ReflectionToStringBuilder.toString does not debug
> 3rd party object fields within 3rd party object</action>
>      <action issue="LANG-955" type="add" dev="britter" due-to="Adam
> Hooper">Add methods for removing all invalid characters according to XML
> 1.0 and XML 1.1 in an input string to StringEscapeUtils</action>
>      <action issue="LANG-977" type="fix" dev="britter" due-to="Chris
> Karcher">NumericEntityEscaper incorrectly encodes supplementary
> characters</action>
>      <action issue="LANG-973" type="fix" dev="sebb">Make some private
> fields final</action>
>
> Added:
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/RecursiveToStringStyle.java
> URL:
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/RecursiveToStringStyle.java?rev=1569028&view=auto
>
> ==============================================================================
> ---
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/RecursiveToStringStyle.java
> (added)
> +++
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/RecursiveToStringStyle.java
> Mon Feb 17 15:45:17 2014
> @@ -0,0 +1,84 @@
> +package org.apache.commons.lang3.builder;
> +
> +import java.util.Collection;
> +
> +import org.apache.commons.lang3.ClassUtils;
> +
> +/**
> + * <p>Works with {@link ToStringBuilder} to create a "deep"
> <code>toString</code>.</p>
> + *
> + * <p>To use this class write code as follows:</p>
> + *
> + * <pre>
> + * public class Job {
> + *   String title;
> + *   ...
> + * }
> + *
> + * public class Person {
> + *   String name;
> + *   int age;
> + *   boolean smoker;
> + *   Job job;
> + *
> + *   ...
> + *
> + *   public String toString() {
> + *     return new ReflectionToStringBuilder(this, new
> RecursiveToStringStyle()).toString();
> + *   }
> + * }
> + * </pre>
> + *
> + * <p>This will produce a toString of the format:
> + * <code>Person@7f54[name=Stephen,age=29,smoker=false,job=Job@43cd2
> [title=Manager]]</code></p>
> + *
> + * @since 3.2
> + * @version $Id$
> + */
> +public class RecursiveToStringStyle extends ToStringStyle {
> +
> +    /**
> +     * Required for serialization support.
> +     *
> +     * @see java.io.Serializable
> +     */
> +    private static final long serialVersionUID = 1L;
> +
> +    /**
> +     * <p>Constructor.</p>
> +     */
> +    public RecursiveToStringStyle() {
> +        super();
> +    }
> +
> +    @Override
> +    public void appendDetail(StringBuffer buffer, String fieldName,
> Object value) {
> +        if (!ClassUtils.isPrimitiveWrapper(value.getClass()) &&
> +            !String.class.equals(value.getClass()) &&
> +            accept(value.getClass())) {
> +            buffer.append(ReflectionToStringBuilder.toString(value,
> this));
> +        } else {
> +            super.appendDetail(buffer, fieldName, value);
> +        }
> +    }
> +
> +    @Override
> +    protected void appendDetail(StringBuffer buffer, String fieldName,
> Collection<?> coll) {
> +        appendClassName(buffer, coll);
> +        appendIdentityHashCode(buffer, coll);
> +        appendDetail(buffer, fieldName, coll.toArray());
> +    }
> +
> +    /**
> +     * Returns whether or not to recursively format the given
> <code>Class</code>.
> +     * By default, this method always returns {@code true}, but may be
> overwritten by
> +     * sub-classes to filter specific classes.
> +     *
> +     * @param clazz
> +     *            The class to test.
> +     * @return Whether or not to recursively format the given
> <code>Class</code>.
> +     */
> +    protected boolean accept(final Class<?> clazz) {
> +        return true;
> +    }
> +}
>
> Modified:
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
> URL:
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java?rev=1569028&r1=1569027&r2=1569028&view=diff
>
> ==============================================================================
> ---
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
> (original)
> +++
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java
> Mon Feb 17 15:45:17 2014
> @@ -81,7 +81,12 @@ import org.apache.commons.lang3.ClassUti
>   * <p>
>   * The exact format of the <code>toString</code> is determined by the
> {@link ToStringStyle} passed into the constructor.
>   * </p>
> - *
> + *
> + * <p>
> + * <b>Note:</b> the default {@link ToStringStyle} will only do a
> "shallow" formatting, i.e. composed objects are not
> + * further traversed. To get "deep" formatting, use an instance of {@link
> RecursiveToStringStyle}.
> + * </p>
> + *
>   * @since 2.0
>   * @version $Id$
>   */
>
> Added:
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
> URL:
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java?rev=1569028&view=auto
>
> ==============================================================================
> ---
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
> (added)
> +++
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/builder/RecursiveToStringStyleTest.java
> Mon Feb 17 15:45:17 2014
> @@ -0,0 +1,163 @@
> +/*
> + * Licensed to the Apache Software Foundation (ASF) under one or more
> + * contributor license agreements.  See the NOTICE file distributed with
> + * this work for additional information regarding copyright ownership.
> + * 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.
> + * See the License for the specific language governing permissions and
> + * limitations under the License.
> + */
> +package org.apache.commons.lang3.builder;
> +
> +import static org.junit.Assert.assertEquals;
> +
> +import java.util.ArrayList;
> +import java.util.HashMap;
> +
> +import org.junit.After;
> +import org.junit.Before;
> +import org.junit.Test;
> +
> +/**
> + * Unit tests {@link
> org.apache.commons.lang3.builder.RecursiveToStringStyleTest}.
> + *
> + * @version $Id$
> + */
> +public class RecursiveToStringStyleTest {
> +
> +    private final Integer base = Integer.valueOf(5);
> +    private final String baseStr = base.getClass().getName() + "@" +
> Integer.toHexString(System.identityHashCode(base));
> +
> +    @Before
> +    public void setUp() throws Exception {
> +        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
> +    }
> +
> +    @After
> +    public void tearDown() throws Exception {
> +        ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE);
> +    }
> +
> +    //----------------------------------------------------------------
> +
> +    @Test
> +    public void testBlank() {
> +        assertEquals(baseStr + "[]", new
> ToStringBuilder(base).toString());
> +    }
> +
> +    @Test
> +    public void testAppendSuper() {
> +        assertEquals(baseStr + "[]", new
> ToStringBuilder(base).appendSuper("Integer@8888[]").toString());
> +        assertEquals(baseStr + "[<null>]", new
> ToStringBuilder(base).appendSuper("Integer@8888[<null>]").toString());
> +
> +        assertEquals(baseStr + "[a=hello]", new
> ToStringBuilder(base).appendSuper("Integer@8888[]").append("a",
> "hello").toString());
> +        assertEquals(baseStr + "[<null>,a=hello]", new
> ToStringBuilder(base).appendSuper("Integer@8888[<null>]").append("a",
> "hello").toString());
> +        assertEquals(baseStr + "[a=hello]", new
> ToStringBuilder(base).appendSuper(null).append("a", "hello").toString());
> +    }
> +
> +    @Test
> +    public void testObject() {
> +        final Integer i3 = Integer.valueOf(3);
> +        final Integer i4 = Integer.valueOf(4);
> +        assertEquals(baseStr + "[<null>]", new
> ToStringBuilder(base).append((Object) null).toString());
> +        assertEquals(baseStr + "[3]", new
> ToStringBuilder(base).append(i3).toString());
> +        assertEquals(baseStr + "[a=<null>]", new
> ToStringBuilder(base).append("a", (Object) null).toString());
> +        assertEquals(baseStr + "[a=3]", new
> ToStringBuilder(base).append("a", i3).toString());
> +        assertEquals(baseStr + "[a=3,b=4]", new
> ToStringBuilder(base).append("a", i3).append("b", i4).toString());
> +        assertEquals(baseStr + "[a=<Integer>]", new
> ToStringBuilder(base).append("a", i3, false).toString());
> +        assertEquals(baseStr + "[a=<size=0>]", new
> ToStringBuilder(base).append("a", new ArrayList<Object>(),
> false).toString());
> +        assertEquals(baseStr + "[a=[]]", new
> ToStringBuilder(base).append("a", new ArrayList<Object>(),
> true).toString());
> +        assertEquals(baseStr + "[a=<size=0>]", new
> ToStringBuilder(base).append("a", new HashMap<Object, Object>(),
> false).toString());
> +        assertEquals(baseStr + "[a={}]", new
> ToStringBuilder(base).append("a", new HashMap<Object, Object>(),
> true).toString());
> +        assertEquals(baseStr + "[a=<size=0>]", new
> ToStringBuilder(base).append("a", (Object) new String[0],
> false).toString());
> +        assertEquals(baseStr + "[a={}]", new
> ToStringBuilder(base).append("a", (Object) new String[0], true).toString());
> +    }
> +
> +    @Test
> +    public void testPerson() {
> +        final Person p = new Person();
> +        p.name = "John Doe";
> +        p.age = 33;
> +        p.smoker = false;
> +        p.job = new Job();
> +        p.job.title = "Manager";
> +        final String pBaseStr = p.getClass().getName() + "@" +
> Integer.toHexString(System.identityHashCode(p));
> +        final String pJobStr  = p.job.getClass().getName() + "@" +
> Integer.toHexString(System.identityHashCode(p.job));
> +        assertEquals(pBaseStr + "[name=John Doe,age=33,smoker=false,job="
> + pJobStr + "[title=Manager]]",
> +                     new ReflectionToStringBuilder(p, new
> RecursiveToStringStyle()).toString());
> +    }
> +
> +    @Test
> +    public void testLong() {
> +        assertEquals(baseStr + "[3]", new
> ToStringBuilder(base).append(3L).toString());
> +        assertEquals(baseStr + "[a=3]", new
> ToStringBuilder(base).append("a", 3L).toString());
> +        assertEquals(baseStr + "[a=3,b=4]", new
> ToStringBuilder(base).append("a", 3L).append("b", 4L).toString());
> +    }
> +
> +    @Test
> +    public void testObjectArray() {
> +        Object[] array = new Object[] {null, base, new int[] {3, 6}};
> +        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new
> ToStringBuilder(base).append(array).toString());
> +        assertEquals(baseStr + "[{<null>,5,{3,6}}]", new
> ToStringBuilder(base).append((Object) array).toString());
> +        array = null;
> +        assertEquals(baseStr + "[<null>]", new
> ToStringBuilder(base).append(array).toString());
> +        assertEquals(baseStr + "[<null>]", new
> ToStringBuilder(base).append((Object) array).toString());
> +    }
> +
> +    @Test
> +    public void testLongArray() {
> +        long[] array = new long[] {1, 2, -3, 4};
> +        assertEquals(baseStr + "[{1,2,-3,4}]", new
> ToStringBuilder(base).append(array).toString());
> +        assertEquals(baseStr + "[{1,2,-3,4}]", new
> ToStringBuilder(base).append((Object) array).toString());
> +        array = null;
> +        assertEquals(baseStr + "[<null>]", new
> ToStringBuilder(base).append(array).toString());
> +        assertEquals(baseStr + "[<null>]", new
> ToStringBuilder(base).append((Object) array).toString());
> +    }
> +
> +    @Test
> +    public void testLongArrayArray() {
> +        long[][] array = new long[][] {{1, 2}, null, {5}};
> +        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new
> ToStringBuilder(base).append(array).toString());
> +        assertEquals(baseStr + "[{{1,2},<null>,{5}}]", new
> ToStringBuilder(base).append((Object) array).toString());
> +        array = null;
> +        assertEquals(baseStr + "[<null>]", new
> ToStringBuilder(base).append(array).toString());
> +        assertEquals(baseStr + "[<null>]", new
> ToStringBuilder(base).append((Object) array).toString());
> +    }
> +
> +    static class Person {
> +        /**
> +         * Test String field.
> +         */
> +        String name;
> +
> +        /**
> +         * Test integer field.
> +         */
> +        int age;
> +
> +        /**
> +         * Test boolean field.
> +         */
> +        boolean smoker;
> +
> +        /**
> +         * Test Object field.
> +         */
> +        Job job;
> +    }
> +
> +    static class Job {
> +        /**
> +         * Test String field.
> +         */
> +        String title;
> +    }
> +
> +}
>
>
>


-- 
http://people.apache.org/~britter/
http://www.systemoutprintln.de/
http://twitter.com/BenediktRitter
http://github.com/britter

Reply via email to