12 #include "GaudiKernel/MsgStream.h"
13 #include "GaudiKernel/GenericAddress.h"
14 #include "GaudiKernel/Algorithm.h"
15 #include "GaudiKernel/IAlgManager.h"
16 #include "GaudiKernel/IClassIDSvc.h"
31 #include "boost/range.hpp"
36 base_class(
name, pSvcLocator),
37 m_clidSvc(
"ClassIDSvc",
name),
38 m_RCUSvc(
"Athena::RCUSvc",
name),
58 const std::string::size_type p_sep = overwrite.find(
"->");
59 if (p_sep == std::string::npos) {
60 ATH_MSG_ERROR(
"Unexpected format in TypeKeyOverwriteMaps: " << overwrite);
61 return(StatusCode::FAILURE);
64 const std::pair<std::string, std::string>
entry(overwrite.substr(p_sep + 2), overwrite.substr(0, p_sep));
66 <<
" -> " <<
entry.first);
67 const std::string::size_type p_oldSep =
entry.first.find(
'#');
68 if (p_oldSep == std::string::npos) {
69 ATH_MSG_ERROR(
"Unexpected format in TypeKeyOverwriteMaps: " << overwrite);
70 return(StatusCode::FAILURE);
73 std::string clidStr =
entry.first.substr(0, p_oldSep);
74 std::set<CLID> symClids;
75 for (std::string::size_type p_clidSep = clidStr.rfind(
','); p_clidSep != std::string::npos; clidStr.resize(p_clidSep), p_clidSep = clidStr.rfind(
',')) {
76 symClids.insert(
getClid(clidStr.substr(p_clidSep + 1)));
78 std::string keyStr =
entry.first.substr(p_oldSep + 1);
80 for (std::string::size_type p_keySep = keyStr.rfind(
','); p_keySep != std::string::npos; keyStr.resize(p_keySep), p_keySep = keyStr.rfind(
',')) {
81 oldTad.setAlias(keyStr.substr(p_keySep + 1));
83 for (
CLID clid : symClids) {
84 oldTad.setTransientID(clid);
87 const std::string::size_type p_newSep =
entry.second.find(
'#');
88 if (p_newSep == std::string::npos) {
89 ATH_MSG_ERROR(
"Unexpected format in TypeKeyOverwriteMaps: " << overwrite);
90 return(StatusCode::FAILURE);
93 ATH_MSG_INFO(
"TypeKeyOverwriteMaps for: " << newTad.clID()
94 <<
"#" << newTad.name()
95 <<
" -> " << oldTad.clID()
96 <<
"#" << oldTad.name());
103 return(StatusCode::SUCCESS);
115 if (toadd.empty())
return;
119 auto newmap = std::make_unique<InputRenameMap_t> (*
u);
120 for (
const auto&
p : toadd)
122 u.update (std::move (newmap));
128 StatusCode AddressRemappingSvc::initInputRenames()
136 std::string::size_type pos1 =
remap.find(
'#');
137 std::string::size_type pos2 =
remap.find(
"->");
138 if (pos1 == std::string::npos || pos2 == std::string::npos || pos2 < pos1)
144 std::string cname =
remap.substr (0, pos1);
145 std::string from =
remap.substr (pos1+1, pos2-pos1-1);
146 std::string
to =
remap.substr (pos2+2, std::string::npos);
148 if (clid == CLID_NULL) {
170 return StatusCode::SUCCESS;
180 return(StatusCode::SUCCESS);
195 const std::vector<SG::TransientAddress>* oldTads =
nullptr;
196 const std::vector<SG::TransientAddress>* newTads =
nullptr;
202 return StatusCode::SUCCESS;
214 if (!
status.isSuccess()) {
218 for (std::vector<SG::TransientAddress>::const_iterator oldIter = oldTads->begin(),
219 newIter = newTads->begin(), oldIterEnd = oldTads->end();
220 oldIter != oldIterEnd; ++oldIter, ++newIter) {
222 tads.push_back(tadd);
223 m_proxyDict->stringToKey(oldIter->name(), oldIter->clID());
224 m_proxyDict->stringToKey(newIter->name(), newIter->clID());
226 return(StatusCode::SUCCESS);
243 return StatusCode::SUCCESS;
246 std::vector<SG::TransientAddress> oldTadsCleaned =
m_oldTads;
247 std::vector<SG::TransientAddress> newTadsCleaned =
m_newTads;
251 if (!
status.isSuccess()) {
256 newIter = newTadsCleaned.begin(), oldIterEnd = oldTadsCleaned.end();
257 oldIter != oldIterEnd; ++oldIter, ++newIter)
259 CLID goodCLID = newIter->clID();
261 std::set<CLID> clidToKeep (clidvec.begin(), clidvec.end());
266 clidToKeep.erase(goodCLID);
271 dataProxy =
m_proxyDict->proxy(goodCLID, newIter->name());
273 clidToKeep.erase(goodCLID);
277 ATH_MSG_DEBUG(
"Remapping " << oldIter->clID() <<
"#" << oldIter->name() <<
" to base-class CLID: " << goodCLID <<
"#" << newIter->name());
283 ATH_MSG_INFO(
"Skipping remapping of " << oldIter->clID() <<
"#" << oldIter->name() <<
" because no suitable remapping found");
289 for(
auto tIter = clidToKeep.begin(); tIter != clidToKeep.end(); ++tIter) {
290 if(goodCLID == *tIter)
continue;
294 if(oldIter->clID()!=tadd->
clID()) {
297 tads.push_back(tadd);
298 m_proxyDict->stringToKey(oldIter->name(), oldIter->clID());
299 m_proxyDict->stringToKey(newIter->name(), newIter->clID());
307 return StatusCode::SUCCESS;
313 const EventContext& ctx)
319 const EventContext& )
const
321 const std::vector<SG::TransientAddress>* oldTads =
nullptr;
322 const std::vector<SG::TransientAddress>* newTads =
nullptr;
334 for (std::vector<SG::TransientAddress>::const_iterator oldIter = oldTads->begin(),
335 newIter = newTads->begin(), oldIterEnd = oldTads->end();
336 oldIter != oldIterEnd; ++oldIter, ++newIter) {
337 if (oldIter->transientID(tad->
clID()) &&
338 (oldIter->name() == tad->
name() || oldIter->hasAlias (tad->
name())))
340 ATH_MSG_DEBUG(
"Overwrite for: " << tad->
clID() <<
"#" << tad->
name() <<
" -> " << newIter->clID() <<
"#" << newIter->name());
342 if (dataProxy == 0) {
343 ATH_MSG_WARNING(
"Cannot get proxy for: " << newIter->clID() <<
"#" << newIter->name());
344 return(StatusCode::FAILURE);
346 GenericAddress* newGadd = 0;
349 ATH_MSG_WARNING(
"Cannot get GenericAddress for: " << newIter->clID() <<
"#" << newIter->name());
350 return(StatusCode::FAILURE);
352 GenericAddress* oldGadd =
new GenericAddress(newGadd->svcType(), tad->
clID(), *newGadd->par(), tad->
name(), *newGadd->ipar());
354 return(StatusCode::SUCCESS);
357 return(StatusCode::FAILURE);
375 if (
r->empty() &&
m_deletes.empty())
return StatusCode::SUCCESS;
393 if (
it !=
r->end()) {
394 const std::string& name_renamed =
it->second.m_key;
397 auto tad_new = std::make_unique<SG::TransientAddress>
398 (tad_clid, name_renamed,
401 if (clid == tad_clid)
continue;
402 tad_new->setTransientID (clid);
404 if (
r->find(from_key) ==
r->end()) {
410 size_t namelen = tad->
name().size();
411 for (
const std::string&
a : tad->
alias()) {
412 std::string a_renamed =
a;
415 auto it_a =
r->find (from_key);
416 if (it_a !=
r->end()) {
417 a_renamed = it_a->second.m_key;
420 if (strncmp (a_renamed.c_str(), tad->
name().c_str(), namelen) == 0 &&
421 a_renamed[namelen] ==
'.')
423 a_renamed = name_renamed + a_renamed.substr (namelen, std::string::npos);
426 tad_new->setAlias (a_renamed);
432 tad = tad_new.release();
440 auto tad_new = std::make_unique<SG::TransientAddress>
441 (tad->
clID(), tad->
name() +
"_DELETED",
445 for (
const std::string&
a : tad->
alias()) {
446 tad_new->setAlias (
a +
"_DELETED");
450 tad = tad_new.release();
458 for (
const std::string&
a : aset) {
460 auto it_a =
r->find (from_key);
461 if (it_a !=
r->end()) {
462 const std::string&
s = it_a->second.m_key;
475 return StatusCode::SUCCESS;
508 for (IAlgorithm* ialg :
algs) {
509 if (Gaudi::Algorithm*
alg =
dynamic_cast<Gaudi::Algorithm*
> (ialg)) {
512 if (
alg->name() ==
"SGInputLoader")
continue;
515 if (
alg->type() ==
"AthViews::ViewDataVerifier" )
continue;
517 for (
const DataObjID& dobj :
alg->outputDataObjs()) {
518 static const std::string pref =
"StoreGateSvc+";
519 if (dobj.key().rfind(pref, 0) != std::string::npos) {
520 std::string
key = dobj.key().substr (pref.size());
527 if (dobj.fullKey().find (
"xAOD") != std::string::npos ||
528 dobj.fullKey().find (
"cinfo") != std::string::npos)
546 for (
const auto&
p : boost::make_iterator_range (
m_deletes.equal_range (
key))) {
547 CLID clid =
p.second;