package hep.io.hbook;

import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Vector;

/** An HbookObject which can have children. This class can represent
 * either a directory in a hbook file, in which case the children
 * will be the directory entries, or a tuple, in which case the
 * children will be tuple columns.
 */
public class CompositeHbookObject extends HbookObject
{
   final static int FOLDER = 0;
   final static int CWTUPLE = 1;
   final static int RWTUPLE = 2;
   
    CompositeHbookObject(String name) {
        super(name);
        type = FOLDER;
    }
    CompositeHbookObject(CompositeHbookObject parent, String name, int type) {
        super(parent,name);
        this.type = type;
    }
    void addChild(String name, HbookObject child) {
        indexesOfChildren.put(name, new Integer(children.size()));
        children.addElement(child);        
    }
    /** Get child by index
     * @param index The index of the object to retreive (0 to n-1)
     */    
    public final HbookObject getChild(final int index) {
        if (children == null) visitChildren();
        return (HbookObject) children.elementAt(index);
    }
    /** Get an object by name. For tuples the name is the column name. */    
    public final HbookObject getChild(String name) {
        if (children == null) visitChildren();
        Object o = indexesOfChildren.get(name);
        if ( o != null )
            return (HbookObject) children.elementAt(((Integer) o ).intValue());
        return null;
    }
    void close() {
        if (children != null) {
            Enumeration e = children.elements();
            while (e.hasMoreElements()) {
                HbookObject h = (HbookObject) e.nextElement();
                h.close();
            }
        }
    }
    /** Get an enumeration of the children. */    
    public Enumeration getChildren() {
        if (children == null) visitChildren();
        return children.elements();
    }
    public String toString() {
        if (children != null) return "Folder: "+getName()+" ("+children.size()+" elements)";
        else return "Folder: "+getName();
    }
    /** Get the number of children */    
    public final int nChildren() {
        if (children == null) visitChildren();
        return children.size();
    }
    /** Get the index of a named object. */    
    public final int getIndex(final String name) {
        if (children == null) visitChildren();
        Integer index = (Integer) indexesOfChildren.get(name);
        if ( index == null ) return -1;
        return index.intValue();
    }
    private void visitChildren()
    {
       children = new Vector();
       Hbook.visitChildren(this);
    }
    private int type;
    private Vector children;
    private final Hashtable indexesOfChildren = new Hashtable();
}