X-Git-Url: http://plrg.eecs.uci.edu/git/?p=smartthings-infrastructure.git;a=blobdiff_plain;f=Extractor%2FExtractorScript.py;h=65c5cd75c40e302c044d005d1d7cc24d49af58ad;hp=4e51bec6cbfef73996074c3b1e3dcd50abfe96cc;hb=60bbb288c0ac392ad729f6bf76261302c91d4040;hpb=b8c0c6eb635704be056e1e4f373620e2bb05b775 diff --git a/Extractor/ExtractorScript.py b/Extractor/ExtractorScript.py index 4e51bec..65c5cd7 100644 --- a/Extractor/ExtractorScript.py +++ b/Extractor/ExtractorScript.py @@ -4,6 +4,8 @@ ToReturn = "" eventMap = [] app1Capabilities = [] app2Capabilities = [] +app1Subscribe = False +app2Subscribe = False def GetToken(f): global readyToReturn @@ -37,14 +39,14 @@ def GetToken(f): def ExtractFunctions(F, appName): global eventMap + global app1Subscribe + global app2Subscribe Temp = GetToken(F) while (Temp != "EOF"): if (Temp == "def" or Temp == "private"): Temp = GetToken(F) - if (Temp == "def" or Temp == "private"): - Temp = GetToken(F) NameofFunc = Temp - if (GetToken(F) == "("): #We have a function to create object for + if (GetToken(F) != "="): #We have a function to create object for if (appName == "App1"): extractedFunctionsApp1.write("//Global Object for functions in subscribe method!\n") extractedFunctionsApp1.write("def %s = this.&" % NameofFunc) @@ -53,17 +55,17 @@ def ExtractFunctions(F, appName): extractedFunctionsApp2.write("//Global Object for functions in subscribe method!\n") extractedFunctionsApp2.write("def %s = this.&" % NameofFunc) extractedFunctionsApp2.write("%s\n" % NameofFunc) - + #Check subscribed events if (Temp == "subscribe"): - counter = 0 - while (counter < 5 and Temp != "\""): + if (appName == "App1"): + app1Subscribe = True + else: + app2Subscribe = True + while (Temp != "\"" and Temp != "app" and Temp != "location"): + Temp = GetToken(F) + if Temp == "\"": Temp = GetToken(F) - counter = counter + 1 - Temp = GetToken(F) - #If counter >= 5 that means it is not found, so it must be appTouch - if (counter >= 5): - Temp = "Touched" if Temp not in eventMap: eventMap.append(Temp) @@ -71,11 +73,12 @@ def ExtractFunctions(F, appName): AnalyzeCapabilities(Temp, appName) Temp = GetToken(F) - + #Warn if there is a potential for physical interaction AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities) AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities) + def AnalyzeCapabilities(Temp, appName): #Illuminance related @@ -116,149 +119,11 @@ def AnalyzePhysicalInteraction(app1Capab, app2Capab): def ExtractEvents(extractedEvents): global eventMap - extractedEvents.write("Random random = new Random(42)\n") - extractedEvents.write("counter = 1000\n") - extractedEvents.write("while(counter > 0) {\n") - extractedEvents.write("\tdef eventNumber = random.nextInt(%d)\n" % (len(eventMap) - 1)) - extractedEvents.write("\tswitch(eventNumber) {\n") - eventCounter = 0; - for i in range(len(eventMap)): - extractedEvents.write("\t\tcase %d:\n" % eventCounter) - if eventMap[i] == "lock": - event = open("eventSimulator/lockEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "unlock": - event = open("eventSimulator/unlockEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "contact.open": - event = open("eventSimulator/contactOpenEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "contact.closed": - event = open("eventSimulator/contactClosedEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "switch.on": - event = open("eventSimulator/switchOnEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "switch.off": - event = open("eventSimulator/switchOffEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "nfcTouch": - event = open("eventSimulator/nfcTouchEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "Touched": - event = open("eventSimulator/appTouchEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "button": - #Write two events subsequently - event = open("eventSimulator/buttonPushedEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) - event = open("eventSimulator/buttonHeldEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "presence": - #Write two events subsequently - event = open("eventSimulator/presencePresentEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) - event = open("eventSimulator/presenceLeftEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - elif eventMap[i] == "doorState": - #Write two events subsequently - event = open("eventSimulator/doorOpenEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) - event = open("eventSimulator/doorClosedEvent.groovy", "r") - for line in event: - extractedEvents.write(line) - event.close() - eventCounter = eventCounter + 1 - - ###TODO: Add more events later - extractedEvents.write("\n\t\t\tbreak\n") - extractedEvents.write("\t}\n") - extractedEvents.write("\tcounter--\n") - extractedEvents.write("}\n") - - -def AnalyzeCapabilities(Temp, appName): - #Illuminance related - if (Temp == "capability.switch" or - Temp == "capability.switchLevel" or - Temp == "capability.illuminanceMeasurement" or - #Motion related - Temp == "capability.motionSensor" or - #Water related - Temp == "capability.valve" or - Temp == "capability.waterSensor" or - #Sound related - Temp == "capability.musicPlayer" or - Temp == "capability.alarm" or - Temp == "capability.speechSynthesis" or - Temp == "capability.soundSensor"): - if (appName == "App1"): - app1Capabilities.append(Temp) - else: - app2Capabilities.append(Temp) - -def AnalyzePhysicalInteraction(app1Capab, app2Capab): - #Light - if ("capability.illuminanceMeasurement" in app1Capab) and ("capability.switch" in app2Capab or - "capability.switchLevel" in app2Capab): - print ("\nWARNING: Potential PHYSICAL CONFLICT (light) detected between App1 and App2!\n") - #Motion - if ("capability.motionSensor" in app1Capab): - print ("\nWARNING: Potential PHYSICAL CONFLICT (motion) detected between App1 and App2!\n") - #Water - if ("capability.waterSensor" in app1Capab) and ("capability.valve" in app2Capab or - "capability.switch" in app2Capab): - print ("\nWARNING: Potential PHYSICAL CONFLICT (water) detected between App1 and App2!\n") - #Sound - if ("capability.soundSensor" in app1Capab) and ("capability.musicPlayer" in app2Capab or - "capability.alarm" in app2Capab or "capability.speechSynthesis" in app2Capab): - print ("\nWARNING: Potential PHYSICAL CONFLICT (sound) detected between App1 and App2!\n") - -def ExtractEvents(extractedEvents): - global eventMap - extractedEvents.write("Random random = new Random(42)\n") - extractedEvents.write("counter = 1000\n") - extractedEvents.write("while(counter > 0) {\n") - extractedEvents.write("\tdef eventNumber = random.nextInt(%d)\n" % (len(eventMap) - 1)) + extractedEvents.write("while(true) {\n") + extractedEvents.write("\tdef eventNumber = Verify.getInt(0,%d)\n" % (len(eventMap) - 1)) extractedEvents.write("\tswitch(eventNumber) {\n") - eventCounter = 0; for i in range(len(eventMap)): - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\tcase %d:\n" % i) if eventMap[i] == "lock": event = open("eventSimulator/lockEvent.groovy", "r") for line in event: @@ -284,103 +149,105 @@ def ExtractEvents(extractedEvents): for line in event: extractedEvents.write(line) event.close() - elif eventMap[i] == "Touched": + elif eventMap[i] == "app": #Case for Touched event event = open("eventSimulator/appTouchEvent.groovy", "r") for line in event: extractedEvents.write(line) event.close() elif eventMap[i] == "button": #Write two events subsequently - event = open("eventSimulator/buttonPushedEvent.groovy", "r") + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/buttonPushedEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else {\n") event = open("eventSimulator/buttonHeldEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() + extractedEvents.write("\t\t\t}\n") elif eventMap[i] == "presence": #Write two events subsequently - event = open("eventSimulator/presencePresentEvent.groovy", "r") + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/presencePresentEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else {\n") event = open("eventSimulator/presenceLeftEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() + extractedEvents.write("\t\t\t}\n") elif eventMap[i] == "doorState": #Write two events subsequently - event = open("eventSimulator/doorOpenEvent.groovy", "r") + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/doorOpenEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else {\n") event = open("eventSimulator/doorClosedEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() + extractedEvents.write("\t\t\t}\n") elif eventMap[i] == "motion": #Write two events subsequently - event = open("eventSimulator/motionActiveEvent.groovy", "r") + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/motionActiveEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else {\n") event = open("eventSimulator/motionInactiveEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() + extractedEvents.write("\t\t\t}\n") elif eventMap[i] == "smoke": #Write three events subsequently - event = open("eventSimulator/smokeClearEvent.groovy", "r") + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/smokeClearEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else if (event == 1) {\n") event = open("eventSimulator/smokeDetectedEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else {\n") event = open("eventSimulator/smokeTestedEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() + extractedEvents.write("\t\t\t}\n") elif eventMap[i] == "carbonMonoxide": #Write three events subsequently - event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r") + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else if (event == 1) {\n") event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else {\n") event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() + extractedEvents.write("\t\t\t}\n") elif eventMap[i] == "battery": event = open("eventSimulator/batteryChargeEvent.groovy", "r") for line in event: @@ -388,78 +255,82 @@ def ExtractEvents(extractedEvents): event.close() elif eventMap[i] == "thermostatMode": #Write five events subsequently - event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r") + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,4)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/thermostatAutoModeEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else if (event == 1) {\n") event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else if (event == 2) {\n") event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else if (event == 3) {\n") event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else {\n") event = open("eventSimulator/thermostatOffModeEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() + extractedEvents.write("\t\t\t}\n") elif eventMap[i] == "switch": #Write two events subsequently - event = open("eventSimulator/switchOnEvent.groovy", "r") + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/switchOnEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else {\n") event = open("eventSimulator/switchOffEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - elif eventMap[i] == "Location": + extractedEvents.write("\t\t\t}\n") + elif eventMap[i] == "location": #Case for Location event #Write three events subsequently - event = open("eventSimulator/locationHomeEvent.groovy", "r") + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/locationHomeEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else if (event == 1) {\n") event = open("eventSimulator/locationAwayEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - extractedEvents.write("\t\t\tbreak\n") - eventCounter = eventCounter + 1 - extractedEvents.write("\t\tcase %d:\n" % eventCounter) + extractedEvents.write("\t\t\t} else {\n") event = open("eventSimulator/locationNightEvent.groovy", "r") for line in event: - extractedEvents.write(line) + extractedEvents.write("\t\t" + line) event.close() - eventCounter = eventCounter + 1 + extractedEvents.write("\t\t\t}\n") ###TODO: Add more events later - extractedEvents.write("\n\t\t\tbreak\n") + extractedEvents.write("\t\t\tbreak\n") extractedEvents.write("\t}\n") - extractedEvents.write("\tcounter--\n") + #extractedEvents.write("\tcounter--\n") extractedEvents.write("}\n") + +def CheckIfOnlyTouchEvents(): + #Check and throw an error if it is all touch events + #This is called Direct-Direct interaction and we do not model-check for this case + onlyTouchEvents = True + for item in eventMap: + if item != "nfcTouch" and item != "app": + onlyTouchEvents = False + if onlyTouchEvents is True and app1Subscribe is True and app2Subscribe is True: + raise Exception("\n\nDirect-Direct Interaction detected: we are skipping this pair...\n\n") #Extract objects to call functions from App1 F1 = open("Extractor/App1/App1.groovy", "r") @@ -475,6 +346,7 @@ F2.close() #Prepare eventSimulator file while parsing the App1 and App2 files extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+") +CheckIfOnlyTouchEvents() ExtractEvents(extractedEvents) extractedEvents.close()