Merge branch 'master' of ssh://plrg.eecs.uci.edu/home/git/smartthings-infrastructure
[smartthings-infrastructure.git] / Extractor / ExtractorScript.py
1 import os
2 readyToReturn = 0
3 ToReturn = ""
4 eventMap = []
5 app1Capabilities = []
6 app2Capabilities = []
7
8 def GetToken(f):
9         global readyToReturn
10         global ToReturn
11         Skip = ['\n', '\t', ' ']
12         Special = ["(", "\"", ":", ",", "{", "}", ")", "/", "*"]
13         S = ""
14         if (readyToReturn):
15                 readyToReturn = 0
16                 return ToReturn
17         ToReturn = ""
18         c = f.read(1)
19         while(True):
20                 if (c in Special):
21                         if (S != ""):
22                                 readyToReturn = 1
23                                 ToReturn = c
24                                 return S
25                         else:
26                                 return c
27                 elif (c in Skip):
28                         if (S != ""):
29                                 return S        
30                         else:
31                                 c = f.read(1)
32                                 continue
33                 S += c
34                 c = f.read(1)
35                 if not c:
36                         return "EOF"
37
38 def ExtractFunctions(F, appName):
39         global eventMap
40         Temp = GetToken(F)
41         while (Temp != "EOF"):
42                 if (Temp == "def" or Temp == "private"):
43                         Temp = GetToken(F)
44                         if (Temp == "def" or Temp == "private"):
45                                 Temp = GetToken(F)
46                         NameofFunc = Temp
47                         if (GetToken(F) == "("): #We have a function to create object for
48                                 if (appName == "App1"):
49                                         extractedFunctionsApp1.write("//Global Object for functions in subscribe method!\n")    
50                                         extractedFunctionsApp1.write("def %s = this.&" % NameofFunc)
51                                         extractedFunctionsApp1.write("%s\n" % NameofFunc)
52                                 else:
53                                         extractedFunctionsApp2.write("//Global Object for functions in subscribe method!\n")    
54                                         extractedFunctionsApp2.write("def %s = this.&" % NameofFunc)
55                                         extractedFunctionsApp2.write("%s\n" % NameofFunc)
56
57                 #Check subscribed events
58                 if (Temp == "subscribe"):
59                         counter = 0
60                         while (counter < 5 and Temp != "\""):
61                                 Temp = GetToken(F)
62                                 counter = counter + 1
63                         Temp = GetToken(F)
64                         #If counter >= 5 that means it is not found, so it must be appTouch
65                         if (counter >= 5):
66                                 Temp = "Touched"
67                         if Temp not in eventMap:
68                                 eventMap.append(Temp)
69
70                 #Check and analyze capabilities for physical interaction
71                 AnalyzeCapabilities(Temp, appName)
72
73                 Temp = GetToken(F)
74
75         #Warn if there is a potential for physical interaction
76         AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
77         AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
78
79
80 def AnalyzeCapabilities(Temp, appName):
81                         #Illuminance related
82         if (Temp == "capability.switch" or
83                         Temp == "capability.switchLevel" or
84                         Temp == "capability.illuminanceMeasurement" or
85                         #Motion related
86                         Temp == "capability.motionSensor" or
87                         #Water related
88                         Temp == "capability.valve" or
89                         Temp == "capability.waterSensor" or
90                         #Sound related
91                         Temp == "capability.musicPlayer" or
92                         Temp == "capability.alarm" or
93                         Temp == "capability.speechSynthesis" or
94                         Temp == "capability.soundSensor"):
95                 if (appName == "App1"):
96                         app1Capabilities.append(Temp)
97                 else:
98                         app2Capabilities.append(Temp)
99                         
100 def AnalyzePhysicalInteraction(app1Capab, app2Capab):
101         #Light
102         if ("capability.illuminanceMeasurement" in app1Capab) and ("capability.switch" in app2Capab or 
103                         "capability.switchLevel" in app2Capab):
104                 print ("\nWARNING: Potential PHYSICAL CONFLICT (light) detected between App1 and App2!\n")
105         #Motion
106         if ("capability.motionSensor" in app1Capab):
107                 print ("\nWARNING: Potential PHYSICAL CONFLICT (motion) detected between App1 and App2!\n")             
108         #Water
109         if ("capability.waterSensor" in app1Capab) and ("capability.valve" in app2Capab or 
110                         "capability.switch" in app2Capab):
111                 print ("\nWARNING: Potential PHYSICAL CONFLICT (water) detected between App1 and App2!\n")
112         #Sound
113         if ("capability.soundSensor" in app1Capab) and ("capability.musicPlayer" in app2Capab or 
114                         "capability.alarm" in app2Capab or "capability.speechSynthesis" in app2Capab):
115                 print ("\nWARNING: Potential PHYSICAL CONFLICT (sound) detected between App1 and App2!\n")
116
117 def ExtractEvents(extractedEvents):
118         global eventMap
119         extractedEvents.write("Random random = new Random(42)\n")
120         extractedEvents.write("counter = 1000\n")
121         extractedEvents.write("while(counter > 0) {\n")
122         extractedEvents.write("\tdef eventNumber = random.nextInt(%d)\n" % (len(eventMap) - 1))
123         extractedEvents.write("\tswitch(eventNumber) {\n")
124         eventCounter = 0;
125         for i in range(len(eventMap)):
126                 extractedEvents.write("\t\tcase %d:\n" % eventCounter)
127                 if eventMap[i] == "lock":
128                         event = open("eventSimulator/lockEvent.groovy", "r")
129                         for line in event:
130                                 extractedEvents.write(line)
131                         event.close()
132                 elif eventMap[i] == "unlock":
133                         event = open("eventSimulator/unlockEvent.groovy", "r")
134                         for line in event:
135                                 extractedEvents.write(line)
136                         event.close()
137                 elif eventMap[i] == "contact.open":
138                         event = open("eventSimulator/contactOpenEvent.groovy", "r")
139                         for line in event:
140                                 extractedEvents.write(line)
141                         event.close()
142                 elif eventMap[i] == "contact.closed":
143                         event = open("eventSimulator/contactClosedEvent.groovy", "r")
144                         for line in event:
145                                 extractedEvents.write(line)
146                         event.close()
147                 elif eventMap[i] == "switch.on":
148                         event = open("eventSimulator/switchOnEvent.groovy", "r")
149                         for line in event:
150                                 extractedEvents.write(line)
151                         event.close()
152                 elif eventMap[i] == "switch.off":
153                         event = open("eventSimulator/switchOffEvent.groovy", "r")
154                         for line in event:
155                                 extractedEvents.write(line)
156                         event.close()
157                 elif eventMap[i] == "nfcTouch":
158                         event = open("eventSimulator/nfcTouchEvent.groovy", "r")
159                         for line in event:
160                                 extractedEvents.write(line)
161                         event.close()
162                 elif eventMap[i] == "Touched":
163                         event = open("eventSimulator/appTouchEvent.groovy", "r")
164                         for line in event:
165                                 extractedEvents.write(line)
166                         event.close()
167                 elif eventMap[i] == "button":
168                         #Write two events subsequently
169                         event = open("eventSimulator/buttonPushedEvent.groovy", "r")
170                         for line in event:
171                                 extractedEvents.write(line)
172                         event.close()
173                         extractedEvents.write("\t\t\tbreak\n")
174                         eventCounter = eventCounter + 1
175                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
176                         event = open("eventSimulator/buttonHeldEvent.groovy", "r")
177                         for line in event:
178                                 extractedEvents.write(line)
179                         event.close()
180                 elif eventMap[i] == "presence":
181                         #Write two events subsequently
182                         event = open("eventSimulator/presencePresentEvent.groovy", "r")
183                         for line in event:
184                                 extractedEvents.write(line)
185                         event.close()
186                         extractedEvents.write("\t\t\tbreak\n")
187                         eventCounter = eventCounter + 1
188                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
189                         event = open("eventSimulator/presenceLeftEvent.groovy", "r")
190                         for line in event:
191                                 extractedEvents.write(line)
192                         event.close()
193                 elif eventMap[i] == "doorState":
194                         #Write two events subsequently
195                         event = open("eventSimulator/doorOpenEvent.groovy", "r")
196                         for line in event:
197                                 extractedEvents.write(line)
198                         event.close()
199                         extractedEvents.write("\t\t\tbreak\n")
200                         eventCounter = eventCounter + 1
201                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
202                         event = open("eventSimulator/doorClosedEvent.groovy", "r")
203                         for line in event:
204                                 extractedEvents.write(line)
205                         event.close()
206                 eventCounter = eventCounter + 1
207
208                 ###TODO: Add more events later
209                 extractedEvents.write("\n\t\t\tbreak\n")
210         extractedEvents.write("\t}\n")
211         extractedEvents.write("\tcounter--\n")
212         extractedEvents.write("}\n")
213
214
215 def AnalyzeCapabilities(Temp, appName):
216                         #Illuminance related
217         if (Temp == "capability.switch" or
218                         Temp == "capability.switchLevel" or
219                         Temp == "capability.illuminanceMeasurement" or
220                         #Motion related
221                         Temp == "capability.motionSensor" or
222                         #Water related
223                         Temp == "capability.valve" or
224                         Temp == "capability.waterSensor" or
225                         #Sound related
226                         Temp == "capability.musicPlayer" or
227                         Temp == "capability.alarm" or
228                         Temp == "capability.speechSynthesis" or
229                         Temp == "capability.soundSensor"):
230                 if (appName == "App1"):
231                         app1Capabilities.append(Temp)
232                 else:
233                         app2Capabilities.append(Temp)
234                         
235 def AnalyzePhysicalInteraction(app1Capab, app2Capab):
236         #Light
237         if ("capability.illuminanceMeasurement" in app1Capab) and ("capability.switch" in app2Capab or 
238                         "capability.switchLevel" in app2Capab):
239                 print ("\nWARNING: Potential PHYSICAL CONFLICT (light) detected between App1 and App2!\n")
240         #Motion
241         if ("capability.motionSensor" in app1Capab):
242                 print ("\nWARNING: Potential PHYSICAL CONFLICT (motion) detected between App1 and App2!\n")             
243         #Water
244         if ("capability.waterSensor" in app1Capab) and ("capability.valve" in app2Capab or 
245                         "capability.switch" in app2Capab):
246                 print ("\nWARNING: Potential PHYSICAL CONFLICT (water) detected between App1 and App2!\n")
247         #Sound
248         if ("capability.soundSensor" in app1Capab) and ("capability.musicPlayer" in app2Capab or 
249                         "capability.alarm" in app2Capab or "capability.speechSynthesis" in app2Capab):
250                 print ("\nWARNING: Potential PHYSICAL CONFLICT (sound) detected between App1 and App2!\n")
251
252 def ExtractEvents(extractedEvents):
253         global eventMap
254         extractedEvents.write("Random random = new Random(42)\n")
255         extractedEvents.write("counter = 1000\n")
256         extractedEvents.write("while(counter > 0) {\n")
257         extractedEvents.write("\tdef eventNumber = random.nextInt(%d)\n" % (len(eventMap) - 1))
258         extractedEvents.write("\tswitch(eventNumber) {\n")
259         eventCounter = 0;
260         for i in range(len(eventMap)):
261                 extractedEvents.write("\t\tcase %d:\n" % eventCounter)
262                 if eventMap[i] == "lock":
263                         event = open("eventSimulator/lockEvent.groovy", "r")
264                         for line in event:
265                                 extractedEvents.write(line)
266                         event.close()
267                 elif eventMap[i] == "unlock":
268                         event = open("eventSimulator/unlockEvent.groovy", "r")
269                         for line in event:
270                                 extractedEvents.write(line)
271                         event.close()
272                 elif eventMap[i] == "contact.open":
273                         event = open("eventSimulator/contactOpenEvent.groovy", "r")
274                         for line in event:
275                                 extractedEvents.write(line)
276                         event.close()
277                 elif eventMap[i] == "contact.closed":
278                         event = open("eventSimulator/contactClosedEvent.groovy", "r")
279                         for line in event:
280                                 extractedEvents.write(line)
281                         event.close()
282                 elif eventMap[i] == "nfcTouch":
283                         event = open("eventSimulator/nfcTouchEvent.groovy", "r")
284                         for line in event:
285                                 extractedEvents.write(line)
286                         event.close()
287                 elif eventMap[i] == "Touched":
288                         event = open("eventSimulator/appTouchEvent.groovy", "r")
289                         for line in event:
290                                 extractedEvents.write(line)
291                         event.close()
292                 elif eventMap[i] == "button":
293                         #Write two events subsequently
294                         event = open("eventSimulator/buttonPushedEvent.groovy", "r")
295                         for line in event:
296                                 extractedEvents.write(line)
297                         event.close()
298                         extractedEvents.write("\t\t\tbreak\n")
299                         eventCounter = eventCounter + 1
300                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
301                         event = open("eventSimulator/buttonHeldEvent.groovy", "r")
302                         for line in event:
303                                 extractedEvents.write(line)
304                         event.close()
305                 elif eventMap[i] == "presence":
306                         #Write two events subsequently
307                         event = open("eventSimulator/presencePresentEvent.groovy", "r")
308                         for line in event:
309                                 extractedEvents.write(line)
310                         event.close()
311                         extractedEvents.write("\t\t\tbreak\n")
312                         eventCounter = eventCounter + 1
313                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
314                         event = open("eventSimulator/presenceLeftEvent.groovy", "r")
315                         for line in event:
316                                 extractedEvents.write(line)
317                         event.close()
318                 elif eventMap[i] == "doorState":
319                         #Write two events subsequently
320                         event = open("eventSimulator/doorOpenEvent.groovy", "r")
321                         for line in event:
322                                 extractedEvents.write(line)
323                         event.close()
324                         extractedEvents.write("\t\t\tbreak\n")
325                         eventCounter = eventCounter + 1
326                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
327                         event = open("eventSimulator/doorClosedEvent.groovy", "r")
328                         for line in event:
329                                 extractedEvents.write(line)
330                         event.close()
331                 elif eventMap[i] == "motion":
332                         #Write two events subsequently
333                         event = open("eventSimulator/motionActiveEvent.groovy", "r")
334                         for line in event:
335                                 extractedEvents.write(line)
336                         event.close()
337                         extractedEvents.write("\t\t\tbreak\n")
338                         eventCounter = eventCounter + 1
339                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
340                         event = open("eventSimulator/motionInactiveEvent.groovy", "r")
341                         for line in event:
342                                 extractedEvents.write(line)
343                         event.close()
344                 elif eventMap[i] == "smoke":
345                         #Write three events subsequently
346                         event = open("eventSimulator/smokeClearEvent.groovy", "r")
347                         for line in event:
348                                 extractedEvents.write(line)
349                         event.close()
350                         extractedEvents.write("\t\t\tbreak\n")
351                         eventCounter = eventCounter + 1
352                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
353                         event = open("eventSimulator/smokeDetectedEvent.groovy", "r")
354                         for line in event:
355                                 extractedEvents.write(line)
356                         event.close()
357                         extractedEvents.write("\t\t\tbreak\n")
358                         eventCounter = eventCounter + 1
359                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
360                         event = open("eventSimulator/smokeTestedEvent.groovy", "r")
361                         for line in event:
362                                 extractedEvents.write(line)
363                         event.close()
364                 elif eventMap[i] == "carbonMonoxide":
365                         #Write three events subsequently
366                         event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r")
367                         for line in event:
368                                 extractedEvents.write(line)
369                         event.close()
370                         extractedEvents.write("\t\t\tbreak\n")
371                         eventCounter = eventCounter + 1
372                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
373                         event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r")
374                         for line in event:
375                                 extractedEvents.write(line)
376                         event.close()
377                         extractedEvents.write("\t\t\tbreak\n")
378                         eventCounter = eventCounter + 1
379                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
380                         event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r")
381                         for line in event:
382                                 extractedEvents.write(line)
383                         event.close()
384                 elif eventMap[i] == "battery":
385                         event = open("eventSimulator/batteryChargeEvent.groovy", "r")
386                         for line in event:
387                                 extractedEvents.write(line)
388                         event.close()
389                 elif eventMap[i] == "thermostatMode":
390                         #Write five events subsequently
391                         event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r")
392                         for line in event:
393                                 extractedEvents.write(line)
394                         event.close()
395                         extractedEvents.write("\t\t\tbreak\n")
396                         eventCounter = eventCounter + 1
397                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
398                         event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r")
399                         for line in event:
400                                 extractedEvents.write(line)
401                         event.close()
402                         extractedEvents.write("\t\t\tbreak\n")
403                         eventCounter = eventCounter + 1
404                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
405                         event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r")
406                         for line in event:
407                                 extractedEvents.write(line)
408                         event.close()
409                         extractedEvents.write("\t\t\tbreak\n")
410                         eventCounter = eventCounter + 1
411                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
412                         event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r")
413                         for line in event:
414                                 extractedEvents.write(line)
415                         event.close()
416                         extractedEvents.write("\t\t\tbreak\n")
417                         eventCounter = eventCounter + 1
418                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
419                         event = open("eventSimulator/thermostatOffModeEvent.groovy", "r")
420                         for line in event:
421                                 extractedEvents.write(line)
422                         event.close()
423                 elif eventMap[i] == "switch":
424                         #Write two events subsequently
425                         event = open("eventSimulator/switchOnEvent.groovy", "r")
426                         for line in event:
427                                 extractedEvents.write(line)
428                         event.close()
429                         extractedEvents.write("\t\t\tbreak\n")
430                         eventCounter = eventCounter + 1
431                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
432                         event = open("eventSimulator/switchOffEvent.groovy", "r")
433                         for line in event:
434                                 extractedEvents.write(line)
435                         event.close()
436                 elif eventMap[i] == "Location":
437                         #Write three events subsequently
438                         event = open("eventSimulator/locationHomeEvent.groovy", "r")
439                         for line in event:
440                                 extractedEvents.write(line)
441                         event.close()
442                         extractedEvents.write("\t\t\tbreak\n")
443                         eventCounter = eventCounter + 1
444                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
445                         event = open("eventSimulator/locationAwayEvent.groovy", "r")
446                         for line in event:
447                                 extractedEvents.write(line)
448                         event.close()
449                         extractedEvents.write("\t\t\tbreak\n")
450                         eventCounter = eventCounter + 1
451                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
452                         event = open("eventSimulator/locationNightEvent.groovy", "r")
453                         for line in event:
454                                 extractedEvents.write(line)
455                         event.close()
456                 eventCounter = eventCounter + 1
457
458                 ###TODO: Add more events later
459                 extractedEvents.write("\n\t\t\tbreak\n")
460         extractedEvents.write("\t}\n")
461         extractedEvents.write("\tcounter--\n")
462         extractedEvents.write("}\n")
463                 
464 #Extract objects to call functions from App1
465 F1 = open("Extractor/App1/App1.groovy", "r")
466 extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
467 ExtractFunctions(F1, "App1")
468 F1.close()
469
470 #Extract objects to call functions from App2
471 F2 = open("Extractor/App2/App2.groovy", "r")
472 extractedFunctionsApp2 = open("Extractor/App2/extractedFunctionsApp2.groovy", "w+")
473 ExtractFunctions(F2, "App2")
474 F2.close()
475
476 #Prepare eventSimulator file while parsing the App1 and App2 files
477 extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+")
478 ExtractEvents(extractedEvents)
479 extractedEvents.close()
480
481 #Save the extracted methods and app1 in a same file to extract information
482 extractorFile = open("Extractor/extractorFile.groovy", "w+")
483 Extractor = open("Extractor/Extractor.groovy", "r")
484 F1 = open("Extractor/App1/App1.groovy", "r")
485
486 extractorFile.write("////////////////////\n")
487 extractorFile.write("@Field App\n")
488 extractorFile.write("App = \"App1\"")
489 extractorFile.write("\n")
490 for line in Extractor:
491         extractorFile.write(line)
492 extractorFile.write("\n\n")
493 for line in F1:
494         extractorFile.write(line)
495 extractorFile.close()
496 Extractor.close()
497 F1.close()
498 #Run the file to extract the objects
499 os.system("groovy Extractor/extractorFile.groovy")
500
501
502 #Save the extracted methods and app2 in a same file to extract information
503 extractorFile = open("Extractor/extractorFile.groovy", "w+")
504 Extractor = open("Extractor/Extractor.groovy", "r")
505 F2 = open("Extractor/App2/App2.groovy", "r")
506
507 extractorFile.write("////////////////////\n")
508 extractorFile.write("@Field App\n")
509 extractorFile.write("App = \"App2\"")
510 extractorFile.write("\n")
511 for line in Extractor:
512         extractorFile.write(line)
513 extractorFile.write("\n\n")
514 for line in F2:
515         extractorFile.write(line)
516 #Run the file to extract the objects
517 extractorFile.close()
518 Extractor.close()
519 F2.close()
520 os.system("groovy Extractor/extractorFile.groovy")
521
522
523
524