Initial version that handles multiple callback objects through 1 socket
[iot2.git] / iotjava / iotrmi / Java / sample / TestClass_Skeleton.java
index 7856cdf48c1aceb6d169cc3599d25eb58bb61997..02b279a5a3d36689ce76ea22ac6e57a711af5381 100644 (file)
@@ -1,14 +1,21 @@
 package iotrmi.Java.sample;
 
 import java.io.IOException;
+import java.util.Arrays;
 import java.util.Set;
-import iotrmi.Java.IoTRMIObject;
+import java.util.Map;
+import java.util.HashMap;
 
-import java.util.Arrays;
+import iotrmi.Java.IoTRMIObject;
+import iotrmi.Java.IoTRMICall;
 
 public class TestClass_Skeleton implements TestClassInterface {
 
-       private String[] methodSignatures = {
+       /**
+        * Class Constants
+        */
+       private int objectId = 0;       // Default value is 0
+       private final static String[] methodSignatures = {
 
                "voidsetA(int)",
                "voidsetB(float)",
@@ -17,10 +24,12 @@ public class TestClass_Skeleton implements TestClassInterface {
                "intsetAndGetA(int)",
                "intsetACAndGetA(string,int)",
                "intcallBack()",
-               "voidregisterCallBack(CallBackInterface)"
+               "voidregisterCallBack(CallBackInterface)",
+               "voidregisterCallBack(CallBackInterface[])"
        };
 
-       private TestClass tc;
+       private TestClassInterface tc;
+       private int port;
        private IoTRMIObject rmiObj;
        private CallBackInterface cbstub;
 
@@ -28,14 +37,14 @@ public class TestClass_Skeleton implements TestClassInterface {
        /**
         * Constructors
         */
-       //public TestClass_Skeleton(Object[] paramObj, int _port) throws
        public TestClass_Skeleton(TestClass _tc, int _port) throws
                ClassNotFoundException, InstantiationException,
                        IllegalAccessException, IOException {
 
-               //tc = new TestClass((int)paramObj[0], (float)paramObj[1], (String)paramObj[2]);
                tc = _tc;
+               port = _port;
                rmiObj = new IoTRMIObject(_port, methodSignatures);
+               waitRequestInvokeMethod();
        }
 
 
@@ -45,51 +54,72 @@ public class TestClass_Skeleton implements TestClassInterface {
                while (true) {
 
                        rmiObj.getMethodBytes();
-                       String methodSign = rmiObj.getSignature();
-                       Object[] paramObj = null;
-                       Object retObj = null;
-                       System.out.println("Method sign: " + methodSign);
-
-                       if (methodSign.equals("voidsetA(int)")) {
-                               paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, 
-                                       new Class<?>[] { null }, new Class<?>[] { null });
-                               setA((int) paramObj[0]);
-                       } else if (methodSign.equals("voidsetB(float)")) {
-                               paramObj = rmiObj.getMethodParams(new Class<?>[] { float.class }, 
-                                       new Class<?>[] { null }, new Class<?>[] { null });
-                               setB((float) paramObj[0]);
-                       } else if (methodSign.equals("voidsetC(string)")) {
-                               paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class }, 
-                                       new Class<?>[] { null }, new Class<?>[] { null });
-                               setC((String) paramObj[0]);
-                       } else if (methodSign.equals("sumArray(string[])")) {
-                               paramObj = rmiObj.getMethodParams(new Class<?>[] { String[].class }, 
-                                       new Class<?>[] { null }, new Class<?>[] { null });
-                               retObj = sumArray((String[]) paramObj[0]);
-                       } else if (methodSign.equals("intsetAndGetA(int)")) {
-                               paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, 
-                                       new Class<?>[] { null }, new Class<?>[] { null });
-                               retObj = setAndGetA((int) paramObj[0]);
-                       } else if (methodSign.equals("intsetACAndGetA(string,int)")) {
-                               paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class, int.class }, 
-                                       new Class<?>[] { null, null }, new Class<?>[] { null, null });
-                               retObj = setACAndGetA((String) paramObj[0], (int) paramObj[1]);
-                       } else if (methodSign.equals("voidregisterCallBack(CallBackInterface)")) {
-                               paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class, String.class, int.class }, 
-                                       new Class<?>[] { null, null, null }, new Class<?>[] { null, null, null });
-                               CallBackInterface cbstub = new CallBack_Stub((int) paramObj[0], (String) paramObj[1], (int) paramObj[2]);
-                               registerCallback((CallBackInterface) cbstub);
-                       } else if (methodSign.equals("intcallBack()")) {
-                               retObj = callBack();
-                       } else
-                               throw new Error("Signature un-recognized!");
-
-                       if (retObj != null) {
-                               rmiObj.sendReturnObj(retObj);
+                       int _objectId = rmiObj.getObjectId();
+                       if (_objectId == objectId) {
+                       // Multiplex based on object Id
+                               String methodSign = rmiObj.getSignature();
+                               Object[] paramObj = null;
+                               Object retObj = null;
+
+                               if (methodSign.equals("voidsetA(int)")) {
+                                       paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, 
+                                               new Class<?>[] { null }, new Class<?>[] { null });
+                                       setA((int) paramObj[0]);
+                               } else if (methodSign.equals("voidsetB(float)")) {
+                                       paramObj = rmiObj.getMethodParams(new Class<?>[] { float.class }, 
+                                               new Class<?>[] { null }, new Class<?>[] { null });
+                                       setB((float) paramObj[0]);
+                               } else if (methodSign.equals("voidsetC(string)")) {
+                                       paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class }, 
+                                               new Class<?>[] { null }, new Class<?>[] { null });
+                                       setC((String) paramObj[0]);
+                               } else if (methodSign.equals("sumArray(string[])")) {
+                                       paramObj = rmiObj.getMethodParams(new Class<?>[] { String[].class }, 
+                                               new Class<?>[] { null }, new Class<?>[] { null });
+                                       retObj = sumArray((String[]) paramObj[0]);
+                               } else if (methodSign.equals("intsetAndGetA(int)")) {
+                                       paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class }, 
+                                               new Class<?>[] { null }, new Class<?>[] { null });
+                                       retObj = setAndGetA((int) paramObj[0]);
+                               } else if (methodSign.equals("intsetACAndGetA(string,int)")) {
+                                       paramObj = rmiObj.getMethodParams(new Class<?>[] { String.class, int.class }, 
+                                               new Class<?>[] { null, null }, new Class<?>[] { null, null });
+                                       retObj = setACAndGetA((String) paramObj[0], (int) paramObj[1]);
+                               } else if (methodSign.equals("voidregisterCallBack(CallBackInterface)")) {
+                                       paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class, String.class, int.class }, 
+                                               new Class<?>[] { null, null, null }, new Class<?>[] { null, null, null });
+                                       CallBackInterface cbstub = new CallBack_Stub((int) paramObj[0], (String) paramObj[1], (int) paramObj[2]);
+                                       registerCallback((CallBackInterface) cbstub);
+                               } else if (methodSign.equals("voidregisterCallBack(CallBackInterface[])")) {
+                                       paramObj = rmiObj.getMethodParams(new Class<?>[] { int.class, String.class, int.class, int.class }, 
+                                               new Class<?>[] { null, null, null, null }, new Class<?>[] { null, null, null, null });
+                                       String[] methodSignatures = CallBack_CBStub.getMethodSignatures();
+                                       IoTRMICall rmiCall = new IoTRMICall((int) paramObj[0], (String) paramObj[1], (int) paramObj[2], methodSignatures);
+                                       int numStubs = (int) paramObj[3];
+                                       CallBackInterface[] stub = new CallBackInterface[numStubs];
+                                       for (int objId = 0; objId < numStubs; objId++) {
+                                               stub[objId] = new CallBack_CBStub(rmiCall, objId, (String) paramObj[1]);
+                                       }
+                                       registerCallback(stub);
+                               } else if (methodSign.equals("intcallBack()")) {
+                                       retObj = callBack();
+                               } else
+                                       throw new Error("Signature not recognized!");
+
+                               if (retObj != null) {
+                                       rmiObj.sendReturnObj(retObj);
+                               }
+                               System.out.println("Servicing remote call for object: " + objectId + " - method: " + methodSign);
                        }
-                       System.out.println("Servicing remote call for method: " + methodSign);
                }
        }
+
+
+       // Return method signatures
+       public static String[] getMethodSignatures() {
+
+               return methodSignatures;
+       }
        
        
        public void setA(int _int) {
@@ -132,7 +162,11 @@ public class TestClass_Skeleton implements TestClassInterface {
                
                tc.registerCallback(_cb);
        }
-       
+
+       public void registerCallback(CallBackInterface[] _cb) {
+               
+               tc.registerCallback(_cb);
+       }
        
        public int callBack() {
                
@@ -144,8 +178,53 @@ public class TestClass_Skeleton implements TestClassInterface {
 
                int port = 5010;
                TestClass tc = new TestClass(3, 5f, "7911");
-               //TestClass_Skeleton tcSkel = new TestClass_Skeleton(new Object[] { 3, 5f, "7911"}, port);
                TestClass_Skeleton tcSkel = new TestClass_Skeleton(tc, port);
-               tcSkel.waitRequestInvokeMethod();
+
+/*             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();
+               }*/
        }
 }