Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/smartthings-infrastructure
[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
92                         #print "DEBUG: %s - %s" % (variable, Temp)
93                         #print capabilityMap
94                         if Temp == "app" or Temp == "location":
95                                 if Temp not in eventList:
96                                         eventList.append(Temp)
97                         elif Temp not in eventList or (variable in capabilityMap.keys() and capabilityMap[variable] not in capabilityList):
98                                 # We do not repeat the same capability twice
99                                 capability = capabilityMap[variable]
100                                 capabilityList.append(capability)
101                                 eventList.append(Temp)
102                                 if Temp in eventVarMap.keys():
103                                         listOfEvents = eventVarMap[Temp]
104                                         listOfEvents.append(variable)
105                                 else:
106                                         eventVarMap[Temp] = [variable]
107                         #print "DEBUG: %s - %s" % (variable, Temp)
108                         #print capabilityMap
109                         #print eventList
110
111                 #Check and analyze capabilities for physical interaction
112                 AnalyzeCapabilities(Temp, appName, F)
113
114                 Temp = GetToken(F)
115         
116         #Warn if there is a potential for physical interaction
117         AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
118         AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
119
120 def AnalyzeCapabilities(Temp, appName, F):
121                         #Illuminance related
122         if (Temp == "capability.switch" or
123                         Temp == "capability.switchLevel" or
124                         Temp == "capability.illuminanceMeasurement" or
125                         Temp == "capability.colorControl" or
126                         #Motion related
127                         Temp == "capability.motionSensor" or
128                         Temp == "capability.accelerationSensor" or
129                         #Water related
130                         Temp == "capability.valve" or
131                         Temp == "capability.waterSensor" or
132                         #Sound related
133                         Temp == "capability.musicPlayer" or
134                         Temp == "capability.alarm" or
135                         Temp == "capability.speechSynthesis" or
136                         Temp == "capability.soundSensor"):
137                 if (appName == "App1"):
138                         app1Capabilities.append(Temp)
139                 else:
140                         app2Capabilities.append(Temp)
141         if (Temp == "capability"):
142                 Temp = GetToken(F) #Get '"'
143                 Temp = GetToken(F) #Get 'Music'
144                 Temp = Temp + GetToken(F) #Get 'Player'
145                 if (Temp == "MusicPlayer"):
146                         if (appName == "App1"):
147                                 app1Capabilities.append("capability.musicPlayer")
148                         else:
149                                 app2Capabilities.append("capability.musicPlayer")
150                         
151 def AnalyzePhysicalInteraction(app1Capab, app2Capab):
152         #Light
153         if ("capability.illuminanceMeasurement" in app1Capab) and ("capability.switch" in app2Capab or 
154                         "capability.switchLevel" in app2Capab or "capability.colorControl" in app2Capab):
155                 print ("\nWARNING: Potential PHYSICAL CONFLICT (light) detected between App1 and App2!\n")
156         #Motion
157         # TODO: Technically this is not entirely precise since we need to be able to detect that the other app creates motion
158         if ("capability.motionSensor" in app1Capab) or ("capability.accelerationSensor" in app1Capab):
159                 print ("\nWARNING: Potential PHYSICAL CONFLICT (motion) detected between App1 and App2!\n")             
160         #Water
161         if ("capability.waterSensor" in app1Capab) and ("capability.valve" in app2Capab or 
162                         "capability.switch" in app2Capab):
163                 print ("\nWARNING: Potential PHYSICAL CONFLICT (water) detected between App1 and App2!\n")
164         #Sound
165         if ("capability.soundSensor" in app1Capab) and ("capability.musicPlayer" in app2Capab or 
166                         "capability.alarm" in app2Capab or "capability.speechSynthesis" in app2Capab):
167                 print ("\nWARNING: Potential PHYSICAL CONFLICT (sound) detected between App1 and App2!\n")
168
169 def ExtractEvents(extractedEvents):
170         global eventList
171         global eventVarMap
172         global capabilityMap
173         global eventVarCounterMap
174         extractedEvents.write("while(true) {\n")
175         extractedEvents.write("\tdef eventNumber = Verify.getInt(0,%d)\n" % (len(eventList) - 1))
176         extractedEvents.write("\tswitch(eventNumber) {\n")
177         for i in range(len(eventList)):
178                 extractedEvents.write("\t\tcase %d:\n" % i)
179                 if eventList[i] == "lock":
180                         #Write two events subsequently
181                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
182                         extractedEvents.write("\t\t\tif (event == 0) {\n")
183                         event = open("eventSimulator/lockLockedEvent.groovy", "r")                      
184                         for line in event:
185                                 extractedEvents.write("\t\t" + line)
186                         event.close()
187                         extractedEvents.write("\t\t\t} else {\n")
188                         event = open("eventSimulator/lockUnlockedEvent.groovy", "r")
189                         for line in event:
190                                 extractedEvents.write("\t\t" + line)
191                         event.close()
192                         extractedEvents.write("\t\t\t}\n")
193                 elif eventList[i] == "unlock":
194                         event = open("eventSimulator/unlockEvent.groovy", "r")
195                         for line in event:
196                                 extractedEvents.write(line)
197                         event.close()
198                 elif eventList[i] == "contact.open":
199                         event = open("eventSimulator/contactOpenEvent.groovy", "r")
200                         for line in event:
201                                 extractedEvents.write(line)
202                         event.close()
203                 elif eventList[i] == "contact.closed":
204                         event = open("eventSimulator/contactClosedEvent.groovy", "r")
205                         for line in event:
206                                 extractedEvents.write(line)
207                         event.close()
208                 elif eventList[i] == "tamper.tampered":
209                         #Write two events subsequently
210                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
211                         extractedEvents.write("\t\t\tif (event == 0) {\n")
212                         event = open("eventSimulator/tamperTamperedOpenEvent.groovy", "r")                      
213                         for line in event:
214                                 extractedEvents.write("\t\t" + line)
215                         event.close()
216                         extractedEvents.write("\t\t\t} else {\n")
217                         event = open("eventSimulator/tamperTamperedClosedEvent.groovy", "r")
218                         for line in event:
219                                 extractedEvents.write("\t\t" + line)
220                         event.close()
221                         extractedEvents.write("\t\t\t}\n")
222                 elif eventList[i] == "nfcTouch":
223                         event = open("eventSimulator/nfcTouchEvent.groovy", "r")
224                         for line in event:
225                                 extractedEvents.write(line)
226                         event.close()
227                 elif eventList[i] == "app": #Case for Touched event
228                         event = open("eventSimulator/appTouchEvent.groovy", "r")
229                         for line in event:
230                                 extractedEvents.write(line)
231                         event.close()
232                 elif eventList[i] == "button":
233                         #Write two events subsequently
234                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
235                         extractedEvents.write("\t\t\tif (event == 0) {\n")
236                         event = open("eventSimulator/buttonPushedEvent.groovy", "r")                    
237                         for line in event:
238                                 extractedEvents.write("\t\t" + line)
239                         event.close()
240                         extractedEvents.write("\t\t\t} else {\n")
241                         event = open("eventSimulator/buttonHeldEvent.groovy", "r")
242                         for line in event:
243                                 extractedEvents.write("\t\t" + line)
244                         event.close()
245                         extractedEvents.write("\t\t\t}\n")
246                 elif eventList[i] == "water":
247                         #Write two events subsequently
248                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
249                         extractedEvents.write("\t\t\tif (event == 0) {\n")
250                         event = open("eventSimulator/waterDryEvent.groovy", "r")                        
251                         for line in event:
252                                 extractedEvents.write("\t\t" + line)
253                         event.close()
254                         extractedEvents.write("\t\t\t} else {\n")
255                         event = open("eventSimulator/waterWetEvent.groovy", "r")
256                         for line in event:
257                                 extractedEvents.write("\t\t" + line)
258                         event.close()
259                         extractedEvents.write("\t\t\t}\n")
260                 elif eventList[i] == "water.dry":
261                         event = open("eventSimulator/waterDefaultDryEvent.groovy", "r")
262                         for line in event:
263                                 extractedEvents.write(line)
264                         event.close()
265                 elif eventList[i] == "water.wet":
266                         event = open("eventSimulator/waterDefaultWetEvent.groovy", "r")
267                         for line in event:
268                                 extractedEvents.write(line)
269                         event.close()
270                 elif eventList[i] == "presence":
271                         #Check which capability
272                         variable = eventVarMap[eventList[i]]
273                         if eventList[i] not in eventVarCounterMap.keys():
274                                 eventVarCounterMap[eventList[i]] = 1
275                                 eventVarCount = 0
276                         else:
277                                 eventVarCount = eventVarCounterMap[eventList[i]]
278                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
279                         capability = capabilityMap[variable[eventVarCount]]
280                         #Write three events subsequently
281                         if capability == "capability.presenceSensor":
282                                 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
283                         elif capability == "capability.beacon":
284                                 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
285                         extractedEvents.write("\t\t\tif (event == 0) {\n")
286                         if capability == "capability.presenceSensor":
287                                 event = open("eventSimulator/presencePresentEvent.groovy", "r")
288                         elif capability == "capability.beacon":
289                                 event = open("eventSimulator/beaconPresentEvent.groovy", "r")
290                         for line in event:
291                                 extractedEvents.write("\t\t" + line)
292                         event.close()
293                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
294                         if capability == "capability.presenceSensor":
295                                 event = open("eventSimulator/presenceLeftEvent.groovy", "r")
296                         elif capability == "capability.beacon":
297                                 event = open("eventSimulator/beaconLeftEvent.groovy", "r")
298                         for line in event:
299                                 extractedEvents.write("\t\t" + line)
300                         event.close()
301                         extractedEvents.write("\t\t\t}\n")
302                 elif eventList[i] == "presence.present": #Case for Touched event
303                         event = open("eventSimulator/presencePresencePresentEvent.groovy", "r")
304                         for line in event:
305                                 extractedEvents.write("\t\t" + line)
306                         event.close()
307                 elif eventList[i] == "doorState":
308                         #Write two events subsequently
309                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
310                         extractedEvents.write("\t\t\tif (event == 0) {\n")
311                         event = open("eventSimulator/doorOpenEvent.groovy", "r")                        
312                         for line in event:
313                                 extractedEvents.write("\t\t" + line)
314                         event.close()
315                         extractedEvents.write("\t\t\t} else {\n")
316                         event = open("eventSimulator/doorClosedEvent.groovy", "r")
317                         for line in event:
318                                 extractedEvents.write("\t\t" + line)
319                         event.close()
320                         extractedEvents.write("\t\t\t}\n")
321                 elif eventList[i] == "motion":
322                         #Write two events subsequently
323                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
324                         extractedEvents.write("\t\t\tif (event == 0) {\n")
325                         event = open("eventSimulator/motionActiveEvent.groovy", "r")                    
326                         for line in event:
327                                 extractedEvents.write("\t\t" + line)
328                         event.close()
329                         extractedEvents.write("\t\t\t} else {\n")
330                         event = open("eventSimulator/motionInactiveEvent.groovy", "r")
331                         for line in event:
332                                 extractedEvents.write("\t\t" + line)
333                         event.close()
334                         extractedEvents.write("\t\t\t}\n")
335                 elif eventList[i] == "motion.active":
336                         event = open("eventSimulator/motionDefaultActiveEvent.groovy", "r")
337                         for line in event:
338                                 extractedEvents.write("\t\t" + line)
339                         event.close()
340                 elif eventList[i] == "motion.inactive":
341                         event = open("eventSimulator/motionDefaultInactiveEvent.groovy", "r")
342                         for line in event:
343                                 extractedEvents.write("\t\t" + line)
344                         event.close()
345                 elif eventList[i] == "smoke":
346                         #Write three events subsequently
347                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
348                         extractedEvents.write("\t\t\tif (event == 0) {\n")
349                         event = open("eventSimulator/smokeClearEvent.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/smokeDetectedEvent.groovy", "r")
355                         for line in event:
356                                 extractedEvents.write("\t\t" + line)
357                         event.close()
358                         extractedEvents.write("\t\t\t} else {\n")
359                         event = open("eventSimulator/smokeTestedEvent.groovy", "r")
360                         for line in event:
361                                 extractedEvents.write("\t\t" + line)
362                         event.close()
363                         extractedEvents.write("\t\t\t}\n")
364                 elif eventList[i] == "smoke.clear":
365                         event = open("eventSimulator/smokeDefaultClearEvent.groovy", "r")
366                         for line in event:
367                                 extractedEvents.write("\t\t" + line)
368                         event.close()
369                 elif eventList[i] == "smoke.detected":
370                         event = open("eventSimulator/smokeDefaultDetectedEvent.groovy", "r")
371                         for line in event:
372                                 extractedEvents.write("\t\t" + line)
373                         event.close()
374                 elif eventList[i] == "smoke.tested":
375                         event = open("eventSimulator/smokeDefaultTestedEvent.groovy", "r")
376                         for line in event:
377                                 extractedEvents.write("\t\t" + line)
378                         event.close()
379                 elif eventList[i] == "carbonMonoxide":
380                         #Check which capability
381                         variable = eventVarMap[eventList[i]]
382                         if eventList[i] not in eventVarCounterMap.keys():
383                                 eventVarCounterMap[eventList[i]] = 1
384                                 eventVarCount = 0
385                         else:
386                                 eventVarCount = eventVarCounterMap[eventList[i]]
387                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
388                         capability = capabilityMap[variable[eventVarCount]]
389                         #Write three events subsequently
390                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
391                         extractedEvents.write("\t\t\tif (event == 0) {\n")                      
392                         if capability == "capability.smokeDetector":
393                                 event = open("eventSimulator/smokeCarbonMonoxideClearEvent.groovy", "r")
394                         elif capability == "capability.carbonMonoxideDetector":
395                                 event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r")
396                         for line in event:
397                                 extractedEvents.write("\t\t" + line)
398                         event.close()
399                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
400                         if capability == "capability.smokeDetector":
401                                 event = open("eventSimulator/smokeCarbonMonoxideDetectedEvent.groovy", "r")
402                         elif capability == "capability.carbonMonoxideDetector":
403                                 event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r")
404                         for line in event:
405                                 extractedEvents.write("\t\t" + line)
406                         event.close()
407                         extractedEvents.write("\t\t\t} else {\n")
408                         if capability == "capability.smokeDetector":
409                                 event = open("eventSimulator/smokeCarbonMonoxideTestedEvent.groovy", "r")
410                         elif capability == "capability.carbonMonoxideDetector":
411                                 event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r")
412                         for line in event:
413                                 extractedEvents.write("\t\t" + line)
414                         event.close()
415                         extractedEvents.write("\t\t\t}\n")
416                 elif eventList[i] == "carbonMonoxide.clear":
417                         #Check which capability
418                         variable = eventVarMap[eventList[i]]
419                         if eventList[i] not in eventVarCounterMap.keys():
420                                 eventVarCounterMap[eventList[i]] = 1
421                                 eventVarCount = 0
422                         else:
423                                 eventVarCount = eventVarCounterMap[eventList[i]]
424                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
425                         capability = capabilityMap[variable[eventVarCount]]
426                         if capability == "capability.smokeDetector":
427                                 event = open("eventSimulator/smokeCarbonMonoxideDefaultClearEvent.groovy", "r")
428                         elif capability == "capability.carbonMonoxideDetector":
429                                 event = open("eventSimulator/carbonMonoxideDefaultClearEvent.groovy", "r")
430                         for line in event:
431                                 extractedEvents.write("\t\t" + line)
432                         event.close()
433                 elif eventList[i] == "carbonMonoxide.detected":
434                         #Check which capability
435                         variable = eventVarMap[eventList[i]]
436                         if eventList[i] not in eventVarCounterMap.keys():
437                                 eventVarCounterMap[eventList[i]] = 1
438                                 eventVarCount = 0
439                         else:
440                                 eventVarCount = eventVarCounterMap[eventList[i]]
441                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
442                         capability = capabilityMap[variable[eventVarCount]]
443                         if capability == "capability.smokeDetector":
444                                 event = open("eventSimulator/smokeCarbonMonoxideDefaultDetectedEvent.groovy", "r")
445                         elif capability == "capability.carbonMonoxideDetector":
446                                 event = open("eventSimulator/carbonMonoxideDefaultDetectedEvent.groovy", "r")
447                         for line in event:
448                                 extractedEvents.write("\t\t" + line)
449                         event.close()
450                 elif eventList[i] == "carbonMonoxide.tested":
451                         #Check which capability
452                         variable = eventVarMap[eventList[i]]
453                         if eventList[i] not in eventVarCounterMap.keys():
454                                 eventVarCounterMap[eventList[i]] = 1
455                                 eventVarCount = 0
456                         else:
457                                 eventVarCount = eventVarCounterMap[eventList[i]]
458                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
459                         capability = capabilityMap[variable[eventVarCount]]
460                         if capability == "capability.smokeDetector":
461                                 event = open("eventSimulator/smokeCarbonMonoxideDefaultTestedEvent.groovy", "r")
462                         elif capability == "capability.carbonMonoxideDetector":
463                                 event = open("eventSimulator/carbonMonoxideDefaultTestedEvent.groovy", "r")
464                         for line in event:
465                                 extractedEvents.write("\t\t" + line)
466                         event.close()
467                 elif eventList[i] == "battery":
468                         #Check which capability
469                         variable = eventVarMap[eventList[i]]
470                         if eventList[i] not in eventVarCounterMap.keys():
471                                 eventVarCounterMap[eventList[i]] = 1
472                                 eventVarCount = 0
473                         else:
474                                 eventVarCount = eventVarCounterMap[eventList[i]]
475                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
476                         capability = capabilityMap[variable[eventVarCount]]
477                         if capability == "capability.smokeDetector":
478                                 event = open("eventSimulator/smokeDetectorBatteryEvent.groovy", "r")
479                         elif capability == "capability.battery":
480                                 event = open("eventSimulator/batteryBatteryEvent.groovy", "r")
481                         for line in event:
482                                 extractedEvents.write(line)
483                         event.close()
484                 elif eventList[i] == "thermostatMode":
485                         #Write five events subsequently
486                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
487                         extractedEvents.write("\t\t\tif (event == 0) {\n")
488                         event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r")                      
489                         for line in event:
490                                 extractedEvents.write("\t\t" + line)
491                         event.close()
492                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
493                         event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r")
494                         for line in event:
495                                 extractedEvents.write("\t\t" + line)
496                         event.close()
497                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
498                         event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r")
499                         for line in event:
500                                 extractedEvents.write("\t\t" + line)
501                         event.close()
502                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
503                         event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r")
504                         for line in event:
505                                 extractedEvents.write("\t\t" + line)
506                         event.close()
507                         extractedEvents.write("\t\t\t} else {\n")
508                         event = open("eventSimulator/thermostatOffModeEvent.groovy", "r")
509                         for line in event:
510                                 extractedEvents.write("\t\t" + line)
511                         event.close()
512                         extractedEvents.write("\t\t\t}\n")
513                 elif eventList[i] == "thermostatFanMode":
514                         #Write five events subsequently
515                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
516                         extractedEvents.write("\t\t\tif (event == 0) {\n")
517                         event = open("eventSimulator/thermostatAutoFanModeEvent.groovy", "r")                   
518                         for line in event:
519                                 extractedEvents.write("\t\t" + line)
520                         event.close()
521                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
522                         event = open("eventSimulator/thermostatFanCirculateFanModeEvent.groovy", "r")
523                         for line in event:
524                                 extractedEvents.write("\t\t" + line)
525                         event.close()
526                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
527                         event = open("eventSimulator/thermostatCirculateFanModeEvent.groovy", "r")
528                         for line in event:
529                                 extractedEvents.write("\t\t" + line)
530                         event.close()
531                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
532                         event = open("eventSimulator/thermostatFanOnFanModeEvent.groovy", "r")
533                         for line in event:
534                                 extractedEvents.write("\t\t" + line)
535                         event.close()
536                         extractedEvents.write("\t\t\t} else {\n")
537                         event = open("eventSimulator/thermostatOnFanModeEvent.groovy", "r")
538                         for line in event:
539                                 extractedEvents.write("\t\t" + line)
540                         event.close()
541                         extractedEvents.write("\t\t\t}\n")
542                 elif eventList[i] == "thermostatOperatingState":
543                         #Write five events subsequently
544                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
545                         extractedEvents.write("\t\t\tif (event == 0) {\n")
546                         event = open("eventSimulator/thermostatOperatingStateAutoEvent.groovy", "r")                    
547                         for line in event:
548                                 extractedEvents.write("\t\t" + line)
549                         event.close()
550                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
551                         event = open("eventSimulator/thermostatOperatingStateCoolEvent.groovy", "r")
552                         for line in event:
553                                 extractedEvents.write("\t\t" + line)
554                         event.close()
555                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
556                         event = open("eventSimulator/thermostatOperatingStateOffEvent.groovy", "r")
557                         for line in event:
558                                 extractedEvents.write("\t\t" + line)
559                         event.close()
560                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
561                         event = open("eventSimulator/thermostatOperatingStateEmergencyHeatEvent.groovy", "r")
562                         for line in event:
563                                 extractedEvents.write("\t\t" + line)
564                         event.close()
565                         extractedEvents.write("\t\t\t} else {\n")
566                         event = open("eventSimulator/thermostatOperatingStateHeatEvent.groovy", "r")
567                         for line in event:
568                                 extractedEvents.write("\t\t" + line)
569                         event.close()
570                         extractedEvents.write("\t\t\t}\n")
571                 elif eventList[i] == "switch":
572                         #Check which capability
573                         variable = eventVarMap[eventList[i]]
574                         if eventList[i] not in eventVarCounterMap.keys():
575                                 eventVarCounterMap[eventList[i]] = 1
576                                 eventVarCount = 0
577                         else:
578                                 eventVarCount = eventVarCounterMap[eventList[i]]
579                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
580                         capability = capabilityMap[variable[eventVarCount]]
581                         #Write two events subsequently
582                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
583                         extractedEvents.write("\t\t\tif (event == 0) {\n")
584                         if capability == "capability.switch":
585                                 event = open("eventSimulator/switchOnEvent.groovy", "r")
586                         elif capability == "capability.switchLevel":
587                                 event = open("eventSimulator/switchLevelOnEvent.groovy", "r")
588                         elif capability == "capability.relaySwitch":
589                                 event = open("eventSimulator/relaySwitchOnEvent.groovy", "r")
590                         elif capability == "capability.colorControl":
591                                 event = open("eventSimulator/colorControlSwitchOnEvent.groovy", "r")
592                         for line in event:
593                                 extractedEvents.write("\t\t" + line)
594                         event.close()
595                         extractedEvents.write("\t\t\t} else {\n")
596                         if capability == "capability.switch":
597                                 event = open("eventSimulator/switchOffEvent.groovy", "r")
598                         elif capability == "capability.switchLevel":
599                                 event = open("eventSimulator/switchLevelOffEvent.groovy", "r")
600                         elif capability == "capability.relaySwitch":
601                                 event = open("eventSimulator/relaySwitchOffEvent.groovy", "r")
602                         elif capability == "capability.colorControl":
603                                 event = open("eventSimulator/colorControlSwitchOffEvent.groovy", "r")
604                         for line in event:
605                                 extractedEvents.write("\t\t" + line)
606                         event.close()
607                         extractedEvents.write("\t\t\t}\n")
608                 elif eventList[i] == "location": #Case for Location event
609                         #Write three events subsequently
610                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
611                         extractedEvents.write("\t\t\tif (event == 0) {\n")
612                         event = open("eventSimulator/locationHomeEvent.groovy", "r")                    
613                         for line in event:
614                                 extractedEvents.write("\t\t" + line)
615                         event.close()
616                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
617                         event = open("eventSimulator/locationAwayEvent.groovy", "r")
618                         for line in event:
619                                 extractedEvents.write("\t\t" + line)
620                         event.close()
621                         extractedEvents.write("\t\t\t} else {\n")
622                         event = open("eventSimulator/locationNightEvent.groovy", "r")
623                         for line in event:
624                                 extractedEvents.write("\t\t" + line)
625                         event.close()
626                         extractedEvents.write("\t\t\t}\n")
627                 elif eventList[i] == "mode":
628                         #Write three events subsequently
629                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
630                         extractedEvents.write("\t\t\tif (event == 0) {\n")
631                         event = open("eventSimulator/modeHomeEvent.groovy", "r")                        
632                         for line in event:
633                                 extractedEvents.write("\t\t" + line)
634                         event.close()
635                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
636                         event = open("eventSimulator/modeAwayEvent.groovy", "r")
637                         for line in event:
638                                 extractedEvents.write("\t\t" + line)
639                         event.close()
640                         extractedEvents.write("\t\t\t} else {\n")
641                         event = open("eventSimulator/modeNightEvent.groovy", "r")
642                         for line in event:
643                                 extractedEvents.write("\t\t" + line)
644                         event.close()
645                         extractedEvents.write("\t\t\t}\n")
646                 elif eventList[i] == "acceleration":
647                         #Write two events subsequently
648                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
649                         extractedEvents.write("\t\t\tif (event == 0) {\n")
650                         event = open("eventSimulator/accelerationActiveEvent.groovy", "r")                      
651                         for line in event:
652                                 extractedEvents.write("\t\t" + line)
653                         event.close()
654                         extractedEvents.write("\t\t\t} else {\n")
655                         event = open("eventSimulator/accelerationInactiveEvent.groovy", "r")
656                         for line in event:
657                                 extractedEvents.write("\t\t" + line)
658                         event.close()
659                         extractedEvents.write("\t\t\t}\n")
660                 elif eventList[i] == "acceleration.active":
661                         event = open("eventSimulator/accelerationDefaultActiveEvent.groovy", "r")
662                         for line in event:
663                                 extractedEvents.write("\t\t" + line)
664                         event.close()
665                 elif eventList[i] == "acceleration.inactive":
666                         event = open("eventSimulator/accelerationDefaultInactiveEvent.groovy", "r")
667                         for line in event:
668                                 extractedEvents.write("\t\t" + line)
669                         event.close()
670                 elif eventList[i] == "sleeping":
671                         #Write two events subsequently
672                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
673                         extractedEvents.write("\t\t\tif (event == 0) {\n")
674                         event = open("eventSimulator/sleepSleepingEvent.groovy", "r")                   
675                         for line in event:
676                                 extractedEvents.write("\t\t" + line)
677                         event.close()
678                         extractedEvents.write("\t\t\t} else {\n")
679                         event = open("eventSimulator/sleepNotSleepingEvent.groovy", "r")
680                         for line in event:
681                                 extractedEvents.write("\t\t" + line)
682                         event.close()
683                         extractedEvents.write("\t\t\t}\n")
684                 elif eventList[i] == "goal":
685                         event = open("eventSimulator/stepGoalEvent.groovy", "r")
686                         for line in event:
687                                 extractedEvents.write(line)
688                         event.close()
689                 elif eventList[i] == "steps":
690                         event = open("eventSimulator/stepStepsEvent.groovy", "r")
691                         for line in event:
692                                 extractedEvents.write(line)
693                         event.close()
694                 elif eventList[i] == "color":
695                         event = open("eventSimulator/colorChangeEvent.groovy", "r")
696                         for line in event:
697                                 extractedEvents.write(line)
698                         event.close()
699                 elif eventList[i] == "colorTemperature":
700                         event = open("eventSimulator/colorTemperatureEvent.groovy", "r")
701                         for line in event:
702                                 extractedEvents.write(line)
703                         event.close()
704                 elif eventList[i] == "hue":
705                         event = open("eventSimulator/hueChangeEvent.groovy", "r")
706                         for line in event:
707                                 extractedEvents.write(line)
708                         event.close()
709                 elif eventList[i] == "saturation":
710                         event = open("eventSimulator/saturationChangeEvent.groovy", "r")
711                         for line in event:
712                                 extractedEvents.write(line)
713                         event.close()
714                 elif eventList[i] == "energy":
715                         event = open("eventSimulator/energyMeterEvent.groovy", "r")
716                         for line in event:
717                                 extractedEvents.write(line)
718                         event.close()
719                 elif eventList[i] == "power":
720                         event = open("eventSimulator/powerMeterEvent.groovy", "r")
721                         for line in event:
722                                 extractedEvents.write(line)
723                         event.close()
724                 elif eventList[i] == "illuminance":
725                         event = open("eventSimulator/illuminanceMeasurementEvent.groovy", "r")
726                         for line in event:
727                                 extractedEvents.write(line)
728                         event.close()
729                 elif eventList[i] == "humidity":
730                         event = open("eventSimulator/humidityMeasurementEvent.groovy", "r")
731                         for line in event:
732                                 extractedEvents.write(line)
733                         event.close()
734                 elif eventList[i] == "alarm":
735                         #Write four events subsequently
736                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,3)\n")
737                         extractedEvents.write("\t\t\tif (event == 0) {\n")
738                         event = open("eventSimulator/alarmBothEvent.groovy", "r")                       
739                         for line in event:
740                                 extractedEvents.write("\t\t" + line)
741                         event.close()
742                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
743                         event = open("eventSimulator/alarmSirenEvent.groovy", "r")
744                         for line in event:
745                                 extractedEvents.write("\t\t" + line)
746                         event.close()
747                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
748                         event = open("eventSimulator/alarmStrobeEvent.groovy", "r")
749                         for line in event:
750                                 extractedEvents.write("\t\t" + line)
751                         event.close()
752                         extractedEvents.write("\t\t\t} else {\n")
753                         event = open("eventSimulator/alarmOffEvent.groovy", "r")
754                         for line in event:
755                                 extractedEvents.write("\t\t" + line)
756                         event.close()
757                         extractedEvents.write("\t\t\t}\n")
758                 elif eventList[i] == "contact":
759                         #Check which capability
760                         variable = eventVarMap[eventList[i]]
761                         if eventList[i] not in eventVarCounterMap.keys():
762                                 eventVarCounterMap[eventList[i]] = 1
763                                 eventVarCount = 0
764                         else:
765                                 eventVarCount = eventVarCounterMap[eventList[i]]
766                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
767                         capability = capabilityMap[variable[eventVarCount]]
768                         #Write two events subsequently
769                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
770                         extractedEvents.write("\t\t\tif (event == 0) {\n")
771                         if capability == "capability.contactSensor":
772                                 event = open("eventSimulator/contactDefaultClosedEvent.groovy", "r")
773                         elif capability == "capability.valve":
774                                 event = open("eventSimulator/valveClosedEvent.groovy", "r")
775                         for line in event:
776                                 extractedEvents.write("\t\t" + line)
777                         event.close()
778                         extractedEvents.write("\t\t\t} else {\n")
779                         if capability == "capability.contactSensor":
780                                 event = open("eventSimulator/contactDefaultOpenEvent.groovy", "r")
781                         elif capability == "capability.valve":
782                                 event = open("eventSimulator/valveOpenEvent.groovy", "r")
783                         for line in event:
784                                 extractedEvents.write("\t\t" + line)
785                         event.close()
786                         extractedEvents.write("\t\t\t}\n")
787                 elif eventList[i] == "status":
788                         #Write three events subsequently
789                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
790                         extractedEvents.write("\t\t\tif (event == 0) {\n")
791                         event = open("eventSimulator/musicPlayerPlayingEvent.groovy", "r")                      
792                         for line in event:
793                                 extractedEvents.write("\t\t" + line)
794                         event.close()
795                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
796                         event = open("eventSimulator/musicPlayerStoppedEvent.groovy", "r")
797                         for line in event:
798                                 extractedEvents.write("\t\t" + line)
799                         event.close()
800                         extractedEvents.write("\t\t\t} else {\n")
801                         event = open("eventSimulator/musicPlayerPausedEvent.groovy", "r")
802                         for line in event:
803                                 extractedEvents.write("\t\t" + line)
804                         event.close()
805                         extractedEvents.write("\t\t\t}\n")
806                 elif eventList[i] == "level":
807                         #Check which capability
808                         variable = eventVarMap[eventList[i]]
809                         if eventList[i] not in eventVarCounterMap.keys():
810                                 eventVarCounterMap[eventList[i]] = 1
811                                 eventVarCount = 0
812                         else:
813                                 eventVarCount = eventVarCounterMap[eventList[i]]
814                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
815                         capability = capabilityMap[variable[eventVarCount]]
816                         if capability == "capability.musicPlayer":
817                                 event = open("eventSimulator/musicPlayerLevelEvent.groovy", "r")
818                         elif capability == "capability.switchLevel":
819                                 event = open("eventSimulator/switchLevelEvent.groovy", "r")
820                         for line in event:
821                                 extractedEvents.write(line)
822                         event.close()
823                 elif eventList[i] == "trackDescription":
824                         event = open("eventSimulator/musicPlayerTrackDescriptionEvent.groovy", "r")
825                         for line in event:
826                                 extractedEvents.write(line)
827                         event.close()
828                 elif eventList[i] == "trackData":
829                         event = open("eventSimulator/musicPlayerTrackDataEvent.groovy", "r")
830                         for line in event:
831                                 extractedEvents.write(line)
832                         event.close()
833                 elif eventList[i] == "mute":
834                         #Write two events subsequently
835                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
836                         extractedEvents.write("\t\t\tif (event == 0) {\n")
837                         event = open("eventSimulator/musicPlayerUnmutedEvent.groovy", "r")                      
838                         for line in event:
839                                 extractedEvents.write("\t\t" + line)
840                         event.close()
841                         extractedEvents.write("\t\t\t} else {\n")
842                         event = open("eventSimulator/musicPlayerMutedEvent.groovy", "r")
843                         for line in event:
844                                 extractedEvents.write("\t\t" + line)
845                         event.close()
846                         extractedEvents.write("\t\t\t}\n")
847                 elif eventList[i] == "temperature":
848                         #Check which capability
849                         variable = eventVarMap[eventList[i]]
850                         if eventList[i] not in eventVarCounterMap.keys():
851                                 eventVarCounterMap[eventList[i]] = 1
852                                 eventVarCount = 0
853                         else:
854                                 eventVarCount = eventVarCounterMap[eventList[i]]
855                                 eventVarCounterMap[eventList[i]] = eventVarCount + 1
856                         capability = capabilityMap[variable[eventVarCount]]
857                         if capability == "capability.thermostat":
858                                 event = open("eventSimulator/temperatureEvent.groovy", "r")
859                         elif capability == "capability.temperatureMeasurement":
860                                 event = open("eventSimulator/temperatureMeasurementEvent.groovy", "r")
861                         for line in event:
862                                 extractedEvents.write(line)
863                         event.close()
864                 elif eventList[i] == "heatingSetpoint":
865                         event = open("eventSimulator/heatingSetpointEvent.groovy", "r")
866                         for line in event:
867                                 extractedEvents.write(line)
868                         event.close()
869                 elif eventList[i] == "coolingSetpoint":
870                         event = open("eventSimulator/coolingSetpointEvent.groovy", "r")
871                         for line in event:
872                                 extractedEvents.write(line)
873                         event.close()
874                 elif eventList[i] == "thermostatSetpoint":
875                         event = open("eventSimulator/thermostatSetpointEvent.groovy", "r")
876                         for line in event:
877                                 extractedEvents.write(line)
878                         event.close()
879                         
880                 ###TODO: Add more events later
881                 extractedEvents.write("\n\t\t\tbreak\n")
882         extractedEvents.write("\t}\n")
883         extractedEvents.write("}\n")
884         
885 def CheckIfOnlyTouchEvents():
886         #Check and throw an error if it is all touch events
887         #This is called Direct-Direct interaction and we do not model-check for this case
888         onlyTouchEvents = True
889         for item in eventList:
890                 if item != "nfcTouch" and item != "app":
891                         onlyTouchEvents = False
892         if onlyTouchEvents is True and app1Subscribe is True and app2Subscribe is True:
893                 # Write error log file
894                 extractError = open("appCreationError.log", "w+")
895                 extractError.write("Direct-Direct Interaction detected: we are skipping this pair...\n")
896                 extractError.close()
897                 raise Exception("\n\nDirect-Direct Interaction detected: we are skipping this pair...\n\n")
898
899
900 #Extract objects to call functions from App1
901 F1 = open("Extractor/App1/App1.groovy", "r")
902 extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
903 ExtractFunctions(F1, "App1")
904 F1.close()
905
906 #Extract objects to call functions from App2
907 F2 = open("Extractor/App2/App2.groovy", "r")
908 extractedFunctionsApp2 = open("Extractor/App2/extractedFunctionsApp2.groovy", "w+")
909 ExtractFunctions(F2, "App2")
910 F2.close()
911
912 #Prepare eventSimulator file while parsing the App1 and App2 files
913 extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+")
914 CheckIfOnlyTouchEvents()
915 ExtractEvents(extractedEvents)
916 extractedEvents.close()
917
918 #Save the extracted methods and app1 in a same file to extract information
919 extractorFile = open("Extractor/extractorFile.groovy", "w+")
920 Extractor = open("Extractor/Extractor.groovy", "r")
921 F1 = open("Extractor/App1/App1.groovy", "r")
922
923 extractorFile.write("////////////////////\n")
924 extractorFile.write("@Field App\n")
925 extractorFile.write("App = \"App1\"")
926 extractorFile.write("\n")
927 for line in Extractor:
928         extractorFile.write(line)
929 extractorFile.write("\n\n")
930 for line in F1:
931         extractorFile.write(line)
932 extractorFile.close()
933 Extractor.close()
934 F1.close()
935 #Run the file to extract the objects
936 os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
937
938
939 #Save the extracted methods and app2 in a same file to extract information
940 extractorFile = open("Extractor/extractorFile.groovy", "w+")
941 Extractor = open("Extractor/Extractor.groovy", "r")
942 F2 = open("Extractor/App2/App2.groovy", "r")
943
944 extractorFile.write("////////////////////\n")
945 extractorFile.write("@Field App\n")
946 extractorFile.write("App = \"App2\"")
947 extractorFile.write("\n")
948 for line in Extractor:
949         extractorFile.write(line)
950 extractorFile.write("\n\n")
951 for line in F2:
952         extractorFile.write(line)
953 #Run the file to extract the objects
954 extractorFile.close()
955 Extractor.close()
956 F2.close()
957 os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
958
959