First benchmark working with capability-based RMI; adjustments in callbacks, etc.
[iot2.git] / iotjava / iotruntime / slave / IoTSlave.java
index 856431a1f1fbe5d95f1c02ea854df100a01402cc..24df680fcb114c9eec585f6fbf30e378c40578bc 100644 (file)
@@ -66,6 +66,7 @@ public class IoTSlave {
        private Socket socket;
        private ObjectOutputStream outStream;
        private ObjectInputStream inStream;
+       private Map<String,Object> mapObjNameStub;
 
        /**
         * IoTSet object, e.g. IoTSet<ProximitySensor> proximity_sensors;
@@ -122,6 +123,7 @@ public class IoTSlave {
                socket = null;
                outStream = null;
                inStream = null;
+               mapObjNameStub = new HashMap<String,Object>();
 
                STR_JAR_FILE_PATH = null;
                STR_OBJ_CLS_PFX = null;
@@ -433,30 +435,37 @@ public class IoTSlave {
 
                // Translating into the actual Message class
                MessageGetObject sMessage = (MessageGetObject) sIoTMasterMsg;
-               // Instantiate the stub and put in the object
-               String strObjStubName = sMainObjectName + "." + sMessage.getObjectStubInterfaceName() + STUB_CLASS_SUFFIX;
-               RuntimeOutput.print("IoTSlave: Stub object: " + strObjStubName, BOOL_VERBOSE);
-               Class<?> clsStub = Class.forName(strObjStubName);       // Port number is integer
-               Class[] clsStubParams = { int.class, String.class, String.class, int.class, int[].class };
-               Constructor<?> objStubCons = clsStub.getDeclaredConstructor(clsStubParams);
-               Integer[] portsInteger = sMessage.getRMICallbackPorts();
-               int[] ports = Arrays.stream(portsInteger).mapToInt(Integer::intValue).toArray();
-               int rev = 0;
-               String callbackAddress = InetAddress.getLocalHost().getHostAddress();   // Callback address is this machine's address
-               Object objStubParams[] = { sMessage.getRMIStubPort(), sMessage.getHostAddress(), callbackAddress,
-                                                                       rev, ports };
-               RuntimeOutput.print("IoTSlave: Creating RMI stub: " +
-                       sMessage.getHostAddress() + ":" + sMessage.getRMIRegPort() +
-                       " with callback address: " + callbackAddress + " and RMI stub port: " + sMessage.getRMIStubPort(), BOOL_VERBOSE);
-               Object stubObj = objStubCons.newInstance(objStubParams);
-               RuntimeOutput.print("IoTSlave: Object name: " + sMessage.getObjectName(), BOOL_VERBOSE);
-               RuntimeOutput.print("IoTSlave: Stub address: " + callbackAddress, BOOL_VERBOSE);
-               // Class conversion to interface class of this class,
-               // e.g. ProximitySensorImpl has ProximitySensor interface
+               Object stubObjConv = null;
+               String strObjectName = sMessage.getObjectName();
                String strObjClassInterfaceName = STR_OBJ_CLS_PFX + "." + STR_INTERFACE_PFX + "." +
                        sMessage.getObjectStubInterfaceName();
                Class<?> clsInf = Class.forName(strObjClassInterfaceName);
-               Object stubObjConv = clsInf.cast(stubObj);
+               if (mapObjNameStub.containsKey(strObjectName)) {
+                       RuntimeOutput.print("IoTSlave: Getting back object on slave: " + strObjectName, BOOL_VERBOSE);
+                       stubObjConv = clsInf.cast(mapObjNameStub.get(strObjectName));
+               } else {
+                       // Instantiate the stub and put in the object
+                       String strObjStubName = sMainObjectName + "." + sMessage.getObjectStubInterfaceName() + STUB_CLASS_SUFFIX;
+                       Class<?> clsStub = Class.forName(strObjStubName);       // Port number is integer
+                       Class[] clsStubParams = { int.class, String.class, String.class, int.class, int[].class };
+                       Constructor<?> objStubCons = clsStub.getDeclaredConstructor(clsStubParams);
+                       Integer[] portsInteger = sMessage.getRMICallbackPorts();
+                       int[] ports = Arrays.stream(portsInteger).mapToInt(Integer::intValue).toArray();
+
+                       int rev = 0;
+                       String callbackAddress = InetAddress.getLocalHost().getHostAddress();   // Callback address is this machine's address
+                       Object objStubParams[] = { sMessage.getRMIStubPort(), sMessage.getHostAddress(), callbackAddress,
+                                                                               rev, ports };
+                       RuntimeOutput.print("IoTSlave: Creating RMI stub: " +
+                               sMessage.getHostAddress() + ":" + sMessage.getRMIRegPort() +
+                               " with callback address: " + callbackAddress + " and RMI stub port: " + sMessage.getRMIStubPort(), BOOL_VERBOSE);
+                       Object stubObj = objStubCons.newInstance(objStubParams);
+                       // Class conversion to interface class of this class,
+                       // e.g. ProximitySensorImpl has ProximitySensor interface
+                       RuntimeOutput.print("IoTSlave: Registering new stub object: " + strObjectName, BOOL_VERBOSE);
+                       mapObjNameStub.put(strObjectName, stubObj);
+                       stubObjConv = clsInf.cast(stubObj);
+               }
 
                return stubObjConv;
        }