NIREP
|
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