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