coredomimplementationimpl.java

来自「JAVA 所有包」· Java 代码 · 共 487 行 · 第 1/2 页

JAVA
487
字号
/* * Copyright 1999-2005 The Apache Software Foundation. *  * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at *  *      http://www.apache.org/licenses/LICENSE-2.0 *  * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package com.sun.org.apache.xerces.internal.dom;import com.sun.org.apache.xerces.internal.impl.RevalidationHandler;import com.sun.org.apache.xerces.internal.parsers.DOMParserImpl;import com.sun.org.apache.xerces.internal.util.XMLChar;import com.sun.org.apache.xerces.internal.xni.grammars.XMLGrammarDescription;import com.sun.org.apache.xml.internal.serialize.DOMSerializerImpl;import org.w3c.dom.DOMException;import org.w3c.dom.DOMImplementation;import org.w3c.dom.Document;import org.w3c.dom.DocumentType;import org.w3c.dom.Element;import org.w3c.dom.ls.LSParser;import org.w3c.dom.ls.DOMImplementationLS;import org.w3c.dom.ls.LSInput;import org.w3c.dom.ls.LSOutput;import org.w3c.dom.ls.LSSerializer;/** * The DOMImplementation class is description of a particular * implementation of the Document Object Model. As such its data is * static, shared by all instances of this implementation. * <P> * The DOM API requires that it be a real object rather than static * methods. However, there's nothing that says it can't be a singleton, * so that's how I've implemented it. * <P> * This particular class, along with CoreDocumentImpl, supports the DOM * Core and Load/Save (Experimental). Optional modules are supported by * the more complete DOMImplementation class along with DocumentImpl. *  * @xerces.internal *  * @version $Id: CoreDOMImplementationImpl.java,v 1.2.6.1 2005/08/30 14:57:58 sunithareddy Exp $ * @since PR-DOM-Level-1-19980818. */public class CoreDOMImplementationImpl	implements DOMImplementation, DOMImplementationLS {	//	// Data	//    // validators pool    private static final int SIZE = 2;    private RevalidationHandler validators[] = new RevalidationHandler[SIZE];        private RevalidationHandler dtdValidators[] = new RevalidationHandler[SIZE];    private int freeValidatorIndex = -1;    private int freeDTDValidatorIndex = -1;    private int currentSize = SIZE;    // Document and doctype counter.  Used to assign order to documents and    // doctypes without owners, on an demand basis.   Used for    // compareDocumentPosition    private int docAndDoctypeCounter = 0;    	// static	/** Dom implementation singleton. */	static CoreDOMImplementationImpl singleton =		new CoreDOMImplementationImpl();	//	// Public methods	//	/** NON-DOM: Obtain and return the single shared object */	public static DOMImplementation getDOMImplementation() {		return singleton;	}	//	// DOMImplementation methods	//	/**	 * Test if the DOM implementation supports a specific "feature" --	 * currently meaning language and level thereof.	 *	 * @param feature The package name of the feature to test.	 * In Level 1, supported values are "HTML" and "XML" (case-insensitive).	 * At this writing, com.sun.org.apache.xerces.internal.dom supports only XML.	 *	 * @param version The version number of the feature being tested.	 * This is interpreted as "Version of the DOM API supported for the	 * specified Feature", and in Level 1 should be "1.0"	 *	 * @return true iff this implementation is compatable with the specified	 * feature and version.	 */	public boolean hasFeature(String feature, String version) {	    	    boolean anyVersion = version == null || version.length() == 0;	    	    // check if Xalan implementation is around and if yes report true for supporting	    // XPath API	    // if a plus sign "+" is prepended to any feature name, implementations 	    // are considered in which the specified feature may not be directly 	    // castable DOMImplementation.getFeature(feature, version). Without a 	    // plus, only features whose interfaces are directly castable are considered.	    if ((feature.equalsIgnoreCase("+XPath"))       	        && (anyVersion || version.equals("3.0"))) {	        try {	            Class xpathClass = ObjectFactory.findProviderClass(	                "com.sun.org.apache.xpath.internal.domapi.XPathEvaluatorImpl",	                ObjectFactory.findClassLoader(), true);                                // Check if the DOM XPath implementation implements                // the interface org.w3c.dom.XPathEvaluator                Class interfaces[] = xpathClass.getInterfaces();                for (int i = 0; i < interfaces.length; i++) {                    if (interfaces[i].getName().equals(                        "org.w3c.dom.xpath.XPathEvaluator")) {                        return true;                    }                }	        } catch (Exception e) {	            return false;	        }	        return true;	    }	    if (feature.startsWith("+")) {	        feature = feature.substring(1);	    }	    return (	        feature.equalsIgnoreCase("Core")	            && (anyVersion	                || version.equals("1.0")	                || version.equals("2.0")	                || version.equals("3.0")))	                || (feature.equalsIgnoreCase("XML")	            && (anyVersion	                || version.equals("1.0")	                || version.equals("2.0")	                || version.equals("3.0")))	                || (feature.equalsIgnoreCase("LS")	            && (anyVersion || version.equals("3.0")));	} // hasFeature(String,String):boolean	/**	 * Introduced in DOM Level 2. <p>	 *	 * Creates an empty DocumentType node.	 *	 * @param qualifiedName The qualified name of the document type to be created.	 * @param publicID The document type public identifier.	 * @param systemID The document type system identifier.	 * @since WD-DOM-Level-2-19990923	 */	public DocumentType createDocumentType( String qualifiedName,                                    String publicID, String systemID) {		// REVISIT: this might allow creation of invalid name for DOCTYPE		//          xmlns prefix.		//          also there is no way for a user to turn off error checking.		checkQName(qualifiedName);		return new DocumentTypeImpl(null, qualifiedName, publicID, systemID);	}    final void checkQName(String qname){        int index = qname.indexOf(':');        int lastIndex = qname.lastIndexOf(':');        int length = qname.length();        // it is an error for NCName to have more than one ':'        // check if it is valid QName [Namespace in XML production 6]        if (index == 0 || index == length - 1 || lastIndex != index) {            String msg =                DOMMessageFormatter.formatMessage(                    DOMMessageFormatter.DOM_DOMAIN,                    "NAMESPACE_ERR",                    null);            throw new DOMException(DOMException.NAMESPACE_ERR, msg);        }        int start = 0;        // Namespace in XML production [6]        if (index > 0) {            // check that prefix is NCName            if (!XMLChar.isNCNameStart(qname.charAt(start))) {                String msg =                    DOMMessageFormatter.formatMessage(                        DOMMessageFormatter.DOM_DOMAIN,                        "INVALID_CHARACTER_ERR",                        null);                throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg);            }            for (int i = 1; i < index; i++) {                if (!XMLChar.isNCName(qname.charAt(i))) {                    String msg =                        DOMMessageFormatter.formatMessage(                            DOMMessageFormatter.DOM_DOMAIN,                            "INVALID_CHARACTER_ERR",                            null);                    throw new DOMException(                        DOMException.INVALID_CHARACTER_ERR,                        msg);                }            }            start = index + 1;        }        // check local part        if (!XMLChar.isNCNameStart(qname.charAt(start))) {            // REVISIT: add qname parameter to the message            String msg =                DOMMessageFormatter.formatMessage(                    DOMMessageFormatter.DOM_DOMAIN,                    "INVALID_CHARACTER_ERR",                    null);            throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg);        }        for (int i = start + 1; i < length; i++) {            if (!XMLChar.isNCName(qname.charAt(i))) {                String msg =                    DOMMessageFormatter.formatMessage(                        DOMMessageFormatter.DOM_DOMAIN,                        "INVALID_CHARACTER_ERR",                        null);                throw new DOMException(DOMException.INVALID_CHARACTER_ERR, msg);            }        }    }	/**	 * Introduced in DOM Level 2. <p>	 *	 * Creates an XML Document object of the specified type with its document	 * element.	 *	 * @param namespaceURI     The namespace URI of the document	 *                         element to create, or null.	 * @param qualifiedName    The qualified name of the document	 *                         element to create.	 * @param doctype          The type of document to be created or null.<p>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?