org.apache.tools.ant.util.XMLFragment Maven / Gradle / Ivy
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.tools.ant.util;
import org.apache.tools.ant.DynamicConfiguratorNS;
import org.apache.tools.ant.DynamicElementNS;
import org.apache.tools.ant.ProjectComponent;
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;
/**
* Use this class as a nested element if you want to get a literal DOM
* fragment of something nested into your task/type.
*
* This is useful for tasks that want to deal with the "real" XML
* from the build file instead of objects.
*
* Code heavily influenced by code written by Dominique Devienne.
*
* @since Ant 1.7
*/
public class XMLFragment extends ProjectComponent implements DynamicElementNS {
private Document doc;
private DocumentFragment fragment;
/**
* Constructor for XMLFragment object.
*/
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, expanding properties as we go
* @param s the text to add
*/
public void addText(String s) {
addText(fragment, s);
}
/**
* Creates a nested element.
* @param uri the uri of the nested element
* @param name the localname of the nested element
* @param qName the qualified name of the nested element
* @return an object that the element is applied to
*/
@Override
public Object createDynamicElement(String uri, String name, String qName) {
Element e;
if ("".equals(uri)) {
e = doc.createElement(name);
} else {
e = doc.createElementNS(uri, qName);
}
fragment.appendChild(e);
return new Child(e);
}
/**
* Add text to a node.
* @param n node
* @param s value
*/
private void addText(Node n, String s) {
s = getProject().replaceProperties(s);
//only text nodes that are non null after property expansion are added
if (s != null && !s.trim().isEmpty()) {
Text t = doc.createTextNode(s.trim());
n.appendChild(t);
}
}
/**
* An object to handle (recursively) nested elements.
*/
public class Child implements DynamicConfiguratorNS {
private Element e;
Child(Element e) {
this.e = e;
}
/**
* Add nested text.
* @param s the text to add
*/
public void addText(String s) {
XMLFragment.this.addText(e, s);
}
/**
* Sets the attribute
* @param uri the uri of the attribute
* @param name the localname of the attribute
* @param qName the qualified name of the attribute
* @param value the value of the attribute
*/
@Override
public void setDynamicAttribute(
String uri, String name, String qName, String value) {
if ("".equals(uri)) {
e.setAttribute(name, value);
} else {
e.setAttributeNS(uri, qName, value);
}
}
/**
* Creates a nested element.
* @param uri the uri of the nested element
* @param name the localname of the nested element
* @param qName the qualified name of the nested element
* @return an object that the element is applied to
*/
@Override
public Object createDynamicElement(String uri, String name, String qName) {
Element e2 = null;
if ("".equals(uri)) {
e2 = doc.createElement(name);
} else {
e2 = doc.createElementNS(uri, qName);
}
e.appendChild(e2);
return new Child(e2);
}
}
}