// Copyright 2002, SLAC, Stanford University, U.S.A. package org.freehep.aid; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Properties; import org.freehep.rtti.IType; /** * @author Mark Donszelmann * @version $Id: JNITypeConverter.java 8584 2006-08-10 23:06:37Z duns $ */ public class JNITypeConverter extends CPPTypeConverter { protected Map types = new HashMap(); protected String cr; protected Properties jniProperties = new Properties(); public JNITypeConverter(String propDir, String indent, String cr) { super(propDir); this.cr = cr; String name = "aid.jni.cpp.properties"; try { jniProperties.load(getClass().getResourceAsStream(name)); } catch (IOException ioe) { System.err.println(getClass().getName()+": Unable to load property file "+name); } types.put("Color", new ColorToDoubleVector(indent, cr)); types.put("Collection", new ObjectCollectionToObjectVector(indent, cr)); types.put("Object[]", new ObjectArrayToObjectVector(indent, cr)); types.put("String", new StringToString(indent, cr)); types.put("primitive", new PrimitiveToPrimitive(indent, cr)); types.put("primitive[]", new PrimitiveArrayToPrimitiveVector(indent, cr)); } public String convertToJava(int scope, IType type, int dimension, String nameSpace, String src, String dst) { JNITypeConversion conversion = getConversion(type, dimension); if (conversion != null) { return conversion.convertToJava(this, scope, type, dimension, nameSpace, src, dst); } else { return "// WARNING no conversion for "+type+cr; } } public String convertToCPP(int scope, IType type, int dimension, String nameSpace, String src, String dst) { JNITypeConversion conversion = getConversion(type, dimension); if (conversion != null) { return conversion.convertToCPP(this, scope, type, dimension, nameSpace, src, dst); } else { return "// WARNING no conversion for "+type+cr; } } protected JNITypeConversion getConversion(IType type, int dimension) { String typeName = type.getName(); switch (dimension) { case 0: if (type.isPrimitive()) { return (JNITypeConversion)types.get("primitive"); } else { return (JNITypeConversion)types.get(typeName); } case 1: if (type.isPrimitive()) { return (JNITypeConversion)types.get("primitive[]"); } else { return (JNITypeConversion)types.get("Object[]"); } default: return (JNITypeConversion)types.get("Object[]"); } } public String jniCall(IType type) { return jniCall(type, type.getDimension()); } public String jniCall(IType type, int dimension) { if (type.isPrimitive() && (dimension == 0)) { return Character.toUpperCase(type.getName().charAt(0))+type.getName().substring(1); } return "Object"; } public String jniType(IType type) { return jniType(type, type.getDimension()); } public String jniType(IType type, int dimension) { String jniType = jniProperties.getProperty(type.getName(), "jobject"); switch (dimension) { case 0: return jniType; case 1: return jniType.equals("jstring") ? "jobjectArray" : jniType+"Array"; default: return "jobjectArray"; } } }