00001
00002
00003
00004
00005
00006 #include <algorithm>
00007 #include <cstdlib>
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "GaudiKernel/IDataProviderSvc.h"
00021 #include "GaudiKernel/IToolSvc.h"
00022 #include "GaudiKernel/IProperty.h"
00023 #include "GaudiKernel/Property.h"
00024 #include "GaudiKernel/ISvcLocator.h"
00025 #include "GaudiKernel/MsgStream.h"
00026 #include "GaudiKernel/ObjectVector.h"
00027 #include "GaudiKernel/SmartDataPtr.h"
00028 #include "GaudiKernel/SmartRef.h"
00029 #include "GaudiKernel/Stat.h"
00030 #include "GaudiKernel/System.h"
00031 #include "GaudiKernel/IJobOptionsSvc.h"
00032 #include "GaudiKernel/StatEntity.h"
00033 #include "GaudiKernel/Algorithm.h"
00034 #include "GaudiKernel/AlgTool.h"
00035
00036
00037
00038 #include "GaudiAlg/Print.h"
00039 #include "GaudiAlg/GaudiCommon.h"
00040 #include "GaudiAlg/GaudiAlgorithm.h"
00041 #include "GaudiAlg/GaudiTool.h"
00042
00043
00044
00045 #include "GaudiUtils/RegEx.h"
00046
00047
00048
00049 #include "boost/format.hpp"
00050 #include "boost/lexical_cast.hpp"
00051
00052
00053 #ifdef _WIN32
00054 #pragma warning ( disable:4661 ) // incomplete explicit templates
00055 #endif
00056
00057
00058
00059
00060
00061 template <class PBASE>
00062 void
00063 GaudiCommon<PBASE>::initGaudiCommonConstructor( const IInterface * parent )
00064 {
00065
00066 m_msgLevel = MSG::NIL;
00067 m_msgStream = 0;
00068 m_updMgrSvc = 0;
00069 m_fastContainersSvc = 0;
00070 m_typePrint = true;
00071 m_propsPrint = false;
00072 m_statPrint = true;
00073 m_errorsPrint = true;
00074 m_context = "" ;
00075 m_rootInTES = "" ;
00076 m_globalTimeOffset = 0.0 ;
00077
00078 m_counterSummarySvc=NULL;
00079 m_counterList=std::vector<std::string>(1,".*");
00080 m_statEntityList=std::vector<std::string>(0);
00081
00082
00083
00084
00085 m_header = " | Counter | # | sum | mean/eff^* | rms/err^* | min | max |" ;
00086
00087 m_format1 = " | %|-48.48s|%|50t||%|10d| |%|11.7g| |%|#11.5g| |%|#11.5g| |%|#12.5g| |%|#12.5g| |" ;
00088
00089 m_format2 = " |*%|-48.48s|%|50t||%|10d| |%|11.5g| |(%|#9.6g| +- %|-#9.6g|)%%| ------- | ------- |" ;
00090
00091 m_useEffFormat = true ;
00092
00093
00094
00095 this->declareProperty
00096 ( "ErrorsPrint" , m_errorsPrint ,
00097 "Print the statistics of errors/warnings/exceptions")
00098 -> declareUpdateHandler
00099 ( &GaudiCommon<PBASE>::printErrorHandler, this ) ;
00100
00101 this->declareProperty
00102 ( "PropertiesPrint" , m_propsPrint ,
00103 "Print the properties of the component ")
00104 -> declareUpdateHandler
00105 ( &GaudiCommon<PBASE>::printPropsHandler, this ) ;
00106
00107 this->declareProperty
00108 ( "StatPrint" , m_statPrint ,
00109 "Print the table of counters" )
00110 -> declareUpdateHandler
00111 ( &GaudiCommon<PBASE>::printStatHandler, this ) ;
00112
00113 this->declareProperty
00114 ( "TypePrint" , m_typePrint ,
00115 "Add the actal C++ component type into the messages" ) ;
00116
00117 this->declareProperty ( "Context" , m_context ) ;
00118
00119 this->declareProperty ( "RootInTES" , m_rootInTES ) ;
00120
00121 this->declareProperty ( "RootOnTES" , m_rootOnTES ) ;
00122
00123 this->declareProperty ( "GlobalTimeOffset", m_globalTimeOffset ) ;
00124
00125
00126
00127 this->declareProperty
00128 ( "StatTableHeader" , m_header ,
00129 "The header row for the output Stat-table" ) ;
00130
00131 this->declareProperty
00132 ( "RegularRowFormat" , m_format1 ,
00133 "The format for the regular row in the output Stat-table" ) ;
00134
00135 this->declareProperty
00136 ( "EfficiencyRowFormat" , m_format2 ,
00137 "The format for the regular row in the output Stat-table" ) ;
00138
00139 this->declareProperty
00140 ( "UseEfficiencyRowFormat" , m_useEffFormat ,
00141 "Use the special format for printout of efficiency counters" ) ;
00142
00143
00144
00145 this->declareProperty(
00146 "CounterList",
00147 m_counterList=std::vector<std::string>(1,".*"),
00148 "RegEx list, of simple integer counters for CounterSummary.");
00149
00150 this->declareProperty(
00151 "StatEntityList",
00152 m_statEntityList=std::vector<std::string>(0),
00153 "RegEx list, of StatEntity counters for CounterSummary.");
00154
00155
00156 this->outputLevelProperty().declareUpdateHandler( &GaudiCommon<PBASE>::msgLevelHandler, this );
00157
00158
00159 if ( parent )
00160 {
00161 if ( const GaudiAlgorithm* gAlg = dynamic_cast<const GaudiAlgorithm*>(parent) )
00162 {
00163 m_context = gAlg->context();
00164 m_rootInTES = gAlg->rootInTES();
00165 m_globalTimeOffset = gAlg->globalTimeOffset();
00166 }
00167 else if ( const GaudiTool* gTool = dynamic_cast<const GaudiTool*> (parent) )
00168 {
00169 m_context = gTool->context();
00170 m_rootInTES = gTool->rootInTES();
00171 m_globalTimeOffset = gTool->globalTimeOffset();
00172 }
00173 }
00174
00175
00176 SmartIF<IJobOptionsSvc> jos(PBASE::service("JobOptionsSvc"));
00177 if (!jos.isValid()) Exception("Cannot get JobOptionsSvc");
00178
00179
00180 const std::vector<const Property*>* myList = jos->getProperties( this->name() );
00181 if ( 0 != myList )
00182 {
00183
00184 for ( std::vector<const Property*>::const_iterator iter = myList->begin();
00185 iter != myList->end();
00186 ++iter )
00187 {
00188 const StringProperty* sp = dynamic_cast<const StringProperty*>(*iter);
00189 if ( 0 != sp )
00190 {
00191 if ( "Context" == (*iter)->name() )
00192 {
00193 m_context = sp->value();
00194 } else if ( "RootInTES" == (*iter)->name() ) {
00195 m_rootInTES = sp->value();
00196 } else if ( "GlobalTimeOffset" == (*iter)->name() ) {
00197 m_globalTimeOffset = atof( sp->value().c_str() );
00198 }
00199 }
00200 }
00201 }
00202
00203 }
00204
00205
00206
00207
00208
00209 template < class PBASE >
00210 StatusCode GaudiCommon<PBASE>::
00211 #ifdef __ICC
00212 i_gcInitialize
00213 #else
00214 initialize
00215 #endif
00216 ()
00217 {
00218
00219
00220 const StatusCode sc = PBASE::initialize();
00221 if ( sc.isFailure() )
00222 { return Error ( "Failed to initialise base class PBASE", sc ) ; }
00223
00224
00225
00226 if ( msgLevel(MSG::DEBUG) )
00227 {
00228 debug() << "Initialize base class GaudiCommon<" << System::typeinfoName(typeid(PBASE)) << ">" << endmsg;
00229 if ( !context().empty() )
00230 debug() << "Created with context = '" << context() << "'" << endmsg;
00231 }
00232
00233
00234
00235 if ( m_rootInTES.empty() && !m_rootOnTES.empty() )
00236 {
00237 m_rootInTES = m_rootOnTES;
00238 Warning( "RootOnTES option is OBSOLETE -> Use RootInTES instead. RootInTES has been updated to "
00239 + m_rootInTES, StatusCode::SUCCESS ).ignore();
00240 }
00241 else if ( !m_rootInTES.empty() && !m_rootOnTES.empty() )
00242 {
00243 Warning( "Options RootOnTES AND RootInTES are defined ! Use RootInTES. RootOnTES is ignored",
00244 StatusCode::SUCCESS ).ignore();
00245 }
00246
00247
00248 if ( !m_rootInTES.empty() &&
00249 m_rootInTES.substr(m_rootInTES.size()-1) != "/" ) m_rootInTES += "/";
00250
00251
00252 this->svcLoc()->service("CounterSummarySvc",m_counterSummarySvc,false).ignore() ;
00253 if (msgLevel(MSG::DEBUG))
00254 {
00255 if (m_counterSummarySvc==NULL )
00256 debug() << "could not locate CounterSummarySvc, no counter summary will be made" << endmsg;
00257 else debug() << "found CounterSummarySvc OK" << endmsg;
00258 }
00259
00260
00261 if ( propsPrint() ) { printProps(MSG::ALWAYS); }
00262 else if ( msgLevel(MSG::DEBUG) ) { printProps(MSG::DEBUG); }
00263
00264 return sc;
00265 }
00266
00267
00268
00269
00270
00271 template < class PBASE >
00272 StatusCode GaudiCommon<PBASE>::
00273 #ifdef __ICC
00274 i_gcFinalize
00275 #else
00276 finalize
00277 #endif
00278 ()
00279 {
00280 StatusCode sc = StatusCode::SUCCESS;
00281
00282
00283 if ( msgLevel(MSG::DEBUG) || (statPrint() && !counters().empty()) )
00284 {
00285
00286 printStat ( statPrint() ? MSG::ALWAYS : MSG::DEBUG ) ;
00287 }
00288
00289 if(m_counterSummarySvc && this->svcLoc()->existsService("CounterSummarySvc"))
00290 {
00291 if ( msgLevel(MSG::DEBUG) ) debug() << "adding counters to CounterSummarySvc" << endmsg;
00292 for(Statistics::const_iterator i=this->counters().begin();
00293 i!=this->counters().end();
00294 i++)
00295 {
00296 if(Gaudi::Utils::RegEx::matchOr(i->first,m_statEntityList))
00297 m_counterSummarySvc->addCounter(this->name(),i->first,i->second,
00298 Gaudi::CounterSummary::SaveStatEntity);
00299 else if(Gaudi::Utils::RegEx::matchOr(i->first,m_counterList))
00300 m_counterSummarySvc->addCounter(this->name(),i->first,i->second);
00301 }
00302 }
00303
00304 if ( msgLevel(MSG::DEBUG) )
00305 {
00306 debug() << "Tools to release :";
00307 for ( AlgTools::const_iterator i = m_tools.begin();
00308 i != m_tools.end(); ++i )
00309 {
00310 debug() << " " << (*i)->name();
00311 }
00312 debug() << endmsg;
00313 }
00314 while ( !m_tools.empty() ) { sc = sc && releaseTool( m_tools.back() ) ; }
00315
00316
00317 if ( msgLevel(MSG::DEBUG) )
00318 {
00319 debug() << "Services to release :";
00320 for ( Services::const_iterator i = m_services.begin();
00321 i != m_services.end(); ++i )
00322 {
00323 debug() << " " << (*i).first;
00324 }
00325 debug() << endmsg;
00326 }
00327 while ( !m_services.empty() ) { sc = sc && releaseSvc( m_services.begin()->second ) ; }
00328
00329
00330 if(m_counterSummarySvc)
00331 {
00332 m_counterSummarySvc->release();
00333 m_counterSummarySvc=NULL;
00334 }
00335
00336
00337 if ( !m_errors.empty() || !m_warnings.empty() || !m_exceptions.empty() )
00338 {
00339 always() << "Exceptions/Errors/Warnings/Infos Statistics : "
00340 << m_exceptions .size () << "/"
00341 << m_errors .size () << "/"
00342 << m_warnings .size () << "/"
00343 << m_infos .size () << endmsg ;
00344 if ( errorsPrint() ) { printErrors () ; }
00345 }
00346
00347
00348 resetMsgStream();
00349
00350
00351 m_counters .clear() ;
00352 m_exceptions .clear() ;
00353 m_infos .clear() ;
00354 m_warnings .clear() ;
00355 m_errors .clear() ;
00356 m_counterList.clear() ;
00357 m_statEntityList.clear() ;
00358
00359
00360 return sc && PBASE::finalize();
00361 }
00362
00363
00364
00365
00366
00367
00368
00369
00370
00371 template < class PBASE >
00372 StatusCode GaudiCommon<PBASE>::release ( const IInterface* interface ) const
00373 {
00374 if ( 0 == interface )
00375 { return Error ( "release(IInterface):: IInterface* points to NULL!" ) ; }
00376
00377 const IAlgTool* algTool = dynamic_cast<const IAlgTool*>( interface ) ;
00378
00379 return 0 != algTool ? releaseTool( algTool ) : releaseSvc( interface ) ;
00380 }
00381
00382
00383
00384
00385
00386 template < class PBASE >
00387 StatusCode GaudiCommon<PBASE>::releaseTool ( const IAlgTool* algTool ) const
00388 {
00389 if( 0 == algTool )
00390 { return Error ( "releaseTool(IAlgTool):: IAlgTool* points to NULL!" ) ; }
00391 if( this->toolSvc() == 0 )
00392 { return Error ( "releaseTool(IAlgTool):: IToolSvc* points to NULL!" ) ; }
00393
00394 AlgTools::reverse_iterator it =
00395 std::find( m_tools.rbegin() , m_tools.rend() , algTool ) ;
00396 if( m_tools.rend() == it )
00397 { return Warning("releaseTool(IAlgTool):: IAlgTool* is not active" ) ; }
00398
00399 IAlgTool* t = *it ;
00400
00401 const std::string name = t->name();
00402 if ( msgLevel(MSG::DEBUG) )
00403 { debug() << "Releasing tool '" << name << "'" << endmsg; }
00404
00405 m_tools.erase( --it.base() ) ;
00406
00407 if ( msgLevel(MSG::DEBUG) ) {
00408 this->debug() << "The tool '" << t->name() << "' of type '"
00409 << System::typeinfoName(typeid(*t))
00410 << "' is released" << endmsg;
00411 }
00412 const StatusCode sc = this->toolSvc()->releaseTool( t ) ;
00413 if ( sc.isFailure() )
00414 { return Warning ( "releaseTool(IAlgTool):: error from IToolSvc whilst releasing "+name , sc ) ; }
00415
00416 return sc ;
00417 }
00418
00419
00420
00421
00422
00423 template < class PBASE >
00424 StatusCode GaudiCommon<PBASE>::releaseSvc ( const IInterface* Svc ) const
00425 {
00426 if( 0 == Svc ) {
00427 return Error ( "releaseSvc(IInterface):: IInterface* points to NULL!" ) ;
00428 }
00429 SmartIF<IService> svc(const_cast<IInterface*>(Svc));
00430 if (svc.isValid()) {
00431 Services::iterator it = m_services.find(svc->name());
00432 if (it == m_services.end()) {
00433 return Warning( "releaseSvc(IInterface):: IInterface* is not active" );
00434 }
00435 if ( msgLevel(MSG::DEBUG) ) {
00436 debug() << "Releasing service '" << it->first << "'" << endmsg;
00437 }
00438 m_services.erase(it);
00439 return StatusCode::SUCCESS;
00440 }
00441 return Warning( "releaseSvc(IInterface):: IInterface* is not a service" );
00442 }
00443
00444
00445
00446
00447
00448 template < class PBASE >
00449 void GaudiCommon<PBASE>::addToToolList( IAlgTool * tool ) const
00450 {
00451 if( 0 != tool ) {
00452 if ( this->msgLevel ( MSG::DEBUG ) ) {
00453 this->debug() << "The tool of type '"
00454 << System::typeinfoName(typeid(*tool))
00455 << "' has been added with the name '"
00456 << tool->name() << "'" << endmsg ;
00457 }
00458 m_tools.push_back( tool ) ;
00459 }
00460 }
00461
00462
00463
00464
00465
00466 template < class PBASE >
00467 void GaudiCommon<PBASE>::addToServiceList( const SmartIF<IService>& svc ) const
00468 {
00469 if (svc.isValid()) {
00470 m_services[svc->name()] = svc;
00471 }
00472 }
00473
00474
00475
00476
00477
00478
00479
00480
00481
00482 template < class PBASE >
00483 StatusCode GaudiCommon<PBASE>::Error( const std::string& msg ,
00484 const StatusCode st ,
00485 const size_t mx ) const
00486 {
00487
00488 const size_t num = ++m_errors[msg] ;
00489
00490 if ( num > mx ) { return st ; }
00491 else if ( num == mx )
00492 { return Print ( "The ERROR message is suppressed : '" +
00493 msg + "'" , st , MSG::ERROR ) ; }
00494
00495 return Print ( msg , st , MSG::ERROR ) ;
00496 }
00497
00498
00499
00500
00501
00502 template < class PBASE >
00503 StatusCode GaudiCommon<PBASE>::Warning
00504 ( const std::string& msg ,
00505 const StatusCode st ,
00506 const size_t mx ) const
00507 {
00508
00509 const size_t num = ++m_warnings[msg] ;
00510
00511 if ( num > mx ) { return st ; }
00512 else if ( num == mx )
00513 { return Print ( "The WARNING message is suppressed : '" +
00514 msg + "'" , st , MSG::WARNING ) ; }
00515
00516 return Print ( msg , st , MSG::WARNING ) ;
00517 }
00518
00519
00520
00521
00522
00523 template < class PBASE >
00524 StatusCode GaudiCommon<PBASE>::Info
00525 ( const std::string& msg ,
00526 const StatusCode st ,
00527 const size_t mx ) const
00528 {
00529
00530 const size_t num = ++m_infos[msg] ;
00531
00532 if ( num > mx ) { return st ; }
00533 else if ( num == mx )
00534 { return Print ( "The INFO message is suppressed : '" +
00535 msg + "'" , st , MSG::INFO ) ; }
00536
00537 return Print ( msg , st , MSG::INFO ) ;
00538 }
00539
00540
00541
00542
00543
00544 template < class PBASE >
00545 StatusCode GaudiCommon<PBASE>::Print( const std::string& msg ,
00546 const StatusCode st ,
00547 const MSG::Level lvl ) const
00548 {
00549
00550 if ( !msgLevel( lvl ) ) { return st ; }
00551
00552
00553 MsgStream& str = msgStream( lvl ) ;
00554 if ( typePrint() ) { str << System::typeinfoName(typeid(*this)) << ":: " ; }
00555
00556 str << msg ;
00557
00558 if ( st.isSuccess() ) { }
00559 else if ( StatusCode::FAILURE != st.getCode() )
00560 { str << " StatusCode=" << st.getCode() ; }
00561 else
00562 { str << " StatusCode=FAILURE" ; }
00563
00564 str << endmsg ;
00565
00566 return st;
00567 }
00568
00569
00570
00571
00572
00573 template < class PBASE >
00574 void GaudiCommon<PBASE>::Exception( const std::string & msg ,
00575 const GaudiException & exc ,
00576 const StatusCode sc ) const
00577 {
00578
00579 ++m_exceptions[ msg ];
00580 Print ( "Exception (re)throw: " + msg , sc , MSG::FATAL );
00581 throw GaudiException( this->name() + ":: " + msg , this->name() , sc, exc);
00582 }
00583
00584
00585
00586
00587
00588 template < class PBASE >
00589 void GaudiCommon<PBASE>::Exception( const std::string & msg ,
00590 const std::exception & exc ,
00591 const StatusCode sc ) const
00592 {
00593
00594 ++m_exceptions[ msg ];
00595 Print ( "Exception (re)throw: " + msg , sc , MSG::FATAL );
00596 throw GaudiException( this->name() + ":: " + msg+"("+exc.what()+")", "", sc );
00597 }
00598
00599
00600
00601
00602
00603 template < class PBASE >
00604 void GaudiCommon<PBASE>::Exception( const std::string & msg ,
00605 const StatusCode sc ) const
00606 {
00607
00608 ++m_exceptions[ msg ];
00609 Print ( "Exception throw: " + msg , sc , MSG::FATAL );
00610 throw GaudiException( this->name() + ":: " + msg , "", sc );
00611 }
00612
00613
00614
00615
00616
00617 template < class PBASE >
00618 long GaudiCommon<PBASE>::printStat( const MSG::Level level ) const
00619 {
00620
00621 if ( counters().empty() ) { return 0 ; }
00622 MsgStream& msg = msgStream ( level ) ;
00623
00624 msg << "Number of counters : " << counters().size() ;
00625
00626 if ( !counters().empty() ) { msg << std::endl << m_header ; }
00627
00628 for ( Statistics::const_iterator entry = counters().begin() ;
00629 counters().end() != entry ; ++entry )
00630 {
00631 msg << std::endl
00632 << Gaudi::Utils::formatAsTableRow
00633 ( entry -> first ,
00634 entry -> second ,
00635 m_useEffFormat ,
00636 m_format1 , m_format2 );
00637 }
00638
00639 msg << endmsg ;
00640
00641 return counters().size() ;
00642 }
00643
00644
00645
00646
00647
00648 template < class PBASE >
00649 long GaudiCommon<PBASE>::printErrors ( const MSG::Level level ) const
00650 {
00651
00652 boost::format ftm ( " %s = %|.8s| %|23t| Message = '%s'" );
00653
00654 {
00655 for ( Counter::const_iterator excp = m_exceptions.begin() ;
00656 excp != m_exceptions.end() ; ++excp )
00657 {
00658 msgStream(level)
00659 << ( ftm % "#EXCEPTIONS" % excp->second % excp->first )
00660 << endmsg;
00661 }
00662 }
00663 {
00664 for ( Counter::const_iterator error = m_errors.begin() ;
00665 error != m_errors.end() ; ++error )
00666 {
00667 msgStream(level)
00668 << ( ftm % "#ERRORS " % error->second % error->first )
00669 << endmsg;
00670 }
00671 }
00672 {
00673 for ( Counter::const_iterator warning = m_warnings.begin() ;
00674 warning != m_warnings.end() ; ++warning )
00675 {
00676 msgStream(level)
00677 << ( ftm % "#WARNINGS " % warning->second % warning->first )
00678 << endmsg;
00679 }
00680 }
00681 {
00682 for ( Counter::const_iterator info = m_infos.begin() ;
00683 info != m_infos.end() ; ++info )
00684 {
00685 msgStream(level)
00686 << ( ftm % "#INFOS " % info->second % info->first )
00687 << endmsg;
00688 }
00689 }
00690
00691
00692 return
00693 m_exceptions .size () +
00694 m_errors .size () +
00695 m_warnings .size () +
00696 m_infos .size () ;
00697 }
00698
00699
00700
00704
00705 template < class PBASE >
00706 long GaudiCommon<PBASE>::printProps ( const MSG::Level level ) const
00707 {
00708
00709
00710 MsgStream& msg = msgStream ( level );
00711 typedef std::vector<Property*> Properties;
00712 const Properties& properties = this->getProperties() ;
00713 msg << "List of ALL properties of "
00714 << System::typeinfoName( typeid( *this ) ) << "/" << this->name()
00715 << " #properties = " << properties.size() << endmsg ;
00716 for ( Properties::const_reverse_iterator property
00717 = properties.rbegin() ;
00718 properties.rend() != property ; ++property )
00719 {
00720 msg << "Property ['Name': Value] = "
00721 << ( **property)
00722 << endmsg ;
00723 }
00724 return properties.size() ;
00725 }
00726
00727
00728
00729
00730
00731 template < class PBASE >
00732 void GaudiCommon<PBASE>::msgLevelHandler ( Property & theProp )
00733 {
00734
00735 resetMsgStream();
00736
00737
00738 m_msgLevel =
00739 this->outputLevel() < (int) MSG::NIL ? MSG::NIL :
00740 this->outputLevel() >= (int) MSG::NUM_LEVELS ? MSG::ALWAYS :
00741 MSG::Level( this->outputLevel() ) ;
00742
00743
00744 if ( this->msgSvc()->outputLevel(this->name()) != this->outputLevel() )
00745 {
00746 this->msgSvc()->setOutputLevel( this->name(), this->outputLevel() );
00747 }
00748
00749
00750 if ( msgLevel(MSG::DEBUG) )
00751 {
00752 debug() << "Property update for "
00753 << theProp.name() << " : new value = " << this->outputLevel() << endmsg;
00754 }
00755 }
00756
00757
00758
00759
00760
00761
00762
00763
00764
00765 template < class PBASE >
00766 DataObject* GaudiCommon<PBASE>::put ( IDataProviderSvc* svc ,
00767 DataObject* object ,
00768 const std::string& location ,
00769 const bool useRootInTES ) const
00770 {
00771
00772 Assert ( 0 != svc , "put():: Invalid 'service'!" ) ;
00773 Assert ( 0 != object , "put():: Invalid 'Object'!" ) ;
00774 Assert ( !location.empty() , "put():: Invalid 'address' = '' " ) ;
00775
00776 const std::string & fullLocation = fullTESLocation( location, useRootInTES );
00777
00778 const StatusCode status = '/' == fullLocation[0] ?
00779 svc -> registerObject( fullLocation , object ) :
00780 svc -> registerObject( "/Event/" + fullLocation , object ) ;
00781
00782 if ( status.isFailure() )
00783 { Exception ( "put():: could not register '" +
00784 System::typeinfoName( typeid( *object ) ) +
00785 "' at address '" + fullLocation + "'" , status ) ; }
00786 if ( msgLevel( MSG::DEBUG ) )
00787 { Print( "The object of type '" +
00788 System::typeinfoName( typeid( *object ) ) +
00789 "' is registered in TS at address '"
00790 + fullLocation + "'" , status , MSG::DEBUG ) ; }
00791 return object;
00792 }
00793
00794
00795
00796
00797
00798 template < class PBASE >
00799 void GaudiCommon<PBASE>::printErrorHandler ( Property& )
00800 {
00801
00802 if ( this -> FSMState() < Gaudi::StateMachine::INITIALIZED ) { return ; }
00803 if ( this -> errorsPrint() ) { this -> printErrors () ; }
00804 }
00805
00806
00807
00808 template < class PBASE >
00809 void GaudiCommon<PBASE>::printPropsHandler ( Property& )
00810 {
00811
00812 if ( this -> FSMState() < Gaudi::StateMachine::INITIALIZED ) { return ; }
00813 if ( this -> propsPrint() ) { this -> printProps ( MSG::ALWAYS ) ; }
00814 }
00815
00816
00817
00818 template < class PBASE >
00819 void GaudiCommon<PBASE>::printStatHandler ( Property& )
00820 {
00821
00822 if ( this -> FSMState() < Gaudi::StateMachine::INITIALIZED ) { return ; }
00823 if ( this -> statPrint() ) { this -> printStat ( MSG::ALWAYS ) ; }
00824 }
00825
00826
00827
00828
00829
00830
00831
00832