package hep.io.root.core; import hep.io.root.RootClassNotFound; import hep.io.root.RootFileReader; import hep.io.root.interfaces.TKey; import hep.io.root.interfaces.TStreamerInfo; import java.io.IOException; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; /** * A class factory used inside a RootFileReader. * It first attempts to resolve classes using the StreamerInfo from the file * itself, and if that fails delelgates to a default class factory. * @author tonyj * @version $Id: FileClassFactory.java 13616 2009-04-09 21:25:45Z tonyj $ */ public class FileClassFactory implements RootClassFactory { private Map classMap = new HashMap(); private RootClassFactory defaultClassFactory; private RootFileReader rfr; public FileClassFactory(TKey streamerInfo, RootClassFactory defaultClassFactory, RootFileReader rfr) throws RootClassNotFound, IOException { this.defaultClassFactory = defaultClassFactory; this.rfr = rfr; // Loop over all the streamerInfo objects List tList = (List) streamerInfo.getObject(); for (Iterator i = tList.iterator(); i.hasNext();) { TStreamerInfo element = (TStreamerInfo) i.next(); String key = element.getName(); StreamerInfo info = new StreamerInfoNew(element); classMap.put(key, DefaultClassFactory.findClass(key, info)); } // Now make sure we can resolve all the references Iterator i = classMap.values().iterator(); while (i.hasNext()) { GenericRootClass info = (GenericRootClass) i.next(); try { info.resolve(this); } catch (RootClassNotFound x) { throw new RuntimeException("Could not resolve class "+x.getClassName()+" referenced from "+info.getClassName(),x); } } } public RootClassLoader getLoader() { return defaultClassFactory.getLoader(); } public BasicRootClass create(String name) throws RootClassNotFound { //System.out.println("FileClassLoader loading "+name); //if (name.startsWith("enum")) name = "Int_t"; BasicRootClass klass = (BasicRootClass) classMap.get(name); if (klass != null) return klass; return defaultClassFactory.create(name); } }