xincludehandler.java

来自「JAVA的一些源码 JAVA2 STANDARD EDITION DEVELO」· Java 代码 · 共 1,656 行 · 第 1/5 页

JAVA
1,656
字号
/* * The Apache Software License, Version 1.1 * * * Copyright (c) 2001-2004 The Apache Software Foundation.  All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright *    notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright *    notice, this list of conditions and the following disclaimer in *    the documentation and/or other materials provided with the *    distribution. * * 3. The end-user documentation included with the redistribution, *    if any, must include the following acknowledgment: *       "This product includes software developed by the *        Apache Software Foundation (http://www.apache.org/)." *    Alternately, this acknowledgment may appear in the software itself, *    if and wherever such third-party acknowledgments normally appear. * * 4. The names "Xerces" and "Apache Software Foundation" must *    not be used to endorse or promote products derived from this *    software without prior written permission. For written *    permission, please contact apache@apache.org. * * 5. Products derived from this software may not be called "Apache", *    nor may "Apache" appear in their name, without prior written *    permission of the Apache Software Foundation. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation and was * originally based on software copyright (c) 2003, International * Business Machines, Inc., http://www.apache.org.  For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. */package com.sun.org.apache.xerces.internal.xinclude;import java.io.CharConversionException;import java.io.IOException;import java.io.InputStream;import java.io.Reader;import java.net.HttpURLConnection;import java.net.URL;import java.net.URLConnection;import java.util.Enumeration;import java.util.Stack;import java.util.StringTokenizer;import java.util.Vector;import com.sun.org.apache.xerces.internal.impl.Constants;import com.sun.org.apache.xerces.internal.impl.XMLEntityManager;import com.sun.org.apache.xerces.internal.impl.XMLErrorReporter;import com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException;import com.sun.org.apache.xerces.internal.impl.msg.XMLMessageFormatter;import com.sun.org.apache.xerces.internal.util.AugmentationsImpl;import com.sun.org.apache.xerces.internal.util.IntStack;import com.sun.org.apache.xerces.internal.util.ParserConfigurationSettings;import com.sun.org.apache.xerces.internal.util.SecurityManager;import com.sun.org.apache.xerces.internal.util.URI;import com.sun.org.apache.xerces.internal.util.XMLAttributesImpl;import com.sun.org.apache.xerces.internal.util.XMLResourceIdentifierImpl;import com.sun.org.apache.xerces.internal.util.XMLSymbols;import com.sun.org.apache.xerces.internal.util.URI.MalformedURIException;import com.sun.org.apache.xerces.internal.xni.Augmentations;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.XMLAttributes;import com.sun.org.apache.xerces.internal.xni.XMLDTDHandler;import com.sun.org.apache.xerces.internal.xni.XMLDocumentHandler;import com.sun.org.apache.xerces.internal.xni.XMLLocator;import com.sun.org.apache.xerces.internal.xni.XMLResourceIdentifier;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.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.XMLDTDSource;import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentFilter;import com.sun.org.apache.xerces.internal.xni.parser.XMLDocumentSource;import com.sun.org.apache.xerces.internal.xni.parser.XMLEntityResolver;import com.sun.org.apache.xerces.internal.xni.parser.XMLInputSource;import com.sun.org.apache.xerces.internal.xni.parser.XMLParserConfiguration;/** * <p> * This is a pipeline component which performs XInclude handling, according to the * W3C specification for XML Inclusions. * </p> * <p> * This component analyzes each event in the pipeline, looking for &lt;include&gt; * elements. An &lt;include&gt; element is one which has a namespace of * <code>http://www.w3.org/2001/XInclude</code> and a localname of <code>include</code>. * When it finds an &lt;include&gt; element, it attempts to include the file specified * in the <code>href</code> attribute of the element.  If inclusion succeeds, all * children of the &lt;include&gt; element are ignored (with the exception of * checking for invalid children as outlined in the specification).  If the inclusion * fails, the &lt;fallback&gt; child of the &lt;include&gt; element is processed. * </p> * <p> * See the <a href="http://www.w3.org/TR/xinclude/">XInclude specification</a> for * more information on how XInclude is to be used. * </p> * <p> * This component requires the following features and properties from the * component manager that uses it: * <ul> *  <li>http://xml.org/sax/features/allow-dtd-events-after-endDTD</li> *  <li>http://apache.org/xml/properties/internal/error-reporter</li> *  <li>http://apache.org/xml/properties/internal/entity-resolver</li> * </ul> * Furthermore, the <code>NamespaceContext</code> used in the pipeline is required * to be an instance of <code>XIncludeNamespaceSupport</code>. * </p> * <p> * Currently, this implementation has only partial support for the XInclude specification. * Specifically, it is missing support for XPointer document fragments.  Thus, only whole * documents can be included using this component in the pipeline. * </p> * * @author Peter McCracken, IBM * * @version $Id: XIncludeHandler.java,v 1.26 2004/04/15 04:51:56 mrglavas Exp $ * * @see XIncludeNamespaceSupport */public class XIncludeHandlerimplements XMLComponent, XMLDocumentFilter, XMLDTDFilter {        //Xpointer support    //START    public final static String XPOINTER_DEFAULT_CONFIGURATION =    "com.sun.org.apache.xerces.internal.parsers.XPointerParserConfiguration";    protected static final String XPOINTER_SCHEMA =    Constants.XERCES_PROPERTY_PREFIX + Constants.XPOINTER_SCHEMA_PROPERTY;    protected static final String XINCLUDE_AWARE =    Constants.XERCES_FEATURE_PREFIX + Constants.XINCLUDE_AWARE ;        //END    public final static String XINCLUDE_DEFAULT_CONFIGURATION =    "com.sun.org.apache.xerces.internal.parsers.XIncludeParserConfiguration";    public final static String HTTP_ACCEPT = "Accept";    public final static String HTTP_ACCEPT_LANGUAGE = "Accept-Language";    public final static String HTTP_ACCEPT_CHARSET = "Accept-Charset";    public final static String XPOINTER = "xpointer";        public final static String XINCLUDE_NS_URI =    "http://www.w3.org/2001/XInclude".intern();    public final static String XINCLUDE_INCLUDE = "include".intern();    public final static String XINCLUDE_FALLBACK = "fallback".intern();    public final static String XINCLUDE_PARSE_XML = "xml".intern();    public final static String XINCLUDE_PARSE_TEXT = "text".intern();        public final static String XINCLUDE_ATTR_HREF = "href".intern();    public final static String XINCLUDE_ATTR_PARSE = "parse".intern();    public final static String XINCLUDE_ATTR_ENCODING = "encoding".intern();    public final static String XINCLUDE_ATTR_ACCEPT = "accept".intern();    public final static String XINCLUDE_ATTR_ACCEPT_LANGUAGE = "accept-language".intern();    public final static String XINCLUDE_ATTR_ACCEPT_CHARSET = "accept-charset".intern();        // Top Level Information Items have [included] property in infoset    public final static String XINCLUDE_INCLUDED = "[included]".intern();        /** The identifier for the Augmentation that contains the current base URI */    public final static String CURRENT_BASE_URI = "currentBaseURI";        // used for adding [base URI] attributes    public final static String XINCLUDE_BASE = "base";    public final static QName XML_BASE_QNAME =    new QName(    XMLSymbols.PREFIX_XML,    XINCLUDE_BASE,    XMLSymbols.PREFIX_XML + ":" + XINCLUDE_BASE,    NamespaceContext.XML_URI);        public final static QName NEW_NS_ATTR_QNAME =    new QName(    XMLSymbols.PREFIX_XMLNS,    "",    XMLSymbols.PREFIX_XMLNS + ":",    NamespaceContext.XMLNS_URI);        // Processing States    private final static int STATE_NORMAL_PROCESSING = 1;    // we go into this state after a successful include (thus we ignore the children    // of the include) or after a fallback    private final static int STATE_IGNORE = 2;    // we go into this state after a failed include.  If we don't encounter a fallback    // before we reach the end include tag, it's a fatal error    private final static int STATE_EXPECT_FALLBACK = 3;        // recognized features and properties        /** Feature identifier: allow notation and unparsed entity events to be sent out of order. */    protected static final String ALLOW_UE_AND_NOTATION_EVENTS =    Constants.SAX_FEATURE_PREFIX    + Constants.ALLOW_DTD_EVENTS_AFTER_ENDDTD_FEATURE;        /** Property identifier: error reporter. */    protected static final String ERROR_REPORTER =    Constants.XERCES_PROPERTY_PREFIX + Constants.ERROR_REPORTER_PROPERTY;        /** Property identifier: entity resolver. */    protected static final String ENTITY_RESOLVER =    Constants.XERCES_PROPERTY_PREFIX + Constants.ENTITY_RESOLVER_PROPERTY;        /** property identifier: security manager. */    protected static final String SECURITY_MANAGER =    Constants.XERCES_PROPERTY_PREFIX + Constants.SECURITY_MANAGER_PROPERTY;        /** Recognized features. */    private static final String[] RECOGNIZED_FEATURES =    { ALLOW_UE_AND_NOTATION_EVENTS };        /** Feature defaults. */    private static final Boolean[] FEATURE_DEFAULTS = { Boolean.TRUE };        /** Recognized properties. */        private static final String[] RECOGNIZED_PROPERTIES =    { ERROR_REPORTER, ENTITY_RESOLVER, XPOINTER_SCHEMA };    /** Property defaults. */    private static final Object[] PROPERTY_DEFAULTS = { null, null, null };        // instance variables        // for XMLDocumentFilter    protected XMLDocumentHandler fDocumentHandler;    protected XMLDocumentSource fDocumentSource;        protected XPointerFramework fXPointerFramework = null;    protected XPointerSchema [] fXPointerSchema;        // for XMLDTDFilter    protected XMLDTDHandler fDTDHandler;    protected XMLDTDSource fDTDSource;        // for XIncludeHandler    protected XIncludeHandler fParentXIncludeHandler;        // It's "feels wrong" to store this value here.  However,    // calculating it can be time consuming, so we cache it.    // It's never going to change in the lifetime of this XIncludeHandler    protected String fParentRelativeURI;        // we cache the child parser configuration, so we don't have to re-create    // the objects when the parser is re-used    protected XMLParserConfiguration fChildConfig;        protected XMLLocator fDocLocation;    protected XIncludeNamespaceSupport fNamespaceContext;    protected XMLErrorReporter fErrorReporter;    protected XMLEntityResolver fEntityResolver;    protected SecurityManager fSecurityManager;        // these are needed for XML Base processing    protected XMLResourceIdentifier fCurrentBaseURI;    protected IntStack baseURIScope;    protected Stack baseURI;    protected Stack literalSystemID;    protected Stack expandedSystemID;        // used for passing features on to child XIncludeHandler objects    protected ParserConfigurationSettings fSettings;        // The current element depth.  We start at depth 0 (before we've reached any elements)    // The first element is at depth 1.    private int fDepth;        // this value must be at least 1    private static final int INITIAL_SIZE = 8;        // Used to ensure that fallbacks are always children of include elements,    // and that include elements are never children of other include elements.    // An index contains true if the ancestor of the current element which resides    // at that depth was an include element.    private boolean[] fSawInclude = new boolean[INITIAL_SIZE];        // Ensures that only one fallback element can be at a single depth.    // An index contains true if we have seen any fallback elements at that depth,    // and it is only reset to false when the end tag of the parent is encountered.    private boolean[] fSawFallback = new boolean[INITIAL_SIZE];        // The state of the processor at each given depth.    private int[] fState = new int[INITIAL_SIZE];        // buffering the necessary DTD events    private Vector fNotations;    private Vector fUnparsedEntities;        // for SAX compatibility.    // Has the value of the ALLOW_UE_AND_NOTATION_EVENTS feature    private boolean fSendUEAndNotationEvents;        // track the version of the document being parsed    private boolean fIsXML11;        // track whether a DTD is being parsed    private boolean fInDTD;        // Constructors        public XIncludeHandler() {        fDepth = 0;                fSawFallback[fDepth] = false;        fSawInclude[fDepth] = false;        fState[fDepth] = STATE_NORMAL_PROCESSING;        fNotations = new Vector();        fUnparsedEntities = new Vector();

⌨️ 快捷键说明

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