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