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