1320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson/*
2320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Licensed to the Apache Software Foundation (ASF) under one or more
3320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * contributor license agreements.  See the NOTICE file distributed with
4320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * this work for additional information regarding copyright ownership.
5320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * The ASF licenses this file to You under the Apache License, Version 2.0
6320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * (the "License"); you may not use this file except in compliance with
7320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * the License.  You may obtain a copy of the License at
8320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *
9320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *     http://www.apache.org/licenses/LICENSE-2.0
10320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson *
11320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * Unless required by applicable law or agreed to in writing, software
12320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * distributed under the License is distributed on an "AS IS" BASIS,
13320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * See the License for the specific language governing permissions and
15320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * limitations under the License.
16320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */
17320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
18320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson// $Id: DOMResult.java 569995 2007-08-27 04:31:06Z mrglavas $
19320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
20320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonpackage javax.xml.transform.dom;
21320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
22320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport javax.xml.transform.Result;
23320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonimport org.w3c.dom.Node;
24320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
25320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson/**
26320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>Acts as a holder for a transformation result tree in the form of a Document Object Model (DOM) tree.</p>
27f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
28320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * <p>If no output DOM source is set, the transformation will create a Document node as the holder for the result of the transformation,
29320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * which may be retrieved with {@link #getNode()}.</p>
30f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes *
31320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @author <a href="Jeff.Suttor@Sun.com">Jeff Suttor</a>
32320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson * @version $Revision: 569995 $, $Date: 2007-08-26 21:31:06 -0700 (Sun, 26 Aug 2007) $
33320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson */
34320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilsonpublic class DOMResult implements Result {
35320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
36320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /** <p>If {@link javax.xml.transform.TransformerFactory#getFeature}
37320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * returns <code>true</code> when passed this value as an argument,
38320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * the <code>Transformer</code> supports <code>Result</code> output of this type.</p>
39320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
40320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public static final String FEATURE = "http://javax.xml.transform.dom.DOMResult/feature";
41320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
42320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
43320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Zero-argument default constructor.</p>
44f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
45320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p><code>node</code>,
46320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>siblingNode</code> and
47320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>systemId</code>
48320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * will be set to <code>null</code>.</p>
49320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
50320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public DOMResult() {
51320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNode(null);
52320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNextSibling(null);
53320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setSystemId(null);
54320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
55320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
56320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
57320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Use a DOM node to create a new output target.</p>
58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
59320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>In practice, the node should be
60320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.Document} node,
61320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.DocumentFragment} node, or
62320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.Element} node.
63320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * In other words, a node that accepts children.</p>
64320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
65320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p><code>siblingNode</code> and
66320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <code>systemId</code>
67320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * will be set to <code>null</code>.</p>
68f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
69320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param node The DOM node that will contain the result tree.
70320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
71320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public DOMResult(Node node) {
72320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNode(node);
73320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNextSibling(null);
74320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setSystemId(null);
75320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
76320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
77320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
78320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Use a DOM node to create a new output target with the specified System ID.<p>
79f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
80320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>In practice, the node should be
81320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.Document} node,
82320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.DocumentFragment} node, or
83320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.Element} node.
84320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * In other words, a node that accepts children.</p>
85320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
86320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p><code>siblingNode</code> will be set to <code>null</code>.</p>
87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
88320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param node The DOM node that will contain the result tree.
89320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param systemId The system identifier which may be used in association with this node.
90320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
91320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public DOMResult(Node node, String systemId) {
92320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNode(node);
93320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNextSibling(null);
94320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setSystemId(systemId);
95320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
96320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
97320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
98320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Use a DOM node to create a new output target specifying the child node where the result nodes should be inserted before.</p>
99f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
100320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>In practice, <code>node</code> and <code>nextSibling</code> should be
101320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.Document} node,
102320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.DocumentFragment} node, or
103320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.Element} node.
104320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * In other words, a node that accepts children.</p>
105f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
106f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <p>Use <code>nextSibling</code> to specify the child node
107f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * where the result nodes should be inserted before.
108320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * If <code>nextSibling</code> is not a sibling of <code>node</code>,
109320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then an <code>IllegalArgumentException</code> is thrown.
110320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * If <code>node</code> is <code>null</code> and <code>nextSibling</code> is not <code>null</code>,
111320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then an <code>IllegalArgumentException</code> is thrown.
112320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * If <code>nextSibling</code> is <code>null</code>,
113320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then the behavior is the same as calling {@link #DOMResult(Node node)},
114320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * i.e. append the result nodes as the last child of the specified <code>node</code>.</p>
115f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
116320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p><code>systemId</code> will be set to <code>null</code>.</p>
117f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
118320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param node The DOM node that will contain the result tree.
119320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param nextSibling The child node where the result nodes should be inserted before.
120f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
121320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If <code>nextSibling</code> is not a sibling of <code>node</code>.
122320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If <code>node</code> is <code>null</code> and <code>nextSibling</code> is not <code>null</code>.
123f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
124320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @since 1.5
125320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
126320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public DOMResult(Node node, Node nextSibling) {
127f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
128320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // does the corrent parent/child relationship exist?
129320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (nextSibling != null) {
130320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            // cannot be a sibling of a null node
131320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (node == null) {
132320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is contained by the \"null\" node.");
133320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
134f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
135320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            // nextSibling contained by node?
136320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if ((node.compareDocumentPosition(nextSibling)&Node.DOCUMENT_POSITION_CONTAINED_BY)==0) {
137320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is not contained by the node.");
138320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
139320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
140320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
141320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNode(node);
142320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNextSibling(nextSibling);
143320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setSystemId(null);
144320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
145320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
146320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
147320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Use a DOM node to create a new output target specifying the child node where the result nodes should be inserted before and
148320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * the specified System ID.</p>
149f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
150320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>In practice, <code>node</code> and <code>nextSibling</code> should be
151320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.Document} node,
152320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.DocumentFragment} node, or a
153320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link org.w3c.dom.Element} node.
154320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * In other words, a node that accepts children.</p>
155320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
156f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <p>Use <code>nextSibling</code> to specify the child node
157320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * where the result nodes should be inserted before.
158320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * If <code>nextSibling</code> is not a sibling of <code>node</code>,
159320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then an <code>IllegalArgumentException</code> is thrown.
160320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * If <code>node</code> is <code>null</code> and <code>nextSibling</code> is not <code>null</code>,
161320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then an <code>IllegalArgumentException</code> is thrown.
162320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * If <code>nextSibling</code> is <code>null</code>,
163320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then the behavior is the same as calling {@link #DOMResult(Node node, String systemId)},
164320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * i.e. append the result nodes as the last child of the specified node and use the specified System ID.</p>
165f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
166320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param node The DOM node that will contain the result tree.
167320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param nextSibling The child node where the result nodes should be inserted before.
168320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param systemId The system identifier which may be used in association with this node.
169f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
170320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If <code>nextSibling</code> is not a sibling of <code>node</code>.
171320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If <code>node</code> is <code>null</code> and <code>nextSibling</code> is not <code>null</code>.
172f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
173320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @since 1.5
174320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
175320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public DOMResult(Node node, Node nextSibling, String systemId) {
176320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
177320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // does the current parent/child relationship exist?
178320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (nextSibling != null) {
179320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            // cannot be a sibling of a null node
180320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (node == null) {
181320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is contained by the \"null\" node.");
182320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
183f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
184320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            // nextSibling contained by node?
185320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if ((node.compareDocumentPosition(nextSibling)&Node.DOCUMENT_POSITION_CONTAINED_BY)==0) {
186320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is not contained by the node.");
187320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
188320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
189320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
190320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNode(node);
191320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setNextSibling(nextSibling);
192320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        setSystemId(systemId);
193320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
194320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
195320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
196320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Set the node that will contain the result DOM tree.<p>
197f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
198320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>In practice, the node should be
199320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.Document} node,
200320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.DocumentFragment} node, or
201320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * a {@link org.w3c.dom.Element} node.
202320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * In other words, a node that accepts children.</p>
203f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
204320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>An <code>IllegalStateException</code> is thrown if <code>nextSibling</code> is not <code>null</code> and
205f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <code>node</code> is not a parent of <code>nextSibling</code>.
206320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * An <code>IllegalStateException</code> is thrown if <code>node</code> is <code>null</code> and
207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * <code>nextSibling</code> is not <code>null</code>.</p>
208320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
209320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param node The node to which the transformation will be appended.
210f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
211320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalStateException If <code>nextSibling</code> is not <code>null</code> and
212320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <code>nextSibling</code> is not a child of <code>node</code>.
213320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalStateException If <code>node</code> is <code>null</code> and
214320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *   <code>nextSibling</code> is not <code>null</code>.
215320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
216320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public void setNode(Node node) {
217320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // does the corrent parent/child relationship exist?
218320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (nextSibling != null) {
219320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            // cannot be a sibling of a null node
220320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (node == null) {
221320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalStateException("Cannot create a DOMResult when the nextSibling is contained by the \"null\" node.");
222320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
223f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
224320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            // nextSibling contained by node?
225320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if ((node.compareDocumentPosition(nextSibling)&Node.DOCUMENT_POSITION_CONTAINED_BY)==0) {
226320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is not contained by the node.");
227320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
228320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
229320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
230320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        this.node = node;
231320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
232320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
233320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
234320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Get the node that will contain the result DOM tree.</p>
235f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
236320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>If no node was set via
237320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #DOMResult(Node node)},
238320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #DOMResult(Node node, String systeId)},
239320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #DOMResult(Node node, Node nextSibling)},
240320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #DOMResult(Node node, Node nextSibling, String systemId)} or
241320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #setNode(Node node)},
242320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then the node will be set by the transformation, and may be obtained from this method once the transformation is complete.
243320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * Calling this method before the transformation will return <code>null</code>.</p>
244320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
245320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return The node to which the transformation will be appended.
246320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
247320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Node getNode() {
248320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return node;
249320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
250320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
251320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
252320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Set the child node before which the result nodes will be inserted.</p>
253320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
254320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Use <code>nextSibling</code> to specify the child node
255320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * before which the result nodes should be inserted.
256320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * If <code>nextSibling</code> is not a descendant of <code>node</code>,
257320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then an <code>IllegalArgumentException</code> is thrown.
258320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * If <code>node</code> is <code>null</code> and <code>nextSibling</code> is not <code>null</code>,
259320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then an <code>IllegalStateException</code> is thrown.
260320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * If <code>nextSibling</code> is <code>null</code>,
261320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then the behavior is the same as calling {@link #DOMResult(Node node)},
262320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * i.e. append the result nodes as the last child of the specified <code>node</code>.</p>
263f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
264320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param nextSibling The child node before which the result nodes will be inserted.
265f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
266320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalArgumentException If <code>nextSibling</code> is not a descendant of <code>node</code>.
267320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @throws IllegalStateException If <code>node</code> is <code>null</code> and <code>nextSibling</code> is not <code>null</code>.
268f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
269320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @since 1.5
270320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
271320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public void setNextSibling(Node nextSibling) {
272f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
273320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        // does the corrent parent/child relationship exist?
274320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        if (nextSibling != null) {
275320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            // cannot be a sibling of a null node
276320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if (node == null) {
277320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalStateException("Cannot create a DOMResult when the nextSibling is contained by the \"null\" node.");
278320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
279f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
280320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            // nextSibling contained by node?
281320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            if ((node.compareDocumentPosition(nextSibling)&Node.DOCUMENT_POSITION_CONTAINED_BY)==0) {
282320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson                throw new IllegalArgumentException("Cannot create a DOMResult when the nextSibling is not contained by the node.");
283320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson            }
284320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        }
285320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
286320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        this.nextSibling = nextSibling;
287320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
288320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
289320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
290320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Get the child node before which the result nodes will be inserted.</p>
291f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
292320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>If no node was set via
293320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #DOMResult(Node node, Node nextSibling)},
294320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #DOMResult(Node node, Node nextSibling, String systemId)} or
295320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #setNextSibling(Node nextSibling)},
296320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then <code>null</code> will be returned.</p>
297320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
298320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return The child node before which the result nodes will be inserted.
299f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
300320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @since 1.5
301320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
302320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public Node getNextSibling() {
303320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return nextSibling;
304320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
305320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
306320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
307320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Set the systemId that may be used in association with the node.</p>
308320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
309320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @param systemId The system identifier as a URI string.
310320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
311320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public void setSystemId(String systemId) {
312320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        this.systemId = systemId;
313320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
314320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
315320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
316320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>Get the System Identifier.</p>
317f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
318320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>If no System ID was set via
319320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #DOMResult(Node node, String systemId)},
320320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #DOMResult(Node node, Node nextSibling, String systemId)} or
321320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * {@link #setSystemId(String systemId)},
322320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * then <code>null</code> will be returned.</p>
323320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     *
324320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @return The system identifier.
325320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
326320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    public String getSystemId() {
327320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson        return systemId;
328320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    }
329320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
330320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    //////////////////////////////////////////////////////////////////////
331320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    // Internal state.
332320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    //////////////////////////////////////////////////////////////////////
333320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
334320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
335320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The node to which the transformation will be appended.</p>
336320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
337320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    private Node node = null;
338320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
339320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
340320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The child node before which the result nodes will be inserted.</p>
341f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
342320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * @since 1.5
343320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
344320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    private Node nextSibling = null;
345320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson
346320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    /**
347320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     * <p>The System ID that may be used in association with the node.</p>
348320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson     */
349320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson    private String systemId = null;
350320c9890e8241fb0ad05de6fa5e6c3eb3aece159Jesse Wilson}
351