peiyongz 2003/10/29 08:16:08 Modified: c/src/xercesc/internal XMLGrammarPoolImpl.cpp XMLGrammarPoolImpl.hpp XSerializable.hpp XTemplateSerializer.cpp XTemplateSerializer.hpp Log: GrammarPool' serialization/deserialization support Revision Changes Path 1.8 +157 -1 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- XMLGrammarPoolImpl.cpp 10 Oct 2003 18:36:41 -0000 1.7 +++ XMLGrammarPoolImpl.cpp 29 Oct 2003 16:16:08 -0000 1.8 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.8 2003/10/29 16:16:08 peiyongz + * GrammarPool' serialization/deserialization support + * * Revision 1.7 2003/10/10 18:36:41 neilg * update XMLGrammarPool default implementation to reflect recent modifications to the base interface. * @@ -88,11 +91,15 @@ // Includes // --------------------------------------------------------------------------- #include <xercesc/internal/XMLGrammarPoolImpl.hpp> +#include <xercesc/internal/XSerializeEngine.hpp> +#include <xercesc/internal/XTemplateSerializer.hpp> #include <xercesc/validators/DTD/DTDGrammar.hpp> #include <xercesc/validators/DTD/XMLDTDDescriptionImpl.hpp> #include <xercesc/validators/schema/SchemaGrammar.hpp> #include <xercesc/validators/schema/XMLSchemaDescriptionImpl.hpp> +#include <xercesc/util/SynchronizedStringPool.hpp> + XERCES_CPP_NAMESPACE_BEGIN // --------------------------------------------------------------------------- @@ -219,5 +226,154 @@ return fSynchronizedStringPool; return fStringPool; } + +// ----------------------------------------------------------------------- +// serialization and deserialization support +// ----------------------------------------------------------------------- +/*** + * + * don't serialize + * + * XMLSynchronizedStringPool* fSynchronizedStringPool; + * bool fLocked; + */ + +/*** + * .not locked + * .non-empty gramamrRegistry + ***/ +void XMLGrammarPoolImpl::serializeGrammars(BinOutputStream* const binOut) +{ + if (fLocked) + { + ThrowXML(XSerializationException, XMLExcepts::XSer_GrammarPool_Locked); + } + + fLocked = true; + RefHashTableOfEnumerator<Grammar> grammarEnum(fGrammarRegistry); + if (!(grammarEnum.hasMoreElements())) + { + fLocked = false; + ThrowXML(XSerializationException, XMLExcepts::XSer_GrammarPool_Empty); + } + + try + { + XSerializeEngine serEng(binOut, getMemoryManager()); + + //version information + serEng<<gXercesMajVersion; + serEng<<gXercesMinVersion; + serEng<<gXercesRevision; + + //StringPool, don't use << + fStringPool->serialize(serEng); + + /*** + * Serialize RefHashTableOf<Grammar>* fGrammarRegistry; + ***/ + XTemplateSerializer::storeObject(fGrammarRegistry, serEng); + + } + catch(...) + { + fLocked = false; + throw; + } + + fLocked = false; +} + +/*** + * .not locked + * .empty stringPool + * .empty gramamrRegistry + ***/ +void XMLGrammarPoolImpl::deserializeGrammars(BinInputStream* const binIn) +{ + if (fLocked) + { + ThrowXML(XSerializationException, XMLExcepts::XSer_GrammarPool_Locked); + } + + fLocked = true; + unsigned int stringCount = fStringPool->getStringCount(); + if (stringCount) + { + /*** + * it contains only the four predefined one, that is ok + * but we need to reset the string before deserialize it + * + ***/ + if ( stringCount <= 4 ) + { + fStringPool->flushAll(); + } + else + { + fLocked = false; + ThrowXML(XSerializationException, XMLExcepts::XSer_StringPool_NotEmpty); + } + } + + RefHashTableOfEnumerator<Grammar> grammarEnum(fGrammarRegistry); + if (grammarEnum.hasMoreElements()) + { + fLocked = false; + ThrowXML(XSerializationException, XMLExcepts::XSer_GrammarPool_NotEmpty); + } + + try + { + XSerializeEngine serEng(binIn, getMemoryManager()); + + //version information + unsigned int MajVer; + unsigned int MinVer; + unsigned int Revision; + + serEng>>MajVer; + serEng>>MinVer; + serEng>>Revision; + + //we may change the logic once we have more + //versions + if ((MajVer != gXercesMajVersion) || + (MinVer != gXercesMinVersion) || + (Revision != gXercesRevision) ) + { + fLocked = false; + XMLCh MajVerChar[4]; + XMLCh MinVerChar[4]; + XMLCh RevisionChar[4]; + XMLString::binToText(MajVer, MajVerChar, 4, 10); + XMLString::binToText(MinVer, MinVerChar, 4, 10); + XMLString::binToText(Revision, RevisionChar, 4, 10); + + ThrowXML3(XSerializationException + , XMLExcepts::XSer_BinaryData_Version_NotSupported + , MajVerChar + , MinVerChar + , RevisionChar); + } + + //StringPool, don't use >> + fStringPool->serialize(serEng); + + /*** + * Deserialize RefHashTableOf<Grammar>* fGrammarRegistry; + ***/ + XTemplateSerializer::loadObject(&fGrammarRegistry, 29, true, serEng); + + } + catch(...) + { + fLocked = false; + throw; + } + + fLocked = false; +} + XERCES_CPP_NAMESPACE_END 1.8 +20 -7 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.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- XMLGrammarPoolImpl.hpp 10 Oct 2003 18:36:41 -0000 1.7 +++ XMLGrammarPoolImpl.hpp 29 Oct 2003 16:16:08 -0000 1.8 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.8 2003/10/29 16:16:08 peiyongz + * GrammarPool' serialization/deserialization support + * * Revision 1.7 2003/10/10 18:36:41 neilg * update XMLGrammarPool default implementation to reflect recent modifications to the base interface. * @@ -87,11 +90,11 @@ #define XMLGrammarPoolImplIMPL_HPP #include <xercesc/framework/XMLGrammarPool.hpp> -#include <xercesc/util/RefHashTableOf.hpp> -#include <xercesc/util/SynchronizedStringPool.hpp> XERCES_CPP_NAMESPACE_BEGIN +class XMLSynchronizedStringPool; + class XMLUTIL_EXPORT XMLGrammarPoolImpl : public XMLGrammarPool { public : @@ -237,6 +240,16 @@ virtual XMLStringPool *getURIStringPool(); // @} + + // ----------------------------------------------------------------------- + // serialization and deserialization support + // ----------------------------------------------------------------------- + virtual void serializeGrammars(BinOutputStream* const); + virtual void deserializeGrammars(BinInputStream* const); + + friend class XObjectComparator; + friend class XTemplateComparator; + private: // ----------------------------------------------------------------------- /** name Unimplemented copy constructor and operator= */ @@ -260,10 +273,10 @@ // whether the pool has been locked // // ----------------------------------------------------------------------- - RefHashTableOf<Grammar>* fGrammarRegistry; - XMLStringPool * fStringPool; - XMLSynchronizedStringPool * fSynchronizedStringPool; - bool fLocked; + RefHashTableOf<Grammar>* fGrammarRegistry; + XMLStringPool* fStringPool; + XMLSynchronizedStringPool* fSynchronizedStringPool; + bool fLocked; }; 1.3 +12 -1 xml-xerces/c/src/xercesc/internal/XSerializable.hpp Index: XSerializable.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XSerializable.hpp,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- XSerializable.hpp 23 Sep 2003 18:12:19 -0000 1.2 +++ XSerializable.hpp 29 Oct 2003 16:16:08 -0000 1.3 @@ -57,6 +57,9 @@ /* * $Id$ * $Log$ + * Revision 1.3 2003/10/29 16:16:08 peiyongz + * GrammarPool' serialization/deserialization support + * * Revision 1.2 2003/09/23 18:12:19 peiyongz * Macro re-organized: provide create/nocreate macros for abstract and * nonabstract classes @@ -121,6 +124,8 @@ virtual bool isSerializable() const ; \ virtual XProtoType* getProtoType() const; \ virtual void serialize(XSerializeEngine&); \ +friend class XObjectComparator; \ +friend class XTemplateComparator; \ \ inline friend XSerializeEngine& operator>>(XSerializeEngine& serEng \ , class_name*& objPtr) \ @@ -153,6 +158,11 @@ XProtoType* class_name::getProtoType() const \ {return XPROTOTYPE_CLASS(class_name); } +#define IS_EQUIVALENT(lptr, rptr) \ + if (lptr == rptr) \ + return true; \ + if (( lptr && !rptr) || (!lptr && rptr)) \ + return false; XERCES_CPP_NAMESPACE_END 1.2 +77 -5 xml-xerces/c/src/xercesc/internal/XTemplateSerializer.cpp Index: XTemplateSerializer.cpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XTemplateSerializer.cpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- XTemplateSerializer.cpp 17 Oct 2003 21:07:49 -0000 1.1 +++ XTemplateSerializer.cpp 29 Oct 2003 16:16:08 -0000 1.2 @@ -57,6 +57,9 @@ /* * $Id$ * $Log$ + * Revision 1.2 2003/10/29 16:16:08 peiyongz + * GrammarPool' serialization/deserialization support + * * Revision 1.1 2003/10/17 21:07:49 peiyongz * To support Template object serialization/deserialization * @@ -69,6 +72,7 @@ // --------------------------------------------------------------------------- #include <xercesc/internal/XSerializeEngine.hpp> #include <xercesc/internal/XTemplateSerializer.hpp> +#include <xercesc/validators/common/Grammar.hpp> XERCES_CPP_NAMESPACE_BEGIN @@ -753,6 +757,7 @@ * XercesAttGroupInfo * XMLRefInfo * DatatypeValidator + * Grammar * ***********************************************************/ void XTemplateSerializer::storeObject(RefHashTableOf<KVStringPair>* const objToStore @@ -1306,6 +1311,73 @@ } } +void XTemplateSerializer::storeObject(RefHashTableOf<Grammar>* const objToStore + , XSerializeEngine& serEng) +{ + + if (serEng.needToStoreObject(objToStore)) + { + RefHashTableOfEnumerator<Grammar> e(objToStore); + int itemNumber = 0; + + while (e.hasMoreElements()) + { + e.nextElement(); + itemNumber++; + } + + serEng<<itemNumber; + e.Reset(); + + while (e.hasMoreElements()) + { + XMLCh* key = (XMLCh*) e.nextElementKey(); + serEng.writeString(key); + + Grammar* data = objToStore->get(key); + Grammar::storeGrammar(serEng, data); + } + } +} + +void XTemplateSerializer::loadObject(RefHashTableOf<Grammar>** objToLoad + , int initSize + , bool toAdopt + , XSerializeEngine& serEng) +{ + + if (serEng.needToLoadObject((void**)objToLoad)) + { + if (!*objToLoad) + { + if (initSize < 0) + initSize = 16; + + *objToLoad = new (serEng.getMemoryManager()) + RefHashTableOf<Grammar>( + initSize + , toAdopt + , serEng.getMemoryManager() + ); + } + + serEng.registerObject(*objToLoad); + + int itemNumber = 0; + serEng>>itemNumber; + + for (int itemIndex = 0; itemIndex < itemNumber; itemIndex++) + { + XMLCh* key; + serEng.readString(key); + + Grammar* data; + data = Grammar::loadGrammar(serEng); + + (*objToLoad)->put((void*)key, data); + } + } +} /********************************************************** * @@ -1343,7 +1415,7 @@ serEng.writeString(key1); serEng<<key2; - XMLAttDef* data = objToStore->get(key1, key2); + SchemaAttDef* data = objToStore->get(key1, key2); serEng<<data; } @@ -1510,8 +1582,8 @@ while (e.hasMoreElements()) { //there is no e.nextElementKey() for RefHash3KeysIdPoolEnumerator - SchemaElementDecl& attDef = e.nextElement(); - attDef.serialize(serEng); + SchemaElementDecl& data = e.nextElement(); + data.serialize(serEng); } } 1.2 +13 -2 xml-xerces/c/src/xercesc/internal/XTemplateSerializer.hpp Index: XTemplateSerializer.hpp =================================================================== RCS file: /home/cvs/xml-xerces/c/src/xercesc/internal/XTemplateSerializer.hpp,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- XTemplateSerializer.hpp 17 Oct 2003 21:07:49 -0000 1.1 +++ XTemplateSerializer.hpp 29 Oct 2003 16:16:08 -0000 1.2 @@ -56,6 +56,9 @@ /* * $Log$ + * Revision 1.2 2003/10/29 16:16:08 peiyongz + * GrammarPool' serialization/deserialization support + * * Revision 1.1 2003/10/17 21:07:49 peiyongz * To support Template object serialization/deserialization * @@ -235,6 +238,7 @@ * XercesAttGroupInfo * XMLRefInfo * DatatypeValidator + * Grammar * ***********************************************************/ static void storeObject(RefHashTableOf<KVStringPair>* const tempObjToWrite @@ -301,6 +305,13 @@ , bool toAdopt , XSerializeEngine& serEng); + static void storeObject(RefHashTableOf<Grammar>* const tempObjToWrite + , XSerializeEngine& serEng); + + static void loadObject(RefHashTableOf<Grammar>** tempObjToRead + , int initSize + , bool toAdopt + , XSerializeEngine& serEng); /********************************************************** *
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]