11 Skip = ['\n', '\t', ' ']
12 Special = ["(", "\"", ":", ",", "{", "}", ")", "/", "*"]
38 def ExtractFunctions(F, appName):
41 while (Temp != "EOF"):
42 if (Temp == "def" or Temp == "private"):
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)
51 extractedFunctionsApp2.write("//Global Object for functions in subscribe method!\n")
52 extractedFunctionsApp2.write("def %s = this.&" % NameofFunc)
53 extractedFunctionsApp2.write("%s\n" % NameofFunc)
55 #Check subscribed events
56 if (Temp == "subscribe"):
57 while (Temp != "\"" and Temp != "app" and Temp != "location"):
61 if Temp not in eventMap:
64 #Check and analyze capabilities for physical interaction
65 AnalyzeCapabilities(Temp, appName)
69 #Warn if there is a potential for physical interaction
70 AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
71 AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
75 def AnalyzeCapabilities(Temp, appName):
77 if (Temp == "capability.switch" or
78 Temp == "capability.switchLevel" or
79 Temp == "capability.illuminanceMeasurement" or
81 Temp == "capability.motionSensor" or
83 Temp == "capability.valve" or
84 Temp == "capability.waterSensor" or
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)
93 app2Capabilities.append(Temp)
95 def AnalyzePhysicalInteraction(app1Capab, app2Capab):
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")
101 if ("capability.motionSensor" in app1Capab):
102 print ("\nWARNING: Potential PHYSICAL CONFLICT (motion) detected between App1 and App2!\n")
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")
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")
112 def ExtractEvents(extractedEvents):
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")
123 extractedEvents.write(line)
125 elif eventMap[i] == "unlock":
126 event = open("eventSimulator/unlockEvent.groovy", "r")
128 extractedEvents.write(line)
130 elif eventMap[i] == "contact.open":
131 event = open("eventSimulator/contactOpenEvent.groovy", "r")
133 extractedEvents.write(line)
135 elif eventMap[i] == "contact.closed":
136 event = open("eventSimulator/contactClosedEvent.groovy", "r")
138 extractedEvents.write(line)
140 elif eventMap[i] == "nfcTouch":
141 event = open("eventSimulator/nfcTouchEvent.groovy", "r")
143 extractedEvents.write(line)
145 elif eventMap[i] == "app": #Case for Touched event
146 event = open("eventSimulator/appTouchEvent.groovy", "r")
148 extractedEvents.write(line)
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")
156 extractedEvents.write("\t\t" + line)
158 extractedEvents.write("\t\t\t} else {\n")
159 event = open("eventSimulator/buttonHeldEvent.groovy", "r")
161 extractedEvents.write("\t\t" + line)
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")
170 extractedEvents.write("\t\t" + line)
172 extractedEvents.write("\t\t\t} else {\n")
173 event = open("eventSimulator/presenceLeftEvent.groovy", "r")
175 extractedEvents.write("\t\t" + line)
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")
184 extractedEvents.write("\t\t" + line)
186 extractedEvents.write("\t\t\t} else {\n")
187 event = open("eventSimulator/doorClosedEvent.groovy", "r")
189 extractedEvents.write("\t\t" + line)
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")
198 extractedEvents.write("\t\t" + line)
200 extractedEvents.write("\t\t\t} else {\n")
201 event = open("eventSimulator/motionInactiveEvent.groovy", "r")
203 extractedEvents.write("\t\t" + line)
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")
212 extractedEvents.write("\t\t" + line)
214 extractedEvents.write("\t\t\t} else if (event == 1) {\n")
215 event = open("eventSimulator/smokeDetectedEvent.groovy", "r")
217 extractedEvents.write("\t\t" + line)
219 extractedEvents.write("\t\t\t} else {\n")
220 event = open("eventSimulator/smokeTestedEvent.groovy", "r")
222 extractedEvents.write("\t\t" + line)
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")
231 extractedEvents.write("\t\t" + line)
233 extractedEvents.write("\t\t\t} else if (event == 1) {\n")
234 event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r")
236 extractedEvents.write("\t\t" + line)
238 extractedEvents.write("\t\t\t} else {\n")
239 event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r")
241 extractedEvents.write("\t\t" + line)
243 extractedEvents.write("\t\t\t}\n")
244 elif eventMap[i] == "battery":
245 event = open("eventSimulator/batteryChargeEvent.groovy", "r")
247 extractedEvents.write(line)
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")
255 extractedEvents.write("\t\t" + line)
257 extractedEvents.write("\t\t\t} else if (event == 1) {\n")
258 event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r")
260 extractedEvents.write("\t\t" + line)
262 extractedEvents.write("\t\t\t} else if (event == 2) {\n")
263 event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r")
265 extractedEvents.write("\t\t" + line)
267 extractedEvents.write("\t\t\t} else if (event == 3) {\n")
268 event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r")
270 extractedEvents.write("\t\t" + line)
272 extractedEvents.write("\t\t\t} else {\n")
273 event = open("eventSimulator/thermostatOffModeEvent.groovy", "r")
275 extractedEvents.write("\t\t" + line)
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")
284 extractedEvents.write("\t\t" + line)
286 extractedEvents.write("\t\t\t} else {\n")
287 event = open("eventSimulator/switchOffEvent.groovy", "r")
289 extractedEvents.write("\t\t" + line)
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")
298 extractedEvents.write("\t\t" + line)
300 extractedEvents.write("\t\t\t} else if (event == 1) {\n")
301 event = open("eventSimulator/locationAwayEvent.groovy", "r")
303 extractedEvents.write("\t\t" + line)
305 extractedEvents.write("\t\t\t} else {\n")
306 event = open("eventSimulator/locationNightEvent.groovy", "r")
308 extractedEvents.write("\t\t" + line)
310 extractedEvents.write("\t\t\t}\n")
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")
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")
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")
330 #Prepare eventSimulator file while parsing the App1 and App2 files
331 extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+")
332 ExtractEvents(extractedEvents)
333 extractedEvents.close()
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")
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")
348 extractorFile.write(line)
349 extractorFile.close()
352 #Run the file to extract the objects
353 os.system("groovy Extractor/extractorFile.groovy")
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")
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")
369 extractorFile.write(line)
370 #Run the file to extract the objects
371 extractorFile.close()
374 os.system("groovy Extractor/extractorFile.groovy")