// Copyright 2002-2005, FreeHEP. package org.freehep.aid; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.SortedSet; import org.freehep.rtti.IClass; import org.freehep.rtti.IConstructor; import org.freehep.rtti.IField; import org.freehep.rtti.IMethod; import org.freehep.rtti.INamedType; import org.freehep.util.io.IndentPrintWriter; /** * @author Mark Donszelmann * @version $Id: JNIHeaderGenerator.java 8584 2006-08-10 23:06:37Z duns $ */ public class JNIHeaderGenerator extends AbstractCPPHeaderGenerator { public JNIHeaderGenerator(String propDir) { super(propDir); properties.setProperty("jni", "true"); properties.setProperty("jni.header", "true"); } protected String prefix() { return "J"; } public String filename(IClass clazz) { return prefix() + clazz.getName() + ".h"; } protected void includeStatements(IClass clazz, SortedSet sysIncludes, SortedSet includes, String namespace, SortedSet types) { sysIncludes.add("jni.h"); // add interface name we are implementing String iface = converter.qualifiedName(clazz.getName(), prefix()+namespace(clazz)); includes.add(includeProperties.getProperty(iface, iface)); String interfaces[] = clazz.getInterfaces(); for (int i = 0; i < interfaces.length; i++) { includes.add(prefix() + interfaces[i]+".h"); } IConstructor constructors[] = clazz.getConstructors(); for (int c = 0; c < constructors.length; c++) { INamedType parameterTypes[] = constructors[c].getParameterTypes(); for (int p = 0; p < parameterTypes.length; p++) { includeFrom(parameterTypes[p].getType(), clazz.getName(), sysIncludes, includes, prefix()+namespace, types); } } super.includeStatements(clazz, sysIncludes, includes, prefix()+namespace, types); // add AID stuff if (interfaces.length == 0) { includes.add("JAID/JAIDRef.h"); } } protected void printClassHeader(IndentPrintWriter out, IClass clazz) { out.print("class " + prefix() + clazz.getName() + ": "); String interfaces[] = clazz.getInterfaces(); if (interfaces.length == 0) { out.print("public JAID::JAIDRef"); } else { int k = 0; for (int i = 0; i < interfaces.length; i++) { if (k > 0) out.print(", "); out.print("public "); out.print(prefix() + interfaces[i]); k++; } } out.print(", public virtual "); out.print(converter.qualifiedName(clazz.getName(), prefix()+namespace(clazz))); out.println(" {"); } protected void printPrivate(IndentPrintWriter out, IClass clazz) { Map methods = new HashMap(); for (int i=0; i<clazz.getMethods().length; i++) { IMethod m = clazz.getMethods()[i]; String name = m.getName()+converter.getSignature(m, clazz.getPackageName()); methods.put(name, m); } if (!methods.isEmpty()) { out.println(); out.println("private: "); } for (Iterator i = methods.entrySet().iterator(); i.hasNext(); ) { Map.Entry entry = (Map.Entry)i.next(); // IMethod method = (IMethod)entry.getValue(); out.print(" jmethodID " + entry.getKey() + "Method"); out.println(";"); /* FIXME later IType type = method.getReturnType(); if (!type.isPrimitive() && !type.isVoid()) { if (type.isReference() || (type.getPointer() > 0)) { out.print(" "+converter.basicType(type, namespace(clazz))+" "+name+"Result"); out.println(";"); } } */ } } protected void printProtected(IndentPrintWriter out, IClass clazz) { String name = prefix() + clazz.getName(); out.println(); out.println("protected:"); out.println(" inline " + name + "() { };"); out.println(" inline " + name + "(const " + name + "& r) { };"); out.println(" inline " + name + "& operator=(const " + name + "&) { return *this; };"); } protected void printPublic(IndentPrintWriter out, IClass clazz) { out.println(); out.println("public: "); out.println(" /**"); out.println(" * Default JNI Constructor"); out.println(" */"); out.println(" " + prefix() + clazz.getName() + "(JNIEnv *env, jobject object);"); out.println(); out.println(" /// Destructor."); out.println(" virtual ~" + prefix() + clazz.getName() + "();"); } protected void printConstructor(IndentPrintWriter out, IConstructor constructor, String nameSpace) { String comments[] = constructor.getComments("cpp"); for (int i = 0; i < comments.length; i++) { out.print(comments[i]); } out.print(" "); out.print(prefix() + constructor.getName()); out.print("("); INamedType parameterTypes[] = constructor.getParameterTypes(); for (int i = 0; i < parameterTypes.length; i++) { out.print(namedType(parameterTypes[i], nameSpace)); if (i < parameterTypes.length - 1) { out.print(", "); } } out.print(");"); } protected void printMethod(IndentPrintWriter out, IMethod method, String nameSpace) { super.printMethod(out, method, prefix()+nameSpace); out.println(";"); } protected void printField(IndentPrintWriter out, IField ifield, String nameSpace) { } protected boolean printDefines(IndentPrintWriter out, IClass clazz) { return true; } }