15 Skip = ['\n', '\t', ' ']
16 Special = ["(", "\"", ":", ",", "{", "}", ")", "/", "*"]
42 def ExtractFunctions(F, appName):
47 while (Temp != "EOF"):
48 if (Temp == "def" or Temp == "private"):
50 if (Temp == "def" or Temp == "private"):
53 if (GetToken(F) == "("): #We have a function to create object for
54 if (appName == "App1"):
55 extractedFunctionsApp1.write("//Global Object for functions in subscribe method!\n")
56 extractedFunctionsApp1.write("def %s = this.&" % NameofFunc)
57 extractedFunctionsApp1.write("%s\n" % NameofFunc)
59 extractedFunctionsApp2.write("//Global Object for functions in subscribe method!\n")
60 extractedFunctionsApp2.write("def %s = this.&" % NameofFunc)
61 extractedFunctionsApp2.write("%s\n" % NameofFunc)
63 #Check input capability
65 Temp = GetToken(F) #Get '"'
66 variable = GetToken(F)
67 Temp = GetToken(F) #Get '"'
68 Temp = GetToken(F) #Get ','
69 Temp = GetToken(F) #Get '"'
70 Temp = GetToken(F) #Get capability...
72 capabilityMap[variable] = capability
74 #Check subscribed events
75 if (Temp == "subscribe"):
76 if (appName == "App1"):
84 while (Temp != "\"" and Temp != "app" and Temp != "location"):
88 if Temp not in eventList:
89 eventList.append(Temp)
90 eventVarMap[Temp] = variable
92 #Check and analyze capabilities for physical interaction
93 AnalyzeCapabilities(Temp, appName, F)
97 #Warn if there is a potential for physical interaction
98 AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities)
99 AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities)
102 def AnalyzeCapabilities(Temp, appName, F):
104 if (Temp == "capability.switch" or
105 Temp == "capability.switchLevel" or
106 Temp == "capability.illuminanceMeasurement" or
107 Temp == "capability.colorControl" or
109 Temp == "capability.motionSensor" or
110 Temp == "capability.accelerationSensor" or
112 Temp == "capability.valve" or
113 Temp == "capability.waterSensor" or
115 Temp == "capability.musicPlayer" or
116 Temp == "capability.alarm" or
117 Temp == "capability.speechSynthesis" or
118 Temp == "capability.soundSensor"):
119 if (appName == "App1"):
120 app1Capabilities.append(Temp)
122 app2Capabilities.append(Temp)
123 if (Temp == "capability"):
124 Temp = GetToken(F) #Get '"'
125 Temp = GetToken(F) #Get 'Music'
126 Temp = Temp + GetToken(F) #Get 'Player'
127 if (Temp == "MusicPlayer"):
128 if (appName == "App1"):
129 app1Capabilities.append("capability.musicPlayer")
131 app2Capabilities.append("capability.musicPlayer")
133 def AnalyzePhysicalInteraction(app1Capab, app2Capab):
135 if ("capability.illuminanceMeasurement" in app1Capab) and ("capability.switch" in app2Capab or
136 "capability.switchLevel" in app2Capab or "capability.colorControl" in app2Capab):
137 print ("\nWARNING: Potential PHYSICAL CONFLICT (light) detected between App1 and App2!\n")
139 # TODO: Technically this is not entirely precise since we need to be able to detect that the other app creates motion
140 if ("capability.motionSensor" in app1Capab) or ("capability.accelerationSensor" in app1Capab):
141 print ("\nWARNING: Potential PHYSICAL CONFLICT (motion) detected between App1 and App2!\n")
143 if ("capability.waterSensor" in app1Capab) and ("capability.valve" in app2Capab or
144 "capability.switch" in app2Capab):
145 print ("\nWARNING: Potential PHYSICAL CONFLICT (water) detected between App1 and App2!\n")
147 if ("capability.soundSensor" in app1Capab) and ("capability.musicPlayer" in app2Capab or
148 "capability.alarm" in app2Capab or "capability.speechSynthesis" in app2Capab):
149 print ("\nWARNING: Potential PHYSICAL CONFLICT (sound) detected between App1 and App2!\n")
151 def ExtractEvents(extractedEvents):
155 extractedEvents.write("while(true) {\n")
156 extractedEvents.write("\tdef eventNumber = Verify.getInt(0,%d)\n" % (len(eventList) - 1))
157 extractedEvents.write("\tswitch(eventNumber) {\n")
158 for i in range(len(eventList)):
159 extractedEvents.write("\t\tcase %d:\n" % i)
160 if eventList[i] == "lock":
161 event = open("eventSimulator/lockEvent.groovy", "r")
163 extractedEvents.write(line)
165 elif eventList[i] == "unlock":
166 event = open("eventSimulator/unlockEvent.groovy", "r")
168 extractedEvents.write(line)
170 elif eventList[i] == "contact.open":
171 event = open("eventSimulator/contactOpenEvent.groovy", "r")
173 extractedEvents.write(line)
175 elif eventList[i] == "contact.closed":
176 event = open("eventSimulator/contactClosedEvent.groovy", "r")
178 extractedEvents.write(line)
180 elif eventList[i] == "nfcTouch":
181 event = open("eventSimulator/nfcTouchEvent.groovy", "r")
183 extractedEvents.write(line)
185 elif eventList[i] == "app": #Case for Touched event
186 event = open("eventSimulator/appTouchEvent.groovy", "r")
188 extractedEvents.write(line)
190 elif eventList[i] == "button":
191 #Write two events subsequently
192 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
193 extractedEvents.write("\t\t\tif (event == 0) {\n")
194 event = open("eventSimulator/buttonPushedEvent.groovy", "r")
196 extractedEvents.write("\t\t" + line)
198 extractedEvents.write("\t\t\t} else {\n")
199 event = open("eventSimulator/buttonHeldEvent.groovy", "r")
201 extractedEvents.write("\t\t" + line)
203 extractedEvents.write("\t\t\t}\n")
204 elif eventList[i] == "presence":
205 #Write two events subsequently
206 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
207 extractedEvents.write("\t\t\tif (event == 0) {\n")
208 event = open("eventSimulator/presencePresentEvent.groovy", "r")
210 extractedEvents.write("\t\t" + line)
212 extractedEvents.write("\t\t\t} else {\n")
213 event = open("eventSimulator/presenceLeftEvent.groovy", "r")
215 extractedEvents.write("\t\t" + line)
217 extractedEvents.write("\t\t\t}\n")
218 elif eventList[i] == "doorState":
219 #Write two events subsequently
220 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
221 extractedEvents.write("\t\t\tif (event == 0) {\n")
222 event = open("eventSimulator/doorOpenEvent.groovy", "r")
224 extractedEvents.write("\t\t" + line)
226 extractedEvents.write("\t\t\t} else {\n")
227 event = open("eventSimulator/doorClosedEvent.groovy", "r")
229 extractedEvents.write("\t\t" + line)
231 extractedEvents.write("\t\t\t}\n")
232 elif eventList[i] == "motion":
233 #Write two events subsequently
234 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
235 extractedEvents.write("\t\t\tif (event == 0) {\n")
236 event = open("eventSimulator/motionActiveEvent.groovy", "r")
238 extractedEvents.write("\t\t" + line)
240 extractedEvents.write("\t\t\t} else {\n")
241 event = open("eventSimulator/motionInactiveEvent.groovy", "r")
243 extractedEvents.write("\t\t" + line)
245 extractedEvents.write("\t\t\t}\n")
246 elif eventList[i] == "smoke":
247 #Write three events subsequently
248 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
249 extractedEvents.write("\t\t\tif (event == 0) {\n")
250 event = open("eventSimulator/smokeClearEvent.groovy", "r")
252 extractedEvents.write("\t\t" + line)
254 extractedEvents.write("\t\t\t} else if (event == 1) {\n")
255 event = open("eventSimulator/smokeDetectedEvent.groovy", "r")
257 extractedEvents.write("\t\t" + line)
259 extractedEvents.write("\t\t\t} else {\n")
260 event = open("eventSimulator/smokeTestedEvent.groovy", "r")
262 extractedEvents.write("\t\t" + line)
264 extractedEvents.write("\t\t\t}\n")
265 elif eventList[i] == "carbonMonoxide":
266 #Check which capability
267 variable = eventVarMap[eventList[i]]
268 capability = capabilityMap[variable]
270 #Write three events subsequently
271 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
272 extractedEvents.write("\t\t\tif (event == 0) {\n")
273 if capability == "capability.smokeDetector":
274 event = open("eventSimulator/smokeCarbonMonoxideClearEvent.groovy", "r")
275 elif capability == "capability.carbonMonoxideDetector":
276 event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r")
278 extractedEvents.write("\t\t" + line)
280 extractedEvents.write("\t\t\t} else if (event == 1) {\n")
281 if capability == "capability.smokeDetector":
282 event = open("eventSimulator/smokeCarbonMonoxideDetectedEvent.groovy", "r")
283 elif capability == "capability.carbonMonoxideDetector":
284 event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r")
286 extractedEvents.write("\t\t" + line)
288 extractedEvents.write("\t\t\t} else {\n")
289 if capability == "capability.smokeDetector":
290 event = open("eventSimulator/smokeCarbonMonoxideTestedEvent.groovy", "r")
291 elif capability == "capability.carbonMonoxideDetector":
292 event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r")
294 extractedEvents.write("\t\t" + line)
296 extractedEvents.write("\t\t\t}\n")
297 elif eventList[i] == "battery":
298 event = open("eventSimulator/batteryChargeEvent.groovy", "r")
300 extractedEvents.write(line)
302 elif eventList[i] == "thermostatMode":
303 #Write five events subsequently
304 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n")
305 extractedEvents.write("\t\t\tif (event == 0) {\n")
306 event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r")
308 extractedEvents.write("\t\t" + line)
310 extractedEvents.write("\t\t\t} else if (event == 1) {\n")
311 event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r")
313 extractedEvents.write("\t\t" + line)
315 extractedEvents.write("\t\t\t} else if (event == 2) {\n")
316 event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r")
318 extractedEvents.write("\t\t" + line)
320 extractedEvents.write("\t\t\t} else if (event == 3) {\n")
321 event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r")
323 extractedEvents.write("\t\t" + line)
325 extractedEvents.write("\t\t\t} else {\n")
326 event = open("eventSimulator/thermostatOffModeEvent.groovy", "r")
328 extractedEvents.write("\t\t" + line)
330 extractedEvents.write("\t\t\t}\n")
331 elif eventList[i] == "switch":
332 #Write two events subsequently
333 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
334 extractedEvents.write("\t\t\tif (event == 0) {\n")
335 event = open("eventSimulator/switchOnEvent.groovy", "r")
337 extractedEvents.write("\t\t" + line)
339 extractedEvents.write("\t\t\t} else {\n")
340 event = open("eventSimulator/switchOffEvent.groovy", "r")
342 extractedEvents.write("\t\t" + line)
344 extractedEvents.write("\t\t\t}\n")
345 elif eventList[i] == "location": #Case for Location event
346 #Write three events subsequently
347 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n")
348 extractedEvents.write("\t\t\tif (event == 0) {\n")
349 event = open("eventSimulator/locationHomeEvent.groovy", "r")
351 extractedEvents.write("\t\t" + line)
353 extractedEvents.write("\t\t\t} else if (event == 1) {\n")
354 event = open("eventSimulator/locationAwayEvent.groovy", "r")
356 extractedEvents.write("\t\t" + line)
358 extractedEvents.write("\t\t\t} else {\n")
359 event = open("eventSimulator/locationNightEvent.groovy", "r")
361 extractedEvents.write("\t\t" + line)
363 extractedEvents.write("\t\t\t}\n")
364 elif eventList[i] == "acceleration":
365 #Write two events subsequently
366 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
367 extractedEvents.write("\t\t\tif (event == 0) {\n")
368 event = open("eventSimulator/accelerationActiveEvent.groovy", "r")
370 extractedEvents.write("\t\t" + line)
372 extractedEvents.write("\t\t\t} else {\n")
373 event = open("eventSimulator/accelerationInactiveEvent.groovy", "r")
375 extractedEvents.write("\t\t" + line)
377 extractedEvents.write("\t\t\t}\n")
378 elif eventList[i] == "beacon":
379 #Write two events subsequently
380 extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n")
381 extractedEvents.write("\t\t\tif (event == 0) {\n")
382 event = open("eventSimulator/beaconPresenceEvent.groovy", "r")
384 extractedEvents.write("\t\t" + line)
386 extractedEvents.write("\t\t\t} else {\n")
387 event = open("eventSimulator/beaconLeftEvent.groovy", "r")
389 extractedEvents.write("\t\t" + line)
391 extractedEvents.write("\t\t\t}\n")
392 elif eventList[i] == "color":
393 event = open("eventSimulator/colorChangeEvent.groovy", "r")
395 extractedEvents.write(line)
397 elif eventList[i] == "hue":
398 event = open("eventSimulator/hueChangeEvent.groovy", "r")
400 extractedEvents.write(line)
402 elif eventList[i] == "saturation":
403 event = open("eventSimulator/saturationChangeEvent.groovy", "r")
405 extractedEvents.write(line)
408 ###TODO: Add more events later
409 extractedEvents.write("\t\t\tbreak\n")
410 extractedEvents.write("\t}\n")
411 extractedEvents.write("}\n")
413 def CheckIfOnlyTouchEvents():
414 #Check and throw an error if it is all touch events
415 #This is called Direct-Direct interaction and we do not model-check for this case
416 onlyTouchEvents = True
417 for item in eventList:
418 if item != "nfcTouch" and item != "app":
419 onlyTouchEvents = False
420 if onlyTouchEvents is True and app1Subscribe is True and app2Subscribe is True:
421 raise Exception("\n\nDirect-Direct Interaction detected: we are skipping this pair...\n\n")
427 >>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c
428 #Extract objects to call functions from App1
429 F1 = open("Extractor/App1/App1.groovy", "r")
430 extractedFunctionsApp1 = open("Extractor/App1/extractedFunctionsApp1.groovy", "w+")
431 ExtractFunctions(F1, "App1")
434 #Extract objects to call functions from App2
435 F2 = open("Extractor/App2/App2.groovy", "r")
436 extractedFunctionsApp2 = open("Extractor/App2/extractedFunctionsApp2.groovy", "w+")
437 ExtractFunctions(F2, "App2")
440 #Prepare eventSimulator file while parsing the App1 and App2 files
441 extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+")
442 CheckIfOnlyTouchEvents()
443 ExtractEvents(extractedEvents)
444 extractedEvents.close()
446 #Save the extracted methods and app1 in a same file to extract information
447 extractorFile = open("Extractor/extractorFile.groovy", "w+")
448 Extractor = open("Extractor/Extractor.groovy", "r")
449 F1 = open("Extractor/App1/App1.groovy", "r")
451 extractorFile.write("////////////////////\n")
452 extractorFile.write("@Field App\n")
453 extractorFile.write("App = \"App1\"")
454 extractorFile.write("\n")
455 for line in Extractor:
456 extractorFile.write(line)
457 extractorFile.write("\n\n")
459 extractorFile.write(line)
460 extractorFile.close()
463 #Run the file to extract the objects
464 os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
467 #Save the extracted methods and app2 in a same file to extract information
468 extractorFile = open("Extractor/extractorFile.groovy", "w+")
469 Extractor = open("Extractor/Extractor.groovy", "r")
470 F2 = open("Extractor/App2/App2.groovy", "r")
472 extractorFile.write("////////////////////\n")
473 extractorFile.write("@Field App\n")
474 extractorFile.write("App = \"App2\"")
475 extractorFile.write("\n")
476 for line in Extractor:
477 extractorFile.write(line)
478 extractorFile.write("\n\n")
480 extractorFile.write(line)
481 #Run the file to extract the objects
482 extractorFile.close()
485 os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")
490 >>>>>>> e378d6a65b25030f8914dc97f04b81ddff351d9c