knoaman     2004/01/06 18:33:56

  Modified:    c/src/xercesc/internal XSObjectFactory.hpp
                        XSObjectFactory.cpp
  Log:
  PSVI: inherit facets from base type
  
  Revision  Changes    Path
  1.8       +5 -0      xml-xerces/c/src/xercesc/internal/XSObjectFactory.hpp
  
  Index: XSObjectFactory.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSObjectFactory.hpp,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- XSObjectFactory.hpp       29 Dec 2003 16:15:41 -0000      1.7
  +++ XSObjectFactory.hpp       7 Jan 2004 02:33:56 -0000       1.8
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.8  2004/01/07 02:33:56  knoaman
  + * PSVI: inherit facets from base type
  + *
    * Revision 1.7  2003/12/29 16:15:41  knoaman
    * More PSVI updates
    *
  @@ -269,6 +272,8 @@
           SchemaAttDef* const attDef
           , XSAttributeUse* const xsAttUse
       );
  +
  +    bool isMultiValueFacetDefined(DatatypeValidator* const dv);
   
       // make XSModel our friend
       friend class XSModel;
  
  
  
  1.19      +104 -48   xml-xerces/c/src/xercesc/internal/XSObjectFactory.cpp
  
  Index: XSObjectFactory.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSObjectFactory.cpp,v
  retrieving revision 1.18
  retrieving revision 1.19
  diff -u -r1.18 -r1.19
  --- XSObjectFactory.cpp       6 Jan 2004 15:24:42 -0000       1.18
  +++ XSObjectFactory.cpp       7 Jan 2004 02:33:56 -0000       1.19
  @@ -56,6 +56,9 @@
   
   /*
    * $Log$
  + * Revision 1.19  2004/01/07 02:33:56  knoaman
  + * PSVI: inherit facets from base type
  + *
    * Revision 1.18  2004/01/06 15:24:42  neilg
    * make sure locally-declared attributes have declarations in the PSVI
    *
  @@ -151,6 +154,7 @@
   
   static XMLCh regexSeparator[] = {chPipe, chNull};
   
  +
   // ---------------------------------------------------------------------------
   //  XSObjectFactory: Constructors and Destructor
   // ---------------------------------------------------------------------------
  @@ -481,8 +485,7 @@
               xsObj->setPrimitiveType(xsObj);
   
           // process facets
  -        if (validator->getFacetsDefined())
  -            processFacets(validator, xsModel, xsObj);
  +        processFacets(validator, xsModel, xsObj);
       }
   
       return xsObj;
  @@ -903,53 +906,52 @@
        fDeleteVector->addElement(object);
   }
   
  -
   void XSObjectFactory::processFacets(DatatypeValidator* const dv,
                                       XSModel* const xsModel,
                                       XSSimpleTypeDefinition* const xsST)
   {
       // NOTE: XSMultiValueFacetList is not owned by XSModel!
       // NOTE: XSFacetList is not owned by XSModel!
  +    bool isFixed = false;
  +    int dvFacetsDefined = dv->getFacetsDefined();
  +    int dvFixedFacets = dv->getFixed();
       int definedFacets = 0;
       int fixedFacets = 0;
  -    XSFacetList* xsFacetList = new (fMemoryManager) RefVectorOf<XSFacet>(4, true, 
fMemoryManager);
       XSMultiValueFacetList* xsMultiFacetList = 0;
       StringList* patternList = 0;
  -    bool isFixed = false;
  -    int dvFacetsDefined = dv->getFacetsDefined();
  -    int dvFixedFacets = dv->getFixed();
  +    XSFacetList* xsFacetList = new (fMemoryManager) RefVectorOf<XSFacet>(4, false, 
fMemoryManager);
   
  -    if ((dvFacetsDefined & DatatypeValidator::FACET_PATTERN)
  -        || (dvFacetsDefined & DatatypeValidator::FACET_ENUMERATION))
  -        xsMultiFacetList = new (fMemoryManager) RefVectorOf<XSMultiValueFacet>(2, 
true, fMemoryManager);
  +    if (isMultiValueFacetDefined(dv))
  +        xsMultiFacetList = new (fMemoryManager) RefVectorOf<XSMultiValueFacet>(2, 
false, fMemoryManager);
   
       if (dvFacetsDefined & DatatypeValidator::FACET_ENUMERATION)
       {
           RefArrayVectorOf<XMLCh>* enumList = (RefArrayVectorOf<XMLCh>*) 
dv->getEnumString();
  -        isFixed = ((dvFixedFacets & DatatypeValidator::FACET_ENUMERATION) != 0);
   
  -        // NOTE: Don't need to add multivaluefacet to "ObjectMap -> 
getObjectFromMap/putObjectInMap);
  -        xsMultiFacetList->addElement(
  -            new (fMemoryManager) XSMultiValueFacet(
  -                XSSimpleTypeDefinition::FACET_ENUMERATION , enumList, isFixed
  -                , getAnnotationFromModel(xsModel, enumList)
  -                , xsModel, fMemoryManager)
  +        if (dvFixedFacets & DatatypeValidator::FACET_ENUMERATION)
  +        {
  +            isFixed = true;
  +            fixedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION;
  +        }
  +
  +        XSMultiValueFacet* mvFacet = new (fMemoryManager) XSMultiValueFacet(
  +            XSSimpleTypeDefinition::FACET_ENUMERATION , enumList, isFixed
  +            , getAnnotationFromModel(xsModel, enumList), xsModel, fMemoryManager
           );
  +
  +        fDeleteVector->addElement(mvFacet);
  +        xsMultiFacetList->addElement(mvFacet);
           definedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION;
  -        if (isFixed)
  -            fixedFacets |= XSSimpleTypeDefinition::FACET_ENUMERATION;
       }
   
  -    RefHashTableOf<KVStringPair>* facets = dv->getFacets();
  -    if (facets)
  +    if (dv->getFacets())
       {
  -        // NOTE: Don't need to add facet to "ObjectMap -> 
getObjectFromMap/putObjectInMap);
  -        RefHashTableOfEnumerator<KVStringPair> e(facets, false, fMemoryManager);
  +        RefHashTableOfEnumerator<KVStringPair> e(dv->getFacets(), false, 
fMemoryManager);
           while (e.hasMoreElements())
           {
               KVStringPair& pair = e.nextElement();
               XMLCh* key = pair.getKey();
  -            XSSimpleTypeDefinition::FACET facetType = 
XSSimpleTypeDefinition::FACET_NONE;
  +            XSSimpleTypeDefinition::FACET facetType;
               XSAnnotation* annot = getAnnotationFromModel(xsModel, &pair);
   
               if (XMLString::equals(key, SchemaSymbols::fgELT_MAXINCLUSIVE))
  @@ -1005,21 +1007,26 @@
               else if (XMLString::equals(key, SchemaSymbols::fgELT_PATTERN))
               {
                   XMLStringTokenizer tokenizer(dv->getPattern(), regexSeparator, 
fMemoryManager);
  -                patternList = new (fMemoryManager) 
RefArrayVectorOf<XMLCh>(tokenizer.countTokens(), true, fMemoryManager);
  +                patternList = new (fMemoryManager) RefArrayVectorOf<XMLCh>(
  +                    tokenizer.countTokens(), true, fMemoryManager
  +                );
                   
                   while (tokenizer.hasMoreTokens())
                       
patternList->addElement(XMLString::replicate(tokenizer.nextToken(), fMemoryManager));
   
  -                isFixed = ((dvFixedFacets & DatatypeValidator::FACET_PATTERN) != 0);
  -                // NOTE: Don't need to add multivaluefacet to "ObjectMap -> 
getObjectFromMap/putObjectInMap);
  -                xsMultiFacetList->addElement(
  -                    new (fMemoryManager) XSMultiValueFacet(
  -                        XSSimpleTypeDefinition::FACET_PATTERN, patternList
  -                        , isFixed, annot, xsModel, fMemoryManager)
  -                 );
  -                definedFacets |= XSSimpleTypeDefinition::FACET_PATTERN;
  -                if (isFixed) 
  +                if (dvFixedFacets & DatatypeValidator::FACET_PATTERN)
  +                {
  +                    isFixed = true;
                       fixedFacets |= XSSimpleTypeDefinition::FACET_PATTERN;
  +                }
  +
  +                XSMultiValueFacet* mvFacet = new (fMemoryManager) XSMultiValueFacet(
  +                    XSSimpleTypeDefinition::FACET_PATTERN, patternList
  +                    , isFixed, annot, xsModel, fMemoryManager
  +                );
  +                fDeleteVector->addElement(mvFacet);
  +                xsMultiFacetList->addElement(mvFacet);
  +                definedFacets |= XSSimpleTypeDefinition::FACET_PATTERN;
                   continue;
               }
               else
  @@ -1029,11 +1036,11 @@
                   continue;
               }
   
  -            xsFacetList->addElement(
  -                new (fMemoryManager) XSFacet(
  -                    facetType, pair.getValue(), isFixed, annot, xsModel, 
fMemoryManager)
  -            );
  +            XSFacet* xsFacet = new (fMemoryManager) XSFacet(
  +                facetType, pair.getValue(), isFixed, annot, xsModel, 
fMemoryManager);
   
  +            fDeleteVector->addElement(xsFacet);
  +            xsFacetList->addElement(xsFacet);
               definedFacets |= facetType;
               if (isFixed) 
                   fixedFacets |= facetType;
  @@ -1041,20 +1048,53 @@
       }
   
       // add whistespace facet if missing
  -    if (!(definedFacets & XSSimpleTypeDefinition::FACET_WHITESPACE))
  +    if ((definedFacets & XSSimpleTypeDefinition::FACET_WHITESPACE) == 0)
       {
  -        xsFacetList->addElement
  -        (
  -            new (fMemoryManager) XSFacet
  -            (
  -                XSSimpleTypeDefinition::FACET_WHITESPACE
  -                , dv->getWSstring(dv->getWSFacet())
  -                , false, 0, xsModel, fMemoryManager
  -            )
  -        );
  +        XSFacet* xsFacet = new (fMemoryManager) XSFacet(
  +            XSSimpleTypeDefinition::FACET_WHITESPACE
  +            , dv->getWSstring(dv->getWSFacet())
  +            , false, 0, xsModel, fMemoryManager);
  +
  +        fDeleteVector->addElement(xsFacet);
  +        xsFacetList->addElement(xsFacet);
           definedFacets |= XSSimpleTypeDefinition::FACET_WHITESPACE;
       }
   
  +    // inherit facets from base
  +    if (xsST->getBaseType())
  +    {
  +        XSSimpleTypeDefinition* baseST = (XSSimpleTypeDefinition*) 
xsST->getBaseType();
  +        XSFacetList* baseFacets = baseST->getFacets();
  +
  +        for (unsigned int i=0; i<baseFacets->size(); i++)
  +        {
  +            XSFacet* bFacet = baseFacets->elementAt(i);
  +            if ((definedFacets & bFacet->getFacetKind()) == 0)
  +            {
  +                definedFacets |= bFacet->getFacetKind();
  +                xsFacetList->addElement(bFacet);
  +                if (bFacet->isFixed())
  +                    fixedFacets |= bFacet->getFacetKind();
  +            }
  +        }
  +
  +        if (baseST->getMultiValueFacets())
  +        {
  +            XSMultiValueFacetList* baseMVFacets = baseST->getMultiValueFacets();
  +            for (unsigned int j=0; j<baseMVFacets->size(); j++)
  +            {
  +                XSMultiValueFacet* bFacet = baseMVFacets->elementAt(j);
  +                if ((definedFacets & bFacet->getFacetKind()) == 0)
  +                {
  +                    definedFacets |= bFacet->getFacetKind();
  +                    xsMultiFacetList->addElement(bFacet);
  +                    if (bFacet->isFixed())
  +                        fixedFacets |= bFacet->getFacetKind();
  +                }
  +            }
  +        }
  +    }
  +
       xsST->setFacetInfo(definedFacets, fixedFacets, xsFacetList, xsMultiFacetList, 
patternList);
   }
   
  @@ -1079,6 +1119,22 @@
           isRequired = true;
   
       xsAttUse->set(isRequired, constraintType, attDef->getValue());
  +}
  +
  +bool XSObjectFactory::isMultiValueFacetDefined(DatatypeValidator* const dv)
  +{
  +    DatatypeValidator* tmpDV = dv;
  +
  +    while (tmpDV)
  +    {
  +        if ((tmpDV->getFacetsDefined() & DatatypeValidator::FACET_PATTERN)
  +        ||  (tmpDV->getFacetsDefined() & DatatypeValidator::FACET_ENUMERATION))
  +            return true;
  +
  +        tmpDV = tmpDV->getBaseValidator();
  +    }
  +
  +    return false;
   }
   
   XERCES_CPP_NAMESPACE_END
  
  
  

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

Reply via email to