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