#include "AliCDBPath.h"
#include <TObjArray.h>
#include <TObjString.h>
#include <TRegexp.h>
#include "AliLog.h"
ClassImp(AliCDBPath)
AliCDBPath::AliCDBPath() :
TObject(),
fPath(""),
fLevel0(""),
fLevel1(""),
fLevel2(""),
fIsValid(kTRUE),
fIsWildcard(kFALSE)
{
}
AliCDBPath::AliCDBPath(const AliCDBPath& other):
TObject(other),
fPath(other.fPath),
fLevel0(""),
fLevel1(""),
fLevel2(""),
fIsValid(other.fIsValid),
fIsWildcard(other.fIsWildcard)
{
Init();
InitPath();
}
AliCDBPath::AliCDBPath(const char* level0, const char* level1,
const char* level2):
TObject(),
fPath(""),
fLevel0(level0),
fLevel1(level1),
fLevel2(level2),
fIsValid(kTRUE),
fIsWildcard(kFALSE)
{
fPath += level0;
fPath += '/';
fPath += level1;
fPath += '/';
fPath += level2;
if ((IsWord(fLevel0) || fLevel0 == "*")
&& (IsWord(fLevel1) || fLevel1 == "*")
&& (IsWord(fLevel2) || fLevel2 == "*")) {
fIsValid = kTRUE;
} else {
fIsValid = kFALSE;
AliError(Form("Invalid AliCDBPath <%s/%s/%s>!",
level0, level1, level2));
}
Init();
}
AliCDBPath::AliCDBPath(const char* path):
TObject(),
fPath(path),
fLevel0(""),
fLevel1(""),
fLevel2(""),
fIsValid(kTRUE),
fIsWildcard(kFALSE)
{
Init();
InitPath();
}
AliCDBPath::AliCDBPath(const TString& path):
TObject(),
fPath(path),
fLevel0(""),
fLevel1(""),
fLevel2(""),
fIsValid(kTRUE),
fIsWildcard(kFALSE)
{
Init();
InitPath();
}
void AliCDBPath::InitPath() {
TSubString strippedString = fPath.Strip(TString::kBoth);
TString aString(strippedString);
strippedString = aString.Strip(TString::kBoth, '/');
TObjArray* anArray = TString(strippedString).Tokenize("/");
Int_t paramCount = anArray->GetEntriesFast();
if (paramCount == 1) {
if (fPath == "*") {
fLevel0 = "*";
fLevel1 = "*";
fLevel2 = "*";
fIsValid = kTRUE;
} else {
fIsValid = kFALSE;
}
} else if (paramCount == 2) {
fLevel0 = ((TObjString*) anArray->At(0))->GetString();
TString bString = ((TObjString*) anArray->At(1))->GetString();
if (IsWord(fLevel0) && bString == "*") {
fLevel1 = "*";
fLevel2 = "*";
fIsValid = kTRUE;
} else {
fIsValid = kFALSE;
}
} else if (paramCount == 3) {
fLevel0 = ((TObjString*) anArray->At(0))->GetString();
fLevel1 = ((TObjString*) anArray->At(1))->GetString();
fLevel2 = ((TObjString*) anArray->At(2))->GetString();
if ((IsWord(fLevel0) || fLevel0 == "*")
&& (IsWord(fLevel1) || fLevel1 == "*")
&& (IsWord(fLevel2) || fLevel2 == "*")) {
fIsValid = kTRUE;
} else {
fIsValid = kFALSE;
}
} else {
fIsValid = kFALSE;
}
if (!fIsValid) {
AliInfo(Form("Invalid AliCDBPath <%s>!", fPath.Data()));
} else {
fPath = Form("%s/%s/%s", fLevel0.Data(), fLevel1.Data(), fLevel2.Data());
}
delete anArray;
Init();
}
AliCDBPath::~AliCDBPath() {
}
Bool_t AliCDBPath::IsWord(const TString& str) {
TRegexp pattern("^[a-zA-Z0-9_.-]+$");
return str.Contains(pattern);
}
void AliCDBPath::Init() {
fIsWildcard = fPath.MaybeWildcard();
}
Bool_t AliCDBPath::Level0Comprises(const TString& str) const {
if (fLevel0 == "*") {
return kTRUE;
}
return fLevel0 == str;
}
Bool_t AliCDBPath::Level1Comprises(const TString& str) const {
if (fLevel1 == "*") {
return kTRUE;
}
return fLevel1 == str;
}
Bool_t AliCDBPath::Level2Comprises(const TString& str) const {
if (fLevel2 == "*") {
return kTRUE;
}
return fLevel2 == str;
}
Bool_t AliCDBPath::Comprises(const AliCDBPath& other) const {
return Level0Comprises(other.fLevel0)
&& Level1Comprises(other.fLevel1)
&& Level2Comprises(other.fLevel2);
}
const char* AliCDBPath::GetLevel(Int_t i) const {
switch (i) {
case 0:
return fLevel0.Data();
break;
case 1:
return fLevel1.Data();
break;
case 2:
return fLevel2.Data();
break;
default:
return 0;
}
}