Integrating capability-based RMI on Sentinel for Java side
[iot2.git] / iotjava / iotruntime / master / IoTMaster.java
index bc3b06067a456b5cde88be2cf9826b5bfbad7f6b..7bd6ed87dfd51a71204bd9fafd9dba85c20b8c4f 100644 (file)
@@ -60,6 +60,7 @@ public class IoTMaster {
        private String strObjName;
        private String strObjClassName;
        private String strObjClassInterfaceName;
+       private String strObjStubClsIntfaceName;
        private String strIoTMasterHostAdd;
        private String strIoTSlaveControllerHostAdd;
        private String strIoTSlaveObjectHostAdd;
@@ -100,6 +101,7 @@ public class IoTMaster {
        private static final String STR_NO_PROTOCOL = "nopro";
        private static final String STR_SELF_MAC_ADD = "00:00:00:00:00:00";
        private static final String STR_INTERFACE_CLS_CFG = "INTERFACE_CLASS";
+       private static final String STR_INT_STUB_CLS_CFG = "INTERFACE_STUB_CLASS";
        private static final String STR_FILE_TRF_CFG = "ADDITIONAL_ZIP_FILE";
        private static final String STR_YES = "Yes";
        private static final String STR_NO = "No";
@@ -129,6 +131,7 @@ public class IoTMaster {
                strObjName = null;
                strObjClassName = null;
                strObjClassInterfaceName = null;
+               strObjStubClsIntfaceName = null;
                strIoTMasterHostAdd = null;
                strIoTSlaveControllerHostAdd = null;
                strIoTSlaveObjectHostAdd = null;
@@ -469,8 +472,10 @@ public class IoTMaster {
 
                // Extract the interface name for RMI
                // e.g. ProximitySensorInterface, TempSensorInterface, etc.
-               String strObjCfgFile = STR_IOT_CODE_PATH + strObjClassName + "/" + strObjClassName + STR_CFG_FILE_EXT;
+               
+String strObjCfgFile = STR_IOT_CODE_PATH + strObjClassName + "/" + strObjClassName + STR_CFG_FILE_EXT;
                strObjClassInterfaceName = parseConfigFile(strObjCfgFile, STR_INTERFACE_CLS_CFG);
+               strObjStubClsIntfaceName = parseConfigFile(strObjCfgFile, STR_INT_STUB_CLS_CFG);
                // Create an object name, e.g. ProximitySensorImplPS1
                strObjName = strObjClassName + strFieldObjectID;
                // Check first if host exists
@@ -491,7 +496,7 @@ public class IoTMaster {
                        // Naming for objects ProximitySensor becomes ProximitySensor0, ProximitySensor1, etc.
                        commHan.addPortConnection(strIoTSlaveObjectHostAdd, strObjName);
                        commHan.addActiveControllerObject(strFieldObjectID, strObjName, strObjClassName, strObjClassInterfaceName, 
-                               strIoTSlaveObjectHostAdd, arrFieldValues, arrFieldClasses);
+                               strObjStubClsIntfaceName, strIoTSlaveObjectHostAdd, arrFieldValues, arrFieldClasses);
                        // ROUTING POLICY: IoTMaster and device/controller object
                        // Master-slave communication
                        routerConfig.configureRouterMainPolicies(STR_ROUTER_ADD, strIoTMasterHostAdd,
@@ -693,7 +698,7 @@ public class IoTMaster {
         * @params  arrFieldClasses                             Array of field classes
         * @return  void
         */
-       private void createObject(String strObjName, String strObjClassName, String strObjClassInterfaceName, 
+       private void createObject(String strObjName, String strObjClassName, String strObjClassInterfaceName, String strObjStubClsIntfaceName,
                String strIoTSlaveObjectHostAdd, String strFieldObjectID, Object[] arrFieldValues, Class[] arrFieldClasses) 
                throws IOException, FileNotFoundException, ClassNotFoundException, InterruptedException {
 
@@ -750,7 +755,7 @@ public class IoTMaster {
 
                // Pack object information to create object on a IoTSlave
                Message msgObjIoTSlave = new MessageCreateObject(IoTCommCode.CREATE_OBJECT, strIoTSlaveObjectHostAdd,
-                       strObjClassName, strObjName, strObjClassInterfaceName, commHan.getRMIRegPort(strObjName), 
+                       strObjClassName, strObjName, strObjClassInterfaceName, strObjStubClsIntfaceName, commHan.getRMIRegPort(strObjName), 
                        commHan.getRMIStubPort(strObjName), arrFieldValues, arrFieldClasses);
                // Send message
                commMasterToSlave(msgObjIoTSlave, "Sending object information", inStream, outStream);
@@ -797,6 +802,7 @@ public class IoTMaster {
                        }
                }
                // End the session
+               // TODO: Change this later
                outStream.writeObject(new MessageSimple(IoTCommCode.END_SESSION));
 
                // PROFILING
@@ -830,8 +836,9 @@ public class IoTMaster {
                                        synchronized(this) {
                                                try {
                                                        createObject(strObjName, objCrtInfo.getObjectClassName(), objCrtInfo.getObjectClassInterfaceName(),
-                                                               objCrtInfo.getIoTSlaveObjectHostAdd(), commHan.getFieldObjectID(strObjName), 
-                                                               commHan.getArrayFieldValues(strObjName), commHan.getArrayFieldClasses(strObjName));
+                                                               objCrtInfo.getObjectStubClassInterfaceName(), objCrtInfo.getIoTSlaveObjectHostAdd(), 
+                                                               commHan.getFieldObjectID(strObjName), commHan.getArrayFieldValues(strObjName), 
+                                                               commHan.getArrayFieldClasses(strObjName));
                                                } catch (IOException                    | 
                                                                 ClassNotFoundException |
                                                                 InterruptedException ex) {
@@ -879,7 +886,7 @@ public class IoTMaster {
                        // Call the method to create an object
                        instrumentObject(strObjID);
                        objInitHand.addObjectIntoField(strFieldName, strIoTSlaveObjectHostAdd, strObjName,
-                               strObjClassName, strObjClassInterfaceName, commHan.getRMIRegPort(strObjName), 
+                               strObjClassName, strObjClassInterfaceName, strObjStubClsIntfaceName, commHan.getRMIRegPort(strObjName), 
                                commHan.getRMIStubPort(strObjName));
                }
        }
@@ -911,8 +918,8 @@ public class IoTMaster {
                        // Get the first object controller host address
                        String strFirstIoTSlaveObjectHostAdd = strIoTSlaveObjectHostAdd;
                        objInitHand.addObjectIntoField(strFieldName, strIoTSlaveObjectHostAdd, strObjName,
-                               strObjClassName, strObjClassInterfaceName, commHan.getRMIRegPort(strObjName)
-                               commHan.getRMIStubPort(strObjName));
+                               strObjClassName, strObjClassInterfaceName, strObjStubClsIntfaceName
+                               commHan.getRMIRegPort(strObjName), commHan.getRMIStubPort(strObjName));
                        // Operate on the second set
                        arrFieldClasses = relationInstrumenter.secondFieldClasses(iRow);
                        arrFieldValues = relationInstrumenter.secondFieldValues(iRow);
@@ -923,8 +930,8 @@ public class IoTMaster {
                        // Get the second object controller host address
                        String strSecondIoTSlaveObjectHostAdd = strIoTSlaveObjectHostAdd;
                        objInitHand.addSecondObjectIntoField(strFieldName, strIoTSlaveObjectHostAdd, strObjName,
-                               strObjClassName, strObjClassInterfaceName, commHan.getRMIRegPort(strObjName)
-                               commHan.getRMIStubPort(strObjName));
+                               strObjClassName, strObjClassInterfaceName, strObjStubClsIntfaceName
+                               commHan.getRMIRegPort(strObjName), commHan.getRMIStubPort(strObjName));
 
                        // ROUTING POLICY: first and second controller objects in IoTRelation
                        routerConfig.configureRouterMainPolicies(STR_ROUTER_ADD, strFirstIoTSlaveObjectHostAdd,
@@ -960,7 +967,7 @@ public class IoTMaster {
                                        // == COMMUNICATION WITH IOTSLAVE CONTROLLER TO FILL IN IOTSET
                                        commMasterToSlave(new MessageGetObject(IoTCommCode.GET_IOTSET_OBJECT, objInitInfo.getIoTSlaveObjectHostAdd(),
                                                objInitInfo.getObjectName(), objInitInfo.getObjectClassName(), objInitInfo.getObjectClassInterfaceName(), 
-                                               objInitInfo.getRMIRegistryPort(), objInitInfo.getRMIStubPort()), 
+                                               objInitInfo.getObjectStubClassInterfaceName(), objInitInfo.getRMIRegistryPort(), objInitInfo.getRMIStubPort()), 
                                                "Get IoTSet object!", inStream, outStream);     
                                }
                                // == COMMUNICATION WITH IOTSLAVE CONTROLLER TO REINITIALIZE IOTSET FIELD
@@ -977,13 +984,15 @@ public class IoTMaster {
                                        // == COMMUNICATION WITH IOTSLAVE CONTROLLER TO FILL IN IOTRELATION (FIRST OBJECT)
                                        commMasterToSlave(new MessageGetObject(IoTCommCode.GET_IOTRELATION_FIRST_OBJECT, 
                                                objInitInfo.getIoTSlaveObjectHostAdd(), objInitInfo.getObjectName(), objInitInfo.getObjectClassName(),
-                                               objInitInfo.getObjectClassInterfaceName(), objInitInfo.getRMIRegistryPort(), objInitInfo.getRMIStubPort()), 
+                                               objInitInfo.getObjectClassInterfaceName(), objInitInfo.getObjectStubClassInterfaceName(),
+                                               objInitInfo.getRMIRegistryPort(), objInitInfo.getRMIStubPort()), 
                                                "Get IoTRelation first object!", inStream, outStream);
                                        ObjectInitInfo objSecObj = (ObjectInitInfo) it.next();
                                        // == COMMUNICATION WITH IOTSLAVE CONTROLLER TO FILL IN IOTRELATION (SECOND OBJECT)
                                        commMasterToSlave(new MessageGetObject(IoTCommCode.GET_IOTRELATION_SECOND_OBJECT,
                                                objSecObj.getIoTSlaveObjectHostAdd(), objSecObj.getObjectName(), objSecObj.getObjectClassName(),
-                                               objSecObj.getObjectClassInterfaceName(), objSecObj.getRMIRegistryPort(), objSecObj.getRMIStubPort()), 
+                                               objSecObj.getObjectClassInterfaceName(), objInitInfo.getObjectStubClassInterfaceName(),
+                                               objSecObj.getRMIRegistryPort(), objSecObj.getRMIStubPort()), 
                                                "Get IoTRelation second object!", inStream, outStream);
                                }
                                // == COMMUNICATION WITH IOTSLAVE CONTROLLER TO REINITIALIZE IOTRELATION FIELD