Allowing path names with dot (Alberto)
[u/mrichter/AliRoot.git] / STEER / AliCDBPath.cxx
CommitLineData
9e1ceb13 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
34ClassImp(AliCDBPath)
35
36//_____________________________________________________________________________
e8d02863 37AliCDBPath::AliCDBPath() :
38fIsValid(kTRUE),
39fIsWildcard(kFALSE)
40{
9e1ceb13 41// default constructor
42
43}
44
45//_____________________________________________________________________________
46AliCDBPath::AliCDBPath(const AliCDBPath& other):
e8d02863 47TObject(other),
9e1ceb13 48fPath(other.fPath)
49{
50// constructor
51 Init();
52 InitPath();
53
54}
55
56//_____________________________________________________________________________
57AliCDBPath::AliCDBPath(const char* level0, const char* level1,
58 const char* level2):
59fLevel0(level0),
60fLevel1(level1),
61fLevel2(level2)
62{
63// constructor
64
65 fPath += level0;
66 fPath += '/';
67 fPath += level1;
68 fPath += '/';
69 fPath += level2;
70
71 if ((IsWord(fLevel0) || fLevel0 == "*")
72 && (IsWord(fLevel1) || fLevel1 == "*")
73 && (IsWord(fLevel2) || fLevel2 == "*")) {
74
75 fIsValid = kTRUE;
76 } else {
77 fIsValid = kFALSE;
78 AliError(Form("Invalid AliCDBPath <%s/%s/%s>!",
79 level0, level1, level2));
80 }
81
82 Init();
83}
84
85//_____________________________________________________________________________
86AliCDBPath::AliCDBPath(const char* path):
87fPath(path)
88{
89// constructor
90
91 Init();
92 InitPath();
93}
94
95//_____________________________________________________________________________
96AliCDBPath::AliCDBPath(const TString& path):
97fPath(path)
98{
99 Init();
100 InitPath();
101}
102
103//_____________________________________________________________________________
104void AliCDBPath::InitPath() {
105// sets fLevel0, fLevel1, fLevel2, validity flagss from fPath
106
107 TSubString strippedString = fPath.Strip(TString::kBoth);
108 TString aString(strippedString);
109 strippedString = aString.Strip(TString::kBoth, '/');
110
e8d02863 111 TObjArray* anArray = TString(strippedString).Tokenize("/");
9e1ceb13 112 Int_t paramCount = anArray->GetEntriesFast();
113
114 if (paramCount == 1) {
115 if (fPath == "*") {
116 fLevel0 = "*";
117 fLevel1 = "*";
118 fLevel2 = "*";
119
120 fIsValid = kTRUE;
121 } else {
122 fIsValid = kFALSE;
123 }
124
125 } else if (paramCount == 2) {
126 fLevel0 = ((TObjString*) anArray->At(0))->GetString();
127 TString aString = ((TObjString*) anArray->At(1))->GetString();
128
129 if (IsWord(fLevel0) && aString == "*") {
130 fLevel1 = "*";
131 fLevel2 = "*";
132
133 fIsValid = kTRUE;
134
135 } else {
136 fIsValid = kFALSE;
137 }
138
139 } else if (paramCount == 3) {
140 fLevel0 = ((TObjString*) anArray->At(0))->GetString();
141 fLevel1 = ((TObjString*) anArray->At(1))->GetString();
142 fLevel2 = ((TObjString*) anArray->At(2))->GetString();
143
144 if ((IsWord(fLevel0) || fLevel0 == "*")
145 && (IsWord(fLevel1) || fLevel1 == "*")
146 && (IsWord(fLevel2) || fLevel2 == "*")) {
147
148 fIsValid = kTRUE;
149 } else {
150 fIsValid = kFALSE;
151 }
152
153 } else {
154 fIsValid = kFALSE;
155
156 }
157
158 if (!fIsValid) {
159 AliInfo(Form("Invalid AliCDBPath <%s>!", fPath.Data()));
160 }
161
162 delete anArray;
163
164 Init();
165}
166
167//_____________________________________________________________________________
168AliCDBPath::~AliCDBPath() {
169// destructor
170
171}
172
173//_____________________________________________________________________________
174Bool_t AliCDBPath::IsWord(const TString& str) {
175// check if string is a word
176
a00e23f6 177 TRegexp pattern("^[a-zA-Z0-9_.]+$");
9e1ceb13 178
179 return str.Contains(pattern);
180}
181
182//_____________________________________________________________________________
183void AliCDBPath::Init() {
184// set fIsWildcard flag
185
186 fIsWildcard = fPath.MaybeWildcard();
187}
188
189//_____________________________________________________________________________
190Bool_t AliCDBPath::Level0Comprises(const TString& str) const {
191// check if Level0 is wildcard or is equal to str
192
193 if (fLevel0 == "*") {
194 return kTRUE;
195 }
196
197 return fLevel0 == str;
198}
199
200//_____________________________________________________________________________
201Bool_t AliCDBPath::Level1Comprises(const TString& str) const {
202// check if Level1 is wildcard or is equal to str
203
204 if (fLevel1 == "*") {
205 return kTRUE;
206 }
207
208 return fLevel1 == str;
209}
210
211//_____________________________________________________________________________
212Bool_t AliCDBPath::Level2Comprises(const TString& str) const {
213// check if Level2 is wildcard or is equal to str
214
215 if (fLevel2 == "*") {
216 return kTRUE;
217 }
218
219 return fLevel2 == str;
220}
221
222//_____________________________________________________________________________
223Bool_t AliCDBPath::Comprises(const AliCDBPath& other) const {
224// check if path is wildcard and comprises other
225
226 return Level0Comprises(other.fLevel0)
227 && Level1Comprises(other.fLevel1)
228 && Level2Comprises(other.fLevel2);
229}