2686a81ee7d30db6aa5fe48a3728975d6c4d9387
[iot2.git] / iotjava / iotruntime / master / ObjectInitHandler.java
1 package iotruntime.master;
2
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;
9 import java.util.List;
10 import java.util.Map;
11
12 // IoTJava library
13 import iotruntime.messages.IoTCommCode;
14
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          |
25  *  |            |                              | XXXXX          |
26  *  |            |                      | XXXXX          |
27  *  |            |                      | ...            |
28  *  |            | #2                   | XXXXX          |
29  *  |            |                      | XXXXX          |
30  *  |            |                      | XXXXX          |
31  *  +------------+----------------------+----------------+
32  *  | XXXXXXXXXX | #1                   | XXXXX          |
33  *  |            |                              | XXXXX          |
34  *  |            |                      | XXXXX          |
35  *  |            |                      | ...            |
36  *  |            | #2                   | XXXXX          |
37  *  |            |                      | XXXXX          |
38  *  |            |                      | XXXXX          |
39  *  |            | ...                  | ...            |
40  *  +------------+----------------------+----------------+
41  *
42  * @author      Rahmadi Trimananda <rahmadi.trimananda @ uci.edu>
43  * @version     1.0
44  * @since       2016-05-12
45  */
46 public final class ObjectInitHandler {
47
48
49         /**
50          * ObjectInitHandler class properties
51      * <p>
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
56          */
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;
63
64
65         /**
66          * Empty constructor
67          */
68         public ObjectInitHandler(boolean _bVerbose) {
69
70                 listField = new ArrayList<String>();
71                 listFieldToSetRelation = new ArrayList<IoTCommCode>();
72                 listFieldToObject = new ArrayList<List<ObjectInitInfo>>();
73                 mapFieldToSecondObject = new HashMap<Integer, List<ObjectInitInfo>>();
74                 iNumOfFields = 0;
75                 bVerbose = _bVerbose;
76                 RuntimeOutput.print("ObjectInitHandler: Creating a new ObjectInitHandler object!", bVerbose);
77         }
78
79         /**
80          * Method addField()
81          * <p>
82          * Add a new field
83          *
84          * @param   strField    String field name
85          * @param   iotcommMsg  Store IoTCommCode from master
86          * @return  void
87          */
88         public void addField(String strField, IoTCommCode iotcommMsg) {
89
90
91                 // Add a new object in the list of objects
92                 listField.add(iNumOfFields, strField);
93                 listFieldToSetRelation.add(iNumOfFields, iotcommMsg);
94
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);
100                 }
101                 iNumOfFields++;
102         }
103
104
105         /**
106          * Method addObjectIntoField()
107          * <p>
108          * Add a new field
109          *
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          * @return  void
118          */
119         public void addObjectIntoField(String strField, String strIoTSlaveObjectHostAdd,
120                 String strObjName, String strObjClassName, String strObjClassInterfaceName,
121                 int iRMIRegPort, int iRMIStubPort) {
122
123                 // Get index of strField
124                 int iFieldIndex = listField.indexOf(strField);
125
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);
133         }
134
135
136         /**
137          * Method addSecondObjectIntoField()
138          * <p>
139          * Add a new field
140          *
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
148          * @return  void
149          */
150         public void addSecondObjectIntoField(String strField, String strIoTSlaveObjectHostAdd,
151                 String strObjName, String strObjClassName, String strObjClassInterfaceName,
152                 int iRMIRegPort, int iRMIStubPort) {
153
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);
163         }
164
165
166         /**
167          * Method getNumOfFields()
168          *
169          * @return  int
170          */
171         public int getNumOfFields() {
172
173                 return iNumOfFields;
174
175         }
176
177         /**
178          * Method getListOfFields()
179          *
180          * @return  List<String>        List of fields
181          */
182         public List<String> getListOfFields() {
183
184                 return listField;
185         }
186
187         /**
188          * Method getFieldMessage()
189          *
190          * @param   strField            String field name
191          * @return  IoTCommCode
192          */
193         public IoTCommCode getFieldMessage(String strField) {
194
195                 return listFieldToSetRelation.get(listField.indexOf(strField));
196         }
197
198
199         /**
200          * Method getListObjectInitInfo()
201          *
202          * @param   strField                            String field name
203          * @return  List<ObjectInitInfo>
204          */
205         public List<ObjectInitInfo> getListObjectInitInfo(String strField) {
206
207                 return listFieldToObject.get(listField.indexOf(strField));
208         }
209
210
211         /**
212          * Method getSecondObjectInitInfo()
213          *
214          * @param   strField                            String field name
215          * @return  List<ObjectInitInfo>
216          */
217         public List<ObjectInitInfo> getSecondObjectInitInfo(String strField) {
218
219                 return mapFieldToSecondObject.get(listField.indexOf(strField));
220         }
221
222
223         /**
224          * Method printLists()
225          *
226          * @return  int
227          */
228         public void printLists() {
229
230                 // Iterate on HostAddress
231                 for(String s : listField) {
232
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));
237
238                         Iterator it = null;
239                         if (listFieldToSetRelation.get(listField.indexOf(s)) == IoTCommCode.CREATE_NEW_IOTRELATION) {
240                                 it = listSecObject.iterator();
241                         }
242
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);
251
252                                 if (listFieldToSetRelation.get(listField.indexOf(s)) == IoTCommCode.CREATE_NEW_IOTRELATION) {
253                                         ObjectInitInfo objSecObj = (ObjectInitInfo) it.next();
254
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);                              
262                                 }
263                         }
264                 }
265         }
266
267         public static void main(String[] args) throws Exception {
268
269                 ObjectInitHandler objInitHand = new ObjectInitHandler(true);
270                 // Field #1 IoTSet
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);
276
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);
283
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);
288
289                 // Field #3 IoTSet
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);
297         }
298 }