oheger 2004/12/23 10:41:04
Modified: configuration/src/java/org/apache/commons/configuration
HierarchicalXMLConfiguration.java
Log:
Deprecated HierarchicalXMLConfiguration
Revision Changes Path
1.9 +6 -747
jakarta-commons/configuration/src/java/org/apache/commons/configuration/HierarchicalXMLConfiguration.java
Index: HierarchicalXMLConfiguration.java
===================================================================
RCS file:
/home/cvs/jakarta-commons/configuration/src/java/org/apache/commons/configuration/HierarchicalXMLConfiguration.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- HierarchicalXMLConfiguration.java 18 Dec 2004 16:33:03 -0000 1.8
+++ HierarchicalXMLConfiguration.java 23 Dec 2004 18:41:04 -0000 1.9
@@ -16,40 +16,6 @@
package org.apache.commons.configuration;
-import java.io.File;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
-import javax.xml.transform.OutputKeys;
-import javax.xml.transform.Result;
-import javax.xml.transform.Source;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.dom.DOMSource;
-import javax.xml.transform.stream.StreamResult;
-
-import org.w3c.dom.Attr;
-import org.w3c.dom.CDATASection;
-import org.w3c.dom.DOMException;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
-import org.xml.sax.InputSource;
-import org.apache.commons.configuration.reloading.ReloadingStrategy;
-
/**
* A specialized hierarchical configuration class that is able to parse XML
* documents.
@@ -61,719 +27,12 @@
* @since commons-configuration 1.0
*
* @author Jörg Schaible
- * @author <a href="mailto:[EMAIL PROTECTED]">Oliver Heger </a>
+ * @author Oliver Heger
* @version $Revision$, $Date$
+ * @deprecated This class is deprecated. Use <code>XMLConfiguration</code>
+ * instead, which supports all features this class had offered before.
*/
-public class HierarchicalXMLConfiguration extends HierarchicalConfiguration
implements FileConfiguration
+public class HierarchicalXMLConfiguration extends XMLConfiguration
{
- /** Constant for the default root element name. */
- private static final String DEFAULT_ROOT_NAME = "configuration";
-
- /** Delimiter character for attributes. */
- private static char ATTR_DELIMITER = ',';
-
- private FileConfigurationDelegate delegate = new
FileConfigurationDelegate();
-
- /** The document from this configuration's data source. */
- private Document document;
-
- /** Stores the name of the root element. */
- private String rootElementName;
-
- /**
- * Creates a new instance of <code>HierarchicalXMLConfiguration</code>.
- */
- public HierarchicalXMLConfiguration()
- {
- super();
- }
-
- /**
- * Creates a new instance of <code>HierarchicalXMLConfiguration</code>.
- * The configuration is loaded from the specified file
- *
- * @param fileName the name of the file to load
- * @throws ConfigurationException if the file cannot be loaded
- */
- public HierarchicalXMLConfiguration(String fileName) throws
ConfigurationException
- {
- this();
- setFileName(fileName);
- load();
- }
-
- /**
- * Creates a new instance of <code>HierarchicalXMLConfiguration</code>.
- * The configuration is loaded from the specified file.
- *
- * @param file the file
- * @throws ConfigurationException if an error occurs while loading the
file
- */
- public HierarchicalXMLConfiguration(File file) throws
ConfigurationException
- {
- this();
- setFile(file);
- if (file.exists())
- {
- load();
- }
- }
-
- /**
- * Creates a new instance of <code>HierarchicalXMLConfiguration</code>.
- * The configuration is loaded from the specified URL.
- *
- * @param url the URL
- * @throws ConfigurationException if loading causes an error
- */
- public HierarchicalXMLConfiguration(URL url) throws
ConfigurationException
- {
- this();
- setURL(url);
- load();
- }
-
- /**
- * Returns the name of the root element.
- *
- * @return the name of the root element
- */
- public String getRootElementName()
- {
- return (rootElementName == null) ? DEFAULT_ROOT_NAME :
rootElementName;
- }
-
- /**
- * Sets the name of the root element. This name is used when this
- * configuration object is stored in an XML file. Note that setting the
name
- * of the root element works only if this configuration has been newly
- * created. If the configuration was loaded from an XML file, the name
- * cannot be changed.
- *
- * @param name the name of the root element
- */
- public void setRootElementName(String name)
- {
- rootElementName = name;
- }
-
- /**
- * @inheritDoc
- */
- protected void addPropertyDirect(String key, Object obj)
- {
- super.addPropertyDirect(key, obj);
- delegate.possiblySave();
- }
-
- /**
- * @inheritDoc
- */
- public void clearProperty(String key)
- {
- super.clearProperty(key);
- delegate.possiblySave();
- }
-
- /**
- * @inheritDoc
- */
- public void setProperty(String key, Object value)
- {
- super.setProperty(key, value);
- delegate.possiblySave();
- }
-
- /**
- * Initializes this configuration from an XML document.
- *
- * @param document the document to be parsed
- */
- public void initProperties(Document document)
- {
- constructHierarchy(getRoot(), document.getDocumentElement());
- }
-
- /**
- * Helper method for building the internal storage hierarchy. The XML
- * elements are transformed into node objects.
- *
- * @param node the actual node
- * @param element the actual XML element
- */
- private void constructHierarchy(Node node, Element element)
- {
- processAttributes(node, element);
- StringBuffer buffer = new StringBuffer();
- NodeList list = element.getChildNodes();
- for (int i = 0; i < list.getLength(); i++)
- {
- org.w3c.dom.Node w3cNode = list.item(i);
- if (w3cNode instanceof Element)
- {
- Element child = (Element) w3cNode;
- Node childNode = new XMLNode(child.getTagName(), child);
- constructHierarchy(childNode, child);
- node.addChild(childNode);
- }
- else if (w3cNode instanceof Text)
- {
- Text data = (Text) w3cNode;
- buffer.append(data.getData());
- }
- }
- String text = buffer.toString().trim();
- if (text.length() > 0)
- {
- node.setValue(text);
- }
- }
-
- /**
- * Helper method for constructing node objects for the attributes of the
- * given XML element.
- *
- * @param node the actual node
- * @param element the actual XML element
- */
- private void processAttributes(Node node, Element element)
- {
- NamedNodeMap attributes = element.getAttributes();
- for (int i = 0; i < attributes.getLength(); ++i)
- {
- org.w3c.dom.Node w3cNode = attributes.item(i);
- if (w3cNode instanceof Attr)
- {
- Attr attr = (Attr) w3cNode;
- for (Iterator it = PropertyConverter.split(attr.getValue(),
ATTR_DELIMITER).iterator(); it.hasNext();)
- {
- Node child = new
XMLNode(ConfigurationKey.constructAttributeKey(attr.getName()), element);
- child.setValue(it.next());
- node.addChild(child);
- }
- }
- }
- }
-
- /**
- * Creates a DOM document from the internal tree of configuration nodes.
- *
- * @return the new document
- * @throws ConfigurationException if an error occurs
- */
- protected Document createDocument() throws ConfigurationException
- {
- try
- {
- if (document == null)
- {
- DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
- document = builder.newDocument();
- Element rootElem =
document.createElement(getRootElementName());
- document.appendChild(rootElem);
- }
-
- XMLBuilderVisitor builder = new XMLBuilderVisitor(document);
- builder.processDocument(getRoot());
- return document;
- } /* try */
- catch (DOMException domEx)
- {
- throw new ConfigurationException(domEx);
- }
- catch (ParserConfigurationException pex)
- {
- throw new ConfigurationException(pex);
- }
- }
-
- /**
- * Creates a new node object. This implementation returns an instance of
the
- * <code>XMLNode</code> class.
- *
- * @param name the node's name
- * @return the new node
- */
- protected Node createNode(String name)
- {
- return new XMLNode(name, null);
- }
-
- public void load() throws ConfigurationException
- {
- delegate.load();
- }
-
- public void load(String fileName) throws ConfigurationException
- {
- delegate.load(fileName);
- }
-
- public void load(File file) throws ConfigurationException
- {
- delegate.load(file);
- }
-
- public void load(URL url) throws ConfigurationException
- {
- delegate.load(url);
- }
-
- public void load(InputStream in) throws ConfigurationException
- {
- delegate.load(in);
- }
-
- public void load(InputStream in, String encoding) throws
ConfigurationException
- {
- delegate.load(in, encoding);
- }
-
- public void load(Reader in) throws ConfigurationException
- {
- try
- {
- DocumentBuilder builder =
DocumentBuilderFactory.newInstance().newDocumentBuilder();
- Document newDocument = builder.parse(new InputSource(in));
- document = null;
- initProperties(newDocument);
- document = newDocument;
- }
- catch (Exception e)
- {
- throw new ConfigurationException(e.getMessage(), e);
- }
- }
-
- public void save() throws ConfigurationException
- {
- delegate.save();
- }
-
- public void save(String fileName) throws ConfigurationException
- {
- delegate.save(fileName);
- }
-
- public void save(File file) throws ConfigurationException
- {
- delegate.save(file);
- }
-
- public void save(URL url) throws ConfigurationException
- {
- delegate.save(url);
- }
-
- public void save(OutputStream out) throws ConfigurationException
- {
- delegate.save(out);
- }
-
- public void save(OutputStream out, String encoding) throws
ConfigurationException
- {
- delegate.save(out, encoding);
- }
-
- /**
- * Saves the configuration to the specified writer.
- *
- * @param writer the writer used to save the configuration
- * @throws ConfigurationException if an error occurs
- */
- public void save(Writer writer) throws ConfigurationException
- {
- try
- {
- Transformer transformer =
TransformerFactory.newInstance().newTransformer();
- Source source = new DOMSource(createDocument());
- Result result = new StreamResult(writer);
-
- transformer.setOutputProperty(OutputKeys.INDENT, "yes");
- transformer.transform(source, result);
- }
- catch (TransformerException e)
- {
- throw new ConfigurationException(e.getMessage(), e);
- }
- }
-
- public String getFileName()
- {
- return delegate.getFileName();
- }
-
- public void setFileName(String fileName)
- {
- delegate.setFileName(fileName);
- }
-
- public String getBasePath()
- {
- return delegate.getBasePath();
- }
-
- public void setBasePath(String basePath)
- {
- delegate.setBasePath(basePath);
- }
-
- public File getFile()
- {
- return delegate.getFile();
- }
-
- public void setFile(File file)
- {
- delegate.setFile(file);
- }
-
- public URL getURL()
- {
- return delegate.getURL();
- }
-
- public void setURL(URL url)
- {
- delegate.setURL(url);
- }
-
- public void setAutoSave(boolean autoSave)
- {
- delegate.setAutoSave(autoSave);
- }
-
- public boolean isAutoSave()
- {
- return delegate.isAutoSave();
- }
-
- public ReloadingStrategy getReloadingStrategy()
- {
- return delegate.getReloadingStrategy();
- }
-
- public void setReloadingStrategy(ReloadingStrategy strategy)
- {
- delegate.setReloadingStrategy(strategy);
- }
-
- public void reload()
- {
- delegate.reload();
- }
-
- /**
- * A specialized <code>Node</code> class that is connected with an XML
- * element. Changes on a node are also performed on the associated
element.
- */
- class XMLNode extends Node
- {
- /**
- * Creates a new instance of <code>XMLNode</code> and initializes it
- * with the corresponding XML element.
- *
- * @param elem the XML element
- */
- public XMLNode(Element elem)
- {
- super();
- setReference(elem);
- }
-
- /**
- * Creates a new instance of <code>XMLNode</code> and initializes it
- * with a name and the corresponding XML element.
- *
- * @param name the node's name
- * @param elem the XML element
- */
- public XMLNode(String name, Element elem)
- {
- super(name);
- setReference(elem);
- }
-
- /**
- * Sets the value of this node. If this node is associated with an
XML
- * element, this element will be updated, too.
- *
- * @param value the node's new value
- */
- public void setValue(Object value)
- {
- super.setValue(value);
-
- if (getReference() != null && document != null)
- {
- if (ConfigurationKey.isAttributeKey(getName()))
- {
- updateAttribute();
- }
- else
- {
- updateElement(value);
- }
- }
- }
-
- /**
- * Updates the associated XML elements when a node is removed.
- */
- protected void removeReference()
- {
- if (getReference() != null)
- {
- Element element = (Element) getReference();
- if (ConfigurationKey.isAttributeKey(getName()))
- {
- updateAttribute();
- }
- else
- {
- org.w3c.dom.Node parentElem = element.getParentNode();
- if (parentElem != null)
- {
- parentElem.removeChild(element);
- }
- }
- }
- }
-
- /**
- * Updates the node's value if it represents an element node.
- *
- * @param value the new value
- */
- private void updateElement(Object value)
- {
- Text txtNode = findTextNodeForUpdate();
- if (value == null)
- {
- // remove text
- if (txtNode != null)
- {
- ((Element) getReference()).removeChild(txtNode);
- }
- }
- else
- {
- if (txtNode == null)
- {
- txtNode = document.createTextNode(value.toString());
- if (((Element) getReference()).getFirstChild() != null)
- {
- ((Element) getReference()).insertBefore(txtNode,
((Element) getReference()).getFirstChild());
- }
- else
- {
- ((Element) getReference()).appendChild(txtNode);
- }
- }
- else
- {
- txtNode.setNodeValue(value.toString());
- }
- }
- }
-
- /**
- * Updates the node's value if it represents an attribute.
- *
- */
- private void updateAttribute()
- {
- XMLBuilderVisitor.updateAttribute(getParent(), getName());
- }
-
- /**
- * Returns the only text node of this element for update. This
method is
- * called when the element's text changes. Then all text nodes except
- * for the first are removed. A reference to the first is returned or
- * <b>null </b> if there is no text node at all.
- *
- * @return the first and only text node
- */
- private Text findTextNodeForUpdate()
- {
- Text result = null;
- Element elem = (Element) getReference();
- // Find all Text nodes
- NodeList children = elem.getChildNodes();
- Collection textNodes = new ArrayList();
- for (int i = 0; i < children.getLength(); i++)
- {
- org.w3c.dom.Node nd = children.item(i);
- if (nd instanceof Text)
- {
- if (result == null)
- {
- result = (Text) nd;
- }
- else
- {
- textNodes.add(nd);
- }
- }
- }
-
- // We don't want CDATAs
- if (result instanceof CDATASection)
- {
- textNodes.add(result);
- result = null;
- }
-
- // Remove all but the first Text node
- for (Iterator it = textNodes.iterator(); it.hasNext();)
- {
- elem.removeChild((org.w3c.dom.Node) it.next());
- }
- return result;
- }
- }
-
- /**
- * A concrete <code>BuilderVisitor</code> that can construct XML
- * documents.
- */
- static class XMLBuilderVisitor extends BuilderVisitor
- {
- /** Stores the document to be constructed. */
- private Document document;
-
- /**
- * Creates a new instance of <code>XMLBuilderVisitor</code>
- *
- * @param doc the document to be created
- */
- public XMLBuilderVisitor(Document doc)
- {
- document = doc;
- }
-
- /**
- * Processes the node hierarchy and adds new nodes to the document.
- *
- * @param rootNode the root node
- */
- public void processDocument(Node rootNode)
- {
- rootNode.visit(this, null);
- }
-
- /**
- * @inheritDoc
- */
- protected Object insert(Node newNode, Node parent, Node sibling1,
Node sibling2)
- {
- if (ConfigurationKey.isAttributeKey(newNode.getName()))
- {
- updateAttribute(parent, getElement(parent),
newNode.getName());
- return null;
- }
-
- else
- {
- Element elem = document.createElement(newNode.getName());
- if (newNode.getValue() != null)
- {
-
elem.appendChild(document.createTextNode(newNode.getValue().toString()));
- }
- if (sibling2 == null)
- {
- getElement(parent).appendChild(elem);
- }
- else if (sibling1 != null)
- {
- getElement(parent).insertBefore(elem,
getElement(sibling1).getNextSibling());
- }
- else
- {
- getElement(parent).insertBefore(elem,
getElement(parent).getFirstChild());
- }
- return elem;
- }
- }
-
- /**
- * Helper method for updating the value of the specified node's
- * attribute with the given name.
- *
- * @param node the affected node
- * @param elem the element that is associated with this node
- * @param name the name of the affected attribute
- */
- private static void updateAttribute(Node node, Element elem, String
name)
- {
- if (node != null && elem != null)
- {
- List attrs = node.getChildren(name);
- StringBuffer buf = new StringBuffer();
- for (Iterator it = attrs.iterator(); it.hasNext();)
- {
- Node attr = (Node) it.next();
- if (attr.getValue() != null)
- {
- if (buf.length() > 0)
- {
- buf.append(ATTR_DELIMITER);
- }
- buf.append(attr.getValue());
- }
- attr.setReference(elem);
- }
-
- if (buf.length() < 1)
- {
-
elem.removeAttribute(ConfigurationKey.removeAttributeMarkers(name));
- }
- else
- {
-
elem.setAttribute(ConfigurationKey.removeAttributeMarkers(name),
buf.toString());
- }
- }
- }
-
- /**
- * Updates the value of the specified attribute of the given node.
- * Because there can be multiple child nodes representing this
attribute
- * the new value is determined by iterating over all those child
nodes.
- *
- * @param node the affected node
- * @param name the name of the attribute
- */
- static void updateAttribute(Node node, String name)
- {
- if (node != null)
- {
- updateAttribute(node, (Element) node.getReference(), name);
- }
- }
-
- /**
- * Helper method for accessing the element of the specified node.
- *
- * @param node the node
- * @return the element of this node
- */
- private Element getElement(Node node)
- {
- // special treatement for root node of the hierarchy
- return (node.getName() != null) ? (Element) node.getReference()
: document.getDocumentElement();
- }
- }
-
- private class FileConfigurationDelegate extends AbstractFileConfiguration
- {
- public void load(Reader in) throws ConfigurationException
- {
- HierarchicalXMLConfiguration.this.load(in);
- }
- public void save(Writer out) throws ConfigurationException
- {
- HierarchicalXMLConfiguration.this.save(out);
- }
- }
-}
\ No newline at end of file
+}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]