![]() |
|
|
Generated: 8 Jan 2009 |
00001 //==================================================================== 00002 // RunRecordDataSvc.cpp 00003 //-------------------------------------------------------------------- 00004 // 00005 // Package : System ( The LHCb Offline System) 00006 // 00007 // Description: implementation of the Transient event data service. 00008 // 00009 // Author : M.Frank 00010 // History : 00011 // +---------+----------------------------------------------+--------- 00012 // | Date | Comment | Who 00013 // +---------+----------------------------------------------+--------- 00014 // | 10/12/08| Initial version | MF 00015 // +---------+----------------------------------------------+--------- 00016 // 00017 //==================================================================== 00018 #define DATASVC_RUNRECORDDATASVC_CPP 00019 00020 #include "GaudiKernel/SmartIF.h" 00021 #include "GaudiKernel/MsgStream.h" 00022 #include "GaudiKernel/IProperty.h" 00023 #include "GaudiKernel/SvcFactory.h" 00024 #include "GaudiKernel/DataObject.h" 00025 #include "GaudiKernel/ISvcLocator.h" 00026 #include "GaudiKernel/IIncidentSvc.h" 00027 #include "GaudiKernel/IConversionSvc.h" 00028 #include "GaudiKernel/IOpaqueAddress.h" 00029 #include "GaudiKernel/DataIncident.h" 00030 #include "GaudiKernel/RegistryEntry.h" 00031 00032 #include "RunRecordDataSvc.h" 00033 00034 // Instantiation of a static factory class used by clients to create 00035 // instances of this service 00036 DECLARE_SERVICE_FACTORY(RunRecordDataSvc) 00037 00038 00039 StatusCode RunRecordDataSvc::initialize() { 00040 // Nothing to do: just call base class initialisation 00041 StatusCode sc = DataSvc::initialize(); 00042 ISvcLocator* svc_loc = serviceLocator(); 00043 MsgStream log(msgSvc(),name()); 00044 00045 if ( !sc.isSuccess() ) { // Base class failure 00046 return sc; 00047 } 00048 // Attach data loader facility 00049 sc = svc_loc->service("PersistencySvc/RunRecordPersistencySvc", m_cnvSvc, true); 00050 if ( !sc.isSuccess() ) { 00051 log << MSG::ERROR << "Failed to access RunRecordPersistencySvc." << endmsg; 00052 return sc; 00053 } 00054 SmartIF<IProperty> prp(m_cnvSvc); 00055 if ( prp ) { 00056 //prp->setProperty(); 00057 } 00058 sc = setDataLoader( m_cnvSvc ); 00059 if ( !sc.isSuccess() ) { 00060 log << MSG::ERROR << "Failed to attach dataloader RunRecordPersistencySvc." << endmsg; 00061 return sc; 00062 } 00063 00064 sc = setRoot(m_rootName, new DataObject()); 00065 if( !sc.isSuccess() ) { 00066 log << MSG::WARNING << "Error declaring RunRecord root DataObject" << endreq; 00067 return sc; 00068 } 00069 00070 if( !m_incidentSvc ) { 00071 log << MSG::FATAL << "IncidentSvc is invalid--base class failed." << endreq; 00072 return sc; 00073 } 00074 00079 m_incidentSvc->addListener(this,IncidentType::BeginEvent); 00080 m_incidentSvc->addListener(this,"FILE_OPEN_READ"); 00081 m_incidentSvc->addListener(this,"SAVE_RUN_RECORD"); 00082 00083 return sc; 00084 } 00085 00087 StatusCode RunRecordDataSvc::reinitialize() { 00088 // Do nothing for this service 00089 return StatusCode::SUCCESS; 00090 } 00091 00093 StatusCode RunRecordDataSvc::finalize() { 00094 if( m_cnvSvc ) m_cnvSvc->release(); 00095 m_cnvSvc = 0; 00096 DataSvc::finalize().ignore(); 00097 return StatusCode::SUCCESS ; 00098 } 00099 00101 StatusCode RunRecordDataSvc::queryInterface(const InterfaceID& riid,void** ppvIf) { 00102 if ( 0 == ppvIf ) 00103 return StatusCode::FAILURE; 00104 else if ( IIncidentListener::interfaceID().versionMatch(riid) ) 00105 *ppvIf = static_cast<IIncidentListener*>( this ); 00106 else 00107 return DataSvc::queryInterface(riid,ppvIf); 00108 // increment reference counter 00109 addRef(); 00110 return SUCCESS; 00111 } 00112 00114 void RunRecordDataSvc::handle(const Incident& incident) { 00115 if ( incident.type() == "FILE_OPEN_READ" ) { 00116 typedef ContextIncident<IOpaqueAddress*> Ctxt; 00117 const Ctxt* inc = dynamic_cast<const Ctxt*>(&incident); 00118 if ( inc ) { 00119 registerRunRecord(inc->source(),inc->tag()); 00120 return; 00121 } 00122 MsgStream log(msgSvc(),name()); 00123 log << MSG::ALWAYS << "Received invalid incident of type:" << incident.type() << endmsg; 00124 } 00125 else if ( incident.type() == "SAVE_RUN_RECORD" ) { 00126 MsgStream log(msgSvc(),name()); 00127 log << MSG::ALWAYS << "Saving run records not implemented." << endmsg; 00128 } 00129 } 00130 00132 void RunRecordDataSvc::registerRunRecord(const std::string& data, IOpaqueAddress* pAddr) { 00133 if ( !data.empty() && 0 != pAddr ) { 00134 MsgStream log(msgSvc(),name()); 00135 std::string fid = data; 00136 log << MSG::ALWAYS << "Request to load run record for file " << fid << endmsg; 00137 StatusCode sc = registerAddress(m_root,fid,pAddr); 00138 if ( !sc.isSuccess() ) { 00139 log << MSG::ERROR << "Failed to register run record for:" << fid << endmsg; 00140 pAddr->release(); 00141 } 00142 } 00143 else if ( !data.empty() && 0 == pAddr ) { 00144 MsgStream log(msgSvc(),name()); 00145 log << MSG::ERROR << "Failed to register run record for:" << data << " [Invalid Address]" << endmsg; 00146 } 00147 } 00148 00150 RunRecordDataSvc::RunRecordDataSvc(const std::string& name,ISvcLocator* svc) 00151 : DataSvc(name,svc) { 00152 m_cnvSvc = 0; 00153 m_rootName = "/RunRecords"; 00154 } 00155 00157 RunRecordDataSvc::~RunRecordDataSvc() { 00158 }