You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by oh...@apache.org on 2005/12/28 21:25:29 UTC
svn commit: r359622 - in /jakarta/commons/proper/configuration/trunk/src:
java/org/apache/commons/configuration/ test/org/apache/commons/configuration/
Author: oheger
Date: Wed Dec 28 12:25:21 2005
New Revision: 359622
URL: http://svn.apache.org/viewcvs?rev=359622&view=rev
Log:
Incorporated new ConfigurationNode classes into hierarchical configurations
Modified:
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfigurationXMLReader.java
jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfigurationXMLReader.java
Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java?rev=359622&r1=359621&r2=359622&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfiguration.java Wed Dec 28 12:25:21 2005
@@ -25,8 +25,8 @@
import java.util.Set;
import java.util.Stack;
-import org.apache.commons.collections.map.LinkedMap;
import org.apache.commons.collections.set.ListOrderedSet;
+import org.apache.commons.configuration.tree.DefaultConfigurationNode;
import org.apache.commons.lang.StringUtils;
/**
@@ -239,9 +239,16 @@
ConfigurationKey.KeyIterator it = new ConfigurationKey(key).iterator();
Node parent = fetchAddNode(it, getRoot());
- Node child = createNode(it.currentKey(true));
+ Node child = createNode(it.currentKey(false));
child.setValue(obj);
- parent.addChild(child);
+ if (it.isAttribute())
+ {
+ parent.addAttribute(child);
+ }
+ else
+ {
+ parent.addChild(child);
+ }
}
/**
@@ -323,13 +330,13 @@
Node nd = (Node) it.next();
nd.visit(visitor, null);
- List children = visitor.getClone().getChildren();
- if (children.size() > 0)
+ for (Iterator it2 = visitor.getClone().getChildren().iterator(); it2.hasNext();)
{
- for (int i = 0; i < children.size(); i++)
- {
- result.getRoot().addChild((Node) children.get(i));
- }
+ result.getRoot().addChild((Node) it2.next());
+ }
+ for (Iterator it2 = visitor.getClone().getAttributes().iterator(); it2.hasNext();)
+ {
+ result.getRoot().addAttribute((Node) it2.next());
}
}
@@ -450,6 +457,10 @@
{
((Node) it.next()).visit(visitor, key);
}
+ for (Iterator it = node.getAttributes().iterator(); it.hasNext();)
+ {
+ ((Node) it.next()).visit(visitor, key);
+ }
}
return visitor.getKeyList().iterator();
@@ -528,8 +539,8 @@
}
else
{
- String key = keyPart.nextKey(true);
- List children = node.getChildren(key);
+ String key = keyPart.nextKey(false);
+ List children = keyPart.isAttribute() ? node.getAttributes(key) : node.getChildren(key);
if (keyPart.hasIndex())
{
if (keyPart.getIndex() < children.size() && keyPart.getIndex() >= 0)
@@ -626,11 +637,11 @@
*/
protected Node findLastPathNode(ConfigurationKey.KeyIterator keyIt, Node node)
{
- String keyPart = keyIt.nextKey(true);
+ String keyPart = keyIt.nextKey(false);
if (keyIt.hasNext())
{
- List list = node.getChildren(keyPart);
+ List list = keyIt.isAttribute() ? node.getAttributes(keyPart) : node.getChildren(keyPart);
int idx = (keyIt.hasIndex()) ? keyIt.getIndex() : list.size() - 1;
if (idx < 0 || idx >= list.size())
{
@@ -661,7 +672,8 @@
{
if (keyIt.hasNext())
{
- Node child = createNode(keyIt.currentKey(true));
+ Node child = createNode(keyIt.currentKey(false));
+ child.setAttribute(keyIt.isAttribute());
root.addChild(child);
keyIt.next();
return createAddPath(keyIt, child);
@@ -688,36 +700,18 @@
/**
* A data class for storing (hierarchical) property information. A property
- * can have a value and an arbitrary number of child properties.
- *
+ * can have a value and an arbitrary number of child properties. From version 1.3 on this class
+ * is only a thin wrapper over the <code>{@link org.apache.commons.configuration.tree.DefaultConfigurationNode DefaultconfigurationNode}</code>
+ * class that exists mainly for the purpose of backwards compatibility.
*/
- public static class Node implements Serializable, Cloneable
+ public static class Node extends DefaultConfigurationNode implements Serializable
{
- /** Stores a reference to this node's parent. */
- private Node parent;
-
- /** Stores the name of this node. */
- private String name;
-
- /** Stores the value of this node. */
- private Object value;
-
- /** Stores a reference to an object this node is associated with. */
- private Object reference;
-
- /** Stores the children of this node. */
- private LinkedMap children; // Explict type here or we
-
- // will get a findbugs error
- // because Map doesn't imply
- // Serializable
-
/**
* Creates a new instance of <code>Node</code>.
*/
public Node()
{
- this(null);
+ super();
}
/**
@@ -727,7 +721,7 @@
*/
public Node(String name)
{
- setName(name);
+ super(name);
}
/**
@@ -738,58 +732,17 @@
*/
public Node(String name, Object value)
{
- setName(name);
- setValue(value);
- }
-
- /**
- * Returns the name of this node.
- *
- * @return the node name
- */
- public String getName()
- {
- return name;
- }
-
- /**
- * Returns the value of this node.
- *
- * @return the node value (may be <b>null </b>)
- */
- public Object getValue()
- {
- return value;
+ super(name, value);
}
/**
* Returns the parent of this node.
*
- * @return this node's parent (can be <b>null </b>)
+ * @return this node's parent (can be <b>null</b>)
*/
public Node getParent()
{
- return parent;
- }
-
- /**
- * Sets the name of this node.
- *
- * @param string the node name
- */
- public void setName(String string)
- {
- name = string;
- }
-
- /**
- * Sets the value of this node.
- *
- * @param object the node value
- */
- public void setValue(Object object)
- {
- value = object;
+ return (Node) getParentNode();
}
/**
@@ -799,123 +752,17 @@
*/
public void setParent(Node node)
{
- parent = node;
- }
-
- /**
- * Returns the reference object for this node.
- *
- * @return the reference object
- */
- public Object getReference()
- {
- return reference;
- }
-
- /**
- * Sets the reference object for this node. A node can be associated
- * with a reference object whose concrete meaning is determined by a sub
- * class of <code>HierarchicalConfiguration</code>. In an XML
- * configuration e.g. this reference could be an element in a
- * corresponding XML document. The reference is used by the
- * <code>BuilderVisitor</code> class when the configuration is stored.
- *
- * @param ref the reference object
- */
- public void setReference(Object ref)
- {
- reference = ref;
- }
-
- /**
- * Adds the specified child object to this node. Note that there can be
- * multiple children with the same name.
- *
- * @param child the child to be added
- */
- public void addChild(Node child)
- {
- if (children == null)
- {
- children = new LinkedMap();
- }
-
- List c = (List) children.get(child.getName());
- if (c == null)
- {
- c = new ArrayList();
- children.put(child.getName(), c);
- }
-
- c.add(child);
- child.setParent(this);
- }
-
- /**
- * Returns a list with the child nodes of this node.
- *
- * @return a list with the children (can be empty, but never <b>null
- * </b>)
- */
- public List getChildren()
- {
- List result = new ArrayList();
-
- if (children != null)
- {
- for (Iterator it = children.values().iterator(); it.hasNext();)
- {
- result.addAll((Collection) it.next());
- }
- }
-
- return result;
- }
-
- /**
- * Returns a list with this node's children with the given name.
- *
- * @param name the name of the children
- * @return a list with all chidren with this name; may be empty, but
- * never <b>null </b>
- */
- public List getChildren(String name)
- {
- if (name == null || children == null)
- {
- return getChildren();
- }
-
- List list = new ArrayList();
- List c = (List) children.get(name);
- if (c != null)
- {
- list.addAll(c);
- }
-
- return list;
+ setParentNode(node);
}
/**
* Returns a flag whether this node has child elements.
*
- * @return <b>true</b> if there a child node, <b>false</b> otherwise
+ * @return <b>true</b> if there is a child node, <b>false</b> otherwise
*/
public boolean hasChildren()
{
- if (children != null)
- {
- for (Iterator it = children.values().iterator(); it.hasNext();)
- {
- Collection nodes = (Collection) it.next();
- if (!nodes.isEmpty())
- {
- return true;
- }
- }
- }
-
- return false;
+ return getChildrenCount() > 0 || getAttributeCount() > 0;
}
/**
@@ -926,33 +773,7 @@
*/
public boolean remove(Node child)
{
- if (children == null)
- {
- return false;
- }
-
- List c = (List) children.get(child.getName());
- if (c == null)
- {
- return false;
- }
-
- else
- {
- if (c.remove(child))
- {
- child.removeReference();
- if (c.isEmpty())
- {
- children.remove(child.getName());
- }
- return true;
- }
- else
- {
- return false;
- }
- }
+ return child.isAttribute() ? removeAttribute(child) : removeChild(child);
}
/**
@@ -963,37 +784,9 @@
*/
public boolean remove(String name)
{
- if (children == null)
- {
- return false;
- }
-
- List nodes = (List) children.remove(name);
- if (nodes != null)
- {
- nodesRemoved(nodes);
- return true;
- }
- else
- {
- return false;
- }
- }
-
- /**
- * Removes all children of this node.
- */
- public void removeChildren()
- {
- if (children != null)
- {
- Iterator it = children.values().iterator();
- children = null;
- while (it.hasNext())
- {
- nodesRemoved((Collection) it.next());
- }
- }
+ boolean childrenRemoved = removeChild(name);
+ boolean attrsRemoved = removeAttribute(name);
+ return childrenRemoved || attrsRemoved;
}
/**
@@ -1015,24 +808,29 @@
length = key.length();
if (getName() != null)
{
- key.append(StringUtils.replace(getName(), String
- .valueOf(ConfigurationKey.PROPERTY_DELIMITER),
- ConfigurationKey.ESCAPED_DELIMITER));
+ key
+ .append(StringUtils
+ .replace(
+ isAttribute() ? ConfigurationKey
+ .constructAttributeKey(getName())
+ : getName(),
+ String
+ .valueOf(ConfigurationKey.PROPERTY_DELIMITER),
+ ConfigurationKey.ESCAPED_DELIMITER));
}
}
visitor.visitBeforeChildren(this, key);
- if (children != null)
+ for (Iterator it = getChildren().iterator(); it.hasNext()
+ && !visitor.terminate();)
{
- for (Iterator it = children.values().iterator(); it.hasNext() && !visitor.terminate();)
- {
- Collection col = (Collection) it.next();
- for (Iterator it2 = col.iterator(); it2.hasNext() && !visitor.terminate();)
- {
- ((Node) it2.next()).visit(visitor, key);
- }
- }
+ ((Node) it.next()).visit(visitor, key);
+ }
+ for (Iterator it = getAttributes().iterator(); it.hasNext()
+ && !visitor.terminate();)
+ {
+ ((Node) it.next()).visit(visitor, key);
}
if (key != null)
@@ -1041,52 +839,6 @@
}
visitor.visitAfterChildren(this, key);
}
-
- /**
- * Creates a copy of this object. This is not a deep copy, the children
- * are not cloned.
- *
- * @return a copy of this object
- */
- public Object clone()
- {
- try
- {
- Node copy = (Node) super.clone();
- copy.children = null;
- return copy;
- }
- catch (CloneNotSupportedException cex)
- {
- return null; // should not happen
- }
- }
-
- /**
- * Deals with the reference when a node is removed. This method is
- * called for each removed child node. It can be overloaded in sub
- * classes, for which the reference has a concrete meaning and remove
- * operations need some update actions. This default implementation is
- * empty.
- */
- protected void removeReference()
- {
- }
-
- /**
- * Helper method for calling <code>removeReference()</code> on a list
- * of removed nodes. Used by methods that can remove multiple child
- * nodes in one step.
- *
- * @param nodes collection with the nodes to be removed
- */
- private void nodesRemoved(Collection nodes)
- {
- for (Iterator it = nodes.iterator(); it.hasNext();)
- {
- ((Node) it.next()).removeReference();
- }
- }
}
/**
@@ -1310,10 +1062,18 @@
public void visitBeforeChildren(Node node, ConfigurationKey key)
{
Node copy = (Node) node.clone();
+ copy.setParentNode(null);
if (!copyStack.isEmpty())
{
- ((Node) copyStack.peek()).addChild(copy);
+ if (node.isAttribute())
+ {
+ ((Node) copyStack.peek()).addAttribute(copy);
+ }
+ else
+ {
+ ((Node) copyStack.peek()).addChild(copy);
+ }
}
copyStack.push(copy);
@@ -1356,7 +1116,9 @@
*/
public void visitBeforeChildren(Node node, ConfigurationKey key)
{
- Iterator children = node.getChildren().iterator();
+ Collection subNodes = new LinkedList(node.getChildren());
+ subNodes.addAll(node.getAttributes());
+ Iterator children = subNodes.iterator();
Node sibling1 = null;
Node nd = null;
Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfigurationXMLReader.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfigurationXMLReader.java?rev=359622&r1=359621&r2=359622&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfigurationXMLReader.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/HierarchicalConfigurationXMLReader.java Wed Dec 28 12:25:21 2005
@@ -1,5 +1,5 @@
/*
- * Copyright 2001-2004 The Apache Software Foundation.
+ * Copyright 2001-2005 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License")
* you may not use this file except in compliance with the License.
@@ -16,7 +16,7 @@
package org.apache.commons.configuration;
-import java.util.List;
+import java.util.Iterator;
import org.apache.commons.configuration.HierarchicalConfiguration.Node;
import org.xml.sax.Attributes;
@@ -165,14 +165,13 @@
protected Attributes fetchAttributes(Node node)
{
AttributesImpl attrs = new AttributesImpl();
- List children = node.getChildren();
- for (int i = 0; i < children.size(); i++)
+ for (Iterator it = node.getAttributes().iterator(); it.hasNext();)
{
- Node child = (Node) children.get(i);
- if (isAttributeNode(child) && child.getValue() != null)
+ Node child = (Node) it.next();
+ if (child.getValue() != null)
{
- String attr = ConfigurationKey.attributeName(child.getName());
+ String attr = child.getName();
attrs.addAttribute(NS_URI, attr, attr, ATTR_TYPE, child.getValue().toString());
}
}
@@ -203,7 +202,7 @@
*/
private boolean isAttributeNode(Node node)
{
- return ConfigurationKey.isAttributeKey(node.getName());
+ return node.isAttribute();
}
}
}
Modified: jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java?rev=359622&r1=359621&r2=359622&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/java/org/apache/commons/configuration/XMLConfiguration.java Wed Dec 28 12:25:21 2005
@@ -356,10 +356,10 @@
Attr attr = (Attr) w3cNode;
for (Iterator it = PropertyConverter.split(attr.getValue(), getDelimiter()).iterator(); it.hasNext();)
{
- Node child = new XMLNode(ConfigurationKey.constructAttributeKey(attr.getName()),
+ Node child = new XMLNode(attr.getName(),
elemRefs ? element : null);
child.setValue(it.next());
- node.addChild(child);
+ node.addAttribute(child);
}
}
}
@@ -636,7 +636,7 @@
if (getReference() != null && document != null)
{
- if (ConfigurationKey.isAttributeKey(getName()))
+ if (isAttribute())
{
updateAttribute();
}
@@ -655,7 +655,7 @@
if (getReference() != null)
{
Element element = (Element) getReference();
- if (ConfigurationKey.isAttributeKey(getName()))
+ if (isAttribute())
{
updateAttribute();
}
@@ -808,7 +808,7 @@
*/
protected Object insert(Node newNode, Node parent, Node sibling1, Node sibling2)
{
- if (ConfigurationKey.isAttributeKey(newNode.getName()))
+ if (newNode.isAttribute())
{
updateAttribute(parent, getElement(parent), newNode.getName());
return null;
@@ -850,7 +850,7 @@
{
if (node != null && elem != null)
{
- List attrs = node.getChildren(name);
+ List attrs = node.getAttributes(name);
StringBuffer buf = new StringBuffer();
for (Iterator it = attrs.iterator(); it.hasNext();)
{
@@ -869,13 +869,11 @@
if (buf.length() < 1)
{
- elem.removeAttribute(ConfigurationKey
- .removeAttributeMarkers(name));
+ elem.removeAttribute(name);
}
else
{
- elem.setAttribute(ConfigurationKey
- .removeAttributeMarkers(name), buf.toString());
+ elem.setAttribute(name, buf.toString());
}
}
}
Modified: jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfigurationXMLReader.java
URL: http://svn.apache.org/viewcvs/jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfigurationXMLReader.java?rev=359622&r1=359621&r2=359622&view=diff
==============================================================================
--- jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfigurationXMLReader.java (original)
+++ jakarta/commons/proper/configuration/trunk/src/test/org/apache/commons/configuration/TestHierarchicalConfigurationXMLReader.java Wed Dec 28 12:25:21 2005
@@ -34,9 +34,9 @@
public class TestHierarchicalConfigurationXMLReader extends TestCase
{
private static final String TEST_FILE = "conf/testHierarchicalXMLConfiguration.xml";
-
+
private HierarchicalConfigurationXMLReader parser;
-
+
protected void setUp() throws Exception
{
XMLConfiguration config =
@@ -50,13 +50,13 @@
{
SAXReader reader = new SAXReader(parser);
Document document = reader.read("someSysID");
-
+
Element root = document.getRootElement();
assertEquals("config", root.getName());
assertEquals(1, root.elements().size());
Iterator itRoot = root.elementIterator();
Element elemTabs = (Element) itRoot.next();
-
+
assertEquals(2, elemTabs.elements().size());
List tables = elemTabs.elements();
Element tabUsr = (Element) tables.get(0);
@@ -67,7 +67,7 @@
Element elemFields = tabUsr.element("fields");
assertNotNull(elemFields);
assertEquals(5, elemFields.elements().size());
-
+
List attribs = tabUsr.attributes();
assertEquals(1, attribs.size());
Attribute attr = (Attribute) attribs.get(0);
---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org