#ifndef __CONTEXT__ #define __CONTEXT__ namespace XMLIOSERVER { class Context : public ObjectTemplate { public: Context(void) : ObjectTemplate(), fieldDef(NULL), fileDef(NULL), axisDef(NULL), gridDef(NULL) {/* Ne rien faire de plus */} Context(const string& _id) : ObjectTemplate(_id), fieldDef(NULL), fileDef(NULL), axisDef(NULL), gridDef(NULL) {/* Ne rien faire de plus */} static void ShowTree(ostream& os = std::clog) { os << NIndent << "" << std::endl; os << NIndent << "<"<< Context::GetRootName() << ">" << std::endl; HashMap > &AllListContext = Context::GetAllListObject(); for (HashMap >::Iterator it = AllListContext.begin(); it != AllListContext.end(); it++) // On sort chacun des contextes successivement. { Context::SetCurrentContext((*it).first); os << *((*it).second)[(*it).first] << std::endl; } os << NIndent << "" << std::endl ; } static void FreeMemory(void) { HashMap > &AllListContext = Context::GetAllListObject(); for (HashMap >::Iterator it = AllListContext.begin(); it != AllListContext.end(); it++) { Context::SetCurrentContext((*it).first); delete ((*it).second)[(*it).first]; } } static void ResolveInheritance(void) { HashMap > &AllListContext = Context::GetAllListObject(); for (HashMap >::Iterator it = AllListContext.begin(); it != AllListContext.end(); it++) { // Résolution des héritages descendants (càd des héritages de groupes) pour chacun des contextes. Context::SetCurrentContext((*it).first); ((*it).second)[(*it).first]->resolveDescInheritance(); // Résolution des héritages par référence au niveau des fichiers. const std::vector& allFiles = CFile::GetCurrentListObject().getVector(); for (unsigned int i = 0; i < allFiles.size(); i++) allFiles[i]->resolveFieldRefInheritance(); } } static void SetCurrentContext(const string& id) { // On modifie le context courrant pour tout les ObjectTemplate Context::SetContext(id); // Changement de context pour les champs et groupes de champs. FieldGroup::SetContext(id); CField::SetContext(id); // Changement de context pour les fichiers et groupes de fichiers. FileGroup::SetContext(id); CFile::SetContext(id); // Changement de context pour les grilles et groupes de grilles. GridGroup::SetContext(id); CGrid::SetContext(id); // Changement de context pour les axes et groupes d'axes. AxisGroup::SetContext(id); CAxis::SetContext(id); } virtual void parse (XMLNode& _node) { THashAttributes attributes; /// PARSING POUR GESTION DES ENFANTS if (_node.getElementName().compare(Context::GetName())) WARNING("Le noeud est mal nommé mais sera traité comme un context !"); if (!(_node.goToChildElement())) WARNING("Le context ne contient pas d'enfant !"); else { do { // Parcours des contexts pour traitement. string name = _node.getElementName(); attributes.clear(); _node.getAttributes(attributes); if (attributes.end() != attributes.find("id")) { WARNING("Le noeud de définition possède un identifiant, ce dernier ne sera pas pris en compte lors du traitement !"); } if (name.compare(FieldDefinition::GetDefName()) == 0) // Parsing définition des champs. { fieldDef = CreateInstanceAndParse(_node, FieldDefinition::GetDefName().c_str()); continue; } if (name.compare(FileDefinition::GetDefName()) == 0) // Parsing définition des fichiers. { fileDef = CreateInstanceAndParse(_node, FileDefinition ::GetDefName().c_str()); continue; } if (name.compare(AxisDefinition::GetDefName()) == 0) // Parsing pour la définition des axes. { axisDef = CreateInstanceAndParse(_node, AxisDefinition ::GetDefName().c_str()); continue; } if (name.compare(GridDefinition::GetDefName()) == 0) // Parsing pour la définition des grilles. { gridDef = CreateInstanceAndParse(_node, GridDefinition ::GetDefName().c_str()); continue; } WARNING("La définition est invalide, seules les champs, grilles, axes et fichiers peuvent être définis !"); } while (_node.goToNextElement()); _node.goToParentElement(); // Retour au parent } } static string GetName(void) {return ("context"); } static string GetRootName(void) {return ("simulation"); } virtual bool hasChild(void) const { return ((fieldDef != NULL) or (fileDef != NULL) or (axisDef != NULL) or (gridDef != NULL)); } virtual void printChild(ostream& out) const { if(fieldDef != NULL) out << *(FieldGroup*) fieldDef << std::endl; if(fileDef != NULL) out << *(FileGroup*) fileDef << std::endl; if(axisDef != NULL) out << *(AxisDefinition*) axisDef << std::endl; if(gridDef != NULL) out << *(GridDefinition*) gridDef << std::endl; } virtual void resolveDescInheritance(const AttributRegistrar* _parent = 0) { if (_parent != 0) return; // Résolution des héritages descendants pour chacun des groupes de définitions. if(fieldDef != NULL) fieldDef->resolveDescInheritance(); if(fileDef != NULL) fileDef ->resolveDescInheritance(); if(axisDef != NULL) axisDef ->resolveDescInheritance(); if(gridDef != NULL) gridDef ->resolveDescInheritance(); } FieldDefinition* getFieldDefinition(void) { return (this->fieldDef); } FileDefinition * getFileDefinition(void) { return (this->fileDef ); } AxisDefinition * getAxisDefinition(void) { return (this->axisDef ); } GridDefinition * getGridDefinition(void) { return (this->gridDef ); } ~Context() { if(fieldDef != NULL) delete fieldDef; if(fileDef != NULL) delete fileDef; if(axisDef != NULL) delete axisDef; if(gridDef != NULL) delete gridDef; } private: FieldDefinition* fieldDef; FileDefinition* fileDef; AxisDefinition* axisDef; GridDefinition* gridDef; }; //class Context }// namespace XMLIOSERVER #endif // __CONTEXT__