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