ROOT  6.07/01
Reference Guide
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
TPluginManager.h
Go to the documentation of this file.
1 // @(#)root/base:$Id$
2 // Author: Fons Rademakers 26/1/2002
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2002, Rene Brun and Fons Rademakers. *
6  * All rights reserved. *
7  * *
8  * For the licensing terms see $ROOTSYS/LICENSE. *
9  * For the list of contributors see $ROOTSYS/README/CREDITS. *
10  *************************************************************************/
11 
12 #ifndef ROOT_TPluginManager
13 #define ROOT_TPluginManager
14 
15 
16 //////////////////////////////////////////////////////////////////////////
17 // //
18 // TPluginManager //
19 // //
20 // This class implements a plugin library manager. It keeps track of //
21 // a list of plugin handlers. A plugin handler knows which plugin //
22 // library to load to get a specific class that is used to extend the //
23 // functionality of a specific base class and how to create an object //
24 // of this class. For example, to extend the base class TFile to be //
25 // able to read RFIO files one needs to load the plugin library //
26 // libRFIO.so which defines the TRFIOFile class. This loading should //
27 // be triggered when a given URI contains a regular expression defined //
28 // by the handler. //
29 // Plugin handlers can be defined via macros in a list of plugin //
30 // directories. With $ROOTSYS/etc/plugins the default top plugin //
31 // directory specified in $ROOTSYS/etc/system.rootrc. Additional //
32 // directories can be specified by adding them to the end of the list. //
33 // Macros for identical plugin handlers in later directories will //
34 // override previous ones (the inverse of normal search path behavior). //
35 // The macros must have names like <BaseClass>/PX0_<PluginClass>.C, //
36 // e.g.: //
37 // TFile/P10_TRFIOFile.C, TSQLServer/P20_TMySQLServer.C, etc. //
38 // to allow easy sorting and grouping. If the BaseClass is in a //
39 // namespace the directory must have the name NameSpace@@BaseClass as //
40 // : is a reserved pathname character on some operating systems. //
41 // Macros not beginning with 'P' and ending with ".C" are ignored. //
42 // These macros typically look like: //
43 // //
44 // void P10_TDCacheFile() //
45 // { //
46 // gPluginMgr->AddHandler("TFile", "^dcache", "TDCacheFile", //
47 // "DCache", "TDCacheFile(const char*,Option_t*)"); //
48 // } //
49 // //
50 // Plugin handlers can also be defined via resources in the .rootrc //
51 // file. Although now deprecated this method still works for backward //
52 // compatibility, e.g.: //
53 // //
54 // Plugin.TFile: ^rfio: TRFIOFile RFIO "<constructor>" //
55 // Plugin.TSQLServer: ^mysql: TMySQLServer MySQL "<constructor>" //
56 // +Plugin.TSQLServer: ^pgsql: TPgSQLServer PgSQL "<constructor>" //
57 // Plugin.TVirtualFitter: * TFitter Minuit "TFitter(Int_t)" //
58 // //
59 // Where the + in front of Plugin.TSQLServer says that it extends the //
60 // existing definition of TSQLServer, useful when there is more than //
61 // one plugin that can extend the same base class. The "<constructor>" //
62 // should be the constructor or a static method that generates an //
63 // instance of the specified class. Global methods should start with //
64 // "::" in their name, like "::CreateFitter()". //
65 // Instead of being a shared library a plugin can also be a CINT //
66 // script, so instead of libDialog.so one can have Dialog.C. //
67 // The * is a placeholder in case there is no need for a URI to //
68 // differentiate between different plugins for the same base class. //
69 // For the default plugins see $ROOTSYS/etc/system.rootrc. //
70 // //
71 // Plugin handlers can also be registered at run time, e.g.: //
72 // //
73 // gPluginMgr->AddHandler("TSQLServer", "^sapdb:", //
74 // "TSapDBServer", "SapDB", //
75 // "TSapDBServer(const char*,const char*, const char*)"); //
76 // //
77 // A list of currently defined handlers can be printed using: //
78 // //
79 // gPluginMgr->Print(); // use option="a" to see ctors //
80 // //
81 // The use of the plugin library manager removes all textual references //
82 // to hard-coded class and library names and the resulting dependencies //
83 // in the base classes. The plugin manager is used to extend a.o. //
84 // TFile, TSQLServer, TGrid, etc. functionality. //
85 // //
86 //////////////////////////////////////////////////////////////////////////
87 
88 #ifndef ROOT_TObject
89 #include "TObject.h"
90 #endif
91 #ifndef ROOT_TString
92 #include "TString.h"
93 #endif
94 #ifndef ROOT_TMethodCall
95 #include "TMethodCall.h"
96 #endif
97 #ifndef ROOT_TVirtualMutex
98 #include "TVirtualMutex.h"
99 #endif
100 #ifndef ROOT_TInterpreter
101 #include "TInterpreter.h"
102 #endif
103 
104 class TEnv;
105 class TList;
106 class THashTable;
107 class TFunction;
108 class TMethodCall;
109 class TPluginManager;
110 
111 
112 class TPluginHandler : public TObject {
113 
114 friend class TPluginManager;
115 
116 private:
117  TString fBase; // base class which will be extended by plugin
118  TString fRegexp; // regular expression which must be matched in URI
119  TString fClass; // class to be loaded from plugin library
120  TString fPlugin; // plugin library which should contain fClass
121  TString fCtor; // ctor used to instantiate object of fClass
122  TString fOrigin; // origin of plugin handler definition
123  TMethodCall *fCallEnv; //!ctor method call environment
124  TFunction *fMethod; //!ctor method or global function
125  Int_t fCanCall; //!if 1 fCallEnv is ok, -1 fCallEnv is not ok
126  Bool_t fIsMacro; // plugin is a macro and not a library
127  Bool_t fIsGlobal; // plugin ctor is a global function
128 
130  fBase(), fRegexp(), fClass(), fPlugin(), fCtor(), fOrigin(),
132  TPluginHandler(const char *base, const char *regexp,
133  const char *className, const char *pluginName,
134  const char *ctor, const char *origin);
135  TPluginHandler(const TPluginHandler&); // not implemented
136  TPluginHandler& operator=(const TPluginHandler&); // not implemented
137 
138  ~TPluginHandler();
139 
140  const char *GetBase() const { return fBase; }
141  const char *GetRegexp() const { return fRegexp; }
142  const char *GetPlugin() const { return fPlugin; }
143  const char *GetCtor() const { return fCtor; }
144  const char *GetOrigin() const { return fOrigin; }
145 
146  Bool_t CanHandle(const char *base, const char *uri);
147  void SetupCallEnv();
148 
150 
151 public:
152  const char *GetClass() const { return fClass; }
153  Int_t CheckPlugin() const;
154  Int_t LoadPlugin();
155 
156  template <typename... T> Long_t ExecPluginImpl(const T&... params)
157  {
158  auto nargs = sizeof...(params);
159  if (!CheckForExecPlugin(nargs)) return 0;
160 
161  fCallEnv->SetParams(params...);
162 
163  Long_t ret;
164  fCallEnv->Execute(ret);
165 
166  return ret;
167  }
168 
169  template <typename... T> Long_t ExecPlugin(int nargs, const T&... params)
170  {
171  // For backward compatibility.
172  if ((gDebug > 1) && (nargs != (int)sizeof...(params))) {
173  Warning("ExecPlugin","Announced number of args different from the real number of argument passed %d vs %lu",
174  nargs, (unsigned long)sizeof...(params) );
175  }
176  return ExecPluginImpl(params...);
177  }
178 
179  void Print(Option_t *opt = "") const;
180 
181  ClassDef(TPluginHandler,3) // Handler for plugin libraries
182 };
183 
184 
185 class TPluginManager : public TObject {
186 
187 private:
188  TList *fHandlers; // list of plugin handlers
189  THashTable *fBasesLoaded; //! table of base classes already checked or loaded
190  Bool_t fReadingDirs; //! true if we are running LoadHandlersFromPluginDirs
191 
192  TPluginManager(const TPluginManager& pm); // not implemented
193  TPluginManager& operator=(const TPluginManager& pm); // not implemented
194  void LoadHandlerMacros(const char *path);
195 
196 public:
198  ~TPluginManager();
199 
200  void LoadHandlersFromEnv(TEnv *env);
201  void LoadHandlersFromPluginDirs(const char *base = 0);
202  void AddHandler(const char *base, const char *regexp,
203  const char *className, const char *pluginName,
204  const char *ctor = 0, const char *origin = 0);
205  void RemoveHandler(const char *base, const char *regexp = 0);
206 
207  TPluginHandler *FindHandler(const char *base, const char *uri = 0);
208 
209  void Print(Option_t *opt = "") const;
210  Int_t WritePluginMacros(const char *dir, const char *plugin = 0) const;
211  Int_t WritePluginRecords(const char *envFile, const char *plugin = 0) const;
212 
213  ClassDef(TPluginManager,1) // Manager for plugin handlers
214 };
215 
217 
218 #endif
TPluginHandler & operator=(const TPluginHandler &)
void LoadHandlerMacros(const char *path)
Load all plugin macros from the specified path/base directory.
const char Option_t
Definition: RtypesCore.h:62
Int_t WritePluginRecords(const char *envFile, const char *plugin=0) const
Write in the specified environment config file the plugin records.
void regexp()
Definition: regexp.C:34
THashTable * fBasesLoaded
void RemoveHandler(const char *base, const char *regexp=0)
Remove handler for the specified base class and the specified regexp.
void Print(Option_t *opt="") const
Print info about the plugin handler.
TPluginHandler * FindHandler(const char *base, const char *uri=0)
Returns the handler if there exists a handler for the specified URI.
void LoadHandlersFromEnv(TEnv *env)
Load plugin handlers specified in config file, like: Plugin.TFile: ^rfio: TRFIOFile RFI...
Int_t LoadPlugin()
Load the plugin library for this handler.
The TEnv class reads config files, by default named .rootrc.
Definition: TEnv.h:128
Basic string class.
Definition: TString.h:137
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kFALSE
Definition: Rtypes.h:92
Long_t ExecPluginImpl(const T &...params)
Long_t ExecPlugin(int nargs, const T &...params)
TTree * T
void SetupCallEnv()
Setup ctor or static method call environment.
THashTable implements a hash table to store TObject's.
Definition: THashTable.h:39
#define ClassDef(name, id)
Definition: Rtypes.h:254
const char * GetRegexp() const
void LoadHandlersFromPluginDirs(const char *base=0)
Load plugin handlers specified via macros in a list of plugin directories.
TMethodCall * fCallEnv
const char * GetOrigin() const
Bool_t CheckForExecPlugin(Int_t nargs)
Check that we can properly run ExecPlugin.
Method or function calling interface.
Definition: TMethodCall.h:41
R__EXTERN TPluginManager * gPluginMgr
A doubly linked list.
Definition: TList.h:47
const char * GetPlugin() const
iterplugin * plugin
Definition: runplugin.C:3
void AddHandler(const char *base, const char *regexp, const char *className, const char *pluginName, const char *ctor=0, const char *origin=0)
Add plugin handler to the list of handlers.
Bool_t fReadingDirs
table of base classes already checked or loaded
This class implements a plugin library manager.
long Long_t
Definition: RtypesCore.h:50
void dir(char *path=0)
Definition: rootalias.C:30
TPluginManager & operator=(const TPluginManager &pm)
Bool_t fIsMacro
if 1 fCallEnv is ok, -1 fCallEnv is not ok
void Print(Option_t *opt="") const
Print list of registered plugin handlers.
Mother of all ROOT objects.
Definition: TObject.h:58
const char * GetCtor() const
Global functions class (global functions are obtained from CINT).
Definition: TFunction.h:30
Bool_t CanHandle(const char *base, const char *uri)
Check if regular expression appears in the URI, if so return kTRUE.
#define R__EXTERN
Definition: DllImport.h:27
Int_t WritePluginMacros(const char *dir, const char *plugin=0) const
Write in the specified directory the plugin macros.
Int_t CheckPlugin() const
Check if the plugin library for this handler exits.
const char * GetBase() const
void Execute(const char *, const char *, int *=0)
Execute method on this object with the given parameter string, e.g.
Definition: TMethodCall.h:68
Int_t fCanCall
ctor method or global function
void SetParams(const T &...params)
Definition: TMethodCall.h:108
R__EXTERN Int_t gDebug
Definition: Rtypes.h:128
~TPluginHandler()
Cleanup plugin handler object.
const char * GetClass() const
TFunction * fMethod
ctor method call environment
const Bool_t kTRUE
Definition: Rtypes.h:91
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition: TObject.cxx:904