Gaudi Framework, version v20r2

Generated: 18 Jul 2008

TagCollectionSvc.cpp

Go to the documentation of this file.
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 }

Generated at Fri Jul 18 11:59:25 2008 for Gaudi Framework, version v20r2 by Doxygen version 1.5.1 written by Dimitri van Heesch, © 1997-2004