knoaman     2003/11/23 08:32:21

  Modified:    c/src/xercesc/validators/schema TraverseSchema.hpp
                        TraverseSchema.cpp
  Log:
  PSVI: differentiate between local elements declared in complex types from the
  ones declared in groups.
  
  Revision  Changes    Path
  1.30      +5 -1      xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.hpp
  
  Index: TraverseSchema.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.hpp,v
  retrieving revision 1.29
  retrieving revision 1.30
  diff -u -r1.29 -r1.30
  --- TraverseSchema.hpp        20 Nov 2003 18:00:12 -0000      1.29
  +++ TraverseSchema.hpp        23 Nov 2003 16:32:21 -0000      1.30
  @@ -576,6 +576,10 @@
                            ComplexTypeInfo* const baseTypeInfo,
                            ComplexTypeInfo* const newTypeInfo);
   
  +    void processElements(const DOMElement* const elem,
  +                         XercesGroupInfo* const fromGroup,
  +                         ComplexTypeInfo* const typeInfo);
  +
       void copyGroupElements(const DOMElement* const elem,
                              XercesGroupInfo* const fromGroup,
                              XercesGroupInfo* const toGroup,
  
  
  
  1.98      +54 -7     xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp
  
  Index: TraverseSchema.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/schema/TraverseSchema.cpp,v
  retrieving revision 1.97
  retrieving revision 1.98
  diff -u -r1.97 -r1.98
  --- TraverseSchema.cpp        21 Nov 2003 22:34:46 -0000      1.97
  +++ TraverseSchema.cpp        23 Nov 2003 16:32:21 -0000      1.98
  @@ -1461,10 +1461,7 @@
       fCurrentGroupStack->addElement(nameIndex);
       fCurrentGroupInfo = groupInfo;
   
  -    if (fCurrentScope == Grammar::TOP_LEVEL_SCOPE) {
  -        fCurrentScope = fScopeCount++;
  -    }
  -
  +    fCurrentScope = fScopeCount++;
       fCurrentGroupInfo->setScope(fCurrentScope);
   
       if (content == 0) {
  @@ -1496,6 +1493,10 @@
           if (illegalChild || XUtil::getNextSiblingElement(content) != 0) {
               reportSchemaError(content, XMLUni::fgXMLErrDomain, 
XMLErrs::GroupContentError, name);
           }
  +
  +        // copy local elements to complex type if it exists
  +        if (fCurrentComplexType)
  +           processElements(elem, fCurrentGroupInfo, fCurrentComplexType); 
       }
   
       // ------------------------------------------------------------------
  @@ -1525,11 +1526,17 @@
                               0, ((XSDElementNSImpl*) elem)->getLineNo(),
                               ((XSDElementNSImpl*) elem)->getColumnNo());
                
  -        if (fRedefineComponents && 
fRedefineComponents->get(SchemaSymbols::fgELT_GROUP, nameIndex)) {
  +        if (fRedefineComponents && 
fRedefineComponents->get(SchemaSymbols::fgELT_GROUP, nameIndex))
  +        {
   
               fBuffer.set(fullName);
               fBuffer.append(SchemaSymbols::fgRedefIdentifier);
  -            groupInfo->setBaseGroup(fGroupRegistry->get(fBuffer.getRawBuffer()));
  +            unsigned int rdfNameIndex = 
fStringPool->addOrFind(fBuffer.getRawBuffer());
  +
  +            if (fCurrentGroupStack->containsElement(rdfNameIndex))
  +                reportSchemaError(elem, XMLUni::fgXMLErrDomain, 
XMLErrs::NoCircularDefinition, name);
  +            else
  +                
groupInfo->setBaseGroup(fGroupRegistry->get(fBuffer.getRawBuffer()));
           }
       }
   
  @@ -6822,6 +6829,46 @@
               }
   
               newTypeInfo->addElement(elemDecl);
  +        }
  +    }
  +}
  +
  +void TraverseSchema::processElements(const DOMElement* const elem,
  +                                     XercesGroupInfo* const fromGroup,
  +                                     ComplexTypeInfo* const typeInfo)
  +{
  +    unsigned int elemCount = fromGroup->elementCount();
  +    int newScope = typeInfo->getScopeDefined();
  +
  +    for (unsigned int i = 0; i < elemCount; i++) {
  +
  +        SchemaElementDecl* elemDecl = fromGroup->elementAt(i);
  +        int elemScope = elemDecl->getEnclosingScope();
  +
  +        if (elemScope != Grammar::TOP_LEVEL_SCOPE)
  +        {
  +            int                      elemURI = elemDecl->getURI();
  +            const XMLCh*             localPart = elemDecl->getBaseName();
  +            const SchemaElementDecl* other = (SchemaElementDecl*)
  +                    fSchemaGrammar->getElemDecl(elemURI, localPart, 0, newScope);
  +
  +            if (other)
  +            {
  +                if (elemDecl->getComplexTypeInfo() != other->getComplexTypeInfo()
  +                    || elemDecl->getDatatypeValidator() != 
other->getDatatypeValidator())
  +                {
  +                   reportSchemaError(
  +                       elem, XMLUni::fgXMLErrDomain
  +                       , XMLErrs::DuplicateElementDeclaration, localPart);
  +                }
  +
  +                continue;
  +            }
  +
  +            elemDecl->setEnclosingScope(newScope);
  +            fSchemaGrammar->putGroupElemDecl(elemDecl);
  +            elemDecl->setEnclosingScope(elemScope);
  +            typeInfo->addElement(elemDecl);
           }
       }
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to