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