// Copyright 2002, SLAC, Stanford University, U.S.A. package org.freehep.aid; import org.freehep.rtti.IType; /** * @author Mark Donszelmann * @version $Id: ObjectCollectionToObjectVector.java 8584 2006-08-10 23:06:37Z duns $ */ public class ObjectCollectionToObjectVector extends JNITypeConversion { public ObjectCollectionToObjectVector(String indent, String cr) { super(indent, cr); } public String convertToJava(JNITypeConverter converter, int scope, IType type, int dimension, String nameSpace, String src, String dst) { StringBuffer s = new StringBuffer(); s.append(indent(scope)); s.append("// convert vector<object> to Collection<Object>"); s.append(cr); s.append(indent(scope)); s.append("jclass cls"); s.append(scope); s.append(" = env->FindClass(\"java.util.Vector\");"); s.append(cr); s.append(indent(scope)); s.append("jmethodID constructor"); s.append(scope); s.append(" = env->GetMethodID(cls"); s.append(scope); s.append(", \"<init>\", \"()V\");"); s.append(cr); s.append(indent(scope)); s.append("jmethodID addMethod"); s.append(scope); s.append(" = env->GetMethodID(cls"); s.append(scope); s.append(", \"add\", \"(Ljava/lang/Object;)Z\");"); s.append(cr); s.append(indent(scope)); s.append(dst); s.append(" = env->NewObject(cls"); s.append(scope); s.append(", constructor"); s.append(scope); s.append(");"); s.append(cr); s.append(indent(scope)); s.append("for (int i"); s.append(scope); s.append("=0; i"); s.append(scope); s.append("<"); s.append(src); s.append(".size(); i"); s.append(scope); s.append("++) {"); s.append(cr); s.append(indent(scope+1)); s.append("jobject v"); s.append(scope+1); s.append(";"); s.append(cr); s.append(converter.convertToJava(scope+1, type.getTypes()[0], 0, nameSpace, src+"[i"+scope+"]", "v"+(scope+1))); s.append(indent(scope+1)); s.append("env->CallBooleanMethod("); s.append(dst); s.append(", addMethod"); s.append(scope); s.append(", "); s.append("v"); s.append(scope+1); s.append(");"); s.append(cr); s.append(indent(scope)); s.append("}"); s.append(cr); return s.toString(); } public String convertToCPP(JNITypeConverter converter, int scope, IType type, int dimension, String nameSpace, String src, String dst) { StringBuffer s = new StringBuffer(); type = type.getTypes()[0]; s.append(indent(scope)); s.append("// convert Collection<Object> to vector<object>"); s.append(cr); s.append(indent(scope)); s.append("jclass collectionClass"); s.append(scope); s.append(" = env->GetObjectClass("); s.append(src); s.append(");"); s.append(cr); s.append(indent(scope)); s.append("jmethodID iteratorMethod"); s.append(scope); s.append(" = env->GetMethodID(collectionClass"); s.append(scope); s.append(", \"iterator\", \"()Ljava.util.Iterator;\");"); s.append(cr); s.append(indent(scope)); s.append("jobject iterator"); s.append(scope); s.append(" = (jobject)env->CallObjectMethod("); s.append(src); s.append(", iteratorMethod"); s.append(scope); s.append(");"); s.append(cr); s.append(indent(scope)); s.append("jclass iteratorClass"); s.append(scope); s.append(" = env->GetObjectClass(iterator"); s.append(scope); s.append(");"); s.append(cr); s.append(indent(scope)); s.append("jmethodID hasNextMethod"); s.append(scope); s.append(" = env->GetMethodID(iteratorClass"); s.append(scope); s.append(", \"hasNext\", \"()Z\");"); s.append(cr); s.append(indent(scope)); s.append("jmethodID nextMethod"); s.append(scope); s.append(" = env->GetMethodID(iteratorClass"); s.append(scope); s.append(", \"next\", \"()Ljava.lang.Object;\");"); s.append(cr); s.append(indent(scope)); s.append("while (env->CallBooleanMethod(iterator"); s.append(scope); s.append(", hasNextMethod"); s.append(scope); s.append(")) {"); s.append(cr); s.append(indent(scope+1)); s.append(converter.jniType(type, 0)); s.append(" o"); s.append(scope+1); s.append(" = ("); s.append(converter.jniType(type, 0)); s.append(")env->CallObjectMethod(iterator"); s.append(scope); s.append(", nextMethod"); s.append(scope); s.append(");"); s.append(cr); s.append(indent(scope+1)); s.append(converter.basicType(type, 0, nameSpace)); s.append(" d"); s.append(scope+1); s.append(";"); s.append(cr); s.append(converter.convertToCPP(scope+1, type, 0, nameSpace, "o"+(scope+1), "d"+(scope+1))); s.append(indent(scope+1)); s.append(dst); s.append(".push_back(d"); s.append(scope+1); s.append(");"); s.append(cr); // s.append(freeStringToCharStar(scope+1, "s", "c")); s.append(indent(scope)); s.append("}"); s.append(cr); return s.toString(); } }