b53afda9faa8099e68e6d6c06497b1e7c63de4ca
[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                         NameofFunc = Temp
45                         if (GetToken(F) != "="): #We have a function to create object for
46                                 if (appName == "App1"):
47                                         extractedFunctionsApp1.write("//Global Object for functions in subscribe method!\n")    
48                                         extractedFunctionsApp1.write("def %s = this.&" % NameofFunc)
49                                         extractedFunctionsApp1.write("%s\n" % NameofFunc)
50                                 else:
51                                         extractedFunctionsApp2.write("//Global Object for functions in subscribe method!\n")    
52                                         extractedFunctionsApp2.write("def %s = this.&" % NameofFunc)
53                                         extractedFunctionsApp2.write("%s\n" % NameofFunc)
54                 
55                 #Check subscribed events
56                 if (Temp == "subscribe"):
57                         counter = 0
58                         while (counter < 5 and Temp != "\""):
59                                 Temp = GetToken(F)
60                                 counter = counter + 1
61                         Temp = GetToken(F)
62                         #If counter >= 5 that means it is not found, so it must be appTouch
63                         if (counter >= 5):
64                                 Temp = "Touched"
65                         if Temp not in eventMap:
66                                 eventMap.append(Temp)
67
68                 #Check and analyze capabilities for physical interaction
69                 AnalyzeCapabilities(Temp, appName)
70
71                 Temp = GetToken(F)
72         
73         #Warn if there is a potential for physical interaction
74         AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
75         AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
76
77                 
78
79 def AnalyzeCapabilities(Temp, appName):
80                         #Illuminance related
81         if (Temp == "capability.switch" or
82                         Temp == "capability.switchLevel" or
83                         Temp == "capability.illuminanceMeasurement" or
84                         #Motion related
85                         Temp == "capability.motionSensor" or
86                         #Water related
87                         Temp == "capability.valve" or
88                         Temp == "capability.waterSensor" or
89                         #Sound related
90                         Temp == "capability.musicPlayer" or
91                         Temp == "capability.alarm" or
92                         Temp == "capability.speechSynthesis" or
93                         Temp == "capability.soundSensor"):
94                 if (appName == "App1"):
95                         app1Capabilities.append(Temp)
96                 else:
97                         app2Capabilities.append(Temp)
98                         
99 def AnalyzePhysicalInteraction(app1Capab, app2Capab):
100         #Light
101         if ("capability.illuminanceMeasurement" in app1Capab) and ("capability.switch" in app2Capab or 
102                         "capability.switchLevel" in app2Capab):
103                 print ("\nWARNING: Potential PHYSICAL CONFLICT (light) detected between App1 and App2!\n")
104         #Motion
105         if ("capability.motionSensor" in app1Capab):
106                 print ("\nWARNING: Potential PHYSICAL CONFLICT (motion) detected between App1 and App2!\n")             
107         #Water
108         if ("capability.waterSensor" in app1Capab) and ("capability.valve" in app2Capab or 
109                         "capability.switch" in app2Capab):
110                 print ("\nWARNING: Potential PHYSICAL CONFLICT (water) detected between App1 and App2!\n")
111         #Sound
112         if ("capability.soundSensor" in app1Capab) and ("capability.musicPlayer" in app2Capab or 
113                         "capability.alarm" in app2Capab or "capability.speechSynthesis" in app2Capab):
114                 print ("\nWARNING: Potential PHYSICAL CONFLICT (sound) detected between App1 and App2!\n")
115
116 def ExtractEvents(extractedEvents):
117         global eventMap
118         extractedEvents.write("Random random = new Random(42)\n")
119         extractedEvents.write("counter = 1000\n")
120         extractedEvents.write("while(counter > 0) {\n")
121         extractedEvents.write("\tdef eventNumber = random.nextInt(%d)\n" % (len(eventMap) - 1))
122         extractedEvents.write("\tswitch(eventNumber) {\n")
123         eventCounter = 0;
124         for i in range(len(eventMap)):
125                 extractedEvents.write("\t\tcase %d:\n" % eventCounter)
126                 if eventMap[i] == "lock":
127                         event = open("eventSimulator/lockEvent.groovy", "r")
128                         for line in event:
129                                 extractedEvents.write(line)
130                         event.close()
131                 elif eventMap[i] == "unlock":
132                         event = open("eventSimulator/unlockEvent.groovy", "r")
133                         for line in event:
134                                 extractedEvents.write(line)
135                         event.close()
136                 elif eventMap[i] == "contact.open":
137                         event = open("eventSimulator/contactOpenEvent.groovy", "r")
138                         for line in event:
139                                 extractedEvents.write(line)
140                         event.close()
141                 elif eventMap[i] == "contact.closed":
142                         event = open("eventSimulator/contactClosedEvent.groovy", "r")
143                         for line in event:
144                                 extractedEvents.write(line)
145                         event.close()
146                 elif eventMap[i] == "nfcTouch":
147                         event = open("eventSimulator/nfcTouchEvent.groovy", "r")
148                         for line in event:
149                                 extractedEvents.write(line)
150                         event.close()
151                 elif eventMap[i] == "Touched":
152                         event = open("eventSimulator/appTouchEvent.groovy", "r")
153                         for line in event:
154                                 extractedEvents.write(line)
155                         event.close()
156                 elif eventMap[i] == "button":
157                         #Write two events subsequently
158                         event = open("eventSimulator/buttonPushedEvent.groovy", "r")
159                         for line in event:
160                                 extractedEvents.write(line)
161                         event.close()
162                         extractedEvents.write("\t\t\tbreak\n")
163                         eventCounter = eventCounter + 1
164                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
165                         event = open("eventSimulator/buttonHeldEvent.groovy", "r")
166                         for line in event:
167                                 extractedEvents.write(line)
168                         event.close()
169                 elif eventMap[i] == "presence":
170                         #Write two events subsequently
171                         event = open("eventSimulator/presencePresentEvent.groovy", "r")
172                         for line in event:
173                                 extractedEvents.write(line)
174                         event.close()
175                         extractedEvents.write("\t\t\tbreak\n")
176                         eventCounter = eventCounter + 1
177                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
178                         event = open("eventSimulator/presenceLeftEvent.groovy", "r")
179                         for line in event:
180                                 extractedEvents.write(line)
181                         event.close()
182                 elif eventMap[i] == "doorState":
183                         #Write two events subsequently
184                         event = open("eventSimulator/doorOpenEvent.groovy", "r")
185                         for line in event:
186                                 extractedEvents.write(line)
187                         event.close()
188                         extractedEvents.write("\t\t\tbreak\n")
189                         eventCounter = eventCounter + 1
190                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
191                         event = open("eventSimulator/doorClosedEvent.groovy", "r")
192                         for line in event:
193                                 extractedEvents.write(line)
194                         event.close()
195                 elif eventMap[i] == "motion":
196                         #Write two events subsequently
197                         event = open("eventSimulator/motionActiveEvent.groovy", "r")
198                         for line in event:
199                                 extractedEvents.write(line)
200                         event.close()
201                         extractedEvents.write("\t\t\tbreak\n")
202                         eventCounter = eventCounter + 1
203                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
204                         event = open("eventSimulator/motionInactiveEvent.groovy", "r")
205                         for line in event:
206                                 extractedEvents.write(line)
207                         event.close()
208                 elif eventMap[i] == "smoke":
209                         #Write three events subsequently
210                         event = open("eventSimulator/smokeClearEvent.groovy", "r")
211                         for line in event:
212                                 extractedEvents.write(line)
213                         event.close()
214                         extractedEvents.write("\t\t\tbreak\n")
215                         eventCounter = eventCounter + 1
216                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
217                         event = open("eventSimulator/smokeDetectedEvent.groovy", "r")
218                         for line in event:
219                                 extractedEvents.write(line)
220                         event.close()
221                         extractedEvents.write("\t\t\tbreak\n")
222                         eventCounter = eventCounter + 1
223                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
224                         event = open("eventSimulator/smokeTestedEvent.groovy", "r")
225                         for line in event:
226                                 extractedEvents.write(line)
227                         event.close()
228                 elif eventMap[i] == "carbonMonoxide":
229                         #Write three events subsequently
230                         event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r")
231                         for line in event:
232                                 extractedEvents.write(line)
233                         event.close()
234                         extractedEvents.write("\t\t\tbreak\n")
235                         eventCounter = eventCounter + 1
236                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
237                         event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r")
238                         for line in event:
239                                 extractedEvents.write(line)
240                         event.close()
241                         extractedEvents.write("\t\t\tbreak\n")
242                         eventCounter = eventCounter + 1
243                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
244                         event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r")
245                         for line in event:
246                                 extractedEvents.write(line)
247                         event.close()
248                 elif eventMap[i] == "battery":
249                         event = open("eventSimulator/batteryChargeEvent.groovy", "r")
250                         for line in event:
251                                 extractedEvents.write(line)
252                         event.close()
253                 elif eventMap[i] == "thermostatMode":
254                         #Write five events subsequently
255                         event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r")
256                         for line in event:
257                                 extractedEvents.write(line)
258                         event.close()
259                         extractedEvents.write("\t\t\tbreak\n")
260                         eventCounter = eventCounter + 1
261                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
262                         event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r")
263                         for line in event:
264                                 extractedEvents.write(line)
265                         event.close()
266                         extractedEvents.write("\t\t\tbreak\n")
267                         eventCounter = eventCounter + 1
268                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
269                         event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r")
270                         for line in event:
271                                 extractedEvents.write(line)
272                         event.close()
273                         extractedEvents.write("\t\t\tbreak\n")
274                         eventCounter = eventCounter + 1
275                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
276                         event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r")
277                         for line in event:
278                                 extractedEvents.write(line)
279                         event.close()
280                         extractedEvents.write("\t\t\tbreak\n")
281                         eventCounter = eventCounter + 1
282                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
283                         event = open("eventSimulator/thermostatOffModeEvent.groovy", "r")
284                         for line in event:
285                                 extractedEvents.write(line)
286                         event.close()
287                 elif eventMap[i] == "switch":
288                         #Write two events subsequently
289                         event = open("eventSimulator/switchOnEvent.groovy", "r")
290                         for line in event:
291                                 extractedEvents.write(line)
292                         event.close()
293                         extractedEvents.write("\t\t\tbreak\n")
294                         eventCounter = eventCounter + 1
295                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
296                         event = open("eventSimulator/switchOffEvent.groovy", "r")
297                         for line in event:
298                                 extractedEvents.write(line)
299                         event.close()
300                 elif eventMap[i] == "Location":
301                         #Write three events subsequently
302                         event = open("eventSimulator/locationHomeEvent.groovy", "r")
303                         for line in event:
304                                 extractedEvents.write(line)
305                         event.close()
306                         extractedEvents.write("\t\t\tbreak\n")
307                         eventCounter = eventCounter + 1
308                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
309                         event = open("eventSimulator/locationAwayEvent.groovy", "r")
310                         for line in event:
311                                 extractedEvents.write(line)
312                         event.close()
313                         extractedEvents.write("\t\t\tbreak\n")
314                         eventCounter = eventCounter + 1
315                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
316                         event = open("eventSimulator/locationNightEvent.groovy", "r")
317                         for line in event:
318                                 extractedEvents.write(line)
319                         event.close()
320                 eventCounter = eventCounter + 1
321
322                 ###TODO: Add more events later
323                 extractedEvents.write("\n\t\t\tbreak\n")
324         extractedEvents.write("\t}\n")
325         extractedEvents.write("\tcounter--\n")
326         extractedEvents.write("}\n")
327                 
328 #Extract objects to call functions from App1
329 F1 = open("Extractor/App1/App1.groovy", "r")
330 extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
331 ExtractFunctions(F1, "App1")
332 F1.close()
333
334 #Extract objects to call functions from App2
335 F2 = open("Extractor/App2/App2.groovy", "r")
336 extractedFunctionsApp2 = open("Extractor/App2/extractedFunctionsApp2.groovy", "w+")
337 ExtractFunctions(F2, "App2")
338 F2.close()
339
340 #Prepare eventSimulator file while parsing the App1 and App2 files
341 extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+")
342 ExtractEvents(extractedEvents)
343 extractedEvents.close()
344
345 #Save the extracted methods and app1 in a same file to extract information
346 extractorFile = open("Extractor/extractorFile.groovy", "w+")
347 Extractor = open("Extractor/Extractor.groovy", "r")
348 F1 = open("Extractor/App1/App1.groovy", "r")
349
350 extractorFile.write("////////////////////\n")
351 extractorFile.write("@Field App\n")
352 extractorFile.write("App = \"App1\"")
353 extractorFile.write("\n")
354 for line in Extractor:
355         extractorFile.write(line)
356 extractorFile.write("\n\n")
357 for line in F1:
358         extractorFile.write(line)
359 extractorFile.close()
360 Extractor.close()
361 F1.close()
362 #Run the file to extract the objects
363 os.system("groovy Extractor/extractorFile.groovy")
364
365
366 #Save the extracted methods and app2 in a same file to extract information
367 extractorFile = open("Extractor/extractorFile.groovy", "w+")
368 Extractor = open("Extractor/Extractor.groovy", "r")
369 F2 = open("Extractor/App2/App2.groovy", "r")
370
371 extractorFile.write("////////////////////\n")
372 extractorFile.write("@Field App\n")
373 extractorFile.write("App = \"App2\"")
374 extractorFile.write("\n")
375 for line in Extractor:
376         extractorFile.write(line)
377 extractorFile.write("\n\n")
378 for line in F2:
379         extractorFile.write(line)
380 #Run the file to extract the objects
381 extractorFile.close()
382 Extractor.close()
383 F2.close()
384 os.system("groovy Extractor/extractorFile.groovy")
385
386
387
388