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
30 * @author Rahmadi Trimananda <rahmadi.trimananda @ uci.edu>
34 public final class CommunicationHandler {
37 * CommunicationHandler class properties
39 * Random, host name, port number, active objects
40 * HostAdd is the key to the table so we use it
41 * as a key to elements
42 * HostList gives a mapping from hostname to list of objects
44 private Random random;
45 private List<String> listActiveControllerObj;
46 private List<String> listFieldObjectID;
47 private List<ObjectCreationInfo> listObjCrtInfo;
48 private List<Object[]> listArrFieldValues;
49 private List<Class[]> listArrFieldClasses;
50 private Map<String, Integer> hmActiveObj;
51 private Map<Integer, String> hmHostAdd;
52 private Map<String, ArrayList<String> > hmHostList;
53 private Map<Integer, Integer> hmComPort;
54 private Map<Integer, Integer> hmRMIRegPort;
55 private Map<Integer, Integer> hmRMIStubPort;
56 private Set<Integer> hsDevicePort;
57 private Map<Integer, Integer> hmAdditionalPort;
58 private int iNumOfObjects;
59 private int iNumOfHosts;
60 private boolean bVerbose;
63 * CommunicationHandler class constants
65 private final int INT_MAX_PORT = 65535;
66 private final int INT_MIN_PORT = 10000;
71 public CommunicationHandler(boolean _bVerbose) {
73 random = new Random();
74 listActiveControllerObj = new ArrayList<String>();
75 listFieldObjectID = new ArrayList<String>();
76 listObjCrtInfo = new ArrayList<ObjectCreationInfo>();
77 listArrFieldValues = new ArrayList<Object[]>();
78 listArrFieldClasses = new ArrayList<Class[]>();
79 hmActiveObj = new HashMap<String, Integer>();
80 hmHostAdd = new HashMap<Integer, String>();
81 hmHostList = new HashMap<String, ArrayList<String>>();
82 hmComPort = new HashMap<Integer, Integer>();
83 hmRMIRegPort = new HashMap<Integer, Integer>();
84 hmRMIStubPort = new HashMap<Integer, Integer>();
85 hsDevicePort = new HashSet<Integer>();
86 hmAdditionalPort = new HashMap<Integer, Integer>();
90 RuntimeOutput.print("CommunicationHandler: Creating a new CommunicationHandler object!", bVerbose);
94 * Method clearCommunicationHandler()
96 * Clear the data structure
100 public void clearCommunicationHandler() {
102 listActiveControllerObj.clear();
103 listFieldObjectID.clear();
104 listObjCrtInfo.clear();
105 listArrFieldValues.clear();
106 listArrFieldClasses.clear();
111 hmRMIRegPort.clear();
112 hmRMIStubPort.clear();
113 hsDevicePort.clear();
114 hmAdditionalPort.clear();
117 RuntimeOutput.print("CommunicationHandler: Clearing CommunicationHandler object's data structure!", bVerbose);
121 * Method addPortConnection()
123 * Add a new connection then generate new in-port and out-port numbers
125 * @param sHAddress String host address
126 * @param sAObject String active object name
129 public void addPortConnection(String sHAddress, String sAObject) {
131 // Increment counter first before we add objects as we start from 0
132 // Objects are named uniquely so we record this and match with the host
133 // Hostname occurrence can be repetitive as there can be more than
134 // one host on one compute node
136 // Add a new object in the list of objects
137 hmActiveObj.put(sAObject, iNumOfObjects);
139 // Check host existence in our data structure
140 // Add a new host and a new object
141 if(hmHostList.containsKey(sHAddress) == false) {
143 hmHostList.put(sHAddress, new ArrayList<String>());
145 hmHostList.get(sHAddress).add(sAObject);
147 // Map object to host
148 hmHostAdd.put(iNumOfObjects, sHAddress);
152 iComPort = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
153 // Check port existence in HashMap
154 } while (portIsAvailable(iComPort) == false);
155 hmComPort.put(iNumOfObjects, iComPort);
159 iRMIRegPort = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
160 // Check port existence in HashMap
161 } while (portIsAvailable(iRMIRegPort) == false);
162 hmRMIRegPort.put(iNumOfObjects, iRMIRegPort);
164 int iRMIStubPort = 0;
166 iRMIStubPort = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
167 // Check port existence in HashMap
168 } while (portIsAvailable(iRMIStubPort) == false);
169 hmRMIStubPort.put(iNumOfObjects, iRMIStubPort);
175 * A private method to add a new active controller object
177 * @params strFieldObjectID String field object ID
178 * @params strObjName String object name
179 * @params strObjClassName String object class name
180 * @params strObjClassInterfaceName String object class interface name
181 * @params strIoTSlaveObjectHostAdd String IoTSlave host address
182 * @params arrFieldValues Array of field values
183 * @params arrFieldClasses Array of field classes
186 public void addActiveControllerObject(String strFieldObjectID, String strObjName, String strObjClassName,
187 String strObjClassInterfaceName, String strObjStubClsIntfaceName, String strIoTSlaveObjectHostAdd, Object[] arrFieldValues,
188 Class[] arrFieldClasses) {
190 listActiveControllerObj.add(strObjName);
191 listFieldObjectID.add(strFieldObjectID);
192 listArrFieldValues.add(arrFieldValues);
193 listArrFieldClasses.add(arrFieldClasses);
194 ObjectCreationInfo objCrtInfo = new ObjectCreationInfo(strIoTSlaveObjectHostAdd, strObjName,
195 strObjClassName, strObjClassInterfaceName, strObjStubClsIntfaceName);
196 listObjCrtInfo.add(objCrtInfo);
200 * Method addDevicePort()
202 * Add a port that is used by a device when communicating with its driver
203 * This port will be taken into account when checking for port availability
205 * @param iDevPort Device port number
208 public void addDevicePort(int iDevPort) {
210 hsDevicePort.add(iDevPort);
214 * Method addAdditionalPort()
216 * Add a new port for new connections for any objects in the program.
217 * This newly generated port number will be recorded.
219 * @return int One new port
221 public int addAdditionalPort(String sAObject) {
223 hmActiveObj.put(sAObject, iNumOfObjects);
225 int iAdditionalPort = 0;
227 iAdditionalPort = random.nextInt(INT_MAX_PORT - INT_MIN_PORT + 1) + INT_MIN_PORT;
228 // Check port existence in HashMap
229 } while (portIsAvailable(iAdditionalPort) == false);
230 hmAdditionalPort.put(iNumOfObjects, iAdditionalPort);
234 return iAdditionalPort;
238 * Method portIsAvailable()
240 * Checks the availability of the newly generated port.
241 * If port number has been used in any of the lists then
242 * it is not available
244 * @param iPortNumber Device port number
247 public boolean portIsAvailable(int iPortNumber) {
249 if (hmComPort.containsValue(iPortNumber) == true) {
251 } else if (hmRMIRegPort.containsValue(iPortNumber) == true) {
253 } else if (hmRMIStubPort.containsValue(iPortNumber) == true) {
255 } else if (hmAdditionalPort.containsValue(iPortNumber) == true) {
257 } else if (hsDevicePort.contains(iPortNumber) == true) {
265 * Method getNumOfObjects()
269 public int getNumOfObjects() {
271 return iNumOfObjects;
276 * Method getNumOfHosts()
280 public int getNumOfHosts() {
287 * Method objectExists()
289 * @param sObjName String object name
292 public boolean objectExists(String sObjName) {
294 return hmActiveObj.containsKey(sObjName);
299 * Method hostExists()
301 * @param sHostName String host name
304 public boolean hostExists(String sHostName) {
306 return hmHostList.containsKey(sHostName);
311 * Method getHostAddress()
313 * User finds HostAddress using Object name
315 * @param sAObject String active object name
318 public String getHostAddress(String sAObject) {
320 return hmHostAdd.get(hmActiveObj.get(sAObject));
327 * User gets the set of hostnames
331 public Set<String> getHosts() {
333 return hmHostList.keySet();
338 * Method getComPort()
340 * User finds In-Port number using Object name
342 * @param sAObject String active object name
345 public Integer getComPort(String sAObject) {
347 return hmComPort.get(hmActiveObj.get(sAObject));
351 * Method getAdditionalPort()
353 * User finds a port number using Object name
355 * @param sAObject String active object name
358 public Integer getAdditionalPort(String sAObject) {
360 return hmAdditionalPort.get(hmActiveObj.get(sAObject));
364 * Method getRMIRegPort()
366 * User finds Out-Port number using Object name
368 * @param sAObject String active object name
371 public Integer getRMIRegPort(String sAObject) {
373 return hmRMIRegPort.get(hmActiveObj.get(sAObject));
378 * Method getRMIStubPort()
380 * User finds Out-Port number using Object name
382 * @param sAObject String active object name
385 public Integer getRMIStubPort(String sAObject) {
387 return hmRMIStubPort.get(hmActiveObj.get(sAObject));
392 * Method getFieldObjectID()
394 * User finds field object ID using Object name
396 * @param sAObject String active object name
399 public String getFieldObjectID(String sAObject) {
401 return listFieldObjectID.get(listActiveControllerObj.indexOf(sAObject));
406 * Method getObjectCreationInfo()
408 * User finds ObjectCreationInfo using Object name
410 * @param sAObject String active object name
411 * @return ObjectCreationInfo
413 public ObjectCreationInfo getObjectCreationInfo(String sAObject) {
415 return listObjCrtInfo.get(listActiveControllerObj.indexOf(sAObject));
420 * Method getArrayFieldClasses()
422 * User finds array of field classes using Object name
424 * @param sAObject String active object name
427 public Class[] getArrayFieldClasses(String sAObject) {
429 return listArrFieldClasses.get(listActiveControllerObj.indexOf(sAObject));
434 * Method getArrayFieldValues()
436 * User finds array of field values using Object name
438 * @param sAObject String active object name
441 public Object[] getArrayFieldValues(String sAObject) {
443 return listArrFieldValues.get(listActiveControllerObj.indexOf(sAObject));
448 * Method getActiveControllerObjectList()
450 * @return List<String>
452 public List<String> getActiveControllerObjectList() {
454 return listActiveControllerObj;
459 * Method printLists()
463 public void printLists() {
465 // Iterate on HostAddress
466 for(String s : hmHostList.keySet()) {
468 for(String str : hmHostList.get(s)) {
470 int iIndex = hmActiveObj.get(str);
471 RuntimeOutput.print("Active Object: " + str, bVerbose);
472 RuntimeOutput.print("Communication Port: " + hmComPort.get(iIndex), bVerbose);
473 RuntimeOutput.print("RMI Registry Port: " + hmRMIRegPort.get(iIndex), bVerbose);
474 RuntimeOutput.print("RMI Stub Port: " + hmRMIStubPort.get(iIndex), bVerbose);
475 RuntimeOutput.print("\n", bVerbose);
479 for(int iPort : hsDevicePort) {
480 RuntimeOutput.print("Device Port: " + iPort, bVerbose);
482 RuntimeOutput.print("\n", bVerbose);