Hardcoding options for enum.
[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("\tdef eventNumber = Verify.getInt(0,%d)\n" % (len(eventMap) - 1))
116         extractedEvents.write("\tswitch(eventNumber) {\n")
117         for i in range(len(eventMap)):
118                 extractedEvents.write("\t\tcase %d:\n" % i)
119                 if eventMap[i] == "lock":
120                         event = open("eventSimulator/lockEvent.groovy", "r")
121                         for line in event:
122                                 extractedEvents.write(line)
123                         event.close()
124                 elif eventMap[i] == "unlock":
125                         event = open("eventSimulator/unlockEvent.groovy", "r")
126                         for line in event:
127                                 extractedEvents.write(line)
128                         event.close()
129                 elif eventMap[i] == "contact.open":
130                         event = open("eventSimulator/contactOpenEvent.groovy", "r")
131                         for line in event:
132                                 extractedEvents.write(line)
133                         event.close()
134                 elif eventMap[i] == "contact.closed":
135                         event = open("eventSimulator/contactClosedEvent.groovy", "r")
136                         for line in event:
137                                 extractedEvents.write(line)
138                         event.close()
139                 elif eventMap[i] == "nfcTouch":
140                         event = open("eventSimulator/nfcTouchEvent.groovy", "r")
141                         for line in event:
142                                 extractedEvents.write(line)
143                         event.close()
144                 elif eventMap[i] == "app": #Case for Touched event
145                         event = open("eventSimulator/appTouchEvent.groovy", "r")
146                         for line in event:
147                                 extractedEvents.write(line)
148                         event.close()
149                 elif eventMap[i] == "button":
150                         #Write two events subsequently
151                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
152                         extractedEvents.write("\t\t\tif (event == 0) {\n")
153                         event = open("eventSimulator/buttonPushedEvent.groovy", "r")                    
154                         for line in event:
155                                 extractedEvents.write("\t\t" + line)
156                         event.close()
157                         extractedEvents.write("\t\t\t} else {\n")
158                         event = open("eventSimulator/buttonHeldEvent.groovy", "r")
159                         for line in event:
160                                 extractedEvents.write("\t\t" + line)
161                         event.close()
162                         extractedEvents.write("\t\t\t}\n")
163                 elif eventMap[i] == "presence":
164                         #Write two events subsequently
165                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
166                         extractedEvents.write("\t\t\tif (event == 0) {\n")
167                         event = open("eventSimulator/presencePresentEvent.groovy", "r")                 
168                         for line in event:
169                                 extractedEvents.write("\t\t" + line)
170                         event.close()
171                         extractedEvents.write("\t\t\t} else {\n")
172                         event = open("eventSimulator/presenceLeftEvent.groovy", "r")
173                         for line in event:
174                                 extractedEvents.write("\t\t" + line)
175                         event.close()
176                         extractedEvents.write("\t\t\t}\n")
177                 elif eventMap[i] == "doorState":
178                         #Write two events subsequently
179                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
180                         extractedEvents.write("\t\t\tif (event == 0) {\n")
181                         event = open("eventSimulator/doorOpenEvent.groovy", "r")                        
182                         for line in event:
183                                 extractedEvents.write("\t\t" + line)
184                         event.close()
185                         extractedEvents.write("\t\t\t} else {\n")
186                         event = open("eventSimulator/doorClosedEvent.groovy", "r")
187                         for line in event:
188                                 extractedEvents.write("\t\t" + line)
189                         event.close()
190                         extractedEvents.write("\t\t\t}\n")
191                 elif eventMap[i] == "motion":
192                         #Write two events subsequently
193                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
194                         extractedEvents.write("\t\t\tif (event == 0) {\n")
195                         event = open("eventSimulator/motionActiveEvent.groovy", "r")                    
196                         for line in event:
197                                 extractedEvents.write("\t\t" + line)
198                         event.close()
199                         extractedEvents.write("\t\t\t} else {\n")
200                         event = open("eventSimulator/motionInactiveEvent.groovy", "r")
201                         for line in event:
202                                 extractedEvents.write("\t\t" + line)
203                         event.close()
204                         extractedEvents.write("\t\t\t}\n")
205                 elif eventMap[i] == "smoke":
206                         #Write three events subsequently
207                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
208                         extractedEvents.write("\t\t\tif (event == 0) {\n")
209                         event = open("eventSimulator/smokeClearEvent.groovy", "r")                      
210                         for line in event:
211                                 extractedEvents.write("\t\t" + line)
212                         event.close()
213                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
214                         event = open("eventSimulator/smokeDetectedEvent.groovy", "r")
215                         for line in event:
216                                 extractedEvents.write("\t\t" + line)
217                         event.close()
218                         extractedEvents.write("\t\t\t} else {\n")
219                         event = open("eventSimulator/smokeTestedEvent.groovy", "r")
220                         for line in event:
221                                 extractedEvents.write("\t\t" + line)
222                         event.close()
223                         extractedEvents.write("\t\t\t}\n")
224                 elif eventMap[i] == "carbonMonoxide":
225                         #Write three events subsequently
226                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
227                         extractedEvents.write("\t\t\tif (event == 0) {\n")
228                         event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r")                     
229                         for line in event:
230                                 extractedEvents.write("\t\t" + line)
231                         event.close()
232                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
233                         event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r")
234                         for line in event:
235                                 extractedEvents.write("\t\t" + line)
236                         event.close()
237                         extractedEvents.write("\t\t\t} else {\n")
238                         event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r")
239                         for line in event:
240                                 extractedEvents.write("\t\t" + line)
241                         event.close()
242                         extractedEvents.write("\t\t\t}\n")
243                 elif eventMap[i] == "battery":
244                         event = open("eventSimulator/batteryChargeEvent.groovy", "r")
245                         for line in event:
246                                 extractedEvents.write(line)
247                         event.close()
248                 elif eventMap[i] == "thermostatMode":
249                         #Write five events subsequently
250                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
251                         extractedEvents.write("\t\t\tif (event == 0) {\n")
252                         event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r")                      
253                         for line in event:
254                                 extractedEvents.write("\t\t" + line)
255                         event.close()
256                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
257                         event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r")
258                         for line in event:
259                                 extractedEvents.write("\t\t" + line)
260                         event.close()
261                         extractedEvents.write("\t\t\t} else if (event == 2) {\n")
262                         event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r")
263                         for line in event:
264                                 extractedEvents.write("\t\t" + line)
265                         event.close()
266                         extractedEvents.write("\t\t\t} else if (event == 3) {\n")
267                         event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r")
268                         for line in event:
269                                 extractedEvents.write("\t\t" + line)
270                         event.close()
271                         extractedEvents.write("\t\t\t} else {\n")
272                         event = open("eventSimulator/thermostatOffModeEvent.groovy", "r")
273                         for line in event:
274                                 extractedEvents.write("\t\t" + line)
275                         event.close()
276                         extractedEvents.write("\t\t\t}\n")
277                 elif eventMap[i] == "switch":
278                         #Write two events subsequently
279                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
280                         extractedEvents.write("\t\t\tif (event == 0) {\n")
281                         event = open("eventSimulator/switchOnEvent.groovy", "r")                        
282                         for line in event:
283                                 extractedEvents.write("\t\t" + line)
284                         event.close()
285                         extractedEvents.write("\t\t\t} else {\n")
286                         event = open("eventSimulator/switchOffEvent.groovy", "r")
287                         for line in event:
288                                 extractedEvents.write("\t\t" + line)
289                         event.close()
290                         extractedEvents.write("\t\t\t}\n")
291                 elif eventMap[i] == "location": #Case for Location event
292                         #Write three events subsequently
293                         extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
294                         extractedEvents.write("\t\t\tif (event == 0) {\n")
295                         event = open("eventSimulator/locationHomeEvent.groovy", "r")                    
296                         for line in event:
297                                 extractedEvents.write("\t\t" + line)
298                         event.close()
299                         extractedEvents.write("\t\t\t} else if (event == 1) {\n")
300                         event = open("eventSimulator/locationAwayEvent.groovy", "r")
301                         for line in event:
302                                 extractedEvents.write("\t\t" + line)
303                         event.close()
304                         extractedEvents.write("\t\t\t} else {\n")
305                         event = open("eventSimulator/locationNightEvent.groovy", "r")
306                         for line in event:
307                                 extractedEvents.write("\t\t" + line)
308                         event.close()
309                         extractedEvents.write("\t\t\t}\n")
310
311                 ###TODO: Add more events later
312                 extractedEvents.write("\t\t\tbreak\n")
313         extractedEvents.write("\t}\n")
314         #extractedEvents.write("\tcounter--\n")
315         extractedEvents.write("}\n")
316                 
317 #Extract objects to call functions from App1
318 F1 = open("Extractor/App1/App1.groovy", "r")
319 extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
320 ExtractFunctions(F1, "App1")
321 F1.close()
322
323 #Extract objects to call functions from App2
324 F2 = open("Extractor/App2/App2.groovy", "r")
325 extractedFunctionsApp2 = open("Extractor/App2/extractedFunctionsApp2.groovy", "w+")
326 ExtractFunctions(F2, "App2")
327 F2.close()
328
329 #Prepare eventSimulator file while parsing the App1 and App2 files
330 extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+")
331 ExtractEvents(extractedEvents)
332 extractedEvents.close()
333
334 #Save the extracted methods and app1 in a same file to extract information
335 extractorFile = open("Extractor/extractorFile.groovy", "w+")
336 Extractor = open("Extractor/Extractor.groovy", "r")
337 F1 = open("Extractor/App1/App1.groovy", "r")
338
339 extractorFile.write("////////////////////\n")
340 extractorFile.write("@Field App\n")
341 extractorFile.write("App = \"App1\"")
342 extractorFile.write("\n")
343 for line in Extractor:
344         extractorFile.write(line)
345 extractorFile.write("\n\n")
346 for line in F1:
347         extractorFile.write(line)
348 extractorFile.close()
349 Extractor.close()
350 F1.close()
351 #Run the file to extract the objects
352 os.system("groovy Extractor/extractorFile.groovy")
353
354
355 #Save the extracted methods and app2 in a same file to extract information
356 extractorFile = open("Extractor/extractorFile.groovy", "w+")
357 Extractor = open("Extractor/Extractor.groovy", "r")
358 F2 = open("Extractor/App2/App2.groovy", "r")
359
360 extractorFile.write("////////////////////\n")
361 extractorFile.write("@Field App\n")
362 extractorFile.write("App = \"App2\"")
363 extractorFile.write("\n")
364 for line in Extractor:
365         extractorFile.write(line)
366 extractorFile.write("\n\n")
367 for line in F2:
368         extractorFile.write(line)
369 #Run the file to extract the objects
370 extractorFile.close()
371 Extractor.close()
372 F2.close()
373 os.system("groovy Extractor/extractorFile.groovy")
374
375
376
377