1 package iotruntime.master;
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.HashSet;
8 import java.util.Random;
11 /** Class CommunicationHandler is a class that maintains
12 * a data structure that preserves a collection of host name,
13 * port numbers, and objects that are running
14 * +-----------------+----+--------+------------------+--------------+----------------+
15 * | HOST-ADDRESS | ...|IN-PORT | RMIREGISTRY-PORT | RMISTUB-PORT | ACTIVE OBJECTS |
16 * +-----------------+----+--------+------------------+--------------+----------------+
17 * | XXX.XXX.XXX.XXX | | XXXXX | XXXXX | XXXXX | XXXXXXXXXXXXXX |
18 * | | | XXXXX | XXXXX | XXXXX | XXXXXXXXXXXXXX |
19 * | | | XXXXX | XXXXX | XXXXX | XXXXXXXXXXXXXX |
20 * | | ...| ... | ... | ... | ... |
21 * +-----------------+----+--------+------------------+--------------+----------------+
22 * In this case we use ACTIVE OBJECTS names as the key
23 * So ACTIVE OBJECTS maps to numbers and these numbers map to each other
24 * entry in hashmaps (HostAddress can be repetitive)
25 * e.g. ACTIVE OBJECTS ProximitySensorPS0 - 0
26 * ProximitySensorPS1 - 1
29 * IN-PORT / RMIREGISTRY-PORT / RMISTUB-PORT / HOST-ADDRESS: 0 - XXXXX
40 * We add a Set structure to handle all the other ports that are used by devices
41 * when communicating with their respective drivers
43 * @author Rahmadi Trimananda <rahmadi.trimananda @ uci.edu>
47 public final class CommunicationHandler {
50 * CommunicationHandler class properties
52 * Random, host name, port number, active objects
53 * HostAdd is the key to the table so we use it
54 * as a key to elements
55 * HostList gives a mapping from hostname to list of objects
57 private Random random;
58 private List<String> listActiveControllerObj;
59 private List<String> listFieldObjectID;
60 private List<ObjectCreationInfo> listObjCrtInfo;
61 private List<Object[]> listArrFieldValues;
62 private List<Class[]> listArrFieldClasses;
63 private Map<String, Integer> hmActiveObj;
64 private Map<Integer, String> hmHostAdd;
65 private Map<String, ArrayList<String> > hmHostList;
66 private Map<Integer, Integer> hmComPort;
67 private Map<Integer, Integer> hmRMIRegPort;
68 private Map<Integer, Integer> hmRMIStubPort;
69 private Set<Integer> hsDevicePort;
70 private Set<Integer> hsCallbackPort;
71 private Map<Integer, Integer[]> hmCallbackPort;
72 private Map<Integer, Integer> hmAdditionalPort;
73 private int iNumOfObjects;
74 private int iNumOfHosts;
75 private boolean bVerbose;
78 * CommunicationHandler class constants
80 private final int INT_MAX_PORT = 65535;
81 private final int INT_MIN_PORT = 10000;
86 public CommunicationHandler(boolean _bVerbose) {
88 random = new Random();
89 listActiveControllerObj = new ArrayList<String>();
90 listFieldObjectID = new ArrayList<String>();
91 listObjCrtInfo = new ArrayList<ObjectCreationInfo>();
92 listArrFieldValues = new ArrayList<Object[]>();
93 listArrFieldClasses = new ArrayList<Class[]>();
94 hmActiveObj = new HashMap<String, Integer>();
95 hmHostAdd = new HashMap<Integer, String>();
96 hmHostList = new HashMap<String, ArrayList<String>>();
97 hmComPort = new HashMap<Integer, Integer>();
98 hmRMIRegPort = new HashMap<Integer, Integer>();
99 hmRMIStubPort = new HashMap<Integer, Integer>();
100 hsDevicePort = new HashSet<Integer>();
101 hsCallbackPort = new HashSet<Integer>();
102 hmCallbackPort = new HashMap<Integer, Integer[]>();
103 hmAdditionalPort = new HashMap<Integer, Integer>();
106 bVerbose = _bVerbose;
107 RuntimeOutput.print("CommunicationHandler: Creating a new CommunicationHandler object!", bVerbose);
111 * Method addPortConnection()
113 * Add a new connection then generate new in-port and out-port numbers
115 * @param sHAddress String host address
116 * @param sAObject String active object name
119 public void addPortConnection(String sHAddress, String sAObject) {
121 // Increment counter first before we add objects as we start from 0
122 // Objects are named uniquely so we record this and match with the host
123 // Hostname occurrence can be repetitive as there can be more than
124 // one host on one compute node
126 // Add a new object in the list of objects
127 hmActiveObj.put(sAObject, iNumOfObjects);
129 // Check host existence in our data structure
130 // Add a new host and a new object
131 if(hmHostList.containsKey(sHAddress) == false) {
133 hmHostList.put(sHAddress, new ArrayList<String>());
135 hmHostList.get(sHAddress).add(sAObject);
137 // Map object to host
138 hmHostAdd.put(iNumOfObjects, sHAddress);
142 iComPort = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
143 // Check port existence in HashMap
144 } while (portIsAvailable(iComPort) == false);
145 hmComPort.put(iNumOfObjects, iComPort);
149 iRMIRegPort = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
150 // Check port existence in HashMap
151 } while (portIsAvailable(iRMIRegPort) == false);
152 hmRMIRegPort.put(iNumOfObjects, iRMIRegPort);
154 int iRMIStubPort = 0;
156 iRMIStubPort = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
157 // Check port existence in HashMap
158 } while (portIsAvailable(iRMIStubPort) == false);
159 hmRMIStubPort.put(iNumOfObjects, iRMIStubPort);
165 * A private method to add a new active controller object
167 * @params strFieldObjectID String field object ID
168 * @params strObjName String object name
169 * @params strObjClassName String object class name
170 * @params strObjClassInterfaceName String object class interface name
171 * @params strIoTSlaveObjectHostAdd String IoTSlave host address
172 * @params arrFieldValues Array of field values
173 * @params arrFieldClasses Array of field classes
176 public void addActiveControllerObject(String strFieldObjectID, String strObjName, String strObjClassName,
177 String strObjClassInterfaceName, String strObjStubClsIntfaceName, String strIoTSlaveObjectHostAdd, Object[] arrFieldValues,
178 Class[] arrFieldClasses) {
180 listActiveControllerObj.add(strObjName);
181 listFieldObjectID.add(strFieldObjectID);
182 listArrFieldValues.add(arrFieldValues);
183 listArrFieldClasses.add(arrFieldClasses);
184 ObjectCreationInfo objCrtInfo = new ObjectCreationInfo(strIoTSlaveObjectHostAdd, strObjName,
185 strObjClassName, strObjClassInterfaceName, strObjStubClsIntfaceName);
186 listObjCrtInfo.add(objCrtInfo);
191 * Method getCallbackPort()
193 * Get a new port for new connections for callback objects in the program.
194 * This newly generated port number will be recorded.
196 * @return int[] A set of callback ports
198 public int[] getCallbackPorts(int numOfPorts) {
200 int[] ports = new int[numOfPorts];
202 for(int i = 0; i < numOfPorts; i++) {
204 ports[i] = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
205 // Check port existence in HashMap
206 } while (portIsAvailable(ports[i]) == false);
207 hsCallbackPort.add(ports[i]);
215 * Method getCallbackPorts()
217 * Get a set of new ports for new connections for callback objects in the program.
218 * This newly generated port number will be recorded.
220 * @return int[] A set of callback ports
222 public Integer[] getCallbackPorts(String sAObject, int numOfPorts) {
224 Integer[] ports = new Integer[numOfPorts];
225 int iNumOfObject = hmActiveObj.get(sAObject);
227 if (!hmCallbackPort.containsKey(iNumOfObject)) {
228 for(int i = 0; i < numOfPorts; i++) {
230 ports[i] = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
231 // Check port existence in HashMap
232 } while (portIsAvailable(ports[i]) == false);
233 hsCallbackPort.add(ports[i]);
235 hmCallbackPort.put(iNumOfObject, ports);
237 ports = hmCallbackPort.get(iNumOfObject);
245 * Method addDevicePort()
247 * Add a port that is used by a device when communicating with its driver
248 * This port will be taken into account when checking for port availability
250 * @param iDevPort Device port number
253 public void addDevicePort(int iDevPort) {
255 hsDevicePort.add(iDevPort);
260 * Method addAdditionalPort()
262 * Add a new port for new connections for any objects in the program.
263 * This newly generated port number will be recorded.
265 * @return int One new port
267 public int addAdditionalPort(String sAObject) {
269 hmActiveObj.put(sAObject, iNumOfObjects);
271 int iAdditionalPort = 0;
273 iAdditionalPort = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
274 // Check port existence in HashMap
275 } while (portIsAvailable(iAdditionalPort) == false);
276 hmAdditionalPort.put(iNumOfObjects, iAdditionalPort);
280 return iAdditionalPort;
284 * Method portIsAvailable()
286 * Checks the availability of the newly generated port.
287 * If port number has been used in any of the lists then
288 * it is not available
290 * @param iPortNumber Device port number
293 public boolean portIsAvailable(int iPortNumber) {
295 if (hmComPort.containsValue(iPortNumber) == true) {
297 } else if (hmRMIRegPort.containsValue(iPortNumber) == true) {
299 } else if (hmRMIStubPort.containsValue(iPortNumber) == true) {
301 } else if (hmAdditionalPort.containsValue(iPortNumber) == true) {
303 } else if (hsDevicePort.contains(iPortNumber) == true) {
305 } else if (hsCallbackPort.contains(iPortNumber) == true) {
313 * Method getNumOfObjects()
317 public int getNumOfObjects() {
319 return iNumOfObjects;
324 * Method getNumOfHosts()
328 public int getNumOfHosts() {
335 * Method objectExists()
337 * @param sObjName String object name
340 public boolean objectExists(String sObjName) {
342 return hmActiveObj.containsKey(sObjName);
347 * Method hostExists()
349 * @param sHostName String host name
352 public boolean hostExists(String sHostName) {
354 return hmHostList.containsKey(sHostName);
359 * Method getHostAddress()
361 * User finds HostAddress using Object name
363 * @param sAObject String active object name
366 public String getHostAddress(String sAObject) {
368 return hmHostAdd.get(hmActiveObj.get(sAObject));
375 * User gets the set of hostnames
379 public Set<String> getHosts() {
381 return hmHostList.keySet();
386 * Method getComPort()
388 * User finds In-Port number using Object name
390 * @param sAObject String active object name
393 public Integer getComPort(String sAObject) {
395 return hmComPort.get(hmActiveObj.get(sAObject));
399 * Method getAdditionalPort()
401 * User finds a port number using Object name
403 * @param sAObject String active object name
406 public Integer getAdditionalPort(String sAObject) {
408 return hmAdditionalPort.get(hmActiveObj.get(sAObject));
412 * Method getRMIRegPort()
414 * User finds Out-Port number using Object name
416 * @param sAObject String active object name
419 public Integer getRMIRegPort(String sAObject) {
421 return hmRMIRegPort.get(hmActiveObj.get(sAObject));
426 * Method getRMIStubPort()
428 * User finds Out-Port number using Object name
430 * @param sAObject String active object name
433 public Integer getRMIStubPort(String sAObject) {
435 return hmRMIStubPort.get(hmActiveObj.get(sAObject));
440 * Method getFieldObjectID()
442 * User finds field object ID using Object name
444 * @param sAObject String active object name
447 public String getFieldObjectID(String sAObject) {
449 return listFieldObjectID.get(listActiveControllerObj.indexOf(sAObject));
454 * Method getObjectCreationInfo()
456 * User finds ObjectCreationInfo using Object name
458 * @param sAObject String active object name
459 * @return ObjectCreationInfo
461 public ObjectCreationInfo getObjectCreationInfo(String sAObject) {
463 return listObjCrtInfo.get(listActiveControllerObj.indexOf(sAObject));
468 * Method getArrayFieldClasses()
470 * User finds array of field classes using Object name
472 * @param sAObject String active object name
475 public Class[] getArrayFieldClasses(String sAObject) {
477 return listArrFieldClasses.get(listActiveControllerObj.indexOf(sAObject));
482 * Method getArrayFieldValues()
484 * User finds array of field values using Object name
486 * @param sAObject String active object name
489 public Object[] getArrayFieldValues(String sAObject) {
491 return listArrFieldValues.get(listActiveControllerObj.indexOf(sAObject));
496 * Method getActiveControllerObjectList()
498 * @return List<String>
500 public List<String> getActiveControllerObjectList() {
502 return listActiveControllerObj;
507 * Method printLists()
511 public void printLists() {
513 // Iterate on HostAddress
514 for(String s : hmHostList.keySet()) {
516 for(String str : hmHostList.get(s)) {
518 int iIndex = hmActiveObj.get(str);
519 RuntimeOutput.print("Active Object: " + str, bVerbose);
520 RuntimeOutput.print("Communication Port: " + hmComPort.get(iIndex), bVerbose);
521 RuntimeOutput.print("RMI Registry Port: " + hmRMIRegPort.get(iIndex), bVerbose);
522 RuntimeOutput.print("RMI Stub Port: " + hmRMIStubPort.get(iIndex), bVerbose);
523 RuntimeOutput.print("\n", bVerbose);
526 for(Integer i : hsCallbackPort)
527 RuntimeOutput.print("RMI callback Port: " + i, bVerbose);
528 RuntimeOutput.print("\n", bVerbose);
530 for(int iPort : hsDevicePort) {
531 RuntimeOutput.print("Device Port: " + iPort, bVerbose);
533 RuntimeOutput.print("\n", bVerbose);