saxparserimpl.java
来自「JAVA 所有包」· Java 代码 · 共 613 行 · 第 1/2 页
JAVA
613 行
/* * Copyright 2000-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;import java.io.IOException;import java.util.Enumeration;import java.util.HashMap;import java.util.Hashtable;import java.util.Iterator;import java.util.Map;import javax.xml.XMLConstants;import javax.xml.validation.Schema;import com.sun.org.apache.xerces.internal.impl.Constants;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.XSMessageFormatter;import com.sun.org.apache.xerces.internal.jaxp.validation.XSGrammarPoolContainer;import com.sun.org.apache.xerces.internal.util.SAXMessageFormatter;import com.sun.org.apache.xerces.internal.util.SecurityManager;import com.sun.org.apache.xerces.internal.xni.XMLDocumentHandler;import com.sun.org.apache.xerces.internal.xni.parser.XMLComponent;import com.sun.org.apache.xerces.internal.xni.parser.XMLComponentManager;import com.sun.org.apache.xerces.internal.xni.parser.XMLConfigurationException;import com.sun.org.apache.xerces.internal.xni.parser.XMLDTDFilter;import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource;import com.sun.org.apache.xerces.internal.xni.parser.XMLParserConfiguration;import com.sun.org.apache.xerces.internal.xs.AttributePSVI;import com.sun.org.apache.xerces.internal.xs.ElementPSVI;import com.sun.org.apache.xerces.internal.xs.PSVIProvider;import org.xml.sax.EntityResolver;import org.xml.sax.ErrorHandler;import org.xml.sax.InputSource;import org.xml.sax.Parser;import org.xml.sax.SAXException;import org.xml.sax.SAXNotRecognizedException;import org.xml.sax.SAXNotSupportedException;import org.xml.sax.XMLReader;/** * This is the implementation specific class for the * <code>javax.xml.parsers.SAXParser</code>. * * @author Rajiv Mordani * @author Edwin Goei * * @version $Id: SAXParserImpl.java,v 1.2.6.1 2005/09/05 11:01:30 sunithareddy Exp $ */public class SAXParserImpl extends javax.xml.parsers.SAXParser implements JAXPConstants, PSVIProvider { /** Feature identifier: namespaces. */ private static final String NAMESPACES_FEATURE = Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACES_FEATURE; /** Feature identifier: namespace prefixes. */ private static final String NAMESPACE_PREFIXES_FEATURE = Constants.SAX_FEATURE_PREFIX + Constants.NAMESPACE_PREFIXES_FEATURE; /** Feature identifier: validation. */ private static final String VALIDATION_FEATURE = Constants.SAX_FEATURE_PREFIX + Constants.VALIDATION_FEATURE; /** Feature identifier: XML Schema validation */ private static final String XMLSCHEMA_VALIDATION_FEATURE = Constants.XERCES_FEATURE_PREFIX + Constants.SCHEMA_VALIDATION_FEATURE; /** Feature identifier: XInclude processing */ private static final String XINCLUDE_FEATURE = Constants.XERCES_FEATURE_PREFIX + Constants.XINCLUDE_FEATURE; /** Property identifier: security manager. */ private static final String SECURITY_MANAGER = Constants.XERCES_PROPERTY_PREFIX + Constants.SECURITY_MANAGER_PROPERTY; private JAXPSAXParser xmlReader; private String schemaLanguage = null; // null means DTD private final Schema grammar; private XMLComponent fSchemaValidator; private XMLComponentManager fSchemaValidatorComponentManager; private ValidationManager fSchemaValidationManager; /** Initial ErrorHandler */ private final ErrorHandler fInitErrorHandler; /** Initial EntityResolver */ private final EntityResolver fInitEntityResolver; /** * Create a SAX parser with the associated features * @param features Hashtable of SAX features, may be null */ SAXParserImpl(SAXParserFactoryImpl spf, Hashtable features) throws SAXException { this(spf, features, false); } /** * Create a SAX parser with the associated features * @param features Hashtable of SAX features, may be null */ SAXParserImpl(SAXParserFactoryImpl spf, Hashtable features, boolean secureProcessing) throws SAXException { // Instantiate a SAXParser directly and not through SAX so that we use the right ClassLoader xmlReader = new JAXPSAXParser(this); // JAXP "namespaceAware" == SAX Namespaces feature // Note: there is a compatibility problem here with default values: // JAXP default is false while SAX 2 default is true! xmlReader.setFeature0(NAMESPACES_FEATURE, spf.isNamespaceAware()); // SAX "namespaces" and "namespace-prefixes" features should not // both be false. We make them opposite for backward compatibility // since JAXP 1.0 apps may want to receive xmlns* attributes. xmlReader.setFeature0(NAMESPACE_PREFIXES_FEATURE, !spf.isNamespaceAware()); // Avoid setting the XInclude processing feature if the value is false. // This will keep the configuration from throwing an exception if it // does not support XInclude. if (spf.isXIncludeAware()) { xmlReader.setFeature0(XINCLUDE_FEATURE, true); } // If the secure processing feature is on set a security manager. if (secureProcessing) { xmlReader.setProperty0(SECURITY_MANAGER, new SecurityManager()); } // Set application's features, followed by validation features. setFeatures(features); // If validating, provide a default ErrorHandler that prints // validation errors with a warning telling the user to set an // ErrorHandler. if (spf.isValidating()) { fInitErrorHandler = new DefaultValidationErrorHandler(); xmlReader.setErrorHandler(fInitErrorHandler); } else { fInitErrorHandler = xmlReader.getErrorHandler(); } xmlReader.setFeature0(VALIDATION_FEATURE, spf.isValidating()); // Get the Schema object from the factory this.grammar = spf.getSchema(); if (grammar != null) { XMLParserConfiguration config = xmlReader.getXMLParserConfiguration(); XMLComponent validatorComponent = null; /** For Xerces grammars, use built-in schema validator. **/ if (grammar instanceof XSGrammarPoolContainer) { validatorComponent = new XMLSchemaValidator(); fSchemaValidationManager = new ValidationManager(); XMLDTDFilter entityHandler = new UnparsedEntityHandler(fSchemaValidationManager); config.setDTDHandler(entityHandler); entityHandler.setDTDHandler(xmlReader); xmlReader.setDTDSource(entityHandler); fSchemaValidatorComponentManager = new SchemaValidatorConfiguration(config, (XSGrammarPoolContainer) grammar, fSchemaValidationManager); } /** For third party grammars, use the JAXP validator component. **/ else { validatorComponent = new JAXPValidatorComponent(grammar.newValidatorHandler()); fSchemaValidatorComponentManager = config; } config.addRecognizedFeatures(validatorComponent.getRecognizedFeatures()); config.addRecognizedProperties(validatorComponent.getRecognizedProperties()); config.setDocumentHandler((XMLDocumentHandler) validatorComponent); ((XMLDocumentSource)validatorComponent).setDocumentHandler(xmlReader); xmlReader.setDocumentSource((XMLDocumentSource) validatorComponent); fSchemaValidator = validatorComponent; } // Initial EntityResolver fInitEntityResolver = xmlReader.getEntityResolver(); } /** * Set any features of our XMLReader based on any features set on the * SAXParserFactory. * * XXX Does not handle possible conflicts between SAX feature names and * JAXP specific feature names, eg. SAXParserFactory.isValidating() */ private void setFeatures(Hashtable features) throws SAXNotSupportedException, SAXNotRecognizedException { if (features != null) { for (Enumeration e = features.keys(); e.hasMoreElements();) { String feature = (String)e.nextElement(); boolean value = ((Boolean)features.get(feature)).booleanValue(); xmlReader.setFeature0(feature, value); } } } public Parser getParser() throws SAXException { // Xerces2 AbstractSAXParser implements SAX1 Parser // assert(xmlReader instanceof Parser); return (Parser) xmlReader; } /** * Returns the XMLReader that is encapsulated by the implementation of * this class. */ public XMLReader getXMLReader() { return xmlReader; } public boolean isNamespaceAware() { try { return xmlReader.getFeature(NAMESPACES_FEATURE); } catch (SAXException x) { throw new IllegalStateException(x.getMessage()); } } public boolean isValidating() { try { return xmlReader.getFeature(VALIDATION_FEATURE); } catch (SAXException x) { throw new IllegalStateException(x.getMessage()); } } /** * Gets the XInclude processing mode for this parser * @return the state of XInclude processing mode */ public boolean isXIncludeAware() { try { return xmlReader.getFeature(XINCLUDE_FEATURE); } catch (SAXException exc) { return false; } } /** * Sets the particular property in the underlying implementation of * org.xml.sax.XMLReader. */ public void setProperty(String name, Object value) throws SAXNotRecognizedException, SAXNotSupportedException { xmlReader.setProperty(name, value); } /** * returns the particular property requested for in the underlying * implementation of org.xml.sax.XMLReader. */ public Object getProperty(String name) throws SAXNotRecognizedException, SAXNotSupportedException { return xmlReader.getProperty(name); } public Schema getSchema() { return grammar; } public void reset() { try { /** Restore initial values of features and properties. **/ xmlReader.restoreInitState(); } catch (SAXException exc) { // This should never happen. We only store recognized // features and properties in the hash maps. For now // just ignore it. } /** Restore various handlers. **/ xmlReader.setContentHandler(null); xmlReader.setDTDHandler(null); if (xmlReader.getErrorHandler() != fInitErrorHandler) { xmlReader.setErrorHandler(fInitErrorHandler); } if (xmlReader.getEntityResolver() != fInitEntityResolver) { xmlReader.setEntityResolver(fInitEntityResolver); } } /* * PSVIProvider methods */ public ElementPSVI getElementPSVI() { return ((PSVIProvider)xmlReader).getElementPSVI(); }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?