domvalidatorhelper.java

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

JAVA
593
字号
/* * Copyright 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.jaxp.validation;import java.io.IOException;import java.util.Enumeration;import java.util.Locale;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.parsers.ParserConfigurationException;import javax.xml.transform.Result;import javax.xml.transform.Source;import javax.xml.transform.dom.DOMResult;import javax.xml.transform.dom.DOMSource;import com.sun.org.apache.xerces.internal.impl.Constants;import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter;import com.sun.org.apache.xerces.internal.impl.validation.EntityState;import com.sun.org.apache.xerces.internal.impl.validation.ValidationManager;import com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator;import com.sun.org.apache.xerces.internal.impl.xs.util.SimpleLocator;import com.sun.org.apache.xerces.internal.util.NamespaceSupport;import com.sun.org.apache.xerces.internal.util.SymbolTable;import com.sun.org.apache.xerces.internal.util.XMLAttributesImpl;import com.sun.org.apache.xerces.internal.util.XMLSymbols;import com.sun.org.apache.xerces.internal.xni.NamespaceContext;import com.sun.org.apache.xerces.internal.xni.QName;import com.sun.org.apache.xerces.internal.xni.XMLString;import com.sun.org.apache.xerces.internal.xni.XNIException;import com.sun.org.apache.xerces.internal.xni.parser.XMLParseException;import org.w3c.dom.Attr;import org.w3c.dom.CDATASection;import org.w3c.dom.Comment;import org.w3c.dom.Document;import org.w3c.dom.DocumentType;import org.w3c.dom.Entity;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.ProcessingInstruction;import org.w3c.dom.Text;import org.xml.sax.SAXException;/** * <p>A validator helper for <code>DOMSource</code>s.</p> *  * @author Michael Glavassevich, IBM * @version $Id: DOMValidatorHelper.java,v 1.1.4.1 2005/09/05 11:38:25 sunithareddy Exp $ */final class DOMValidatorHelper implements ValidatorHelper, EntityState {        //    // Constants    //    /** Chunk size (1024). */    private static final int CHUNK_SIZE = (1 << 10);        /** Chunk mask (CHUNK_SIZE - 1). */    private static final int CHUNK_MASK = CHUNK_SIZE - 1;        // property identifiers        /** Property identifier: error reporter. */    private static final String ERROR_REPORTER =        Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;        /** Property identifier: namespace context. */    private static final String NAMESPACE_CONTEXT =        Constants.XERCES_PROPERTY_PREFIX + Constants.NAMESPACE_CONTEXT_PROPERTY;        /** Property identifier: XML Schema validator. */    private static final String SCHEMA_VALIDATOR =        Constants.XERCES_PROPERTY_PREFIX + Constants.SCHEMA_VALIDATOR_PROPERTY;        /** Property identifier: symbol table. */    private static final String SYMBOL_TABLE =        Constants.XERCES_PROPERTY_PREFIX + Constants.SYMBOL_TABLE_PROPERTY;        /** Property identifier: validation manager. */    private static final String VALIDATION_MANAGER =        Constants.XERCES_PROPERTY_PREFIX + Constants.VALIDATION_MANAGER_PROPERTY;        //    // Data    //        /** Error reporter. */    private XMLErrorReporter fErrorReporter;        /** The namespace context of this document: stores namespaces in scope. **/    private NamespaceSupport fNamespaceContext;        /** The namespace context of the DOMSource, includes context from ancestor nodes. **/    private DOMNamespaceContext fDOMNamespaceContext = new DOMNamespaceContext();        /** Schema validator. **/    private XMLSchemaValidator fSchemaValidator;        /** Symbol table **/    private SymbolTable fSymbolTable;        /** Validation manager. **/    private ValidationManager fValidationManager;        /** Component manager. **/    private XMLSchemaValidatorComponentManager fComponentManager;        /** Simple Locator. **/    private final SimpleLocator fXMLLocator = new SimpleLocator(null, null, -1, -1, -1);        /** DOM document handler. **/    private DOMDocumentHandler fDOMValidatorHandler;        /** DOM result augmentor. **/    private final DOMResultAugmentor fDOMResultAugmentor = new DOMResultAugmentor(this);        /** DOM result builder. **/    private final DOMResultBuilder fDOMResultBuilder = new DOMResultBuilder();        /** Map for tracking unparsed entities. **/    private NamedNodeMap fEntities = null;        /** Array for holding character data. **/    private char [] fCharBuffer = new char[CHUNK_SIZE];        /** Root node. **/    private Node fRoot;        /** Current element. **/    private Node fCurrentElement;        /** Fields for start element, end element and characters. **/    final QName fElementQName = new QName();    final QName fAttributeQName = new QName();    final XMLAttributesImpl fAttributes = new XMLAttributesImpl();     final XMLString fTempString = new XMLString();        public DOMValidatorHelper(XMLSchemaValidatorComponentManager componentManager) {        fComponentManager = componentManager;        fErrorReporter = (XMLErrorReporter) fComponentManager.getProperty(ERROR_REPORTER);        fNamespaceContext = (NamespaceSupport) fComponentManager.getProperty(NAMESPACE_CONTEXT);        fSchemaValidator = (XMLSchemaValidator) fComponentManager.getProperty(SCHEMA_VALIDATOR);        fSymbolTable = (SymbolTable) fComponentManager.getProperty(SYMBOL_TABLE);                fValidationManager = (ValidationManager) fComponentManager.getProperty(VALIDATION_MANAGER);    }        /*     * ValidatorHelper methods     */        public void validate(Source source, Result result)         throws SAXException, IOException {        if (result instanceof DOMResult || result == null) {            final DOMSource domSource = (DOMSource) source;            final DOMResult domResult = (DOMResult) result;            Node node = domSource.getNode();            fRoot = node;            if (node != null) {                fComponentManager.reset();                fValidationManager.setEntityState(this);                fDOMNamespaceContext.reset();                String systemId = domSource.getSystemId();                fXMLLocator.setLiteralSystemId(systemId);                fXMLLocator.setExpandedSystemId(systemId);                fErrorReporter.setDocumentLocator(fXMLLocator);                try {                    // regardless of what type of node this is, fire start and end document events                    setupEntityMap((node.getNodeType() == Node.DOCUMENT_NODE) ? (Document) node : node.getOwnerDocument());                    setupDOMResultHandler(domSource, domResult);                    fSchemaValidator.startDocument(fXMLLocator, null, fDOMNamespaceContext, null);                    validate(node);                    fSchemaValidator.endDocument(null);                }                catch (XMLParseException e) {                    throw Util.toSAXParseException(e);                }                catch (XNIException e) {                    throw Util.toSAXException(e);                }                finally {                    // Release references to application objects                    fRoot = null;                    fCurrentElement = null;                    fEntities = null;                    if (fDOMValidatorHandler != null) {                        fDOMValidatorHandler.setDOMResult(null);                    }                }            }            return;        }        throw new IllegalArgumentException(JAXPValidationMessageFormatter.formatMessage(Locale.getDefault(),                 "SourceResultMismatch",                 new Object [] {source.getClass().getName(), result.getClass().getName()}));    }        /*     * EntityState methods     */        public boolean isEntityDeclared(String name) {        return false;    }        public boolean isEntityUnparsed(String name) {        if (fEntities != null) {            Entity entity = (Entity) fEntities.getNamedItem(name);            if (entity != null) {                return (entity.getNotationName() != null);            }        }        return false;    }        /*     * Other methods     */        /** Traverse the DOM and fire events to the schema validator. */    private void validate(Node node) {        final Node top = node;        // Performs a non-recursive traversal of the DOM. This        // will avoid a stack overflow for DOMs with high depth.        while (node != null) {            beginNode(node);            Node next = node.getFirstChild();            while (next == null) {                finishNode(node);                           if (top == node) {                    break;                }                next = node.getNextSibling();                if (next == null) {                    node = node.getParentNode();                    if (node == null || top == node) {                        if (node != null) {                            finishNode(node);                        }                        next = null;                        break;                    }                }            }            node = next;        }    }        /** Do processing for the start of a node. */    private void beginNode(Node node) {        switch (node.getNodeType()) {            case Node.ELEMENT_NODE:                fCurrentElement = node;                // push namespace context                fNamespaceContext.pushContext();                // start element                fillQName(fElementQName, node);                processAttributes(node.getAttributes());                fSchemaValidator.startElement(fElementQName, fAttributes, null);                break;            case Node.TEXT_NODE:                if (fDOMValidatorHandler != null) {                    fDOMValidatorHandler.setIgnoringCharacters(true);                    sendCharactersToValidator(node.getNodeValue());                    fDOMValidatorHandler.setIgnoringCharacters(false);                    fDOMValidatorHandler.characters((Text) node);                }                else {                    sendCharactersToValidator(node.getNodeValue());                }                break;            case Node.CDATA_SECTION_NODE:                if (fDOMValidatorHandler != null) {                    fDOMValidatorHandler.setIgnoringCharacters(true);                    fSchemaValidator.startCDATA(null);                    sendCharactersToValidator(node.getNodeValue());                    fSchemaValidator.endCDATA(null);                    fDOMValidatorHandler.setIgnoringCharacters(false);                    fDOMValidatorHandler.cdata((CDATASection) node);                }                else {                    fSchemaValidator.startCDATA(null);                    sendCharactersToValidator(node.getNodeValue());

⌨️ 快捷键说明

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