BESModuleApp.cc
Go to the documentation of this file.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 <iostream>
00034
00035 using std::cerr ;
00036 using std::endl ;
00037
00038 #include "BESModuleApp.h"
00039 #include "BESError.h"
00040 #include "BESPluginFactory.h"
00041 #include "BESAbstractModule.h"
00042 #include "TheBESKeys.h"
00043 #include "BESUtil.h"
00044
00050 BESModuleApp::
00051 BESModuleApp(void) : BESBaseApp()
00052 {
00053 }
00054
00060 BESModuleApp::
00061 ~BESModuleApp(void)
00062 {
00063 }
00064
00071 int
00072 BESModuleApp::initialize(int argC, char **argV)
00073 {
00074 int retVal = BESBaseApp::initialize( argC, argV ) ;
00075 if( !retVal )
00076 {
00077 try
00078 {
00079 retVal = loadModules() ;
00080 }
00081 catch( BESError &e )
00082 {
00083 string newerr = "Error during module initialization: " ;
00084 newerr += e.get_message() ;
00085 cerr << newerr << endl ;
00086 retVal = 1 ;
00087 }
00088 catch( ... )
00089 {
00090 string newerr = "Error during module initialization: " ;
00091 newerr += "caught unknown exception" ;
00092 cerr << newerr << endl ;
00093 retVal = 1 ;
00094 }
00095 }
00096
00097 return retVal ;
00098 }
00099
00102 int
00103 BESModuleApp::loadModules()
00104 {
00105 int retVal = 0 ;
00106
00107 bool found = false ;
00108 vector<string> vals ;
00109 TheBESKeys::TheKeys()->get_values( "BES.modules", vals, found ) ;
00110 vector<string>::iterator l = vals.begin() ;
00111 vector<string>::iterator le = vals.end() ;
00112
00113
00114
00115 vector<string> ordered_list ;
00116 for( ; l != le; l++ )
00117 {
00118 string mods = (*l) ;
00119 if( mods != "" )
00120 {
00121 if( mods.find( "dap", 0 ) != string::npos )
00122 {
00123 ordered_list.insert( ordered_list.begin(), mods ) ;
00124 }
00125 else
00126 {
00127 ordered_list.push_back( mods ) ;
00128 }
00129 }
00130 }
00131
00132 l = ordered_list.begin() ;
00133 le = ordered_list.end() ;
00134 for( ; l != le; l++ )
00135 {
00136 string mods = (*l) ;
00137 list<string> mod_list ;
00138 BESUtil::explode( ',', mods, mod_list ) ;
00139
00140 list<string>::iterator i = mod_list.begin() ;
00141 list<string>::iterator e = mod_list.end() ;
00142 for( ; i != e; i++ )
00143 {
00144 string key = "BES.module." + (*i) ;
00145 string so ;
00146 try
00147 {
00148 TheBESKeys::TheKeys()->get_value( key, so, found ) ;
00149 }
00150 catch( BESError &e )
00151 {
00152 cerr << e.get_message() << endl ;
00153 return 1 ;
00154 }
00155 if( so == "" )
00156 {
00157 cerr << "couldn't find the module for " << (*i) << endl ;
00158 return 1 ;
00159 }
00160 bes_module new_mod ;
00161 new_mod._module_name = (*i) ;
00162 new_mod._module_library = so ;
00163 _module_list.push_back( new_mod ) ;
00164 }
00165 }
00166
00167 list< bes_module >::iterator mi = _module_list.begin() ;
00168 list< bes_module >::iterator me = _module_list.end() ;
00169 for( ; mi != me; mi++ )
00170 {
00171 bes_module curr_mod = *mi ;
00172 _moduleFactory.add_mapping( curr_mod._module_name, curr_mod._module_library ) ;
00173 }
00174
00175 for( mi = _module_list.begin(); mi != me; mi++ )
00176 {
00177 bes_module curr_mod = *mi ;
00178 try
00179 {
00180 string modname = curr_mod._module_name ;
00181 BESAbstractModule *o = _moduleFactory.get( modname ) ;
00182 o->initialize( modname ) ;
00183 delete o ;
00184 }
00185 catch( BESError &e )
00186 {
00187 cerr << "Caught plugin exception during initialization of "
00188 << curr_mod._module_name << " module:" << endl << " "
00189 << e.get_message() << endl ;
00190 retVal = 1 ;
00191 break ;
00192 }
00193 catch( ... )
00194 {
00195 cerr << "Caught unknown exception during initialization of "
00196 << curr_mod._module_name << " module" << endl ;
00197 retVal = 1 ;
00198 break ;
00199 }
00200 }
00201
00202 return retVal ;
00203 }
00204
00213 int
00214 BESModuleApp::terminate( int sig )
00215 {
00216 list< bes_module >::iterator i = _module_list.begin() ;
00217 list< bes_module >::iterator e = _module_list.end() ;
00218 try
00219 {
00220 for( i = _module_list.begin(); i != e; i++ )
00221 {
00222 bes_module curr_mod = *i ;
00223 string modname = curr_mod._module_name ;
00224 BESAbstractModule *o = _moduleFactory.get( modname ) ;
00225 if( o )
00226 {
00227 o->terminate( modname ) ;
00228 delete o ;
00229 }
00230 }
00231 }
00232 catch( BESError &e )
00233 {
00234 cerr << "Caught exception during module termination: "
00235 << e.get_message() << endl ;
00236 }
00237 catch( ... )
00238 {
00239 cerr << "Caught unknown exception during terminate" << endl ;
00240 }
00241
00242 return BESBaseApp::terminate( sig ) ;
00243 }
00244
00253 void
00254 BESModuleApp::dump( ostream &strm ) const
00255 {
00256 strm << BESIndent::LMarg << "BESModuleApp::dump - ("
00257 << (void *)this << ")" << endl ;
00258 BESIndent::Indent() ;
00259 if( _module_list.size() )
00260 {
00261 strm << BESIndent::LMarg << "loaded modules:" << endl ;
00262 BESIndent::Indent() ;
00263 list< bes_module >::const_iterator i = _module_list.begin() ;
00264 list< bes_module >::const_iterator e = _module_list.end() ;
00265 for( ; i != e; i++ )
00266 {
00267 bes_module curr_mod = *i ;
00268 strm << BESIndent::LMarg << curr_mod._module_name << ": "
00269 << curr_mod._module_library << endl ;
00270 }
00271 BESIndent::UnIndent() ;
00272 }
00273 else
00274 {
00275 strm << BESIndent::LMarg << "loaded modules: none" << endl ;
00276 }
00277 BESIndent::UnIndent() ;
00278 }
00279