/**
 * Discussion Points: Is catalog universal, vs parochial?
 * Is this a query only interface, or does it allow to manipulate
 *   the catalog/metadata?
 */
 
// Types of metadata:
//        User Defined
//        Essential data (part of dataset)
 
interface IMetaDataCatalog
{ 
   /**
    *  searchExpression = e.g. "reconVersion == 3 & size < 20GB"
    *  searchExpression = e.g. "alreadyCachedAtMySite" (?)
    */
   List<IHandle> query(String searchExpression);
   List<IHandle> deepQuery(String searchExpressionRequiringLookingInObject);
}
interface HierarchicalMetaDataCatalog extends IMetaDataCatalog
{
   void cd(String path="~");
   List<IHandle> ls(String path=".", String recursive=false, String searchFilter);
   IHandle dataSet(String path);
}
interface ModifiableHierarchicalMetaDataCatalog extends HierarchicalMetaDataCatalog
{
   void insert(Object object, String path, Map metaData);
   void setAcl(String path, ACL acl);
   void mv(String oldPath, String newPath);
   void rm(String path);
   void cp(String oldPath, String newPath);
   void lock(String path);
   void unlock(String path);
   void addMetaData(String path, Map metaData);
   void removeMetaData(String path, String metaDataName);
}
interface IHandle
{
   String getHumanReadableDescription();
   String getMetaData(String name);
   Object get();
}
interface IDatasetHandle extends IHandle
{
   int getNEvents();
   ILogicalFileDataSet getDataSet();
}
interface IRootTreeDatasetHandle extends IDatasetHandle
{
   TDSet getRootData();
}
ILogicalDataset
{
   
}
IRootLogicalDataset extends ILOgicalDataset
{
   String getPathToTree();
}
ILogicalFileDataset extends ILogicalDataSet
{
   List<LFN> getFiles();
}

