epugh 2004/08/14 04:32:06 Modified: configuration/src/java/org/apache/commons/configuration XMLConfiguration.java Log: Simian cut n paste fix Revision Changes Path 1.10 +223 -326 jakarta-commons/configuration/src/java/org/apache/commons/configuration/XMLConfiguration.java Index: XMLConfiguration.java =================================================================== RCS file: /home/cvs/jakarta-commons/configuration/src/java/org/apache/commons/configuration/XMLConfiguration.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- XMLConfiguration.java 14 Aug 2004 11:21:26 -0000 1.9 +++ XMLConfiguration.java 14 Aug 2004 11:32:06 -0000 1.10 @@ -54,31 +54,31 @@ /** * Reads a XML configuration file. - * + * * To retrieve the value of an attribute of an element, use - * <code>[EMAIL PROTECTED]</code>. The '@' symbol was chosen for - * consistency with XPath. - * - * Setting property values will <b>NOT</b> automatically persist - * changes to disk, unless <code>autoSave=true</code>. - * + * <code>[EMAIL PROTECTED]</code>. The '@' symbol was chosen for consistency + * with XPath. + * + * Setting property values will <b>NOT </b> automatically persist changes to + * disk, unless <code>autoSave=true</code>. + * * @since commons-configuration 1.0 - * + * * @author Jörg Schaible - * @author <a href="mailto:[EMAIL PROTECTED]">Kelvin Tan</a> - * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Rall</a> + * @author <a href="mailto:[EMAIL PROTECTED]">Kelvin Tan </a> + * @author <a href="mailto:[EMAIL PROTECTED]">Daniel Rall </a> * @author Emmanuel Bourg * @version $Revision$, $Date$ */ -public class XMLConfiguration extends BasePathConfiguration -{ +public class XMLConfiguration extends BasePathConfiguration { // For conformance with xpath private static final String ATTRIBUTE_START = "[@"; + private static final String ATTRIBUTE_END = "]"; /** - * For consistency with properties files. Access nodes via an - * "A.B.C" notation. + * For consistency with properties files. Access nodes via an "A.B.C" + * notation. */ private static final String NODE_DELIMITER = "."; @@ -98,19 +98,15 @@ private boolean autoSave = false; /** - * Empty construtor. You must provide a file/fileName - * to save the configuration. + * Empty construtor. You must provide a file/fileName to save the + * configuration. */ - public XMLConfiguration() - { + public XMLConfiguration() { // build an empty document. DocumentBuilder builder = null; - try - { + try { builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - } - catch (ParserConfigurationException e) - { + } catch (ParserConfigurationException e) { throw new ConfigurationRuntimeException(e.getMessage(), e); } @@ -119,66 +115,55 @@ } /** - * Attempts to load the XML file as a resource from the - * classpath. The XML file must be located somewhere in the - * classpath. - * - * @param resource Name of the resource - * @throws ConfigurationException If error reading data source. + * Attempts to load the XML file as a resource from the classpath. The XML + * file must be located somewhere in the classpath. + * + * @param resource + * Name of the resource + * @throws ConfigurationException + * If error reading data source. */ - public XMLConfiguration(String resource) throws ConfigurationException - { + public XMLConfiguration(String resource) throws ConfigurationException { setFile(resourceURLToFile(resource)); load(); } /** * Attempts to load the XML file. - * - * @param file File object representing the XML file. - * @throws ConfigurationException If error reading data source. + * + * @param file + * File object representing the XML file. + * @throws ConfigurationException + * If error reading data source. */ - public XMLConfiguration(File file) throws ConfigurationException - { + public XMLConfiguration(File file) throws ConfigurationException { setFile(file); load(); } - public void load() throws ConfigurationException - { + public void load() throws ConfigurationException { File file = null; - try - { + try { URL url = ConfigurationUtils.getURL(getBasePath(), getFileName()); file = new File(url.getFile()); DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); document = builder.parse(file); - } - catch (IOException de) - { + } catch (IOException de) { throw new ConfigurationException("Could not load from " + file.getAbsolutePath(), de); - } - catch (ParserConfigurationException ex) - { + } catch (ParserConfigurationException ex) { throw new ConfigurationException("Could not configure parser", ex); - } - catch (FactoryConfigurationError ex) - { + } catch (FactoryConfigurationError ex) { throw new ConfigurationException("Could not create parser", ex); - } - catch (SAXException ex) - { + } catch (SAXException ex) { throw new ConfigurationException("Error parsing file " + file.getAbsolutePath(), ex); - } + } initProperties(document.getDocumentElement(), new StringBuffer()); } - private static File resourceURLToFile(String resource) - { + private static File resourceURLToFile(String resource) { URL confURL = XMLConfiguration.class.getClassLoader().getResource(resource); - if (confURL == null) - { + if (confURL == null) { confURL = ClassLoader.getSystemResource(resource); } return new File(confURL.getFile()); @@ -186,54 +171,49 @@ /** * Loads and initializes from the XML file. - * - * @param element The element to start processing from. Callers - * should supply the root element of the document. + * + * @param element + * The element to start processing from. Callers should supply + * the root element of the document. * @param hierarchy */ - private void initProperties(Element element, StringBuffer hierarchy) - { + private void initProperties(Element element, StringBuffer hierarchy) { StringBuffer buffer = new StringBuffer(); NodeList list = element.getChildNodes(); - for (int i = 0; i < list.getLength(); i++) - { + for (int i = 0; i < list.getLength(); i++) { Node node = list.item(i); - if (node instanceof Element) - { + if (node instanceof Element) { Element child = (Element) node; StringBuffer subhierarchy = new StringBuffer(hierarchy.toString()); subhierarchy.append(child.getTagName()); processAttributes(subhierarchy.toString(), child); initProperties(child, subhierarchy.append(NODE_DELIMITER)); - } - else if (node instanceof CDATASection || node instanceof Text) - { - CharacterData data = (CharacterData)node; + } else if (node instanceof CDATASection || node instanceof Text) { + CharacterData data = (CharacterData) node; buffer.append(data.getData()); } } String text = buffer.toString().trim(); - if (text.length() > 0 && hierarchy.length() > 0) - { + if (text.length() > 0 && hierarchy.length() > 0) { super.addProperty(hierarchy.substring(0, hierarchy.length() - 1), text); } } /** - * Helper method for constructing properties for the attributes of the - * given XML element. - * - * @param hierarchy the actual hierarchy - * @param element the actual XML element + * Helper method for constructing properties for the attributes of the given + * XML element. + * + * @param hierarchy + * the actual hierarchy + * @param element + * the actual XML element */ - private void processAttributes(String hierarchy, Element element) - { + private void processAttributes(String hierarchy, Element element) { // Add attributes as x.y{ATTRIBUTE_START}att{ATTRIBUTE_END} NamedNodeMap attributes = element.getAttributes(); - for (int i = 0; i < attributes.getLength(); ++i) - { + for (int i = 0; i < attributes.getLength(); ++i) { Attr attr = (Attr) attributes.item(i); String attrName = hierarchy + ATTRIBUTE_START + attr.getName() + ATTRIBUTE_END; super.addProperty(attrName, attr.getValue()); @@ -241,21 +221,19 @@ } /** - * Calls super method, and also ensures the underlying [EMAIL PROTECTED] - * Document} is modified so changes are persisted when saved. - * + * Calls super method, and also ensures the underlying [EMAIL PROTECTED] is + * modified so changes are persisted when saved. + * * @param name * @param value */ - public void addProperty(String name, Object value) - { + public void addProperty(String name, Object value) { super.addProperty(name, value); addXmlProperty(name, value); possiblySave(); } - public Object getXmlProperty(String name) - { + public Object getXmlProperty(String name) { // parse the key String[] nodes = parseElementNames(name); String attName = parseAttributeName(name); @@ -264,34 +242,29 @@ ArrayList children = findElementsForPropertyNodes(nodes); ArrayList properties = new ArrayList(); - if (attName == null) - { + if (attName == null) { // return text contents of elements Iterator cIter = children.iterator(); - while (cIter.hasNext()) - { - Element child = (Element)cIter.next(); + while (cIter.hasNext()) { + Element child = (Element) cIter.next(); // add non-empty strings String text = getChildText(child); if (StringUtils.isNotEmpty(text)) { properties.add(text); } } - } - else - { + } else { // return text contents of attributes Iterator cIter = children.iterator(); - while (cIter.hasNext()) - { - Element child = (Element)cIter.next(); + while (cIter.hasNext()) { + Element child = (Element) cIter.next(); if (child.hasAttribute(attName)) { properties.add(child.getAttribute(attName)); } } } - - switch(properties.size()) { + + switch (properties.size()) { case 0: return null; case 1: @@ -303,35 +276,30 @@ /** * TODO Add comment. - * + * * @param nodes * @return */ private ArrayList findElementsForPropertyNodes(String[] nodes) { ArrayList children = new ArrayList(); ArrayList elements = new ArrayList(); - + children.add(document.getDocumentElement()); - for (int i = 0; i < nodes.length; i++) - { + for (int i = 0; i < nodes.length; i++) { elements.clear(); elements.addAll(children); children.clear(); - + String eName = nodes[i]; Iterator eIter = elements.iterator(); - while(eIter.hasNext()) - { - Element element = (Element)eIter.next(); + while (eIter.hasNext()) { + Element element = (Element) eIter.next(); NodeList list = element.getChildNodes(); - for (int j = 0; j < list.getLength(); j++) - { + for (int j = 0; j < list.getLength(); j++) { Node node = list.item(j); - if (node instanceof Element) - { + if (node instanceof Element) { Element child = (Element) node; - if (eName.equals(child.getTagName())) - { + if (eName.equals(child.getTagName())) { children.add(child); } } @@ -355,8 +323,7 @@ short type = child.getNodeType(); if (type == Node.TEXT_NODE) { str.append(child.getNodeValue()); - } - else if (type == Node.CDATA_SECTION_NODE) { + } else if (type == Node.CDATA_SECTION_NODE) { str.append(child.getNodeValue()); } child = child.getNextSibling(); @@ -367,84 +334,79 @@ } // getChildText(Node):String - /** - * Calls super method, and also ensures the underlying [EMAIL PROTECTED] - * Document} is modified so changes are persisted when saved. - * + * Calls super method, and also ensures the underlying [EMAIL PROTECTED] is + * modified so changes are persisted when saved. + * * @param name * @param value */ - public void setProperty(String name, Object value) - { + public void setProperty(String name, Object value) { super.setProperty(name, value); setXmlProperty(name, value); possiblySave(); } /** - * Sets the property value in our document tree, auto-saving if - * appropriate. - * - * @param name The name of the element to set a value for. - * @param value The value to set. + * Sets the property value in our document tree, auto-saving if appropriate. + * + * @param name + * The name of the element to set a value for. + * @param value + * The value to set. */ - private void setXmlProperty(String name, Object value) - { + private void setXmlProperty(String name, Object value) { // parse the key String[] nodes = parseElementNames(name); String attName = parseAttributeName(name); Element element = document.getDocumentElement(); - for (int i = 0; i < nodes.length; i++) - { + for (int i = 0; i < nodes.length; i++) { String eName = nodes[i]; - - Element child = null; - NodeList list = element.getChildNodes(); - for (int j = 0; j < list.getLength(); j++) - { - Node node = list.item(j); - if (node instanceof Element) - { - child = (Element) node; - if (eName.equals(child.getTagName())) - { - break; - } - child = null; - } - } + Element child = getChildElementWithName(eName, element); // If we don't find this part of the property in the XML hierarchy // we add it as a new node - if (child == null) - { + if (child == null) { child = document.createElement(eName); element.appendChild(child); } element = child; } - if (attName == null) - { + if (attName == null) { CharacterData data = document.createTextNode((String) value); element.appendChild(data); - } - else - { + } else { element.setAttribute(attName, (String) value); } } + private Element getChildElementWithName(String eName, Element element) { + Element child = null; + + NodeList list = element.getChildNodes(); + for (int j = 0; j < list.getLength(); j++) { + Node node = list.item(j); + if (node instanceof Element) { + child = (Element) node; + if (eName.equals(child.getTagName())) { + break; + } + child = null; + } + } + return child; + } + /** - * Adds the property value in our document tree, auto-saving if - * appropriate. - * - * @param name The name of the element to set a value for. - * @param value The value to set. + * Adds the property value in our document tree, auto-saving if appropriate. + * + * @param name + * The name of the element to set a value for. + * @param value + * The value to set. */ - private void addXmlProperty(String name, Object value) - { + private void addXmlProperty(String name, Object value) { // parse the key String[] nodes = parseElementNames(name); String attName = parseAttributeName(name); @@ -452,59 +414,40 @@ Element element = document.getDocumentElement(); Element parent = element; - for (int i = 0; i < nodes.length; i++) - { - if(element == null) break; + for (int i = 0; i < nodes.length; i++) { + if (element == null) + break; parent = element; String eName = nodes[i]; - Element child = null; - - NodeList list = element.getChildNodes(); - for (int j = 0; j < list.getLength(); j++) - { - Node node = list.item(j); - if (node instanceof Element) - { - child = (Element) node; - if (eName.equals(child.getTagName())) - { - break; - } - child = null; - } - } + Element child = getChildElementWithName(eName, element); element = child; } - Element child = document.createElement(nodes[nodes.length-1]); + Element child = document.createElement(nodes[nodes.length - 1]); parent.appendChild(child); - if (attName == null) - { + if (attName == null) { CharacterData data = document.createTextNode((String) value); child.appendChild(data); - } - else - { + } else { child.setAttribute(attName, (String) value); } } /** - * Calls super method, and also ensures the underlying [EMAIL PROTECTED] Document} is + * Calls super method, and also ensures the underlying [EMAIL PROTECTED] Document}is * modified so changes are persisted when saved. - * - * @param name The name of the property to clear. + * + * @param name + * The name of the property to clear. */ - public void clearProperty(String name) - { + public void clearProperty(String name) { super.clearProperty(name); clearXmlProperty(name); possiblySave(); } - private void clearXmlProperty(String name) - { + private void clearXmlProperty(String name) { // parse the key String[] nodes = parseElementNames(name); String attName = parseAttributeName(name); @@ -512,75 +455,58 @@ // get all the matching elements ArrayList children = findElementsForPropertyNodes(nodes); - if (attName == null) - { + if (attName == null) { // remove children with no subelements Iterator cIter = children.iterator(); - while (cIter.hasNext()) - { - Element child = (Element)cIter.next(); - + while (cIter.hasNext()) { + Element child = (Element) cIter.next(); + // determine if child has subelments boolean hasSubelements = false; Node subchild = child.getFirstChild(); - while(subchild != null) - { - if (subchild.getNodeType() == Node.ELEMENT_NODE) - { + while (subchild != null) { + if (subchild.getNodeType() == Node.ELEMENT_NODE) { hasSubelements = true; break; } subchild = subchild.getNextSibling(); } - - if (!hasSubelements) - { + + if (!hasSubelements) { // safe to remove - if (!child.hasAttributes()) - { + if (!child.hasAttributes()) { // remove entire node Node parent = child.getParentNode(); parent.removeChild(child); - } - else - { + } else { // only remove node contents subchild = child.getLastChild(); - while(subchild != null) - { + while (subchild != null) { child.removeChild(subchild); subchild = child.getLastChild(); } } } } - } - else - { + } else { // remove attributes from children Iterator cIter = children.iterator(); - while (cIter.hasNext()) - { - Element child = (Element)cIter.next(); + while (cIter.hasNext()) { + Element child = (Element) cIter.next(); child.removeAttribute(attName); } } } /** - * Save the configuration if the automatic persistence is enabled and a - * file is specified. + * Save the configuration if the automatic persistence is enabled and a file + * is specified. */ - private void possiblySave() - { - if (autoSave && fileName != null) - { - try - { + private void possiblySave() { + if (autoSave && fileName != null) { + try { save(); - } - catch (ConfigurationException ce) - { + } catch (ConfigurationException ce) { throw new ConfigurationRuntimeException("Failed to auto-save", ce); } } @@ -588,155 +514,132 @@ /** * If true, changes are automatically persisted. - * + * * @param autoSave */ - public void setAutoSave(boolean autoSave) - { + public void setAutoSave(boolean autoSave) { this.autoSave = autoSave; } /** * Save the configuration to the file specified by the fileName attribute. - * + * * @throws ConfigurationException */ - public void save() throws ConfigurationException - { + public void save() throws ConfigurationException { save(getFile().toString()); } /** * Save the configuration to a file. - * - * @param filename the name of the xml file - * + * + * @param filename + * the name of the xml file + * * @throws ConfigurationException */ - public void save(String filename) throws ConfigurationException - { + public void save(String filename) throws ConfigurationException { FileWriter writer = null; - try - { + try { writer = new FileWriter(filename); save(writer); - } - catch (IOException ioe) - { - throw new ConfigurationException("Could not save to " + getFile()); - } - finally - { - try - { - if (writer != null) - { + } catch (IOException ioe) { + throw new ConfigurationException("Could not save to " + getFile()); + } finally { + try { + if (writer != null) { writer.close(); } - } - catch (IOException ioe) - { - throw new ConfigurationException(ioe); - } + } catch (IOException ioe) { + throw new ConfigurationException(ioe); + } } } /** * Save the configuration to the specified stream. - * - * @param out the output stream used to save the configuration + * + * @param out + * the output stream used to save the configuration */ - public void save(OutputStream out) throws ConfigurationException - { + public void save(OutputStream out) throws ConfigurationException { save(out, null); } /** * Save the configuration to the specified stream. - * - * @param out the output stream used to save the configuration - * @param encoding the charset used to write the configuration - */ - public void save(OutputStream out, String encoding) throws ConfigurationException - { - try - { + * + * @param out + * the output stream used to save the configuration + * @param encoding + * the charset used to write the configuration + */ + public void save(OutputStream out, String encoding) throws ConfigurationException { + try { OutputStreamWriter writer = new OutputStreamWriter(out, encoding); save(writer); - } - catch (UnsupportedEncodingException e) - { + } catch (UnsupportedEncodingException e) { throw new ConfigurationException(e.getMessage(), e); } } /** * Save the configuration to the specified stream. - * - * @param writer the output stream used to save the configuration + * + * @param writer + * the output stream used to save the configuration */ - public void save(Writer writer) throws ConfigurationException - { - try - { + public void save(Writer writer) throws ConfigurationException { + try { Transformer transformer = TransformerFactory.newInstance().newTransformer(); Source source = new DOMSource(document); Result result = new StreamResult(writer); transformer.setOutputProperty("indent", "yes"); transformer.transform(source, result); - } - catch (TransformerException e) - { + } catch (TransformerException e) { throw new ConfigurationException(e.getMessage(), e); } } /** * Returns the file. - * + * * @return File */ - public File getFile() - { + public File getFile() { return ConfigurationUtils.constructFile(getBasePath(), getFileName()); } /** * Sets the file. - * - * @param file The file to set + * + * @param file + * The file to set */ - public void setFile(File file) - { + public void setFile(File file) { this.fileName = file.getAbsolutePath(); } - public void setFileName(String fileName) - { + public void setFileName(String fileName) { this.fileName = fileName; } /** * Returns the fileName. - * + * * @return String */ - public String getFileName() - { + public String getFileName() { return fileName; } - public String toString() - { + public String toString() { StringWriter writer = new StringWriter(); - try - { + try { save(writer); - } - catch (ConfigurationException e) - { + } catch (ConfigurationException e) { e.printStackTrace(); } return writer.toString(); @@ -745,24 +648,20 @@ /** * Parse a property key and return an array of the element hierarchy it * specifies. For example the key "[EMAIL PROTECTED]" will result in [x, y, z]. - * - * @param key the key to parse - * + * + * @param key + * the key to parse + * * @return the elements in the key */ - protected static String[] parseElementNames(String key) - { - if (key == null) - { + protected static String[] parseElementNames(String key) { + if (key == null) { return new String[] {}; - } - else - { + } else { // find the beginning of the attribute name int attStart = key.indexOf(ATTRIBUTE_START); - if (attStart > -1) - { + if (attStart > -1) { // remove the attribute part of the key key = key.substring(0, attStart); } @@ -773,22 +672,20 @@ /** * Parse a property key and return the attribute name if it existst. - * - * @param key the key to parse - * + * + * @param key + * the key to parse + * * @return the attribute name, or null if the key doesn't contain one */ - protected static String parseAttributeName(String key) - { + protected static String parseAttributeName(String key) { String name = null; - if (key != null) - { + if (key != null) { // find the beginning of the attribute name int attStart = key.indexOf(ATTRIBUTE_START); - if (attStart > -1) - { + if (attStart > -1) { // find the end of the attribute name int attEnd = key.indexOf(ATTRIBUTE_END); attEnd = attEnd > -1 ? attEnd : key.length(); @@ -799,4 +696,4 @@ return name; } -} +} \ No newline at end of file
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]