Fixing a bug with capabilityMap extraction.
[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                         print eventVarMap
231                         print capabilityMap
232                         variable = eventVarMap[eventList[i]]
233                         print "DEBUG: %s" % variable
234                         capability = capabilityMap[variable]
235                         #Write three events subsequently
236                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
237                         extractedEvents.write("\t\t\tif (event == 0) {\n")
238                         if capability == "capability.presenceSensor":
239                                 event = open("eventSimulator/presencePresentEvent.groovy", "r")
240                         elif capability == "capability.beacon":
241                                 event = open("eventSimulator/beaconPresentEvent.groovy", "r")
242                         for line in event:
243                                 extractedEvents.write("\t\t" + line)
244                         event.close()
245                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
246                         if capability == "capability.presenceSensor":
247                                 event = open("eventSimulator/presenceLeftEvent.groovy", "r")
248                         elif capability == "capability.beacon":
249                                 event = open("eventSimulator/beaconLeftEvent.groovy", "r")
250                         for line in event:
251                                 extractedEvents.write("\t\t" + line)
252                         event.close()
253                         extractedEvents.write("\t\t\t} else {\n")
254                         event = open("eventSimulator/presencePresencePresentEvent.groovy", "r")
255                         for line in event:
256                                 extractedEvents.write("\t\t" + line)
257                         event.close()
258                         extractedEvents.write("\t\t\t}\n")
259                 elif eventList[i] == "doorState":
260                         #Write two events subsequently
261                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
262                         extractedEvents.write("\t\t\tif (event == 0) {\n")
263                         event = open("eventSimulator/doorOpenEvent.groovy", "r")                        
264                         for line in event:
265                                 extractedEvents.write("\t\t" + line)
266                         event.close()
267                         extractedEvents.write("\t\t\t} else {\n")
268                         event = open("eventSimulator/doorClosedEvent.groovy", "r")
269                         for line in event:
270                                 extractedEvents.write("\t\t" + line)
271                         event.close()
272                         extractedEvents.write("\t\t\t}\n")
273                 elif eventList[i] == "motion":
274                         #Write two events subsequently
275                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
276                         extractedEvents.write("\t\t\tif (event == 0) {\n")
277                         event = open("eventSimulator/motionActiveEvent.groovy", "r")                    
278                         for line in event:
279                                 extractedEvents.write("\t\t" + line)
280                         event.close()
281                         extractedEvents.write("\t\t\t} else {\n")
282                         event = open("eventSimulator/motionInactiveEvent.groovy", "r")
283                         for line in event:
284                                 extractedEvents.write("\t\t" + line)
285                         event.close()
286                         extractedEvents.write("\t\t\t}\n")
287                 elif eventList[i] == "smoke":
288                         #Write three events subsequently
289                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
290                         extractedEvents.write("\t\t\tif (event == 0) {\n")
291                         event = open("eventSimulator/smokeClearEvent.groovy", "r")                      
292                         for line in event:
293                                 extractedEvents.write("\t\t" + line)
294                         event.close()
295                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
296                         event = open("eventSimulator/smokeDetectedEvent.groovy", "r")
297                         for line in event:
298                                 extractedEvents.write("\t\t" + line)
299                         event.close()
300                         extractedEvents.write("\t\t\t} else {\n")
301                         event = open("eventSimulator/smokeTestedEvent.groovy", "r")
302                         for line in event:
303                                 extractedEvents.write("\t\t" + line)
304                         event.close()
305                         extractedEvents.write("\t\t\t}\n")
306                 elif eventList[i] == "carbonMonoxide":
307                         #Check which capability
308                         variable = eventVarMap[eventList[i]]
309                         capability = capabilityMap[variable]
310                         #Write three events subsequently
311                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
312                         extractedEvents.write("\t\t\tif (event == 0) {\n")                      
313                         if capability == "capability.smokeDetector":
314                                 event = open("eventSimulator/smokeCarbonMonoxideClearEvent.groovy", "r")
315                         elif capability == "capability.carbonMonoxideDetector":
316                                 event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r")
317                         for line in event:
318                                 extractedEvents.write("\t\t" + line)
319                         event.close()
320                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
321                         if capability == "capability.smokeDetector":
322                                 event = open("eventSimulator/smokeCarbonMonoxideDetectedEvent.groovy", "r")
323                         elif capability == "capability.carbonMonoxideDetector":
324                                 event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r")
325                         for line in event:
326                                 extractedEvents.write("\t\t" + line)
327                         event.close()
328                         extractedEvents.write("\t\t\t} else {\n")
329                         if capability == "capability.smokeDetector":
330                                 event = open("eventSimulator/smokeCarbonMonoxideTestedEvent.groovy", "r")
331                         elif capability == "capability.carbonMonoxideDetector":
332                                 event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r")
333                         for line in event:
334                                 extractedEvents.write("\t\t" + line)
335                         event.close()
336                         extractedEvents.write("\t\t\t}\n")
337                 elif eventList[i] == "battery":
338                         #Check which capability
339                         variable = eventVarMap[eventList[i]]
340                         capability = capabilityMap[variable]
341                         if capability == "capability.smokeDetector":
342                                 event = open("eventSimulator/smokeDetectorBatteryEvent.groovy", "r")
343                         elif capability == "capability.battery":
344                                 event = open("eventSimulator/batteryBatteryEvent.groovy", "r")
345                         for line in event:
346                                 extractedEvents.write(line)
347                         event.close()
348                 elif eventList[i] == "thermostatMode":
349                         #Write five events subsequently
350                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
351                         extractedEvents.write("\t\t\tif (event == 0) {\n")
352                         event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r")                      
353                         for line in event:
354                                 extractedEvents.write("\t\t" + line)
355                         event.close()
356                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
357                         event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r")
358                         for line in event:
359                                 extractedEvents.write("\t\t" + line)
360                         event.close()
361                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
362                         event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r")
363                         for line in event:
364                                 extractedEvents.write("\t\t" + line)
365                         event.close()
366                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
367                         event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r")
368                         for line in event:
369                                 extractedEvents.write("\t\t" + line)
370                         event.close()
371                         extractedEvents.write("\t\t\t} else {\n")
372                         event = open("eventSimulator/thermostatOffModeEvent.groovy", "r")
373                         for line in event:
374                                 extractedEvents.write("\t\t" + line)
375                         event.close()
376                         extractedEvents.write("\t\t\t}\n")
377                 elif eventList[i] == "thermostatFanMode":
378                         #Write five events subsequently
379                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
380                         extractedEvents.write("\t\t\tif (event == 0) {\n")
381                         event = open("eventSimulator/thermostatAutoFanModeEvent.groovy", "r")                   
382                         for line in event:
383                                 extractedEvents.write("\t\t" + line)
384                         event.close()
385                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
386                         event = open("eventSimulator/thermostatFanCirculateFanModeEvent.groovy", "r")
387                         for line in event:
388                                 extractedEvents.write("\t\t" + line)
389                         event.close()
390                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
391                         event = open("eventSimulator/thermostatCirculateFanModeEvent.groovy", "r")
392                         for line in event:
393                                 extractedEvents.write("\t\t" + line)
394                         event.close()
395                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
396                         event = open("eventSimulator/thermostatFanOnFanModeEvent.groovy", "r")
397                         for line in event:
398                                 extractedEvents.write("\t\t" + line)
399                         event.close()
400                         extractedEvents.write("\t\t\t} else {\n")
401                         event = open("eventSimulator/thermostatOnFanModeEvent.groovy", "r")
402                         for line in event:
403                                 extractedEvents.write("\t\t" + line)
404                         event.close()
405                         extractedEvents.write("\t\t\t}\n")
406                 elif eventList[i] == "thermostatOperatingState":
407                         #Write five events subsequently
408                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
409                         extractedEvents.write("\t\t\tif (event == 0) {\n")
410                         event = open("eventSimulator/thermostatOperatingStateAutoEvent.groovy", "r")                    
411                         for line in event:
412                                 extractedEvents.write("\t\t" + line)
413                         event.close()
414                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
415                         event = open("eventSimulator/thermostatOperatingStateCoolEvent.groovy", "r")
416                         for line in event:
417                                 extractedEvents.write("\t\t" + line)
418                         event.close()
419                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
420                         event = open("eventSimulator/thermostatOperatingStateOffEvent.groovy", "r")
421                         for line in event:
422                                 extractedEvents.write("\t\t" + line)
423                         event.close()
424                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
425                         event = open("eventSimulator/thermostatOperatingStateEmergencyHeatEvent.groovy", "r")
426                         for line in event:
427                                 extractedEvents.write("\t\t" + line)
428                         event.close()
429                         extractedEvents.write("\t\t\t} else {\n")
430                         event = open("eventSimulator/thermostatOperatingStateHeatEvent.groovy", "r")
431                         for line in event:
432                                 extractedEvents.write("\t\t" + line)
433                         event.close()
434                         extractedEvents.write("\t\t\t}\n")
435                 elif eventList[i] == "switch":
436                         #Check which capability
437                         variable = eventVarMap[eventList[i]]
438                         capability = capabilityMap[variable]
439                         #Write two events subsequently
440                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
441                         extractedEvents.write("\t\t\tif (event == 0) {\n")
442                         if capability == "capability.switch":
443                                 event = open("eventSimulator/switchOnEvent.groovy", "r")
444                         elif capability == "capability.switchLevel":
445                                 event = open("eventSimulator/switchLevelOnEvent.groovy", "r")
446                         elif capability == "capability.relaySwitch":
447                                 event = open("eventSimulator/relaySwitchOnEvent.groovy", "r")
448                         for line in event:
449                                 extractedEvents.write("\t\t" + line)
450                         event.close()
451                         extractedEvents.write("\t\t\t} else {\n")
452                         if capability == "capability.switch":
453                                 event = open("eventSimulator/switchOffEvent.groovy", "r")
454                         elif capability == "capability.switchLevel":
455                                 event = open("eventSimulator/switchLevelOffEvent.groovy", "r")
456                         elif capability == "capability.relaySwitch":
457                                 event = open("eventSimulator/relaySwitchOffEvent.groovy", "r")
458                         for line in event:
459                                 extractedEvents.write("\t\t" + line)
460                         event.close()
461                         extractedEvents.write("\t\t\t}\n")
462                 elif eventList[i] == "location": #Case for Location event
463                         #Write three events subsequently
464                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
465                         extractedEvents.write("\t\t\tif (event == 0) {\n")
466                         event = open("eventSimulator/locationHomeEvent.groovy", "r")                    
467                         for line in event:
468                                 extractedEvents.write("\t\t" + line)
469                         event.close()
470                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
471                         event = open("eventSimulator/locationAwayEvent.groovy", "r")
472                         for line in event:
473                                 extractedEvents.write("\t\t" + line)
474                         event.close()
475                         extractedEvents.write("\t\t\t} else {\n")
476                         event = open("eventSimulator/locationNightEvent.groovy", "r")
477                         for line in event:
478                                 extractedEvents.write("\t\t" + line)
479                         event.close()
480                         extractedEvents.write("\t\t\t}\n")
481                 elif eventList[i] == "acceleration":
482                         #Write two events subsequently
483                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
484                         extractedEvents.write("\t\t\tif (event == 0) {\n")
485                         event = open("eventSimulator/accelerationActiveEvent.groovy", "r")                      
486                         for line in event:
487                                 extractedEvents.write("\t\t" + line)
488                         event.close()
489                         extractedEvents.write("\t\t\t} else {\n")
490                         event = open("eventSimulator/accelerationInactiveEvent.groovy", "r")
491                         for line in event:
492                                 extractedEvents.write("\t\t" + line)
493                         event.close()
494                         extractedEvents.write("\t\t\t}\n")
495                 elif eventList[i] == "sleeping":
496                         #Write two events subsequently
497                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
498                         extractedEvents.write("\t\t\tif (event == 0) {\n")
499                         event = open("eventSimulator/sleepSleepingEvent.groovy", "r")                   
500                         for line in event:
501                                 extractedEvents.write("\t\t" + line)
502                         event.close()
503                         extractedEvents.write("\t\t\t} else {\n")
504                         event = open("eventSimulator/sleepNotSleepingEvent.groovy", "r")
505                         for line in event:
506                                 extractedEvents.write("\t\t" + line)
507                         event.close()
508                         extractedEvents.write("\t\t\t}\n")
509                 elif eventList[i] == "goal":
510                         event = open("eventSimulator/stepGoalEvent.groovy", "r")
511                         for line in event:
512                                 extractedEvents.write(line)
513                         event.close()
514                 elif eventList[i] == "steps":
515                         event = open("eventSimulator/stepStepsEvent.groovy", "r")
516                         for line in event:
517                                 extractedEvents.write(line)
518                         event.close()
519                 elif eventList[i] == "color":
520                         event = open("eventSimulator/colorChangedEvent.groovy", "r")
521                         for line in event:
522                                 extractedEvents.write(line)
523                         event.close()
524                 elif eventList[i] == "hue":
525                         event = open("eventSimulator/hueChangedEvent.groovy", "r")
526                         for line in event:
527                                 extractedEvents.write(line)
528                         event.close()
529                 elif eventList[i] == "saturation":
530                         event = open("eventSimulator/saturationChangedEvent.groovy", "r")
531                         for line in event:
532                                 extractedEvents.write(line)
533                         event.close()
534                 elif eventList[i] == "energy":
535                         event = open("eventSimulator/energyMeterEvent.groovy", "r")
536                         for line in event:
537                                 extractedEvents.write(line)
538                         event.close()
539                 elif eventList[i] == "power":
540                         event = open("eventSimulator/powerMeterEvent.groovy", "r")
541                         for line in event:
542                                 extractedEvents.write(line)
543                         event.close()
544                 elif eventList[i] == "illuminance":
545                         event = open("eventSimulator/illuminanceMeasurementEvent.groovy", "r")
546                         for line in event:
547                                 extractedEvents.write(line)
548                         event.close()
549                 elif eventList[i] == "humidity":
550                         event = open("eventSimulator/humidityMeasurementEvent.groovy", "r")
551                         for line in event:
552                                 extractedEvents.write(line)
553                         event.close()
554                 elif eventList[i] == "alarm":
555                         #Write four events subsequently
556                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,3)\n")
557                         extractedEvents.write("\t\t\tif (event == 0) {\n")
558                         event = open("eventSimulator/alarmBothEvent.groovy", "r")                       
559                         for line in event:
560                                 extractedEvents.write("\t\t" + line)
561                         event.close()
562                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
563                         event = open("eventSimulator/alarmSirenEvent.groovy", "r")
564                         for line in event:
565                                 extractedEvents.write("\t\t" + line)
566                         event.close()
567                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
568                         event = open("eventSimulator/alarmStrobeEvent.groovy", "r")
569                         for line in event:
570                                 extractedEvents.write("\t\t" + line)
571                         event.close()
572                         extractedEvents.write("\t\t\t} else {\n")
573                         event = open("eventSimulator/alarmOffEvent.groovy", "r")
574                         for line in event:
575                                 extractedEvents.write("\t\t" + line)
576                         event.close()
577                         extractedEvents.write("\t\t\t}\n")
578                 elif eventList[i] == "contact":
579                         #Check which capability
580                         variable = eventVarMap[eventList[i]]
581                         capability = capabilityMap[variable]
582                         #Write two events subsequently
583                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
584                         extractedEvents.write("\t\t\tif (event == 0) {\n")
585                         if capability == "capability.contactSensor":
586                                 event = open("eventSimulator/contactDefaultClosedEvent.groovy", "r")
587                         elif capability == "capability.valve":
588                                 event = open("eventSimulator/valveClosedEvent.groovy", "r")
589                         for line in event:
590                                 extractedEvents.write("\t\t" + line)
591                         event.close()
592                         extractedEvents.write("\t\t\t} else {\n")
593                         if capability == "capability.contactSensor":
594                                 event = open("eventSimulator/contactDefaultOpenEvent.groovy", "r")
595                         elif capability == "capability.valve":
596                                 event = open("eventSimulator/valveOpenEvent.groovy", "r")
597                         for line in event:
598                                 extractedEvents.write("\t\t" + line)
599                         event.close()
600                         extractedEvents.write("\t\t\t}\n")
601                 elif eventList[i] == "status":
602                         #Write three events subsequently
603                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
604                         extractedEvents.write("\t\t\tif (event == 0) {\n")
605                         event = open("eventSimulator/musicPlayerPlayingEvent.groovy", "r")                      
606                         for line in event:
607                                 extractedEvents.write("\t\t" + line)
608                         event.close()
609                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
610                         event = open("eventSimulator/musicPlayerStoppedEvent.groovy", "r")
611                         for line in event:
612                                 extractedEvents.write("\t\t" + line)
613                         event.close()
614                         extractedEvents.write("\t\t\t} else {\n")
615                         event = open("eventSimulator/musicPlayerPausedEvent.groovy", "r")
616                         for line in event:
617                                 extractedEvents.write("\t\t" + line)
618                         event.close()
619                         extractedEvents.write("\t\t\t}\n")
620                 elif eventList[i] == "level":
621                         #Check which capability
622                         variable = eventVarMap[eventList[i]]
623                         capability = capabilityMap[variable]
624                         if capability == "capability.musicPlayer":
625                                 event = open("eventSimulator/musicPlayerLevelEvent.groovy", "r")
626                         elif capability == "capability.switchLevel":
627                                 event = open("eventSimulator/switchLevelEvent.groovy", "r")
628                         for line in event:
629                                 extractedEvents.write(line)
630                         event.close()
631                 elif eventList[i] == "trackDescription":
632                         event = open("eventSimulator/musicPlayerTrackDescriptionEvent.groovy", "r")
633                         for line in event:
634                                 extractedEvents.write(line)
635                         event.close()
636                 elif eventList[i] == "trackData":
637                         event = open("eventSimulator/musicPlayerTrackDataEvent.groovy", "r")
638                         for line in event:
639                                 extractedEvents.write(line)
640                         event.close()
641                 elif eventList[i] == "mute":
642                         #Write two events subsequently
643                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
644                         extractedEvents.write("\t\t\tif (event == 0) {\n")
645                         event = open("eventSimulator/musicPlayerUnmutedEvent.groovy", "r")                      
646                         for line in event:
647                                 extractedEvents.write("\t\t" + line)
648                         event.close()
649                         extractedEvents.write("\t\t\t} else {\n")
650                         event = open("eventSimulator/musicPlayerMutedEvent.groovy", "r")
651                         for line in event:
652                                 extractedEvents.write("\t\t" + line)
653                         event.close()
654                         extractedEvents.write("\t\t\t}\n")
655                 elif eventList[i] == "temperature":
656                         #Check which capability
657                         variable = eventVarMap[eventList[i]]
658                         capability = capabilityMap[variable]
659                         if capability == "capability.thermostat":
660                                 event = open("eventSimulator/temperatureEvent.groovy", "r")
661                         elif capability == "capability.temperatureMeasurement":
662                                 event = open("eventSimulator/temperatureMeasurementEvent.groovy", "r")
663                         for line in event:
664                                 extractedEvents.write(line)
665                         event.close()
666                 elif eventList[i] == "heatingSetpoint":
667                         event = open("eventSimulator/heatingSetpointEvent.groovy", "r")
668                         for line in event:
669                                 extractedEvents.write(line)
670                         event.close()
671                 elif eventList[i] == "coolingSetpoint":
672                         event = open("eventSimulator/coolingSetpointEvent.groovy", "r")
673                         for line in event:
674                                 extractedEvents.write(line)
675                         event.close()
676                 elif eventList[i] == "thermostatSetpoint":
677                         event = open("eventSimulator/thermostatSetpointEvent.groovy", "r")
678                         for line in event:
679                                 extractedEvents.write(line)
680                         event.close()
681                         
682                 ###TODO: Add more events later
683                 extractedEvents.write("\t\t\tbreak\n")
684         extractedEvents.write("\t}\n")
685         extractedEvents.write("}\n")
686         
687 def CheckIfOnlyTouchEvents():
688         #Check and throw an error if it is all touch events
689         #This is called Direct-Direct interaction and we do not model-check for this case
690         onlyTouchEvents = True
691         for item in eventList:
692                 if item != "nfcTouch" and item != "app":
693                         onlyTouchEvents = False
694         if onlyTouchEvents is True and app1Subscribe is True and app2Subscribe is True:
695                 # Write error log file
696                 extractError = open("appCreationError.log", "w+")
697                 extractError.write("Direct-Direct Interaction detected: we are skipping this pair...\n")
698                 extractError.close()
699                 raise Exception("\n\nDirect-Direct Interaction detected: we are skipping this pair...\n\n")
700
701
702 #Extract objects to call functions from App1
703 F1 = open("Extractor/App1/App1.groovy", "r")
704 extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
705 ExtractFunctions(F1, "App1")
706 F1.close()
707
708 #Extract objects to call functions from App2
709 F2 = open("Extractor/App2/App2.groovy", "r")
710 extractedFunctionsApp2 = open("Extractor/App2/extractedFunctionsApp2.groovy", "w+")
711 ExtractFunctions(F2, "App2")
712 F2.close()
713
714 #Prepare eventSimulator file while parsing the App1 and App2 files
715 extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+")
716 CheckIfOnlyTouchEvents()
717 ExtractEvents(extractedEvents)
718 extractedEvents.close()
719
720 #Save the extracted methods and app1 in a same file to extract information
721 extractorFile = open("Extractor/extractorFile.groovy", "w+")
722 Extractor = open("Extractor/Extractor.groovy", "r")
723 F1 = open("Extractor/App1/App1.groovy", "r")
724
725 extractorFile.write("////////////////////\n")
726 extractorFile.write("@Field App\n")
727 extractorFile.write("App = \"App1\"")
728 extractorFile.write("\n")
729 for line in Extractor:
730         extractorFile.write(line)
731 extractorFile.write("\n\n")
732 for line in F1:
733         extractorFile.write(line)
734 extractorFile.close()
735 Extractor.close()
736 F1.close()
737 #Run the file to extract the objects
738 os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
739
740
741 #Save the extracted methods and app2 in a same file to extract information
742 extractorFile = open("Extractor/extractorFile.groovy", "w+")
743 Extractor = open("Extractor/Extractor.groovy", "r")
744 F2 = open("Extractor/App2/App2.groovy", "r")
745
746 extractorFile.write("////////////////////\n")
747 extractorFile.write("@Field App\n")
748 extractorFile.write("App = \"App2\"")
749 extractorFile.write("\n")
750 for line in Extractor:
751         extractorFile.write(line)
752 extractorFile.write("\n\n")
753 for line in F2:
754         extractorFile.write(line)
755 #Run the file to extract the objects
756 extractorFile.close()
757 Extractor.close()
758 F2.close()
759 os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
760
761