Logo ROOT   6.14/05
Reference Guide
TRootSniffer.h
Go to the documentation of this file.
1 // $Id$
2 // Author: Sergey Linev 22/12/2013
3 
4 /*************************************************************************
5  * Copyright (C) 1995-2013, 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_TRootSniffer
13 #define ROOT_TRootSniffer
14 
15 #include "TNamed.h"
16 
17 #include "TList.h"
18 
19 class TFolder;
20 class TKey;
21 class TBufferFile;
22 class TDataMember;
23 class THttpCallArg;
24 class TRootSnifferStore;
25 class TRootSniffer;
26 
28 
29  friend class TRootSniffer;
30 
31 protected:
32  // different bits used to scan hierarchy
33  enum {
34  kScan = 0x0001, ///< normal scan of hierarchy
35  kExpand = 0x0002, ///< expand of specified item - allowed to scan object members
36  kSearch = 0x0004, ///< search for specified item (only objects and collections)
37  kCheckChilds = 0x0008, ///< check if there childs, very similar to search
38  kOnlyFields = 0x0010, ///< if set, only fields for specified item will be set (but all fields)
39  kActions = 0x001F ///< mask for actions, only actions copied to child rec
40  };
41 
42  TRootSnifferScanRec *fParent{nullptr}; ///<! pointer on parent record
43  UInt_t fMask{0}; ///<! defines operation kind
44  const char *fSearchPath{nullptr}; ///<! current path searched
45  Int_t fLevel{0}; ///<! current level of hierarchy
46  TString fItemName{}; ///<! name of current item
47  TList fItemsNames{}; ///<! list of created items names, need to avoid duplication
48  Int_t fRestriction{0}; ///<! restriction 0 - default, 1 - read-only, 2 - full access
49 
50  TRootSnifferStore *fStore{nullptr}; ///<! object to store results
51  Bool_t fHasMore{kFALSE}; ///<! indicates that potentially there are more items can be found
52  Bool_t fNodeStarted{kFALSE}; ///<! indicate if node was started
53  Int_t fNumFields{0}; ///<! number of fields
54  Int_t fNumChilds{0}; ///<! number of childs
55 
56 public:
58  virtual ~TRootSnifferScanRec();
59 
60  void CloseNode();
61 
62  /** return true when fields could be set to the hierarchy item */
63  Bool_t CanSetFields() const { return (fMask & kScan) && (fStore != nullptr); }
64 
65  /** return true when only fields are scanned by the sniffer */
66  Bool_t ScanOnlyFields() const { return (fMask & kOnlyFields) && (fMask & kScan); }
67 
68  /** Starts new node, must be closed at the end */
69  void CreateNode(const char *_node_name);
70 
71  void BeforeNextChild();
72 
73  /** Set item field only when creating is specified */
74  void SetField(const char *name, const char *value, Bool_t with_quotes = kTRUE);
75 
76  /** Mark item with ROOT class and correspondent streamer info */
77  void SetRootClass(TClass *cl);
78 
79  /** Returns true when item can be expanded */
81 
82  /** Checks if result will be accepted. Used to verify if sniffer should read object from the file */
83  Bool_t IsReadyForResult() const;
84 
85  /** Obsolete, use SetFoundResult instead */
86  Bool_t SetResult(void *obj, TClass *cl, TDataMember *member = nullptr);
87 
88  /** Set found element with class and datamember (optional) */
89  Bool_t SetFoundResult(void *obj, TClass *cl, TDataMember *member = nullptr);
90 
91  /** Returns depth of hierarchy */
92  Int_t Depth() const;
93 
94  /** Method indicates that scanning can be interrupted while result is set */
95  Bool_t Done() const;
96 
97  /** Construct item name, using object name as basis */
98  void MakeItemName(const char *objname, TString &itemname);
99 
100  /** Produces full name for the current item */
101  void BuildFullName(TString &buf, TRootSnifferScanRec *prnt = nullptr);
102 
103  /** Returns read-only flag for current item */
104  Bool_t IsReadOnly(Bool_t dflt = kTRUE);
105 
106  Bool_t GoInside(TRootSnifferScanRec &super, TObject *obj, const char *obj_name = nullptr,
107  TRootSniffer *sniffer = nullptr);
108 
109  ClassDef(TRootSnifferScanRec, 0) // Scan record for objects sniffer
110 };
111 
112 //_______________________________________________________________________
113 
114 class TRootSniffer : public TNamed {
115  enum {
116  kItemField = BIT(21) // item property stored as TNamed
117  };
118 
119 protected:
120  TString fObjectsPath; ///<! default path for registered objects
121  Bool_t fReadOnly{kTRUE}; ///<! indicate if sniffer allowed to change ROOT structures - like read objects from file
122  Bool_t fScanGlobalDir{kTRUE}; ///<! when enabled (default), scan gROOT for histograms, canvases, open files
123  THttpCallArg *fCurrentArg{nullptr}; ///<! current http arguments (if any)
124  Int_t fCurrentRestrict{0}; ///<! current restriction for last-found object
125  TString fCurrentAllowedMethods; ///<! list of allowed methods, extracted when analyzed object restrictions
126  TList fRestrictions; ///<! list of restrictions for different locations
127  TString fAutoLoad; ///<! scripts names, which are add as _autoload parameter to h.json request
128 
129  void ScanObjectMembers(TRootSnifferScanRec &rec, TClass *cl, char *ptr);
130 
131  virtual void ScanObjectProperties(TRootSnifferScanRec &rec, TObject *obj);
132 
133  virtual void ScanKeyProperties(TRootSnifferScanRec &rec, TKey *key, TObject *&obj, TClass *&obj_class);
134 
135  virtual void ScanObjectChilds(TRootSnifferScanRec &rec, TObject *obj);
136 
137  void
138  ScanCollection(TRootSnifferScanRec &rec, TCollection *lst, const char *foldername = nullptr, TCollection *keys_lst = nullptr);
139 
140  virtual void ScanRoot(TRootSnifferScanRec &rec);
141 
142  TString DecodeUrlOptionValue(const char *value, Bool_t remove_quotes = kTRUE);
143 
144  TObject *GetItem(const char *fullname, TFolder *&parent, Bool_t force = kFALSE, Bool_t within_objects = kTRUE);
145 
146  TFolder *GetSubFolder(const char *foldername, Bool_t force = kFALSE);
147 
148  const char *GetItemField(TFolder *parent, TObject *item, const char *name);
149 
150  Bool_t IsItemField(TObject *obj) const;
151 
152  Bool_t AccessField(TFolder *parent, TObject *item, const char *name, const char *value, TNamed **only_get = nullptr);
153 
154  Int_t WithCurrentUserName(const char *option);
155 
156  virtual Bool_t CanDrawClass(TClass *) { return kFALSE; }
157 
158  virtual Bool_t HasStreamerInfo() const { return kFALSE; }
159 
160  virtual Bool_t ProduceJson(const std::string &path, const std::string &options, std::string &res);
161 
162  virtual Bool_t ProduceXml(const std::string &path, const std::string &options, std::string &res);
163 
164  virtual Bool_t ProduceBinary(const std::string &path, const std::string &options, std::string &res);
165 
166  virtual Bool_t ProduceImage(Int_t kind, const std::string &path, const std::string &options, std::string &res);
167 
168  virtual Bool_t ProduceExe(const std::string &path, const std::string &options, Int_t reskind, std::string &res);
169 
170  virtual Bool_t ExecuteCmd(const std::string &path, const std::string &options, std::string &res);
171 
172  virtual Bool_t
173  ProduceItem(const std::string &path, const std::string &options, std::string &res, Bool_t asjson = kTRUE);
174 
175  virtual Bool_t
176  ProduceMulti(const std::string &path, const std::string &options, std::string &res, Bool_t asjson = kTRUE);
177 
178 public:
179  TRootSniffer(const char *name, const char *objpath = "Objects");
180  virtual ~TRootSniffer();
181 
182  /** When readonly on (default), sniffer is not allowed to change ROOT structures
183  * For instance, it is not allowed to read new objects from files */
184  void SetReadOnly(Bool_t on = kTRUE) { fReadOnly = on; }
185 
186  /** Returns readonly mode */
187  Bool_t IsReadOnly() const { return fReadOnly; }
188 
189  void Restrict(const char *path, const char *options);
190 
191  Bool_t HasRestriction(const char *item_name);
192 
193  Int_t CheckRestriction(const char *item_name);
194 
195  /** When enabled (default), sniffer scans gROOT for files, canvases, histograms */
196  void SetScanGlobalDir(Bool_t on = kTRUE) { fScanGlobalDir = on; }
197 
198  void SetAutoLoad(const char *scripts = "");
199 
200  const char *GetAutoLoad() const;
201 
202  /** Returns true when sniffer allowed to scan global directories */
203  Bool_t IsScanGlobalDir() const { return fScanGlobalDir; }
204 
205  Bool_t RegisterObject(const char *subfolder, TObject *obj);
206 
207  Bool_t UnregisterObject(TObject *obj);
208 
209  Bool_t RegisterCommand(const char *cmdname, const char *method, const char *icon);
210 
211  Bool_t CreateItem(const char *fullname, const char *title);
212 
213  Bool_t SetItemField(const char *fullname, const char *name, const char *value);
214 
215  const char *GetItemField(const char *fullname, const char *name);
216 
217  void SetCurrentCallArg(THttpCallArg *arg);
218 
219  /** Method scans normal objects, registered in ROOT */
220  void ScanHierarchy(const char *topname, const char *path, TRootSnifferStore *store, Bool_t only_fields = kFALSE);
221 
222  TObject *FindTObjectInHierarchy(const char *path);
223 
224  virtual void *
225  FindInHierarchy(const char *path, TClass **cl = nullptr, TDataMember **member = nullptr, Int_t *chld = nullptr);
226 
227  Bool_t CanDrawItem(const char *path);
228 
229  Bool_t CanExploreItem(const char *path);
230 
231  virtual Bool_t IsStreamerInfoItem(const char *) { return kFALSE; }
232 
233  virtual ULong_t GetStreamerInfoHash() { return 0; }
234 
235  virtual ULong_t GetItemHash(const char *itemname);
236 
237  Bool_t Produce(const char *path, const char *file, const char *options, void *&ptr, Long_t &length, TString &str) _R__DEPRECATED_618("Use signature with std::string");
238 
239  Bool_t Produce(const std::string &path, const std::string &file, const std::string &options, std::string &res);
240 
241  ClassDef(TRootSniffer, 0) // Sniffer of ROOT objects (basic version)
242 };
243 
244 #endif
TString fItemName
! name of current item
Definition: TRootSniffer.h:46
virtual Bool_t IsStreamerInfoItem(const char *)
Definition: TRootSniffer.h:231
A TFolder object is a collection of objects and folders.
Definition: TFolder.h:30
normal scan of hierarchy
Definition: TRootSniffer.h:34
Bool_t GoInside(TRootSnifferScanRec &super, TObject *obj, const char *obj_name=nullptr, TRootSniffer *sniffer=nullptr)
Method verifies if new level of hierarchy should be started with provided object. ...
The concrete implementation of TBuffer for writing/reading to/from a ROOT file or socket...
Definition: TBufferFile.h:46
UInt_t fMask
! defines operation kind
Definition: TRootSniffer.h:43
Bool_t IsReadOnly() const
Returns readonly mode.
Definition: TRootSniffer.h:187
void BeforeNextChild()
indicates that new child for current element will be started
Bool_t IsReadyForResult() const
Checks if result will be accepted.
All ROOT classes may have RTTI (run time type identification) support added.
Definition: TDataMember.h:31
virtual Bool_t CanDrawClass(TClass *)
Definition: TRootSniffer.h:156
#define BIT(n)
Definition: Rtypes.h:78
Bool_t SetFoundResult(void *obj, TClass *cl, TDataMember *member=nullptr)
Set found element with class and datamember (optional)
Basic string class.
Definition: TString.h:131
int Int_t
Definition: RtypesCore.h:41
bool Bool_t
Definition: RtypesCore.h:59
Int_t fRestriction
! restriction 0 - default, 1 - read-only, 2 - full access
Definition: TRootSniffer.h:48
Abstract interface for storage of hierarchy scan in TRootSniffer.
TString fCurrentAllowedMethods
! list of allowed methods, extracted when analyzed object restrictions
Definition: TRootSniffer.h:125
Bool_t SetResult(void *obj, TClass *cl, TDataMember *member=nullptr)
Obsolete, use SetFoundResult instead.
void CloseNode()
close started node
Bool_t CanExpandItem()
Returns true when item can be expanded.
Bool_t IsReadOnly(Bool_t dflt=kTRUE)
Returns read-only flag for current item.
mask for actions, only actions copied to child rec
Definition: TRootSniffer.h:39
#define ClassDef(name, id)
Definition: Rtypes.h:320
The TNamed class is the base class for all named ROOT classes.
Definition: TNamed.h:29
Bool_t ScanOnlyFields() const
return true when only fields are scanned by the sniffer
Definition: TRootSniffer.h:66
#define _R__DEPRECATED_618(REASON)
Definition: RConfig.h:500
const char * fSearchPath
! current path searched
Definition: TRootSniffer.h:44
expand of specified item - allowed to scan object members
Definition: TRootSniffer.h:35
virtual ULong_t GetStreamerInfoHash()
Definition: TRootSniffer.h:233
Book space in a file, create I/O buffers, to fill them, (un)compress them.
Definition: TKey.h:24
void SetRootClass(TClass *cl)
Mark item with ROOT class and correspondent streamer info.
Int_t fNumChilds
! number of childs
Definition: TRootSniffer.h:54
search for specified item (only objects and collections)
Definition: TRootSniffer.h:36
A doubly linked list.
Definition: TList.h:44
Int_t fLevel
! current level of hierarchy
Definition: TRootSniffer.h:45
Collection abstract base class.
Definition: TCollection.h:63
unsigned int UInt_t
Definition: RtypesCore.h:42
TString fObjectsPath
! default path for registered objects
Definition: TRootSniffer.h:120
Int_t fNumFields
! number of fields
Definition: TRootSniffer.h:53
The ROOT global object gROOT contains a list of all defined classes.
Definition: TClass.h:75
RooCmdArg Restrict(const char *catName, const char *stateNameList)
virtual ~TRootSnifferScanRec()
destructor
TString fAutoLoad
! scripts names, which are add as _autoload parameter to h.json request
Definition: TRootSniffer.h:127
TRootSnifferScanRec()
constructor
const Bool_t kFALSE
Definition: RtypesCore.h:88
long Long_t
Definition: RtypesCore.h:50
TList fItemsNames
! list of created items names, need to avoid duplication
Definition: TRootSniffer.h:47
check if there childs, very similar to search
Definition: TRootSniffer.h:37
void BuildFullName(TString &buf, TRootSnifferScanRec *prnt=nullptr)
Produces full name for the current item.
TRootSnifferStore * fStore
! object to store results
Definition: TRootSniffer.h:50
unsigned long ULong_t
Definition: RtypesCore.h:51
TRootSnifferScanRec * fParent
! pointer on parent record
Definition: TRootSniffer.h:42
Bool_t Done() const
Method indicates that scanning can be interrupted while result is set.
Mother of all ROOT objects.
Definition: TObject.h:37
Int_t Depth() const
Returns depth of hierarchy.
void SetField(const char *name, const char *value, Bool_t with_quotes=kTRUE)
Set item field only when creating is specified.
void SetReadOnly(Bool_t on=kTRUE)
When readonly on (default), sniffer is not allowed to change ROOT structures For instance, it is not allowed to read new objects from files.
Definition: TRootSniffer.h:184
friend class TRootSniffer
Definition: TRootSniffer.h:29
Definition: file.py:1
Bool_t CanSetFields() const
return true when fields could be set to the hierarchy item
Definition: TRootSniffer.h:63
Bool_t fHasMore
! indicates that potentially there are more items can be found
Definition: TRootSniffer.h:51
virtual Bool_t HasStreamerInfo() const
Definition: TRootSniffer.h:158
Bool_t fNodeStarted
! indicate if node was started
Definition: TRootSniffer.h:52
if set, only fields for specified item will be set (but all fields)
Definition: TRootSniffer.h:38
void MakeItemName(const char *objname, TString &itemname)
Construct item name, using object name as basis.
const Bool_t kTRUE
Definition: RtypesCore.h:87
void SetScanGlobalDir(Bool_t on=kTRUE)
When enabled (default), sniffer scans gROOT for files, canvases, histograms.
Definition: TRootSniffer.h:196
Bool_t IsScanGlobalDir() const
Returns true when sniffer allowed to scan global directories.
Definition: TRootSniffer.h:203
char name[80]
Definition: TGX11.cxx:109
void CreateNode(const char *_node_name)
Starts new node, must be closed at the end.
TList fRestrictions
! list of restrictions for different locations
Definition: TRootSniffer.h:126