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
119 public void addObjectIntoField(String strField, String strIoTSlaveObjectHostAdd,
120 String strObjName, String strObjClassName, String strObjClassInterfaceName,
121 int iRMIRegPort, int iRMIStubPort) {
123 // Get index of strField
124 int iFieldIndex = listField.indexOf(strField);
126 // Get list structure at index of field
127 List<ObjectInitInfo> list = listFieldToObject.get(iFieldIndex);
128 // Create a new ObjectInitInfo for a new object in the field
129 ObjectInitInfo objInitInfo = new ObjectInitInfo(strIoTSlaveObjectHostAdd, strObjName,
130 strObjClassName, strObjClassInterfaceName, iRMIRegPort, iRMIStubPort);
131 // Add the new ObjectInitInfo
132 list.add(objInitInfo);
137 * Method addSecondObjectIntoField()
141 * @param strField String field name
142 * @param strIoTSlaveObjectHostAdd String IoTSlave object hostname
143 * @param strObjName String object name
144 * @param strObjClassName String object class
145 * @param strObjClassInterfaceName String object class interface
146 * @param iRMIRegPort Integer RMI registry port
147 * @param iRMIStubPort Integer RMI stub port
150 public void addSecondObjectIntoField(String strField, String strIoTSlaveObjectHostAdd,
151 String strObjName, String strObjClassName, String strObjClassInterfaceName,
152 int iRMIRegPort, int iRMIStubPort) {
154 // Get index of strField
155 int iFieldIndex = listField.indexOf(strField);
156 // Get list structure at index of field
157 List<ObjectInitInfo> list = mapFieldToSecondObject.get(iFieldIndex);
158 // Create a new ObjectInitInfo for a new object in the field
159 ObjectInitInfo objInitInfo = new ObjectInitInfo(strIoTSlaveObjectHostAdd, strObjName,
160 strObjClassName, strObjClassInterfaceName, iRMIRegPort, iRMIStubPort);
161 // Add the new ObjectInitInfo
162 list.add(objInitInfo);
167 * Method getNumOfFields()
171 public int getNumOfFields() {
178 * Method getListOfFields()
180 * @return List<String> List of fields
182 public List<String> getListOfFields() {
188 * Method getFieldMessage()
190 * @param strField String field name
191 * @return IoTCommCode
193 public IoTCommCode getFieldMessage(String strField) {
195 return listFieldToSetRelation.get(listField.indexOf(strField));
200 * Method getListObjectInitInfo()
202 * @param strField String field name
203 * @return List<ObjectInitInfo>
205 public List<ObjectInitInfo> getListObjectInitInfo(String strField) {
207 return listFieldToObject.get(listField.indexOf(strField));
212 * Method getSecondObjectInitInfo()
214 * @param strField String field name
215 * @return List<ObjectInitInfo>
217 public List<ObjectInitInfo> getSecondObjectInitInfo(String strField) {
219 return mapFieldToSecondObject.get(listField.indexOf(strField));
224 * Method printLists()
228 public void printLists() {
230 // Iterate on HostAddress
231 for(String s : listField) {
233 RuntimeOutput.print("ObjectInitHandler: Field: " + s, bVerbose);
234 RuntimeOutput.print("ObjectInitHandler: Message type: " + listFieldToSetRelation.get(listField.indexOf(s)), bVerbose);
235 List<ObjectInitInfo> listObject = listFieldToObject.get(listField.indexOf(s));
236 List<ObjectInitInfo> listSecObject = mapFieldToSecondObject.get(listField.indexOf(s));
239 if (listFieldToSetRelation.get(listField.indexOf(s)) == IoTCommCode.CREATE_NEW_IOTRELATION) {
240 it = listSecObject.iterator();
243 for (ObjectInitInfo objInitInfo : listObject) {
244 RuntimeOutput.print("ObjectInitHandler: Object info: ", bVerbose);
245 RuntimeOutput.print("==> Slave object host address: " + objInitInfo.getIoTSlaveObjectHostAdd(), bVerbose);
246 RuntimeOutput.print("==> Object name: " + objInitInfo.getObjectName(), bVerbose);
247 RuntimeOutput.print("==> Object class name: " + objInitInfo.getObjectClassName(), bVerbose);
248 RuntimeOutput.print("==> Object class interface: " + objInitInfo.getObjectClassInterfaceName(), bVerbose);
249 RuntimeOutput.print("==> RMI registry port: " + objInitInfo.getRMIRegistryPort(), bVerbose);
250 RuntimeOutput.print("==> RMI stub port: " + objInitInfo.getRMIStubPort(), bVerbose);
252 if (listFieldToSetRelation.get(listField.indexOf(s)) == IoTCommCode.CREATE_NEW_IOTRELATION) {
253 ObjectInitInfo objSecObj = (ObjectInitInfo) it.next();
255 RuntimeOutput.print("ObjectInitHandler: Second object info: ", bVerbose);
256 RuntimeOutput.print("==> Slave object host address: " + objSecObj.getIoTSlaveObjectHostAdd(), bVerbose);
257 RuntimeOutput.print("==> Object name: " + objSecObj.getObjectName(), bVerbose);
258 RuntimeOutput.print("==> Object class name: " + objSecObj.getObjectClassName(), bVerbose);
259 RuntimeOutput.print("==> Object class interface: " + objSecObj.getObjectClassInterfaceName(), bVerbose);
260 RuntimeOutput.print("==> RMI registry port: " + objSecObj.getRMIRegistryPort(), bVerbose);
261 RuntimeOutput.print("==> RMI stub port: " + objSecObj.getRMIStubPort(), bVerbose);
267 public static void main(String[] args) throws Exception {
269 ObjectInitHandler objInitHand = new ObjectInitHandler(true);
271 objInitHand.addField("someField1", IoTCommCode.CREATE_NEW_IOTSET);
272 objInitHand.addObjectIntoField("someField1", "192.168.2.191", "LifxLightBulbLB1",
273 "LifxLightBulb", "LightBulb", 1234, 2345);
274 objInitHand.addObjectIntoField("someField1", "192.168.2.192", "LifxLightBulbLB2",
275 "LifxLightBulb", "LightBulb", 4321, 5432);
277 // Field #2 IoTRelation
278 objInitHand.addField("someField2", IoTCommCode.CREATE_NEW_IOTRELATION);
279 objInitHand.addObjectIntoField("someField2", "192.168.2.191", "LifxLightBulbLB1",
280 "LifxLightBulb", "LightBulb", 1111, 2222);
281 objInitHand.addSecondObjectIntoField("someField2", "192.168.2.192", "LifxLightBulbLB1",
282 "LifxLightBulb", "LightBulb", 3333, 4444);
284 objInitHand.addObjectIntoField("someField2", "192.168.2.191", "LifxLightBulbLB2",
285 "LifxLightBulb", "LightBulb", 5555, 6666);
286 objInitHand.addSecondObjectIntoField("someField2", "192.168.2.192", "LifxLightBulbLB2",
287 "LifxLightBulb", "LightBulb", 7777, 8888);
290 objInitHand.addField("someField3", IoTCommCode.CREATE_NEW_IOTSET);
291 objInitHand.addObjectIntoField("someField3", "192.168.2.191", "LifxLightBulbLB1",
292 "LifxLightBulb", "LightBulb", 5678, 8989);
293 objInitHand.addObjectIntoField("someField3", "192.168.2.192", "LifxLightBulbLB2",
294 "LifxLightBulb", "LightBulb", 5432, 4576);
295 objInitHand.printLists();
296 //objInitHand.addField("someField1", IoTCommCode.CREATE_NEW_IOTSET, null, null);