cargilld    2004/09/29 12:27:07

  Modified:    c/src/xercesc/framework XMLGrammarPool.hpp
               c/src/xercesc/internal XMLGrammarPoolImpl.cpp
                        XMLGrammarPoolImpl.hpp
               c/src/xercesc/validators/common GrammarResolver.cpp
  Log:
  Fix for Jira-1217: fixing problems with getXSModel.
  
  Revision  Changes    Path
  1.14      +27 -1     xml-xerces/c/src/xercesc/framework/XMLGrammarPool.hpp
  
  Index: XMLGrammarPool.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/framework/XMLGrammarPool.hpp,v
  retrieving revision 1.13
  retrieving revision 1.14
  diff -u -r1.13 -r1.14
  --- XMLGrammarPool.hpp        8 Sep 2004 13:55:59 -0000       1.13
  +++ XMLGrammarPool.hpp        29 Sep 2004 19:27:07 -0000      1.14
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.14  2004/09/29 19:27:07  cargilld
  + * Fix for Jira-1217: fixing problems with getXSModel.
  + *
    * Revision 1.13  2004/09/08 13:55:59  peiyongz
    * Apache License Version 2.0
    *
  @@ -223,8 +226,31 @@
         * creation of a new XSModel with the old XSModel being deleted.  The
         * function will return a different address for the XSModel if it has
         * changed.
  +      * 
  +      * @deprecated (shouldn't use address to determine if XSModel changed)
         */
       virtual XSModel *getXSModel() = 0;
  +
  +    /***
  +      * Return an XSModel derived from the components of all SchemaGrammars
  +      * in the grammar pool.  If the pool is locked, this should
  +      * be a thread-safe operation.
  +      *
  +      * NOTE: The function should NEVER return NULL.  If there are no grammars in
  +      *       the pool it should return an XSModel containing the Schema for 
Schema.      
  +      *
  +      * Calling getXSModel() on an unlocked grammar pool may result in the
  +      * creation of a new XSModel with the old XSModel being deleted.
  +      * The bool parameter will indicate if the XSModel was changed.
  +      *     
  +      * For source code compatibility, default implementation is to say
  +      * XSModelWasChanged.
  +      */
  +    virtual XSModel *getXSModel(bool& XSModelWasChanged)
  +    {
  +        XSModelWasChanged = true;
  +        return getXSModel();
  +    }
        
       // @}
   
  
  
  
  1.23      +29 -28    xml-xerces/c/src/xercesc/internal/XMLGrammarPoolImpl.cpp
  
  Index: XMLGrammarPoolImpl.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLGrammarPoolImpl.cpp,v
  retrieving revision 1.22
  retrieving revision 1.23
  diff -u -r1.22 -r1.23
  --- XMLGrammarPoolImpl.cpp    10 Sep 2004 17:36:13 -0000      1.22
  +++ XMLGrammarPoolImpl.cpp    29 Sep 2004 19:27:07 -0000      1.23
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.23  2004/09/29 19:27:07  cargilld
  + * Fix for Jira-1217: fixing problems with getXSModel.
  + *
    * Revision 1.22  2004/09/10 17:36:13  cargilld
    * Return bool as described in the interface for cacheGrammar instead of throwing 
an exception.  Fix from Dave Bertoni.
    *
  @@ -111,27 +114,8 @@
   // private function used to update fXSModel
   void XMLGrammarPoolImpl::createXSModel()
   {
  -    RefHashTableOfEnumerator<Grammar> grammarEnum(fGrammarRegistry, false, 
getMemoryManager());
  -    if (fXSModel)
  -    {
  -        // Need to guarantee that we return a different address...        
  -        if (grammarEnum.hasMoreElements())
  -        {
  -            XSModel* xsModel = new (getMemoryManager()) XSModel(this, 
getMemoryManager());
  -            delete fXSModel;
  -            fXSModel = xsModel;
  -        }
  -        else 
  -        {
  -            // its empty...
  -            delete fXSModel;
  -            fXSModel = 0;
  -        }
  -    }
  -    else if (grammarEnum.hasMoreElements())
  -    {
  -        fXSModel = new (getMemoryManager()) XSModel(this, getMemoryManager());
  -    }
  +    delete fXSModel;
  +    fXSModel = new (getMemoryManager()) XSModel(this, getMemoryManager());
       fXSModelIsValid = true; 
   }
   
  @@ -178,8 +162,10 @@
   
       fGrammarRegistry->put((void*) grammarKey, gramToCache);
       
  -    fXSModelIsValid = false;
  -
  +    if (fXSModelIsValid && gramToCache->getGrammarType() == 
Grammar::SchemaGrammarType)
  +    {
  +        fXSModelIsValid = false;
  +    }
       return true;
   }
   
  @@ -197,9 +183,13 @@
   Grammar* XMLGrammarPoolImpl::orphanGrammar(const XMLCh* const nameSpaceKey)
   {
       if (!fLocked)
  -    {
  -        fXSModelIsValid = false;
  -        return fGrammarRegistry->orphanKey(nameSpaceKey); 
  +    {        
  +        Grammar* grammar = fGrammarRegistry->orphanKey(nameSpaceKey); 
  +        if (fXSModelIsValid && grammar && grammar->getGrammarType() == 
Grammar::SchemaGrammarType)
  +        {
  +            fXSModelIsValid = false;
  +        }
  +        return grammar;
       }
       return 0;
   }
  @@ -296,8 +286,19 @@
   
       if (fXSModelIsValid)
           return fXSModel;
  -
  +        
       createXSModel();    
  +    return fXSModel;
  +}
  +
  +XSModel *XMLGrammarPoolImpl::getXSModel(bool& XSModelWasChanged)
  +{
  +    XSModelWasChanged = false;
  +    if (fLocked || fXSModelIsValid)
  +        return fXSModel;
  +        
  +    createXSModel();        
  +    XSModelWasChanged = true;
       return fXSModel;
   }
   
  
  
  
  1.17      +31 -2     xml-xerces/c/src/xercesc/internal/XMLGrammarPoolImpl.hpp
  
  Index: XMLGrammarPoolImpl.hpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XMLGrammarPoolImpl.hpp,v
  retrieving revision 1.16
  retrieving revision 1.17
  diff -u -r1.16 -r1.17
  --- XMLGrammarPoolImpl.hpp    8 Sep 2004 13:56:14 -0000       1.16
  +++ XMLGrammarPoolImpl.hpp    29 Sep 2004 19:27:07 -0000      1.17
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.17  2004/09/29 19:27:07  cargilld
  + * Fix for Jira-1217: fixing problems with getXSModel.
  + *
    * Revision 1.16  2004/09/08 13:56:14  peiyongz
    * Apache License Version 2.0
    *
  @@ -226,9 +229,35 @@
         * operation is called.  The XSModel will not be serialized,
         * but will be recreated if a deserialized pool is in the 
         * locked state.
  +      *
  +      * @deprecated (shouldn't use address to determine if XSModel changed)
         */
       virtual XSModel *getXSModel();
  -     
  +
  +    /***
  +      * Return an XSModel derived from the components of all SchemaGrammars
  +      * in the grammar pool.  If the pool is locked, this should
  +      * be a thread-safe operation.  
  +      *
  +      * NOTE: The function should NEVER return NULL.  If there are no grammars in
  +      *       the pool it should return an XSModel containing the Schema for Schema.
  +      *
  +      * Calling getXSModel() on an unlocked grammar pool may result in the
  +      * creation of a new XSModel with the old XSModel being deleted.
  +      * The bool parameter will indicate if the XSModel was changed.
  +      *  
  +      * In this implementation, when the pool is not locked a new XSModel will be
  +      * computed each this time the pool is called if the pool has changed (and the
  +      * previous one will be destroyed at that time).  When the lockPool()
  +      * method is called, an XSModel will be generated and returned whenever this 
method is called
  +      * while the pool is in the locked state.  This will be destroyed if the 
unlockPool()
  +      * operation is called.  The XSModel will not be serialized,
  +      * but will be recreated if a deserialized pool is in the 
  +      * locked state.
  +      *      
  +      */
  +    virtual XSModel *getXSModel(bool& XSModelWasChanged);
  +
       // @}
       // -----------------------------------------------------------------------
       /** @name  Getter */
  
  
  
  1.29      +22 -17    xml-xerces/c/src/xercesc/validators/common/GrammarResolver.cpp
  
  Index: GrammarResolver.cpp
  ===================================================================
  RCS file: /home/cvs/xml-xerces/c/src/xercesc/validators/common/GrammarResolver.cpp,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- GrammarResolver.cpp       8 Sep 2004 13:56:51 -0000       1.28
  +++ GrammarResolver.cpp       29 Sep 2004 19:27:07 -0000      1.29
  @@ -16,6 +16,9 @@
   
   /*
    * $Log$
  + * Revision 1.29  2004/09/29 19:27:07  cargilld
  + * Fix for Jira-1217: fixing problems with getXSModel.
  + *
    * Revision 1.28  2004/09/08 13:56:51  peiyongz
    * Apache License Version 2.0
    *
  @@ -457,21 +460,24 @@
           // We know if the grammarpool changed thru caching, orphaning and erasing
           // but NOT by other mechanisms such as lockPool() or unlockPool() so it
           // is safest to always get it.  The grammarPool XSModel will only be 
  -        // regenerated if something changed and in that case it will have a new
  -        // address.
  -        xsModel = fGrammarPool->getXSModel();
  -        if (xsModel != fGrammarPoolXSModel)
  +        // regenerated if something changed.
  +        bool XSModelWasChanged;
  +        // The grammarpool will always return an xsmodel, even if it is just
  +        // the schema for schema xsmodel...
  +        xsModel = fGrammarPool->getXSModel(XSModelWasChanged);
  +        if (XSModelWasChanged)
           {
               // we know the grammarpool XSModel has changed or this is the
               // first call to getXSModel
               if (!fGrammarPoolXSModel && (fGrammarsToAddToXSModel->size() == 0) &&
                   !fXSModel)
  -            {
  +            { 
                   fGrammarPoolXSModel = xsModel;
                   return fGrammarPoolXSModel;
               }
               else
               {
  +                fGrammarPoolXSModel = xsModel;
                   // We had previously augmented the grammar pool XSModel
                   // with our our grammars or we would like to upate it now
                   // so we have to regenerate the XSModel
  @@ -483,18 +489,15 @@
                       if (grammar.getGrammarType() == Grammar::SchemaGrammarType)
                           
fGrammarsToAddToXSModel->addElement((SchemaGrammar*)&grammar);
                   }
  -                if (fXSModel)
  -                {
  -                    xsModel = new (fMemoryManager) XSModel(fGrammarPoolXSModel, 
this, fMemoryManager);
  -                    delete fXSModel;
  -                    fXSModel = xsModel;
  -                }
  -                else
  -                {
  -                    fXSModel = new (fMemoryManager) XSModel(fGrammarPoolXSModel, 
this, fMemoryManager);   
  -                }
  -                fGrammarsToAddToXSModel->removeAllElements();
  -                return fXSModel;
  +                delete fXSModel;
  +                if (fGrammarsToAddToXSModel->size())
  +                {                    
  +                    fXSModel = new (fMemoryManager) XSModel(fGrammarPoolXSModel, 
this, fMemoryManager);
  +                    fGrammarsToAddToXSModel->removeAllElements();
  +                    return fXSModel;
  +                }       
  +                fXSModel = 0; 
  +                return fGrammarPoolXSModel;                                         
             
               }       
           }
           else {
  @@ -523,6 +526,8 @@
               {
                   return fGrammarPoolXSModel;
               }
  +            fXSModel = new (fMemoryManager) XSModel(0, this, fMemoryManager);    
  +            return fXSModel;    
           }
       }
       // Not Caching...
  
  
  

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

Reply via email to