xmlschemavalidator.java

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

JAVA
1,737
字号
        } catch (XMLConfigurationException e) {            fGrammarPool = null;        }        fState4XsiType.setSymbolTable(symbolTable);        fState4ApplyDefault.setSymbolTable(symbolTable);    } // reset(XMLComponentManager)    //    // FieldActivator methods    //    /**     * Start the value scope for the specified identity constraint. This     * method is called when the selector matches in order to initialize     * the value store.     *     * @param identityConstraint The identity constraint.     */    public void startValueScopeFor(IdentityConstraint identityConstraint, int initialDepth) {        ValueStoreBase valueStore =            fValueStoreCache.getValueStoreFor(identityConstraint, initialDepth);        valueStore.startValueScope();    } // startValueScopeFor(IdentityConstraint identityConstraint)    /**     * Request to activate the specified field. This method returns the     * matcher for the field.     *     * @param field The field to activate.     */    public XPathMatcher activateField(Field field, int initialDepth) {        ValueStore valueStore =            fValueStoreCache.getValueStoreFor(field.getIdentityConstraint(), initialDepth);        setMayMatch(field, Boolean.TRUE);        XPathMatcher matcher = field.createMatcher(this, valueStore);        fMatcherStack.addMatcher(matcher);        matcher.startDocumentFragment();        return matcher;    } // activateField(Field):XPathMatcher    /**     * Ends the value scope for the specified identity constraint.     *     * @param identityConstraint The identity constraint.     */    public void endValueScopeFor(IdentityConstraint identityConstraint, int initialDepth) {        ValueStoreBase valueStore =            fValueStoreCache.getValueStoreFor(identityConstraint, initialDepth);        valueStore.endValueScope();    } // endValueScopeFor(IdentityConstraint)    /**     * Sets whether the given field is permitted to match a value.     * This should be used to catch instance documents that try     * and match a field several times in the same scope.     *     * @param field The field that may be permitted to be matched.     * @param state Boolean indiciating whether the field may be matched.     */    public void setMayMatch(Field field, Boolean state) {        fMayMatchFieldMap.put(field, state);    } // setMayMatch(Field, Boolean)    /**     * Returns whether the given field is permitted to match a value.     *     * @param field The field that may be permitted to be matched.     * @return Boolean indicating whether the field may be matched.     */    public Boolean mayMatch(Field field) {        return (Boolean) fMayMatchFieldMap.get(field);    } // mayMatch(Field):Boolean    // a utility method for Identity constraints    private void activateSelectorFor(IdentityConstraint ic) {        Selector selector = ic.getSelector();        FieldActivator activator = this;        if (selector == null)            return;        XPathMatcher matcher = selector.createMatcher(activator, fElementDepth);        fMatcherStack.addMatcher(matcher);        matcher.startDocumentFragment();    }    //    // Protected methods    //    /** ensure element stack capacity */    void ensureStackCapacity() {        if (fElementDepth == fElemDeclStack.length) {            int newSize = fElementDepth + INC_STACK_SIZE;            boolean[] newArrayB = new boolean[newSize];            System.arraycopy(fSubElementStack, 0, newArrayB, 0, fElementDepth);            fSubElementStack = newArrayB;            XSElementDecl[] newArrayE = new XSElementDecl[newSize];            System.arraycopy(fElemDeclStack, 0, newArrayE, 0, fElementDepth);            fElemDeclStack = newArrayE;            newArrayB = new boolean[newSize];            System.arraycopy(fNilStack, 0, newArrayB, 0, fElementDepth);            fNilStack = newArrayB;            XSNotationDecl[] newArrayN = new XSNotationDecl[newSize];            System.arraycopy(fNotationStack, 0, newArrayN, 0, fElementDepth);            fNotationStack = newArrayN;            XSTypeDefinition[] newArrayT = new XSTypeDefinition[newSize];            System.arraycopy(fTypeStack, 0, newArrayT, 0, fElementDepth);            fTypeStack = newArrayT;            XSCMValidator[] newArrayC = new XSCMValidator[newSize];            System.arraycopy(fCMStack, 0, newArrayC, 0, fElementDepth);            fCMStack = newArrayC;            newArrayB = new boolean[newSize];            System.arraycopy(fSawTextStack, 0, newArrayB, 0, fElementDepth);            fSawTextStack = newArrayB;            newArrayB = new boolean[newSize];            System.arraycopy(fStringContent, 0, newArrayB, 0, fElementDepth);            fStringContent = newArrayB;            newArrayB = new boolean[newSize];            System.arraycopy(fStrictAssessStack, 0, newArrayB, 0, fElementDepth);            fStrictAssessStack = newArrayB;            int[][] newArrayIA = new int[newSize][];            System.arraycopy(fCMStateStack, 0, newArrayIA, 0, fElementDepth);            fCMStateStack = newArrayIA;        }    } // ensureStackCapacity    // handle start document    void handleStartDocument(XMLLocator locator, String encoding) {        fValueStoreCache.startDocument();        if (fAugPSVI) {            fCurrentPSVI.fGrammars = null;            fCurrentPSVI.fSchemaInformation = null;        }    } // handleStartDocument(XMLLocator,String)    void handleEndDocument() {        fValueStoreCache.endDocument();    } // handleEndDocument()    // handle character contents    // returns the normalized string if possible, otherwise the original string    XMLString handleCharacters(XMLString text) {        if (fSkipValidationDepth >= 0)            return text;        fSawText = fSawText || text.length > 0;        // Note: data in EntityRef and CDATA is normalized as well        // if whitespace == -1 skip normalization, because it is a complexType        // or a union type.        if (fNormalizeData && fWhiteSpace != -1 && fWhiteSpace != XSSimpleType.WS_PRESERVE) {            // normalize data            normalizeWhitespace(text, fWhiteSpace == XSSimpleType.WS_COLLAPSE);            text = fNormalizedStr;        }        if (fAppendBuffer)            fBuffer.append(text.ch, text.offset, text.length);        // When it's a complex type with element-only content, we need to        // find out whether the content contains any non-whitespace character.        if (fCurrentType != null            && fCurrentType.getTypeCategory() == XSTypeDefinition.COMPLEX_TYPE) {            XSComplexTypeDecl ctype = (XSComplexTypeDecl) fCurrentType;            if (ctype.fContentType == XSComplexTypeDecl.CONTENTTYPE_ELEMENT) {                // data outside of element content                for (int i = text.offset; i < text.offset + text.length; i++) {                    if (!XMLChar.isSpace(text.ch[i])) {                        fSawCharacters = true;                        break;                    }                }            }        }        return text;    } // handleCharacters(XMLString)    /**     * Normalize whitespace in an XMLString according to the rules defined     * in XML Schema specifications.     * @param value    The string to normalize.     * @param collapse replace or collapse     */    private void normalizeWhitespace(XMLString value, boolean collapse) {        boolean skipSpace = collapse;        boolean sawNonWS = false;        boolean leading = false;        boolean trailing = false;        char c;        int size = value.offset + value.length;        // ensure the ch array is big enough        if (fNormalizedStr.ch == null || fNormalizedStr.ch.length < value.length + 1) {            fNormalizedStr.ch = new char[value.length + 1];        }        // don't include the leading ' ' for now. might include it later.        fNormalizedStr.offset = 1;        fNormalizedStr.length = 1;        for (int i = value.offset; i < size; i++) {            c = value.ch[i];            if (XMLChar.isSpace(c)) {                if (!skipSpace) {                    // take the first whitespace as a space and skip the others                    fNormalizedStr.ch[fNormalizedStr.length++] = ' ';                    skipSpace = collapse;                }                if (!sawNonWS) {                    // this is a leading whitespace, record it                    leading = true;                }            } else {                fNormalizedStr.ch[fNormalizedStr.length++] = c;                skipSpace = false;                sawNonWS = true;            }        }        if (skipSpace) {            if (fNormalizedStr.length > 1) {                // if we finished on a space trim it but also record it                fNormalizedStr.length--;                trailing = true;            } else if (leading && !fFirstChunk) {                // if all we had was whitespace we skipped record it as                // trailing whitespace as well                trailing = true;            }        }        if (fNormalizedStr.length > 1) {            if (!fFirstChunk && (fWhiteSpace == XSSimpleType.WS_COLLAPSE)) {                if (fTrailing) {                    // previous chunk ended on whitespace                    // insert whitespace                    fNormalizedStr.offset = 0;                    fNormalizedStr.ch[0] = ' ';                } else if (leading) {                    // previous chunk ended on character,                    // this chunk starts with whitespace                    fNormalizedStr.offset = 0;                    fNormalizedStr.ch[0] = ' ';                }            }        }        // The length includes the leading ' '. Now removing it.        fNormalizedStr.length -= fNormalizedStr.offset;        fTrailing = trailing;        if (trailing || sawNonWS)            fFirstChunk = false;    }    private void normalizeWhitespace(String value, boolean collapse) {        boolean skipSpace = collapse;        char c;        int size = value.length();        // ensure the ch array is big enough        if (fNormalizedStr.ch == null || fNormalizedStr.ch.length < size) {            fNormalizedStr.ch = new char[size];        }        fNormalizedStr.offset = 0;        fNormalizedStr.length = 0;        for (int i = 0; i < size; i++) {            c = value.charAt(i);            if (XMLChar.isSpace(c)) {                if (!skipSpace) {                    // take the first whitespace as a space and skip the others                    fNormalizedStr.ch[fNormalizedStr.length++] = ' ';                    skipSpace = collapse;                }            } else {                fNormalizedStr.ch[fNormalizedStr.length++] = c;                skipSpace = false;            }        }        if (skipSpace) {            if (fNormalizedStr.length != 0)                // if we finished on a space trim it but also record it                fNormalizedStr.length--;        }    }    // handle ignorable whitespace    void handleIgnorableWhitespace(XMLString text) {        if (fSkipValidationDepth >= 0)            return;        // REVISIT: the same process needs to be performed as handleCharacters.        // only it's simpler here: we know all characters are whitespaces.    } // handleIgnorableWhitespace(XMLString)    /** Handle element. */    Augmentations handleStartElement(QName element, XMLAttributes attributes, Augmentations augs) {        if (DEBUG) {            System.out.println("==>handleStartElement: " + element);        }        // root element        if (fElementDepth == -1 && fValidationManager.isGrammarFound()) {            if (fSchemaType == null) {                // schemaType is not specified                // if a DTD grammar is found, we do the same thing as Dynamic:                // if a schema grammar is found, validation is performed;                // otherwise, skip the whole document.                fSchemaDynamicValidation = true;            } else {                // [1] Either schemaType is DTD, and in this case validate/schema is turned off                // [2] Validating against XML Schemas only                //   [a] dynamic validation is false: report error if SchemaGrammar is not found                //   [b] dynamic validation is true: if grammar is not found ignore.            }        }        // get xsi:schemaLocation and xsi:noNamespaceSchemaLocation attributes,        // parse them to get the grammars        String sLocation =            attributes.getValue(SchemaSymbols.URI_XSI, SchemaSymbols.XSI_SCHEMALOCATION);        String nsLocation =    

⌨️ 快捷键说明

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