// @(#)root/alien:$Id$
// Author: Jan Fiete Grosse-Oetringhaus   28/9/2004

/*************************************************************************
 * Copyright (C) 1995-2004, Rene Brun and Fons Rademakers.               *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TAlienDirectory                                                      //
//                                                                      //
// Class which creates Directory files for the AliEn middleware         //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TAlienDirectory.h"
#include "TAlien.h"
#include "TGridResult.h"
#include "TSystemFile.h"
#include "TAlienFile.h"
#include "TSystem.h"
#include "TFile.h"
#include "TObjString.h"


ClassImp(TAlienDirectoryEntry)

//______________________________________________________________________________
void TAlienDirectoryEntry::Browse(TBrowser* b)
{
   // Browse an Alien directory.

   if (b) {
      TString alienname = "alien://";
      alienname += fLfn;
      TObject *bobj;
      if (!(bobj = fBrowserObjects.FindObject(alienname.Data()))) {
         TFile *newfile = TFile::Open(alienname.Data());
         b->Add(newfile);
         fBrowserObjects.Add(new TObjString(alienname.Data()), (TObject*) newfile);
      }
   }
}


ClassImp(TAlienDirectory)

//______________________________________________________________________________
TAlienDirectory::TAlienDirectory(const char *ldn, const char *name)
{
   // Constructor.

   if (!gGrid->Cd(ldn)) {
      MakeZombie();
      return;
   }

   if (!name) {
      SetName(gSystem->BaseName(ldn));
   } else {
      SetName(name);
   }

   SetTitle(ldn);
};

//______________________________________________________________________________
void TAlienDirectory::Fill()
{
   // Fill directory entry list.

   if (!gGrid->Cd(GetTitle())) {
      MakeZombie();
      return;
   }

   fEntries.Clear();
   TGridResult *dirlist = gGrid->Ls(GetTitle(), "-la");
   if (dirlist) {
      dirlist->Sort();
      Int_t i = 0;
      while (dirlist->GetFileName(i)) {
         if (!strcmp(".",dirlist->GetFileName(i))) {
            i++;
            continue;
         }
         if (!strcmp("..",dirlist->GetFileName(i))) {
            i++;
            continue;
         }

         if (dirlist->GetKey(i,"permissions")[0] == 'd') {
            fEntries.Add(new TAlienDirectory(dirlist->GetFileNamePath(i)));
         } else {
            fEntries.Add(new TAlienDirectoryEntry(dirlist->GetFileNamePath(i), dirlist->GetFileName(i)));
         }
         i++;
      }
      delete dirlist;
   }
}

//______________________________________________________________________________
void TAlienDirectory::Browse(TBrowser *b)
{
   // Browser interface to ob status.

   if (b) {
      Fill();
      TIter next(&fEntries);
      TObject *obj = 0;
      TObject *bobj = 0;
      while ((obj = next())) {
         if (!(bobj = fBrowserObjects.FindObject(obj->GetName()))) {
            b->Add(obj, obj->GetName());
            fBrowserObjects.Add(new TObjString(obj->GetName()), (TObject*) obj);
         } else {
            b->Add(bobj, bobj->GetName());
         }
      }
   }
}

//______________________________________________________________________________
TAlienDirectory::~TAlienDirectory()
{
   // Destructor.

   fEntries.Clear();
}
