Diana Software
QGeneralFactory.cc
Go to the documentation of this file.
1 #include "QGeneralFactory.hh"
2 #include "QMessage.hh"
3 #include "QDll.hh"
4 
6 
8 {
9  static QGeneralFactory factory;
10  return factory;
11 }
12 
14 {
16  std::string pluginListFile = "plugins.list";
17  QError err = fDLLLoader->Init(pluginListFile,std::string(Q_PLUGIN_PREFIX_STR));
18  if(err!=QERR_SUCCESS) QMessageHandler::Panic(GetName(), std::string(err.ToString()) + " - " + err.GetDescription());
19 
20  // load external plugins
21  pluginListFile = "diana_plugins_external.list";
22  err = fDLLLoader->Init(pluginListFile,std::string(Q_PLUGIN_PREFIX_STR));
23  if(err!=QERR_SUCCESS) QMessageHandler::Debug(GetName(), std::string(err.ToString()) + " - " + err.GetDescription());
24 }
25 
27 {
28  std::map<std::string, QModFactory<QModule>* >::iterator ModulesIter;
29  std::map<std::string, QModFactory<QFilter>* >::iterator FiltersIter;
30  std::map<std::string, QModFactory<QReader>* >::iterator ReadersIter;
31  std::map<std::string, QModFactory<QWriter>* >::iterator WritersIter;
32  std::map<std::string, QModFactory<QDriver>* >::iterator DriversIter;
33 
34 
35  for(ModulesIter = fModules.begin(); ModulesIter != fModules.end(); ModulesIter++)
36  if(ModulesIter->second) delete ModulesIter->second;
37 
38  for(FiltersIter = fFilters.begin(); FiltersIter != fFilters.end(); FiltersIter++)
39  if(FiltersIter->second) delete FiltersIter->second;
40 
41  for(ReadersIter = fReaders.begin(); ReadersIter != fReaders.end(); ReadersIter++)
42  if(ReadersIter->second) delete ReadersIter->second;
43 
44  for(WritersIter = fWriters.begin(); WritersIter != fWriters.end(); WritersIter++)
45  if(WritersIter->second) delete WritersIter->second;
46 
47  for(DriversIter = fDrivers.begin(); DriversIter != fDrivers.end(); DriversIter++)
48  if(DriversIter->second) delete DriversIter->second;
49 
50 }
51 
52 void QGeneralFactory::LoadPlugin(const std::string& name)
53 {
54  std::string fullName = name;
55  QError err = fDLLLoader->LoadPlugin(fullName);
56  if(err!=QERR_SUCCESS) QMessageHandler::Error(GetName(), std::string(err.ToString()) + " - " + err.GetDescription());
57 }
58 // QModule
60 {
61  std::map<std::string, QModFactory<QModule>* >::iterator iter;
62  iter = fModules.find(MF->GetName());
63  if(iter == fModules.end()) {
64  fModules[MF->GetName()] = MF;
65  QMessageHandler::Debug(GetName(), std::string("Registered module : ") + MF->GetName());
66  } else {
67  QMessageHandler::Debug(GetName(), std::string("Already registered: ") + MF->GetName());
68  delete MF;
69  }
70 }
71 
72 QModule* QGeneralFactory::CreateModule(const std::string& name, QSequence* s)
73 {
74  std::map<std::string, QModFactory<QModule>* >::iterator iter;
75  iter = fModules.find(name);
76  // if not yet registered, try to register automatically
77  if(iter == fModules.end() ){
78  LoadPlugin(name);
79  iter = fModules.find(name);
80  }
81  if(iter!=fModules.end() && iter->second != NULL)
82  return iter->second->Create(s);
83  return NULL;
84 }
85 
86 
87 // QWriter
89 {
90  std::map<std::string, QModFactory<QWriter>* >::iterator iter;
91  iter = fWriters.find(MF->GetName());
92  if(iter == fWriters.end()) {
93  fWriters[MF->GetName()] = MF;
94  QMessageHandler::Debug(GetName(), std::string("Registered writer : ") + MF->GetName());
95  } else {
96  QMessageHandler::Debug(GetName(), std::string("Already registered: ") + MF->GetName());
97  delete MF;
98  }
99 }
100 
101 QWriter* QGeneralFactory::CreateWriter(const std::string& name, QSequence* s)
102 {
103  std::map<std::string, QModFactory<QWriter>* >::iterator iter;
104  iter = fWriters.find(name);
105  // if not yet registered, try to register automatically
106  if(iter == fWriters.end() ){
107  LoadPlugin(name);
108  iter = fWriters.find(name);
109  }
110  if(iter!=fWriters.end() && iter->second != NULL)
111  return iter->second->Create(s);
112  return NULL;
113 }
114 
115 // QReader
117 {
118  std::map<std::string, QModFactory<QReader>* >::iterator iter;
119  iter = fReaders.find(MF->GetName());
120  if(iter == fReaders.end()) {
121  fReaders[MF->GetName()] = MF;
122  QMessageHandler::Debug(GetName(), std::string("Registered reader : ") + MF->GetName());
123  } else {
124  QMessageHandler::Debug(GetName(), std::string("Already registered: ") + MF->GetName());
125  delete MF;
126  }
127 }
128 
129 QReader* QGeneralFactory::CreateReader(const std::string& name, QSequence* s)
130 {
131  std::map<std::string, QModFactory<QReader>* >::iterator iter;
132  iter = fReaders.find(name);
133  // if not yet registered, try to register automatically
134  if(iter == fReaders.end() ){
135  LoadPlugin(name);
136  iter = fReaders.find(name);
137  }
138  if(iter!=fReaders.end() && iter->second != NULL)
139  return iter->second->Create(s);
140  return NULL;
141 }
142 
143 // QFilter
145 {
146  std::map<std::string, QModFactory<QFilter>* >::iterator iter;
147  iter = fFilters.find(MF->GetName());
148  if(iter == fFilters.end()) {
149  fFilters[MF->GetName()] = MF;
150  QMessageHandler::Debug(GetName(), std::string("Registered filter : ") + MF->GetName());
151  } else {
152  QMessageHandler::Debug(GetName(), std::string("Already registered: ") + MF->GetName());
153  delete MF;
154  }
155 }
156 
157 QFilter* QGeneralFactory::CreateFilter(const std::string& name, QSequence* s)
158 {
159  std::map<std::string, QModFactory<QFilter>* >::iterator iter;
160  iter = fFilters.find(name);
161  // if not yet registered, try to register automatically
162  if(iter == fFilters.end() ){
163  LoadPlugin(name);
164  iter = fFilters.find(name);
165  }
166  if(iter!=fFilters.end() && iter->second != NULL)
167  return iter->second->Create(s);
168  return NULL;
169 }
170 // QDriver
172 {
173  std::map<std::string, QModFactory<QDriver>* >::iterator iter;
174  iter = fDrivers.find(MF->GetName());
175  if(iter == fDrivers.end()) {
176  fDrivers[MF->GetName()] = MF;
177  QMessageHandler::Debug(GetName(), std::string("Registered driver : ") + MF->GetName());
178  } else {
179  QMessageHandler::Debug(GetName(), std::string("Already registered: ") + MF->GetName());
180  delete MF;
181  }
182 }
183 
184 QDriver* QGeneralFactory::CreateDriver(const std::string& name, QSequence* s)
185 {
186  std::map<std::string, QModFactory<QDriver>* >::iterator iter;
187  iter = fDrivers.find(name);
188  // if not yet registered, try to register automatically
189  if(iter == fDrivers.end() ){
190  LoadPlugin(name);
191  iter = fDrivers.find(name);
192  }
193  if(iter!=fDrivers.end() && iter->second != NULL)
194  return iter->second->Create(s);
195  return NULL;
196 }
197 
err
Definition: CheckOF.C:114
#define Q_END_NAMESPACE
Definition: QDiana.hh:22
#define Q_BEGIN_NAMESPACE
Definition: QDiana.hh:20
@ QERR_SUCCESS
Definition: QError.hh:27
#define Q_PLUGIN_PREFIX_STR
static QDLLLoader & GetInstance()
Definition: QDll.cc:44
QError LoadPlugin(const std::string &name)
Definition: QDll.cc:132
QError Init(const std::string &pluginlist, const std::string &pluginPrefix)
Definition: QDll.cc:58
Base class for diana drivers.
Definition: QDriver.hh:32
error class with error type and description
Definition: QError.hh:115
Base class for diana filters.
Definition: QFilter.hh:57
This class take care of plugin registration and creation.
std::map< std::string, QModFactory< QModule > * > fModules
std::map< std::string, QModFactory< QReader > * > fReaders
QFilter * CreateFilter(const std::string &name, QSequence *s)
static QGeneralFactory & GetInstance()
std::map< std::string, QModFactory< QFilter > * > fFilters
QWriter * CreateWriter(const std::string &name, QSequence *s)
void LoadPlugin(const std::string &name)
std::map< std::string, QModFactory< QWriter > * > fWriters
void Register(QModFactory< QModule > *MF)
std::map< std::string, QModFactory< QDriver > * > fDrivers
QDLLLoader * fDLLLoader
QModule * CreateModule(const std::string &name, QSequence *s)
QReader * CreateReader(const std::string &name, QSequence *s)
virtual ~QGeneralFactory()
QDriver * CreateDriver(const std::string &name, QSequence *s)
static void Debug(const std::string &sender, const std::string &msg)
Definition: QMessage.hh:41
static void Panic(const std::string &sender, const std::string &msg)
Definition: QMessage.hh:43
static void Error(const std::string &sender, const std::string &msg)
Definition: QMessage.hh:42
abstract module factory and definition of macros that builds modulefactories and register function.
const std::string & GetName() const
Base class for diana modules.
Definition: QModule.hh:54
base class for anything that has a name
Definition: QNamed.hh:14
const std::string & GetName() const
Definition: QNamed.hh:19
Base class for diana event readers.
Definition: QReader.hh:50
Diana Reconstruction program.
Definition: QSequence.hh:40
Abstract class for diana writers.
Definition: QWriter.hh:30