2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
5 /** @file T_AthenaPoolCnvBase.icc
6 * @brief This file contains the implementation for the templated T_AthenaPoolCnvBase class.
7 * @author Peter van Gemmeren <gemmeren@anl.gov>
10 #include "AthenaPoolCnvSvc/IAthenaPoolCnvSvc.h"
12 #include "GaudiKernel/StatusCode.h"
13 #include "GaudiKernel/DataObject.h"
14 #include "GaudiKernel/IOpaqueAddress.h"
15 #include "GaudiKernel/IRegistry.h"
16 #include "PersistentDataModel/Placement.h"
17 #include "PersistentDataModel/Token.h"
18 #include "PersistentDataModel/TokenAddress.h"
20 #include "DataModelRoot/RootType.h"
22 #include "AthenaKernel/CLASS_DEF.h"
23 #include "AthenaKernel/ClassName.h"
24 #include "AthenaKernel/StorableConversions.h"
25 #include "AthenaPoolCnvSvc/exceptions.h"
27 //__________________________________________________________________________
29 T_AthenaPoolCnvBase<T>::T_AthenaPoolCnvBase(ISvcLocator* svcloc,
30 const char* name /*= nullptr*/)
31 : AthenaPoolConverter(classID(), svcloc, name) {
33 //______________________________________________________________________________
35 StatusCode T_AthenaPoolCnvBase<T>::initialize() {
36 ATH_MSG_DEBUG("initialize() in T_AthenaPoolCnvBase " << classID());
37 if (!AthenaPoolConverter::initialize().isSuccess()) {
38 ATH_MSG_FATAL("Failed to initialize AthenaPoolConverter base class.");
39 return(StatusCode::FAILURE);
41 return(StatusCode::SUCCESS);
43 //__________________________________________________________________________
45 const CLID& T_AthenaPoolCnvBase<T>::classID() {
46 return(ClassID_traits<T>::ID());
48 //__________________________________________________________________________
50 StatusCode T_AthenaPoolCnvBase<T>::DataObjectToPers(DataObject* pObj, IOpaqueAddress*& /*pAddr*/) {
51 const std::string className = ClassName<T>::name();
53 ATH_MSG_DEBUG("Retrieve class description for class (type/key) " << className << "/" << pObj->name());
54 m_classDesc = RootType( typeid(T) );
56 return(StatusCode::SUCCESS);
58 //__________________________________________________________________________
60 StatusCode T_AthenaPoolCnvBase<T>::DataObjectToPool(IOpaqueAddress* pAddr, DataObject* pObj) {
61 const std::string className = ClassName<T>::name();
63 bool success = SG::fromStorable(pObj, obj);
64 if (!success || obj == nullptr) {
65 ATH_MSG_ERROR("failed to cast to T for class (type/key) " << className << "/" << pObj->name());
66 return(StatusCode::FAILURE);
68 Placement placement = setPlacement(pObj->name(), *pAddr->par());
69 std::unique_ptr<Token> token (m_athenaPoolCnvSvc->registerForWrite(&placement, obj, m_classDesc));
70 // Null/empty token means ERROR
71 if (token == nullptr || token->classID() == Guid::null()) {
72 ATH_MSG_ERROR("failed to get Token for class (type/key) " << className << "/" << pObj->name());
73 return(StatusCode::FAILURE);
75 // Update IOpaqueAddress for this object.
76 TokenAddress* tokAddr = dynamic_cast<TokenAddress*>(pAddr);
77 if (tokAddr != nullptr) {
78 tokAddr->setToken(std::move(token));
80 return(StatusCode::FAILURE);
82 return(StatusCode::SUCCESS);
84 //__________________________________________________________________________
86 StatusCode T_AthenaPoolCnvBase<T>::PoolToDataObject(DataObject*& pObj,
88 const std::string& key)
90 const std::string className = ClassName<T>::name();
91 void* voidPtr = nullptr;
93 m_athenaPoolCnvSvc->setObjPtr(voidPtr, token);
95 catch (const std::exception& ex) {
96 AthenaPoolCnvSvc::throwExcCaughtException (__PRETTY_FUNCTION__,
97 "converting to DataObject",
102 T* obj = reinterpret_cast<T*>(voidPtr);
103 pObj = SG::asStorable(obj);
104 return(StatusCode::SUCCESS);
106 //__________________________________________________________________________
108 Placement T_AthenaPoolCnvBase<T>::setPlacement(const std::string& key, const std::string& output) {
109 const std::string typenm = ClassName<T>::name();
110 return(setPlacementWithType(typenm, key, output));