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