1   
2   
3   
4   
5   
6   
7   
8   package org.dom4j.dom;
9   
10  import java.util.ArrayList;
11  
12  import org.dom4j.DocumentFactory;
13  import org.dom4j.QName;
14  import org.dom4j.tree.DefaultDocument;
15  
16  import org.w3c.dom.Attr;
17  import org.w3c.dom.CDATASection;
18  import org.w3c.dom.DOMException;
19  import org.w3c.dom.Document;
20  import org.w3c.dom.EntityReference;
21  import org.w3c.dom.NamedNodeMap;
22  import org.w3c.dom.NodeList;
23  import org.w3c.dom.ProcessingInstruction;
24  
25  /***
26   * <p>
27   * <code>DOMDocument</code> implements an XML document which supports the W3C
28   * DOM API.
29   * </p>
30   * 
31   * @author <a href="mailto:jstrachan@apache.org">James Strachan </a>
32   * @version $Revision: 1.17 $
33   */
34  public class DOMDocument extends DefaultDocument implements Document {
35      /*** The <code>DocumentFactory</code> instance used by default */
36      private static final DOMDocumentFactory DOCUMENT_FACTORY
37              = (DOMDocumentFactory) DOMDocumentFactory.getInstance();
38  
39      public DOMDocument() {
40          init();
41      }
42  
43      public DOMDocument(String name) {
44          super(name);
45          init();
46      }
47  
48      public DOMDocument(DOMElement rootElement) {
49          super(rootElement);
50          init();
51      }
52  
53      public DOMDocument(DOMDocumentType docType) {
54          super(docType);
55          init();
56      }
57  
58      public DOMDocument(DOMElement rootElement, DOMDocumentType docType) {
59          super(rootElement, docType);
60          init();
61      }
62  
63      public DOMDocument(String name, DOMElement rootElement,
64              DOMDocumentType docType) {
65          super(name, rootElement, docType);
66          init();
67      }
68  
69      private void init() {
70          setDocumentFactory(DOCUMENT_FACTORY);
71      }
72  
73      
74      
75      public boolean supports(String feature, String version) {
76          return DOMNodeHelper.supports(this, feature, version);
77      }
78  
79      public String getNamespaceURI() {
80          return DOMNodeHelper.getNamespaceURI(this);
81      }
82  
83      public String getPrefix() {
84          return DOMNodeHelper.getPrefix(this);
85      }
86  
87      public void setPrefix(String prefix) throws DOMException {
88          DOMNodeHelper.setPrefix(this, prefix);
89      }
90  
91      public String getLocalName() {
92          return DOMNodeHelper.getLocalName(this);
93      }
94  
95      public String getNodeName() {
96          return "#document";
97      }
98  
99      
100     
101     
102     public String getNodeValue() throws DOMException {
103         return null;
104     }
105 
106     public void setNodeValue(String nodeValue) throws DOMException {
107     }
108 
109     public org.w3c.dom.Node getParentNode() {
110         return DOMNodeHelper.getParentNode(this);
111     }
112 
113     public NodeList getChildNodes() {
114         return DOMNodeHelper.createNodeList(content());
115     }
116 
117     public org.w3c.dom.Node getFirstChild() {
118         return DOMNodeHelper.asDOMNode(node(0));
119     }
120 
121     public org.w3c.dom.Node getLastChild() {
122         return DOMNodeHelper.asDOMNode(node(nodeCount() - 1));
123     }
124 
125     public org.w3c.dom.Node getPreviousSibling() {
126         return DOMNodeHelper.getPreviousSibling(this);
127     }
128 
129     public org.w3c.dom.Node getNextSibling() {
130         return DOMNodeHelper.getNextSibling(this);
131     }
132 
133     public NamedNodeMap getAttributes() {
134         return null;
135     }
136 
137     public org.w3c.dom.Document getOwnerDocument() {
138         return null;
139     }
140 
141     public org.w3c.dom.Node insertBefore(org.w3c.dom.Node newChild,
142             org.w3c.dom.Node refChild) throws DOMException {
143         checkNewChildNode(newChild);
144 
145         return DOMNodeHelper.insertBefore(this, newChild, refChild);
146     }
147 
148     public org.w3c.dom.Node replaceChild(org.w3c.dom.Node newChild,
149             org.w3c.dom.Node oldChild) throws DOMException {
150         checkNewChildNode(newChild);
151 
152         return DOMNodeHelper.replaceChild(this, newChild, oldChild);
153     }
154 
155     public org.w3c.dom.Node removeChild(org.w3c.dom.Node oldChild)
156             throws DOMException {
157         return DOMNodeHelper.removeChild(this, oldChild);
158     }
159 
160     public org.w3c.dom.Node appendChild(org.w3c.dom.Node newChild)
161             throws DOMException {
162         checkNewChildNode(newChild);
163 
164         return DOMNodeHelper.appendChild(this, newChild);
165     }
166 
167     private void checkNewChildNode(org.w3c.dom.Node newChild)
168             throws DOMException {
169         final int nodeType = newChild.getNodeType();
170 
171         if (!((nodeType == org.w3c.dom.Node.ELEMENT_NODE)
172                 || (nodeType == org.w3c.dom.Node.COMMENT_NODE)
173                 || (nodeType == org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE) 
174                 || (nodeType == org.w3c.dom.Node.DOCUMENT_TYPE_NODE))) {
175             throw new DOMException(DOMException.HIERARCHY_REQUEST_ERR,
176                     "Given node cannot be a child of document");
177         }
178     }
179 
180     public boolean hasChildNodes() {
181         return nodeCount() > 0;
182     }
183 
184     public org.w3c.dom.Node cloneNode(boolean deep) {
185         return DOMNodeHelper.cloneNode(this, deep);
186     }
187 
188     public boolean isSupported(String feature, String version) {
189         return DOMNodeHelper.isSupported(this, feature, version);
190     }
191 
192     public boolean hasAttributes() {
193         return DOMNodeHelper.hasAttributes(this);
194     }
195 
196     
197     
198     public NodeList getElementsByTagName(String name) {
199         ArrayList list = new ArrayList();
200         DOMNodeHelper.appendElementsByTagName(list, this, name);
201 
202         return DOMNodeHelper.createNodeList(list);
203     }
204 
205     public NodeList getElementsByTagNameNS(String namespace, String name) {
206         ArrayList list = new ArrayList();
207         DOMNodeHelper.appendElementsByTagNameNS(list, this, namespace, name);
208 
209         return DOMNodeHelper.createNodeList(list);
210     }
211 
212     public org.w3c.dom.DocumentType getDoctype() {
213         return DOMNodeHelper.asDOMDocumentType(getDocType());
214     }
215 
216     public org.w3c.dom.DOMImplementation getImplementation() {
217         if (getDocumentFactory() instanceof org.w3c.dom.DOMImplementation) {
218             return (org.w3c.dom.DOMImplementation) getDocumentFactory();
219         } else {
220             return DOCUMENT_FACTORY;
221         }
222     }
223 
224     public org.w3c.dom.Element getDocumentElement() {
225         return DOMNodeHelper.asDOMElement(getRootElement());
226     }
227 
228     public org.w3c.dom.Element createElement(String name) throws DOMException {
229         return (org.w3c.dom.Element) getDocumentFactory().createElement(name);
230     }
231 
232     public org.w3c.dom.DocumentFragment createDocumentFragment() {
233         DOMNodeHelper.notSupported();
234 
235         return null;
236     }
237 
238     public org.w3c.dom.Text createTextNode(String data) {
239         return (org.w3c.dom.Text) getDocumentFactory().createText(data);
240     }
241 
242     public org.w3c.dom.Comment createComment(String data) {
243         return (org.w3c.dom.Comment) getDocumentFactory().createComment(data);
244     }
245 
246     public CDATASection createCDATASection(String data) throws DOMException {
247         return (CDATASection) getDocumentFactory().createCDATA(data);
248     }
249 
250     public ProcessingInstruction createProcessingInstruction(String target,
251             String data) throws DOMException {
252         return (ProcessingInstruction) getDocumentFactory()
253                 .createProcessingInstruction(target, data);
254     }
255 
256     public Attr createAttribute(String name) throws DOMException {
257         QName qname = getDocumentFactory().createQName(name);
258 
259         return (Attr) getDocumentFactory().createAttribute(null, qname, "");
260     }
261 
262     public EntityReference createEntityReference(String name)
263             throws DOMException {
264         return (EntityReference) getDocumentFactory().createEntity(name, null);
265     }
266 
267     public org.w3c.dom.Node importNode(org.w3c.dom.Node importedNode,
268             boolean deep) throws DOMException {
269         DOMNodeHelper.notSupported();
270 
271         return null;
272     }
273 
274     public org.w3c.dom.Element createElementNS(String namespaceURI,
275             String qualifiedName) throws DOMException {
276         QName qname = getDocumentFactory().createQName(qualifiedName,
277                 namespaceURI);
278 
279         return (org.w3c.dom.Element) getDocumentFactory().createElement(qname);
280     }
281 
282     public org.w3c.dom.Attr createAttributeNS(String namespaceURI,
283             String qualifiedName) throws DOMException {
284         QName qname = getDocumentFactory().createQName(qualifiedName,
285                 namespaceURI);
286 
287         return (org.w3c.dom.Attr) getDocumentFactory().createAttribute(null,
288                 qname, null);
289     }
290 
291     public org.w3c.dom.Element getElementById(String elementId) {
292         return DOMNodeHelper.asDOMElement(elementByID(elementId));
293     }
294 
295     
296     
297     protected DocumentFactory getDocumentFactory() {
298         if (super.getDocumentFactory() == null) {
299             return DOCUMENT_FACTORY;
300         } else {
301             return super.getDocumentFactory();
302         }
303     }
304 }
305 
306 
307 
308 
309 
310 
311 
312 
313 
314 
315 
316 
317 
318 
319 
320 
321 
322 
323 
324 
325 
326 
327 
328 
329 
330 
331 
332 
333 
334 
335 
336 
337 
338 
339 
340 
341