Commit #9: More classes + Extractor with Rahmadi's editions + Fixing some bugs
[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                 #Check subscribed events
57                 if (Temp == "subscribe"):
58                         counter = 0
59                         while (counter < 5 and Temp != "\""):
60                                 Temp = GetToken(F)
61                                 counter = counter + 1
62                         Temp = GetToken(F)
63                         #If counter >= 5 that means it is not found, so it must be appTouch
64                         if (counter >= 5):
65                                 Temp = "Touched"
66                         if Temp not in eventMap:
67                                 eventMap.append(Temp)
68
69                 #Check and analyze capabilities for physical interaction
70                 AnalyzeCapabilities(Temp, appName)
71
72                 Temp = GetToken(F)
73
74         #Warn if there is a potential for physical interaction
75         AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
76         AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
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] == "switch.on":
147                         event = open("eventSimulator/switchOnEvent.groovy", "r")
148                         for line in event:
149                                 extractedEvents.write(line)
150                         event.close()
151                 elif eventMap[i] == "switch.off":
152                         event = open("eventSimulator/switchOffEvent.groovy", "r")
153                         for line in event:
154                                 extractedEvents.write(line)
155                         event.close()
156                 elif eventMap[i] == "nfcTouch":
157                         event = open("eventSimulator/nfcTouchEvent.groovy", "r")
158                         for line in event:
159                                 extractedEvents.write(line)
160                         event.close()
161                 elif eventMap[i] == "Touched":
162                         event = open("eventSimulator/appTouchEvent.groovy", "r")
163                         for line in event:
164                                 extractedEvents.write(line)
165                         event.close()
166                 elif eventMap[i] == "button":
167                         #Write two events subsequently
168                         event = open("eventSimulator/buttonPushedEvent.groovy", "r")
169                         for line in event:
170                                 extractedEvents.write(line)
171                         event.close()
172                         extractedEvents.write("\t\t\tbreak\n")
173                         eventCounter = eventCounter + 1
174                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
175                         event = open("eventSimulator/buttonHeldEvent.groovy", "r")
176                         for line in event:
177                                 extractedEvents.write(line)
178                         event.close()
179                 elif eventMap[i] == "presence":
180                         #Write two events subsequently
181                         event = open("eventSimulator/presencePresentEvent.groovy", "r")
182                         for line in event:
183                                 extractedEvents.write(line)
184                         event.close()
185                         extractedEvents.write("\t\t\tbreak\n")
186                         eventCounter = eventCounter + 1
187                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
188                         event = open("eventSimulator/presenceLeftEvent.groovy", "r")
189                         for line in event:
190                                 extractedEvents.write(line)
191                         event.close()
192                 elif eventMap[i] == "doorState":
193                         #Write two events subsequently
194                         event = open("eventSimulator/doorOpenEvent.groovy", "r")
195                         for line in event:
196                                 extractedEvents.write(line)
197                         event.close()
198                         extractedEvents.write("\t\t\tbreak\n")
199                         eventCounter = eventCounter + 1
200                         extractedEvents.write("\t\tcase %d:\n" % eventCounter)
201                         event = open("eventSimulator/doorClosedEvent.groovy", "r")
202                         for line in event:
203                                 extractedEvents.write(line)
204                         event.close()
205                 eventCounter = eventCounter + 1
206
207                 ###TODO: Add more events later
208                 extractedEvents.write("\n\t\t\tbreak\n")
209         extractedEvents.write("\t}\n")
210         extractedEvents.write("\tcounter--\n")
211         extractedEvents.write("}\n")
212                 
213
214
215 #Extract objects to call functions from App1
216 F1 = open("Extractor/App1/App1.groovy", "r")
217 extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
218 ExtractFunctions(F1, "App1")
219 F1.close()
220
221 #Extract objects to call functions from App2
222 F2 = open("Extractor/App2/App2.groovy", "r")
223 extractedFunctionsApp2 = open("Extractor/App2/extractedFunctionsApp2.groovy", "w+")
224 ExtractFunctions(F2, "App2")
225 F2.close()
226
227
228 #Save the extracted methods and app1 in a same file to extract information
229 extractorFile = open("Extractor/extractorFile.groovy", "w+")
230 Extractor = open("Extractor/Extractor.groovy", "r")
231 F1 = open("Extractor/App1/App1.groovy", "r")
232
233 extractorFile.write("////////////////////\n")
234 extractorFile.write("@Field App\n")
235 extractorFile.write("App = \"App1\"")
236 extractorFile.write("\n")
237 for line in Extractor:
238         extractorFile.write(line)
239 extractorFile.write("\n\n")
240 for line in F1:
241         extractorFile.write(line)
242 extractorFile.close()
243 Extractor.close()
244 F1.close()
245 #Run the file to extract the objects
246 os.system("groovy Extractor/extractorFile.groovy")
247
248
249 #Save the extracted methods and app2 in a same file to extract information
250 extractorFile = open("Extractor/extractorFile.groovy", "w+")
251 Extractor = open("Extractor/Extractor.groovy", "r")
252 F2 = open("Extractor/App2/App2.groovy", "r")
253
254 extractorFile.write("////////////////////\n")
255 extractorFile.write("@Field App\n")
256 extractorFile.write("App = \"App2\"")
257 extractorFile.write("\n")
258 for line in Extractor:
259         extractorFile.write(line)
260 extractorFile.write("\n\n")
261 for line in F2:
262         extractorFile.write(line)
263 #Run the file to extract the objects
264 extractorFile.close()
265 Extractor.close()
266 F2.close()
267 os.system("groovy Extractor/extractorFile.groovy")
268
269
270
271