xpointerhandler.java

来自「JAVA 所有包」· Java 代码 · 共 1,245 行 · 第 1/4 页

JAVA
1,245
字号
                CHARTYPE_OTHER = 1, // not special - one of "#%&;?\`{}~" or DEL                CHARTYPE_WHITESPACE = 2, // one of "\t\n\r " (0x09, 0x0A, 0x0D, 0x20)                CHARTYPE_CARRET = 3, // ^                CHARTYPE_OPEN_PAREN = 4, // '(' (0x28)                CHARTYPE_CLOSE_PAREN = 5, // ')' (0x29)                CHARTYPE_MINUS = 6, // '-' (0x2D)                CHARTYPE_PERIOD = 7, // '.' (0x2E)                CHARTYPE_SLASH = 8, // '/' (0x2F)                CHARTYPE_DIGIT = 9, // '0'-'9' (0x30 to 0x39)                CHARTYPE_COLON = 10, // ':' (0x3A)                CHARTYPE_EQUAL = 11, // '=' (0x3D)                CHARTYPE_LETTER = 12, // 'A'-'Z' or 'a'-'z' (0x41 to 0x5A and 0x61 to 0x7A)                CHARTYPE_UNDERSCORE = 13, // '_' (0x5F)                CHARTYPE_NONASCII = 14; // Non-ASCII Unicode codepoint (>= 0x80)        private final byte[] fASCIICharMap = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2,                0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,                2, 1, 1, 1, 1, 1, 1, 1, 4, 5, 1, 1, 1, 6, 7, 8, 9, 9, 9, 9, 9,                9, 9, 9, 9, 9, 10, 1, 1, 11, 1, 1, 1, 12, 12, 12, 12, 12, 12,                12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,                12, 12, 12, 12, 1, 1, 1, 3, 13, 1, 12, 12, 12, 12, 12, 12, 12,                12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,                12, 12, 12, 1, 1, 1, 1, 1 };        //        // Data        //        /** Symbol table. */        private SymbolTable fSymbolTable;        /**          * Constructs an XPointer Framework expression scanner.          *         * @param symbolTable SymbolTable           */        private Scanner(SymbolTable symbolTable) {            // save pool and tokens            fSymbolTable = symbolTable;        } // <init>(SymbolTable)        /**         * Scans the XPointer Expression         *          */        private boolean scanExpr(SymbolTable symbolTable, Tokens tokens,                String data, int currentOffset, int endOffset)                throws XNIException {            int ch;            int openParen = 0;            int closeParen = 0;            int nameOffset, dataOffset;            boolean isQName = false;            String name = null;            String prefix = null;            String schemeData = null;            StringBuffer schemeDataBuff = new StringBuffer();            while (true) {                if (currentOffset == endOffset) {                    break;                }                ch = data.charAt(currentOffset);                //                 while (ch == ' ' || ch == 0x0A || ch == 0x09 || ch == 0x0D) {                    if (++currentOffset == endOffset) {                        break;                    }                    ch = data.charAt(currentOffset);                }                if (currentOffset == endOffset) {                    break;                }                //                 // [1]    Pointer      ::=    Shorthand | SchemeBased                  // [2]    Shorthand    ::=    NCName                  // [3]    SchemeBased  ::=    PointerPart (S? PointerPart)*                 // [4]    PointerPart  ::=    SchemeName '(' SchemeData ')'                 // [5]    SchemeName   ::=    QName                  // [6]    SchemeData   ::=    EscapedData*                  // [7]    EscapedData  ::=    NormalChar | '^(' | '^)' | '^^' | '(' SchemeData ')'                  // [8]    NormalChar   ::=    UnicodeChar - [()^]                  // [9]    UnicodeChar  ::=    [#x0-#x10FFFF]                // [?]    QName        ::=    (NCName ':')? NCName                // [?]    NCName       ::=    (Letter | '_') (NCNameChar)*                // [?]    NCNameChar   ::=    Letter | Digit | '.' | '-' | '_'  (ascii subset of 'NCNameChar')                // [?]    Letter       ::=    [A-Za-z]                              (ascii subset of 'Letter')                // [?]    Digit        ::=    [0-9]                                  (ascii subset of 'Digit')                //                 byte chartype = (ch >= 0x80) ? CHARTYPE_NONASCII                        : fASCIICharMap[ch];                switch (chartype) {                case CHARTYPE_OPEN_PAREN: // '('                    addToken(tokens, Tokens.XPTRTOKEN_OPEN_PAREN);                    openParen++;                    ++currentOffset;                    break;                case CHARTYPE_CLOSE_PAREN: // ')'                    addToken(tokens, Tokens.XPTRTOKEN_CLOSE_PAREN);                    closeParen++;                    ++currentOffset;                    break;                case CHARTYPE_CARRET:                case CHARTYPE_COLON:                case CHARTYPE_DIGIT:                case CHARTYPE_EQUAL:                case CHARTYPE_LETTER:                case CHARTYPE_MINUS:                case CHARTYPE_NONASCII:                case CHARTYPE_OTHER:                case CHARTYPE_PERIOD:                case CHARTYPE_SLASH:                case CHARTYPE_UNDERSCORE:                case CHARTYPE_WHITESPACE:                    // Scanning SchemeName | Shorthand                                       if (openParen == 0) {                        nameOffset = currentOffset;                        currentOffset = scanNCName(data, endOffset,                                currentOffset);                        if (currentOffset == nameOffset) {                            reportError("InvalidShortHandPointer",                                    new Object[] { data });                            return false;                        }                        if (currentOffset < endOffset) {                            ch = data.charAt(currentOffset);                        } else {                            ch = -1;                        }                        name = symbolTable.addSymbol(data.substring(nameOffset,                                currentOffset));                        prefix = XMLSymbols.EMPTY_STRING;                        // The name is a QName => a SchemeName                        if (ch == ':') {                            if (++currentOffset == endOffset) {                                return false;                            }                            ch = data.charAt(currentOffset);                            prefix = name;                            nameOffset = currentOffset;                            currentOffset = scanNCName(data, endOffset,                                    currentOffset);                            if (currentOffset == nameOffset) {                                return false;                            }                            if (currentOffset < endOffset) {                                ch = data.charAt(currentOffset);                            } else {                                ch = -1;                            }                            isQName = true;                            name = symbolTable.addSymbol(data.substring(                                    nameOffset, currentOffset));                        }                        // REVISIT:                        if (currentOffset != endOffset) {                            addToken(tokens, Tokens.XPTRTOKEN_SCHEMENAME);                            tokens.addToken(prefix);                            tokens.addToken(name);                            isQName = false;                        } else if (currentOffset == endOffset) {                            // NCName => Shorthand                            addToken(tokens, Tokens.XPTRTOKEN_SHORTHAND);                            tokens.addToken(name);                            isQName = false;                        }                        // reset open/close paren for the next pointer part                        closeParen = 0;                        break;                    } else if (openParen > 0 && closeParen == 0 && name != null) {                        // Scanning SchemeData                        dataOffset = currentOffset;                        currentOffset = scanData(data, schemeDataBuff,                                endOffset, currentOffset);                        if (currentOffset == dataOffset) {                            reportError("InvalidSchemeDataInXPointer",                                    new Object[] { data });                            return false;                        }                        if (currentOffset < endOffset) {                            ch = data.charAt(currentOffset);                        } else {                            ch = -1;                        }                        schemeData = symbolTable.addSymbol(schemeDataBuff                                .toString());                        addToken(tokens, Tokens.XPTRTOKEN_SCHEMEDATA);                        tokens.addToken(schemeData);                        // reset open/close paren for the next pointer part                        openParen = 0;                        schemeDataBuff.delete(0, schemeDataBuff.length());                    } else {                        // ex. schemeName()                        // Should we throw an exception with a more suitable message instead??                        return false;                    }                }            } // end while            return true;        }        /**          * Scans a NCName.           * From Namespaces in XML          * [5] NCName ::= (Letter | '_') (NCNameChar)*         * [6] NCNameChar ::= Letter | Digit | '.' | '-' | '_' | CombiningChar | Extender         *          * @param data A String containing the XPointer expression         * @param endOffset The int XPointer expression length           * @param currentOffset An int representing the current position of the XPointer expression pointer         */        private int scanNCName(String data, int endOffset, int currentOffset) {            int ch = data.charAt(currentOffset);            if (ch >= 0x80) {                if (!XMLChar.isNameStart(ch)) {                    return currentOffset;                }            } else {                byte chartype = fASCIICharMap[ch];                if (chartype != CHARTYPE_LETTER                        && chartype != CHARTYPE_UNDERSCORE) {                    return currentOffset;                }            }            //while (currentOffset++ < endOffset) {            while (++currentOffset < endOffset) {                ch = data.charAt(currentOffset);                if (ch >= 0x80) {                    if (!XMLChar.isName(ch)) {                        break;                    }                } else {                    byte chartype = fASCIICharMap[ch];                    if (chartype != CHARTYPE_LETTER                            && chartype != CHARTYPE_DIGIT                            && chartype != CHARTYPE_PERIOD                            && chartype != CHARTYPE_MINUS                            && chartype != CHARTYPE_UNDERSCORE) {                        break;                    }                }            }            return currentOffset;        }        /**         * Scans the SchemeData.         * [6]    SchemeData   ::=    EscapedData*           * [7]    EscapedData  ::=    NormalChar | '^(' | '^)' | '^^' | '(' SchemeData ')'           * [8]    NormalChar   ::=    UnicodeChar - [()^]           * [9]    UnicodeChar  ::=    [#x0-#x10FFFF]         *          */        private int scanData(String data, StringBuffer schemeData,                int endOffset, int currentOffset) {            while (true) {                if (currentOffset == endOffset) {                    break;                }                int ch = data.charAt(currentOffset);                byte chartype = (ch >= 0x80) ? CHARTYPE_NONASCII                        : fASCIICharMap[ch];                if (chartype == CHARTYPE_OPEN_PAREN) {                    schemeData.append(ch);                    //schemeData.append(Tokens.XPTRTOKEN_OPEN_PAREN);                    currentOffset = scanData(data, schemeData, endOffset,                            ++currentOffset);                    if (currentOffset == endOffset) {                        return currentOffset;                    }                    ch = data.charAt(currentOffset);                    chartype = (ch >= 0x80) ? CHARTYPE_NONASCII                            : fASCIICharMap[ch];                    if (chartype != CHARTYPE_CLOSE_PAREN) {                        return endOffset;                    }                    schemeData.append((char) ch);                    ++currentOffset;//                } else if (chartype == CHARTYPE_CLOSE_PAREN) {                    return currentOffset;

⌨️ 快捷键说明

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