package hep.io.root.util;
import hep.io.root.RootClass;
import hep.io.root.RootFileReader;
import hep.io.root.RootMember;
import hep.io.root.interfaces.TStreamerInfo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
/**
* Builds a Java interface corresponding to a RootClass.
* @author tonyj
* @version $Id: InterfaceBuilder.java 13617 2009-04-09 22:48:46Z tonyj $
*/
public class InterfaceBuilder
{
private File base;
private hep.io.root.core.NameMangler nameMangler = hep.io.root.core.NameMangler.instance();
/** Creates new InterfaceBuilder */
public InterfaceBuilder(File dir)
{
base = dir;
}
public static void main(String[] argv) throws Exception
{
if (argv.length < 1)
usage();
RootFileReader rfr = new RootFileReader(argv[0]);
hep.io.root.core.RootClassFactory rcf = rfr.getFactory();
InterfaceBuilder ib = new InterfaceBuilder(new File("."));
if (argv.length > 1)
{
RootClass rc = rcf.create(argv[1]);
File f = ib.write(rc);
System.out.println("Created " + f.getPath());
}
else
{
List list = rfr.streamerInfo();
for (Iterator i = list.iterator(); i.hasNext();)
{
TStreamerInfo info = (TStreamerInfo) i.next();
String name = info.getName();
// See if this class already exists
try
{
Class k = Class.forName("hep.io.root.interfaces." + name);
System.out.println("Skipping " + name);
}
catch (ClassNotFoundException x)
{
RootClass rc = rcf.create(name);
File f = ib.write(rc);
System.out.println("Created " + f.getPath());
}
}
}
}
public File write(RootClass klass) throws IOException
{
String klassPath = nameMangler.mangleInterfaceName(klass.getClassName());
StringBuffer packidge = new StringBuffer();
File file = base;
StringTokenizer t = new StringTokenizer(klassPath, ".");
int count = t.countTokens() - 1;
for (int i = 0; i < count; i++)
{
String token = t.nextToken();
file = new File(file, token);
if (i > 0)
packidge.append('.');
packidge.append(token);
}
String klassName = t.nextToken();
file.mkdirs();
file = new File(file, klassName + ".java");
PrintWriter out = new PrintWriter(new FileOutputStream(file));
out.println("/*");
out.println(" * Interface created by InterfaceBuilder. Do not modify.");
out.println(" *");
out.println(" * Created on " + new Date());
out.println(" */");
out.println();
out.println("package " + packidge + ";");
if (!packidge.toString().equals("hep.io.root.interfaces"))
out.println("import hep.io.root.interfaces.*;");
out.println();
out.print("public interface " + klassName + " extends hep.io.root.RootObject");
RootClass[] superClasses = klass.getSuperClasses();
for (int i = 0; i < superClasses.length; i++)
out.print(", " + nameMangler.mangleInterfaceName(superClasses[i].getClassName()));
out.println();
out.println("{");
RootMember[] members = klass.getMembers();
for (int i = 0; i < members.length; i++)
{
String comment = members[i].getComment();
if ((comment != null) && (comment.length() > 0))
out.println("\t/** " + comment + " */");
RootClass type = members[i].getType();
if (type != null)
{
StringBuffer jType = new StringBuffer(type.getJavaClass().getName());
for (int j = 0; j < members[i].getArrayDim(); j++)
jType.append("[]");
String name = nameMangler.mangleMember(members[i].getName());
out.println("\t" + jType + " " + name + "();");
}
}
int version = klass.getVersion();
int checkSum = klass.getCheckSum();
if ((version > 0) || (checkSum > 0))
out.println();
if (version > 0)
out.println("\tpublic final static int rootIOVersion=" + version + ";");
if (checkSum > 0)
out.println("\tpublic final static int rootCheckSum=" + checkSum + ";");
out.println("}");
out.close();
return file;
}
private static void usage()
{
System.out.println("java RootObjectBrowser <file> [<class>]");
System.exit(0);
}
}