EventSelectorDataStream.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #define GAUDISVC_EVENTSELECTOR_EVENTSELECTORDATASTREAM_CPP 1
00014
00015 #include "GaudiKernel/Tokenizer.h"
00016 #include "GaudiKernel/IService.h"
00017 #include "GaudiKernel/ISvcLocator.h"
00018 #include "GaudiKernel/IConversionSvc.h"
00019 #include "GaudiKernel/IDataManagerSvc.h"
00020 #include "GaudiKernel/IPersistencySvc.h"
00021 #include "GaudiKernel/PropertyMgr.h"
00022 #include "GaudiKernel/MsgStream.h"
00023 #include "GaudiKernel/EventSelectorDataStream.h"
00024
00025
00026
00027 MsgStream& operator<<(MsgStream& s, const EventSelectorDataStream& obj) {
00028 s << "Stream:" << obj.name() << " Def:" << obj.definition();
00029 return s;
00030 }
00031
00032
00033 std::ostream& operator<<(std::ostream& s, const EventSelectorDataStream& obj) {
00034 s << "Stream:" << obj.name() << " Def:" << obj.definition();
00035 return s;
00036 }
00037
00038
00039 EventSelectorDataStream::EventSelectorDataStream(const std::string& nam, const std::string& def, ISvcLocator* svcloc)
00040 : m_pSelector(0),
00041 m_pSvcLocator(svcloc)
00042 {
00043 m_name = nam;
00044 m_definition = def;
00045 m_initialized = false;
00046 m_properties = new Properties();
00047 }
00048
00049
00050 EventSelectorDataStream::~EventSelectorDataStream() {
00051 setSelector(0);
00052 delete m_properties;
00053 }
00054
00055
00056 void EventSelectorDataStream::setSelector(IEvtSelector* pSelector) {
00057 if ( 0 != pSelector ) pSelector->addRef();
00058 if ( 0 != m_pSelector ) m_pSelector->release();
00059 m_pSelector = pSelector;
00060 }
00061
00062
00063 StringProperty* EventSelectorDataStream::property(const std::string& nam) {
00064 for ( Properties::iterator i = m_properties->begin(); i != m_properties->end(); i++ ) {
00065 if ( (*i).name() == nam ) {
00066 return &(*i);
00067 }
00068 }
00069 return 0;
00070 }
00071
00072
00073 const StringProperty* EventSelectorDataStream::property(const std::string& nam) const {
00074 for ( Properties::const_iterator i = m_properties->begin(); i != m_properties->end(); i++ ) {
00075 if ( (*i).name() == nam ) {
00076 return &(*i);
00077 }
00078 }
00079 return 0;
00080 }
00081
00082
00083 StatusCode EventSelectorDataStream::initialize() {
00084 bool isData = true;
00085 std::string auth, dbtyp, item, crit, sel, svc, stmt;
00086 std::string cnt = "/Event";
00087 std::string db = "<Unknown>";
00088 Tokenizer tok(true);
00089
00090 SmartIF<IDataManagerSvc> eds(m_pSvcLocator->service("EventDataSvc"));
00091 if( !eds.isValid() ) {
00092 std::cout << "ERROR: Unable to localize interface IDataManagerSvc from service EventDataSvc"
00093 << std::endl;
00094 return StatusCode::FAILURE;
00095 }
00096 else {
00097 cnt = eds->rootName();
00098 }
00099 m_selectorType = m_criteria = m_dbName= "";
00100 m_properties->erase(m_properties->begin(), m_properties->end());
00101
00102 tok.analyse(m_definition, " ", "", "", "=", "'", "'");
00103 for ( Tokenizer::Items::iterator i = tok.items().begin(); i != tok.items().end(); i++ ) {
00104 long hash = -1;
00105 const std::string& tag = (*i).tag();
00106 const std::string& val = (*i).value();
00107 switch( ::toupper(tag[0]) ) {
00108 case 'A':
00109 auth = val;
00110 break;
00111 case 'C':
00112 svc = "EvtTupleSvc";
00113 isData = false;
00114 case 'E':
00115 hash = val.find('#');
00116 if ( hash > 0 ) {
00117 cnt = val.substr(0,hash);
00118 item = val.substr(hash+1, val.length()-hash-1);
00119 }
00120 else {
00121 cnt = val;
00122 item = "Address";
00123 }
00124 break;
00125 case 'D':
00126 m_criteria = "FILE " + val;
00127 m_dbName=val;
00128 break;
00129 case 'F':
00130 switch( ::toupper(tag[1]) ) {
00131 case 'I':
00132 dbtyp = "SICB";
00133 m_criteria = "FILE " + val;
00134 m_dbName=val;
00135 break;
00136 case 'U':
00137 stmt = val;
00138 break;
00139 default:
00140 break;
00141 }
00142 break;
00143 case 'J':
00144 m_criteria = "JOBID " + val;
00145 m_dbName=val;
00146 dbtyp = "SICB";
00147 break;
00148 case 'T':
00149 switch( ::toupper(tag[1]) ) {
00150 case 'Y':
00151 dbtyp = val;
00152 break;
00153 case 'A':
00154 m_criteria = "TAPE " + val;
00155 m_dbName=val;
00156 dbtyp = "SICB";
00157 break;
00158 default:
00159 break;
00160 }
00161 break;
00162 case 'S':
00163 switch( ::toupper(tag[1]) ) {
00164 case 'E':
00165 sel = val;
00166 break;
00167 case 'V':
00168 svc = val;
00169 break;
00170 default:
00171 break;
00172 }
00173 break;
00174 default:
00175 m_properties->push_back(StringProperty(tag,val));
00176 break;
00177 }
00178 }
00179 if ( !isData ) {
00180 m_selectorType = "EventCollectionSelector";
00181 }
00182 else if ( dbtyp == "SICB" ) {
00183 m_selectorType = "SicbEventSelector";
00184 }
00185 else if ( dbtyp.substr(0,4) == "POOL" ) {
00186 m_selectorType = "PoolDbEvtSelector";
00187 }
00188 else if ( svc.empty() ) {
00189 m_selectorType = "DbEvtSelector";
00190 }
00191 else {
00192 m_selectorType = svc;
00193 }
00194 StatusCode status = StatusCode::SUCCESS;
00195 if ( svc.length() == 0 && dbtyp.length() != 0 ) {
00196 SmartIF<IPersistencySvc> ipers(m_pSvcLocator->service("EventPersistencySvc"));
00197 if ( ipers.isValid() ) {
00198 IConversionSvc* icnvSvc = 0;
00199 status = ipers->getService(dbtyp, icnvSvc);
00200 if ( status.isSuccess() ) {
00201 IService* isvc = 0;
00202 status = icnvSvc->queryInterface(IService::interfaceID(), pp_cast<void>(&isvc));
00203 if ( status.isSuccess() ) {
00204 svc = isvc->name();
00205 isvc->release();
00206 }
00207 }
00208 }
00209 }
00210 m_properties->push_back( StringProperty("Function", stmt));
00211 m_properties->push_back( StringProperty("CnvService", svc));
00212 m_properties->push_back( StringProperty("Authentication",auth));
00213 m_properties->push_back( StringProperty("Container", cnt));
00214 m_properties->push_back( StringProperty("Item", item));
00215 m_properties->push_back( StringProperty("Criteria", sel));
00216 m_properties->push_back( StringProperty("DbType", dbtyp));
00217 m_properties->push_back( StringProperty("DB", m_criteria));
00218 m_initialized = status.isSuccess();
00219 return status;
00220 }
00221
00222
00223 StatusCode EventSelectorDataStream::finalize() {
00224 setSelector(0);
00225 if ( m_properties ) {
00226 m_properties->clear();
00227 }
00228 m_initialized = false;
00229 return StatusCode::SUCCESS;
00230 }