You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by kn...@apache.org on 2001/11/20 21:21:49 UTC

cvs commit: xml-xerces/c/src/validators/schema XercesAttGroupInfo.hpp XercesAttGroupInfo.cpp TraverseSchema.hpp TraverseSchema.cpp

knoaman     01/11/20 12:21:49

  Modified:    c/src/validators/schema XercesAttGroupInfo.hpp
                        XercesAttGroupInfo.cpp TraverseSchema.hpp
                        TraverseSchema.cpp
  Log:
  Add check for attribute derviation ok when redefining attribute group by restriction.
  
  Revision  Changes    Path
  1.4       +3 -1      xml-xerces/c/src/validators/schema/XercesAttGroupInfo.hpp
  
  Index: XercesAttGroupInfo.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/validators/schema/XercesAttGroupInfo.hpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XercesAttGroupInfo.hpp	2001/11/20 15:57:04	1.3
  +++ XercesAttGroupInfo.hpp	2001/11/20 20:21:49	1.4
  @@ -55,7 +55,7 @@
    */
   
   /*
  - * $Id: XercesAttGroupInfo.hpp,v 1.3 2001/11/20 15:57:04 knoaman Exp $
  + * $Id: XercesAttGroupInfo.hpp,v 1.4 2001/11/20 20:21:49 knoaman Exp $
    */
   
   #if !defined(XERCESATTGROUPINFO_HPP)
  @@ -96,6 +96,8 @@
       SchemaAttDef*       anyAttributeAt(const unsigned int index);
       const SchemaAttDef* anyAttributeAt(const unsigned int index) const;
       SchemaAttDef*       getCompleteWildCard() const;
  +    const SchemaAttDef* getAttDef(const XMLCh* const baseName,
  +                                  const int uriId) const;
       
   	// -----------------------------------------------------------------------
       //  Setter methods
  
  
  
  1.4       +30 -0     xml-xerces/c/src/validators/schema/XercesAttGroupInfo.cpp
  
  Index: XercesAttGroupInfo.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/validators/schema/XercesAttGroupInfo.cpp,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- XercesAttGroupInfo.cpp	2001/11/20 15:57:04	1.3
  +++ XercesAttGroupInfo.cpp	2001/11/20 20:21:49	1.4
  @@ -56,6 +56,9 @@
   
   /*
    * $Log: XercesAttGroupInfo.cpp,v $
  + * Revision 1.4  2001/11/20 20:21:49  knoaman
  + * Add check for attribute derviation ok when redefining attribute group by restriction.
  + *
    * Revision 1.3  2001/11/20 15:57:04  knoaman
    * Add check for multiple attributes with type derived from ID.
    *
  @@ -115,6 +118,33 @@
       }
   
       return false;
  +}
  +
  +// ---------------------------------------------------------------------------
  +//  XercesAttGroupInfo: Getter methods
  +// ---------------------------------------------------------------------------
  +const SchemaAttDef* XercesAttGroupInfo::getAttDef(const XMLCh* const baseName,
  +                                                  const int uriId) const {
  +
  +    // If no list, then return a null
  +    if (!fAttributes)
  +        return 0;
  +
  +    unsigned int attSize = fAttributes->size();
  +
  +    for (unsigned int i=0; i<attSize; i++) {
  +
  +        const SchemaAttDef* attDef = fAttributes->elementAt(i);
  +        QName* attName = attDef->getAttName();
  +
  +        if (uriId == (int) attName->getURI() &&
  +			!XMLString::compareString(baseName, attName->getLocalPart())) {
  +
  +            return attDef;
  +        }
  +    }
  +
  +    return 0;
   }
   
   /**
  
  
  
  1.28      +3 -1      xml-xerces/c/src/validators/schema/TraverseSchema.hpp
  
  Index: TraverseSchema.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/validators/schema/TraverseSchema.hpp,v
  retrieving revision 1.27
  retrieving revision 1.28
  diff -u -r1.27 -r1.28
  --- TraverseSchema.hpp	2001/11/16 15:03:37	1.27
  +++ TraverseSchema.hpp	2001/11/20 20:21:49	1.28
  @@ -55,7 +55,7 @@
    */
   
   /*
  - * $Id: TraverseSchema.hpp,v 1.27 2001/11/16 15:03:37 knoaman Exp $
  + * $Id: TraverseSchema.hpp,v 1.28 2001/11/20 20:21:49 knoaman Exp $
    */
   
   #if !defined(TRAVERSESCHEMA_HPP)
  @@ -570,6 +570,8 @@
         */
       void checkAttDerivationOK(const ComplexTypeInfo* const baseTypeInfo,
                                 const ComplexTypeInfo* const childTypeInfo);
  +    void checkAttDerivationOK(const XercesAttGroupInfo* const baseAttGrpInfo,
  +                              const XercesAttGroupInfo* const childAttGrpInfo);
   
       /**
         * Check whether a namespace value is valid with respect to wildcard
  
  
  
  1.63      +93 -1     xml-xerces/c/src/validators/schema/TraverseSchema.cpp
  
  Index: TraverseSchema.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/validators/schema/TraverseSchema.cpp,v
  retrieving revision 1.62
  retrieving revision 1.63
  diff -u -r1.62 -r1.63
  --- TraverseSchema.cpp	2001/11/20 15:57:04	1.62
  +++ TraverseSchema.cpp	2001/11/20 20:21:49	1.63
  @@ -55,7 +55,7 @@
    */
   
   /*
  - * $Id: TraverseSchema.cpp,v 1.62 2001/11/20 15:57:04 knoaman Exp $
  + * $Id: TraverseSchema.cpp,v 1.63 2001/11/20 20:21:49 knoaman Exp $
    */
   
   // ---------------------------------------------------------------------------
  @@ -1474,6 +1474,26 @@
       // ------------------------------------------------------------------
       fCurrentAttGroupInfo = saveAttGroupInfo;
   
  +    // ------------------------------------------------------------------
  +    // Check Attribute Derivation Restriction OK
  +    // ------------------------------------------------------------------
  +    fBuffer.set(fTargetNSURIString);
  +    fBuffer.append(chComma);
  +    fBuffer.append(name);
  +
  +    unsigned int nameIndex = fStringPool->addOrFind(fBuffer.getRawBuffer());
  +
  +    if (fRedefineComponents && fRedefineComponents->get(SchemaSymbols::fgELT_ATTRIBUTEGROUP, nameIndex)) {
  +
  +        fBuffer.set(name);
  +        fBuffer.append(SchemaSymbols::fgRedefIdentifier);
  +        XercesAttGroupInfo* baseAttGroupInfo = fAttGroupRegistry->get(fBuffer.getRawBuffer());
  +
  +        if (baseAttGroupInfo) {
  +            checkAttDerivationOK(baseAttGroupInfo, attGroupInfo);
  +        }
  +    }
  +
       return attGroupInfo;
   }
   
  @@ -6901,6 +6921,78 @@
   
       // Constraint 4
       const SchemaAttDef* childAttWildCard = childTypeInfo->getAttWildCard();
  +
  +    if (childAttWildCard) {
  +
  +        if (!baseAttWildCard) {
  +            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::BadAttDerivation_6);
  +        }
  +        else if (!isWildCardSubset(baseAttWildCard, childAttWildCard)) {
  +            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::BadAttDerivation_7);
  +        }        
  +    }
  +}
  +
  +void TraverseSchema::checkAttDerivationOK(const XercesAttGroupInfo* const baseAttGrpInfo,
  +                                          const XercesAttGroupInfo* const childAttGrpInfo) {
  +
  +    unsigned int baseAttCount = baseAttGrpInfo->attributeCount();
  +    unsigned int baseAnyAttCount = baseAttGrpInfo->anyAttributeCount();
  +    unsigned int childAttCount = childAttGrpInfo->attributeCount();
  +    unsigned int childAnyAttCount = childAttGrpInfo->anyAttributeCount();
  +
  +    if ((childAttCount || childAnyAttCount) && (!baseAttCount && !baseAnyAttCount)) {
  +        reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::BadAttDerivation_1);
  +    }
  +
  +    const SchemaAttDef* baseAttWildCard = (baseAnyAttCount) ? baseAttGrpInfo->anyAttributeAt(0) : 0;
  +
  +    for (unsigned int i=0; i<childAttCount; i++) {
  +
  +        const SchemaAttDef* childAttDef = childAttGrpInfo->attributeAt(i);
  +        QName* childAttName = childAttDef->getAttName();
  +        const XMLCh* childLocalPart = childAttName->getLocalPart();
  +        const SchemaAttDef* baseAttDef = baseAttGrpInfo->getAttDef(childLocalPart, childAttName->getURI());
  +
  +        if (baseAttDef) {
  +
  +            XMLAttDef::DefAttTypes baseAttDefType = baseAttDef->getDefaultType();
  +            XMLAttDef::DefAttTypes childAttDefType = childAttDef->getDefaultType();
  +
  +            // Constraint 2.1.1 & 3 + check for prohibited base attribute
  +            if (baseAttDefType == XMLAttDef::Prohibited
  +                && childAttDefType != XMLAttDef::Prohibited) {
  +                reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::BadAttDerivation_8, childLocalPart);
  +            }
  +
  +            if ((baseAttDefType & XMLAttDef::Required)
  +                && !(childAttDefType & XMLAttDef::Required)) {
  +                reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::BadAttDerivation_2, childLocalPart);
  +            }
  +
  +            // Constraint 2.1.2
  +            DatatypeValidator* baseDV = baseAttDef->getDatatypeValidator();
  +            DatatypeValidator* childDV = childAttDef->getDatatypeValidator();
  +            if (!baseDV || !baseDV->isSubstitutableBy(childDV)) {
  +                reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::BadAttDerivation_3, childLocalPart);
  +            }
  +
  +            // Constraint 2.1.3
  +            if ((baseAttDefType & XMLAttDef::Fixed) && 
  +                (!(childAttDefType & XMLAttDef::Fixed) ||
  +                 XMLString::compareString(baseAttDef->getValue(), childAttDef->getValue()))) {
  +                reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::BadAttDerivation_4, childLocalPart);
  +            }
  +        }
  +        // Constraint 2.2
  +        else if (!baseAttWildCard ||
  +                 !wildcardAllowsNamespace(baseAttWildCard, childAttName->getURI())) {
  +            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::BadAttDerivation_5, childLocalPart);
  +        }
  +    }
  +
  +    // Constraint 4
  +    const SchemaAttDef* childAttWildCard = (childAnyAttCount) ? childAttGrpInfo->anyAttributeAt(0) : 0;
   
       if (childAttWildCard) {
   
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-cvs-help@xml.apache.org