bodewig 2003/11/27 04:00:58 Modified: src/main/org/apache/tools/ant/util JAXPUtils.java Added: src/etc/testcases/types xmlfragment.xml src/main/org/apache/tools/ant/util XMLFragment.java src/testcases/org/apache/tools/ant/util XMLFragmentTest.java Log: Add a helper class for tasks that want literal XML as input Revision Changes Path 1.1 ant/src/etc/testcases/types/xmlfragment.xml Index: xmlfragment.xml =================================================================== <project> <typedef name="fragment" classname="org.apache.tools.ant.util.XMLFragment"/> <fragment id="nested-text">foo</fragment> <fragment id="with-children"> <child1>foo</child1> <child2 foo="bar"/> <child3> <child4/> </child3> </fragment> </project> 1.10 +42 -0 ant/src/main/org/apache/tools/ant/util/JAXPUtils.java Index: JAXPUtils.java =================================================================== RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/util/JAXPUtils.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- JAXPUtils.java 21 Sep 2003 20:20:03 -0000 1.9 +++ JAXPUtils.java 27 Nov 2003 12:00:57 -0000 1.10 @@ -54,6 +54,8 @@ package org.apache.tools.ant.util; import java.io.File; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.FactoryConfigurationError; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; @@ -97,6 +99,12 @@ */ private static SAXParserFactory nsParserFactory = null; + /** + * Parser factory to use to create document builders. + * + * @since Ant 1.7 + */ + private static DocumentBuilderFactory builderFactory = null; /** * Returns the parser factory to use. Only one parser factory is @@ -210,6 +218,20 @@ } /** + * Returns a newly created DocumentBuilder. + * + * @return a DocumentVuilder + * @since Ant 1.7 + */ + public static DocumentBuilder getDocumentBuilder() throws BuildException { + try { + return getDocumentBuilderFactory().newDocumentBuilder(); + } catch (ParserConfigurationException e) { + throw new BuildException(e); + } + } + + /** * @return a new SAXParser instance as helper for getParser and * getXMLReader. * @@ -239,6 +261,26 @@ } else { return new BuildException(e); } + } + + /** + * Obtains the default builder factory if not already. + * + * @since Ant 1.7 + */ + private static synchronized + DocumentBuilderFactory getDocumentBuilderFactory() + throws BuildException { + if (builderFactory == null) { + try { + builderFactory = DocumentBuilderFactory.newInstance(); + } catch (FactoryConfigurationError e) { + throw new BuildException("Document builder factory has not " + + "been configured correctly: " + + e.getMessage(), e); + } + } + return builderFactory; } } 1.1 ant/src/main/org/apache/tools/ant/util/XMLFragment.java Index: XMLFragment.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Ant" and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.util; import org.w3c.dom.Document; import org.w3c.dom.DocumentFragment; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Text; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.DynamicConfigurator; import org.apache.tools.ant.ProjectHelper; /** * Use this class as a nested element if you want to get a literal DOM * fragment of something nested into your task/type. * * <p>This is useful for tasks that want to deal with the "real" XML * from the build file instead of objects.</p> * * <p>Code heavily influenced by code written by Dominique Devienne.</p> * * @since Ant 1.7 */ public class XMLFragment implements DynamicConfigurator { private Document doc; private DocumentFragment fragment; public XMLFragment() { doc = JAXPUtils.getDocumentBuilder().newDocument(); fragment = doc.createDocumentFragment(); } /** * Return the DocumentFragment that corresponds to the nested * structure. */ public DocumentFragment getFragment() { return fragment; } /** * Add nested text. */ public void addText(String s) { addText(fragment, s); } /** * No attributes for the wrapping element. */ public void setDynamicAttribute(String name, String value) throws BuildException { throw new BuildException("Attribute " + name + " is not supported."); } /** * Creates a nested element. */ public Object createDynamicElement(String name) { /* I don't get the namespace prefix here Element e = doc .createElementNS(ProjectHelper.extractUriFromComponentName(name), ProjectHelper.extractNameFromComponentName(name)); */ Element e = doc.createElement(name); fragment.appendChild(e); return new Child(e); } private void addText(Node n, String s) { if (s != null && !s.trim().equals("")) { Text t = doc.createTextNode(s); n.appendChild(t); } } public class Child implements DynamicConfigurator { private Element e; Child(Element e) { this.e = e; } /** * Add nested text. */ public void addText(String s) { XMLFragment.this.addText(e, s); } /** * Sets the attribute */ public void setDynamicAttribute(String name, String value) { e.setAttribute(name, value); } /** * Creates a nested element. */ public Object createDynamicElement(String name) { /* Element e2 = doc .createElementNS(ProjectHelper .extractUriFromComponentName(name), ProjectHelper .extractNameFromComponentName(name)); */ Element e2 = doc.createElement(name); e.appendChild(e2); return new Child(e2); } } } 1.1 ant/src/testcases/org/apache/tools/ant/util/XMLFragmentTest.java Index: XMLFragmentTest.java =================================================================== /* * The Apache Software License, Version 1.1 * * Copyright (c) 2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "Ant" and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */ package org.apache.tools.ant.util; import org.apache.tools.ant.BuildFileTest; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; public class XMLFragmentTest extends BuildFileTest { public XMLFragmentTest(String name) { super(name); } public void setUp() { configureProject("src/etc/testcases/types/xmlfragment.xml"); } public void testNestedText() { XMLFragment x = (XMLFragment) getProject().getReference("nested-text"); assertNotNull(x); Node n = x.getFragment(); assertTrue("No attributes", !n.hasAttributes()); NodeList nl = n.getChildNodes(); assertEquals(1, nl.getLength()); assertEquals(Node.TEXT_NODE, nl.item(0).getNodeType()); assertEquals("foo", nl.item(0).getNodeValue()); } public void testNestedChildren() { XMLFragment x = (XMLFragment) getProject().getReference("with-children"); assertNotNull(x); Node n = x.getFragment(); assertTrue("No attributes", !n.hasAttributes()); NodeList nl = n.getChildNodes(); assertEquals(3, nl.getLength()); assertEquals(Node.ELEMENT_NODE, nl.item(0).getNodeType()); Element child1 = (Element) nl.item(0); assertEquals("child1", child1.getTagName()); assertTrue(!child1.hasAttributes()); NodeList nl2 = child1.getChildNodes(); assertEquals(1, nl2.getLength()); assertEquals(Node.TEXT_NODE, nl2.item(0).getNodeType()); assertEquals("foo", nl2.item(0).getNodeValue()); assertEquals(Node.ELEMENT_NODE, nl.item(1).getNodeType()); Element child2 = (Element) nl.item(1); assertEquals("child2", child2.getTagName()); assertTrue(child2.hasAttributes()); nl2 = child2.getChildNodes(); assertEquals(0, nl2.getLength()); assertEquals("bar", child2.getAttribute("foo")); assertEquals(Node.ELEMENT_NODE, nl.item(2).getNodeType()); Element child3 = (Element) nl.item(2); assertEquals("child3", child3.getTagName()); assertTrue(!child3.hasAttributes()); nl2 = child3.getChildNodes(); assertEquals(1, nl2.getLength()); assertEquals(Node.ELEMENT_NODE, nl2.item(0).getNodeType()); assertEquals("child4", ((Element) nl2.item(0)).getTagName()); } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]