xmlnsdocumentscannerimpl.java

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

JAVA
815
字号
        // name        fEntityScanner.scanQName(fAttributeQName);        // equals        fEntityScanner.skipSpaces();        if (!fEntityScanner.skipChar('=')) {            reportFatalError("EqRequiredInAttribute",                             new Object[]{fCurrentElement.rawname,fAttributeQName.rawname});        }        fEntityScanner.skipSpaces();        // content        int attrIndex;               if (fBindNamespaces) {            attrIndex = attributes.getLength();            attributes.addAttributeNS(fAttributeQName, XMLSymbols.fCDATASymbol, null);        }        else {            int oldLen = attributes.getLength();            attrIndex = attributes.addAttribute(fAttributeQName, XMLSymbols.fCDATASymbol, null);        	            // WFC: Unique Att Spec            if (oldLen == attributes.getLength()) {                reportFatalError("AttributeNotUnique",                                 new Object[]{fCurrentElement.rawname,                                 fAttributeQName.rawname});            }        }        //REVISIT: one more case needs to be included: external PE and standalone is no        boolean isVC =  fHasExternalDTD && !fStandalone;        scanAttributeValue(this.fTempString, fTempString2,                           fAttributeQName.rawname, isVC,                            fCurrentElement.rawname);        String value = fTempString.toString();        attributes.setValue(attrIndex, value);        attributes.setNonNormalizedValue(attrIndex, fTempString2.toString());        attributes.setSpecified(attrIndex, true);        // record namespace declarations if any.        if (fBindNamespaces) {                        String localpart = fAttributeQName.localpart;            String prefix = fAttributeQName.prefix != null                            ? fAttributeQName.prefix : XMLSymbols.EMPTY_STRING;            // when it's of form xmlns="..." or xmlns:prefix="...",            // it's a namespace declaration. but prefix:xmlns="..." isn't.            if (prefix == XMLSymbols.PREFIX_XMLNS ||                prefix == XMLSymbols.EMPTY_STRING && localpart == XMLSymbols.PREFIX_XMLNS) {                // get the internalized value of this attribute                String uri = fSymbolTable.addSymbol(value);                // 1. "xmlns" can't be bound to any namespace                if (prefix == XMLSymbols.PREFIX_XMLNS && localpart == XMLSymbols.PREFIX_XMLNS) {                    fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN,                                               "CantBindXMLNS",                                               new Object[]{fAttributeQName},                                               XMLErrorReporter.SEVERITY_FATAL_ERROR);                }                // 2. the namespace for "xmlns" can't be bound to any prefix                if (uri == NamespaceContext.XMLNS_URI) {                    fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN,                                               "CantBindXMLNS",                                               new Object[]{fAttributeQName},                                               XMLErrorReporter.SEVERITY_FATAL_ERROR);                }                // 3. "xml" can't be bound to any other namespace than it's own                if (localpart == XMLSymbols.PREFIX_XML) {                    if (uri != NamespaceContext.XML_URI) {                        fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN,                                                   "CantBindXML",                                                   new Object[]{fAttributeQName},                                                   XMLErrorReporter.SEVERITY_FATAL_ERROR);                    }                }                // 4. the namespace for "xml" can't be bound to any other prefix                else {                    if (uri ==NamespaceContext.XML_URI) {                        fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN,                                                   "CantBindXML",                                                   new Object[]{fAttributeQName},                                                   XMLErrorReporter.SEVERITY_FATAL_ERROR);                    }                }                prefix = localpart != XMLSymbols.PREFIX_XMLNS ? localpart : XMLSymbols.EMPTY_STRING;                // http://www.w3.org/TR/1999/REC-xml-names-19990114/#dt-prefix                // We should only report an error if there is a prefix,                // that is, the local part is not "xmlns". -SG                if (uri == XMLSymbols.EMPTY_STRING && localpart != XMLSymbols.PREFIX_XMLNS) {                    fErrorReporter.reportError(XMLMessageFormatter.XMLNS_DOMAIN,                                               "EmptyPrefixedAttName",                                               new Object[]{fAttributeQName},                                               XMLErrorReporter.SEVERITY_FATAL_ERROR);                }                // declare prefix in context                fNamespaceContext.declarePrefix(prefix, uri.length() != 0 ? uri : null);                // bind namespace attribute to a namespace                attributes.setURI(attrIndex, fNamespaceContext.getURI(XMLSymbols.PREFIX_XMLNS));            }            else {                // attempt to bind attribute                if (fAttributeQName.prefix != null) {                    attributes.setURI(attrIndex, fNamespaceContext.getURI(fAttributeQName.prefix));                }            }        }        if (DEBUG_CONTENT_SCANNING) System.out.println("<<< scanAttribute()");    } // scanAttribute(XMLAttributes)    /**     * Scans an end element.     * <p>     * <pre>     * [42] ETag ::= '&lt;/' Name S? '>'     * </pre>     * <p>     * <strong>Note:</strong> This method uses the fElementQName variable.     * The contents of this variable will be destroyed. The caller should     * copy the needed information out of this variable before calling     * this method.     *     * @return The element depth.     */    protected int scanEndElement() throws IOException, XNIException {        if (DEBUG_CONTENT_SCANNING) System.out.println(">>> scanEndElement()");        // pop context        fElementStack.popElement(fElementQName) ;        // Take advantage of the fact that next string _should_ be "fElementQName.rawName",        //In scanners most of the time is consumed on checks done for XML characters, we can        // optimize on it and avoid the checks done for endElement,        //we will also avoid symbol table lookup - neeraj.bajaj@sun.com        // this should work both for namespace processing true or false...        //REVISIT: if the string is not the same as expected.. we need to do better error handling..        //We can skip this for now... In any case if the string doesn't match -- document is not well formed.        if (!fEntityScanner.skipString(fElementQName.rawname)) {            reportFatalError("ETagRequired", new Object[]{fElementQName.rawname});        }        // end        fEntityScanner.skipSpaces();        if (!fEntityScanner.skipChar('>')) {            reportFatalError("ETagUnterminated",                             new Object[]{fElementQName.rawname});        }        fMarkupDepth--;        //we have increased the depth for two markup "<" characters        fMarkupDepth--;        // check that this element was opened in the same entity        if (fMarkupDepth < fEntityStack[fEntityDepth - 1]) {            reportFatalError("ElementEntityMismatch",                             new Object[]{fCurrentElement.rawname});        }        // call handler        if (fDocumentHandler != null ) {            fDocumentHandler.endElement(fElementQName, null);            if (fBindNamespaces) {                fNamespaceContext.popContext();            }        }        return fMarkupDepth;    } // scanEndElement():int    public void reset(XMLComponentManager componentManager)    throws XMLConfigurationException {        super.reset(componentManager);        fPerformValidation = false;        fBindNamespaces = false;    }    /** Creates a content dispatcher. */    protected Dispatcher createContentDispatcher() {        return new NSContentDispatcher();    } // createContentDispatcher():Dispatcher    /**     * Dispatcher to handle content scanning.     */    protected final class NSContentDispatcher        extends ContentDispatcher {                /**         * Scan for root element hook. This method is a hook for         * subclasses to add code that handles scanning for the root         * element. This method will also attempt to remove DTD validator         * from the pipeline, if there is no DTD grammar. If DTD validator         * is no longer in the pipeline bind namespaces in the scanner.         *         *         * @return True if the caller should stop and return true which         *          allows the scanner to switch to a new scanning         *          dispatcher. A return value of false indicates that         *          the content dispatcher should continue as normal.         */        protected boolean scanRootElementHook()            throws IOException, XNIException {                   if (fExternalSubsetResolver != null && !fSeenDoctypeDecl                && !fDisallowDoctype && (fValidation || fLoadExternalDTD)) {                scanStartElementName();                resolveExternalSubsetAndRead();                reconfigurePipeline();                if (scanStartElementAfterName()) {                    setScannerState(SCANNER_STATE_TRAILING_MISC);                    setDispatcher(fTrailingMiscDispatcher);                    return true;                }            }            else {                reconfigurePipeline();                if (scanStartElement()) {                    setScannerState(SCANNER_STATE_TRAILING_MISC);                    setDispatcher(fTrailingMiscDispatcher);                    return true;                }            }            return false;        } // scanRootElementHook():boolean                /**         * Re-configures pipeline by removing the DTD validator          * if no DTD grammar exists. If no validator exists in the         * pipeline or there is no DTD grammar, namespace binding         * is performed by the scanner in the enclosing class.         */        private void reconfigurePipeline() {            if (fDTDValidator == null) {                fBindNamespaces = true;            }            else if (!fDTDValidator.hasGrammar()) {                fBindNamespaces = true;                fPerformValidation = fDTDValidator.validate();                // re-configure pipeline                XMLDocumentSource source = fDTDValidator.getDocumentSource();                XMLDocumentHandler handler = fDTDValidator.getDocumentHandler();                source.setDocumentHandler(handler);                if (handler != null)                    handler.setDocumentSource(source);                fDTDValidator.setDocumentSource(null);                fDTDValidator.setDocumentHandler(null);            }        } // reconfigurePipeline()    }} // class XMLNSDocumentScannerImpl

⌨️ 快捷键说明

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