00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "BESServiceRegistry.h"
00034 #include "BESInfo.h"
00035 #include "BESInternalError.h"
00036
00037 BESServiceRegistry *BESServiceRegistry::_instance = 0 ;
00038
00039 BESServiceRegistry::BESServiceRegistry()
00040 {
00041 }
00042
00043 BESServiceRegistry::~BESServiceRegistry()
00044 {
00045 }
00046
00052 void
00053 BESServiceRegistry::add_service( const string &name )
00054 {
00055 map<string,map<string,service_cmd> >::iterator i = _services.find( name ) ;
00056 if( i == _services.end() )
00057 {
00058 map<string,service_cmd> cmds ;
00059 _services[name] = cmds ;
00060 }
00061 else
00062 {
00063 string err = (string)"The service " + name
00064 + " has already been registered" ;
00065 throw BESInternalError( err, __FILE__, __LINE__ ) ;
00066 }
00067 }
00068
00083 void
00084 BESServiceRegistry::add_to_service( const string &service,
00085 const string &cmd,
00086 const string &cmd_descript,
00087 const string &format )
00088 {
00089 map<string,map<string,service_cmd> >::iterator si ;
00090 si = _services.find( service ) ;
00091 if( si != _services.end() )
00092 {
00093 map<string,service_cmd>::const_iterator ci ;
00094 ci = (*si).second.find( cmd ) ;
00095 if( ci != (*si).second.end() )
00096 {
00097 string err = (string)"Attempting to add command "
00098 + (*ci).first + " to the service "
00099 + service + ", command alrady exists" ;
00100 throw BESInternalError( err, __FILE__, __LINE__ ) ;
00101 }
00102 service_cmd sc ;
00103 sc._description = cmd_descript ;
00104 sc._formats[format] = format ;
00105 (*si).second[cmd] = sc ;
00106 }
00107 else
00108 {
00109 string err = (string)"Attempting to add commands to the service "
00110 + service + " that has not yet been registered" ;
00111 throw BESInternalError( err, __FILE__, __LINE__ ) ;
00112 }
00113 }
00114
00123 void
00124 BESServiceRegistry::add_format( const string &service,
00125 const string &cmd,
00126 const string &format )
00127 {
00128 map<string,map<string,service_cmd> >::iterator si ;
00129 si = _services.find( service ) ;
00130 if( si != _services.end() )
00131 {
00132 map<string,service_cmd>::iterator ci = (*si).second.find( cmd ) ;
00133 if( ci != (*si).second.end() )
00134 {
00135 map<string,string>::iterator fi ;
00136 fi = (*ci).second._formats.find( format ) ;
00137 if( fi == (*ci).second._formats.end() )
00138 {
00139 (*ci).second._formats[format] = format ;
00140 }
00141 else
00142 {
00143 string err = (string)"Attempting to add format "
00144 + format + " to command " + cmd
00145 + " for service " + service
00146 + " where the format has already been registered" ;
00147 throw BESInternalError( err, __FILE__, __LINE__ ) ;
00148 }
00149 }
00150 else
00151 {
00152 string err = (string)"Attempting to add a format " + format
00153 + " to command " + cmd + " for service " + service
00154 + " where the command has not been registered" ;
00155 throw BESInternalError( err, __FILE__, __LINE__ ) ;
00156 }
00157 }
00158 else
00159 {
00160 string err = (string)"Attempting to add a format " + format
00161 + " to command " + cmd + " for a service " + service
00162 + " that has not been registered" ;
00163 throw BESInternalError( err, __FILE__, __LINE__ ) ;
00164 }
00165 }
00166
00175 void
00176 BESServiceRegistry::remove_service( const string &service )
00177 {
00178 map<string,map<string,service_cmd> >::iterator i ;
00179 i = _services.find( service ) ;
00180 if( i != _services.end() )
00181 {
00182
00183 _services.erase( i ) ;
00184
00185
00186
00187
00188 map<string,map<string,string> >::iterator hi = _handles.begin() ;
00189 map<string,map<string,string> >::iterator he = _handles.end() ;
00190 for( ; hi != he; hi++ )
00191 {
00192 map<string,string>::iterator hsi = (*hi).second.find( service ) ;
00193 if( hsi != (*hi).second.end() )
00194 {
00195 (*hi).second.erase( hsi ) ;
00196 }
00197 }
00198 }
00199 }
00200
00215 bool
00216 BESServiceRegistry::service_available( const string &service,
00217 const string &cmd,
00218 const string &format )
00219 {
00220 bool isit = false ;
00221 map<string,map<string,service_cmd> >::iterator si ;
00222 si = _services.find( service ) ;
00223 if( si != _services.end() )
00224 {
00225 if( !cmd.empty() )
00226 {
00227 map<string,service_cmd>::iterator ci = (*si).second.find( cmd ) ;
00228 if( ci != (*si).second.end() )
00229 {
00230 if( !format.empty() )
00231 {
00232 map<string,string>::iterator fi ;
00233 fi = (*ci).second._formats.find( format ) ;
00234 if( fi != (*ci).second._formats.end() )
00235 {
00236 isit = true ;
00237 }
00238 }
00239 else
00240 {
00241 isit = true ;
00242 }
00243 }
00244 }
00245 else
00246 {
00247 isit = true ;
00248 }
00249 }
00250 return isit ;
00251 }
00252
00264 void
00265 BESServiceRegistry::handles_service( const string &handler,
00266 const string &service )
00267 {
00268 map<string,map<string,service_cmd> >::iterator si ;
00269 si = _services.find( service ) ;
00270 if( si == _services.end() )
00271 {
00272 string err = (string)"Registering a handler to handle service "
00273 + service + " that has not yet been registered" ;
00274 throw BESInternalError( err, __FILE__, __LINE__ ) ;
00275 }
00276
00277 map<string,map<string,string> >::iterator hi = _handles.find( handler ) ;
00278 if( hi == _handles.end() )
00279 {
00280 map<string,string> services ;
00281 services[service] = service ;
00282 _handles[handler] = services ;
00283 }
00284 else
00285 {
00286 map<string,string>::iterator ci = (*hi).second.find( service ) ;
00287 if( ci == (*hi).second.end() )
00288 {
00289 (*hi).second[service] = service ;
00290 }
00291 }
00292 }
00293
00302 bool
00303 BESServiceRegistry::does_handle_service( const string &handler,
00304 const string &service )
00305 {
00306 bool handled = false ;
00307 map<string,map<string,string> >::iterator hi = _handles.find( handler ) ;
00308 if( hi != _handles.end() )
00309 {
00310 map<string,string>::iterator si = (*hi).second.find( service ) ;
00311 if( si != (*hi).second.end() )
00312 {
00313 handled = true ;
00314 }
00315 }
00316 return handled ;
00317 }
00318
00327 void
00328 BESServiceRegistry::services_handled( const string &handler,
00329 list<string> &services )
00330 {
00331 map<string,map<string,string> >::iterator hi = _handles.find( handler ) ;
00332 if( hi != _handles.end() )
00333 {
00334 map<string,string>::const_iterator si = (*hi).second.begin() ;
00335 map<string,string>::const_iterator se = (*hi).second.end() ;
00336 for( ; si != se; si++ )
00337 {
00338 services.push_back( (*si).second ) ;
00339 }
00340 }
00341 }
00342
00351 void
00352 BESServiceRegistry::show_services( BESInfo &info )
00353 {
00354 map<string,map<string,service_cmd> >::iterator si = _services.begin() ;
00355 map<string,map<string,service_cmd> >::iterator se = _services.end() ;
00356 for( ; si != se; si++ )
00357 {
00358 map<string,string> props ;
00359 props["name"] = (*si).first ;
00360 info.begin_tag( "serviceDescription", &props ) ;
00361 map<string,service_cmd>::iterator ci = (*si).second.begin() ;
00362 map<string,service_cmd>::iterator ce = (*si).second.end() ;
00363 for( ; ci != ce; ci++ )
00364 {
00365 map<string,string> cprops ;
00366 cprops["name"] = (*ci).first ;
00367 info.begin_tag( "command", &cprops ) ;
00368 info.add_tag( "description", (*ci).second._description ) ;
00369 map<string,string>::iterator fi = (*ci).second._formats.begin() ;
00370 map<string,string>::iterator fe = (*ci).second._formats.end() ;
00371 for( ; fi != fe; fi++ )
00372 {
00373 map<string,string> fprops ;
00374 fprops["name"] = (*fi).first ;
00375 info.add_tag( "format", "", &fprops ) ;
00376 }
00377 info.end_tag( "command" ) ;
00378 }
00379 info.end_tag( "serviceDescription" ) ;
00380 }
00381 }
00382
00390 void
00391 BESServiceRegistry::dump( ostream &strm ) const
00392 {
00393 strm << BESIndent::LMarg << "BESServiceRegistry::dump - ("
00394 << (void *)this << ")" << endl ;
00395 BESIndent::Indent() ;
00396 strm << BESIndent::LMarg << "registered services" << endl ;
00397 BESIndent::Indent() ;
00398 map<string,map<string,service_cmd> >::const_iterator si ;
00399 si = _services.begin() ;
00400 map<string,map<string,service_cmd> >::const_iterator se ;
00401 se = _services.end() ;
00402 for( ; si != se; si++ )
00403 {
00404 strm << BESIndent::LMarg << (*si).first << endl ;
00405 BESIndent::Indent() ;
00406 map<string,service_cmd>::const_iterator ci = (*si).second.begin() ;
00407 map<string,service_cmd>::const_iterator ce = (*si).second.end() ;
00408 for( ; ci != ce; ci++ )
00409 {
00410 strm << BESIndent::LMarg << (*ci).first << endl ;
00411 BESIndent::Indent() ;
00412 strm << BESIndent::LMarg << "description: "
00413 << (*ci).second._description << endl ;
00414 strm << BESIndent::LMarg << "formats:" << endl ;
00415 BESIndent::Indent() ;
00416 map<string,string>::const_iterator fi ;
00417 fi = (*ci).second._formats.begin() ;
00418 map<string,string>::const_iterator fe ;
00419 fe = (*ci).second._formats.end() ;
00420 for( ; fi != fe; fi++ )
00421 {
00422 strm << BESIndent::LMarg << (*fi).first << endl ;
00423 }
00424 BESIndent::UnIndent() ;
00425 BESIndent::UnIndent() ;
00426 }
00427 BESIndent::UnIndent() ;
00428 }
00429 BESIndent::UnIndent() ;
00430 strm << BESIndent::LMarg << "services provided by handler" << endl ;
00431 BESIndent::Indent() ;
00432 map<string,map<string,string> >::const_iterator hi = _handles.begin() ;
00433 map<string,map<string,string> >::const_iterator he = _handles.end() ;
00434 for( ; hi != he; hi++ )
00435 {
00436 strm << BESIndent::LMarg << (*hi).first ;
00437 map<string,string>::const_iterator hsi = (*hi).second.begin() ;
00438 map<string,string>::const_iterator hse = (*hi).second.end() ;
00439 bool isfirst = true ;
00440 for( ; hsi != hse; hsi++ )
00441 {
00442 if( !isfirst ) strm << ", " ;
00443 else strm << ": " ;
00444 strm << (*hsi).first ;
00445 isfirst = false ;
00446 }
00447 strm << endl ;
00448 }
00449 BESIndent::UnIndent() ;
00450 BESIndent::UnIndent() ;
00451 }
00452
00453 BESServiceRegistry *
00454 BESServiceRegistry::TheRegistry()
00455 {
00456 if( _instance == 0 )
00457 {
00458 _instance = new BESServiceRegistry ;
00459 }
00460 return _instance ;
00461 }
00462