![]() |
|
|
Generated: 18 Jul 2008 |
00001 //==================================================================== 00002 // TagCollectionSvc.cpp 00003 //-------------------------------------------------------------------- 00004 // 00005 // Package : GaudiSvc/TagCollectionSvc ( The LHCb Offline System) 00006 // 00007 // Description: implementation of the NTuple service 00008 // 00009 // Author : M.Frank 00010 // History : 00011 // +---------+----------------------------------------------+--------- 00012 // | Date | Comment | Who 00013 // +---------+----------------------------------------------+--------- 00014 // | 29/10/98| Initial version | MF 00015 // | 29/09/99| Added access to ICnvManager for missing | 00016 // | | converters | MF 00017 // | 20/09/00| Connect dynamically to conversion service | 00018 // | | for N-tuple persistency | MF 00019 // +---------+----------------------------------------------+--------- 00020 // 00021 //==================================================================== 00022 #define GAUDISVC_TAGCOLLECTIONSVC_CPP 00023 00024 // Framework include files 00025 #include "GaudiKernel/SmartIF.h" 00026 #include "GaudiKernel/Tokenizer.h" 00027 #include "GaudiKernel/SvcFactory.h" 00028 #include "GaudiKernel/DataObject.h" 00029 #include "GaudiKernel/ObjectFactory.h" 00030 #include "GaudiKernel/GenericAddress.h" 00031 00032 #include "GaudiKernel/IProperty.h" 00033 #include "GaudiKernel/ISvcManager.h" 00034 #include "GaudiKernel/ISvcLocator.h" 00035 #include "GaudiKernel/IConversionSvc.h" 00036 00037 #include "GaudiKernel/MsgStream.h" 00038 #include "GaudiKernel/Property.h" 00039 00040 #include "TagCollectionSvc.h" 00041 00042 // Instantiation of a static factory class used by clients to create 00043 // instances of this service 00044 DECLARE_SERVICE_FACTORY(TagCollectionSvc) 00045 00046 00047 TagCollectionSvc::TagCollectionSvc(const std::string& name, ISvcLocator* svc) 00048 : NTupleSvc(name, svc) 00049 { 00050 } 00051 00053 TagCollectionSvc::~TagCollectionSvc() { 00054 } 00055 00057 StatusCode TagCollectionSvc::initialize() { 00058 StatusCode status = NTupleSvc::initialize(); 00059 return status; 00060 } 00061 00063 StatusCode TagCollectionSvc::finalize() { 00064 StatusCode status = NTupleSvc::finalize(); 00065 return status; 00066 } 00067 00069 StatusCode TagCollectionSvc::connect(const std::string& ident, std::string& logname) { 00070 MsgStream log ( msgSvc(), name() ); 00071 DataObject* pO = 0; 00072 StatusCode status = findObject(m_rootName, pO); 00073 if ( status.isSuccess() ) { 00074 status = INVALID_ROOT; 00075 if ( 0 != pO->registry() ) { 00076 char typ=0; 00077 Tokenizer tok(true); 00078 std::vector<Prop> props; 00079 long loc = ident.find(" "); 00080 std::string filename, auth, svc = "DbCnvSvc"; 00081 logname = ident.substr(0,loc); 00082 tok.analyse(ident.substr(loc+1,ident.length()), " ", "", "", "=", "'", "'"); 00083 for ( Tokenizer::Items::iterator i = tok.items().begin(); i != tok.items().end(); i++) { 00084 const std::string& tag = (*i).tag(); 00085 switch( ::toupper(tag[0]) ) { 00086 case 'A': 00087 props.push_back( Prop("Server", (*i).value())); 00088 break; 00089 case 'F': /* FILE='<file name>' */ 00090 case 'D': /* DATAFILE='<file name>' */ 00091 filename = (*i).value(); 00092 break; 00093 case 'O': /* OPT='<NEW<CREATE,WRITE>, UPDATE, READ>' */ 00094 switch( ::toupper((*i).value()[0]) ) { 00095 case 'C': 00096 case 'N': 00097 case 'W': typ = 'N'; break; 00098 case 'U': typ = 'U'; break; 00099 case 'O': 00100 case 'R': 00101 switch( ::toupper((*i).value()[2]) ) { 00102 case 'C': /* RECREATE */ typ = 'R'; break; 00103 case 'A': /* READ */ 00104 default: typ = 'O'; break; 00105 } 00106 break; 00107 default: typ = 0; break; 00108 } 00109 break; 00110 case 'S': // SVC='<service type>' 00111 switch( ::toupper(tag[1]) ) { 00112 case 'V': svc = (*i).value(); break; 00113 case 'H': 00114 switch(::toupper((*i).value()[0])) { 00115 case 'Y': 00116 props.push_back( Prop("ShareFiles", (*i).value())); 00117 } 00118 break; 00119 } 00120 break; 00121 case 'T': // TYP='<HBOOK,ROOT,OBJY,...>' 00122 switch(::toupper((*i).value()[0])) { 00123 case 'H': 00124 svc = "HbookCnv::ConvSvc"; 00125 break; 00126 case 'P': 00127 props.push_back( Prop("DbType", (*i).value())); 00128 svc = "PoolDbCnvSvc"; 00129 break; 00130 default: 00131 props.push_back( Prop("DbType", (*i).value())); 00132 svc = "DbCnvSvc"; 00133 break; 00134 } 00135 break; 00136 default: 00137 props.push_back( Prop((*i).tag(), (*i).value())); 00138 break; 00139 } 00140 } 00141 if ( 0 != typ ) { 00142 IConversionSvc* pSvc = 0; 00143 status = createService(name()+'.'+logname, svc, props, pSvc); 00144 if ( status.isSuccess() ) { 00145 status = attachTuple(filename,logname,typ,pSvc->repSvcType()); 00146 if ( status.isSuccess() ) { 00147 m_connections.insert(Connections::value_type(m_rootName+'/'+logname,Connection(pSvc))); 00148 return StatusCode::SUCCESS; 00149 } 00150 } 00151 } 00152 } 00153 } 00154 log << MSG::ERROR << "Cannot add " << ident << " invalid filename!" << endmsg; 00155 return StatusCode::FAILURE; 00156 } 00157 00159 StatusCode TagCollectionSvc::createService( const std::string& nam, 00160 const std::string& typ, 00161 const std::vector<Prop>& props, 00162 IConversionSvc*& pSvc) { 00163 SmartIF<ISvcManager> mgr(IID_ISvcManager, serviceLocator()); 00164 00165 // FIXME: (MCl) why TagCollectionSvc has to directly create a ConversionSvc? 00166 StatusCode status = NO_INTERFACE; 00167 if ( mgr.isValid( ) ) { 00168 IService* isvc = 0; 00169 status = mgr->createService(typ, nam, isvc); 00170 if ( status.isSuccess() ) { 00171 status = isvc->queryInterface(IID_IConversionSvc, (void**)&pSvc); 00172 if ( status.isSuccess() ) { 00173 SmartIF<IProperty> iprop(IID_IProperty,isvc); 00174 status = NO_INTERFACE; 00175 if ( iprop.isValid( ) ) { 00176 for ( std::vector<Prop>::const_iterator j = props.begin(); j != props.end(); j++) { 00177 iprop->setProperty(StringProperty((*j).first, (*j).second)).ignore(); 00178 } 00179 // FIXME: (MCl) why NTupleSvc has to directly create a ConversionSvc? 00180 status = isvc->sysInitialize(); 00181 if ( status.isSuccess() ) { 00182 status = pSvc->setDataProvider(this); 00183 if ( status.isSuccess() ) { 00184 isvc->release(); 00185 return status; 00186 } 00187 } 00188 } 00189 pSvc->release(); 00190 } 00191 isvc->release(); 00192 } 00193 } 00194 pSvc = 0; 00195 return status; 00196 }