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 = "";
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 break;
00128 case 'F':
00129 switch( ::toupper(tag[1]) ) {
00130 case 'I':
00131 dbtyp = "SICB";
00132 m_criteria = "FILE " + val;
00133 break;
00134 case 'U':
00135 stmt = val;
00136 break;
00137 default:
00138 break;
00139 }
00140 break;
00141 case 'J':
00142 m_criteria = "JOBID " + val;
00143 dbtyp = "SICB";
00144 break;
00145 case 'T':
00146 switch( ::toupper(tag[1]) ) {
00147 case 'Y':
00148 dbtyp = val;
00149 break;
00150 case 'A':
00151 m_criteria = "TAPE " + val;
00152 dbtyp = "SICB";
00153 break;
00154 default:
00155 break;
00156 }
00157 break;
00158 case 'S':
00159 switch( ::toupper(tag[1]) ) {
00160 case 'E':
00161 sel = val;
00162 break;
00163 case 'V':
00164 svc = val;
00165 break;
00166 default:
00167 break;
00168 }
00169 break;
00170 default:
00171 m_properties->push_back(StringProperty(tag,val));
00172 break;
00173 }
00174 }
00175 if ( !isData ) {
00176 m_selectorType = "EventCollectionSelector";
00177 }
00178 else if ( dbtyp == "SICB" ) {
00179 m_selectorType = "SicbEventSelector";
00180 }
00181 else if ( dbtyp.substr(0,4) == "POOL" ) {
00182 m_selectorType = "PoolDbEvtSelector";
00183 }
00184 else if ( svc.empty() ) {
00185 m_selectorType = "DbEvtSelector";
00186 }
00187 else {
00188 m_selectorType = svc;
00189 }
00190 StatusCode status = StatusCode::SUCCESS;
00191 if ( svc.length() == 0 && dbtyp.length() != 0 ) {
00192 SmartIF<IPersistencySvc> ipers(m_pSvcLocator->service("EventPersistencySvc"));
00193 if ( ipers.isValid() ) {
00194 IConversionSvc* icnvSvc = 0;
00195 status = ipers->getService(dbtyp, icnvSvc);
00196 if ( status.isSuccess() ) {
00197 IService* isvc = 0;
00198 status = icnvSvc->queryInterface(IService::interfaceID(), pp_cast<void>(&isvc));
00199 if ( status.isSuccess() ) {
00200 svc = isvc->name();
00201 isvc->release();
00202 }
00203 }
00204 }
00205 }
00206 m_properties->push_back( StringProperty("Function", stmt));
00207 m_properties->push_back( StringProperty("CnvService", svc));
00208 m_properties->push_back( StringProperty("Authentication",auth));
00209 m_properties->push_back( StringProperty("Container", cnt));
00210 m_properties->push_back( StringProperty("Item", item));
00211 m_properties->push_back( StringProperty("Criteria", sel));
00212 m_properties->push_back( StringProperty("DbType", dbtyp));
00213 m_properties->push_back( StringProperty("DB", m_criteria));
00214 m_initialized = status.isSuccess();
00215 return status;
00216 }
00217
00218
00219 StatusCode EventSelectorDataStream::finalize() {
00220 setSelector(0);
00221 if ( m_properties ) {
00222 m_properties->clear();
00223 }
00224 m_initialized = false;
00225 return StatusCode::SUCCESS;
00226 }