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 #define DATASVC_RECORDDATASVC_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 "RecordDataSvc.h"
00033 using namespace std;
00034
00035
00036
00037 DECLARE_SERVICE_FACTORY(RecordDataSvc)
00038
00039
00040 StatusCode RecordDataSvc::initialize() {
00041
00042 StatusCode sc = DataSvc::initialize();
00043 MsgStream log(msgSvc(),name());
00044
00045 if ( !sc.isSuccess() ) {
00046 return sc;
00047 }
00048
00049 sc = service(m_persSvcName, m_cnvSvc, true);
00050 if ( !sc.isSuccess() ) {
00051 log << MSG::ERROR << "Failed to access RecordPersistencySvc." << endmsg;
00052 return sc;
00053 }
00054 SmartIF<IProperty> prp(m_cnvSvc);
00055 if ( prp ) {
00056
00057 }
00058 sc = setDataLoader( m_cnvSvc );
00059 if ( !sc.isSuccess() ) {
00060 log << MSG::ERROR << "Failed to attach dataloader RecordPersistencySvc." << endmsg;
00061 return sc;
00062 }
00063
00064 sc = setRoot(m_rootName, new DataObject());
00065 if( !sc.isSuccess() ) {
00066 log << MSG::WARNING << "Error declaring Record root DataObject" << endmsg;
00067 return sc;
00068 }
00069
00070 if( !m_incidentSvc ) {
00071 log << MSG::FATAL << "IncidentSvc is invalid--base class failed." << endmsg;
00072 return sc;
00073 }
00074
00079 m_incidentSvc->addListener(this,"FILE_OPEN_READ");
00080 m_incidentSvc->addListener(this,m_saveIncidentName);
00081 return sc;
00082 }
00083
00085 StatusCode RecordDataSvc::reinitialize() {
00086
00087 return StatusCode::SUCCESS;
00088 }
00089
00091 StatusCode RecordDataSvc::finalize() {
00092 if( m_incidentSvc ) m_incidentSvc->removeListener(this);
00093 if( m_cnvSvc ) m_cnvSvc->release();
00094 m_cnvSvc = 0;
00095 DataSvc::finalize().ignore();
00096 return StatusCode::SUCCESS ;
00097 }
00098
00100 void RecordDataSvc::handle(const Incident& incident) {
00101 if ( incident.type() == "FILE_OPEN_READ" ) {
00102 typedef ContextIncident<IOpaqueAddress*> Ctxt;
00103 const Ctxt* inc = dynamic_cast<const Ctxt*>(&incident);
00104 if ( inc ) {
00105 registerRecord(inc->source(),inc->tag());
00106 if ( !m_incidentName.empty() ) {
00107 StringV incidents(m_incidents);
00108 m_incidents.clear();
00109 for( StringV::const_iterator i=incidents.begin(); i!=incidents.end();++i)
00110 m_incidentSvc->fireIncident(Incident(*i,m_incidentName));
00111 }
00112 return;
00113 }
00114 MsgStream log(msgSvc(),name());
00115 log << MSG::ALWAYS << "Received invalid incident of type:" << incident.type() << endmsg;
00116 }
00117 else if ( incident.type() == m_saveIncidentName ) {
00118 MsgStream log(msgSvc(),name());
00119 log << MSG::ALWAYS << "Saving records not implemented." << endmsg;
00120 }
00121 }
00122
00124 void RecordDataSvc::loadRecords(IRegistry* pObj) {
00125 if ( 0 != pObj ) {
00126 typedef vector<IRegistry*> Leaves;
00127 Leaves leaves;
00128 DataObject* p = 0;
00129 MsgStream log(msgSvc(),name());
00130 const string& id0 = pObj->identifier();
00131 StatusCode sc = retrieveObject(id0, p);
00132 if ( sc.isSuccess() ) {
00133 log << MSG::DEBUG << "Loaded records object: " << id0 << endmsg;
00134 sc = objectLeaves(pObj, leaves);
00135 if ( sc.isSuccess() ) {
00136 for ( Leaves::const_iterator i=leaves.begin(); i != leaves.end(); i++ )
00137 loadRecords(*i);
00138 }
00139 }
00140 else {
00141 log << MSG::ERROR << "Failed to load records object: " << pObj->identifier() << endmsg;
00142 }
00143 }
00144 }
00145
00147 void RecordDataSvc::registerRecord(const string& data, IOpaqueAddress* pAddr) {
00148 if ( !data.empty() && 0 != pAddr ) {
00149 MsgStream log(msgSvc(),name());
00150 string fid = data;
00151 log << MSG::DEBUG << "Request to load record for file " << fid << endmsg;
00152 StatusCode sc = registerAddress(m_root,fid,pAddr);
00153 if ( !sc.isSuccess() ) {
00154 log << MSG::WARNING << "Failed to register record for:" << fid << endmsg;
00155 pAddr->release();
00156 return;
00157 }
00158 if ( m_autoLoad ) {
00159 loadRecords(pAddr->registry());
00160 }
00161 m_incidents.push_back(pAddr->registry()->identifier());
00162 }
00163 else if ( !data.empty() && 0 == pAddr ) {
00164 MsgStream log(msgSvc(),name());
00165 log << MSG::INFO << "Failed to register record for:" << data << " [Invalid Address]" << endmsg;
00166 }
00167 }
00168
00170 RecordDataSvc::RecordDataSvc(const string& name,ISvcLocator* svc)
00171 : base_class(name,svc), m_cnvSvc(0)
00172 {
00173 m_rootName = "/Records";
00174 declareProperty("AutoLoad", m_autoLoad = true);
00175 declareProperty("IncidentName", m_incidentName = "");
00176 declareProperty("SaveIncident", m_saveIncidentName = "SAVE_RECORD");
00177 declareProperty("PersistencySvc", m_persSvcName = "PersistencySvc/RecordPersistencySvc");
00178 }
00179
00181 RecordDataSvc::~RecordDataSvc() {
00182 }