ZDC automatic scripts updates (Marco Leoncino) + updates in QA config
[u/mrichter/AliRoot.git] / STEER / CDB / AliCDBPath.cxx
1 /**************************************************************************
2  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
3  *                                                                        *
4  * Author: The ALICE Off-line Project.                                    *
5  * Contributors are mentioned in the code where appropriate.              *
6  *                                                                        *
7  * Permission to use, copy, modify and distribute this software and its   *
8  * documentation strictly for non-commercial purposes is hereby granted   *
9  * without fee, provided that the above copyright notice appears in all   *
10  * copies and that both the copyright notice and this permission notice   *
11  * appear in the supporting documentation. The authors make no claims     *
12  * about the suitability of this software for any purpose. It is          *
13  * provided "as is" without express or implied warranty.                  *
14  **************************************************************************/
15
16 /////////////////////////////////////////////////////////////////////
17 //                                                                 //
18 //  class AliCDBPath                                               //
19 //  Path string identifying the object:                            //
20 //  "level0/level1/level2"                                         //
21 //  (was: "Detector/DBType/DetSpecType")                           //
22 //  (example: "ZDC/Calib/Pedestals")                               //
23 //                                                                 //
24 /////////////////////////////////////////////////////////////////////
25
26 #include "AliCDBPath.h"
27
28 #include <TObjArray.h>
29 #include <TObjString.h>
30 #include <TRegexp.h>
31
32 #include "AliLog.h"
33
34 ClassImp(AliCDBPath)
35
36 //_____________________________________________________________________________
37 AliCDBPath::AliCDBPath() :
38   TObject(),
39   fPath(""),
40   fLevel0(""),
41   fLevel1(""),
42   fLevel2(""),
43   fIsValid(kTRUE),
44   fIsWildcard(kFALSE)
45 {
46   // default constructor
47
48 }
49
50 //_____________________________________________________________________________
51 AliCDBPath::AliCDBPath(const AliCDBPath& other):
52   TObject(other),
53   fPath(other.fPath),
54   fLevel0(""),
55   fLevel1(""),
56   fLevel2(""),
57   fIsValid(other.fIsValid),
58   fIsWildcard(other.fIsWildcard)
59 {
60   // constructor
61   Init();
62   InitPath();
63
64 }
65
66 //_____________________________________________________________________________
67 AliCDBPath::AliCDBPath(const char* level0, const char* level1,
68     const char* level2):
69   TObject(),
70   fPath(""),
71   fLevel0(level0), 
72   fLevel1(level1), 
73   fLevel2(level2),
74   fIsValid(kTRUE),
75   fIsWildcard(kFALSE)
76 {
77   // constructor
78
79   fPath += level0;
80   fPath += '/';
81   fPath += level1;
82   fPath += '/';
83   fPath += level2;
84
85   if ((IsWord(fLevel0) || fLevel0 == "*")
86       && (IsWord(fLevel1) || fLevel1 == "*")
87       && (IsWord(fLevel2) || fLevel2 == "*")) {
88
89     fIsValid = kTRUE;
90   } else {
91     fIsValid = kFALSE;
92     AliError(Form("Invalid AliCDBPath <%s/%s/%s>!", 
93           level0, level1, level2));
94   }
95
96   Init();
97 }
98
99 //_____________________________________________________________________________
100 AliCDBPath::AliCDBPath(const char* path):
101   TObject(),
102   fPath(path),
103   fLevel0(""),
104   fLevel1(""),
105   fLevel2(""),
106   fIsValid(kTRUE),
107   fIsWildcard(kFALSE)
108 {
109   // constructor
110
111   Init();
112   InitPath();   
113 }
114
115 //_____________________________________________________________________________
116 AliCDBPath::AliCDBPath(const TString& path):
117   TObject(),
118   fPath(path),
119   fLevel0(""),
120   fLevel1(""),
121   fLevel2(""),
122   fIsValid(kTRUE),
123   fIsWildcard(kFALSE)
124 {
125   Init();
126   InitPath();
127 }
128
129 //_____________________________________________________________________________
130 void AliCDBPath::InitPath() {
131   // sets fLevel0, fLevel1, fLevel2, validity flagss from fPath
132
133   TSubString strippedString = fPath.Strip(TString::kBoth);
134   TString aString(strippedString);
135   strippedString = aString.Strip(TString::kBoth, '/');
136
137   TObjArray* anArray = TString(strippedString).Tokenize("/");
138   Int_t paramCount = anArray->GetEntriesFast();
139
140   if (paramCount == 1) {
141     if (fPath == "*") {
142       fLevel0 = "*";
143       fLevel1 = "*";
144       fLevel2 = "*";
145
146       fIsValid = kTRUE;
147     } else {
148       fIsValid = kFALSE;
149     }
150
151   } else if (paramCount == 2) {
152     fLevel0 = ((TObjString*) anArray->At(0))->GetString();
153     TString bString =  ((TObjString*) anArray->At(1))->GetString();
154
155     if (IsWord(fLevel0) && bString == "*") {
156       fLevel1 = "*";
157       fLevel2 = "*";
158
159       fIsValid = kTRUE;                 
160
161     } else {
162       fIsValid = kFALSE;
163     }
164
165   } else if (paramCount == 3) {
166     fLevel0 = ((TObjString*) anArray->At(0))->GetString();
167     fLevel1 = ((TObjString*) anArray->At(1))->GetString();
168     fLevel2 = ((TObjString*) anArray->At(2))->GetString();
169
170     if ((IsWord(fLevel0) || fLevel0 == "*")
171         && (IsWord(fLevel1) || fLevel1 == "*")
172         && (IsWord(fLevel2) || fLevel2 == "*")) {
173
174       fIsValid = kTRUE;
175     } else {
176       fIsValid = kFALSE;
177     }
178
179   } else {
180     fIsValid = kFALSE;
181
182   }
183
184   if (!fIsValid) {
185     AliInfo(Form("Invalid AliCDBPath <%s>!", fPath.Data()));
186   } else {      
187     fPath = Form("%s/%s/%s", fLevel0.Data(), fLevel1.Data(), fLevel2.Data());
188   }
189
190   delete anArray;
191
192   Init();
193 }
194
195 //_____________________________________________________________________________
196 AliCDBPath::~AliCDBPath() {
197   // destructor
198
199 }
200
201 //_____________________________________________________________________________
202 Bool_t AliCDBPath::IsWord(const TString& str) {
203   // check if string is a word
204
205   TRegexp pattern("^[a-zA-Z0-9_.-]+$");
206
207   return str.Contains(pattern); 
208 }
209
210 //_____________________________________________________________________________
211 void AliCDBPath::Init() {
212   // set fIsWildcard flag
213
214   fIsWildcard = fPath.MaybeWildcard();  
215 }
216
217 //_____________________________________________________________________________
218 Bool_t AliCDBPath::Level0Comprises(const TString& str) const {
219   // check if Level0 is wildcard or is equal to str
220
221   if (fLevel0 == "*") {
222     return kTRUE;
223   }
224
225   return fLevel0 == str;
226 }
227
228 //_____________________________________________________________________________
229 Bool_t AliCDBPath::Level1Comprises(const TString& str) const {
230   // check if Level1 is wildcard or is equal to str
231
232   if (fLevel1 == "*") {
233     return kTRUE;
234   }
235
236   return fLevel1 == str;
237 }
238
239 //_____________________________________________________________________________
240 Bool_t AliCDBPath::Level2Comprises(const TString& str) const {
241   // check if Level2 is wildcard or is equal to str
242
243   if (fLevel2 == "*") {
244     return kTRUE;
245   }
246
247   return fLevel2 == str;
248 }
249
250 //_____________________________________________________________________________
251 Bool_t AliCDBPath::Comprises(const AliCDBPath& other) const {
252   // check if path is wildcard and comprises other
253
254   return Level0Comprises(other.fLevel0)
255     && Level1Comprises(other.fLevel1)
256     && Level2Comprises(other.fLevel2);
257 }
258
259 //_____________________________________________________________________________
260 const char* AliCDBPath::GetLevel(Int_t i) const {
261   // return level i of the path
262
263   switch (i) {
264     case 0:
265       return fLevel0.Data();
266       break;
267     case 1:
268       return fLevel1.Data();
269       break;
270     case 2:
271       return fLevel2.Data();
272       break;
273     default:
274       return 0;
275   }
276
277 }