xmldocumentscannerimpl.java

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

JAVA
1,359
字号
         *         * @return True if there is more to dispatch either from this         *          or a another dispatcher.         *         * @throws IOException  Thrown on i/o error.         * @throws XNIException Thrown on parse error.         */        public boolean dispatch(boolean complete)            throws IOException, XNIException {            // next dispatcher is prolog regardless of whether there            // is an XMLDecl in this document            setScannerState(SCANNER_STATE_PROLOG);            setDispatcher(fPrologDispatcher);            // scan XMLDecl            try {                if (fEntityScanner.skipString("<?xml")) {                    fMarkupDepth++;                    // NOTE: special case where document starts with a PI                    //       whose name starts with "xml" (e.g. "xmlfoo")                    if (XMLChar.isName(fEntityScanner.peekChar())) {                        fStringBuffer.clear();                        fStringBuffer.append("xml");                        if (fNamespaces) {                            while (XMLChar.isNCName(fEntityScanner.peekChar())) {                                fStringBuffer.append((char)fEntityScanner.scanChar());                            }                        }                        else {                            while (XMLChar.isName(fEntityScanner.peekChar())) {                                fStringBuffer.append((char)fEntityScanner.scanChar());                            }                        }                        String target = fSymbolTable.addSymbol(fStringBuffer.ch, fStringBuffer.offset, fStringBuffer.length);                        scanPIData(target, fString);                    }                    // standard XML declaration                    else {                        scanXMLDeclOrTextDecl(false);                    }                }                fEntityManager.fCurrentEntity.mayReadChunks = true;                // if no XMLDecl, then scan piece of prolog                return true;            }            // encoding errors            catch (MalformedByteSequenceException e) {                fErrorReporter.reportError(e.getDomain(), e.getKey(),                     e.getArguments(), XMLErrorReporter.SEVERITY_FATAL_ERROR);                return false;            }            catch (CharConversionException e) {                reportFatalError("CharConversionFailure", null);                return false;            }            // premature end of file            catch (EOFException e) {                reportFatalError("PrematureEOF", null);                return false;                //throw e;            }        } // dispatch(boolean):boolean    } // class XMLDeclDispatcher    /**     * Dispatcher to handle prolog scanning.     *     * @author Andy Clark, IBM     */    protected final class PrologDispatcher        implements Dispatcher {        //        // Dispatcher methods        //        /**         * Dispatch an XML "event".         *         * @param complete True if this dispatcher is intended to scan         *                 and dispatch as much as possible.         *         * @return True if there is more to dispatch either from this         *          or a another dispatcher.         *         * @throws IOException  Thrown on i/o error.         * @throws XNIException Thrown on parse error.         */        public boolean dispatch(boolean complete)            throws IOException, XNIException {            try {                boolean again;                do {                    again = false;                    switch (fScannerState) {                        case SCANNER_STATE_PROLOG: {                            fEntityScanner.skipSpaces();                            if (fEntityScanner.skipChar('<')) {                                setScannerState(SCANNER_STATE_START_OF_MARKUP);                                again = true;                            }                            else if (fEntityScanner.skipChar('&')) {                                setScannerState(SCANNER_STATE_REFERENCE);                                again = true;                            }                            else {                                setScannerState(SCANNER_STATE_CONTENT);                                again = true;                            }                            break;                        }                        case SCANNER_STATE_START_OF_MARKUP: {                            fMarkupDepth++;                            if (fEntityScanner.skipChar('!')) {                                if (fEntityScanner.skipChar('-')) {                                    if (!fEntityScanner.skipChar('-')) {                                        reportFatalError("InvalidCommentStart",                                                         null);                                    }                                    setScannerState(SCANNER_STATE_COMMENT);                                    again = true;                                }                                else if (fEntityScanner.skipString("DOCTYPE")) {                                    setScannerState(SCANNER_STATE_DOCTYPE);                                    again = true;                                }                                else {                                    reportFatalError("MarkupNotRecognizedInProlog",                                                     null);                                }                            }                            else if (isValidNameStartChar(fEntityScanner.peekChar())) {                                setScannerState(SCANNER_STATE_ROOT_ELEMENT);                                setDispatcher(fContentDispatcher);                                return true;                            }                            else if (fEntityScanner.skipChar('?')) {                                setScannerState(SCANNER_STATE_PI);                                again = true;                            }                            else if (isValidNameStartHighSurrogate(fEntityScanner.peekChar())) {                                setScannerState(SCANNER_STATE_ROOT_ELEMENT);                                setDispatcher(fContentDispatcher);                                return true;                            }                            else {                                reportFatalError("MarkupNotRecognizedInProlog",                                                 null);                            }                            break;                        }                        case SCANNER_STATE_COMMENT: {                            scanComment();                            setScannerState(SCANNER_STATE_PROLOG);                            break;                        }                        case SCANNER_STATE_PI: {                            scanPI();                            setScannerState(SCANNER_STATE_PROLOG);                            break;                        }                        case SCANNER_STATE_DOCTYPE: {                            if (fDisallowDoctype) {                                reportFatalError("DoctypeNotAllowed", null);                            }                            if (fSeenDoctypeDecl) {                                reportFatalError("AlreadySeenDoctype", null);                            }                            fSeenDoctypeDecl = true;                            // scanDoctypeDecl() sends XNI doctypeDecl event that                             // in SAX is converted to startDTD() event.                            if (scanDoctypeDecl()) {                                setScannerState(SCANNER_STATE_DTD_INTERNAL_DECLS);                                setDispatcher(fDTDDispatcher);                                return true;                            }                                                        // handle external subset                            if (fDoctypeSystemId != null) {                                if (((fValidation || fLoadExternalDTD)                                     && (fValidationManager == null || !fValidationManager.isCachedDTD()))) {                                    setScannerState(SCANNER_STATE_DTD_EXTERNAL);                                    setDispatcher(fDTDDispatcher);                                    return true;                                }                            }                            else if (fExternalSubsetSource != null) {                                if (((fValidation || fLoadExternalDTD)                                     && (fValidationManager == null || !fValidationManager.isCachedDTD()))) {                                    // This handles the case of a DOCTYPE that had neither an internal subset or an external subset.                                    fDTDScanner.setInputSource(fExternalSubsetSource);                                    fExternalSubsetSource = null;                                    setScannerState(SCANNER_STATE_DTD_EXTERNAL_DECLS);                                    setDispatcher(fDTDDispatcher);                                    return true;                                }                       	                            }                                                        // Send endDTD() call if:                             // a) systemId is null or if an external subset resolver could not locate an external subset.                            // b) "load-external-dtd" and validation are false                            // c) DTD grammar is cached                                                            // in XNI this results in 3 events:  doctypeDecl, startDTD, endDTD                            // in SAX this results in 2 events: startDTD, endDTD                            fDTDScanner.setInputSource(null);                            setScannerState(SCANNER_STATE_PROLOG);                            break;                        }                        case SCANNER_STATE_CONTENT: {                            reportFatalError("ContentIllegalInProlog", null);                            fEntityScanner.scanChar();                        }                        case SCANNER_STATE_REFERENCE: {                            reportFatalError("ReferenceIllegalInProlog", null);                        }                    }                } while (complete || again);                if (complete) {                    if (fEntityScanner.scanChar() != '<') {                        reportFatalError("RootElementRequired", null);                    }                    setScannerState(SCANNER_STATE_ROOT_ELEMENT);                    setDispatcher(fContentDispatcher);                }            }            // encoding errors            catch (MalformedByteSequenceException e) {                fErrorReporter.reportError(e.getDomain(), e.getKey(),                     e.getArguments(), XMLErrorReporter.SEVERITY_FATAL_ERROR);                return false;            }            catch (CharConversionException e) {                reportFatalError("CharConversionFailure", null);                return false;            }            // premature end of file            catch (EOFException e) {                reportFatalError("PrematureEOF", null);                return false;                //throw e;            }            return true;        } // dispatch(boolean):boolean    } // class PrologDispatcher    /**     * Dispatcher to handle the internal and external DTD subsets.     *     * @author Andy Clark, IBM     */    protected final class DTDDispatcher        implements Dispatcher {        //        // Dispatcher methods        //        /**         * Dispatch an XML "event".         *         * @param complete True if this dispatcher is intended to scan         *                 and dispatch as much as possible.         *         * @return True if there is more to dispatch either from this         *          or a another dispatcher.         *         * @throws IOException  Thrown on i/o error.         * @throws XNIException Thrown on parse error.         */        public boolean dispatch(boolean complete)            throws IOException, XNIException {            fEntityManager.setEntityHandler(null);            try {                boolean again;                XMLEntityDescriptionImpl entityDescription = new XMLEntityDescriptionImpl();                do {                    again = false;                    switch (fScannerState) {                        case SCANNER_STATE_DTD_INTERNAL_DECLS: {                            // REVISIT: Should there be a feature for                            //          the "complete" parameter?                            boolean completeDTD = true;                            boolean moreToScan = fDTDScanner.scanDTDInternalSubset(completeDTD, fStandalone, fHasExternalDTD && fLoadExternalDTD);                            if (!moreToScan) {                                // end doctype declaration                                if (!fEntityScanner.skipChar(']')) {                                    reportFatalError("EXPECTED_SQUARE_BRACKET_TO_CLOSE_INTERNAL_SUBSET",                                                     null);                                }                                fEntityScanner.skipSpaces();                                if (!fEntityScanner.skipChar('>')) {                                    reportFatalError("DoctypedeclUnterminated", new Object[]{fDoctypeName});                                }                                fMarkupDepth--;                                // scan external subset next                                if (fDoctypeSystemId != null) {                                    if ((fValidation || fLoadExternalDTD)                                         && (fValidationManager == null || !fValidationManager.isCachedDTD())) {                                        setScannerState(SCANNER_STATE_DTD_EXTERNAL);                                        break;                                    }                                }                                else if (fExternalSubsetSource != null) {                                    if ((fValidation || fLoadExternalDTD)                                         && (fValidationManager == null || !fValidationManager.isCachedDTD())) {                                        // This handles the case of a DOCTYPE that only had an internal subset.                                        fDTDScanner.setInputSource(fExternalSubsetSource);                                        fExternalSubsetSource = null;                                        setScannerState(SCANNER_STATE_DTD_EXTERNAL_DECLS);                                        break;                                    }                                }                                                                // break out of this dispatcher.                                setScannerState(SCANNER_STATE_PROLOG);                                setDispatcher(fPrologDispatcher);                                fEntityManager.setEntityHandler(XMLDocumentScannerImpl.this);                                return true;                            }                            break;                        }                        case SCANNER_STATE_DTD_EXTERNAL: {                            entityDescription.setDescription("[dtd]", fDoctypePublicId, fDoctypeSystemId, null, null);                            XMLInputSource xmlInputSource =                                fEntityManager.resolveEntity(entityDescription);

⌨️ 快捷键说明

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