Adjustments in stubs and skeletons for callback in callback; using different ports...
[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          * @param       iRMICallbackPorts                       Integer RMI callback ports
118          * @return  void
119          */
120         public void addObjectIntoField(String strField, String strIoTSlaveObjectHostAdd,
121                 String strObjName, String strObjClassName, String strObjClassInterfaceName,
122                 String strObjStubClsIntfaceName, int iRMIRegPort, int iRMIStubPort, Integer[] iRMICallbackPorts) {
123
124                 // Get index of strField
125                 int iFieldIndex = listField.indexOf(strField);
126
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);
134         }
135
136
137         /**
138          * Method addSecondObjectIntoField()
139          * <p>
140          * Add a new field
141          *
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
149          * @return  void
150          */
151         public void addSecondObjectIntoField(String strField, String strIoTSlaveObjectHostAdd,
152                 String strObjName, String strObjClassName, String strObjClassInterfaceName,
153                 String strObjStubClsIntfaceName, int iRMIRegPort, int iRMIStubPort, Integer[] iRMICallbackPorts) {
154
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);
164         }
165
166
167         /**
168          * Method getNumOfFields()
169          *
170          * @return  int
171          */
172         public int getNumOfFields() {
173
174                 return iNumOfFields;
175
176         }
177
178         /**
179          * Method getListOfFields()
180          *
181          * @return  List<String>        List of fields
182          */
183         public List<String> getListOfFields() {
184
185                 return listField;
186         }
187
188         /**
189          * Method getFieldMessage()
190          *
191          * @param   strField            String field name
192          * @return  IoTCommCode
193          */
194         public IoTCommCode getFieldMessage(String strField) {
195
196                 return listFieldToSetRelation.get(listField.indexOf(strField));
197         }
198
199
200         /**
201          * Method getListObjectInitInfo()
202          *
203          * @param   strField                            String field name
204          * @return  List<ObjectInitInfo>
205          */
206         public List<ObjectInitInfo> getListObjectInitInfo(String strField) {
207
208                 return listFieldToObject.get(listField.indexOf(strField));
209         }
210
211
212         /**
213          * Method getSecondObjectInitInfo()
214          *
215          * @param   strField                            String field name
216          * @return  List<ObjectInitInfo>
217          */
218         public List<ObjectInitInfo> getSecondObjectInitInfo(String strField) {
219
220                 return mapFieldToSecondObject.get(listField.indexOf(strField));
221         }
222
223
224         /**
225          * Method printLists()
226          *
227          * @return  int
228          */
229         public void printLists() {
230
231                 // Iterate on HostAddress
232                 for(String s : listField) {
233
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));
238
239                         Iterator it = null;
240                         if (listFieldToSetRelation.get(listField.indexOf(s)) == IoTCommCode.CREATE_NEW_IOTRELATION) {
241                                 it = listSecObject.iterator();
242                         }
243
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);
253
254                                 if (listFieldToSetRelation.get(listField.indexOf(s)) == IoTCommCode.CREATE_NEW_IOTRELATION) {
255                                         ObjectInitInfo objSecObj = (ObjectInitInfo) it.next();
256
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);                              
265                                 }
266                         }
267                 }
268         }
269 }