/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // --------------------------------------------------------------------------- // Includes // --------------------------------------------------------------------------- #include #include #include #include #include #include XERCES_CPP_NAMESPACE_BEGIN /*** * internal class meant to be comsumed by XTemplateSerializer only * the size can not grow ***/ #ifdef XERCES_DEBUG_SORT_GRAMMAR class KeySet : public XMemory { public: // ----------------------------------------------------------------------- // Contructors and Destructor // ----------------------------------------------------------------------- KeySet ( const XMLCh* const strKey , const int intKey1 , const int intKey2 , MemoryManager* const manager ); ~KeySet(); // ----------------------------------------------------------------------- // Public operators // ----------------------------------------------------------------------- inline void getKeys(const XMLCh*&, int&, int&) const; void print() const; // ----------------------------------------------------------------------- // Unimplemented constructors and operators // ----------------------------------------------------------------------- KeySet(const KeySet&); KeySet& operator=(const KeySet&); // ----------------------------------------------------------------------- // Data members // reference only // ----------------------------------------------------------------------- const XMLCh* const fStrKey; const int fIntKey1; const int fIntKey2; MemoryManager* fMemoryManager; }; KeySet::KeySet(const XMLCh* const strKey , const int intKey1 , const int intKey2 , MemoryManager* const manager) :fStrKey(strKey) ,fIntKey1(intKey1) ,fIntKey2(intKey2) ,fMemoryManager(manager) { } KeySet::~KeySet() { } inline void KeySet::getKeys(const XMLCh*& strKey, int& intKey1, int& intKey2) const { strKey = fStrKey; intKey1 = fIntKey1; intKey2 = fIntKey2; } void KeySet::print() const { char* tmpStr = XMLString::transcode(fStrKey, fMemoryManager); printf("tmpStr=<%s>, intKey1=<%d>, intKey2=<%d>\n", tmpStr, fIntKey1, fIntKey2); XMLString::release(&tmpStr, fMemoryManager); } static int compareKeySet(const void* keyl, const void* keyr) { const KeySet* pairl=*(const KeySet**)keyl; const KeySet* pairr=*(const KeySet**)keyr; const XMLCh* strKeyl = 0; int intKeyl_1 = 0; int intKeyl_2 = 0; pairl->getKeys(strKeyl, intKeyl_1, intKeyl_2); const XMLCh* strKeyr = 0; int intKeyr_1 = 0; int intKeyr_2 = 0; pairr->getKeys(strKeyr, intKeyr_1, intKeyr_2); int compareValue = XMLString::compareString(strKeyl, strKeyr); if (compareValue !=0) return compareValue; compareValue = intKeyl_1 - intKeyr_1; if (compareValue !=0) return compareValue; return (intKeyl_2 - intKeyr_2); } class SortArray : public XMemory { private : // ----------------------------------------------------------------------- // Contructors and Destructor // ----------------------------------------------------------------------- SortArray ( const XMLSize_t size , MemoryManager* const manager ); ~SortArray(); // ----------------------------------------------------------------------- // Public operators // ----------------------------------------------------------------------- inline const KeySet* elementAt(const XMLSize_t index) const; void addElement(const KeySet* const keySet); void sort(); void dump() const; // ----------------------------------------------------------------------- // Unimplemented constructors and operators // ----------------------------------------------------------------------- SortArray(const SortArray&); SortArray& operator=(const SortArray&); // ----------------------------------------------------------------------- // Data members // ----------------------------------------------------------------------- XMLSize_t fCur; //point to the current available slot XMLSize_t fSize; const KeySet** fElemList; //owning objects MemoryManager* fMemoryManager; friend class XTemplateSerializer; }; SortArray::SortArray(const XMLSize_t size , MemoryManager* const manager ) :fCur(0) ,fSize(size) ,fMemoryManager(manager) { fElemList = (const KeySet**) fMemoryManager->allocate(size * sizeof (KeySet*)); } SortArray::~SortArray() { for (XMLSize_t i=0; i< fSize; i++) delete fElemList[i]; fMemoryManager->deallocate(fElemList); } inline const KeySet* SortArray::elementAt(const XMLSize_t index) const { assert(index < fCur); return fElemList[index]; } void SortArray::addElement(const KeySet* const keySet) { assert(fCur < fSize); fElemList[fCur++]=keySet; } void SortArray::sort() { assert(fCur == fSize); //dump(); qsort(fElemList, fSize, sizeof (KeySet*), compareKeySet); //dump(); } void SortArray::dump() const { printf("\n fSize=<%d>, fCur=<%d>\n", fSize, fCur); for (XMLSize_t i = 0; i < fCur; i++) fElemList[i]->print(); } #define GET_NEXT_KEYSET() \ const KeySet* keySet = sortArray.elementAt(i); \ const XMLCh* strKey = 0; \ int intKey1 = 0; \ int intKey2 = 0; \ keySet->getKeys(strKey, intKey1, intKey2); #define SORT_KEYSET_ONEKEY(MM) \ SortArray sortArray(itemNumber, MM); \ while (e.hasMoreElements()) \ { \ KeySet* keySet = new (MM) KeySet((XMLCh*) e.nextElementKey(), 0, 0, MM); \ sortArray.addElement(keySet); \ } \ sortArray.sort(); #define SORT_KEYSET_TWOKEYS(MM) \ SortArray sortArray(itemNumber, MM); \ while (e.hasMoreElements()) \ { \ XMLCh* strKey; \ int intKey; \ e.nextElementKey((void*&)strKey, intKey); \ KeySet* keySet = new (MM) KeySet(strKey, intKey, 0, MM); \ sortArray.addElement(keySet); \ } \ sortArray.sort(); #endif /********************************************************** * * ValueVectorOf * * SchemaElementDecl* * unsigned int * ***********************************************************/ void XTemplateSerializer::storeObject(ValueVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorSize = objToStore->size(); serEng.writeSize (vectorSize); for ( XMLSize_t i = 0; i < vectorSize; i++) { SchemaElementDecl*& data = objToStore->elementAt(i); serEng<** objToLoad , int initSize , bool toCallDestructor , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) ValueVectorOf( initSize , serEng.getMemoryManager() , toCallDestructor ); } serEng.registerObject(*objToLoad); XMLSize_t vectorSize = 0; serEng.readSize (vectorSize); for (XMLSize_t i = 0; i < vectorSize; i++) { SchemaElementDecl* data; serEng>>data; (*objToLoad)->addElement(data); } } } void XTemplateSerializer::storeObject(ValueVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorSize = objToStore->size(); serEng.writeSize (vectorSize); for (XMLSize_t i = 0; i < vectorSize; i++) { unsigned int& data = objToStore->elementAt(i); serEng<** objToLoad , int initSize , bool toCallDestructor , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) ValueVectorOf( initSize , serEng.getMemoryManager() , toCallDestructor ); } serEng.registerObject(*objToLoad); XMLSize_t vectorSize = 0; serEng.readSize (vectorSize); for (XMLSize_t i = 0; i < vectorSize; i++) { unsigned int data; serEng>>data; (*objToLoad)->addElement(data); } } } /********************************************************** * * RefArrayVectorOf * * XMLCh * ***********************************************************/ void XTemplateSerializer::storeObject(RefArrayVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorSize = objToStore->size(); serEng.writeSize (vectorSize); for (XMLSize_t i = 0; i < vectorSize; i++) { serEng.writeString(objToStore->elementAt(i)); } } } void XTemplateSerializer::loadObject(RefArrayVectorOf** objToLoad , int initSize , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefArrayVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorSize = 0; serEng.readSize (vectorSize); for (XMLSize_t i = 0; i < vectorSize; i++) { XMLCh* data; serEng.readString(data); (*objToLoad)->addElement(data); } } } /********************************************************** * * RefVectorOf * * SchemaAttDef * SchemaElementDecl * ContentSpecNode * IC_Field * DatatypeValidator * IdentityConstraint * XMLNumber * XercesLocationPath * XercesStep * ***********************************************************/ void XTemplateSerializer::storeObject(RefVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorLength = objToStore->size(); serEng.writeSize (vectorLength); for ( XMLSize_t i = 0; i < vectorLength; i++) { SchemaAttDef* data = objToStore->elementAt(i); serEng<** objToLoad , int initSize , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorLength = 0; serEng.readSize (vectorLength); for (XMLSize_t i = 0 ; i < vectorLength; i++) { SchemaAttDef* data; serEng>>data; (*objToLoad)->addElement(data); } } } void XTemplateSerializer::storeObject(RefVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorLength = objToStore->size(); serEng.writeSize (vectorLength); for ( XMLSize_t i = 0; i < vectorLength; i++) { SchemaElementDecl* data = objToStore->elementAt(i); serEng<** objToLoad , int initSize , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorLength = 0; serEng.readSize (vectorLength); for (XMLSize_t i = 0 ; i < vectorLength; i++) { SchemaElementDecl* data; serEng>>data; (*objToLoad)->addElement(data); } } } void XTemplateSerializer::storeObject(RefVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorLength = objToStore->size(); serEng.writeSize (vectorLength); for ( XMLSize_t i = 0; i < vectorLength; i++) { ContentSpecNode* data = objToStore->elementAt(i); serEng<** objToLoad , int initSize , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorLength = 0; serEng.readSize (vectorLength); for (XMLSize_t i = 0 ; i < vectorLength; i++) { ContentSpecNode* data; serEng>>data; (*objToLoad)->addElement(data); } } } void XTemplateSerializer::storeObject(RefVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorLength = objToStore->size(); serEng.writeSize (vectorLength); for ( XMLSize_t i = 0; i < vectorLength; i++) { IC_Field* data = objToStore->elementAt(i); serEng<** objToLoad , int initSize , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorLength = 0; serEng.readSize (vectorLength); for (XMLSize_t i = 0 ; i < vectorLength; i++) { IC_Field* data; serEng>>data; (*objToLoad)->addElement(data); } } } void XTemplateSerializer::storeObject(RefVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorLength = objToStore->size(); serEng.writeSize (vectorLength); for ( XMLSize_t i = 0; i < vectorLength; i++) { DatatypeValidator* data = objToStore->elementAt(i); DatatypeValidator::storeDV(serEng, data); } } } void XTemplateSerializer::loadObject(RefVectorOf** objToLoad , int initSize , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorLength = 0; serEng.readSize (vectorLength); for (XMLSize_t i = 0 ; i < vectorLength; i++) { DatatypeValidator* data; data = DatatypeValidator::loadDV(serEng); (*objToLoad)->addElement(data); } } } void XTemplateSerializer::storeObject(RefVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorLength = objToStore->size(); serEng.writeSize (vectorLength); for ( XMLSize_t i = 0; i < vectorLength; i++) { IdentityConstraint* data = objToStore->elementAt(i); IdentityConstraint::storeIC(serEng, data); } } } void XTemplateSerializer::loadObject(RefVectorOf** objToLoad , int initSize , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorLength = 0; serEng.readSize (vectorLength); for (XMLSize_t i = 0 ; i < vectorLength; i++) { IdentityConstraint* data; data = IdentityConstraint::loadIC(serEng); (*objToLoad)->addElement(data); } } } void XTemplateSerializer::storeObject(RefVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorLength = objToStore->size(); serEng.writeSize (vectorLength); for ( XMLSize_t i = 0; i < vectorLength; i++) { XMLNumber* data = objToStore->elementAt(i); serEng<** objToLoad , int initSize , bool toAdopt , XMLNumber::NumberType numType , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorLength = 0; serEng.readSize (vectorLength); for (XMLSize_t i = 0 ; i < vectorLength; i++) { XMLNumber* data; data = XMLNumber::loadNumber(numType , serEng); (*objToLoad)->addElement(data); } } } void XTemplateSerializer::storeObject(RefVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorLength = objToStore->size(); serEng.writeSize (vectorLength); for ( XMLSize_t i = 0; i < vectorLength; i++) { XercesLocationPath* data = objToStore->elementAt(i); serEng<** objToLoad , int initSize , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorLength = 0; serEng.readSize (vectorLength); for (XMLSize_t i = 0 ; i < vectorLength; i++) { XercesLocationPath* data; serEng>>data; (*objToLoad)->addElement(data); } } } void XTemplateSerializer::storeObject(RefVectorOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { XMLSize_t vectorLength = objToStore->size(); serEng.writeSize (vectorLength); for (XMLSize_t i = 0; i < vectorLength; i++) { XercesStep* data = objToStore->elementAt(i); serEng<** objToLoad , int initSize , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) RefVectorOf( initSize , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t vectorLength = 0; serEng.readSize (vectorLength); for (XMLSize_t i = 0 ; i < vectorLength; i++) { XercesStep* data; serEng>>data; (*objToLoad)->addElement(data); } } } /********************************************************** * * RefHashTableOf * * KVStringPair * XMLAttDef * DTDAttDef * ComplexTypeInfo * XercesGroupInfo * XercesAttGroupInfo * XMLRefInfo * DatatypeValidator * Grammar * XSAnnotation * ***********************************************************/ void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); XMLSize_t itemNumber = 0; while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_ONEKEY(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() KVStringPair* data = objToStore->get(strKey); serEng<get(e.nextElementKey()); serEng<** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { KVStringPair* data; serEng>>data; (*objToLoad)->put((void*)data->getKey(), data); } } } void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); XMLSize_t itemNumber = 0; while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_ONEKEY(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() XMLAttDef* data = objToStore->get(strKey); serEng<get(e.nextElementKey()); serEng<** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { //This is used solely by SchemaGrammar and by all means it must be //SchemaAttDef, ideally we may change it to RefHashTableOf //later on. //Affected files IGXMLScanner, SGXMLScanner, SchemaGrammar, TraverseSchema //XMLAttDef* data; SchemaAttDef* data; serEng>>data; (*objToLoad)->put((void*)data->getAttName()->getLocalPart(), data); } } } void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); XMLSize_t itemNumber = 0; while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_ONEKEY(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() DTDAttDef* data = objToStore->get(strKey); serEng<get(e.nextElementKey()); serEng<** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { DTDAttDef* data; serEng>>data; (*objToLoad)->put((void*)data->getFullName(), data); } } } void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); XMLSize_t itemNumber = 0; while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_ONEKEY(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() ComplexTypeInfo* data = objToStore->get(strKey); serEng<get(e.nextElementKey()); serEng<** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { ComplexTypeInfo* data; serEng>>data; (*objToLoad)->put((void*)data->getTypeName(), data); } } } void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); XMLSize_t itemNumber = 0; while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_ONEKEY(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() unsigned int id = serEng.getStringPool()->getId(strKey); serEng<get(strKey); serEng<getId(key); // key = StringPool->getValueForId(XercesGroupInfo::getNameSpaceId()) // + chComma // + StringPool->getValueForId(XercesGroupInfo::getNameId()) // // and the key is guranteed in the StringPool // // // if (id == 0) // { // throw exception // } // serEng<get(key); serEng<** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { unsigned int id; serEng>>id; XMLCh* key = (XMLCh*) serEng.getStringPool()->getValueForId(id); XercesGroupInfo* data; serEng>>data; (*objToLoad)->put((void*)key, data); } } } void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); XMLSize_t itemNumber = 0; while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_ONEKEY(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() XercesAttGroupInfo* data = objToStore->get(strKey); serEng<get(e.nextElementKey()); serEng<** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { XercesAttGroupInfo* data; serEng>>data; XMLCh* key = (XMLCh*) serEng.getStringPool()->getValueForId(data->getNameId()); (*objToLoad)->put((void*)key, data); } } } void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); XMLSize_t itemNumber = 0; while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_ONEKEY(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() serEng.writeString(strKey); XMLRefInfo* data = objToStore->get(strKey); serEng<get(key); serEng<** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { XMLCh* key; serEng.readString(key); XMLRefInfo* data; serEng>>data; (*objToLoad)->put((void*)key, data); } } } void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); XMLSize_t itemNumber = 0; while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_ONEKEY(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() DatatypeValidator* data = objToStore->get(strKey); DatatypeValidator::storeDV(serEng, data); } #else while (e.hasMoreElements()) { /*** * to do: verify valid id * * XMLCh* key = (XMLCh*) e.nextElementKey(); * unsigned int id = serEng.getStringPool()->getId(key); * if (id == 0) * throw exception ***/ DatatypeValidator* data = objToStore->get(e.nextElementKey()); DatatypeValidator::storeDV(serEng, data); } #endif } } void XTemplateSerializer::loadObject(RefHashTableOf** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { DatatypeValidator* data; data = DatatypeValidator::loadDV(serEng); /*** * restore the key ***/ XMLCh* typeUri = (XMLCh*) data->getTypeUri(); XMLCh* typeLocal = (XMLCh*) data->getTypeLocalName(); XMLSize_t uriLen = XMLString::stringLen(typeUri); XMLSize_t localLen = XMLString::stringLen(typeLocal); XMLCh* typeKey = (XMLCh*) serEng.getMemoryManager()->allocate ( (uriLen + localLen + 2) * sizeof(XMLCh) ); // "typeuri,typeLocal" XMLString::moveChars(typeKey, typeUri, uriLen+1); typeKey[uriLen] = chComma; XMLString::moveChars(&typeKey[uriLen+1], typeLocal, localLen+1); typeKey[uriLen + localLen + 1] = chNull; ArrayJanitor janName(typeKey, serEng.getMemoryManager()); /* * get the string from string pool * * to do: ***/ unsigned int id = serEng.getStringPool()->getId(typeKey); XMLCh* refKey = (XMLCh*) serEng.getStringPool()->getValueForId(id); (*objToLoad)->put((void*)refKey, data); } } } void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); XMLSize_t itemNumber = 0; while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_ONEKEY(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() Grammar* data = objToStore->get(strKey); Grammar::storeGrammar(serEng, data); } #else while (e.hasMoreElements()) { Grammar* data = objToStore->get(e.nextElementKey()); Grammar::storeGrammar(serEng, data); } #endif } } void XTemplateSerializer::loadObject(RefHashTableOf** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { Grammar* data; data = Grammar::loadGrammar(serEng); XMLCh* key = (XMLCh*) data->getGrammarDescription()->getGrammarKey(); (*objToLoad)->put(key, data); } } } void XTemplateSerializer::storeObject(RefHashTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHashTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); #ifdef XERCES_DEBUG_SORT_GRAMMAR //get the total item number unsigned int itemNumber = 0; while (e.hasMoreElements()) { void* key = e.nextElementKey(); XSerializeEngine::XSerializedObjectId_t keyId = serEng.lookupStorePool(key); if (keyId) itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); //to sort the key //though keyId is not supposed to be involved in compare //we merely use the KeySet to encap both the string key and keyid SortArray sortArray(itemNumber, objToStore->getMemoryManager()); while (e.hasMoreElements()) { void* key = e.nextElementKey(); XSerializeEngine::XSerializedObjectId_t keyId = serEng.lookupStorePool(key); if (keyId) { KeySet* keySet = new (objToStore->getMemoryManager()) KeySet((XMLCh*)key, keyId, 0, objToStore->getMemoryManager()); sortArray.addElement(keySet); } } sortArray.sort(); //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() XSerializeEngine::XSerializedObjectId_t keyId = (XSerializeEngine::XSerializedObjectId_t)intKey1; XSAnnotation* data = objToStore->get(strKey); serEng< ids(16, serEng.getMemoryManager()); ValueVectorOf keys(16, serEng.getMemoryManager()); while (e.hasMoreElements()) { void* key = e.nextElementKey(); XSerializeEngine::XSerializedObjectId_t keyId = serEng.lookupStorePool(key); if (keyId) { ids.addElement(keyId); keys.addElement(key); } } XMLSize_t itemNumber = ids.size(); serEng.writeSize (itemNumber); for (XMLSize_t i=0; iget(keys.elementAt(i)); serEng<** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHashTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); XMLSize_t itemIndex; XSerializeEngine::XSerializedObjectId_t keyId; void* key; XSAnnotation* data; if (!serEng.fGrammarPool->getIgnoreSerializedAnnotations()) { for (itemIndex = 0; itemIndex < itemNumber; itemIndex++) { serEng>>keyId; key = serEng.lookupLoadPool(keyId); serEng>>data; (*objToLoad)->put(key, data); } } else { for (itemIndex = 0; itemIndex < itemNumber; itemIndex++) { serEng>>keyId; key = serEng.lookupLoadPool(keyId); serEng>>data; delete data; } } } } /********************************************************** * * RefHash2KeysTableOf * * SchemaAttDef * ElemVector * ***********************************************************/ void XTemplateSerializer::storeObject(RefHash2KeysTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); XMLSize_t itemNumber = 0; RefHash2KeysTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_TWOKEYS(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() SchemaAttDef* data = objToStore->get(strKey, intKey1); serEng<get(key1, key2); serEng<** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHash2KeysTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { SchemaAttDef* data; serEng>>data; XMLCh* key1 = data->getAttName()->getLocalPart(); int key2 = data->getAttName()->getURI(); //key2==data->getId() (*objToLoad)->put((void*)key1, key2, data); } } } void XTemplateSerializer::storeObject(RefHash2KeysTableOf* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); XMLSize_t itemNumber = 0; RefHash2KeysTableOfEnumerator e(objToStore, false, objToStore->getMemoryManager()); while (e.hasMoreElements()) { e.nextElement(); itemNumber++; } serEng.writeSize (itemNumber); e.Reset(); #ifdef XERCES_DEBUG_SORT_GRAMMAR //to sort the key SORT_KEYSET_TWOKEYS(serEng.getMemoryManager()) //to store the data for (XMLSize_t i=0; i < itemNumber; i++) { GET_NEXT_KEYSET() serEng.writeString(strKey); serEng<get(strKey, intKey1); storeObject(data, serEng); } #else while (e.hasMoreElements()) { void* key1; int key2; e.nextElementKey(key1, key2); serEng.writeString((const XMLCh*)key1); serEng<get(key1, key2); storeObject(data, serEng); } #endif } } void XTemplateSerializer::loadObject(RefHash2KeysTableOf** objToLoad , int , bool toAdopt , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHash2KeysTableOf( hashModulus , toAdopt , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { XMLCh* key1; serEng.readString(key1); int key2; serEng>>key2; ElemVector* data = 0; //don't call destructor loadObject(&data, 8, false, serEng); /*** * * There must be one element in the vector whose * susbititutionGroupElem matches the (key1,key2) * ***/ // bool FOUND=false; XMLSize_t vectorSize = data->size(); for ( XMLSize_t i = 0; i < vectorSize; i++) { SchemaElementDecl*& elem = data->elementAt(i); SchemaElementDecl* subElem = elem->getSubstitutionGroupElem(); XMLCh* elemName = subElem->getBaseName(); int uri = subElem->getURI(); if (XMLString::equals(elemName, key1) && (uri == key2) ) { //release the temp serEng.getMemoryManager()->deallocate(key1); key1 = elemName; //FOUND=true; break; } } /*** * if (!FOUND) * { * throw exception * } ***/ (*objToLoad)->put((void*)key1, key2, data); } } } /********************************************************** * * RefHash3KeysIdPool * * SchemaElementDecl * * maintain the same order through id ***********************************************************/ void XTemplateSerializer::storeObject(RefHash3KeysIdPool* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { serEng.writeSize (objToStore->getHashModulus()); RefHash3KeysIdPoolEnumerator e(objToStore, false, objToStore->getMemoryManager()); serEng.writeSize (e.size()); void* strkey; int key1; int key2; /* Update to store key2 separately as for the putGroupElemDecl the key is not the enclosing scope but another value. */ while (e.hasMoreKeys()) { e.nextElementKey(strkey, key1, key2); serEng<getByKey(strkey, key1, key2); serEng<** objToLoad , int , bool toAdopt , int initSize2 , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { XMLSize_t hashModulus; serEng.readSize (hashModulus); if (!*objToLoad) { *objToLoad = new (serEng.getMemoryManager()) RefHash3KeysIdPool( hashModulus , toAdopt , initSize2 , serEng.getMemoryManager()); } serEng.registerObject(*objToLoad); XMLSize_t itemNumber = 0; serEng.readSize (itemNumber); int scopeKey; SchemaElementDecl* elemDecl; for (XMLSize_t itemIndex = 0; itemIndex < itemNumber; itemIndex++) { serEng>>scopeKey; serEng>>elemDecl; (*objToLoad)->put(elemDecl->getBaseName() , elemDecl->getURI() , scopeKey , elemDecl); } } } /********************************************************** * * NameIdPool * no NameIdPool::nextElementKey() * * DTDElementDecl * DTDEntityDecl * XMLNotationDecl * * maintain the same order through id ***********************************************************/ void XTemplateSerializer::storeObject(NameIdPool* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { NameIdPoolEnumerator e(objToStore, objToStore->getMemoryManager()); serEng<<(unsigned int)e.size(); while (e.hasMoreElements()) { DTDElementDecl& data = e.nextElement(); data.serialize(serEng); } } } void XTemplateSerializer::loadObject(NameIdPool** objToLoad , int initSize , int initSize2 , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) NameIdPool( initSize , initSize2 , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); unsigned int itemNumber = 0; serEng >> itemNumber; for (unsigned int itemIndex = 0; itemIndex < itemNumber; itemIndex++) { DTDElementDecl* data = new (serEng.getMemoryManager()) DTDElementDecl(serEng.getMemoryManager()); data->serialize(serEng); (*objToLoad)->put(data); } } } void XTemplateSerializer::storeObject(NameIdPool* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { NameIdPoolEnumerator e(objToStore, objToStore->getMemoryManager()); serEng<<(unsigned int)e.size(); while (e.hasMoreElements()) { DTDEntityDecl& data = e.nextElement(); data.serialize(serEng); } } } void XTemplateSerializer::loadObject(NameIdPool** objToLoad , int initSize , int initSize2 , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) NameIdPool( initSize , initSize2 , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); unsigned int itemNumber = 0; serEng >> itemNumber; for (unsigned int itemIndex = 0; itemIndex < itemNumber; itemIndex++) { DTDEntityDecl* data = new (serEng.getMemoryManager()) DTDEntityDecl(serEng.getMemoryManager()); data->serialize(serEng); (*objToLoad)->put(data); } } } void XTemplateSerializer::storeObject(NameIdPool* const objToStore , XSerializeEngine& serEng) { if (serEng.needToStoreObject(objToStore)) { NameIdPoolEnumerator e(objToStore, objToStore->getMemoryManager()); serEng<<(unsigned int)e.size(); while (e.hasMoreElements()) { XMLNotationDecl& data = e.nextElement(); data.serialize(serEng); } } } void XTemplateSerializer::loadObject(NameIdPool** objToLoad , int initSize , int initSize2 , XSerializeEngine& serEng) { if (serEng.needToLoadObject((void**)objToLoad)) { if (!*objToLoad) { if (initSize < 0) initSize = 16; *objToLoad = new (serEng.getMemoryManager()) NameIdPool( initSize , initSize2 , serEng.getMemoryManager() ); } serEng.registerObject(*objToLoad); unsigned int itemNumber = 0; serEng >> itemNumber; for (unsigned int itemIndex = 0; itemIndex < itemNumber; itemIndex++) { XMLNotationDecl* data = new (serEng.getMemoryManager()) XMLNotationDecl(serEng.getMemoryManager()); data->serialize(serEng); (*objToLoad)->put(data); } } } XERCES_CPP_NAMESPACE_END