#ifndef ALI_CDB_ID_H
#define ALI_CDB_ID_H
#include "AliCDBPath.h"
#include "AliCDBRunRange.h"
#include <TObject.h>
class AliCDBId: public TObject {
public:
AliCDBId();
AliCDBId(const AliCDBId& other);
AliCDBId(const AliCDBPath& path, const AliCDBRunRange& runRange,
Int_t version = -1, Int_t subVersion = -1);
AliCDBId(const AliCDBPath& path,
Int_t firstRun , Int_t lastRun , Int_t verison = -1,
Int_t subVersion = -1);
static AliCDBId* MakeFromString(const TString& idString);
virtual ~AliCDBId();
const AliCDBPath& GetAliCDBPath() const {return fPath;}
const TString& GetPath() const {return fPath.GetPath();}
const TString GetPathLevel(Int_t i) const {return fPath.GetLevel(i);}
Bool_t IsWildcard() const {return fPath.IsWildcard();}
void SetPath(const char* path) {fPath.SetPath(path);}
const AliCDBRunRange& GetAliCDBRunRange() const {return fRunRange;}
AliCDBRunRange& GetAliCDBRunRange() {return fRunRange;}
Int_t GetFirstRun() const {return fRunRange.GetFirstRun();}
Int_t GetLastRun() const {return fRunRange.GetLastRun();}
void SetFirstRun(Int_t firstRun) {fRunRange.SetFirstRun(firstRun);}
void SetLastRun(Int_t lastRun) {fRunRange.SetLastRun(lastRun);}
void SetRunRange(Int_t firstRun, Int_t lastRun)
{fRunRange.SetRunRange(firstRun, lastRun);}
Bool_t IsAnyRange() const {return fRunRange.IsAnyRange();}
Int_t GetVersion() const {return fVersion;}
Int_t GetSubVersion() const {return fSubVersion;}
void SetVersion(Int_t version) {fVersion = version;}
void SetSubVersion(Int_t subVersion) {fSubVersion = subVersion;}
const TString& GetLastStorage() const {return fLastStorage;}
void SetLastStorage(TString& lastStorage){fLastStorage = lastStorage;}
Bool_t IsValid() const;
Bool_t IsSpecified() const {return !(IsWildcard() || IsAnyRange());}
Bool_t HasVersion() const {return fVersion >= 0;}
Bool_t HasSubVersion() const {return fSubVersion >= 0;}
Bool_t Comprises(const AliCDBId& other) const
{return fPath.Comprises(other.fPath)
&& fRunRange.Comprises(other.fRunRange);}
virtual Bool_t IsEqual(const TObject *obj) const;
TString ToString() const;
void Print(Option_t* option="") const;
virtual Int_t Compare(const TObject* obj) const;
virtual Bool_t IsSortable() const;
virtual const char *GetName() const { return fPath.GetPath().Data(); }
private:
AliCDBPath fPath;
AliCDBRunRange fRunRange;
Int_t fVersion;
Int_t fSubVersion;
TString fLastStorage;
ClassDef(AliCDBId, 1);
};
#endif