001: package net.myvietnam.mvncore.configuration;
002:
003: /* ====================================================================
004: * The Apache Software License, Version 1.1
005: *
006: * Copyright (c) 2002-2003 The Apache Software Foundation. All rights
007: * reserved.
008: *
009: * Redistribution and use in source and binary forms, with or without
010: * modification, are permitted provided that the following conditions
011: * are met:
012: *
013: * 1. Redistributions of source code must retain the above copyright
014: * notice, this list of conditions and the following disclaimer.
015: *
016: * 2. Redistributions in binary form must reproduce the above copyright
017: * notice, this list of conditions and the following disclaimer in
018: * the documentation and/or other materials provided with the
019: * distribution.
020: *
021: * 3. The end-user documentation included with the redistribution, if
022: * any, must include the following acknowledgement:
023: * "This product includes software developed by the
024: * Apache Software Foundation (http://www.apache.org/)."
025: * Alternately, this acknowledgement may appear in the software itself,
026: * if and wherever such third-party acknowledgements normally appear.
027: *
028: * 4. The names "The Jakarta Project", "Commons", and "Apache Software
029: * Foundation" must not be used to endorse or promote products derived
030: * from this software without prior written permission. For written
031: * permission, please contact apache@apache.org.
032: *
033: * 5. Products derived from this software may not be called "Apache"
034: * nor may "Apache" appear in their names without prior written
035: * permission of the Apache Software Foundation.
036: *
037: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
038: * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
039: * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
040: * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
041: * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
042: * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
043: * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
044: * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
045: * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
046: * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
047: * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
048: * SUCH DAMAGE.
049: * ====================================================================
050: *
051: * This software consists of voluntary contributions made by many
052: * individuals on behalf of the Apache Software Foundation. For more
053: * information on the Apache Software Foundation, please see
054: * <http://www.apache.org/>.
055: */
056:
057: import java.net.URL;
058: import java.util.Iterator;
059:
060: import org.dom4j.Attribute;
061: import org.dom4j.Document;
062: import org.dom4j.Element;
063: import org.dom4j.io.SAXReader;
064:
065: /**
066: * <p>A specialized hierarchical configuration class that is able to parse
067: * XML documents using DOM4J.</p>
068: * <p>The parsed document will be stored keeping its structure. The
069: * contained properties can be accessed using all methods supported by
070: * the base class <code>HierarchicalProperties</code>.
071: *
072: * @author <a href="mailto:oliver.heger@t-online.de">Oliver Heger</a>
073: * @version $Id: HierarchicalDOM4JConfiguration.java,v 1.1 2003/12/09 08:25:30 huumai Exp $
074: */
075: public class HierarchicalDOM4JConfiguration extends
076: HierarchicalConfiguration implements BasePathLoader {
077: /** Stores the file name of the document to be parsed.*/
078: private String file;
079:
080: /** Stores the base path of this configuration.*/
081: private String basePath;
082:
083: /**
084: * Creates a new instance of <code>HierarchicalDOM4JConfiguration</code>.
085: */
086: public HierarchicalDOM4JConfiguration() {
087: super ();
088: }
089:
090: /**
091: * Creates a new instance of <code>HierarchicalDOM4JConfiguration</code>
092: * and sets the default properties.
093: * @param defaults the default properties
094: */
095: public HierarchicalDOM4JConfiguration(Configuration defaults) {
096: super (defaults);
097: }
098:
099: /**
100: * Returns the name of the file to be parsed by this object.
101: * @return the file to be parsed
102: */
103: public String getFileName() {
104: return file;
105: }
106:
107: /**
108: * Sets the name of the file to be parsed by this object.
109: * @param file the file to be parsed
110: */
111: public void setFileName(String file) {
112: this .file = file;
113: }
114:
115: /**
116: * Returns the base path.
117: * @return the base path
118: */
119: public String getBasePath() {
120: return basePath;
121: }
122:
123: /**
124: * Allows to set a base path. Relative file names are resolved based on
125: * this path.
126: * @param path the base path; this can be a URL or a file path
127: */
128: public void setBasePath(String path) {
129: basePath = path;
130: }
131:
132: /**
133: * Loads and parses an XML document. The file to be loaded must have
134: * been specified before.
135: * @throws Exception if an error occurs
136: */
137: public void load() throws Exception {
138: load(ConfigurationUtils.getURL(getBasePath(), getFileName()));
139: }
140:
141: /**
142: * Loads and parses the specified XML document.
143: * @param url the URL to the XML document
144: * @throws Exception if an error occurs
145: */
146: public void load(URL url) throws Exception {
147: initProperties(new SAXReader().read(url));
148: }
149:
150: /**
151: * Initializes this configuration from an XML document.
152: * @param document the document to be parsed
153: */
154: public void initProperties(Document document) {
155: constructHierarchy(getRoot(), document.getRootElement());
156: }
157:
158: /**
159: * Helper method for building the internal storage hierarchy. The XML
160: * elements are transformed into node objects.
161: * @param node the actual node
162: * @param element the actual XML element
163: */
164: private void constructHierarchy(Node node, Element element) {
165: if (element.getTextTrim().length() > 0) {
166: node.setValue(element.getTextTrim());
167: } /* if */
168: processAttributes(node, element);
169:
170: for (Iterator it = element.elementIterator(); it.hasNext();) {
171: Element child = (Element) it.next();
172: Node childNode = new Node(child.getName());
173: constructHierarchy(childNode, child);
174: node.addChild(childNode);
175: } /* for */
176: }
177:
178: /**
179: * Helper method for constructing node objects for the attributes of the
180: * given XML element.
181: * @param node the actual node
182: * @param element the actual XML element
183: */
184: private void processAttributes(Node node, Element element) {
185: for (Iterator it = element.attributeIterator(); it.hasNext();) {
186: Attribute attr = (Attribute) it.next();
187: Node child = new Node(ConfigurationKey
188: .constructAttributeKey(attr.getName()));
189: child.setValue(attr.getValue());
190: node.addChild(child);
191: } /* for */
192: }
193: }
|