ManagerRegister.cc
Go to the documentation of this file.
1 #include <det/VManagerBuilder.h>
2 #include <utl/ErrorLogger.h>
3 #include <utl/Reader.h>
4 #include <utl/String.h>
5 #include <utl/AugerException.h>
6 #include <det/ManagerRegister.h>
7 
8 using namespace std;
9 using namespace utl;
10 
11 
12 namespace det {
13 
14 void
15 ManagerRegister::Configure(const Branch branch)
16 {
17  InterpretXML(branch);
18 }
19 
20 
21 void
22 ManagerRegister::Configure(const ostringstream& configInstructions)
23 {
24  const ReaderStringInput readerInput(configInstructions);
25  Reader reader(readerInput);
26  const Branch topB = reader.GetTopBranch();
27  InterpretXML(topB);
28 }
29 
30 
31 void
32 ManagerRegister::InterpretXML(const Branch& topB)
33 {
34  fConfiguredManagerList.clear();
35 
36  for (Branch managerB = topB.GetFirstChild(); managerB;
37  managerB = managerB.GetNextSibling()) {
38 
39  if (managerB.GetName() != "manager")
40  throw XMLParseException("Malformed manager specification, should be <manager>!");
41 
42  string managerName;
43  managerB.GetData(managerName);
44 
45  if (fManagerBuilderRegister.empty()) {
46  ostringstream err;
47  err << "Unable to create manager " << managerName << " "
48  "since the list of manager builders is empty.";
49  throw XMLParseException(err.str());
50  }
51 
52  const ManagerBuilderMap::const_iterator mIt =
53  fManagerBuilderRegister.find(managerName);
54 
55  if (mIt == fManagerBuilderRegister.end()) {
56 
57  ostringstream err;
58  err << "The requested manager builder '" << managerName << "' does not exist. "
59  "Available manager builders: " << String::OfMapKeys(fManagerBuilderRegister);
60  throw XMLParseException(err.str());
61 
62  } else {
63 
64  VManagerBuilder* const managerBuilder = mIt->second;
65  VManager& manager = managerBuilder->GetManager();
66  // Initialize the manager
67  // Note that the configLink must be the manager name,
68  // as defined during the manager construction in the Detector singleton
69  manager.SetName(managerName);
70  manager.Init(managerName);
71  if (manager.IsInitialized())
72  fConfiguredManagerList.push_back(&manager);
73  else {
74  ostringstream warn;
75  warn << "Manager '" << managerName << "' failed to initialize properly!";
76  WARNING(warn);
77  }
78 
79  }
80 
81  }
82 }
83 
84 VManager&
85 ManagerRegister::GetManager(const string& managerName)
86 {
87  // Regarding all this circumlocution see det::ComponentGroup::Get(int id).
88  return const_cast<VManager&>(static_cast<const ManagerRegister&>(*this).GetManager(managerName));
89 }
90 
91 
92 
93 const VManager&
94 ManagerRegister::GetManager(const string& managerName)
95 const
96 {
97  if (fConfiguredManagerList.empty()) {
98  ostringstream err;
99  err << "List of initialized managers in '" << GetName() << " is empty.";
100  throw NonExistentComponentException(err.str());
101  }
102 
103  for (ManagerIterator it = ManagersBegin(); it != ManagersEnd(); ++it)
104  if (it->GetName() == managerName)
105  return *it;
106 
107  ostringstream err;
108  err << "The requested manager '" << managerName
109  << "' does not exist or is not initialized. "
110  "Available managers: " << GetConfiguredManagerListString();
111  throw NonExistentComponentException(err.str());
112 }
113 
114 
115 void
116 ManagerRegister::RegisterBuilder(const string& name, VManagerBuilder& builder)
117 {
118  if (fManagerBuilderRegister.find(name) != fManagerBuilderRegister.end()) {
119  ostringstream warn;
120  warn << "Attempt to register more than one manager builder for manager with "
121  "name '" << name << "'. Only the last registered manager builder will be used!";
122  WARNING(warn);
123  }
124 
125  fManagerBuilderRegister.insert(make_pair(name, &builder));
126 }
127 
128 
129 string
130 ManagerRegister::GetConfiguredManagerListString()
131  const
132 {
133  if (fConfiguredManagerList.empty())
134  return "";
135 
136  ostringstream managers;
137  ManagerIterator it = ManagersBegin();
138  managers << it->GetName();
139  for (++it; it != ManagersEnd(); ++it)
140  managers << ", " << it->GetName();
141 
142  return managers.str();
143 }
144 
145 
146 // static
147 void
148 ManagerRegister::NotFoundAndThrow(const Handle& returnData,
149  const string& component,
150  const string& property,
151  const IndexMap& index)
152 {
153  ostringstream err;
154  err << "Get data failure for "
155  << QueryInfoMessage(returnData, component, property, index);
156  ERROR(err);
157  throw NonExistentComponentException(err.str());
158 }
159 
160 }
void SetName(const std::string &name)
Definition: VManager.h:332
Branch GetTopBranch() const
Definition: Branch.cc:63
VManager & GetManager()
Base class for exceptions trying to access non-existing components.
bool IsInitialized() const
Definition: VManager.h:214
Interface for detector managers.
Definition: VManager.h:115
Exception for errors encountered when parsing XML.
virtual void Init(const std::string &configLink)
Manager Initialization. configLink is the CentralConfig hook for the configuration file...
Definition: VManager.cc:16
Branch GetNextSibling() const
Get next sibling of this branch.
Definition: Branch.cc:284
Utility for parsing XML files.
Definition: Reader.h:25
Class representing a document branch.
Definition: Branch.h:107
boost::indirect_iterator< InternalManagerIterator, VManager & > ManagerIterator
Iterator over configured managers.
This just defines a type which holds some character data to be parsed by the Reader.
Definition: Reader.h:88
#define WARNING(message)
Macro for logging warning messages.
Definition: ErrorLogger.h:163
const VManager & GetManager(const std::string &managerName) const
Get a specific manager by name.
std::map< std::string, std::string > IndexMap
Definition: VManager.h:133
Register for detector description managers.
std::string OfMapKeys(const Map &m, const std::string &quote="'", const std::string &separator=", ")
Definition: String.h:116
Branch GetFirstChild() const
Get first child of this Branch.
Definition: Branch.cc:98
#define ERROR(message)
Macro for logging error messages.
Definition: ErrorLogger.h:165

, generated on Tue Sep 26 2023.