package hep.io.root.core; import hep.io.root.RootClass; import hep.io.root.RootMember; import org.apache.bcel.Constants; import org.apache.bcel.classfile.JavaClass; import org.apache.bcel.generic.ClassGen; import org.apache.bcel.generic.ConstantPoolGen; import org.apache.bcel.generic.FieldGen; import org.apache.bcel.generic.MethodGen; import org.apache.bcel.generic.Type; /** * Creates a Java interface with accessor methods for each root member * @author tonyj */ public class InterfaceBuilder implements ClassBuilder, Constants { private NameMangler nameMangler = NameMangler.instance(); public String getStem() { return "hep.io.root.interfaces"; } public JavaClass build(GenericRootClass klass) { RootClass[] superClasses = klass.getSuperClasses(); String[] superClassNames = new String[superClasses.length + 1]; superClassNames[0] = "hep.io.root.RootObject"; for (int i = 0; i < superClasses.length; i++) superClassNames[i + 1] = nameMangler.mangleInterfaceName(superClasses[i].getClassName()); ClassGen cg = new ClassGen(nameMangler.mangleInterfaceName(klass.getClassName()), "java/lang/Object", "<generated>", ACC_PUBLIC | ACC_INTERFACE | ACC_ABSTRACT, superClassNames); ConstantPoolGen cp = cg.getConstantPool(); RootMember[] members = klass.getMembers(); for (int i = 0; i < members.length; i++) { RootClass rootClass = members[i].getType(); if (rootClass instanceof BasicRootClass) { Type type = ((BasicRootClass) rootClass).getJavaType(); MethodGen mg = new MethodGen(ACC_PUBLIC | ACC_ABSTRACT, type, null, null, nameMangler.mangleMember(members[i].getName()), null, null, cp); cg.addMethod(mg.getMethod()); } } int version = klass.getVersion(); if (version > 0) { FieldGen fg = new FieldGen(ACC_PUBLIC | ACC_STATIC | ACC_FINAL, Type.INT, "rootIOVersion", cp); fg.setInitValue(version); cg.addField(fg.getField()); } int checkSum = klass.getCheckSum(); if (checkSum > 0) { FieldGen fg = new FieldGen(ACC_PUBLIC | ACC_STATIC | ACC_FINAL, Type.INT, "rootCheckSum", cp); fg.setInitValue(checkSum); cg.addField(fg.getField()); } return cg.getJavaClass(); } }