VFSSvc.cpp
Go to the documentation of this file.
1 #include "VFSSvc.h"
2 
4 #include "GaudiKernel/IToolSvc.h"
5 #include "GaudiKernel/IAlgTool.h"
6 
8 
9 //------------------------------------------------------------------------------
10 StatusCode VFSSvc::initialize() {
12  if (sc.isFailure()) return sc;
13 
14 
15  m_toolSvc = serviceLocator()->service("ToolSvc");
16  if (!m_toolSvc){
17  error() << "Cannot locate ToolSvc" << endmsg;
18  return StatusCode::FAILURE;
19  }
20 
21  IAlgTool *tool;
22  for(const auto& i : m_urlHandlersNames) {
23  // retrieve the tool and the pointer to the interface
24  sc = m_toolSvc->retrieve(i,IAlgTool::interfaceID(),tool,nullptr,true);
25  if (sc.isFailure()){
26  error() << "Cannot get tool " << i << endmsg;
27  return sc;
28  }
29  m_acquiredTools.push_back(tool); // this is one tool that we will have to release
30  auto hndlr = SmartIF<IFileAccess>(tool);
31  if (!hndlr){
32  error() << i << " does not implement IFileAccess" << endmsg;
33  return StatusCode::FAILURE;
34  }
35  // We do not need to increase the reference count for the IFileAccess interface
36  // because we hold the tool by its IAlgTool interface.
37  // loop over the list of supported protocols and add them to the map (for quick access)
38  for ( const auto& prot : hndlr->protocols() ) m_urlHandlers[prot] = hndlr.get();
39  }
40 
41  // Now let's check if we can handle the fallback protocol
42  if ( m_urlHandlers.find(m_fallBackProtocol) == m_urlHandlers.end() ) {
43  error() << "No handler specified for fallback protocol prefix "
44  << m_fallBackProtocol.value() << endmsg;
45  return StatusCode::FAILURE;
46  }
47 
48  // Note: the list of handled protocols will be filled only if requested
49 
50  return sc;
51 }
52 //------------------------------------------------------------------------------
54  m_urlHandlers.clear(); // clear the map
56 
57  if (m_toolSvc) {
58  // release the acquired tools (from the last acquired one)
59  while ( !m_acquiredTools.empty() ){
62  }
63  m_toolSvc.reset() ; // release the tool service
64  }
65  return Service::finalize();
66 }
67 //------------------------------------------------------------------------------
69 
70  // get the url prefix endpos
71  auto pos = url.find("://");
72 
73  if (std::string::npos == pos) { // no url prefix
74  return m_urlHandlers[m_fallBackProtocol]->open(url);
75  }
76 
77  std::string url_prefix(url,0,pos);
78  if ( m_urlHandlers.find(url_prefix) == m_urlHandlers.end() ) {
79  // if we do not have a handler for the URL prefix,
80  // use the fall back one and pass only the path
81  return m_urlHandlers[m_fallBackProtocol]->open(url.substr(pos+3));
82  }
83  return m_urlHandlers[url_prefix]->open(url);
84 }
85 //------------------------------------------------------------------------------
86 namespace {
89  constexpr struct select1st_t
90  {
91  template <typename S, typename T>
92  const S& operator() (const std::pair<S,T> &x) const { return x.first; }
93  } select1st {} ;
94 }
95 
97 {
98  if (m_protocols.empty()){
99  // prepare the list of handled protocols
101  std::back_inserter(const_cast<VFSSvc*>(this)->m_protocols),
102  select1st );
103  }
104  return m_protocols;
105 }
SmartIF< IToolSvc > m_toolSvc
Handle to the tool service.
Definition: VFSSvc.h:58
StatusCode initialize() override
Definition: Service.cpp:64
std::unique_ptr< std::istream > open(const std::string &url) override
Definition: VFSSvc.cpp:68
T empty(T...args)
std::vector< std::string > m_protocols
Protocols registered.
Definition: VFSSvc.h:52
StatusCode finalize() override
Definition: Service.cpp:174
GaudiUtils::HashMap< std::string, IFileAccess * > m_urlHandlers
Map of the tools handling the known protocols.
Definition: VFSSvc.h:55
const std::vector< std::string > & protocols() const override
Definition: VFSSvc.cpp:96
bool isFailure() const
Test for a status code of FAILURE.
Definition: StatusCode.h:84
#define DECLARE_COMPONENT(type)
Definition: PluginService.h:36
STL class.
iterator end()
Definition: Map.h:132
This class is used for returning status codes from appropriate routines.
Definition: StatusCode.h:26
iterator find(const key_type &key)
Definition: Map.h:149
T pop_back(T...args)
Gaudi::Property< std::string > m_fallBackProtocol
Definition: VFSSvc.h:48
T clear(T...args)
iterator begin()
Definition: Map.h:131
T find(T...args)
STL class.
StatusCode finalize() override
Finalize Service.
Definition: VFSSvc.cpp:53
T back_inserter(T...args)
std::vector< IAlgTool * > m_acquiredTools
List of acquired tools (needed to release them).
Definition: VFSSvc.h:61
The interface implemented by the AlgTool base class.
Definition: IAlgTool.h:23
T back(T...args)
T substr(T...args)
void clear()
Definition: Map.h:178
virtual StatusCode releaseTool(IAlgTool *tool)=0
Release the tool.
T transform(T...args)
void reset(TYPE *ptr=nullptr)
Set the internal pointer to the passed one disposing of the old one.
Definition: SmartIF.h:88
Simple service that allows to read files independently from the storage.
Definition: VFSSvc.h:26
static const InterfaceID & interfaceID()
Return an instance of InterfaceID identifying the interface.
Definition: IInterface.h:243
MsgStream & endmsg(MsgStream &s)
MsgStream Modifier: endmsg. Calls the output method of the MsgStream.
Definition: MsgStream.h:244