+ //System.out.println(Arrays.toString(paramObj2));
+ Object retObj = rmiCall.remoteCall(objectId, methodId2, retType2, null, paramCls2, paramObj2);
+ // RETURN STRUCT
+ // Get the length of the struct first
+ int structsize1 = (int) retObj;
+ // Construct the struct
+ Class<?>[] retCls = new Class<?>[3*structsize1];
+ Class<?>[] retClsVal = new Class<?>[3*structsize1];
+ pos = 0;
+ for(int i=0; i < structsize1; i++) {
+ retCls[pos] = String.class;
+ retClsVal[pos++] = null;
+ retCls[pos] = float.class;
+ retClsVal[pos++] = null;
+ retCls[pos] = int.class;
+ retClsVal[pos++] = null;
+ }
+ Object[] retObj2 = rmiCall.getStructObjects(retCls,
+ retClsVal);
+ StructJ[] dataRet = new StructJ[structsize1];
+ for (int i=0; i < structsize1; i++) {
+ dataRet[i] = new StructJ();
+ }
+ pos = 0;
+ for(int i=0; i < structsize1; i++) {
+ dataRet[i].name = (String) retObj2[pos++];
+ dataRet[i].value = (float) retObj2[pos++];
+ dataRet[i].year = (int) retObj2[pos++];
+ }
+
+ return dataRet;
+ }
+
+
+ public EnumJ[] handleEnum(EnumJ[] en) {
+
+ int methodId = 12;
+ Class<?> retType = int[].class;
+ // Handle with for loop
+ int paramInt[] = new int[en.length];
+ for(int i = 0; i < en.length; i++) {
+ paramInt[i] = en[i].ordinal();
+ }
+
+ Class<?>[] paramCls = new Class<?>[] { int[].class };
+ Object[] paramObj = new Object[] { paramInt };
+
+ // if no return value just
+ // rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+ // This is with return value:
+ Object retObj =
+ rmiCall.remoteCall(objectId, methodId, retType, null, paramCls, paramObj);
+ int[] retEnumInt = (int[]) retObj;
+ int enumsize1 = retEnumInt.length;
+ // Encoder/decoder
+ EnumJ[] enumJ = EnumJ.values();
+ EnumJ[] enRetVal = new EnumJ[enumsize1];
+ for(int i = 0; i < enumsize1; i++) {
+ enRetVal[i] = enumJ[retEnumInt[i]];
+ }
+ return enRetVal;