Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
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 #include "TList.h"
17 #include <memory>
18 
19 class TFolder;
20 class TKey;
21 class TBufferFile;
22 class TDataMember;
23 class THttpCallArg;
24 class TRootSnifferStore;
25 class TRootSniffer;
26 
27 class TRootSnifferScanRec {
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:
57  TRootSnifferScanRec();
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 */
80  Bool_t CanExpandItem();
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  std::unique_ptr<TFolder> fTopFolder; ///<! own top TFolder object, used for registering objects
124  THttpCallArg *fCurrentArg{nullptr}; ///<! current http arguments (if any)
125  Int_t fCurrentRestrict{0}; ///<! current restriction for last-found object
126  TString fCurrentAllowedMethods; ///<! list of allowed methods, extracted when analyzed object restrictions
127  TList fRestrictions; ///<! list of restrictions for different locations
128  TString fAutoLoad; ///<! scripts names, which are add as _autoload parameter to h.json request
129 
130  void ScanObjectMembers(TRootSnifferScanRec &rec, TClass *cl, char *ptr);
131 
132  virtual void ScanObjectProperties(TRootSnifferScanRec &rec, TObject *obj);
133 
134  virtual void ScanKeyProperties(TRootSnifferScanRec &rec, TKey *key, TObject *&obj, TClass *&obj_class);
135 
136  virtual void ScanObjectChilds(TRootSnifferScanRec &rec, TObject *obj);
137 
138  void
139  ScanCollection(TRootSnifferScanRec &rec, TCollection *lst, const char *foldername = nullptr, TCollection *keys_lst = nullptr);
140 
141  virtual void ScanRoot(TRootSnifferScanRec &rec);
142 
143  TString DecodeUrlOptionValue(const char *value, Bool_t remove_quotes = kTRUE);
144 
145  TObject *GetItem(const char *fullname, TFolder *&parent, Bool_t force = kFALSE, Bool_t within_objects = kTRUE);
146 
147  TFolder *GetSubFolder(const char *foldername, Bool_t force = kFALSE);
148 
149  const char *GetItemField(TFolder *parent, TObject *item, const char *name);
150 
151  Bool_t IsItemField(TObject *obj) const;
152 
153  Bool_t AccessField(TFolder *parent, TObject *item, const char *name, const char *value, TNamed **only_get = nullptr);
154 
155  Int_t WithCurrentUserName(const char *option);
156 
157  virtual Bool_t CanDrawClass(TClass *) { return kFALSE; }
158 
159  virtual Bool_t HasStreamerInfo() const { return kFALSE; }
160 
161  virtual Bool_t ProduceJson(const std::string &path, const std::string &options, std::string &res);
162 
163  virtual Bool_t ProduceXml(const std::string &path, const std::string &options, std::string &res);
164 
165  virtual Bool_t ProduceBinary(const std::string &path, const std::string &options, std::string &res);
166 
167  virtual Bool_t ProduceImage(Int_t kind, const std::string &path, const std::string &options, std::string &res);
168 
169  virtual Bool_t ProduceExe(const std::string &path, const std::string &options, Int_t reskind, std::string &res);
170 
171  virtual Bool_t ExecuteCmd(const std::string &path, const std::string &options, std::string &res);
172 
173  virtual Bool_t
174  ProduceItem(const std::string &path, const std::string &options, std::string &res, Bool_t asjson = kTRUE);
175 
176  virtual Bool_t
177  ProduceMulti(const std::string &path, const std::string &options, std::string &res, Bool_t asjson = kTRUE);
178 
179 public:
180  TRootSniffer(const char *name, const char *objpath = "Objects");
181  virtual ~TRootSniffer();
182 
183  /** When readonly on (default), sniffer is not allowed to change ROOT structures
184  * For instance, it is not allowed to read new objects from files */
185  void SetReadOnly(Bool_t on = kTRUE) { fReadOnly = on; }
186 
187  /** Returns readonly mode */
188  Bool_t IsReadOnly() const { return fReadOnly; }
189 
190  void Restrict(const char *path, const char *options);
191 
192  Bool_t HasRestriction(const char *item_name);
193 
194  Int_t CheckRestriction(const char *item_name);
195 
196  void CreateOwnTopFolder();
197 
198  TFolder *GetTopFolder(Bool_t force = kFALSE);
199 
200  /** When enabled (default), sniffer scans gROOT for files, canvases, histograms */
201  void SetScanGlobalDir(Bool_t on = kTRUE) { fScanGlobalDir = on; }
202 
203  void SetAutoLoad(const char *scripts = "");
204 
205  const char *GetAutoLoad() const;
206 
207  /** Returns true when sniffer allowed to scan global directories */
208  Bool_t IsScanGlobalDir() const { return fScanGlobalDir; }
209 
210  Bool_t RegisterObject(const char *subfolder, TObject *obj);
211 
212  Bool_t UnregisterObject(TObject *obj);
213 
214  Bool_t RegisterCommand(const char *cmdname, const char *method, const char *icon);
215 
216  Bool_t CreateItem(const char *fullname, const char *title);
217 
218  Bool_t SetItemField(const char *fullname, const char *name, const char *value);
219 
220  const char *GetItemField(const char *fullname, const char *name);
221 
222  void SetCurrentCallArg(THttpCallArg *arg);
223 
224  /** Method scans normal objects, registered in ROOT */
225  void ScanHierarchy(const char *topname, const char *path, TRootSnifferStore *store, Bool_t only_fields = kFALSE);
226 
227  TObject *FindTObjectInHierarchy(const char *path);
228 
229  virtual void *
230  FindInHierarchy(const char *path, TClass **cl = nullptr, TDataMember **member = nullptr, Int_t *chld = nullptr);
231 
232  Bool_t CanDrawItem(const char *path);
233 
234  Bool_t CanExploreItem(const char *path);
235 
236  virtual Bool_t IsStreamerInfoItem(const char *) { return kFALSE; }
237 
238  virtual ULong_t GetStreamerInfoHash() { return 0; }
239 
240  virtual ULong_t GetItemHash(const char *itemname);
241 
242  Bool_t Produce(const std::string &path, const std::string &file, const std::string &options, std::string &res);
243 
244  ClassDef(TRootSniffer, 0) // Sniffer of ROOT objects (basic version)
245 };
246 
247 #endif