#ifndef __CONTEXT__ #define __CONTEXT__ namespace XMLIOSERVER { class Context : public ObjectTemplate { public: Context(void) : ObjectTemplate(), ccalendar(NULL), fieldDef(NULL), fileDef(NULL), axisDef(NULL), gridDef(NULL), domainDef(NULL) {/* Ne rien faire de plus */} Context(const string& _id) : ObjectTemplate(_id), ccalendar(NULL), fieldDef(NULL), fileDef(NULL), axisDef(NULL), gridDef(NULL), domainDef(NULL) {/* Ne rien faire de plus */} FieldDefinition * getFieldDefinition(void) const { return (this->fieldDef ); } FileDefinition * getFileDefinition(void) const { return (this->fileDef ); } AxisDefinition * getAxisDefinition(void) const { return (this->axisDef ); } GridDefinition * getGridDefinition(void) const { return (this->gridDef ); } DomainDefinition * getDomainDefinition(void) const { return (this->domainDef); } AbstractCalendar * getCalendar(void) const { return (this->ccalendar ); } AbstractCalendar * setCalendar(const string& _calName, const string& _dateStr) { if (_calName.compare("D360") == 0) return (ccalendar = new D360Calendar(_dateStr)); if (_calName.compare("AllLeap") == 0) return (ccalendar = new AllLeapCalendar(_dateStr)); if (_calName.compare("NoLeap") == 0) return (ccalendar = new NoLeapCalendar(_dateStr)); if (_calName.compare("Julian") == 0) return (ccalendar = new JulianCalendar(_dateStr)); if (_calName.compare("Gregorian") == 0) return (ccalendar = new GregorianCalendar(_dateStr)); WARNING("L'identifiant "+_calName+" est inconnu, le calendrier grégorien sera choisi par défault pour le contexte "+getId()); return (ccalendar = new GregorianCalendar(_dateStr)); } ~Context() { // Désallocation dynamique de mémoire pour chacun des groupes de définition si nécessaire. if(fieldDef != NULL) delete fieldDef ; if(fileDef != NULL) delete fileDef ; if(axisDef != NULL) delete axisDef ; if(gridDef != NULL) delete gridDef ; if(domainDef != NULL) delete domainDef ; // Désallocation dynamique de mémoire pour le calendrier associé au contexte courant si nécessaire. if(ccalendar != NULL) delete ccalendar; } public : /* virtual */ 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 pour la définition des champs. { fieldDef = CreateInstanceAndParse(_node, FieldDefinition::GetDefName().c_str()); continue; } if (name.compare(FileDefinition::GetDefName()) == 0) // Parsing pour la 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; } if (name.compare(DomainDefinition::GetDefName()) == 0) // Parsing pour la définition des domaines. { domainDef = CreateInstanceAndParse(_node, DomainDefinition::GetDefName().c_str()); continue; } WARNING("La définition est invalide, seuls les champs, grilles, axes et fichiers peuvent être définis !"); } while (_node.goToNextElement()); _node.goToParentElement(); // Retour au parent } } virtual bool hasChild(void) const { return ((fieldDef != NULL) or (fileDef != NULL) or (axisDef != NULL) or (gridDef != NULL) or (domainDef != 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; if(domainDef != NULL) out << *(DomainDefinition*) domainDef << std::endl; } virtual void resolveDescInheritance(const AttributRegistrar* const _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(); if(domainDef != NULL) domainDef->resolveDescInheritance(); } public : /* static */ static string GetRootName(void) { return ("simulation"); } static string GetName(void) { return ("context"); } static string GetDefName(void) { return (Context::GetName()); } static void ShowTree(ostream& os = std::clog) { os << NIndent << "" << std::endl; os << NIndent << "<" << Context::GetRootName() << ">" << std::endl; Poco::HashMap > &AllListContext = Context::GetAllListObject(); for (Poco::HashMap >::Iterator it = AllListContext.begin(); it != AllListContext.end(); it++) // On sort chacun des contextes successivement. { Context::SetCurrentContext((*it).first); os << NIndent << std::endl; os << *((*it).second)[(*it).first] << std::endl; } os << NIndent << std::endl; os << NIndent << "" << std::endl ; } static void FreeMemory(void) { Poco::HashMap > &AllListContext = Context::GetAllListObject(); for (Poco::HashMap >::Iterator it = AllListContext.begin(); it != AllListContext.end(); it++) { Context::SetCurrentContext((*it).first); delete ((*it).second)[(*it).first]; } } // Ne plus utiliser, disponible dans les classe treatment. static void ResolveInheritance(void) { Poco::HashMap > &AllListContext = Context::GetAllListObject(); for (Poco::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 Context* SwapContext(void) { if (Stid.size() == 0) { WARNING("SwapContext impossible car le pile des contextes est vides !"); return (NULL); } string lastId = Stid.top (); Stid.pop (); return (Context::GetObject(lastId)); } static Context* GetCurrentContext(void) { return (Context::GetObject(Context::GetCurrentContextId())); } static void SetCurrentContext(const string& id, bool withSwap = false) { if (withSwap) Stid.push (Context::GetCurrentContextId()); // 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); // Changement de context pour les domaines et groupes de domaines. DomainGroup::SetContext(id); CDomain::SetContext(id); } private: static stack Stid; AbstractCalendar * ccalendar; FieldDefinition * fieldDef; FileDefinition * fileDef; AxisDefinition * axisDef; GridDefinition * gridDef; DomainDefinition * domainDef; }; //class Context stack Context::Stid; }// namespace XMLIOSERVER #endif // __CONTEXT__