1 /*
2  * reserved comment block
3  * DO NOT REMOVE OR ALTER!
4  */
5 /*
6  * Licensed to the Apache Software Foundation (ASF) under one or more
7  * contributor license agreements.  See the NOTICE file distributed with
8  * this work for additional information regarding copyright ownership.
9  * The ASF licenses this file to You under the Apache License, Version 2.0
10  * (the "License"); you may not use this file except in compliance with
11  * the License.  You may obtain a copy of the License at
12  *
13  *      http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 package com.sun.org.apache.xerces.internal.dom;
23 
24 import org.w3c.dom.DOMException;
25 import org.w3c.dom.DOMImplementation;
26 import org.w3c.dom.Document;
27 import org.w3c.dom.DocumentType;
28 import org.w3c.dom.Element;
29 
30 
31 
32 /**
33  * The DOMImplementation class is description of a particular
34  * implementation of the Document Object Model. As such its data is
35  * static, shared by all instances of this implementation.
36  * <P>
37  * The DOM API requires that it be a real object rather than static
38  * methods. However, there's nothing that says it can't be a singleton,
39  * so that's how I've implemented it.
40  *
41  * @xerces.internal
42  *
43  * @since  PR-DOM-Level-1-19980818.
44  */
45 public class DOMImplementationImpl extends CoreDOMImplementationImpl
46     implements DOMImplementation {
47 
48     //
49     // Data
50     //
51 
52     // static
53 
54     /** Dom implementation singleton. */
55     static DOMImplementationImpl singleton = new DOMImplementationImpl();
56 
57 
58     //
59     // Public methods
60     //
61 
62     /** NON-DOM: Obtain and return the single shared object */
getDOMImplementation()63     public static DOMImplementation getDOMImplementation() {
64         return singleton;
65     }
66 
67     //
68     // DOMImplementation methods
69     //
70 
71     /**
72      * Test if the DOM implementation supports a specific "feature" --
73      * currently meaning language and level thereof.
74      *
75      * @param feature      The package name of the feature to test.
76      * In Level 1, supported values are "HTML" and "XML" (case-insensitive).
77      * At this writing, com.sun.org.apache.xerces.internal.dom supports only XML.
78      *
79      * @param version      The version number of the feature being tested.
80      * This is interpreted as "Version of the DOM API supported for the
81      * specified Feature", and in Level 1 should be "1.0"
82      *
83      * @return    true iff this implementation is compatable with the
84      * specified feature and version.
85      */
hasFeature(String feature, String version)86     public boolean hasFeature(String feature, String version) {
87         if (feature == null || feature.length() == 0) {
88             return false;
89         }
90 
91         boolean result = super.hasFeature(feature, version);
92         if (!result) {
93             boolean anyVersion = version == null || version.length() == 0;
94             if (feature.startsWith("+")) {
95                 feature = feature.substring(1);
96             }
97             return (
98                 (feature.equalsIgnoreCase("Events")
99                     && (anyVersion || version.equals("2.0")))
100                     || (feature.equalsIgnoreCase("MutationEvents")
101                         && (anyVersion || version.equals("2.0")))
102                     || (feature.equalsIgnoreCase("Traversal")
103                         && (anyVersion || version.equals("2.0")))
104                     || (feature.equalsIgnoreCase("Range")
105                         && (anyVersion || version.equals("2.0")))
106                     || (feature.equalsIgnoreCase("MutationEvents")
107                         && (anyVersion || version.equals("2.0"))));
108         }
109         return result;
110     } // hasFeature(String,String):boolean
111 
112 
113 
114     /**
115      * Introduced in DOM Level 2. <p>
116      *
117      * Creates an XML Document object of the specified type with its document
118      * element.
119      *
120      * @param namespaceURI     The namespace URI of the document
121      *                         element to create, or null.
122      * @param qualifiedName    The qualified name of the document
123      *                         element to create.
124      * @param doctype          The type of document to be created or null.<p>
125      *
126      *                         When doctype is not null, its
127      *                         Node.ownerDocument attribute is set to
128      *                         the document being created.
129      * @return Document        A new Document object.
130      * @throws DOMException    WRONG_DOCUMENT_ERR: Raised if doctype has
131      *                         already been used with a different document.
132      * @since WD-DOM-Level-2-19990923
133      */
createDocument(String namespaceURI, String qualifiedName, DocumentType doctype)134     public Document           createDocument(String namespaceURI,
135                                              String qualifiedName,
136                                              DocumentType doctype)
137                                              throws DOMException
138     {
139         if(namespaceURI == null && qualifiedName == null && doctype == null){
140         //if namespaceURI, qualifiedName and doctype are null, returned document is empty with
141         //no document element
142             return new DocumentImpl();
143         }
144         else if (doctype != null && doctype.getOwnerDocument() != null) {
145             String msg = DOMMessageFormatter.formatMessage(DOMMessageFormatter.DOM_DOMAIN, "WRONG_DOCUMENT_ERR", null);
146             throw new DOMException(DOMException.WRONG_DOCUMENT_ERR, msg);
147         }
148         DocumentImpl doc = new DocumentImpl(doctype);
149         Element e = doc.createElementNS( namespaceURI, qualifiedName);
150         doc.appendChild(e);
151         return doc;
152     }
153 
154 
155 } // class DOMImplementationImpl
156