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