private Socket socket;
private ObjectOutputStream outStream;
private ObjectInputStream inStream;
+ private Map<String,Object> mapObjNameStub;
/**
* IoTSet object, e.g. IoTSet<ProximitySensor> proximity_sensors;
socket = null;
outStream = null;
inStream = null;
+ mapObjNameStub = new HashMap<String,Object>();
STR_JAR_FILE_PATH = null;
STR_OBJ_CLS_PFX = null;
// 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;
}