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 + -
显示快捷键?