Fixing a bug where we can have two events with different objects/classes, e.g., beaco...
[smartthings-infrastructure.git] / Extractor / ExtractorScript.py
1 import os
2 readyToReturn = 0
3 ToReturn = ""
4 eventList = []
5 eventVarMap = {}
6 eventVarCounterMap = {}
7 capabilityMap = {}
8 capabilityList = []
9 app1Capabilities = []
10 app2Capabilities = []
11 app1Subscribe = False
12 app2Subscribe = False
13
14 def GetToken(f):
15         global readyToReturn
16         global ToReturn
17         Skip = ['\n', '\t', ' ']
18         Special = ["(", "\"", ":", ",", "{", "}", ")", "/", "*"]
19         S = ""
20         if (readyToReturn):
21                 readyToReturn = 0
22                 return ToReturn
23         ToReturn = ""
24         c = f.read(1)
25         while(True):
26                 if (c in Special):
27                         if (S != ""):
28                                 readyToReturn = 1
29                                 ToReturn = c
30                                 return S
31                         else:
32                                 return c
33                 elif (c in Skip):
34                         if (S != ""):
35                                 return S        
36                         else:
37                                 c = f.read(1)
38                                 continue
39                 S += c
40                 c = f.read(1)
41                 if not c:
42                         return "EOF"
43
44 def ExtractFunctions(F, appName):
45         global eventList
46         global app1Subscribe
47         global app2Subscribe
48         Temp = GetToken(F)
49         while (Temp != "EOF"):
50                 if (Temp == "def" or Temp == "private"):
51                         Temp = GetToken(F)
52                         if (Temp == "def" or Temp == "private"):
53                                 Temp = GetToken(F)
54                         NameofFunc = Temp
55                         if (GetToken(F) == "("): #We have a function to create object for
56                                 if (appName == "App1"):
57                                         extractedFunctionsApp1.write("//Global Object for functions in subscribe method!\n")    
58                                         extractedFunctionsApp1.write("def %s = this.&" % NameofFunc)
59                                         extractedFunctionsApp1.write("%s\n" % NameofFunc)
60                                 else:
61                                         extractedFunctionsApp2.write("//Global Object for functions in subscribe method!\n")    
62                                         extractedFunctionsApp2.write("def %s = this.&" % NameofFunc)
63                                         extractedFunctionsApp2.write("%s\n" % NameofFunc)
64                 
65                 #Check input capability
66                 if (Temp == "input"):
67                         while Temp != "\"":
68                                 Temp = GetToken(F)
69                         variable = GetToken(F)
70                         Temp = GetToken(F) #Get '"'
71                         Temp = GetToken(F) #Get ','
72                         while Temp != "\"":
73                                 Temp = GetToken(F)
74                         capability = GetToken(F)
75                         capabilityMap[variable] = capability
76                 
77                 #Check subscribed events
78                 if (Temp == "subscribe"):
79                         if (appName == "App1"):
80                                 app1Subscribe = True
81                         else:
82                                 app2Subscribe = True
83                         Temp = GetToken(F)
84                         if (Temp == "("):
85                                 Temp = GetToken(F)
86                         variable = Temp
87                         while (Temp != "\"" and Temp != "app" and Temp != "location"):
88                                 Temp = GetToken(F)
89                         if Temp == "\"":
90                                 Temp = GetToken(F)
91                         if capabilityMap[variable] not in capabilityList:
92                                 # We do not repeat the same capability twice
93                                 capability = capabilityMap[variable]
94                                 capabilityList.append(capability)
95                                 eventList.append(Temp)
96                                 if Temp in eventVarMap.keys():
97                                         listOfEvents = eventVarMap[Temp]
98                                         listOfEvents.append(variable)
99                                 else:
100                                         eventVarMap[Temp] = [variable]
101                                         
102                 #Check and analyze capabilities for physical interaction
103                 AnalyzeCapabilities(Temp, appName, F)
104
105                 Temp = GetToken(F)
106         
107         #Warn if there is a potential for physical interaction
108         AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
109         AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
110
111
112 def AnalyzeCapabilities(Temp, appName, F):
113                         #Illuminance related
114         if (Temp == "capability.switch" or
115                         Temp == "capability.switchLevel" or
116                         Temp == "capability.illuminanceMeasurement" or
117                         Temp == "capability.colorControl" or
118                         #Motion related
119                         Temp == "capability.motionSensor" or
120                         Temp == "capability.accelerationSensor" or
121                         #Water related
122                         Temp == "capability.valve" or
123                         Temp == "capability.waterSensor" or
124                         #Sound related
125                         Temp == "capability.musicPlayer" or
126                         Temp == "capability.alarm" or
127                         Temp == "capability.speechSynthesis" or
128                         Temp == "capability.soundSensor"):
129                 if (appName == "App1"):
130                         app1Capabilities.append(Temp)
131                 else:
132                         app2Capabilities.append(Temp)
133         if (Temp == "capability"):
134                 Temp = GetToken(F) #Get '"'
135                 Temp = GetToken(F) #Get 'Music'
136                 Temp = Temp + GetToken(F) #Get 'Player'
137                 if (Temp == "MusicPlayer"):
138                         if (appName == "App1"):
139                                 app1Capabilities.append("capability.musicPlayer")
140                         else:
141                                 app2Capabilities.append("capability.musicPlayer")
142                         
143 def AnalyzePhysicalInteraction(app1Capab, app2Capab):
144         #Light
145         if ("capability.illuminanceMeasurement" in app1Capab) and ("capability.switch" in app2Capab or 
146                         "capability.switchLevel" in app2Capab or "capability.colorControl" in app2Capab):
147                 print ("\nWARNING: Potential PHYSICAL CONFLICT (light) detected between App1 and App2!\n")
148         #Motion
149         # TODO: Technically this is not entirely precise since we need to be able to detect that the other app creates motion
150         if ("capability.motionSensor" in app1Capab) or ("capability.accelerationSensor" in app1Capab):
151                 print ("\nWARNING: Potential PHYSICAL CONFLICT (motion) detected between App1 and App2!\n")             
152         #Water
153         if ("capability.waterSensor" in app1Capab) and ("capability.valve" in app2Capab or 
154                         "capability.switch" in app2Capab):
155                 print ("\nWARNING: Potential PHYSICAL CONFLICT (water) detected between App1 and App2!\n")
156         #Sound
157         if ("capability.soundSensor" in app1Capab) and ("capability.musicPlayer" in app2Capab or 
158                         "capability.alarm" in app2Capab or "capability.speechSynthesis" in app2Capab):
159                 print ("\nWARNING: Potential PHYSICAL CONFLICT (sound) detected between App1 and App2!\n")
160
161 def ExtractEvents(extractedEvents):
162         global eventList
163         global eventVarMap
164         global capabilityMap
165         global eventVarCounterMap
166         extractedEvents.write("while(true) {\n")
167         extractedEvents.write("\tdef eventNumber = Verify.getInt(0,%d)\n" % (len(eventList) - 1))
168         extractedEvents.write("\tswitch(eventNumber) {\n")
169         for i in range(len(eventList)):
170                 extractedEvents.write("\t\tcase %d:\n" % i)
171                 if eventList[i] == "lock":
172                         #Write two events subsequently
173                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
174                         extractedEvents.write("\t\t\tif (event == 0) {\n")
175                         event = open("eventSimulator/lockLockedEvent.groovy", "r")                      
176                         for line in event:
177                                 extractedEvents.write("\t\t" + line)
178                         event.close()
179                         extractedEvents.write("\t\t\t} else {\n")
180                         event = open("eventSimulator/lockUnlockedEvent.groovy", "r")
181                         for line in event:
182                                 extractedEvents.write("\t\t" + line)
183                         event.close()
184                         extractedEvents.write("\t\t\t}\n")
185                 elif eventList[i] == "unlock":
186                         event = open("eventSimulator/unlockEvent.groovy", "r")
187                         for line in event:
188                                 extractedEvents.write(line)
189                         event.close()
190                 elif eventList[i] == "contact.open":
191                         event = open("eventSimulator/contactOpenEvent.groovy", "r")
192                         for line in event:
193                                 extractedEvents.write(line)
194                         event.close()
195                 elif eventList[i] == "contact.closed":
196                         event = open("eventSimulator/contactClosedEvent.groovy", "r")
197                         for line in event:
198                                 extractedEvents.write(line)
199                         event.close()
200                 elif eventList[i] == "nfcTouch":
201                         event = open("eventSimulator/nfcTouchEvent.groovy", "r")
202                         for line in event:
203                                 extractedEvents.write(line)
204                         event.close()
205                 elif eventList[i] == "app": #Case for Touched event
206                         event = open("eventSimulator/appTouchEvent.groovy", "r")
207                         for line in event:
208                                 extractedEvents.write(line)
209                         event.close()
210                 elif eventList[i] == "button":
211                         #Write two events subsequently
212                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
213                         extractedEvents.write("\t\t\tif (event == 0) {\n")
214                         event = open("eventSimulator/buttonPushedEvent.groovy", "r")                    
215                         for line in event:
216                                 extractedEvents.write("\t\t" + line)
217                         event.close()
218                         extractedEvents.write("\t\t\t} else {\n")
219                         event = open("eventSimulator/buttonHeldEvent.groovy", "r")
220                         for line in event:
221                                 extractedEvents.write("\t\t" + line)
222                         event.close()
223                         extractedEvents.write("\t\t\t}\n")
224                 elif eventList[i] == "water":
225                         #Write two events subsequently
226                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
227                         extractedEvents.write("\t\t\tif (event == 0) {\n")
228                         event = open("eventSimulator/waterDryEvent.groovy", "r")                        
229                         for line in event:
230                                 extractedEvents.write("\t\t" + line)
231                         event.close()
232                         extractedEvents.write("\t\t\t} else {\n")
233                         event = open("eventSimulator/waterWetEvent.groovy", "r")
234                         for line in event:
235                                 extractedEvents.write("\t\t" + line)
236                         event.close()
237                         extractedEvents.write("\t\t\t}\n")
238                 elif eventList[i] == "presence":
239                         #Check which capability
240                         variable = eventVarMap[eventList[i]]
241                         if eventList[i] not in eventVarCounterMap.keys():
242                                 eventVarCounterMap[eventList[i]] = 1
243                                 eventVarCount = 0
244                         else:
245                                 eventVarCount = eventVarCounterMap[eventList[i]]
246                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
247                         capability = capabilityMap[variable[eventVarCount]]
248                         #Write three events subsequently
249                         if capability == "capability.presenceSensor":
250                                 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
251                         elif capability == "capability.beacon":
252                                 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
253                         extractedEvents.write("\t\t\tif (event == 0) {\n")
254                         if capability == "capability.presenceSensor":
255                                 event = open("eventSimulator/presencePresentEvent.groovy", "r")
256                         elif capability == "capability.beacon":
257                                 event = open("eventSimulator/beaconPresentEvent.groovy", "r")
258                         for line in event:
259                                 extractedEvents.write("\t\t" + line)
260                         event.close()
261                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
262                         if capability == "capability.presenceSensor":
263                                 event = open("eventSimulator/presenceLeftEvent.groovy", "r")
264                         elif capability == "capability.beacon":
265                                 event = open("eventSimulator/beaconLeftEvent.groovy", "r")
266                         for line in event:
267                                 extractedEvents.write("\t\t" + line)
268                         event.close()
269                         if capability == "capability.presenceSensor":
270                                 extractedEvents.write("\t\t\t} else {\n")
271                                 event = open("eventSimulator/presencePresencePresentEvent.groovy", "r")
272                                 for line in event:
273                                         extractedEvents.write("\t\t" + line)
274                                 event.close()
275                         extractedEvents.write("\t\t\t}\n")
276                 elif eventList[i] == "doorState":
277                         #Write two events subsequently
278                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
279                         extractedEvents.write("\t\t\tif (event == 0) {\n")
280                         event = open("eventSimulator/doorOpenEvent.groovy", "r")                        
281                         for line in event:
282                                 extractedEvents.write("\t\t" + line)
283                         event.close()
284                         extractedEvents.write("\t\t\t} else {\n")
285                         event = open("eventSimulator/doorClosedEvent.groovy", "r")
286                         for line in event:
287                                 extractedEvents.write("\t\t" + line)
288                         event.close()
289                         extractedEvents.write("\t\t\t}\n")
290                 elif eventList[i] == "motion":
291                         #Write two events subsequently
292                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
293                         extractedEvents.write("\t\t\tif (event == 0) {\n")
294                         event = open("eventSimulator/motionActiveEvent.groovy", "r")                    
295                         for line in event:
296                                 extractedEvents.write("\t\t" + line)
297                         event.close()
298                         extractedEvents.write("\t\t\t} else {\n")
299                         event = open("eventSimulator/motionInactiveEvent.groovy", "r")
300                         for line in event:
301                                 extractedEvents.write("\t\t" + line)
302                         event.close()
303                         extractedEvents.write("\t\t\t}\n")
304                 elif eventList[i] == "smoke":
305                         #Write three events subsequently
306                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
307                         extractedEvents.write("\t\t\tif (event == 0) {\n")
308                         event = open("eventSimulator/smokeClearEvent.groovy", "r")                      
309                         for line in event:
310                                 extractedEvents.write("\t\t" + line)
311                         event.close()
312                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
313                         event = open("eventSimulator/smokeDetectedEvent.groovy", "r")
314                         for line in event:
315                                 extractedEvents.write("\t\t" + line)
316                         event.close()
317                         extractedEvents.write("\t\t\t} else {\n")
318                         event = open("eventSimulator/smokeTestedEvent.groovy", "r")
319                         for line in event:
320                                 extractedEvents.write("\t\t" + line)
321                         event.close()
322                         extractedEvents.write("\t\t\t}\n")
323                 elif eventList[i] == "carbonMonoxide":
324                         #Check which capability
325                         variable = eventVarMap[eventList[i]]
326                         if eventList[i] not in eventVarCounterMap.keys():
327                                 eventVarCounterMap[eventList[i]] = 1
328                                 eventVarCount = 0
329                         else:
330                                 eventVarCount = eventVarCounterMap[eventList[i]]
331                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
332                         capability = capabilityMap[variable[eventVarCount]]
333                         #Write three events subsequently
334                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
335                         extractedEvents.write("\t\t\tif (event == 0) {\n")                      
336                         if capability == "capability.smokeDetector":
337                                 event = open("eventSimulator/smokeCarbonMonoxideClearEvent.groovy", "r")
338                         elif capability == "capability.carbonMonoxideDetector":
339                                 event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r")
340                         for line in event:
341                                 extractedEvents.write("\t\t" + line)
342                         event.close()
343                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
344                         if capability == "capability.smokeDetector":
345                                 event = open("eventSimulator/smokeCarbonMonoxideDetectedEvent.groovy", "r")
346                         elif capability == "capability.carbonMonoxideDetector":
347                                 event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r")
348                         for line in event:
349                                 extractedEvents.write("\t\t" + line)
350                         event.close()
351                         extractedEvents.write("\t\t\t} else {\n")
352                         if capability == "capability.smokeDetector":
353                                 event = open("eventSimulator/smokeCarbonMonoxideTestedEvent.groovy", "r")
354                         elif capability == "capability.carbonMonoxideDetector":
355                                 event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r")
356                         for line in event:
357                                 extractedEvents.write("\t\t" + line)
358                         event.close()
359                         extractedEvents.write("\t\t\t}\n")
360                 elif eventList[i] == "battery":
361                         #Check which capability
362                         variable = eventVarMap[eventList[i]]
363                         if eventList[i] not in eventVarCounterMap.keys():
364                                 eventVarCounterMap[eventList[i]] = 1
365                                 eventVarCount = 0
366                         else:
367                                 eventVarCount = eventVarCounterMap[eventList[i]]
368                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
369                         capability = capabilityMap[variable[eventVarCount]]
370                         if capability == "capability.smokeDetector":
371                                 event = open("eventSimulator/smokeDetectorBatteryEvent.groovy", "r")
372                         elif capability == "capability.battery":
373                                 event = open("eventSimulator/batteryBatteryEvent.groovy", "r")
374                         for line in event:
375                                 extractedEvents.write(line)
376                         event.close()
377                 elif eventList[i] == "thermostatMode":
378                         #Write five events subsequently
379                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
380                         extractedEvents.write("\t\t\tif (event == 0) {\n")
381                         event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r")                      
382                         for line in event:
383                                 extractedEvents.write("\t\t" + line)
384                         event.close()
385                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
386                         event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r")
387                         for line in event:
388                                 extractedEvents.write("\t\t" + line)
389                         event.close()
390                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
391                         event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r")
392                         for line in event:
393                                 extractedEvents.write("\t\t" + line)
394                         event.close()
395                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
396                         event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r")
397                         for line in event:
398                                 extractedEvents.write("\t\t" + line)
399                         event.close()
400                         extractedEvents.write("\t\t\t} else {\n")
401                         event = open("eventSimulator/thermostatOffModeEvent.groovy", "r")
402                         for line in event:
403                                 extractedEvents.write("\t\t" + line)
404                         event.close()
405                         extractedEvents.write("\t\t\t}\n")
406                 elif eventList[i] == "thermostatFanMode":
407                         #Write five events subsequently
408                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
409                         extractedEvents.write("\t\t\tif (event == 0) {\n")
410                         event = open("eventSimulator/thermostatAutoFanModeEvent.groovy", "r")                   
411                         for line in event:
412                                 extractedEvents.write("\t\t" + line)
413                         event.close()
414                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
415                         event = open("eventSimulator/thermostatFanCirculateFanModeEvent.groovy", "r")
416                         for line in event:
417                                 extractedEvents.write("\t\t" + line)
418                         event.close()
419                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
420                         event = open("eventSimulator/thermostatCirculateFanModeEvent.groovy", "r")
421                         for line in event:
422                                 extractedEvents.write("\t\t" + line)
423                         event.close()
424                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
425                         event = open("eventSimulator/thermostatFanOnFanModeEvent.groovy", "r")
426                         for line in event:
427                                 extractedEvents.write("\t\t" + line)
428                         event.close()
429                         extractedEvents.write("\t\t\t} else {\n")
430                         event = open("eventSimulator/thermostatOnFanModeEvent.groovy", "r")
431                         for line in event:
432                                 extractedEvents.write("\t\t" + line)
433                         event.close()
434                         extractedEvents.write("\t\t\t}\n")
435                 elif eventList[i] == "thermostatOperatingState":
436                         #Write five events subsequently
437                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
438                         extractedEvents.write("\t\t\tif (event == 0) {\n")
439                         event = open("eventSimulator/thermostatOperatingStateAutoEvent.groovy", "r")                    
440                         for line in event:
441                                 extractedEvents.write("\t\t" + line)
442                         event.close()
443                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
444                         event = open("eventSimulator/thermostatOperatingStateCoolEvent.groovy", "r")
445                         for line in event:
446                                 extractedEvents.write("\t\t" + line)
447                         event.close()
448                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
449                         event = open("eventSimulator/thermostatOperatingStateOffEvent.groovy", "r")
450                         for line in event:
451                                 extractedEvents.write("\t\t" + line)
452                         event.close()
453                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
454                         event = open("eventSimulator/thermostatOperatingStateEmergencyHeatEvent.groovy", "r")
455                         for line in event:
456                                 extractedEvents.write("\t\t" + line)
457                         event.close()
458                         extractedEvents.write("\t\t\t} else {\n")
459                         event = open("eventSimulator/thermostatOperatingStateHeatEvent.groovy", "r")
460                         for line in event:
461                                 extractedEvents.write("\t\t" + line)
462                         event.close()
463                         extractedEvents.write("\t\t\t}\n")
464                 elif eventList[i] == "switch":
465                         #Check which capability
466                         variable = eventVarMap[eventList[i]]
467                         if eventList[i] not in eventVarCounterMap.keys():
468                                 eventVarCounterMap[eventList[i]] = 1
469                                 eventVarCount = 0
470                         else:
471                                 eventVarCount = eventVarCounterMap[eventList[i]]
472                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
473                         capability = capabilityMap[variable[eventVarCount]]
474                         #Write two events subsequently
475                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
476                         extractedEvents.write("\t\t\tif (event == 0) {\n")
477                         if capability == "capability.switch":
478                                 event = open("eventSimulator/switchOnEvent.groovy", "r")
479                         elif capability == "capability.switchLevel":
480                                 event = open("eventSimulator/switchLevelOnEvent.groovy", "r")
481                         elif capability == "capability.relaySwitch":
482                                 event = open("eventSimulator/relaySwitchOnEvent.groovy", "r")
483                         for line in event:
484                                 extractedEvents.write("\t\t" + line)
485                         event.close()
486                         extractedEvents.write("\t\t\t} else {\n")
487                         if capability == "capability.switch":
488                                 event = open("eventSimulator/switchOffEvent.groovy", "r")
489                         elif capability == "capability.switchLevel":
490                                 event = open("eventSimulator/switchLevelOffEvent.groovy", "r")
491                         elif capability == "capability.relaySwitch":
492                                 event = open("eventSimulator/relaySwitchOffEvent.groovy", "r")
493                         for line in event:
494                                 extractedEvents.write("\t\t" + line)
495                         event.close()
496                         extractedEvents.write("\t\t\t}\n")
497                 elif eventList[i] == "location": #Case for Location event
498                         #Write three events subsequently
499                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
500                         extractedEvents.write("\t\t\tif (event == 0) {\n")
501                         event = open("eventSimulator/locationHomeEvent.groovy", "r")                    
502                         for line in event:
503                                 extractedEvents.write("\t\t" + line)
504                         event.close()
505                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
506                         event = open("eventSimulator/locationAwayEvent.groovy", "r")
507                         for line in event:
508                                 extractedEvents.write("\t\t" + line)
509                         event.close()
510                         extractedEvents.write("\t\t\t} else {\n")
511                         event = open("eventSimulator/locationNightEvent.groovy", "r")
512                         for line in event:
513                                 extractedEvents.write("\t\t" + line)
514                         event.close()
515                         extractedEvents.write("\t\t\t}\n")
516                 elif eventList[i] == "acceleration":
517                         #Write two events subsequently
518                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
519                         extractedEvents.write("\t\t\tif (event == 0) {\n")
520                         event = open("eventSimulator/accelerationActiveEvent.groovy", "r")                      
521                         for line in event:
522                                 extractedEvents.write("\t\t" + line)
523                         event.close()
524                         extractedEvents.write("\t\t\t} else {\n")
525                         event = open("eventSimulator/accelerationInactiveEvent.groovy", "r")
526                         for line in event:
527                                 extractedEvents.write("\t\t" + line)
528                         event.close()
529                         extractedEvents.write("\t\t\t}\n")
530                 elif eventList[i] == "sleeping":
531                         #Write two events subsequently
532                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
533                         extractedEvents.write("\t\t\tif (event == 0) {\n")
534                         event = open("eventSimulator/sleepSleepingEvent.groovy", "r")                   
535                         for line in event:
536                                 extractedEvents.write("\t\t" + line)
537                         event.close()
538                         extractedEvents.write("\t\t\t} else {\n")
539                         event = open("eventSimulator/sleepNotSleepingEvent.groovy", "r")
540                         for line in event:
541                                 extractedEvents.write("\t\t" + line)
542                         event.close()
543                         extractedEvents.write("\t\t\t}\n")
544                 elif eventList[i] == "goal":
545                         event = open("eventSimulator/stepGoalEvent.groovy", "r")
546                         for line in event:
547                                 extractedEvents.write(line)
548                         event.close()
549                 elif eventList[i] == "steps":
550                         event = open("eventSimulator/stepStepsEvent.groovy", "r")
551                         for line in event:
552                                 extractedEvents.write(line)
553                         event.close()
554                 elif eventList[i] == "color":
555                         event = open("eventSimulator/colorChangedEvent.groovy", "r")
556                         for line in event:
557                                 extractedEvents.write(line)
558                         event.close()
559                 elif eventList[i] == "hue":
560                         event = open("eventSimulator/hueChangedEvent.groovy", "r")
561                         for line in event:
562                                 extractedEvents.write(line)
563                         event.close()
564                 elif eventList[i] == "saturation":
565                         event = open("eventSimulator/saturationChangedEvent.groovy", "r")
566                         for line in event:
567                                 extractedEvents.write(line)
568                         event.close()
569                 elif eventList[i] == "energy":
570                         event = open("eventSimulator/energyMeterEvent.groovy", "r")
571                         for line in event:
572                                 extractedEvents.write(line)
573                         event.close()
574                 elif eventList[i] == "power":
575                         event = open("eventSimulator/powerMeterEvent.groovy", "r")
576                         for line in event:
577                                 extractedEvents.write(line)
578                         event.close()
579                 elif eventList[i] == "illuminance":
580                         event = open("eventSimulator/illuminanceMeasurementEvent.groovy", "r")
581                         for line in event:
582                                 extractedEvents.write(line)
583                         event.close()
584                 elif eventList[i] == "humidity":
585                         event = open("eventSimulator/humidityMeasurementEvent.groovy", "r")
586                         for line in event:
587                                 extractedEvents.write(line)
588                         event.close()
589                 elif eventList[i] == "alarm":
590                         #Write four events subsequently
591                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,3)\n")
592                         extractedEvents.write("\t\t\tif (event == 0) {\n")
593                         event = open("eventSimulator/alarmBothEvent.groovy", "r")                       
594                         for line in event:
595                                 extractedEvents.write("\t\t" + line)
596                         event.close()
597                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
598                         event = open("eventSimulator/alarmSirenEvent.groovy", "r")
599                         for line in event:
600                                 extractedEvents.write("\t\t" + line)
601                         event.close()
602                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
603                         event = open("eventSimulator/alarmStrobeEvent.groovy", "r")
604                         for line in event:
605                                 extractedEvents.write("\t\t" + line)
606                         event.close()
607                         extractedEvents.write("\t\t\t} else {\n")
608                         event = open("eventSimulator/alarmOffEvent.groovy", "r")
609                         for line in event:
610                                 extractedEvents.write("\t\t" + line)
611                         event.close()
612                         extractedEvents.write("\t\t\t}\n")
613                 elif eventList[i] == "contact":
614                         #Check which capability
615                         variable = eventVarMap[eventList[i]]
616                         if eventList[i] not in eventVarCounterMap.keys():
617                                 eventVarCounterMap[eventList[i]] = 1
618                                 eventVarCount = 0
619                         else:
620                                 eventVarCount = eventVarCounterMap[eventList[i]]
621                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
622                         capability = capabilityMap[variable[eventVarCount]]
623                         #Write two events subsequently
624                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
625                         extractedEvents.write("\t\t\tif (event == 0) {\n")
626                         if capability == "capability.contactSensor":
627                                 event = open("eventSimulator/contactDefaultClosedEvent.groovy", "r")
628                         elif capability == "capability.valve":
629                                 event = open("eventSimulator/valveClosedEvent.groovy", "r")
630                         for line in event:
631                                 extractedEvents.write("\t\t" + line)
632                         event.close()
633                         extractedEvents.write("\t\t\t} else {\n")
634                         if capability == "capability.contactSensor":
635                                 event = open("eventSimulator/contactDefaultOpenEvent.groovy", "r")
636                         elif capability == "capability.valve":
637                                 event = open("eventSimulator/valveOpenEvent.groovy", "r")
638                         for line in event:
639                                 extractedEvents.write("\t\t" + line)
640                         event.close()
641                         extractedEvents.write("\t\t\t}\n")
642                 elif eventList[i] == "status":
643                         #Write three events subsequently
644                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
645                         extractedEvents.write("\t\t\tif (event == 0) {\n")
646                         event = open("eventSimulator/musicPlayerPlayingEvent.groovy", "r")                      
647                         for line in event:
648                                 extractedEvents.write("\t\t" + line)
649                         event.close()
650                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
651                         event = open("eventSimulator/musicPlayerStoppedEvent.groovy", "r")
652                         for line in event:
653                                 extractedEvents.write("\t\t" + line)
654                         event.close()
655                         extractedEvents.write("\t\t\t} else {\n")
656                         event = open("eventSimulator/musicPlayerPausedEvent.groovy", "r")
657                         for line in event:
658                                 extractedEvents.write("\t\t" + line)
659                         event.close()
660                         extractedEvents.write("\t\t\t}\n")
661                 elif eventList[i] == "level":
662                         #Check which capability
663                         variable = eventVarMap[eventList[i]]
664                         if eventList[i] not in eventVarCounterMap.keys():
665                                 eventVarCounterMap[eventList[i]] = 1
666                                 eventVarCount = 0
667                         else:
668                                 eventVarCount = eventVarCounterMap[eventList[i]]
669                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
670                         capability = capabilityMap[variable[eventVarCount]]
671                         if capability == "capability.musicPlayer":
672                                 event = open("eventSimulator/musicPlayerLevelEvent.groovy", "r")
673                         elif capability == "capability.switchLevel":
674                                 event = open("eventSimulator/switchLevelEvent.groovy", "r")
675                         for line in event:
676                                 extractedEvents.write(line)
677                         event.close()
678                 elif eventList[i] == "trackDescription":
679                         event = open("eventSimulator/musicPlayerTrackDescriptionEvent.groovy", "r")
680                         for line in event:
681                                 extractedEvents.write(line)
682                         event.close()
683                 elif eventList[i] == "trackData":
684                         event = open("eventSimulator/musicPlayerTrackDataEvent.groovy", "r")
685                         for line in event:
686                                 extractedEvents.write(line)
687                         event.close()
688                 elif eventList[i] == "mute":
689                         #Write two events subsequently
690                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
691                         extractedEvents.write("\t\t\tif (event == 0) {\n")
692                         event = open("eventSimulator/musicPlayerUnmutedEvent.groovy", "r")                      
693                         for line in event:
694                                 extractedEvents.write("\t\t" + line)
695                         event.close()
696                         extractedEvents.write("\t\t\t} else {\n")
697                         event = open("eventSimulator/musicPlayerMutedEvent.groovy", "r")
698                         for line in event:
699                                 extractedEvents.write("\t\t" + line)
700                         event.close()
701                         extractedEvents.write("\t\t\t}\n")
702                 elif eventList[i] == "temperature":
703                         #Check which capability
704                         variable = eventVarMap[eventList[i]]
705                         if eventList[i] not in eventVarCounterMap.keys():
706                                 eventVarCounterMap[eventList[i]] = 1
707                                 eventVarCount = 0
708                         else:
709                                 eventVarCount = eventVarCounterMap[eventList[i]]
710                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
711                         capability = capabilityMap[variable[eventVarCount]]
712                         if capability == "capability.thermostat":
713                                 event = open("eventSimulator/temperatureEvent.groovy", "r")
714                         elif capability == "capability.temperatureMeasurement":
715                                 event = open("eventSimulator/temperatureMeasurementEvent.groovy", "r")
716                         for line in event:
717                                 extractedEvents.write(line)
718                         event.close()
719                 elif eventList[i] == "heatingSetpoint":
720                         event = open("eventSimulator/heatingSetpointEvent.groovy", "r")
721                         for line in event:
722                                 extractedEvents.write(line)
723                         event.close()
724                 elif eventList[i] == "coolingSetpoint":
725                         event = open("eventSimulator/coolingSetpointEvent.groovy", "r")
726                         for line in event:
727                                 extractedEvents.write(line)
728                         event.close()
729                 elif eventList[i] == "thermostatSetpoint":
730                         event = open("eventSimulator/thermostatSetpointEvent.groovy", "r")
731                         for line in event:
732                                 extractedEvents.write(line)
733                         event.close()
734                         
735                 ###TODO: Add more events later
736                 extractedEvents.write("\t\t\tbreak\n")
737         extractedEvents.write("\t}\n")
738         extractedEvents.write("}\n")
739         
740 def CheckIfOnlyTouchEvents():
741         #Check and throw an error if it is all touch events
742         #This is called Direct-Direct interaction and we do not model-check for this case
743         onlyTouchEvents = True
744         for item in eventList:
745                 if item != "nfcTouch" and item != "app":
746                         onlyTouchEvents = False
747         if onlyTouchEvents is True and app1Subscribe is True and app2Subscribe is True:
748                 # Write error log file
749                 extractError = open("appCreationError.log", "w+")
750                 extractError.write("Direct-Direct Interaction detected: we are skipping this pair...\n")
751                 extractError.close()
752                 raise Exception("\n\nDirect-Direct Interaction detected: we are skipping this pair...\n\n")
753
754
755 #Extract objects to call functions from App1
756 F1 = open("Extractor/App1/App1.groovy", "r")
757 extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
758 ExtractFunctions(F1, "App1")
759 F1.close()
760
761 #Extract objects to call functions from App2
762 F2 = open("Extractor/App2/App2.groovy", "r")
763 extractedFunctionsApp2 = open("Extractor/App2/extractedFunctionsApp2.groovy", "w+")
764 ExtractFunctions(F2, "App2")
765 F2.close()
766
767 #Prepare eventSimulator file while parsing the App1 and App2 files
768 extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+")
769 CheckIfOnlyTouchEvents()
770 ExtractEvents(extractedEvents)
771 extractedEvents.close()
772
773 #Save the extracted methods and app1 in a same file to extract information
774 extractorFile = open("Extractor/extractorFile.groovy", "w+")
775 Extractor = open("Extractor/Extractor.groovy", "r")
776 F1 = open("Extractor/App1/App1.groovy", "r")
777
778 extractorFile.write("////////////////////\n")
779 extractorFile.write("@Field App\n")
780 extractorFile.write("App = \"App1\"")
781 extractorFile.write("\n")
782 for line in Extractor:
783         extractorFile.write(line)
784 extractorFile.write("\n\n")
785 for line in F1:
786         extractorFile.write(line)
787 extractorFile.close()
788 Extractor.close()
789 F1.close()
790 #Run the file to extract the objects
791 os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
792
793
794 #Save the extracted methods and app2 in a same file to extract information
795 extractorFile = open("Extractor/extractorFile.groovy", "w+")
796 Extractor = open("Extractor/Extractor.groovy", "r")
797 F2 = open("Extractor/App2/App2.groovy", "r")
798
799 extractorFile.write("////////////////////\n")
800 extractorFile.write("@Field App\n")
801 extractorFile.write("App = \"App2\"")
802 extractorFile.write("\n")
803 for line in Extractor:
804         extractorFile.write(line)
805 extractorFile.write("\n\n")
806 for line in F2:
807         extractorFile.write(line)
808 #Run the file to extract the objects
809 extractorFile.close()
810 Extractor.close()
811 F2.close()
812 os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
813
814