XSModel::XSModel( XSModel *baseModel , GrammarResolver *grammarResolver , MemoryManager* const manager) : fMemoryManager(manager) , fNamespaceStringList(0) , fXSNamespaceItemList(0) , fURIStringPool(0) , fXSAnnotationList(0) , fHashNamespace(0) , fObjFactory(0) , fDeleteNamespace(0) , fParent(baseModel) , fDeleteParent(true) , fAddedS4SGrammar(false) { fURIStringPool = grammarResolver->getStringPool(); fObjFactory = new (manager) XSObjectFactory(manager); unsigned int i; // Populate XSNamedMaps by going through the components for (i=0; i<XSConstants::MULTIVALUE_FACET; i++) { switch (i+1) { case XSConstants::ATTRIBUTE_DECLARATION: case XSConstants::ELEMENT_DECLARATION: case XSConstants::TYPE_DEFINITION: case XSConstants::ATTRIBUTE_GROUP_DEFINITION: case XSConstants::MODEL_GROUP_DEFINITION: case XSConstants::NOTATION_DECLARATION: fComponentMap[i] = new (fMemoryManager) XSNamedMap<XSObject> ( 20, // size 29, // modulus fURIStringPool, false, // adoptElems fMemoryManager ); break; default: // ATTRIBUTE_USE // MODEL_GROUP // PARTICLE // IDENTITY_CONSTRAINT // WILDCARD // ANNOTATION // FACET // MULTIVALUE fComponentMap[i] = 0; break; } fIdVector[i] = new (fMemoryManager) RefVectorOf<XSObject>(30, false, fMemoryManager); } fNamespaceStringList = new (manager) RefArrayVectorOf <XMLCh>(10, true, manager); fXSNamespaceItemList = new (manager) RefVectorOf <XSNamespaceItem>(10, false, manager); fDeleteNamespace = new (manager) RefVectorOf <XSNamespaceItem>(10, true, manager); fXSAnnotationList = new (manager) RefVectorOf <XSAnnotation> (10, false, manager); fHashNamespace = new (manager) RefHashTableOf<XSNamespaceItem> (11, false, manager); if (fParent) { if (fParent->fAddedS4SGrammar) fAddedS4SGrammar = true; // Need to copy information from parent so it can be returned in this object... for (i=0; i<fParent->fXSNamespaceItemList->size(); i++) { XSNamespaceItem* namespaceItem = fParent->fXSNamespaceItemList->elementAt(i); fXSNamespaceItemList->addElement(namespaceItem); fNamespaceStringList->addElement ( XMLString::replicate ( namespaceItem->getSchemaNamespace(), manager ) ); } for (i=0; i<XSConstants::MULTIVALUE_FACET; i++) { switch (i+1) { case XSConstants::ATTRIBUTE_DECLARATION: case XSConstants::ELEMENT_DECLARATION: case XSConstants::TYPE_DEFINITION: case XSConstants::ATTRIBUTE_GROUP_DEFINITION: case XSConstants::MODEL_GROUP_DEFINITION: case XSConstants::NOTATION_DECLARATION: for (unsigned int j=0; j<fParent->fComponentMap[i]->getLength(); j++) { XSObject* copyObj = fParent->fComponentMap[i]->item(j); fComponentMap[i]->addElement(copyObj, copyObj->getName(), copyObj->getNamespace()); } break; } for (unsigned int j=0; j<fParent->fIdVector[i]->size(); j++) { fIdVector[i]->addElement(fParent->fIdVector[i]->elementAt(j)); } } for (i=0; i<fParent->fXSAnnotationList->size(); i++) { fXSAnnotationList->addElement(fParent->fXSAnnotationList->elementAt(i)); } } // end of copying parent info // Now add information from the new grammars but first create the // XSNamespaceItem's so we can have access to the XSAnnotations... ValueVectorOf<SchemaGrammar*>* grammarsToAdd = grammarResolver->getGrammarsToAddToXSModel(); unsigned int numberOfNamespaces = fXSNamespaceItemList->size(); unsigned int numberOfNamespacesToAdd = 0; for (i=0; i < grammarsToAdd->size(); i++) { SchemaGrammar* lGrammar = grammarsToAdd->elementAt(i); if (lGrammar->getGrammarType() != Grammar::SchemaGrammarType || XMLString::equals(lGrammar->getTargetNamespace(), SchemaSymbols::fgURI_SCHEMAFORSCHEMA)) continue; XMLCh* NameSpace = XMLString::replicate(lGrammar->getTargetNamespace(), manager); fNamespaceStringList->addElement(NameSpace); XSNamespaceItem* namespaceItem = new (manager) XSNamespaceItem(this, lGrammar, manager); fXSNamespaceItemList->addElement(namespaceItem); fHashNamespace->put(NameSpace, namespaceItem); fDeleteNamespace->addElement(namespaceItem); ++numberOfNamespacesToAdd; } // Add S4S namespace if needed if (!fAddedS4SGrammar) { DatatypeValidatorFactory dvFactory(manager); dvFactory.expandRegistryToFullSchemaSet(); XSNamespaceItem* namespaceItem = new (manager) XSNamespaceItem ( this, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, manager ); fNamespaceStringList->addElement ( XMLString::replicate(SchemaSymbols::fgURI_SCHEMAFORSCHEMA,manager) ); fXSNamespaceItemList->addElement(namespaceItem); fHashNamespace->put ( (void*) SchemaSymbols::fgURI_SCHEMAFORSCHEMA , namespaceItem ); fDeleteNamespace->addElement(namespaceItem); addS4SToXSModel ( namespaceItem , dvFactory.getBuiltInRegistry() ); } // Now loop through all of the newly created NamespaceItem's for (i=numberOfNamespaces; i<(numberOfNamespaces+numberOfNamespacesToAdd); i++) { addGrammarToXSModel(fXSNamespaceItemList->elementAt(i)); } // end of namespaceItem loop }
XERCES_CPP_NAMESPACE_BEGIN // --------------------------------------------------------------------------- // XSModel: Constructors and Destructor // --------------------------------------------------------------------------- XSModel::XSModel( XMLGrammarPool *grammarPool , MemoryManager* const manager) : fMemoryManager(manager) , fNamespaceStringList(0) , fXSNamespaceItemList(0) , fURIStringPool(0) , fXSAnnotationList(0) , fHashNamespace(0) , fObjFactory(0) , fDeleteNamespace(0) , fParent(0) , fDeleteParent(false) , fAddedS4SGrammar(false) { fURIStringPool = grammarPool->getURIStringPool(); fObjFactory = new (fMemoryManager) XSObjectFactory(manager); // Populate XSNamedMaps by going through the components for (unsigned int i=0; i<XSConstants::MULTIVALUE_FACET; i++) { switch (i+1) { case XSConstants::ATTRIBUTE_DECLARATION: case XSConstants::ELEMENT_DECLARATION: case XSConstants::TYPE_DEFINITION: case XSConstants::ATTRIBUTE_GROUP_DEFINITION: case XSConstants::MODEL_GROUP_DEFINITION: case XSConstants::NOTATION_DECLARATION: fComponentMap[i] = new (fMemoryManager) XSNamedMap<XSObject> ( 20, // size 29, // modulus fURIStringPool, false, // adoptElems fMemoryManager ); break; default: // ATTRIBUTE_USE // MODEL_GROUP // PARTICLE // IDENTITY_CONSTRAINT // WILDCARD // ANNOTATION // FACET // MULTIVALUE fComponentMap[i] = 0; break; } fIdVector[i] = new (fMemoryManager) RefVectorOf<XSObject>(30, false, fMemoryManager); } fNamespaceStringList = new (manager) RefArrayVectorOf <XMLCh>(10, true, manager); fXSNamespaceItemList = new (manager) RefVectorOf <XSNamespaceItem>(10, true, manager); fXSAnnotationList = new (manager) RefVectorOf <XSAnnotation> (10, false, manager); fHashNamespace = new (manager) RefHashTableOf<XSNamespaceItem> (11, false, manager); // Loop through all grammars in the grammar pool to create the XSNamespaceItem's // which will have access to Annotation Information which can be used later when // we create all the XS components. XSNamespaceItem* namespaceItem = 0; RefHashTableOfEnumerator<Grammar> grammarEnum = grammarPool->getGrammarEnumerator(); while (grammarEnum.hasMoreElements()) { SchemaGrammar& sGrammar = (SchemaGrammar&) grammarEnum.nextElement(); if (sGrammar.getGrammarType() != Grammar::SchemaGrammarType || XMLString::equals(sGrammar.getTargetNamespace(), SchemaSymbols::fgURI_SCHEMAFORSCHEMA)) continue; // NOTE: In the grammarpool, preprocessed grammars without targetnamespace // will use an empty string... XMLCh* NameSpace = XMLString::replicate(sGrammar.getTargetNamespace(), manager); fNamespaceStringList->addElement(NameSpace); namespaceItem = new (manager) XSNamespaceItem(this, &sGrammar, manager); fXSNamespaceItemList->addElement(namespaceItem); fHashNamespace->put(NameSpace, namespaceItem); } // Now loop through all of the NamespaceItem's // First, we add S4S namespace (irrespective of whether we have any grammars) namespaceItem = new (manager) XSNamespaceItem ( this, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, manager ); fNamespaceStringList->addElement ( XMLString::replicate(SchemaSymbols::fgURI_SCHEMAFORSCHEMA,manager) ); fXSNamespaceItemList->addElement(namespaceItem); fHashNamespace->put ( (void*) SchemaSymbols::fgURI_SCHEMAFORSCHEMA , namespaceItem ); DatatypeValidatorFactory dvFactory(manager); dvFactory.expandRegistryToFullSchemaSet(); addS4SToXSModel ( namespaceItem , dvFactory.getBuiltInRegistry() ); // don't include S4S (thus the -1) unsigned int numberOfNamespaces = fXSNamespaceItemList->size() -1; for (unsigned int j = 0; j < numberOfNamespaces; j++) addGrammarToXSModel(fXSNamespaceItemList->elementAt(j)); }