xsdattributetraverser.java

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

JAVA
445
字号
        return attribute;    }    /**     * Traverse a globally declared attribute.     *     * @param  attrDecl     * @param  attrValues     * @param  schemaDoc     * @param  grammar     * @param  isGlobal     * @return the attribute declaration index     */    XSAttributeDecl traverseNamedAttr(Element attrDecl,                                      Object[] attrValues,                                      XSDocumentInfo schemaDoc,                                      SchemaGrammar grammar,                                      boolean isGlobal,                                      XSComplexTypeDecl enclosingCT) {        String  defaultAtt = (String) attrValues[XSAttributeChecker.ATTIDX_DEFAULT];        String  fixedAtt   = (String) attrValues[XSAttributeChecker.ATTIDX_FIXED];        XInt    formAtt    = (XInt)   attrValues[XSAttributeChecker.ATTIDX_FORM];        String  nameAtt    = (String) attrValues[XSAttributeChecker.ATTIDX_NAME];        QName   typeAtt    = (QName)  attrValues[XSAttributeChecker.ATTIDX_TYPE];        // Step 1: get declaration information        XSAttributeDecl attribute = null;        if (fSchemaHandler.fDeclPool !=null) {            attribute = fSchemaHandler.fDeclPool.getAttributeDecl();        } else {            attribute = new XSAttributeDecl();        }        // get 'name'        if (nameAtt != null)            nameAtt = fSymbolTable.addSymbol(nameAtt);        // get 'target namespace'        String tnsAtt = null;        XSComplexTypeDecl enclCT = null;        short scope = XSAttributeDecl.SCOPE_ABSENT;        if (isGlobal) {            tnsAtt = schemaDoc.fTargetNamespace;            scope = XSAttributeDecl.SCOPE_GLOBAL;        }        else {            if (enclosingCT != null) {                enclCT = enclosingCT;                scope = XSAttributeDecl.SCOPE_LOCAL;            }            if (formAtt != null) {                if (formAtt.intValue() == SchemaSymbols.FORM_QUALIFIED)                    tnsAtt = schemaDoc.fTargetNamespace;            } else if (schemaDoc.fAreLocalAttributesQualified) {                tnsAtt = schemaDoc.fTargetNamespace;            }         }        // get 'value constraint'        // for local named attribute, value constraint is absent        ValidatedInfo attDefault = null;        short constraintType = XSConstants.VC_NONE;        if (isGlobal) {            if (fixedAtt != null) {                attDefault = new ValidatedInfo();                attDefault.normalizedValue = fixedAtt;                constraintType = XSConstants.VC_FIXED;            } else if (defaultAtt != null) {                attDefault = new ValidatedInfo();                attDefault.normalizedValue = defaultAtt;                constraintType = XSConstants.VC_DEFAULT;            }         }        // get 'annotation'        Element child = DOMUtil.getFirstChildElement(attrDecl);        XSAnnotationImpl annotation = null;        if (child != null && DOMUtil.getLocalName(child).equals(SchemaSymbols.ELT_ANNOTATION)) {            annotation = traverseAnnotationDecl(child, attrValues, false, schemaDoc);            child = DOMUtil.getNextSiblingElement(child);        }        // get 'type definition'        XSSimpleType attrType = null;        boolean haveAnonType = false;        // Handle Anonymous type if there is one        if (child != null) {            String childName = DOMUtil.getLocalName(child);            if (childName.equals(SchemaSymbols.ELT_SIMPLETYPE)) {                attrType = fSchemaHandler.fSimpleTypeTraverser.traverseLocal(child, schemaDoc, grammar);                haveAnonType = true;                child = DOMUtil.getNextSiblingElement(child);            }        }        // Handler type attribute        if (attrType == null && typeAtt != null) {            XSTypeDefinition type = (XSTypeDefinition)fSchemaHandler.getGlobalDecl(schemaDoc, XSDHandler.TYPEDECL_TYPE, typeAtt, attrDecl);            if (type != null && type.getTypeCategory() == XSTypeDefinition.SIMPLE_TYPE)                attrType = (XSSimpleType)type;            else                reportSchemaError("src-resolve", new Object[]{typeAtt.rawname, "simpleType definition"}, attrDecl);        }        if (attrType == null) {            attrType = SchemaGrammar.fAnySimpleType;        }        attribute.setValues(nameAtt, tnsAtt, attrType,            constraintType, scope, attDefault, enclCT, annotation);        // Step 2: register attribute decl to the grammar        if (isGlobal && nameAtt != null)            grammar.addGlobalAttributeDecl(attribute);        // Step 3: check against schema for schemas        // required attributes        if (nameAtt == null) {            if (isGlobal)                reportSchemaError("s4s-att-must-appear", new Object[]{SchemaSymbols.ELT_ATTRIBUTE, SchemaSymbols.ATT_NAME}, attrDecl);            else                reportSchemaError("src-attribute.3.1", null, attrDecl);            nameAtt = NO_NAME;        }        // element        if (child != null) {            reportSchemaError("s4s-elt-must-match.1", new Object[]{nameAtt, "(annotation?, (simpleType?))", DOMUtil.getLocalName(child)}, child);        }        // Step 4: check 3.2.3 constraints        // src-attribute        // 1 default and fixed must not both be present.        if (defaultAtt != null && fixedAtt != null) {            reportSchemaError("src-attribute.1", new Object[]{nameAtt}, attrDecl);        }        // 2 If default and use are both present, use must have the actual value optional.        // This is checked in "traverse" method        // 3 If the item's parent is not <schema>, then all of the following must be true:        // 3.1 One of ref or name must be present, but not both.        // This is checked in XSAttributeChecker        // 3.2 If ref is present, then all of <simpleType>, form and type must be absent.        // Attributes are checked in XSAttributeChecker, elements are checked in "traverse" method        // 4 type and <simpleType> must not both be present.        if (haveAnonType && (typeAtt != null)) {            reportSchemaError( "src-attribute.4", new Object[]{nameAtt}, attrDecl);        }        // Step 5: check 3.2.6 constraints        // check for NOTATION type        checkNotationType(nameAtt, attrType, attrDecl);        // a-props-correct        // 2 if there is a {value constraint}, the canonical lexical representation of its value must be valid with respect to the {type definition} as defined in String Valid (3.14.4).        if (attDefault != null) {            fValidationState.setNamespaceSupport(schemaDoc.fNamespaceSupport);			try {				checkDefaultValid(attribute);			}			catch (InvalidDatatypeValueException ide) {				reportSchemaError (ide.getKey(), ide.getArgs(), attrDecl);				reportSchemaError ("a-props-correct.2", new Object[]{nameAtt, attDefault.normalizedValue}, attrDecl);			}        }        // 3 If the {type definition} is or is derived from ID then there must not be a {value constraint}.        if (attDefault != null) {            if (attrType.isIDType() ) {                reportSchemaError ("a-props-correct.3", new Object[]{nameAtt}, attrDecl);            }        }        // no-xmlns        // The {name} of an attribute declaration must not match xmlns.        if (nameAtt != null && nameAtt.equals(XMLSymbols.PREFIX_XMLNS)) {            reportSchemaError("no-xmlns", null, attrDecl);        }        // no-xsi        // The {target namespace} of an attribute declaration, whether local or top-level, must not match http://www.w3.org/2001/XMLSchema-instance (unless it is one of the four built-in declarations given in the next section).        if (tnsAtt != null && tnsAtt.equals(SchemaSymbols.URI_XSI)) {            reportSchemaError("no-xsi", new Object[]{SchemaSymbols.URI_XSI}, attrDecl);        }        // Attribute without a name. Return null.        if (attribute.getName() == null)            return null;        return attribute;    }	// throws an error if the constraint value is invalid for the given type    void checkDefaultValid(XSAttributeDecl attribute) throws InvalidDatatypeValueException {        // validate the original lexical rep, and set the actual value        ((XSSimpleType)attribute.getTypeDefinition()).validate(attribute.getValInfo().normalizedValue, fValidationState, attribute.getValInfo());        // validate the canonical lexical rep        ((XSSimpleType)attribute.getTypeDefinition()).validate(attribute.getValInfo().stringValue(), fValidationState, attribute.getValInfo());    }    // throws an error if the constraint value is invalid for the given type    void checkDefaultValid(XSAttributeUseImpl attrUse) throws InvalidDatatypeValueException {         // validate the original lexical rep, and set the actual value        ((XSSimpleType)attrUse.fAttrDecl.getTypeDefinition()).validate(attrUse.fDefault.normalizedValue, fValidationState, attrUse.fDefault);        // validate the canonical lexical rep        ((XSSimpleType)attrUse.fAttrDecl.getTypeDefinition()).validate(attrUse.fDefault.stringValue(), fValidationState, attrUse.fDefault);    }}

⌨️ 快捷键说明

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