#include "data_treatment.hpp" #include "attribute_template_impl.hpp" #include "object_template_impl.hpp" #include "group_template_impl.hpp" #include "object_factory_impl.hpp" namespace xmlioserver { namespace data { /// ////////////////////// Définitions ////////////////////// /// CDataTreatment::CDataTreatment (boost::shared_ptr _ctxt) : currentContext(_ctxt), enabledFiles() { this->doTreatment(); } CDataTreatment::~CDataTreatment(void) { /* Ne rien faire de plus */ } ///--------------------------------------------------------------- const boost::shared_ptr CDataTreatment::getCurrentContext(void) const { return (this->currentContext); } const std::vector > & CDataTreatment::getEnabledFiles (void) const { return (this->enabledFiles); } //---------------------------------------------------------------- void CDataTreatment::update_calendar(int step) { // Mise à jour côté client this->currentContext->getCalendar()->update(step); if (CXIOSManager::GetStatus() == CXIOSManager::LOC_CLIENT) { // Mise à jour côté serveur boost::shared_ptr client = comm::CClient::GetClient(); client->updateCalendar(step); } } void CDataTreatment::set_timestep(const date::CDuration & duration) { // Mise à jour côté client this->currentContext->getCalendar()->setTimeStep(duration); this->currentContext->timestep.setValue(duration.toString()); if (CXIOSManager::GetStatus() == CXIOSManager::LOC_CLIENT) { // Mise à jour côté serveur boost::shared_ptr client = comm::CClient::GetClient(); client->setTimestep(duration); } } void CDataTreatment::finalize(void) { // Mise à jour côté client if (CXIOSManager::GetStatus() == CXIOSManager::LOC_CLIENT) { // Mise à jour côté serveur boost::shared_ptr client = comm::CClient::GetClient(); client->finalize(); } else closeAllFile() ; } void CDataTreatment::closeAllFile(void ) { std::vector >::const_iterator it = this->enabledFiles.begin(), end = this->enabledFiles.end(); for (; it != end; it++) { (*it)->close(); } } //---------------------------------------------------------------- void CDataTreatment::write_data (const StdString & fieldId, const StdString & fileId, const std::deque & data) { const date::CDate & currDate = this->currentContext->getCalendar()->getCurrentDate(); const std::vector > & refField= CObjectFactory::GetObject(fieldId)->getAllReference(); std::vector >::const_iterator it = refField.begin(), end = refField.end(); for (; it != end; it++) { boost::shared_ptr field = *it; boost::shared_ptr file = field->getRelFile(); if (file->getId().compare(fileId) == 0) { if (field->updateDataServer(currDate, data)) { file->getDataOutput()->writeFieldData(field); } return; } } } //---------------------------------------------------------------- void CDataTreatment::doTreatment(void) { // Résolution du calendrier this->currentContext->solveCalendar(); // Résolution des héritages pour le context actuel. this->solveAllInheritance(); //Initialisation du vecteur 'enabledFiles' contenant la liste des fichiers à sortir. this->findEnabledFiles(); //Recherche des champs à sortir (enable à true + niveau de sortie correct) // pour chaque fichier précédemment listé. this->findAllEnabledFields(); // Résolution des références de grilles pour chacun des champs. this->solveAllGridRef(); // Traitement des opérations. this->solveAllOperation(); // Nettoyage de l'arborescence CContext::CleanTree(); } void CDataTreatment::findAllEnabledFields(void) { for (unsigned int i = 0; i < this->enabledFiles.size(); i++) (void)this->enabledFiles[i]->getEnabledFields(); } void CDataTreatment::solveAllGridRef(void) { for (unsigned int i = 0; i < this->enabledFiles.size(); i++) this->enabledFiles[i]->solveEFGridRef(); } void CDataTreatment::solveAllOperation(void) { for (unsigned int i = 0; i < this->enabledFiles.size(); i++) this->enabledFiles[i]->solveEFOperation(); } void CDataTreatment::solveAllInheritance(void) const { // Résolution des héritages descendants (càd des héritages de groupes) // pour chacun des contextes. this->currentContext->solveDescInheritance(); // Résolution des héritages par référence au niveau des fichiers. const std::vector > & allFiles = CObjectFactory::GetObjectVector(); for (unsigned int i = 0; i < allFiles.size(); i++) allFiles[i]->solveFieldRefInheritance(); } void CDataTreatment::findEnabledFiles(void) { const std::vector > & allFiles = CObjectFactory::GetObjectVector(); for (unsigned int i = 0; i < allFiles.size(); i++) if (!allFiles[i]->enabled.isEmpty()) // Si l'attribut 'enabled' est défini. if (allFiles[i]->enabled.getValue()) // Si l'attribut 'enabled' est fixé à vrai. enabledFiles.push_back(allFiles[i]); if (enabledFiles.size() == 0) DEBUG(<<"Aucun fichier ne va être sorti dans le contexte nommé \"" << this->currentContext->getId() << "\" !"); } ///--------------------------------------------------------------- } // namespace data } // namespace xmlioserver