NIREP

C:/Programs/source/NIREP/DisplayDescription/ResourceDescriptionList/ResourceDescriptionList.h

00001 /***************************************************************************************
00002 *   @author Gary E. Christensen
00003 *   @date 6/24/2010
00004 *   @class ResourceDescriptionList
00005 *   @brief This class keeps a list of the data files available to be loaded into memory.
00006 *      This class lists the data descriptions of images, object maps, landmark files, and 
00007 *      contour files. 
00008 *      This class creates a map of ResourceDescription objects by parsing a resource description file.
00009 ******************************************************************************************/
00010 #pragma once
00011 #ifndef _RESOURCE_DESCRIPTION_LIST_H_
00012 #define _RESOURCE_DESCRIPTION_LIST_H_
00013 
00014 #include <string>
00015 #include <map>
00016 #include <set>
00017 #include <algorithm>
00018 #include "BasicDescription.h"
00019 #include "ResourceDescription.h"
00020 
00021 #include "tinyxml.h"
00022 #include <wx/log.h>
00023 
00024 
00025 class ResourceDescriptionList {
00026 public:
00027   typedef std::map<std::string, BasicDescription *> BasicList;
00028   typedef std::map<std::string, ResourceDescription *> ResourceList;
00029   typedef std::map<std::string, ResourceDescriptionList *> RDLList;
00030 
00033   // Constructor left empty on purpose.  
00034         // All member objects initialize themselves automatically.
00035         ResourceDescriptionList(ResourceDescriptionList * parent = NULL) { m_parent = parent; }
00036 
00042         ResourceDescriptionList(const std::string & rdl_filename, ResourceDescriptionList * parent = NULL) {
00043     m_parent = parent;
00044     if (!rdl_filename.empty()){
00045       this->Load(rdl_filename);
00046     }
00047         }
00048 
00051   // Destructor left empty on purpose.  
00052         // All member objects should destroy themselves automatically.
00053   ~ResourceDescriptionList() { Clear(); };
00054 
00055         void Clear();
00056 
00059         bool Load(){ return Load(m_filename); };
00060 
00064         bool Load(const std::string & rdl_filename);  
00065 
00069   bool LoadFromDisplayDescription(const std::string & displayDescriptionFilename);
00070 
00071 
00074         bool Save(){ return Save(m_filename); };
00075 
00078         bool Save(const std::string & filename); 
00079 
00082   //JAH added
00083         bool Save(FILE *); 
00084 
00086         std::string & GetFilename() { return m_filename; }
00087         void SetFilename(const std::string & filename) { m_filename = filename; }
00088 
00091   std::vector<std::string> * CreateRDLFilenameList() { 
00092     std::vector<std::string> * filename = new std::vector<std::string>;
00093 
00094     if (filename != NULL){
00095       // Add root RDL filename
00096       filename->push_back(GetFilename());  
00097 
00098       // Add children RDL filenames if present
00099       if (!m_RDL.empty()){
00100         RDLList::iterator RDL_iter;
00101         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00102           filename->push_back(RDL_iter->second->GetFilename());
00103         }
00104       }
00105     }else{
00106       wxString msg(wxT("Error: Could not allocate memory to store RDL Filenames"));
00107       wxLogError(msg);
00108     }
00109 
00110     return filename;
00111   }
00112   
00114         std::string & GetNameSpace() { return m_namespace; }
00115         void SetNameSpace(const std::string & _namespace) { 
00116     m_namespace = _namespace; 
00117     // convert m_namespace to lower case for case insensitivity strin comparison
00118     std::transform(m_namespace.begin(), m_namespace.end(), m_namespace.begin(), ::tolower);
00119   }
00120 
00122   BasicList & GetNameSpaceDescrip() { return m_namespace_descrip; }
00123   void SetNameSpaceDescrip(const BasicList & namespace_descrip) { m_namespace_descrip = namespace_descrip; }
00127   BasicDescription * GetNameSpaceDescrip(std::string key){
00128     // convert key to lower case for case insensitivity strin comparison
00129     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00130 
00131     BasicList::iterator iter = m_namespace_descrip.find(key);
00132     if (iter != m_namespace_descrip.end()){
00133       return iter->second;
00134     } else {
00135       // Search for name space description in all included research description lists
00136       if (!m_RDL.empty()){
00137         RDLList::iterator RDL_iter;
00138         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00139           iter = RDL_iter->second->m_namespace_descrip.find(key);    // RDL_iter->second is a different resource description list each time through the for loop
00140           if (iter != RDL_iter->second->m_namespace_descrip.end()){  // check to see if key was found in m_namespace_description list. not found if iter = end of list
00141             return iter->second;
00142           }
00143         }
00144       }
00145       // Return NULL if not found
00146       return NULL;
00147     }
00148   }
00149         void AddNameSpaceDescrip(std::string key, BasicDescription * value){ 
00150     // convert key to lower case for case insensitivity strin comparison
00151     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00152 
00153     m_namespace_descrip[key] = value; 
00154   }
00155   void ClearNameSpaceDescrips(){ 
00156     BasicList::iterator iter;
00157     for(iter = m_namespace_descrip.begin(); iter != m_namespace_descrip.end(); ++iter){
00158       delete iter->second;
00159     }
00160     m_namespace_descrip.clear(); 
00161   }
00162 
00165   std::vector<std::string> * CreateNameSpaceList() { 
00166     std::vector<std::string> * ns_list = new std::vector<std::string>;
00167 
00168     if (ns_list != NULL){
00169       // Add root namespaces
00170       BasicList::iterator iter;
00171       for(iter = m_namespace_descrip.begin(); iter != m_namespace_descrip.end(); ++iter){
00172         ns_list->push_back(iter->second->GetID());  
00173       }
00174 
00175       // Add first level children namespaces if present
00176       if (!m_RDL.empty()){
00177         RDLList::iterator RDL_iter;
00178         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00179           BasicList child_descrip = RDL_iter->second->GetNameSpaceDescrip();
00180           BasicList::iterator iter;
00181           for(iter = child_descrip.begin(); iter != child_descrip.end(); ++iter){
00182             ns_list->push_back(iter->second->GetID());  
00183           }
00184         }
00185       }
00186     }else{
00187       wxString msg(wxT("Error: Could not allocate memory to store all namespaces."));
00188       wxLogError(msg);
00189     }
00190 
00191     return ns_list;
00192   }
00193 
00194 
00196   BasicList & GetCSDescrip() { return m_cs_descrip; }
00197   void SetCSDescrip(const BasicList & cs_descrip) { m_cs_descrip = cs_descrip; }
00198 
00202         BasicDescription * GetCSDescrip(std::string key){ 
00203     // convert key to lower case for case insensitivity strin comparison
00204     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00205 
00206                 BasicList::iterator iter = m_cs_descrip.find(key);
00207                 if (iter != m_cs_descrip.end()){
00208                         return iter->second;
00209                 } else {
00210       // Search for coordinate system description in all included research description lists
00211       if (!m_RDL.empty()){
00212         RDLList::iterator RDL_iter;
00213         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00214           iter = RDL_iter->second->m_cs_descrip.find(key);    // RDL_iter->second is a different resource description list each time through the for loop
00215           if (iter != RDL_iter->second->m_cs_descrip.end()){  // check to see if key was found in m_cs_descrip list. not found if iter = end of list
00216             return iter->second;
00217           }
00218         }
00219       }
00220       // Return NULL if not found
00221       return NULL;
00222                 }
00223         }
00224         void AddCSDescrip(std::string key, BasicDescription * value){ 
00225     // convert key to lower case for case insensitivity strin comparison
00226     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00227 
00228     m_cs_descrip[key] = value; 
00229   }
00230         void ClearCSDescrips(){ 
00231     BasicList::iterator iter;
00232     for(iter = m_cs_descrip.begin(); iter != m_cs_descrip.end(); ++iter){
00233       delete iter->second;
00234     }
00235     m_cs_descrip.clear(); 
00236   }
00239   std::vector<std::string> * CreateCSList() { 
00240     std::vector<std::string> * cs_list = new std::vector<std::string>;
00241 
00242     if (cs_list != NULL){
00243       // Add root coordinate systems
00244       BasicList::iterator iter;
00245       for(iter = m_cs_descrip.begin(); iter != m_cs_descrip.end(); ++iter){
00246         cs_list->push_back(iter->second->GetID());  
00247       }
00248 
00249       // Add first level children coordinate systems if present
00250       if (!m_RDL.empty()){
00251         RDLList::iterator RDL_iter;
00252         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00253           BasicList child_descrip = RDL_iter->second->GetCSDescrip();
00254           BasicList::iterator iter;
00255           for(iter = child_descrip.begin(); iter != child_descrip.end(); ++iter){
00256             cs_list->push_back(iter->second->GetID());  
00257           }
00258         }
00259       }
00260     }else{
00261       wxString msg(wxT("Error: Could not allocate memory to store all coordinate system names."));
00262       wxLogError(msg);
00263     }
00264 
00265     return cs_list;
00266   }
00267 
00268 
00270   BasicList & GetAlgorithmDescrip() { return m_algorithm_descrip; }
00271   void SetAlgorithmDescrip(const BasicList & algorithm_descrip) { m_algorithm_descrip = algorithm_descrip;  }
00272 
00276         BasicDescription * GetAlgorithmDescrip(std::string key){
00277     // convert key to lower case for case insensitivity strin comparison
00278     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00279 
00280                 BasicList::iterator iter = m_algorithm_descrip.find(key);
00281                 if (iter != m_algorithm_descrip.end()){
00282                         return iter->second;
00283                 } else {
00284       // Search for algorithm description in all included research description lists
00285       if (!m_RDL.empty()){
00286         RDLList::iterator RDL_iter;
00287         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00288           iter = RDL_iter->second->m_algorithm_descrip.find(key);    // RDL_iter->second is a different resource description list each time through the for loop
00289           if (iter != RDL_iter->second->m_algorithm_descrip.end()){  // check to see if key was found in m_algorithm_descrip list. not found if iter = end of list
00290             return iter->second;
00291           }
00292         }
00293       }
00294       // Return NULL if not found
00295                         return NULL;
00296                 }
00297         }
00298         void AddAlgorithmDescrip(std::string key, BasicDescription * value){ 
00299     // convert key to lower case for case insensitivity strin comparison
00300     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00301 
00302     m_algorithm_descrip[key] = value; 
00303   }
00304         void ClearAlgorithmDescrips(){ 
00305     BasicList::iterator iter;
00306     for(iter = m_algorithm_descrip.begin(); iter != m_algorithm_descrip.end(); ++iter){
00307       delete iter->second;
00308     }
00309     m_algorithm_descrip.clear(); 
00310   }
00321   std::vector<std::string> * CreateAlgorithmList() { 
00322     std::vector<std::string> * alg_list = new std::vector<std::string>;
00323 
00324     if (alg_list != NULL){
00325       // Add root coordinate systems
00326       BasicList::iterator iter;
00327       for(iter = m_cs_descrip.begin(); iter != m_cs_descrip.end(); ++iter){
00328         alg_list->push_back(iter->second->GetID());  
00329       }
00330 
00331       // Add first level children coordinate systems if present
00332       if (!m_RDL.empty()){
00333         RDLList::iterator RDL_iter;
00334         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00335           BasicList child_descrip = RDL_iter->second->GetAlgorithmDescrip();
00336           BasicList::iterator iter;
00337           for(iter = child_descrip.begin(); iter != child_descrip.end(); ++iter){
00338             alg_list->push_back(iter->second->GetID());  
00339           }
00340         }
00341       }
00342     }else{
00343       wxString msg(wxT("Error: Could not allocate memory to store all the algorithm names."));
00344       wxLogError(msg);
00345     }
00346 
00347     return alg_list;
00348   }
00349 
00351   BasicList & GetLabelDescrip() { return m_label_descrip; }
00352   void SetLabelDescrip(const BasicList & label_descrip) { m_label_descrip = label_descrip;  }
00353 
00357         BasicDescription * GetLabelDescrip(std::string key){
00358     // convert key to lower case for case insensitivity strin comparison
00359     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00360 
00361                 BasicList::iterator iter = m_label_descrip.find(key);
00362                 if (iter != m_label_descrip.end()){
00363                         return iter->second;
00364                 } else {
00365       // Search for label description in all included research description lists
00366       if (!m_RDL.empty()){
00367         RDLList::iterator RDL_iter;
00368         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00369           iter = RDL_iter->second->m_label_descrip.find(key);    // RDL_iter->second is a different resource description list each time through the for loop
00370           if (iter != RDL_iter->second->m_label_descrip.end()){  // check to see if key was found in m_label_descrip list. not found if iter = end of list
00371             return iter->second;
00372           }
00373         }
00374       }
00375       // Return NULL if not found
00376                         return NULL;
00377                 }
00378         }
00379         void AddLabelDescrip(std::string key, BasicDescription * value){
00380     // convert key to lower case for case insensitivity strin comparison
00381     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00382 
00383     m_label_descrip[key] = value; 
00384   }
00385         void ClearLabelDescrips(){ 
00386     BasicList::iterator iter;
00387     for(iter = m_label_descrip.begin(); iter != m_label_descrip.end(); ++iter){
00388       delete iter->second;
00389     }
00390     m_label_descrip.clear(); 
00391   }
00394   std::vector<std::string> * CreateLabelList() { 
00395     std::vector<std::string> * label_list = new std::vector<std::string>;
00396 
00397     if (label_list != NULL){
00398       // Add root coordinate systems
00399       BasicList::iterator iter;
00400       for(iter = m_label_descrip.begin(); iter != m_label_descrip.end(); ++iter){
00401         label_list->push_back(iter->second->GetID());  
00402       }
00403 
00404       // Add first level children coordinate systems if present
00405       if (!m_RDL.empty()){
00406         RDLList::iterator RDL_iter;
00407         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00408           BasicList child_descrip = RDL_iter->second->GetLabelDescrip();
00409           BasicList::iterator iter;
00410           for(iter = child_descrip.begin(); iter != child_descrip.end(); ++iter){
00411             label_list->push_back(iter->second->GetID());  
00412           }
00413         }
00414       }
00415     }else{
00416       wxString msg(wxT("Error: Could not allocate memory to store all the label names."));
00417       wxLogError(msg);
00418     }
00419 
00420     return label_list;
00421   }
00422 
00426         ResourceDescription * GetDataDescrip(std::string key){ 
00427     // convert key to lower case for case insensitivity strin comparison
00428     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00429 
00430                 ResourceList::iterator iter = m_data_descrip.find(key);
00431                 if (iter != m_data_descrip.end()){
00432                         return iter->second;
00433                 } else {
00434       // Search for data description in all included research description lists
00435       if (!m_RDL.empty()){
00436         RDLList::iterator RDL_iter;
00437         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00438           iter = RDL_iter->second->m_data_descrip.find(key);    // RDL_iter->second is a different resource description list each time through the for loop
00439           if (iter != RDL_iter->second->m_data_descrip.end()){  // check to see if key was found in m_data_descrip list. not found if iter = end of list
00440             return iter->second;
00441           }
00442         }
00443       }
00444       // Return NULL if not found
00445                         return NULL;
00446                 }
00447         }
00448         bool AddDataDescrip(std::string key, ResourceDescription * value){ 
00449     // convert key to lower case for case insensitivity strin comparison
00450     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00451     int size = m_data_descrip.size();
00452     m_data_descrip[key] = value; 
00453     if(size< m_data_descrip.size()) {
00454       return true;
00455     }
00456     return false;
00457   }
00458         void ClearDataDescrips(){ 
00459     ResourceList::iterator iter;
00460     for(iter = m_data_descrip.begin(); iter != m_data_descrip.end(); ++iter){
00461       delete iter->second;
00462     }
00463     m_data_descrip.clear(); 
00464   }
00465 
00469         ResourceDescription * GetTransformDescrip(std::string key){
00470     // convert key to lower case for case insensitivity strin comparison
00471     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00472 
00473                 ResourceList::iterator iter = m_transform_descrip.find(key);
00474                 if (iter != m_transform_descrip.end()){
00475                         return iter->second;
00476                 } else {
00477                         // Search for transform description in all included research description lists
00478       if (!m_RDL.empty()){
00479         RDLList::iterator RDL_iter;
00480         for(RDL_iter = m_RDL.begin(); RDL_iter != m_RDL.end(); ++RDL_iter){ 
00481           iter = RDL_iter->second->m_transform_descrip.find(key);    // RDL_iter->second is a different resource description list each time through the for loop
00482           if (iter != RDL_iter->second->m_transform_descrip.end()){  // check to see if key was found in m_transform_descrip list. not found if iter = end of list
00483             return iter->second;
00484           }
00485         }
00486       }
00487       // Return NULL if not found
00488                         return NULL;
00489                 }
00490         }
00491         bool AddTransformDescrip(std::string key, ResourceDescription * value){
00492     // convert key to lower case for case insensitivity strin comparison
00493     std::transform(key.begin(), key.end(), key.begin(), ::tolower);
00494     int size = m_transform_descrip.size();
00495     m_transform_descrip[key] = value; 
00496     if(size< m_transform_descrip.size()) {
00497       return true;
00498     }
00499     return false;
00500   }
00501         void ClearTransformDescrips(){ 
00502     ResourceList::iterator iter;
00503     for(iter = m_transform_descrip.begin(); iter != m_transform_descrip.end(); ++iter){
00504       delete iter->second;
00505     }
00506     m_transform_descrip.clear(); 
00507   }
00508 
00511   ResourceDescriptionList * GetParentRDL(){return m_parent;}
00512   void SetParentRDL(ResourceDescriptionList * parent){ m_parent = parent; }
00513 
00517         // Do not change case of filenames
00518   ResourceDescriptionList * GetRDL(const std::string & filename){ 
00519                 RDLList::iterator iter = m_RDL.find(filename);
00520                 if (iter != m_RDL.end()){
00521                         return iter->second;
00522                 } else {
00523                         return NULL;
00524                 }
00525         }
00528         void AddRDL(const std::string & filename, ResourceDescriptionList * rdl){ 
00529     // parent == NULL for the root RDL, otherwise pass RDL to parent to add
00530     if (m_parent == NULL){
00531       // Add RDL to root RDL list if it has not previously been added
00532       RDLList::iterator iter = m_RDL.find(filename);
00533                 if (iter == m_RDL.end()){
00534                           m_RDL[filename] = rdl; 
00535                   }
00536     } else {
00537       GetParentRDL()->AddRDL(filename, rdl);
00538     }
00539   }
00540 
00541   void ClearRDLs(){ 
00542     // Destroy all included RDLs
00543     RDLList::iterator RDL_iter;
00544     for(RDL_iter=m_RDL.begin(); RDL_iter!=m_RDL.end(); ++RDL_iter){
00545       delete RDL_iter->second;
00546     }
00547     m_RDL.clear(); 
00548   }
00549 
00550 //bool CaseInsensitiveFind(std::string string1, std::string string2);
00551 
00552 private:
00553   std::string   m_filename;             // filename of resource description list
00554   std::string   m_namespace;            // Default namespace
00555 
00556   BasicList     m_namespace_descrip;    // List of name space descriptions indexed by namespace
00557   BasicList     m_cs_descrip;           // List coordinate system descriptions indexed by namespace and coordinate system
00558   BasicList     m_algorithm_descrip;    // List algorithm descriptions indexed by algorithm name
00559   BasicList     m_label_descrip;        // List label descriptions indexed by label name
00560 
00561         ResourceList  m_data_descrip;         // List of data file resourses indexed by dmid (data manager id)
00562   ResourceList  m_transform_descrip;    // List of transformation file resources indexed by dmid (data manager id)
00563     
00564   ResourceDescriptionList * m_parent;   // Pointer to parent ResourceDescriptionList object.  Root has NULL parent.
00565   RDLList       m_RDL;                  // List of included ResourceDescirptionList object pointers.  RDLs are
00566                                         // included at the root node to avoid duplicate entries and cycles.
00567   
00568 };
00569 
00570 #endif
 All Classes Functions Variables Typedefs Enumerations Enumerator