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/05/17 20:11:22 UTC

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

knoaman     01/05/17 11:11:22

  Modified:    c/src/validators/datatype DatatypeValidatorFactory.cpp
                        DatatypeValidatorFactory.hpp
               c/src/validators/schema GeneralAttributeCheck.cpp
                        GeneralAttributeCheck.hpp TraverseSchema.cpp
                        TraverseSchema.hpp
  Log:
  More constraint and attribute checking.
  
  Revision  Changes    Path
  1.8       +7 -3      xml-xerces/c/src/validators/datatype/DatatypeValidatorFactory.cpp
  
  Index: DatatypeValidatorFactory.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/validators/datatype/DatatypeValidatorFactory.cpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- DatatypeValidatorFactory.cpp	2001/05/16 15:24:42	1.7
  +++ DatatypeValidatorFactory.cpp	2001/05/17 18:11:11	1.8
  @@ -56,6 +56,9 @@
   
   /*
    * $Log: DatatypeValidatorFactory.cpp,v $
  + * Revision 1.8  2001/05/17 18:11:11  knoaman
  + * More constraint and attribute checking.
  + *
    * Revision 1.7  2001/05/16 15:24:42  tng
    * Schema: Add Base64 and HexBin.  By Pei Yong Zhang.
    *
  @@ -249,14 +252,13 @@
   //  DatatypeValidatorFactory: Static member data
   // ---------------------------------------------------------------------------
   RefHashTableOf<DatatypeValidator>* DatatypeValidatorFactory::fBuiltInRegistry = 0;
  -
  +int DatatypeValidatorFactory::fRegistryExpanded = 0;
   
   // ---------------------------------------------------------------------------
   //  DatatypeValidatorFactory: Constructors and Destructor
   // ---------------------------------------------------------------------------
   DatatypeValidatorFactory::DatatypeValidatorFactory()
  -    : fRegistryExpanded(0)
  -      , fUserDefinedRegistry(0)
  +    : fUserDefinedRegistry(0)
   {
   }
   
  @@ -513,6 +515,7 @@
           createDatatypeValidator(SchemaSymbols::fgDT_BYTE,
                         getDatatypeValidator(SchemaSymbols::fgDT_SHORT),
                         facets, false, 0, false);
  +*/
   
           // Create 'nonNegativeInteger' datatype validator
           facets = new RefHashTableOf<KVStringPair>(3);
  @@ -524,6 +527,7 @@
                         getDatatypeValidator(SchemaSymbols::fgDT_INTEGER),
                         facets, false, 0, false);
   
  +/*
           // Create 'unsignedLong' datatype validator
           facets = new RefHashTableOf<KVStringPair>(3);
   
  
  
  
  1.5       +3 -3      xml-xerces/c/src/validators/datatype/DatatypeValidatorFactory.hpp
  
  Index: DatatypeValidatorFactory.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/validators/datatype/DatatypeValidatorFactory.hpp,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DatatypeValidatorFactory.hpp	2001/05/15 21:59:23	1.4
  +++ DatatypeValidatorFactory.hpp	2001/05/17 18:11:12	1.5
  @@ -55,7 +55,7 @@
    */
   
   /*
  - * $Id: DatatypeValidatorFactory.hpp,v 1.4 2001/05/15 21:59:23 knoaman Exp $
  + * $Id: DatatypeValidatorFactory.hpp,v 1.5 2001/05/17 18:11:12 knoaman Exp $
    */
   
   #if !defined(DATATYPEVALIDATORFACTORY_HPP)
  @@ -233,8 +233,8 @@
       //  fBuiltInRegistry
       //      This is a hashtable of built-in primitive datatype validators.
       // -----------------------------------------------------------------------
  -	int                                fRegistryExpanded;
  -    RefHashTableOf<DatatypeValidator>* fUserDefinedRegistry;
  +    RefHashTableOf<DatatypeValidator>*        fUserDefinedRegistry;
  +	static int                                fRegistryExpanded;
   	static RefHashTableOf<DatatypeValidator>* fBuiltInRegistry;
   };
   
  
  
  
  1.2       +142 -21   xml-xerces/c/src/validators/schema/GeneralAttributeCheck.cpp
  
  Index: GeneralAttributeCheck.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/validators/schema/GeneralAttributeCheck.cpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- GeneralAttributeCheck.cpp	2001/05/15 21:59:31	1.1
  +++ GeneralAttributeCheck.cpp	2001/05/17 18:11:15	1.2
  @@ -56,6 +56,9 @@
   
   /*
    * $Log: GeneralAttributeCheck.cpp,v $
  + * Revision 1.2  2001/05/17 18:11:15  knoaman
  + * More constraint and attribute checking.
  + *
    * Revision 1.1  2001/05/15 21:59:31  knoaman
    * TraverseSchema: add attribute checking + some fixes + more error messages.
    * More attribute cheking to come.
  @@ -75,16 +78,28 @@
   #include <validators/schema/TraverseSchema.hpp>
   #include <util/PlatformUtils.hpp>
   #include <util/XMLDeleterFor.hpp>
  +#include <validators/datatype/DatatypeValidatorFactory.hpp>
   
   // ---------------------------------------------------------------------------
   //  Local const data
   // ---------------------------------------------------------------------------
  +const XMLCh fgValueZero[] =
  +{
  +    chDigit_0, chNull
  +};
  +
   const XMLCh fgValueOne[] =
   {
       chDigit_1, chNull
   };
   
  +const XMLCh fgUnbounded[] =
  +{
  +    chLatin_u, chLatin_n, chLatin_b, chLatin_o, chLatin_u, chLatin_n, chLatin_d,
  +    chLatin_e, chLatin_d, chNull
  +};
   
  +
   // ---------------------------------------------------------------------------
   //  Static member data initialization
   // ---------------------------------------------------------------------------
  @@ -128,6 +143,7 @@
   // ---------------------------------------------------------------------------
   GeneralAttributeCheck::GeneralAttributeCheck()
       : fAttributes(0)
  +    , fValidators(0)
       , fElementMap(0)
   {
       try {
  @@ -155,7 +171,7 @@
   
       fAttributes[Att_Abstract_D] = 
           new AttributeInfo(SchemaSymbols::fgATT_ABSTRACT, Att_Optional_Default,
  -                          SchemaSymbols::fgATTVAL_FALSE, 0);
  +                          SchemaSymbols::fgATTVAL_FALSE, DT_Boolean);
   
       fAttributes[Att_Attribute_FD_D] =
   		new AttributeInfo(SchemaSymbols::fgATT_ATTRIBUTEFORMDEFAULT, Att_Optional_Default,
  @@ -187,7 +203,7 @@
   
       fAttributes[Att_Element_FD_D] =
           new AttributeInfo(SchemaSymbols::fgATT_ELEMENTFORMDEFAULT, Att_Optional_Default,
  -                          SchemaSymbols::fgATTVAL_UNQUALIFIED, 0);
  +                          SchemaSymbols::fgATTVAL_UNQUALIFIED, DT_Form);
   
       fAttributes[Att_Final_N] =
           new AttributeInfo(SchemaSymbols::fgATT_FINAL, Att_Optional_NoDefault,
  @@ -207,11 +223,11 @@
   
       fAttributes[Att_Fixed_D] =
           new AttributeInfo(SchemaSymbols::fgATT_FIXED, Att_Optional_Default,
  -                          SchemaSymbols::fgATTVAL_FALSE, 0);
  +                          SchemaSymbols::fgATTVAL_FALSE, DT_Boolean);
   
       fAttributes[Att_Form_N] =
           new AttributeInfo(SchemaSymbols::fgATT_FORM, Att_Optional_NoDefault,
  -                          0, 0);
  +                          0, DT_Form);
   
       fAttributes[Att_ID_N] =
           new AttributeInfo(SchemaSymbols::fgATT_ID, Att_Optional_NoDefault,
  @@ -223,31 +239,31 @@
   
       fAttributes[Att_MaxOccurs_D] =
           new AttributeInfo(SchemaSymbols::fgATT_MAXOCCURS, Att_Optional_Default,
  -                          fgValueOne, 0);
  +                          fgValueOne, DT_MaxOccurs);
   
       fAttributes[Att_MaxOccurs1_D] =
           new AttributeInfo(SchemaSymbols::fgATT_MAXOCCURS, Att_Optional_Default,
  -                          fgValueOne, 0);
  +                          fgValueOne, DT_MaxOccurs1);
   
       fAttributes[Att_Member_T_N] =
           new AttributeInfo(SchemaSymbols::fgATT_MEMBERTYPES, Att_Optional_NoDefault,
  -                          0, 0);
  +                          0, DT_MemberTypes);
   
       fAttributes[Att_MinOccurs_D] =
           new AttributeInfo(SchemaSymbols::fgATT_MINOCCURS, Att_Optional_Default,
  -                          fgValueOne, 0);
  +                          fgValueOne, DT_NonNegInt);
   
       fAttributes[Att_MinOccurs1_D] =
           new AttributeInfo(SchemaSymbols::fgATT_MINOCCURS, Att_Optional_Default,
  -                          fgValueOne, 0);
  +                          fgValueOne, DT_MinOccurs1);
   
       fAttributes[Att_Mixed_D] =
           new AttributeInfo(SchemaSymbols::fgATT_MIXED, Att_Optional_Default,
  -                          SchemaSymbols::fgATTVAL_FALSE, 0);
  +                          SchemaSymbols::fgATTVAL_FALSE, DT_Boolean);
   
       fAttributes[Att_Mixed_N] =
           new AttributeInfo(SchemaSymbols::fgATT_MIXED, Att_Optional_NoDefault,
  -                          0, 0);
  +                          0, DT_Boolean);
   
       fAttributes[Att_Name_R] =
           new AttributeInfo(SchemaSymbols::fgATT_NAME, Att_Required,
  @@ -255,7 +271,7 @@
   
       fAttributes[Att_Namespace_D] =
           new AttributeInfo(SchemaSymbols::fgATT_NAMESPACE, Att_Optional_Default,
  -                          SchemaSymbols::fgATTVAL_TWOPOUNDANY, 0);
  +                          SchemaSymbols::fgATTVAL_TWOPOUNDANY, DT_Namespace);
   
       fAttributes[Att_Namespace_N] =
           new AttributeInfo(SchemaSymbols::fgATT_NAMESPACE, Att_Optional_NoDefault,
  @@ -263,15 +279,15 @@
   
       fAttributes[Att_Nillable_D] =
           new AttributeInfo(SchemaSymbols::fgATT_NILLABLE, Att_Optional_Default,
  -                          SchemaSymbols::fgATTVAL_FALSE, 0);
  +                          SchemaSymbols::fgATTVAL_FALSE, DT_Boolean);
   
       fAttributes[Att_Process_C_D] =
           new AttributeInfo(SchemaSymbols::fgATT_PROCESSCONTENTS, Att_Optional_Default,
  -                          SchemaSymbols::fgATTVAL_STRICT, 0);
  +                          SchemaSymbols::fgATTVAL_STRICT, DT_ProcessContents);
   
       fAttributes[Att_Public_R] =
           new AttributeInfo(SchemaSymbols::fgATT_PUBLIC, Att_Required,
  -                          0, 0);
  +                          0, DT_Public);
   
       fAttributes[Att_Ref_R] =
           new AttributeInfo(SchemaSymbols::fgATT_REF, Att_Required,
  @@ -311,11 +327,11 @@
   
       fAttributes[Att_Use_D] =
           new AttributeInfo(SchemaSymbols::fgATT_USE, Att_Optional_Default,
  -                          SchemaSymbols::fgATTVAL_OPTIONAL, 0);
  +                          SchemaSymbols::fgATTVAL_OPTIONAL, DT_Use);
   
       fAttributes[Att_Value_NNI_N] =
           new AttributeInfo(SchemaSymbols::fgATT_VALUE, Att_Optional_NoDefault,
  -                          0, 0);
  +                          0, DT_NonNegInt);
   
       fAttributes[Att_Value_STR_N] =
           new AttributeInfo(SchemaSymbols::fgATT_VALUE, Att_Optional_NoDefault,
  @@ -323,13 +339,30 @@
   
       fAttributes[Att_Value_WS_N] =
           new AttributeInfo(SchemaSymbols::fgATT_VALUE, Att_Optional_NoDefault,
  -                          0, 0);
  +                          0, DT_WhiteSpace);
   
       fAttributes[Att_Version_N] =
           new AttributeInfo(SchemaSymbols::fgATT_VERSION, Att_Optional_NoDefault,
                             0, 0);
   }
   
  +void GeneralAttributeCheck::setUpValidators() {
  +
  +    fValidators = new DatatypeValidator*[DT_Count];
  +
  +    for (int i=0; i< DT_Count; i++) {
  +        fValidators[i] = 0;
  +    }
  +
  +    DatatypeValidatorFactory dvFactory;
  +
  +	dvFactory.expandRegistryToFullSchemaSet();
  +    fValidators[DT_NonNegInt] = 
  +        dvFactory.getDatatypeValidator(SchemaSymbols::fgDT_NONNEGATIVEINTEGER);
  +
  +    // TO DO - add remaining valdiators
  +}
  +
   void GeneralAttributeCheck::mapElements() {
   
       if (fElementMap) {
  @@ -337,6 +370,7 @@
       }
   
       setUpAttributes();
  +    setUpValidators();
   
       RefVectorOf<AttributeInfo>* attList = 0;
       int prefixContext = globalPrefix;
  @@ -652,6 +686,7 @@
       }
   
       delete [] fAttributes;
  +    delete [] fValidators;
       delete fElementMap;
   }
   
  @@ -725,11 +760,15 @@
   
               XMLCh* attName = attInfo->getName();
               DOMString attValue = elem.getAttribute(attName);
  +            unsigned int attValueLen = attValue.length();
   
               attNameList.put((void*) attName, 0);
   
  -            if (attValue.length() > 0) {
  -                // validate value
  +            if (attValueLen > 0) {
  +
  +                fBuffer.set(attValue.rawBuffer(), attValueLen);
  +                validate(attName, fBuffer.getRawBuffer(),
  +                         attInfo->getValidatorIndex(), schema);
   			}
               else {
                   if (attInfo->getDefaultOption() == Att_Required) {
  @@ -772,6 +811,87 @@
                   XMLErrs::AttributeDisallowed, fBuffer.getRawBuffer(), elemName);//"Attribute '{0}' cannot appear in '{1}'"
           }
       }
  +}
  +
  +
  +void GeneralAttributeCheck::validate(const XMLCh* const attName,
  +                                     const XMLCh* const attValue,
  +                                     const short dvIndex,
  +                                     TraverseSchema* const schema)
  +{
  +	bool isInvalid = false;
  +    DatatypeValidator* dv = 0;
  +
  +    switch (dvIndex) {
  +    case DT_Form:
  +        if (XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_QUALIFIED) != 0
  +            && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_UNQUALIFIED) != 0) {
  +            isInvalid = true;
  +        }
  +		break;
  +    case DT_MaxOccurs:
  +            // maxOccurs = (nonNegativeInteger | unbounded)
  +		if (XMLString::compareString(attValue, fgUnbounded) != 0) {
  +            dv = fValidators[DT_NonNegInt];
  +        }
  +        break;
  +    case DT_MaxOccurs1:
  +        if (XMLString::compareString(attValue, fgValueOne) != 0) {
  +            isInvalid = true;
  +        }
  +        break;
  +    case DT_MinOccurs1:
  +        if (XMLString::compareString(attValue, fgValueZero) != 0 
  +            && XMLString::compareString(attValue, fgValueOne) != 0) {
  +            isInvalid = true;
  +        }
  +        break;
  +    case DT_ProcessContents:
  +        if (XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_SKIP) != 0
  +            && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_LAX) != 0
  +            && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_STRICT) != 0) {
  +            isInvalid = true;
  +        }
  +        break;
  +    case DT_Use:
  +        if (XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_OPTIONAL) != 0
  +            && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_PROHIBITED) != 0
  +            && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_REQUIRED) != 0) {
  +            isInvalid = true;
  +        }
  +        break;
  +    case DT_WhiteSpace:
  +        if (XMLString::compareString(attValue, SchemaSymbols::fgWS_PRESERVE) != 0
  +            && XMLString::compareString(attValue, SchemaSymbols::fgWS_REPLACE) != 0
  +            && XMLString::compareString(attValue, SchemaSymbols::fgWS_COLLAPSE) != 0) {
  +            isInvalid = true;
  +        }
  +        break;
  +    case DT_Boolean:
  +        if (XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_TRUE) != 0
  +            && XMLString::compareString(attValue, SchemaSymbols::fgATTVAL_FALSE) != 0) {
  +            isInvalid = true;
  +        }
  +        break;
  +    case DT_NonNegInt:
  +		dv = fValidators[DT_NonNegInt];
  +		break;
  +    }
  +
  +    if (dv) {
  +        try {
  +            dv->validate(attValue);
  +        }
  +        catch(...) {
  +            isInvalid = true;
  +        }
  +    }
  +
  +	if (isInvalid) {
  +		      schema->reportSchemaError(XMLUni::fgXMLErrDomain, 
  +                                      XMLErrs::InvalidAttValue,
  +                                      attValue, attName);
  +	}
   }
   
   /**
  
  
  
  1.2       +25 -3     xml-xerces/c/src/validators/schema/GeneralAttributeCheck.hpp
  
  Index: GeneralAttributeCheck.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/validators/schema/GeneralAttributeCheck.hpp,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- GeneralAttributeCheck.hpp	2001/05/15 21:59:32	1.1
  +++ GeneralAttributeCheck.hpp	2001/05/17 18:11:16	1.2
  @@ -55,7 +55,7 @@
    */
   
   /*
  - * $Id: GeneralAttributeCheck.hpp,v 1.1 2001/05/15 21:59:32 knoaman Exp $
  + * $Id: GeneralAttributeCheck.hpp,v 1.2 2001/05/17 18:11:16 knoaman Exp $
    */
   
   #if !defined(GENERALATTRIBUTECHECK_HPP)
  @@ -80,6 +80,7 @@
   //  Forward declaration
   // ---------------------------------------------------------------------------
   class TraverseSchema;
  +class DatatypeValidator;
   
   class AttributeInfo {
   public:
  @@ -145,7 +146,7 @@
       // -----------------------------------------------------------------------
   	void checkAttributes(const DOM_Element& elem,
                            const unsigned short elemContext,
  -						 TraverseSchema* const scanner);
  +						 TraverseSchema* const schema);
   
   private:
       // -----------------------------------------------------------------------
  @@ -163,6 +164,7 @@
       //  Setup methods
       // -----------------------------------------------------------------------
       void setUpAttributes();
  +    void setUpValidators();
       void mapElements();
   
   	// -----------------------------------------------------------------------
  @@ -171,6 +173,12 @@
       void cleanUp();
   
   	// -----------------------------------------------------------------------
  +    //  Validation methods
  +    // -----------------------------------------------------------------------
  +    void validate(const XMLCh* const attName, const XMLCh* const attValue,
  +                  const short dvIndex, TraverseSchema* const schema);
  +
  +	// -----------------------------------------------------------------------
       //  Private Constants
       // -----------------------------------------------------------------------
       // attributes 
  @@ -240,7 +248,20 @@
           DT_ProcessContents = -11,
           DT_Public = -12,
           DT_Use = -13,
  -        DT_WhiteSpace = -14
  +        DT_WhiteSpace = -14,
  +        DT_Boolean = -15
  +    };
  +
  +    // datatype validators
  +    enum {
  +        DT_AnyURI,
  +        DT_ID,
  +        DT_NonNegInt,
  +        DT_QName,
  +        DT_Token,
  +
  +		// add XPath
  +        DT_Count
       };
   
       // element context prefixes
  @@ -261,6 +282,7 @@
       //  Private data members
       // -----------------------------------------------------------------------
       AttributeInfo**                                fAttributes;
  +    DatatypeValidator**                            fValidators;
       RefHash2KeysTableOf<RefVectorOfAttributeInfo>* fElementMap;
       XMLBuffer                                      fBuffer;
       static GeneralAttributeCheck* fInstance;
  
  
  
  1.7       +78 -37    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.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- TraverseSchema.cpp	2001/05/15 21:59:39	1.6
  +++ TraverseSchema.cpp	2001/05/17 18:11:18	1.7
  @@ -56,6 +56,9 @@
   
   /*
    * $Log: TraverseSchema.cpp,v $
  + * Revision 1.7  2001/05/17 18:11:18  knoaman
  + * More constraint and attribute checking.
  + *
    * Revision 1.6  2001/05/15 21:59:39  knoaman
    * TraverseSchema: add attribute checking + some fixes + more error messages.
    * More attribute cheking to come.
  @@ -876,8 +879,6 @@
                                         : GeneralAttributeCheck::LocalContext;
       fAttributeCheck->checkAttributes(elem, scope, this);
   
  -//    fCurrentTypeNameStack->push(XMLString::replicate(name));
  -
       // ------------------------------------------------------------------
       // Check if the type has already been registered
       // ------------------------------------------------------------------
  @@ -982,13 +983,13 @@
   
       if (XMLString::stringLen(lBlock) != 0 
           && XMLString::compareString(lBlock,SchemaSymbols::fgATTVAL_POUNDALL) != 0
  -        && ((blockSet & finalBlockValid) == 0)) {
  +        && blockSet != finalBlockValid) {
           reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidComplexTypeBlockValue, lBlock);
       }
   
       if (XMLString::stringLen(lFinal) != 0 
           && XMLString::compareString(lFinal,SchemaSymbols::fgATTVAL_POUNDALL) != 0
  -        && ((finalSet & finalBlockValid) == 0)) {
  +        && finalSet != finalBlockValid) {
           reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidComplexTypeFinalValue, lFinal);
       }
   
  @@ -1078,9 +1079,6 @@
               anyOtherType = ContentSpecNode::Any_Other_Skip;
               anyLocalType = ContentSpecNode::Any_Local_Skip;
           }
  -        else {
  -            reportSchemaError(0, 0, processContents); //"Invalid 'processContents' value: '{0}'
  -        }
       }
   
       // ------------------------------------------------------------------
  @@ -1657,14 +1655,17 @@
       }
   
       // Create element decl
  +    bool isDuplicate = false;
   	SchemaElementDecl* elemDecl =
  -       createSchemaElementDecl(elem, topLevel, contentSpecType);
  +       createSchemaElementDecl(elem, topLevel, contentSpecType, isDuplicate);
   
       if (elemDecl == 0) {
           return 0;
       }
   
  -    fSchemaGrammar->putElemDecl(elemDecl);
  +    if (!isDuplicate) {
  +		fSchemaGrammar->putElemDecl(elemDecl);
  +    }
   
       // Resolve the type for the element
       DOM_Element content = checkContent(elem, XUtil::getFirstChildElement(elem), true);
  @@ -1682,14 +1683,13 @@
                   reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::AnonComplexTypeWithName, name);
               }
               else {
  -
                   typeInfo = checkForComplexTypeInfo(content);
               }
   
               if (typeInfo == 0) {
                   noErrorFound = false;
               }
  -            else {
  +            else if (!isDuplicate) {
                   typeInfo->setElementId(elemDecl->getId());
               }
   
  @@ -1780,7 +1780,10 @@
                   fBuffer.set(uri);
                   fBuffer.append(chColon);
                   fBuffer.append(localPart);
  -                elemDecl->setSubstitutionGroupName(fBuffer.getRawBuffer());
  +
  +                if (!isDuplicate) {
  +                    elemDecl->setSubstitutionGroupName(fBuffer.getRawBuffer());
  +                }
               }
               else {
                   noErrorFound = false;
  @@ -1836,10 +1839,12 @@
           catch(...) {
               reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::DatatypeValidationFailure, deflt);
           }
  +
   
  -        if(typeInfo != 0 && 
  -           (typeInfo->getContentType() != SchemaElementDecl::Mixed &&
  -            typeInfo->getContentType() != SchemaElementDecl::Simple)) {
  +        if(typeInfo != 0 &&
  +           typeInfo->getContentType() != SchemaElementDecl::Simple &&
  +           (typeInfo->getContentType() != SchemaElementDecl::Mixed ||
  +            (contentSpecNode != 0 && contentSpecNode->getType() != ContentSpecNode::Leaf))) {
               reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::NotSimpleOrMixedElement, name);
           }
       }
  @@ -1848,15 +1853,28 @@
       // TO DO
   
   
  +
  +    // set element information, but first check for duplicate elements with
  +    // different types.
  +	if (isDuplicate) {
  +
  +        DatatypeValidator* eltDV = elemDecl->getDatatypeValidator();
  +        ComplexTypeInfo*   eltTypeInfo = elemDecl->getComplexTypeInfo();
  +
  +        if ( (eltTypeInfo != typeInfo) || (eltDV != validator) )  {
  +            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::DuplicateElementDeclaration, name);
  +        }
  +    }
  +    else {
   
  -    // set element information
  -    elemDecl->setDatatypeValidator(validator);
  -    elemDecl->setComplexTypeInfo(typeInfo);
  -    elemDecl->setDefaultValue(deflt);
  -    elemDecl->setDefinedScope(scopeDefined);
  -    elemDecl->setModelType(contentSpecType);
  -    elemDecl->setContentSpec(contentSpecNode);
  -    elemDecl->setTypeFromAnotherSchemaURI(anotherSchemaURI);
  +        elemDecl->setDatatypeValidator(validator);
  +        elemDecl->setComplexTypeInfo(typeInfo);
  +        elemDecl->setDefaultValue(deflt);
  +        elemDecl->setDefinedScope(scopeDefined);
  +        elemDecl->setModelType(contentSpecType);
  +        elemDecl->setContentSpec(contentSpecNode);
  +        elemDecl->setTypeFromAnotherSchemaURI(anotherSchemaURI);
  +    }
   
       return new QName(elemDecl->getElementName());
   }
  @@ -2021,7 +2039,7 @@
   
           if (content.getNodeType() == DOM_Node::ELEMENT_NODE) {
   
  -            fAttributeCheck->checkAttributes(contentElem, scope, this);
  +            fAttributeCheck->checkAttributes(content, scope, this);
               facetName = content.getLocalName();
               fBuffer.set(facetName.rawBuffer(), facetName.length());
   
  @@ -2725,7 +2743,8 @@
       // First, handle any ANNOTATION declaration
       // ------------------------------------------------------------------
       if (checkContent(elem, XUtil::getFirstChildElement(elem), true) != 0) {
  -//        reportSchemaError("anyAttribute elements can contain at most one 'annotation' element in their children");
  +        reportSchemaError(XMLUni::fgXMLErrDomain,
  +                          XMLErrs::AnyAttributeContentError);
       }
   
       // ------------------------------------------------------------------
  @@ -2753,9 +2772,6 @@
                                         SchemaSymbols::fgATTVAL_LAX) == 0) {
           attDefType = XMLAttDef::ProcessContents_Lax;
       }
  -    else {
  -//        reportSchemaError(0, 0, processContents); //"Invalid 'processContents' value: '{0}'
  -    }
   
       // ------------------------------------------------------------------
       // Process 'namespace' attribute
  @@ -3496,7 +3512,8 @@
           elemDecl = getElementDeclFromNS(nameURI, localPart);
       }
       else {
  -            elemDecl = (SchemaElementDecl*)
  +
  +        elemDecl = (SchemaElementDecl*)
                   fSchemaGrammar->getElemDecl(fTargetNSURI, localPart,
   				                            0, Grammar::TOP_LEVEL_SCOPE);
   
  @@ -3647,7 +3664,8 @@
   SchemaElementDecl* 
   TraverseSchema::createSchemaElementDecl(const DOM_Element& elem,
                                           const bool topLevel,
  -                                        const unsigned short elemType)
  +                                        const unsigned short elemType,
  +                                        bool& isDuplicate)
   {
       const XMLCh* name = getElementAttValue(elem, SchemaSymbols::fgATT_NAME);
       const XMLCh* elemForm = getElementAttValue(elem, SchemaSymbols::fgATT_FORM);
  @@ -3667,13 +3685,14 @@
       }
   
       // Check for duplicate elements
  -    const SchemaElementDecl* other = (SchemaElementDecl*)
  +    SchemaElementDecl* other = (SchemaElementDecl*)
   		fSchemaGrammar->getElemDecl(uriIndex, name, 0, enclosingScope);
   
       if (other != 0) {
   
  -        reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::DuplicateElementDeclaration, name);
  -        return 0;
  +        //reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::DuplicateElementDeclaration, name);
  +        isDuplicate = true;
  +        return other;
       }
   
       const XMLCh* block = getElementAttValue(elem,SchemaSymbols::fgATT_BLOCK);
  @@ -3686,13 +3705,13 @@
   
       if (XMLString::stringLen(block) != 0 
   		&& XMLString::compareString(block,SchemaSymbols::fgATTVAL_POUNDALL) != 0
  -        && ((blockSet & blockValid) == 0)) {
  +        && blockSet != blockValid) {
           reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidElementBlockValue, block);
       }
   
       if (XMLString::stringLen(final) != 0 
   		&& XMLString::compareString(final,SchemaSymbols::fgATTVAL_POUNDALL) != 0
  -        && ((finalSet & finalValid) == 0)) {
  +        && finalSet != finalValid) {
           reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidElementFinalValue, final);
       }
   
  @@ -3705,7 +3724,7 @@
               elementMiscFlags += SchemaSymbols::NILLABLE;
           }
           else if (XMLString::compareString(nillable, SchemaSymbols::fgATTVAL_FALSE) != 0) {
  -            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidElementNillableValue, nillable);
  +//            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue, nillable, SchemaSymbols::fgATT_NILLABLE);
           }
       }
   
  @@ -3715,7 +3734,7 @@
               elementMiscFlags += SchemaSymbols::ABSTRACT;
           }
           else if (XMLString::compareString(abstract, SchemaSymbols::fgATTVAL_FALSE) != 0) {
  -            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidElementAbstractValue, abstract);
  +//            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue, abstract, SchemaSymbols::fgATT_ABSTRACT);
           }
       }
   
  @@ -3878,6 +3897,27 @@
   
       if (minOccurs == 0 && maxOccurs == 0 && !isMaxUnbounded) {
           return 0;
  +    }
  +
  +    // Constraint checking for min/max value 
  +    if (!isMaxUnbounded) {
  +
  +        XMLCh tmpMinStr[128];
  +        XMLCh tmpMaxStr[128];
  +
  +        XMLString::binToText(minOccurs, tmpMinStr, 255, 10);
  +        XMLString::binToText(maxOccurs, tmpMaxStr, 255, 10);
  +
  +        if (maxOccurs < 1) {
  +            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidAttValue,
  +                              tmpMaxStr, SchemaSymbols::fgATT_MAXOCCURS);
  +        }
  +        else if (maxOccurs < minOccurs) {
  +
  +            fBuffer.set(nOccurs.rawBuffer(), nOccurs.length());
  +            reportSchemaError(XMLUni::fgXMLErrDomain, XMLErrs::InvalidMin2MaxOccurs,
  +                              tmpMinStr, tmpMaxStr);
  +        }
       }
   
       ContentSpecNode* saveNode = specNode;
  
  
  
  1.6       +3 -2      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.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TraverseSchema.hpp	2001/05/15 21:59:42	1.5
  +++ TraverseSchema.hpp	2001/05/17 18:11:19	1.6
  @@ -55,7 +55,7 @@
    */
   
   /*
  - * $Id: TraverseSchema.hpp,v 1.5 2001/05/15 21:59:42 knoaman Exp $
  + * $Id: TraverseSchema.hpp,v 1.6 2001/05/17 18:11:19 knoaman Exp $
    */
   
   #if !defined(TRAVERSESCHEMA_HPP)
  @@ -383,7 +383,8 @@
         */
       SchemaElementDecl* createSchemaElementDecl(const DOM_Element& elem,
                                                  const bool topLevel,
  -                                               const unsigned short elemType);
  +                                               const unsigned short elemType,
  +                                               bool& isDuplicate);
   
       /**
         * Return the value of a given attribute name from an element node
  
  
  

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