1 package iotruntime.master;
3 // Java standard libraries
4 import java.io.ObjectInputStream;
5 import java.io.ObjectOutputStream;
6 import java.util.ArrayList;
7 import java.util.HashMap;
8 import java.util.Iterator;
13 import iotruntime.messages.IoTCommCode;
15 /** Class ObjectInitHandler is a class that maintains
16 * a data structure that preserves a collection information
17 * for object creation and re-initialization in IoTMaster/IoTSlave.
18 * The purpose of this class is to allow field instrumentation and object generation
19 * for the main controller to be separate from field re-initialization.
20 * This way, object creations can be parallelized.
21 * +------------+----------------------+----------------+
22 * | FIELD_NAME | ARRAYLIST OF List | OBJECTINITINFO |
23 * +------------+----------------------+----------------+
24 * | XXXXXXXXXX | #1 | XXXXX |
31 * +------------+----------------------+----------------+
32 * | XXXXXXXXXX | #1 | XXXXX |
40 * +------------+----------------------+----------------+
42 * @author Rahmadi Trimananda <rahmadi.trimananda @ uci.edu>
46 public final class ObjectInitHandler {
50 * ObjectInitHandler class properties
52 * listFieldToObject is our data structure that is implemented
53 * based on the above description; First we do a lookup on
54 * listField to find fieldname's index and we use it to access
55 * other list data structures
57 private List<String> listField;
58 private List<IoTCommCode> listFieldToSetRelation;
59 private List<List<ObjectInitInfo>> listFieldToObject;
60 private Map<Integer, List<ObjectInitInfo>> mapFieldToSecondObject;
61 private int iNumOfFields;
62 private boolean bVerbose;
68 public ObjectInitHandler(boolean _bVerbose) {
70 listField = new ArrayList<String>();
71 listFieldToSetRelation = new ArrayList<IoTCommCode>();
72 listFieldToObject = new ArrayList<List<ObjectInitInfo>>();
73 mapFieldToSecondObject = new HashMap<Integer, List<ObjectInitInfo>>();
76 RuntimeOutput.print("ObjectInitHandler: Creating a new ObjectInitHandler object!", bVerbose);
84 * @param strField String field name
85 * @param iotcommMsg Store IoTCommCode from master
88 public void addField(String strField, IoTCommCode iotcommMsg) {
91 // Add a new object in the list of objects
92 listField.add(iNumOfFields, strField);
93 listFieldToSetRelation.add(iNumOfFields, iotcommMsg);
95 List<ObjectInitInfo> list = new ArrayList<ObjectInitInfo>();
96 listFieldToObject.add(iNumOfFields, list);
97 if (iotcommMsg == IoTCommCode.CREATE_NEW_IOTRELATION) {
98 List<ObjectInitInfo> listSecond = new ArrayList<ObjectInitInfo>();
99 mapFieldToSecondObject.put(iNumOfFields, listSecond);
106 * Method addObjectIntoField()
110 * @param strField String field name
111 * @param strIoTSlaveObjectHostAdd String IoTSlave object hostname
112 * @param strObjName String object name
113 * @param strObjClassName String object class
114 * @param strObjClassInterfaceName String object class interface
115 * @param iRMIRegPort Integer RMI registry port
116 * @param iRMIStubPort Integer RMI stub port
117 * @param iRMICallbackPorts Integer RMI callback ports
120 public void addObjectIntoField(String strField, String strIoTSlaveObjectHostAdd,
121 String strObjName, String strObjClassName, String strObjClassInterfaceName,
122 String strObjStubClsIntfaceName, int iRMIRegPort, int iRMIStubPort, Integer[] iRMICallbackPorts) {
124 // Get index of strField
125 int iFieldIndex = listField.indexOf(strField);
127 // Get list structure at index of field
128 List<ObjectInitInfo> list = listFieldToObject.get(iFieldIndex);
129 // Create a new ObjectInitInfo for a new object in the field
130 ObjectInitInfo objInitInfo = new ObjectInitInfo(strIoTSlaveObjectHostAdd, strObjName,
131 strObjClassName, strObjClassInterfaceName, strObjStubClsIntfaceName, iRMIRegPort, iRMIStubPort, iRMICallbackPorts);
132 // Add the new ObjectInitInfo
133 list.add(objInitInfo);
138 * Method addSecondObjectIntoField()
142 * @param strField String field name
143 * @param strIoTSlaveObjectHostAdd String IoTSlave object hostname
144 * @param strObjName String object name
145 * @param strObjClassName String object class
146 * @param strObjClassInterfaceName String object class interface
147 * @param iRMIRegPort Integer RMI registry port
148 * @param iRMIStubPort Integer RMI stub port
151 public void addSecondObjectIntoField(String strField, String strIoTSlaveObjectHostAdd,
152 String strObjName, String strObjClassName, String strObjClassInterfaceName,
153 String strObjStubClsIntfaceName, int iRMIRegPort, int iRMIStubPort, Integer[] iRMICallbackPorts) {
155 // Get index of strField
156 int iFieldIndex = listField.indexOf(strField);
157 // Get list structure at index of field
158 List<ObjectInitInfo> list = mapFieldToSecondObject.get(iFieldIndex);
159 // Create a new ObjectInitInfo for a new object in the field
160 ObjectInitInfo objInitInfo = new ObjectInitInfo(strIoTSlaveObjectHostAdd, strObjName,
161 strObjClassName, strObjClassInterfaceName, strObjStubClsIntfaceName, iRMIRegPort, iRMIStubPort, iRMICallbackPorts);
162 // Add the new ObjectInitInfo
163 list.add(objInitInfo);
168 * Method getNumOfFields()
172 public int getNumOfFields() {
179 * Method getListOfFields()
181 * @return List<String> List of fields
183 public List<String> getListOfFields() {
189 * Method getFieldMessage()
191 * @param strField String field name
192 * @return IoTCommCode
194 public IoTCommCode getFieldMessage(String strField) {
196 return listFieldToSetRelation.get(listField.indexOf(strField));
201 * Method getListObjectInitInfo()
203 * @param strField String field name
204 * @return List<ObjectInitInfo>
206 public List<ObjectInitInfo> getListObjectInitInfo(String strField) {
208 return listFieldToObject.get(listField.indexOf(strField));
213 * Method getSecondObjectInitInfo()
215 * @param strField String field name
216 * @return List<ObjectInitInfo>
218 public List<ObjectInitInfo> getSecondObjectInitInfo(String strField) {
220 return mapFieldToSecondObject.get(listField.indexOf(strField));
225 * Method printLists()
229 public void printLists() {
231 // Iterate on HostAddress
232 for(String s : listField) {
234 RuntimeOutput.print("ObjectInitHandler: Field: " + s, bVerbose);
235 RuntimeOutput.print("ObjectInitHandler: Message type: " + listFieldToSetRelation.get(listField.indexOf(s)), bVerbose);
236 List<ObjectInitInfo> listObject = listFieldToObject.get(listField.indexOf(s));
237 List<ObjectInitInfo> listSecObject = mapFieldToSecondObject.get(listField.indexOf(s));
240 if (listFieldToSetRelation.get(listField.indexOf(s)) == IoTCommCode.CREATE_NEW_IOTRELATION) {
241 it = listSecObject.iterator();
244 for (ObjectInitInfo objInitInfo : listObject) {
245 RuntimeOutput.print("ObjectInitHandler: Object info: ", bVerbose);
246 RuntimeOutput.print("==> Slave object host address: " + objInitInfo.getIoTSlaveObjectHostAdd(), bVerbose);
247 RuntimeOutput.print("==> Object name: " + objInitInfo.getObjectName(), bVerbose);
248 RuntimeOutput.print("==> Object class name: " + objInitInfo.getObjectClassName(), bVerbose);
249 RuntimeOutput.print("==> Object class interface: " + objInitInfo.getObjectClassInterfaceName(), bVerbose);
250 RuntimeOutput.print("==> Object stub class interface: " + objInitInfo.getObjectStubClassInterfaceName(), bVerbose);
251 RuntimeOutput.print("==> RMI registry port: " + objInitInfo.getRMIRegistryPort(), bVerbose);
252 RuntimeOutput.print("==> RMI stub port: " + objInitInfo.getRMIStubPort(), bVerbose);
254 if (listFieldToSetRelation.get(listField.indexOf(s)) == IoTCommCode.CREATE_NEW_IOTRELATION) {
255 ObjectInitInfo objSecObj = (ObjectInitInfo) it.next();
257 RuntimeOutput.print("ObjectInitHandler: Second object info: ", bVerbose);
258 RuntimeOutput.print("==> Slave object host address: " + objSecObj.getIoTSlaveObjectHostAdd(), bVerbose);
259 RuntimeOutput.print("==> Object name: " + objSecObj.getObjectName(), bVerbose);
260 RuntimeOutput.print("==> Object class name: " + objSecObj.getObjectClassName(), bVerbose);
261 RuntimeOutput.print("==> Object class interface: " + objSecObj.getObjectClassInterfaceName(), bVerbose);
262 RuntimeOutput.print("==> Object stub class interface: " + objInitInfo.getObjectStubClassInterfaceName(), bVerbose);
263 RuntimeOutput.print("==> RMI registry port: " + objSecObj.getRMIRegistryPort(), bVerbose);
264 RuntimeOutput.print("==> RMI stub port: " + objSecObj.getRMIStubPort(), bVerbose);