2 // File: SALOME_DataTypeCatalog_impl.cxx
3 // Created: Mon Aug 08 2001
4 // Author: Estelle Deville
6 // Copyright : CEA/DEN/DMSS/LGLS
9 #include "SALOME_DataTypeCatalog_impl.hxx"
12 //----------------------------------------------------------------------
13 // Function : SALOME_DataTypeCatalogImpl
14 // Purpose : Constructor
15 //----------------------------------------------------------------------
16 SALOME_DataTypeCatalogImpl::SALOME_DataTypeCatalogImpl(int argc, char** argv)
18 MESSAGE("DataType Catalog creation");
20 // Empty used variables
21 _datatype_list.resize(0);
23 // Parse the arguments given at server run
24 if (!_parseArguments(argc, argv,&_path_datatype))
25 MESSAGE( "Error while argument parsing" )
27 // Test existency of files
28 if (_path_datatype == NULL)
29 MESSAGE( "Error the data type catalog should be indicated" )
32 MESSAGE("Parse data type catalog");
33 // Affect the variable _datatype_list
34 _parse_xml_file(_path_datatype,_datatype_list);
36 // Verification of _datatype_list content
37 if(!_verify_data_type(_datatype_list))
38 MESSAGE( "Error while parsing the data type list" )
39 else MESSAGE("Data Type list OK");
43 //----------------------------------------------------------------------
44 // Function : ~SALOME_DataTypeCatalogImpl
45 // Purpose : Destructor
46 //----------------------------------------------------------------------
47 SALOME_DataTypeCatalogImpl::~SALOME_DataTypeCatalogImpl()
49 MESSAGE("DataType Catalog Destruction");
53 //----------------------------------------------------------------------
54 // Function : GetDataTypeList
55 // Purpose : get a data type name list
56 //----------------------------------------------------------------------
57 SALOME_DataTypeCatalog::ListOfDataTypeName*
58 SALOME_DataTypeCatalogImpl::GetDataTypeList()
60 MESSAGE("Begin of GetDataTypeList");
61 SALOME_DataTypeCatalog::ListOfDataTypeName_var _list_data =
62 new SALOME_DataTypeCatalog::ListOfDataTypeName;
64 _list_data->length(_datatype_list.size());
66 // Duplicate each data type name defined in the catalog
67 for (unsigned int ind=0; ind < _datatype_list.size();ind++)
69 _list_data[ind]=CORBA::string_dup(_datatype_list[ind].Parserdata_name.c_str());
70 // SCRUTE(_list_data[ind]) ;
73 return _list_data._retn();
76 //----------------------------------------------------------------------
77 // Function : isDerivedFrom
78 // Purpose : return true if type_out is derived from type_in
79 //----------------------------------------------------------------------
81 SALOME_DataTypeCatalogImpl::isDerivedFrom(const char* type_in,
83 throw(SALOME_DataTypeCatalog::NotFound)
86 CORBA::Boolean _return_value = false ;
87 bool _found_in = false;
88 bool _found_out = false;
89 for (unsigned int ind=0; ind < _datatype_list.size();ind++)
91 if (strcmp((_datatype_list[ind].Parserdata_name).c_str(),type_out) == 0)
95 // Looking if type_in is indicated in the parents list
96 _return_value = _explore_parents(type_in,_datatype_list[ind]);
98 if (strcmp((_datatype_list[ind].Parserdata_name).c_str(),type_in) == 0)
104 MESSAGE("The data type " << type_in << " was not found in the data type catalog")
105 throw SALOME_DataTypeCatalog::NotFound() ;
109 MESSAGE( "The data type " << type_out << " was not found in the data type catalog")
110 throw SALOME_DataTypeCatalog::NotFound() ;
113 return _return_value;
117 //----------------------------------------------------------------------
118 // Function : GetDataInterfaceRead
119 // Purpose : get the read interface name
120 //----------------------------------------------------------------------
122 SALOME_DataTypeCatalogImpl::GetDataInterfaceRead(const char* type)
123 throw(SALOME_DataTypeCatalog::NotFound)
125 char* return_value = NULL;
127 for (unsigned int ind=0; ind < _datatype_list.size();ind++)
129 if (strcmp((_datatype_list[ind].Parserdata_name).c_str(),type) == 0)
132 return_value = CORBA::string_dup(_datatype_list[ind].Parserdata_interface_read.c_str());
136 // NotFound Exceptin is thrown if the data type indicated is not found in the catalog
139 MESSAGE( "The data type " << type << " was not found in the data type catalog")
140 throw SALOME_DataTypeCatalog::NotFound() ;
146 //----------------------------------------------------------------------
147 // Function : GetDataInterfaceWrite
148 // Purpose : get the write interface name
149 //----------------------------------------------------------------------
151 SALOME_DataTypeCatalogImpl::GetDataInterfaceWrite(const char* type)
152 throw(SALOME_DataTypeCatalog::NotFound)
154 char* return_value = NULL;
156 for (unsigned int ind=0; ind < _datatype_list.size();ind++)
158 if (strcmp((_datatype_list[ind].Parserdata_name).c_str(),type) == 0)
161 return_value = CORBA::string_dup(_datatype_list[ind].Parserdata_interface_write.c_str());
165 // NotFound Exceptin is thrown if the data type indicated is not found in the catalog
168 MESSAGE( "The data type " << type << " was not found in the data type catalog")
169 throw SALOME_DataTypeCatalog::NotFound() ;
174 //----------------------------------------------------------------------
175 // Function : GetDataTypeParents
176 // Purpose : get Parents data type name list
177 //----------------------------------------------------------------------
178 SALOME_DataTypeCatalog::ListOfDataTypeName*
179 SALOME_DataTypeCatalogImpl::GetDataTypeParents(const char* type) throw(SALOME_DataTypeCatalog::NotFound)
183 SALOME_DataTypeCatalog::ListOfDataTypeName_var _list_data =
184 new SALOME_DataTypeCatalog::ListOfDataTypeName;
186 for (unsigned int ind=0; ind < _datatype_list.size();ind++)
188 if (strcmp((_datatype_list[ind].Parserdata_name).c_str(),type) == 0)
190 // Wanted type is found
191 // Get all the parents data type name of the type
193 _list_data->length(_datatype_list[ind].Parserdata_parents.size());
194 for (unsigned int ind1=0; ind1 < _datatype_list[ind].Parserdata_parents.size();ind1++)
196 _list_data[ind1]=CORBA::string_dup(_datatype_list[ind].Parserdata_parents[ind1].c_str());
197 // SCRUTE(_list_data[ind1]) ;
202 // NotFound Exception is thrown if the data type indicated is not found
206 MESSAGE( "The data type " << type << " was not found in the data type catalog")
207 throw SALOME_DataTypeCatalog::NotFound() ;
210 return _list_data._retn();
213 //----------------------------------------------------------------------
214 // Function : _explore_parents
215 // Purpose : return true if type_out is derived from type_in
216 //----------------------------------------------------------------------
218 SALOME_DataTypeCatalogImpl::_explore_parents(const char* type_in,
219 ParserDataType& data_out)
222 MESSAGE( "Begin of _explore_parents with data_out_name " << data_out.Parserdata_name);
224 CORBA::Boolean found = false ;
225 if (data_out.Parserdata_name == type_in)
228 if (data_out.Parserdata_parents.size() >0)
229 for (unsigned int ind=0; ind < data_out.Parserdata_parents.size();ind++)
231 if (data_out.Parserdata_parents[ind] == type_in)
234 for (unsigned ip =0; ip < _datatype_list.size();ip++)
236 // run _explore_parents for each parent data of data_out
237 if (_datatype_list[ip].Parserdata_name == data_out.Parserdata_parents[ind])
238 found = _explore_parents(type_in, _datatype_list[ip]);
244 //----------------------------------------------------------------------
245 // Function : _parse_xml_file
246 // Purpose : parse one module catalog
247 //----------------------------------------------------------------------
249 SALOME_DataTypeCatalogImpl::_parse_xml_file(const char* file,
250 ListOfParserDataType& datatypelist)
252 SALOME_DataTypeCatalog_Handler* handler = new SALOME_DataTypeCatalog_Handler();
255 QXmlInputSource source(xmlFile);
257 QXmlSimpleReader reader;
258 reader.setContentHandler( handler );
259 reader.setErrorHandler( handler );
260 reader.parse( source );
262 datatypelist = _datatypelist;
266 //----------------------------------------------------------------------
267 // Function : _verify_data_type
268 // Purpose : verify the data type structures from the catalog parsing
269 // Verify that the parents type associated to a type are defined
271 //----------------------------------------------------------------------
273 SALOME_DataTypeCatalogImpl::_verify_data_type(ListOfParserDataType datatypelist)
275 bool _return_value = true;
277 vector<string> _data_name_list;
279 _data_name_list.resize(0);;
280 for (unsigned int ind = 0; ind < _datatype_list.size(); ind++)
281 _data_name_list.push_back(_datatype_list[ind].Parserdata_name) ;
283 // Parse if parents data type name of a data type are defined in the
285 for (unsigned int ind = 0; ind < _datatype_list.size(); ind++)
287 // Scrute data type parents
288 // MESSAGE("Treatment of " << _datatype_list[ind].Parserdata_name);
289 for (unsigned int ind1 = 0 ; ind1 < _datatype_list[ind].Parserdata_parents.size(); ind1++)
291 // MESSAGE("Looking for " << _datatype_list[ind].Parserdata_parents[ind1] << " in the catalog data type");
293 // Compare parent data type name to all data type names defined in the catalog
294 for (unsigned int ind2 = 0 ; ind2 < _data_name_list.size(); ind2++)
296 if(_datatype_list[ind].Parserdata_parents[ind1].compare(_data_name_list[ind2]) == 0)
299 MESSAGE("The parents data type " << _datatype_list[ind].Parserdata_parents[ind1] << " of " << _datatype_list[ind].Parserdata_name << " was found in the catalog type");
305 MESSAGE( "The parents data type " << _datatype_list[ind].Parserdata_parents[ind1] << " of " << _datatype_list[ind].Parserdata_name << " is not defined in the data type catalog" )
306 _return_value = false ;
310 return _return_value;
314 //----------------------------------------------------------------------
315 // Function : _parseArguments
316 // Purpose : parse arguments to get general and personal catalog files
317 //----------------------------------------------------------------------
319 SALOME_DataTypeCatalogImpl::_parseArguments(int argc, char **argv,
322 bool _return_value = true;
324 for (int ind = 0; ind < argc ; ind++)
327 if (strcmp(argv[ind],"-help") == 0)
329 INFOS( "Usage: " << argv[0] << " -common 'path to data type catalog' -ORBInitRef NameService=corbaname::localhost");
330 _return_value = false ;
332 if (strcmp(argv[ind],"-common") == 0)
336 // General catalog file
337 *_path_data = argv[ind + 1] ;
338 ifstream _path_data_file(*_path_data);
339 if (!_path_data_file)
341 MESSAGE( "Sorry the file " << *_path_data << " can't be open" )
343 _return_value = false;
349 return _return_value;