Adding support to returning struct/list of struct objects
[iot2.git] / iotjava / iotrmi / Java / sample / TestClass_Skeleton.java
index 73580a25e6735262e428ee4ebe07b21248ca139a..c16b1241a32ba7e03644bcbdbdbd2eacb0e579a5 100644 (file)
@@ -183,9 +183,9 @@ public class TestClass_Skeleton implements TestClassInterface {
        }
        
 
-       public void handleStruct(StructJ[] data) {
+       public StructJ[] handleStruct(StructJ[] data) {
 
-               tc.handleStruct(data);
+               return tc.handleStruct(data);
        }
        
        
@@ -197,7 +197,7 @@ public class TestClass_Skeleton implements TestClassInterface {
        }
        
        
-       public void ___handleStruct(int structsize1) {
+       public void ___handleStruct(int structsize1) throws IOException {
 
                Class<?>[] paramCls = new Class<?>[3*structsize1];
                Class<?>[] paramClsVal = new Class<?>[3*structsize1];
@@ -222,7 +222,28 @@ public class TestClass_Skeleton implements TestClassInterface {
                        data[i].value = (float) paramObj[pos++];
                        data[i].year = (int) paramObj[pos++];
                }
-               tc.handleStruct(data);
+               // Just the following if there is no returned value
+               //tc.handleStruct(data);
+               StructJ[] retStruct = tc.handleStruct(data);
+               // Return length first
+               int structsize2 = retStruct.length;
+               Object retObj = structsize2;
+               rmiObj.sendReturnObj(retObj);           
+               // Send the actual struct members
+               // Calculate the size of the array
+               Class<?>[] retCls = new Class<?>[3*structsize2];
+               Object[] retObj2 = new Object[3*structsize2];
+               // Handle with for loop
+               pos = 0;
+               for(int i = 0; i < structsize2; i++) {
+                       retCls[pos] = String.class;
+                       retObj2[pos++] = data[i].name;
+                       retCls[pos] = float.class;
+                       retObj2[pos++] = data[i].value;
+                       retCls[pos] = int.class;
+                       retObj2[pos++] = data[i].year;
+               }
+               rmiObj.sendReturnObj(retCls, retObj2);
        }
 
 
@@ -232,29 +253,17 @@ public class TestClass_Skeleton implements TestClassInterface {
        }
 
 
-       public int ___enumSize() {
-               
-               Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, 
-                       new Class<?>[] { null });
-               return (int) paramObj[0];
-       }
-
-
-       public void ___handleEnum(int enumSize1) throws IOException {
+       public void ___handleEnum() throws IOException {
 
-               Class<?>[] paramCls = new Class<?>[enumSize1];
-               Class<?>[] paramClsVal = new Class<?>[enumSize1];
-               for(int i=0; i < enumSize1; i++) {
-                       paramCls[i] = int.class;
-                       paramClsVal[i] = null;
-               }
-               Object[] paramObj = rmiObj.getMethodParams(paramCls, 
-                       paramClsVal);
+               Object[] paramObj = rmiObj.getMethodParams(new Class<?>[] { int[].class }, 
+                       new Class<?>[] { null }); 
                // Encoder/decoder
+               int paramInt[] = (int[]) paramObj[0];
+               int enumSize1 = paramInt.length;
                EnumJ[] enumJ = EnumJ.values();
                EnumJ[] data = new EnumJ[enumSize1];
                for (int i=0; i < enumSize1; i++) {
-                       data[i] = enumJ[(int) paramObj[i]];
+                       data[i] = enumJ[paramInt[i]];
                }
                // if void, just "handleEnum(data)"
                // this is when we have return value EnumJ[]
@@ -300,8 +309,7 @@ public class TestClass_Skeleton implements TestClassInterface {
                                        // Struct handling (3 is the size of the struct)
                                        case 10: ___handleStruct(structSize1); break;
                                        case 11: structSize1 = ___structSize(); break;
-                                       case 12: ___handleEnum(enumSize1); break;
-                                       case 13: enumSize1 = ___enumSize(); break;
+                                       case 12: ___handleEnum(); break;
                                        default:
                                                throw new Error("Method Id not recognized!");
                                }
@@ -316,51 +324,5 @@ public class TestClass_Skeleton implements TestClassInterface {
                TestClass tc = new TestClass(3, 5f, "7911");
                TestClass_Skeleton tcSkel = new TestClass_Skeleton(tc, port);
 
-/*             String[] methodSignatures = TestClass_CBSkeleton.getMethodSignatures();
-               IoTRMIObject rmiObj = new IoTRMIObject(port, methodSignatures);
-               Map<Integer,TestClassInterface> mapCBObject = new HashMap<Integer,TestClassInterface>();
-
-               // Can replace for-loop with while-loop if necessary
-               for (int i = 1; i < 3; i++) {
-                       TestClassInterface tcSkel = new TestClass_CBSkeleton(tc, i);
-                       mapCBObject.put(i, tcSkel);
-               }
-
-               Object retObj = null;
-               while (true) {
-                       byte[] method = rmiObj.getMethodBytes();
-                       int objId = IoTRMIObject.getObjectId(method);
-                       TestClass_CBSkeleton tcSkel = (TestClass_CBSkeleton) mapCBObject.get(objId);
-                       if (tcSkel != null) {
-                               rmiObj.setMethodBytes(method);
-                               retObj = tcSkel.invokeMethod(rmiObj);
-                       }
-                       if (retObj != null) {
-                               rmiObj.sendReturnObj(retObj);
-                       }
-               }
-*/
-               //int objectId = 1;
-               //System.out.println("Creating 0 object");
-               //TestClass_Skeleton tcSkel1 = new TestClass_Skeleton(tc, rmiObj, objectId);
-               //System.out.println("Creating 1 object");
-               //objectId = 2;
-               //TestClass_Skeleton tcSkel2 = new TestClass_Skeleton(tc, rmiObj, objectId);
-               //System.out.println("Creating 2 object");
-
-               /*for (int i = 1; i < 3; i++) {
-                       final int objectId = i;
-                       Thread thread = new Thread() {
-                               public void run() {
-                               try{
-                                               TestClass_Skeleton tcSkel = new TestClass_Skeleton(tc, rmiObj, objectId);
-                                       } catch (Exception ex){
-                                               ex.printStackTrace();
-                                               throw new Error("Error instantiating class CallBack_Skeleton!");
-                               }
-                           }
-                       };
-                       thread.start();
-               }*/
        }
 }