/* * 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. */ // $Id: DOMResult.java 569995 2007-08-27 04:31:06Z mrglavas $ package javax.xml.transform.dom; import javax.xml.transform.Result; import org.w3c.dom.Node; /** *
Acts as a holder for a transformation result tree in the form of a Document Object Model (DOM) tree.
* *If no output DOM source is set, the transformation will create a Document node as the holder for the result of the transformation, * which may be retrieved with {@link #getNode()}.
* * @author Jeff Suttor * @version $Revision: 569995 $, $Date: 2007-08-26 21:31:06 -0700 (Sun, 26 Aug 2007) $ */ public class DOMResult implements Result { /**If {@link javax.xml.transform.TransformerFactory#getFeature}
* returns true
when passed this value as an argument,
* the Transformer
supports Result
output of this type.
Zero-argument default constructor.
* *node
,
* siblingNode
and
* systemId
* will be set to null
.
Use a DOM node to create a new output target.
* *In practice, the node should be * a {@link org.w3c.dom.Document} node, * a {@link org.w3c.dom.DocumentFragment} node, or * a {@link org.w3c.dom.Element} node. * In other words, a node that accepts children.
* *siblingNode
and
* systemId
* will be set to null
.
Use a DOM node to create a new output target with the specified System ID.
* *
In practice, the node should be * a {@link org.w3c.dom.Document} node, * a {@link org.w3c.dom.DocumentFragment} node, or * a {@link org.w3c.dom.Element} node. * In other words, a node that accepts children.
* *siblingNode
will be set to null
.
Use a DOM node to create a new output target specifying the child node where the result nodes should be inserted before.
* *In practice, node
and nextSibling
should be
* a {@link org.w3c.dom.Document} node,
* a {@link org.w3c.dom.DocumentFragment} node, or
* a {@link org.w3c.dom.Element} node.
* In other words, a node that accepts children.
Use nextSibling
to specify the child node
* where the result nodes should be inserted before.
* If nextSibling
is not a sibling of node
,
* then an IllegalArgumentException
is thrown.
* If node
is null
and nextSibling
is not null
,
* then an IllegalArgumentException
is thrown.
* If nextSibling
is null
,
* then the behavior is the same as calling {@link #DOMResult(Node node)},
* i.e. append the result nodes as the last child of the specified node
.
systemId
will be set to null
.
nextSibling
is not a sibling of node
.
* @throws IllegalArgumentException If node
is null
and nextSibling
is not null
.
*
* @since 1.5
*/
public DOMResult(Node node, Node nextSibling) {
// does the corrent parent/child relationship exist?
if (nextSibling != null) {
// cannot be a sibling of a null node
if (node == null) {
throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is contained by the \"null\" node.");
}
// nextSibling contained by node?
if ((node.compareDocumentPosition(nextSibling)&Node.DOCUMENT_POSITION_CONTAINED_BY)==0) {
throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is not contained by the node.");
}
}
setNode(node);
setNextSibling(nextSibling);
setSystemId(null);
}
/**
* Use a DOM node to create a new output target specifying the child node where the result nodes should be inserted before and * the specified System ID.
* *In practice, node
and nextSibling
should be
* a {@link org.w3c.dom.Document} node,
* a {@link org.w3c.dom.DocumentFragment} node, or a
* {@link org.w3c.dom.Element} node.
* In other words, a node that accepts children.
Use nextSibling
to specify the child node
* where the result nodes should be inserted before.
* If nextSibling
is not a sibling of node
,
* then an IllegalArgumentException
is thrown.
* If node
is null
and nextSibling
is not null
,
* then an IllegalArgumentException
is thrown.
* If nextSibling
is null
,
* then the behavior is the same as calling {@link #DOMResult(Node node, String systemId)},
* i.e. append the result nodes as the last child of the specified node and use the specified System ID.
nextSibling
is not a sibling of node
.
* @throws IllegalArgumentException If node
is null
and nextSibling
is not null
.
*
* @since 1.5
*/
public DOMResult(Node node, Node nextSibling, String systemId) {
// does the current parent/child relationship exist?
if (nextSibling != null) {
// cannot be a sibling of a null node
if (node == null) {
throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is contained by the \"null\" node.");
}
// nextSibling contained by node?
if ((node.compareDocumentPosition(nextSibling)&Node.DOCUMENT_POSITION_CONTAINED_BY)==0) {
throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is not contained by the node.");
}
}
setNode(node);
setNextSibling(nextSibling);
setSystemId(systemId);
}
/**
* Set the node that will contain the result DOM tree.
* *
In practice, the node should be * a {@link org.w3c.dom.Document} node, * a {@link org.w3c.dom.DocumentFragment} node, or * a {@link org.w3c.dom.Element} node. * In other words, a node that accepts children.
* *An IllegalStateException
is thrown if nextSibling
is not null
and
* node
is not a parent of nextSibling
.
* An IllegalStateException
is thrown if node
is null
and
* nextSibling
is not null
.
nextSibling
is not null
and
* nextSibling
is not a child of node
.
* @throws IllegalStateException If node
is null
and
* nextSibling
is not null
.
*/
public void setNode(Node node) {
// does the corrent parent/child relationship exist?
if (nextSibling != null) {
// cannot be a sibling of a null node
if (node == null) {
throw new IllegalStateException("Cannot create a DOMResult when the nextSibling is contained by the \"null\" node.");
}
// nextSibling contained by node?
if ((node.compareDocumentPosition(nextSibling)&Node.DOCUMENT_POSITION_CONTAINED_BY)==0) {
throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is not contained by the node.");
}
}
this.node = node;
}
/**
* Get the node that will contain the result DOM tree.
* *If no node was set via
* {@link #DOMResult(Node node)},
* {@link #DOMResult(Node node, String systeId)},
* {@link #DOMResult(Node node, Node nextSibling)},
* {@link #DOMResult(Node node, Node nextSibling, String systemId)} or
* {@link #setNode(Node node)},
* then the node will be set by the transformation, and may be obtained from this method once the transformation is complete.
* Calling this method before the transformation will return null
.
Set the child node before which the result nodes will be inserted.
* *Use nextSibling
to specify the child node
* before which the result nodes should be inserted.
* If nextSibling
is not a descendant of node
,
* then an IllegalArgumentException
is thrown.
* If node
is null
and nextSibling
is not null
,
* then an IllegalStateException
is thrown.
* If nextSibling
is null
,
* then the behavior is the same as calling {@link #DOMResult(Node node)},
* i.e. append the result nodes as the last child of the specified node
.
nextSibling
is not a descendant of node
.
* @throws IllegalStateException If node
is null
and nextSibling
is not null
.
*
* @since 1.5
*/
public void setNextSibling(Node nextSibling) {
// does the corrent parent/child relationship exist?
if (nextSibling != null) {
// cannot be a sibling of a null node
if (node == null) {
throw new IllegalStateException("Cannot create a DOMResult when the nextSibling is contained by the \"null\" node.");
}
// nextSibling contained by node?
if ((node.compareDocumentPosition(nextSibling)&Node.DOCUMENT_POSITION_CONTAINED_BY)==0) {
throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is not contained by the node.");
}
}
this.nextSibling = nextSibling;
}
/**
* Get the child node before which the result nodes will be inserted.
* *If no node was set via
* {@link #DOMResult(Node node, Node nextSibling)},
* {@link #DOMResult(Node node, Node nextSibling, String systemId)} or
* {@link #setNextSibling(Node nextSibling)},
* then null
will be returned.
Set the systemId that may be used in association with the node.
* * @param systemId The system identifier as a URI string. */ public void setSystemId(String systemId) { this.systemId = systemId; } /** *Get the System Identifier.
* *If no System ID was set via
* {@link #DOMResult(Node node, String systemId)},
* {@link #DOMResult(Node node, Node nextSibling, String systemId)} or
* {@link #setSystemId(String systemId)},
* then null
will be returned.
The node to which the transformation will be appended.
*/ private Node node = null; /** *The child node before which the result nodes will be inserted.
* * @since 1.5 */ private Node nextSibling = null; /** *The System ID that may be used in association with the node.
*/ private String systemId = null; }