source: XMLIO_V2/dev/dev_rv/src/XMLIO/file.hpp @ 130

Last change on this file since 130 was 130, checked in by hozdoba, 14 years ago
File size: 7.1 KB
RevLine 
[106]1#ifndef __CFILE__
2#define __CFILE__
3
4using XMLIOSERVER::XML::XMLNode;
5using XMLIOSERVER::XML::THashAttributes;
6
7namespace XMLIOSERVER
[107]8{
[106]9   class CFile : public ObjectTemplate<CFile>, public FileAttribut
10   {
11      public:
[107]12
[130]13         CFile(void)
14            : ObjectTemplate<CFile>(), FileAttribut(),
15              vfieldGroup(NULL), enabledFields(), output(NULL)
16         { /* Ne rien faire de plus */ }
[107]17
[130]18         CFile(const string& _id)
19            : ObjectTemplate<CFile>(_id), FileAttribut(),
20              vfieldGroup(NULL), enabledFields(), output(NULL)
21         { /* Ne rien faire de plus */ }
22
23         AbstractDataOutput*         getDataOutput       (void) const { return (output); }
24         FieldGroup*                 getVirtualFieldGroup(void) const { return (vfieldGroup); }
25         const std::vector<CField*>& getEnabledFields    (void) const { return (enabledFields); }
26
[122]27         void initializeDataOutput(AbstractDataOutput* _output)
28         {
29            if (_output != NULL) output = _output;
[130]30            else throw XMLIOSERVER::XMLIOUndefinedValueException
31               ("Impossible d'initialiser la sortie de données pour le fichier nommé '"+ getId() +"'.") ;
[122]32         }
33
[130]34         void getAllFields(std::vector<CField*>& _allF) const
35         {  if (vfieldGroup!=NULL) vfieldGroup->getAllChildren(_allF); }
[120]36
[122]37         const std::set<const CGrid*> getEnabledGrids(void) const
38         {
39            std::set<const CGrid*> sgrid;
[127]40            const std::vector<CField*> enabledFields = this->getEnabledFields();
[122]41            std::vector<CField*>::const_iterator it;
42
43            for ( it = enabledFields.begin() ; it != enabledFields.end(); it++ )
44               sgrid.insert((*it)->getGrid());
45
46            return (sgrid);
47         }
48
[127]49         const std::set<const FieldOperation*> getEnabledOperation(void) const
50         {
51            std::set<const FieldOperation*> sope;
52            const std::vector<CField*> enabledFields = this->getEnabledFields();
53            std::vector<CField*>::const_iterator it;
54
55            for ( it = enabledFields.begin() ; it != enabledFields.end(); it++ )
56               if ((*it)->operation.hasValue())
[130]57                  sope.insert((*it)->operation.getValue());
[127]58
59            return (sope);
60         }
61
[122]62         const std::set<const CDomain*> getEnabledDomains(void) const
63         {
[127]64            const std::set<const CGrid*> sgrid = this->getEnabledGrids();
[122]65            std::set<const CDomain*> sdomain;
66            std::set<const CGrid*>::const_iterator it;
67
68            for ( it = sgrid.begin() ; it != sgrid.end(); it++ )
69               sdomain.insert((*it)->getRelDomain());
70
71            return (sdomain);
72         }
73
74         const std::set<const CAxis*> getEnabledAxis(void) const
75         {
[127]76            const std::set<const CGrid*> sgrid = this->getEnabledGrids();
[122]77            std::set<const CAxis*> saxis;
78            std::set<const CGrid*>::const_iterator it;
79
80            for ( it = sgrid.begin() ; it != sgrid.end(); it++ )
81               saxis.insert((*it)->getRelAxis());
82
83            return (saxis);
84         }
85
[128]86         void solveFieldRefInheritance(void)
[109]87         { // Résolution des héritages par référence de chacun des champs contenus dans le fichier.
[125]88            std::vector<CField*> allF; this->getAllFields(allF);
[130]89            for (unsigned int i = 0; i < allF.size(); i++)
90               allF[i]->solveRefInheritance();
[108]91         }
92
[130]93         void findEnabledFields(const Date& inidate,
94               int default_outputlevel = 5, int default_level = 1, bool default_enabled = true )
[120]95         {
96            const int _outputlevel = (output_level.hasValue()) ? (int)output_level : default_outputlevel;
97            std::vector<CField*>::iterator it;
98
[125]99            this->getAllFields(enabledFields);
[120]100
[122]101            for ( it = enabledFields.begin() ; it != enabledFields.end(); it++ )
[125]102            { // TODO Jeu avec les itérateurs un peu bizarre, à modifier.
103              // std::cout << (*it)->field_ref <<std::endl;
[120]104               if ((*it)->enabled.hasValue()) // Si l'attribut 'enabled' est défini ...
105               {
106                  if (! ((*it)->enabled))
[125]107                  { it--; enabledFields.erase(it+1); continue; }
[120]108               }
109               else // Si l'attribut 'enabled' n'est pas défini ...
110               {
111                  if (!default_enabled)
[125]112                  { it--; enabledFields.erase(it+1); continue; }
[120]113               }
114
115               if ((*it)->level.hasValue()) // Si l'attribut 'level' est défini ...
116               {
117                  if ((*it)->level > _outputlevel)
[125]118                  { it--; enabledFields.erase(it+1); continue; }
[120]119               }
120               else // Si l'attribut 'level' n'est pas défini ...
121               {
122                  if (default_level > _outputlevel)
[125]123                  { it--; enabledFields.erase(it+1); continue; }
[120]124               }
[124]125
126               // Le champ est finalement actif, on ajoute la référence au champ de base.
127               (*it)->getBaseObject()->addRefObject(*it);
128               (*it)->setRelFile(this);
129               (*it)->initLastStoredDate(inidate);
[120]130            }
131         }
132
[122]133         void solveEFGridRef(void)
134         {
135            for (unsigned int i = 0; i < enabledFields.size(); i++)
[124]136               enabledFields[i]->solveGridRef();
[122]137         }
138
[130]139         void solveEFOperation(void)
140         {
141            for (unsigned int i = 0; i < enabledFields.size(); i++)
142               enabledFields[i]->solveOperation();
143         }
144
[127]145      public : /* virtual */
146
147         virtual void parse (XMLNode& _node)
148         {
149            string name = _node.getElementName();
150            THashAttributes attributes;
151
152            /// PARSING GESTION DES ATTRIBUTS ///
153            _node.getAttributes(attributes);
154            this->setAttributes(attributes);
155            attributes.clear();
156
157            /// PARSING POUR GESION DES ENFANTS ///
158            if (_node.goToChildElement() and hasId())
159            { // Si la définition du fichier intégre des champs et si le fichier est identifié.
160               _node.goToParentElement();
161               vfieldGroup = CreateInstanceAndParse<FieldGroup>(_node, getId().c_str(), false );
162            }
163         }
164
165         virtual bool hasChild(void) const { return (vfieldGroup != NULL); }
166         virtual void printChild(ostream& out) const { out << *vfieldGroup << std::endl; }
167
[128]168         virtual void solveDescInheritance(const AttributRegistrar* const _parent = 0)
169         { addAttributes(*_parent); if(vfieldGroup != NULL) vfieldGroup->solveDescInheritance(); }
[127]170
[113]171         virtual  ~CFile(void)
[122]172         {
173            if(vfieldGroup != NULL) delete vfieldGroup;
174            if(output != NULL) delete output;
175         }
[107]176
[127]177      public : /* static */
178
179         static string GetName(void) { return ("file"); }
180         static string GetDefName(void)  { return (CFile::GetName()); }
181
[106]182      private :
[107]183
[106]184         FieldGroup* vfieldGroup; // FieldGroup "virtuel"
[122]185         std::vector<CField*> enabledFields; // Liste des champs à sortie dans le fichier courant.
[124]186
[122]187         AbstractDataOutput* output; // Gestion de la sortie des données.
[107]188
189   }; // class CFile
190
[114]191} // namespace XMLIOSERVER
[107]192
[114]193DECLARE_GROUP(File)
[112]194
195
[106]196#endif // __CFILE__
Note: See TracBrowser for help on using the repository browser.