00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "Riostream.h"
00021 #include "TFileInfo.h"
00022 #include "TRegexp.h"
00023 #include "TSystem.h"
00024 #include "TClass.h"
00025
00026
00027 ClassImp(TFileInfo)
00028 ClassImp(TFileInfoMeta)
00029
00030
00031 TFileInfo::TFileInfo(const char *in, Long64_t size, const char *uuid,
00032 const char *md5, TObject *meta)
00033 : fCurrentUrl(0), fUrlList(0), fSize(-1), fUUID(0), fMD5(0),
00034 fMetaDataList(0)
00035 {
00036
00037
00038
00039
00040 ParseInput(in);
00041
00042
00043 if (size > -1) fSize = size;
00044
00045 if (uuid) {
00046 SafeDelete(fUUID);
00047 fUUID = new TUUID(uuid);
00048 } else if (!fUUID) {
00049 fUUID = new TUUID;
00050 }
00051
00052 if (md5) {
00053 SafeDelete(fMD5);
00054 fMD5 = new TMD5((const UChar_t*)md5);
00055 }
00056
00057 if (meta) {
00058 RemoveMetaData(meta->GetName());
00059 AddMetaData(meta);
00060 }
00061
00062
00063 SetName(fUUID->AsString());
00064 SetTitle("TFileInfo");
00065 }
00066
00067
00068 TFileInfo::TFileInfo(const TFileInfo &fi) : TNamed(fi.GetName(), fi.GetTitle()),
00069 fCurrentUrl(0), fUrlList(0),
00070 fSize(fi.fSize), fUUID(0), fMD5(0),
00071 fMetaDataList(0)
00072 {
00073
00074
00075 if (fi.fUrlList) {
00076 fUrlList = new TList;
00077 fUrlList->SetOwner();
00078 TIter nxu(fi.fUrlList);
00079 TUrl *u = 0;
00080 while ((u = (TUrl *)nxu())) {
00081 fUrlList->Add(new TUrl(u->GetUrl(), kTRUE));
00082 }
00083 ResetUrl();
00084 }
00085 fSize = fi.fSize;
00086
00087 if (fi.fUUID)
00088 fUUID = new TUUID(fi.fUUID->AsString());
00089
00090 if (fi.fMD5)
00091 fMD5 = new TMD5(*(fi.fMD5));
00092
00093
00094 ResetBit(TFileInfo::kStaged);
00095 ResetBit(TFileInfo::kCorrupted);
00096 if (fi.TestBit(TFileInfo::kStaged)) SetBit(TFileInfo::kStaged);
00097 if (fi.TestBit(TFileInfo::kCorrupted)) SetBit(TFileInfo::kCorrupted);
00098
00099 if (fi.fMetaDataList) {
00100 fMetaDataList = new TList;
00101 fMetaDataList->SetOwner();
00102 TIter nxm(fi.fMetaDataList);
00103 TFileInfoMeta *fim = 0;
00104 while ((fim = (TFileInfoMeta *)nxm())) {
00105 fMetaDataList->Add(new TFileInfoMeta(*fim));
00106 }
00107 }
00108 }
00109
00110
00111 TFileInfo::~TFileInfo()
00112 {
00113
00114
00115 SafeDelete(fMetaDataList);
00116 SafeDelete(fUUID);
00117 SafeDelete(fMD5);
00118 SafeDelete(fUrlList);
00119 }
00120
00121
00122 void TFileInfo::ParseInput(const char *in)
00123 {
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150 if (!in || strlen(in) <= 0) return;
00151
00152 TString sin(in), t;
00153 Int_t f1 = 0;
00154 while (sin.Tokenize(t, f1, " ")) {
00155 if (t.BeginsWith("sz:")) {
00156
00157 t.Replace(0, 3, "");
00158 if (t.IsDigit()) sscanf(t.Data(), "%lld", &fSize);
00159 } else if (t.BeginsWith("md5:")) {
00160
00161 t.Replace(0, 4, "");
00162 if (t.Length() >= 32) {
00163 fMD5 = new TMD5;
00164 if (fMD5->SetDigest(t) != 0)
00165 SafeDelete(fMD5);
00166 }
00167 } else if (t.BeginsWith("uuid:")) {
00168
00169 t.Replace(0, 5, "");
00170 if (t.Length() > 0) fUUID = new TUUID(t);
00171 } else if (t.BeginsWith("tree:")) {
00172
00173 t.Replace(0, 5, "");
00174 TString nm, se, sf, sl;
00175 Long64_t ent = -1, fst= -1, lst = -1;
00176 Int_t f2 = 0;
00177 if (t.Tokenize(nm, f2, ","))
00178 if (t.Tokenize(se, f2, ","))
00179 if (t.Tokenize(sf, f2, ","))
00180 t.Tokenize(sl, f2, ",");
00181 if (!(nm.IsNull())) {
00182 if (se.IsDigit()) sscanf(se.Data(), "%lld", &ent);
00183 if (sf.IsDigit()) sscanf(sf.Data(), "%lld", &fst);
00184 if (sl.IsDigit()) sscanf(sl.Data(), "%lld", &lst);
00185 TFileInfoMeta *meta = new TFileInfoMeta(nm, "TTree", ent, fst, lst);
00186 RemoveMetaData(meta->GetName());
00187 AddMetaData(meta);
00188 }
00189 } else if (t.BeginsWith("obj:")) {
00190
00191 t.Replace(0, 4, "");
00192 TString nm, cl, se;
00193 Long64_t ent = -1;
00194 Int_t f2 = 0;
00195 if (t.Tokenize(nm, f2, ","))
00196 if (t.Tokenize(cl, f2, ","))
00197 t.Tokenize(se, f2, ",");
00198 if (cl.IsNull()) cl = "TObject";
00199 if (!(nm.IsNull())) {
00200 if (se.IsDigit()) sscanf(se.Data(), "%lld", &ent);
00201 TFileInfoMeta *meta = new TFileInfoMeta(nm, cl, ent);
00202 AddMetaData(meta);
00203 }
00204 } else {
00205
00206 if (t.BeginsWith("url:")) t.Replace(0, 4, "");
00207 TString u;
00208 Int_t f2 = 0;
00209 while (t.Tokenize(u, f2, ",")) {
00210 if (!(u.IsNull())) AddUrl(u);
00211 }
00212 }
00213 }
00214 }
00215
00216
00217 void TFileInfo::SetUUID(const char *uuid)
00218 {
00219
00220
00221
00222
00223
00224
00225 if (uuid) {
00226 if (fUUID) delete fUUID;
00227 fUUID = new TUUID(uuid);
00228 }
00229 }
00230
00231
00232 TUrl *TFileInfo::GetCurrentUrl() const
00233 {
00234
00235
00236 if (!fCurrentUrl)
00237 const_cast<TFileInfo*>(this)->ResetUrl();
00238 return fCurrentUrl;
00239 }
00240
00241
00242 TUrl *TFileInfo::NextUrl()
00243 {
00244
00245
00246
00247
00248 if (!fUrlList)
00249 return 0;
00250
00251 TUrl *returl = fCurrentUrl;
00252
00253 if (fCurrentUrl)
00254 fCurrentUrl = (TUrl*)fUrlList->After(fCurrentUrl);
00255
00256 return returl;
00257 }
00258
00259
00260 TUrl *TFileInfo::FindByUrl(const char *url, Bool_t withDeflt)
00261 {
00262
00263
00264 TIter nextUrl(fUrlList);
00265 TUrl *urlelement;
00266
00267 TRegexp rg(url);
00268 while ((urlelement = (TUrl*) nextUrl())) {
00269 if (TString(urlelement->GetUrl(withDeflt)).Index(rg) != kNPOS) {
00270 return urlelement;
00271 }
00272 }
00273 return 0;
00274 }
00275
00276
00277 Bool_t TFileInfo::AddUrl(const char *url, Bool_t infront)
00278 {
00279
00280
00281
00282
00283 if (FindByUrl(url))
00284 return kFALSE;
00285
00286 if (!fUrlList) {
00287 fUrlList = new TList;
00288 fUrlList->SetOwner();
00289 }
00290
00291 TUrl *newurl = new TUrl(url, kTRUE);
00292
00293 if (fUrlList->GetSize() == 0)
00294 fCurrentUrl = newurl;
00295
00296 if (infront)
00297 fUrlList->AddFirst(newurl);
00298 else
00299 fUrlList->Add(newurl);
00300 return kTRUE;
00301 }
00302
00303
00304 Bool_t TFileInfo::RemoveUrl(const char *url)
00305 {
00306
00307
00308 TUrl *lurl;
00309 if ((lurl = FindByUrl(url))) {
00310 fUrlList->Remove(lurl);
00311 if (lurl == fCurrentUrl)
00312 ResetUrl();
00313 delete lurl;
00314 return kTRUE;
00315 }
00316 return kFALSE;
00317 }
00318
00319
00320 Bool_t TFileInfo::SetCurrentUrl(const char *url)
00321 {
00322
00323
00324
00325 TUrl *lurl;
00326 if ((lurl = FindByUrl(url))) {
00327 fCurrentUrl = lurl;
00328 return kTRUE;
00329 }
00330 return kFALSE;
00331 }
00332
00333
00334 Bool_t TFileInfo::SetCurrentUrl(TUrl *url)
00335 {
00336
00337
00338
00339 if (url && fUrlList && fUrlList->FindObject(url)) {
00340 fCurrentUrl = url;
00341 return kTRUE;
00342 }
00343 return kFALSE;
00344 }
00345
00346
00347 Bool_t TFileInfo::AddMetaData(TObject *meta)
00348 {
00349
00350
00351
00352
00353
00354
00355 if (meta) {
00356 if (!fMetaDataList) {
00357 fMetaDataList = new TList;
00358 fMetaDataList->SetOwner();
00359 }
00360 fMetaDataList->Add(meta);
00361 return kTRUE;
00362 }
00363 return kFALSE;
00364 }
00365
00366
00367 Bool_t TFileInfo::RemoveMetaData(const char *meta)
00368 {
00369
00370
00371
00372 if (fMetaDataList) {
00373 if (!meta || strlen(meta) <= 0) {
00374 SafeDelete(fMetaDataList);
00375 return kTRUE;
00376 } else {
00377 TObject *o = fMetaDataList->FindObject(meta);
00378 if (o) {
00379 fMetaDataList->Remove(o);
00380 delete o;
00381 return kTRUE;
00382 }
00383 }
00384 }
00385 return kFALSE;
00386 }
00387
00388
00389 TFileInfoMeta *TFileInfo::GetMetaData(const char *meta) const
00390 {
00391
00392
00393
00394
00395 if (fMetaDataList) {
00396 TFileInfoMeta *m;
00397 if (!meta || strlen(meta) <= 0)
00398 m = (TFileInfoMeta *) fMetaDataList->First();
00399 else
00400 m = (TFileInfoMeta *) fMetaDataList->FindObject(meta);
00401 if (m) {
00402 TClass *c = m->IsA();
00403 return (c && c->InheritsFrom(TFileInfoMeta::Class())) ? m : 0;
00404 }
00405 }
00406 return 0;
00407 }
00408
00409
00410 Int_t TFileInfo::Compare(const TObject *obj) const
00411 {
00412
00413
00414 if (this == obj) return 0;
00415 if (TFileInfo::Class() != obj->IsA()) return -1;
00416 return (GetFirstUrl()->Compare(((TFileInfo*)obj)->GetFirstUrl()));
00417 }
00418
00419
00420 void TFileInfo::Print(Option_t *option) const
00421 {
00422
00423
00424
00425
00426
00427
00428 if (GetMD5()) GetMD5()->Final();
00429 TString opt(option);
00430 if (opt.Contains("L", TString::kIgnoreCase)) {
00431
00432 Printf("UUID: %s\nMD5: %s\nSize: %lld", GetUUID() ? GetUUID()->AsString() : "undef",
00433 GetMD5() ? GetMD5()->AsString() : "undef",
00434 GetSize());
00435
00436 TIter next(fUrlList);
00437 TUrl *u;
00438 Printf(" === URLs ===");
00439 while ((u = (TUrl*)next()))
00440 Printf(" URL: %s", u->GetUrl());
00441
00442 TIter nextm(fMetaDataList);
00443 TObject *m = 0;
00444 while ((m = (TObject*) nextm())) {
00445 Printf(" === Meta Data Object ===");
00446 m->Print();
00447 }
00448 } else {
00449 TString out("current-url-undef -|-|- md5-undef");
00450 if (GetCurrentUrl()) out.ReplaceAll("current-url-undef", GetCurrentUrl()->GetUrl());
00451
00452 TString deft;
00453 if (opt.Contains("T:")) deft = opt(opt.Index("T:")+2, opt.Length());
00454 TFileInfoMeta *meta = 0;
00455 if (fMetaDataList && !deft.IsNull()) meta = (TFileInfoMeta *) fMetaDataList->FindObject(deft);
00456 if (fMetaDataList && !meta) meta = (TFileInfoMeta *) fMetaDataList->First();
00457 if (meta) out.ReplaceAll("-|-|-", TString::Format("%s|%s|%lld", meta->GetName(),
00458 meta->GetTitle(), meta->GetEntries()));
00459 if (GetMD5())
00460 out.ReplaceAll("md5-undef", TString::Format("%s", GetMD5()->AsString()));
00461 Printf("%s", out.Data());
00462 }
00463 }
00464
00465
00466
00467 TFileInfoMeta::TFileInfoMeta(const char *objPath, const char *objClass,
00468 Long64_t entries, Long64_t first, Long64_t last,
00469 Long64_t totbytes, Long64_t zipbytes)
00470 : TNamed(objPath, objClass), fEntries(entries), fFirst(first),
00471 fLast(last), fTotBytes(totbytes), fZipBytes(zipbytes)
00472 {
00473
00474
00475 TString p = objPath;
00476 if (!p.BeginsWith("/")) {
00477 p.Prepend("/");
00478 SetName(p);
00479 }
00480
00481 TClass *c = TClass::GetClass(objClass);
00482 fIsTree = (c && c->InheritsFrom("TTree")) ? kTRUE : kFALSE;
00483 ResetBit(TFileInfoMeta::kExternal);
00484 }
00485
00486
00487 TFileInfoMeta::TFileInfoMeta(const char *objPath, const char *objDir,
00488 const char *objClass, Long64_t entries,
00489 Long64_t first, Long64_t last,
00490 Long64_t totbytes, Long64_t zipbytes)
00491 : TNamed(objPath, objClass), fEntries(entries), fFirst(first),
00492 fLast(last), fTotBytes(totbytes), fZipBytes(zipbytes)
00493 {
00494
00495
00496 TString sdir = objDir;
00497 if (!sdir.BeginsWith("/"))
00498 sdir.Prepend("/");
00499 if (!sdir.EndsWith("/"))
00500 sdir += "/";
00501 sdir += objPath;
00502 SetName(sdir);
00503
00504 TClass *c = TClass::GetClass(objClass);
00505 fIsTree = (c && c->InheritsFrom("TTree")) ? kTRUE : kFALSE;
00506 ResetBit(TFileInfoMeta::kExternal);
00507 }
00508
00509
00510 TFileInfoMeta::TFileInfoMeta(const TFileInfoMeta &m)
00511 : TNamed(m.GetName(), m.GetTitle())
00512 {
00513
00514
00515 fEntries = m.fEntries;
00516 fFirst = m.fFirst;
00517 fLast = m.fLast;
00518 fIsTree = m.fIsTree;
00519 fTotBytes = m.fTotBytes;
00520 fZipBytes = m.fZipBytes;
00521 ResetBit(TFileInfoMeta::kExternal);
00522 if (m.TestBit(TFileInfoMeta::kExternal)) SetBit(TFileInfoMeta::kExternal);
00523 }
00524
00525
00526 const char *TFileInfoMeta::GetDirectory() const
00527 {
00528
00529
00530 return gSystem->DirName(GetName());
00531 }
00532
00533
00534 const char *TFileInfoMeta::GetObject() const
00535 {
00536
00537
00538
00539 return gSystem->BaseName(GetName());
00540 }
00541
00542
00543 void TFileInfoMeta::Print(Option_t * ) const
00544 {
00545
00546
00547 Printf(" Name: %s\n Class: %s\n Entries: %lld\n"
00548 " First: %lld\n Last: %lld",
00549 fName.Data(), fTitle.Data(), fEntries, fFirst, fLast);
00550 }