You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by oh...@apache.org on 2008/03/26 12:01:23 UTC

svn commit: r641249 - in /commons/proper/configuration/branches/configuration2_experimental/src: main/java/org/apache/commons/configuration2/combined/ test/java/org/apache/commons/configuration2/combined/

Author: oheger
Date: Wed Mar 26 04:01:13 2008
New Revision: 641249

URL: http://svn.apache.org/viewvc?rev=641249&view=rev
Log:
New CombinedNode class for representing the data of a combined configuration

Added:
    commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/
    commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/CombinedNode.java   (with props)
    commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/package.html   (with props)
    commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/combined/
    commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/combined/TestCombinedNode.java   (with props)

Added: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/CombinedNode.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/CombinedNode.java?rev=641249&view=auto
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/CombinedNode.java (added)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/CombinedNode.java Wed Mar 26 04:01:13 2008
@@ -0,0 +1,423 @@
+/*
+ * 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.configuration2.combined;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * A specialized node implementation to be used in combined configurations.
+ * </p>
+ * <p>
+ * Some configurations provide a logical view on the nodes of other
+ * configurations. These configurations construct their own hierarchy of nodes
+ * based on the node trees of their source configurations. This special node
+ * class can be used for this purpose. It allows child nodes and attributes to
+ * be added without changing their parent node. So a node can belong to a
+ * hierarchy of nodes of a source configuration, but be also contained in a
+ * combined configuration.
+ * </p>
+ * <p>
+ * Implementation note: This class is intended to be used internally only. So
+ * checks for the validity of passed in parameters are limited.
+ * </p>
+ *
+ * @author <a href="http://commons.apache.org/configuration/team-list.html">Commons
+ *         Configuration team</a>
+ * @version $Id$
+ * @since 2.0
+ */
+public class CombinedNode
+{
+    /** Stores the parent node. */
+    private CombinedNode parent;
+
+    /** Stores the name of this node. */
+    private String name;
+
+    /** Stores the value of this node. */
+    private Object value;
+
+    /** A list with the child nodes. */
+    private List<ChildData> children;
+
+    /** Stores the attributes of this node. */
+    private Map<String, AttributeData> attributes;
+
+    /**
+     * Creates a new, empty instance of <code>CombinedNode</code>.
+     */
+    public CombinedNode()
+    {
+        this(null, null, null);
+    }
+
+    /**
+     * Creates a new instance of <code>CombinedNode</code> and initializes it.
+     *
+     * @param parent the parent node
+     * @param name the name
+     * @param value the value
+     */
+    public CombinedNode(CombinedNode parent, String name, Object value)
+    {
+        setParent(parent);
+        setName(name);
+        setValue(value);
+        children = new ArrayList<ChildData>();
+        attributes = new LinkedHashMap<String, AttributeData>();
+    }
+
+    /**
+     * Creates a new instance of <code>CombinedNode</code> and sets the name.
+     *
+     * @param name the name
+     */
+    public CombinedNode(String name)
+    {
+        this(null, name, null);
+    }
+
+    /**
+     * Returns the parent node of this combined node.
+     *
+     * @return the parent node
+     */
+    public CombinedNode getParent()
+    {
+        return parent;
+    }
+
+    /**
+     * Sets the parent node.
+     *
+     * @param parent the new parent node
+     */
+    public void setParent(CombinedNode parent)
+    {
+        this.parent = parent;
+    }
+
+    /**
+     * Returns the name of this node.
+     *
+     * @return the name
+     */
+    public String getName()
+    {
+        return name;
+    }
+
+    /**
+     * Sets the name of this node.
+     *
+     * @param name the new name
+     */
+    public void setName(String name)
+    {
+        this.name = name;
+    }
+
+    /**
+     * Returns the value of this node.
+     *
+     * @return the value
+     */
+    public Object getValue()
+    {
+        return value;
+    }
+
+    /**
+     * Sets the value of this node.
+     *
+     * @param value the new value
+     */
+    public void setValue(Object value)
+    {
+        this.value = value;
+    }
+
+    /**
+     * Adds a new child node to this view node. The child can be an arbitrary
+     * node that may be part of the node structure of a different configuration.
+     *
+     * @param name the name of the child node
+     * @param child the new child node
+     */
+    public void addChild(String name, Object child)
+    {
+        children.add(new ChildData(name, child));
+    }
+
+    /**
+     * Removes the specified child node from this view node.
+     *
+     * @param child the child to be removed
+     */
+    public void removeChild(Object child)
+    {
+        for (int idx = 0; idx < children.size(); idx++)
+        {
+            if (children.get(idx).node.equals(child))
+            {
+                children.remove(idx);
+                return;
+            }
+        }
+    }
+
+    /**
+     * Returns the child with the given index.
+     *
+     * @param idx the index
+     * @return the child with this index
+     */
+    public Object getChild(int idx)
+    {
+        return children.get(idx).node;
+    }
+
+    /**
+     * Returns a list with all child nodes of this combined node.
+     *
+     * @return a list with all child nodes
+     */
+    public List<Object> getChildren()
+    {
+        List<Object> result = new ArrayList<Object>(children.size());
+        for (ChildData cd : children)
+        {
+            result.add(cd.node);
+        }
+        return result;
+    }
+
+    /**
+     * Returns a list with all child nodes of this combined node that have the given
+     * name.
+     *
+     * @param name the desired name
+     * @return a list with the children with this name
+     */
+    public List<Object> getChildren(String name)
+    {
+        List<Object> result = new ArrayList<Object>();
+        for (ChildData cd : children)
+        {
+            if (cd.name.equals(name))
+            {
+                result.add(cd.node);
+            }
+        }
+        return result;
+    }
+
+    /**
+     * Returns the number of children with the given name. If <b>null</b> is
+     * passed for the name, the number of all children is returned.
+     *
+     * @param name the name of the children in question
+     * @return the number of the child nodes with this name
+     */
+    public int getChildrenCount(String name)
+    {
+        if (name == null)
+        {
+            return children.size();
+        }
+
+        int count = 0;
+        for (ChildData cd : children)
+        {
+            if (cd.name.equals(name))
+            {
+                count++;
+            }
+        }
+
+        return count;
+    }
+
+    /**
+     * Sets the value of the specified attribute.
+     *
+     * @param name the name of the attribute
+     * @param value the new value
+     */
+    public void setAttribute(String name, Object value)
+    {
+        attributes.put(name, new AttributeData(value));
+    }
+
+    /**
+     * Adds another value to the specified attribute. With this method an
+     * attribute can be assigned multiple values. If the attribute does not
+     * exist, it is created.
+     *
+     * @param name the name of the attribute
+     * @param value the value to be added
+     */
+    public void addAttributeValue(String name, Object value)
+    {
+        AttributeData ad = attributes.get(name);
+        if (ad == null)
+        {
+            setAttribute(name, value);
+        }
+        else
+        {
+            ad.addValue(value);
+        }
+    }
+
+    /**
+     * Returns a list with the names of all existing attributes.
+     *
+     * @return a list with the names of the attributes
+     */
+    public List<String> getAttributes()
+    {
+        return new ArrayList<String>(attributes.keySet());
+    }
+
+    /**
+     * Returns a flag whether this node has any attributes.
+     *
+     * @return a flag whether this node has attributes
+     */
+    public boolean hasAttributes()
+    {
+        return !attributes.isEmpty();
+    }
+
+    /**
+     * Returns the value of the specified attribute. If the attribute does not
+     * exist, <b>null</b> is returned. If the attribute has multiple values,
+     * result is a collection.
+     *
+     * @param name the name of the attribute
+     * @return the value of this attribute
+     */
+    public Object getAttribute(String name)
+    {
+        AttributeData ad = attributes.get(name);
+        return (ad != null) ? ad.getValue() : null;
+    }
+
+    /**
+     * Removes the attribute with the specified name.
+     *
+     * @param name the name of the affected attribute
+     */
+    public void removeAttribute(String name)
+    {
+        attributes.remove(name);
+    }
+
+    /**
+     * A data class for storing information about a child node.
+     */
+    private static class ChildData
+    {
+        /** The node name. */
+        String name;
+
+        /** The child node. */
+        Object node;
+
+        /**
+         * Creates a new instance of <code>ChildData</code>.
+         *
+         * @param n the name
+         * @param nd the node
+         */
+        public ChildData(String n, Object nd)
+        {
+            name = n;
+            node = nd;
+        }
+    }
+
+    /**
+     * A data class for storing the value(s) of an attribute.
+     */
+    private static class AttributeData
+    {
+        /** Stores the single value of the attribute. */
+        private Object value;
+
+        /** Stores a collection of values if there are multiple. */
+        private List<Object> values;
+
+        /**
+         * Creates a new instance of <code>AttributeData</code> and sets the
+         * initial value.
+         *
+         * @param v the value (either a single value or a collection)
+         */
+        public AttributeData(Object v)
+        {
+            if (v instanceof Collection)
+            {
+                values = new ArrayList<Object>((Collection<?>) v);
+            }
+            else
+            {
+                value = v;
+            }
+        }
+
+        /**
+         * Returns the value. Depending on the number of values either a list or
+         * a single object is returned.
+         *
+         * @return the value of this attribute
+         */
+        public Object getValue()
+        {
+            return (values != null) ? values : value;
+        }
+
+        /**
+         * Adds another value to this attribute.
+         *
+         * @param v the new value
+         */
+        public void addValue(Object v)
+        {
+            if (values == null)
+            {
+                values = new ArrayList<Object>();
+                values.add(value);
+            }
+
+            if (v instanceof Collection)
+            {
+                values.addAll((Collection<?>) v);
+            }
+            else
+            {
+                values.add(v);
+            }
+        }
+    }
+}

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/CombinedNode.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/CombinedNode.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/CombinedNode.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/package.html
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/package.html?rev=641249&view=auto
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/package.html (added)
+++ commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/package.html Wed Mar 26 04:01:13 2008
@@ -0,0 +1,34 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<!--
+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.
+-->
+<html>
+<head>
+</head>
+<body>
+
+<p>
+This package contains interfaces and classes for combined configurations. A
+combined configuration is a configuration that can contain multiple child
+configurations. The data stored in these child configurations is made available
+as a logic tree of configuration nodes.
+</p>
+<p>
+<font size="-2">$Id$</font>
+</p>
+
+</body>
+</html>

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/package.html
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/package.html
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/main/java/org/apache/commons/configuration2/combined/package.html
------------------------------------------------------------------------------
    svn:mime-type = text/html

Added: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/combined/TestCombinedNode.java
URL: http://svn.apache.org/viewvc/commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/combined/TestCombinedNode.java?rev=641249&view=auto
==============================================================================
--- commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/combined/TestCombinedNode.java (added)
+++ commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/combined/TestCombinedNode.java Wed Mar 26 04:01:13 2008
@@ -0,0 +1,305 @@
+/*
+ * 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.configuration2.combined;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/**
+ * Test class or CombinedNode.
+ *
+ * @author <a
+ *         href="http://commons.apache.org/configuration/team-list.html">Commons
+ *         Configuration team</a>
+ * @version $Id$
+ */
+public class TestCombinedNode extends TestCase
+{
+    /** Constant for the name of the node. */
+    private static final String NODE_NAME = "MyViewNode";
+
+    /** Constant for the name prefix of child elements. */
+    private static final String CHILD_NAME = "child";
+
+    /** Constant for the name of an attribute. */
+    private static final String ATTR_NAME = "attribute";
+
+    /** Constant for the number of different child names. */
+    private static final int CHILD_COUNT = 3;
+
+    /** The node to be tested. */
+    private CombinedNode node;
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        node = new CombinedNode(NODE_NAME);
+    }
+
+    /**
+     * Adds a number of child nodes to the test node. This method adds one child
+     * with name child1, two children with name child2, etc. The object used as
+     * representation of the children is an integer with the running index of
+     * the children with this name.
+     */
+    private void initChildren()
+    {
+        for (int i = 1; i <= CHILD_COUNT; i++)
+        {
+            for (int j = 1; j <= i; j++)
+            {
+                node.addChild(CHILD_NAME + i, Integer.valueOf(j));
+            }
+        }
+    }
+
+    /**
+     * Returns the total number of children of the test node.
+     *
+     * @return the total number of test children
+     */
+    private static int totalChildCount()
+    {
+        return CHILD_COUNT * (CHILD_COUNT + 1) / 2; // Gauss formula
+    }
+
+    /**
+     * Tests a newly created combined node.
+     */
+    public void testInit()
+    {
+        assertEquals("Wrong node name", NODE_NAME, node.getName());
+        assertNull("A parent was set", node.getParent());
+        assertNull("A value was set", node.getValue());
+        assertTrue("Children not empty", node.getChildren().isEmpty());
+        assertTrue("Attributes not empty", node.getAttributes().isEmpty());
+        assertEquals("Wrong number of children", 0, node.getChildrenCount(null));
+        assertEquals("Wrong number of named children", 0, node
+                .getChildrenCount(CHILD_NAME));
+    }
+
+    /**
+     * Tests creating a combined node using the default constructor.
+     */
+    public void testInitDefault()
+    {
+        node = new CombinedNode();
+        assertNull("Node has a name", node.getName());
+    }
+
+    /**
+     * Tests querying the children of the combined node.
+     */
+    public void testGetChildren()
+    {
+        initChildren();
+        List<Object> children = node.getChildren();
+        assertEquals("Wrong number of child nodes", totalChildCount(), children
+                .size());
+        for (int i = 1, idx = 0; i <= CHILD_COUNT; i++)
+        {
+            for (int j = 1; j <= i; j++, idx++)
+            {
+                assertEquals("Wrong child at " + idx, Integer.valueOf(j),
+                        children.get(idx));
+            }
+        }
+    }
+
+    /**
+     * Tests accessing children based on their index.
+     */
+    public void testGetChild()
+    {
+        initChildren();
+        List<Object> children = node.getChildren();
+        int idx = 0;
+        for (Object o : children)
+        {
+            assertEquals("Wrong child at " + idx, o, node.getChild(idx++));
+        }
+    }
+
+    /**
+     * Tests querying children by their name.
+     */
+    public void testGetChildrenName()
+    {
+        initChildren();
+        for (int i = 1; i <= CHILD_COUNT; i++)
+        {
+            List<Object> children = node.getChildren(CHILD_NAME + i);
+            assertEquals("Wrong number of children", i, children.size());
+            for (int j = 0; j < i; j++)
+            {
+                assertEquals("Wrong child at " + j, Integer.valueOf(j + 1),
+                        children.get(j));
+            }
+        }
+    }
+
+    /**
+     * Tests removing a child node.
+     */
+    public void testRemoveChild()
+    {
+        initChildren();
+        Object child = Integer.valueOf(CHILD_COUNT);
+        node.removeChild(child);
+        for (Object o : node.getChildren())
+        {
+            if (child.equals(o))
+            {
+                fail("Child was not removed!");
+            }
+        }
+    }
+
+    /**
+     * Tests querying the total number of children.
+     */
+    public void testGetChildrenCount()
+    {
+        initChildren();
+        assertEquals("Wrong number of children", totalChildCount(), node
+                .getChildrenCount(null));
+    }
+
+    /**
+     * Tests querying the number of named children.
+     */
+    public void testGetChildrenCountName()
+    {
+        initChildren();
+        for (int i = 1; i <= CHILD_COUNT; i++)
+        {
+            assertEquals("Wrong number of children", i, node
+                    .getChildrenCount(CHILD_NAME + i));
+        }
+    }
+
+    /**
+     * Tests adding values for an attribute.
+     */
+    public void testAddAttributeValue()
+    {
+        node.addAttributeValue(ATTR_NAME, "test");
+        assertEquals("Wrong attribute value", "test", node
+                .getAttribute(ATTR_NAME));
+        List<String> attrs = node.getAttributes();
+        assertEquals("Wrong number of attributes", 1, attrs.size());
+        assertEquals("Wrong attribute name", ATTR_NAME, attrs.get(0));
+    }
+
+    /**
+     * Tests adding multiple values for the same attribute.
+     */
+    public void testAddAttributeValueMultiple()
+    {
+        for (int i = 0; i < CHILD_COUNT; i++)
+        {
+            node.addAttributeValue(ATTR_NAME, i);
+        }
+        List<?> values = (List<?>) node.getAttribute(ATTR_NAME);
+        assertEquals("Wrong number of values", CHILD_COUNT, values.size());
+        for (int i = 0; i < CHILD_COUNT; i++)
+        {
+            assertEquals("Wrong value at " + i, Integer.valueOf(i), values
+                    .get(i));
+        }
+    }
+
+    /**
+     * Tests setting the value of an attribute.
+     */
+    public void testSetAttributeValue()
+    {
+        node.setAttribute(ATTR_NAME, "test");
+        assertEquals("Wrong attribute value", "test", node
+                .getAttribute(ATTR_NAME));
+    }
+
+    /**
+     * Tests setting the value of an existing attribute. The old value should be
+     * removed first.
+     */
+    public void testSetAttributeValueExisting()
+    {
+        node.addAttributeValue(ATTR_NAME, "value1");
+        node.addAttributeValue(ATTR_NAME, "value2");
+        node.setAttribute(ATTR_NAME, "newValue");
+        assertEquals("Wrong attribute value", "newValue", node
+                .getAttribute(ATTR_NAME));
+    }
+
+    /**
+     * Tests adding an attribute with multiple values.
+     */
+    public void testAddAttributeValueCollection()
+    {
+        node.addAttributeValue(ATTR_NAME, Arrays.asList(new String[] {
+                "val1", "val2"
+        }));
+        node.addAttributeValue(ATTR_NAME, "val3");
+        List<?> values = (List<?>) node.getAttribute(ATTR_NAME);
+        assertEquals("Wrong number of values", 3, values.size());
+        assertEquals("Wrong value 1", "val1", values.get(0));
+        assertEquals("Wrong value 2", "val2", values.get(1));
+        assertEquals("Wrong value 3", "val3", values.get(2));
+    }
+
+    /**
+     * Tests adding a collection with values to an attribute that already has
+     * multiple values.
+     */
+    public void testAddAttributeValueCollections()
+    {
+        List<Object> val1 = new ArrayList<Object>();
+        val1.add("test1");
+        val1.add("test2");
+        List<Object> val2 = new ArrayList<Object>();
+        val2.add("testVal3");
+        val2.add("anotherTest");
+        val2.add("even more tests");
+        node.setAttribute(ATTR_NAME, val1);
+        node.addAttributeValue(ATTR_NAME, val2);
+        List<Object> expected = new ArrayList<Object>(val1);
+        expected.addAll(val2);
+        List<?> values = (List<?>) node.getAttribute(ATTR_NAME);
+        assertEquals("Wrong number of values", expected.size(), values.size());
+        for (int i = 0; i < expected.size(); i++)
+        {
+            assertEquals("Wrong value at " + i, expected.get(i), values.get(i));
+        }
+    }
+
+    /**
+     * Tests removing an attribute.
+     */
+    public void testRemoveAttribute()
+    {
+        node.setAttribute(ATTR_NAME, "test");
+        node.addAttributeValue(ATTR_NAME, "anotherTest");
+        node.removeAttribute(ATTR_NAME);
+        assertNull("Attribute still found", node.getAttribute(ATTR_NAME));
+        assertTrue("Attribute name still found", node.getAttributes().isEmpty());
+    }
+}

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/combined/TestCombinedNode.java
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/combined/TestCombinedNode.java
------------------------------------------------------------------------------
    svn:keywords = Date Author Id Revision HeadURL

Propchange: commons/proper/configuration/branches/configuration2_experimental/src/test/java/org/apache/commons/configuration2/combined/TestCombinedNode.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain