FileDocCategorySizeDatePackage
XSDKeyrefTraverser.javaAPI DocJava SE 5 API6502Fri Aug 26 14:55:52 BST 2005com.sun.org.apache.xerces.internal.impl.xs.traversers

XSDKeyrefTraverser

public class XSDKeyrefTraverser extends XSDAbstractIDConstraintTraverser
This class contains code that is used to traverse s.
author
Neil Graham, IBM
version
$Id: XSDKeyrefTraverser.java,v 1.6 2003/05/08 20:11:57 elena Exp $

Fields Summary
Constructors Summary
public XSDKeyrefTraverser(XSDHandler handler, XSAttributeChecker gAttrCheck)

        super(handler, gAttrCheck);
    
Methods Summary
voidtraverse(org.w3c.dom.Element krElem, com.sun.org.apache.xerces.internal.impl.xs.XSElementDecl element, com.sun.org.apache.xerces.internal.impl.xs.traversers.XSDocumentInfo schemaDoc, com.sun.org.apache.xerces.internal.impl.xs.SchemaGrammar grammar)


        // General Attribute Checking
        Object[] attrValues = fAttrChecker.checkAttributes(krElem, false, schemaDoc);

        // create identity constraint
        String krName = (String)attrValues[XSAttributeChecker.ATTIDX_NAME];
        if(krName == null){
            reportSchemaError("s4s-att-must-appear", new Object [] {SchemaSymbols.ELT_KEYREF , SchemaSymbols.ATT_NAME }, krElem);
            //return this array back to pool
            fAttrChecker.returnAttrArray(attrValues, schemaDoc);
            return;
        }
        QName kName = (QName)attrValues[XSAttributeChecker.ATTIDX_REFER];
        if(kName == null){
            reportSchemaError("s4s-att-must-appear", new Object [] {SchemaSymbols.ELT_KEYREF , SchemaSymbols.ATT_REFER }, krElem);
            //return this array back to pool
            fAttrChecker.returnAttrArray(attrValues, schemaDoc);
            return;
        }

        UniqueOrKey key = null;
        IdentityConstraint ret = (IdentityConstraint)fSchemaHandler.getGlobalDecl(schemaDoc, XSDHandler.IDENTITYCONSTRAINT_TYPE, kName, krElem);
        // if ret == null, we've already reported an error in getGlobalDecl
        // we report an error only when ret != null, and the return type keyref
        if (ret != null) {
            if (ret.getCategory() == IdentityConstraint.IC_KEY ||
                ret.getCategory() == IdentityConstraint.IC_UNIQUE) {
                key = (UniqueOrKey)ret;
            } else {
                reportSchemaError("src-resolve", new Object[]{kName.rawname, "identity constraint key/unique"}, krElem);
            }
        }

        if(key == null) {
            fAttrChecker.returnAttrArray(attrValues, schemaDoc);
            return;
        }

        KeyRef keyRef = new KeyRef(schemaDoc.fTargetNamespace, krName, element.fName, key);

        // add to element decl
        traverseIdentityConstraint(keyRef, krElem, schemaDoc, attrValues);

        //Schema Component Constraint: Identity-constraint Definition Properties Correct
        //2 If the {identity-constraint category} is keyref, the cardinality of the {fields} must equal that of the {fields} of the {referenced key}.
        if(key.getFieldCount() != keyRef.getFieldCount()) {
            reportSchemaError("c-props-correct.2" , new Object [] {krName,key.getIdentityConstraintName()}, krElem);
        } else {
            // add key reference to element decl
            // and stuff this in the grammar
            grammar.addIDConstraintDecl(element, keyRef);
        }

        // and put back attributes
        fAttrChecker.returnAttrArray(attrValues, schemaDoc);