/*
 * TClonesArray.java
 *
 * Created on January 14, 2001, 5:28 PM
 */
package hep.io.root.reps;

import hep.io.root.RootObject;
import hep.io.root.core.AbstractRootObject;
import hep.io.root.core.Clone;
import hep.io.root.core.Clones;
import hep.io.root.core.RootInput;
import hep.io.root.interfaces.TObjArray;
import hep.io.root.interfaces.TObject;

import java.io.IOException;


/**
 *
 * @author  tonyj
 * @version $Id: TClonesArrayRep.java,v 1.3 2004/06/28 15:21:24 tonyj Exp $
 */
public abstract class TClonesArrayRep extends AbstractRootObject implements TObjArray
{
   private String fClassName;
   private String fName;
   private TObject fObject;
   private RootObject[] fArray;
   private int fLowerBound;
   private int fNobjects;
   private int fSize;

   public void readMembers(RootInput in) throws IOException
   {
      int v = in.readVersion(this);
      fObject = (TObject) in.readObject("TObject");

      //System.out.println("TClonesArray Version="+v+" fBits="+Integer.toHexString(fObject.getBits()));
      fName = in.readObject("TString").toString();
      fClassName = in.readObject("TString").toString();
      fNobjects = in.readInt();
      if (fNobjects < 0)
         fNobjects = -fNobjects;
      fLowerBound = in.readInt();
      fArray = new RootObject[fNobjects];

      //for (int i=0; i<500; i++)
      //{
      //      int b = in.readByte();
      //      Character c = new Character((char) b);
      //      System.out.println("["+i+"] "+b+" "+Integer.toHexString(b)+" "+c);
      //}
      //System.exit(0);
      if (in.getRootVersion() >= 30200)
         in.skipBytes(4 * fNobjects);

      try
      {
         String className = fClassName;
         int pos = className.indexOf(';');
         if (pos > 0)
            className = className.substring(0, pos);

         Class clcl = in.getFactory().getLoader().loadClass("hep.io.root.clones." + className);
         Clones clones = (Clones) clcl.newInstance();
         clones.read(in, fNobjects);

         clcl = in.getFactory().getLoader().loadClass("hep.io.root.clone." + className);
         for (int i = 0; i < fNobjects; i++)
         {
            Clone clone = (Clone) clcl.newInstance();
            clone.setData(i, clones);
            fArray[i] = clone;
         }
         fSize = fArray.length;
         while ((fSize > 0) && (fArray[fSize - 1] == null))
            fSize--; // trim trailing nulls
      }
      catch (ClassNotFoundException x)
      {
         throw new IOException("TClonesArray class not found: " + fClassName);
      }
      catch (Throwable x)
      {
         x.printStackTrace();
         System.exit(0);
         throw new IOException("TClonesArray instantiation exception: " + fClassName);
      }
      in.checkLength(this);
   }
}
