X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=Extractor%2FExtractorScript.py;h=974afc453933e8c6f2dd0921524127d3465f4cfe;hb=c16421586f6281bce41fb42a22befbbb7d099745;hp=e2edcad4f22a8d81c585ffd1532c44171edcf826;hpb=b0f9044f8811563aae5895e537eafccc94e067ed;p=smartthings-infrastructure.git diff --git a/Extractor/ExtractorScript.py b/Extractor/ExtractorScript.py index e2edcad..974afc4 100644 --- a/Extractor/ExtractorScript.py +++ b/Extractor/ExtractorScript.py @@ -1,7 +1,13 @@ import os readyToReturn = 0 ToReturn = "" -eventMap = [] +eventList = [] +eventVarMap = {} +capabilityMap = {} +app1Capabilities = [] +app2Capabilities = [] +app1Subscribe = False +app2Subscribe = False def GetToken(f): global readyToReturn @@ -34,7 +40,9 @@ def GetToken(f): return "EOF" def ExtractFunctions(F, appName): - global eventMap + global eventList + global app1Subscribe + global app2Subscribe Temp = GetToken(F) while (Temp != "EOF"): if (Temp == "def" or Temp == "private"): @@ -49,115 +57,362 @@ 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 input capability + if (Temp == "input"): + Temp = GetToken(F) #Get '"' + variable = GetToken(F) + Temp = GetToken(F) #Get '"' + Temp = GetToken(F) #Get ',' + Temp = GetToken(F) #Get '"' + Temp = GetToken(F) #Get capability... + capability = Temp + capabilityMap[variable] = capability + + #Check subscribed events if (Temp == "subscribe"): - counter = 0 - while (counter < 5 and Temp != "\""): - Temp = GetToken(F) - counter = counter + 1 + if (appName == "App1"): + app1Subscribe = True + else: + app2Subscribe = True Temp = GetToken(F) - #If counter >= 5 that means it is not found, so it must be appTouch - if (counter >= 5): - Temp = "Touched" - eventMap.append(Temp) + variable = Temp + while (Temp != "\"" and Temp != "app" and Temp != "location"): + Temp = GetToken(F) + if Temp == "\"": + Temp = GetToken(F) + if Temp not in eventList: + eventList.append(Temp) + eventVarMap[Temp] = variable + + #Check and analyze capabilities for physical interaction + AnalyzeCapabilities(Temp, appName, F) + Temp = GetToken(F) + + #Warn if there is a potential for physical interaction + AnalyzePhysicalInteraction(app1Capabilities, app2Capabilities) + AnalyzePhysicalInteraction(app2Capabilities, app1Capabilities) + + +def AnalyzeCapabilities(Temp, appName, F): + #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) + if (Temp == "capability"): + Temp = GetToken(F) #Get '"' + Temp = GetToken(F) #Get 'Music' + Temp = Temp + GetToken(F) #Get 'Player' + if (Temp == "MusicPlayer"): + if (appName == "App1"): + app1Capabilities.append("capability.musicPlayer") + else: + app2Capabilities.append("capability.musicPlayer") + +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)) + global eventList + global eventVarMap + global capabilityMap + extractedEvents.write("while(true) {\n") + extractedEvents.write("\tdef eventNumber = Verify.getInt(0,%d)\n" % (len(eventList) - 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": + for i in range(len(eventList)): + extractedEvents.write("\t\tcase %d:\n" % i) + if eventList[i] == "lock": event = open("eventSimulator/lockEvent.groovy", "r") for line in event: extractedEvents.write(line) event.close() - elif eventMap[i] == "unlock": + elif eventList[i] == "unlock": event = open("eventSimulator/unlockEvent.groovy", "r") for line in event: extractedEvents.write(line) event.close() - elif eventMap[i] == "contact.open": + elif eventList[i] == "contact.open": event = open("eventSimulator/contactOpenEvent.groovy", "r") for line in event: extractedEvents.write(line) event.close() - elif eventMap[i] == "contact.closed": + elif eventList[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": + elif eventList[i] == "nfcTouch": event = open("eventSimulator/nfcTouchEvent.groovy", "r") for line in event: extractedEvents.write(line) event.close() - elif eventMap[i] == "Touched": + elif eventList[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": + elif eventList[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() - elif eventMap[i] == "presence": + extractedEvents.write("\t\t\t}\n") + elif eventList[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("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "doorState": + #Write two events subsequently + 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("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else {\n") + event = open("eventSimulator/doorClosedEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "motion": + #Write two events subsequently + 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("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else {\n") + event = open("eventSimulator/motionInactiveEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "smoke": + #Write three events subsequently + 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("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else if (event == 1) {\n") + event = open("eventSimulator/smokeDetectedEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else {\n") + event = open("eventSimulator/smokeTestedEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "carbonMonoxide": + #Check which capability + variable = eventVarMap[eventList[i]] + capability = capabilityMap[variable] + + #Write three events subsequently + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,2)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + if capability == "capability.smokeDetector": + event = open("eventSimulator/smokeCarbonMonoxideClearEvent.groovy", "r") + elif capability == "capability.carbonMonoxideDetector": + event = open("eventSimulator/carbonMonoxideClearEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else if (event == 1) {\n") + if capability == "capability.smokeDetector": + event = open("eventSimulator/smokeCarbonMonoxideDetectedEvent.groovy", "r") + elif capability == "capability.carbonMonoxideDetector": + event = open("eventSimulator/carbonMonoxideDetectedEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else {\n") + if capability == "capability.smokeDetector": + event = open("eventSimulator/smokeCarbonMonoxideTestedEvent.groovy", "r") + elif capability == "capability.carbonMonoxideDetector": + event = open("eventSimulator/carbonMonoxideTestedEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "battery": + event = open("eventSimulator/batteryChargeEvent.groovy", "r") for line in event: extractedEvents.write(line) event.close() - elif eventMap[i] == "doorState": + elif eventList[i] == "thermostatMode": + #Write five events subsequently + 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("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else if (event == 1) {\n") + event = open("eventSimulator/thermostatCoolModeEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else if (event == 2) {\n") + event = open("eventSimulator/thermostatEmergencyHeatModeEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else if (event == 3) {\n") + event = open("eventSimulator/thermostatHeatModeEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else {\n") + event = open("eventSimulator/thermostatOffModeEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "switch": #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/switchOnEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else {\n") + event = open("eventSimulator/switchOffEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "location": #Case for Location event + #Write three events subsequently + 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("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else if (event == 1) {\n") + event = open("eventSimulator/locationAwayEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else {\n") + event = open("eventSimulator/locationNightEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "acceleration": + #Write two events subsequently + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/accelerationActiveEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else {\n") + event = open("eventSimulator/accelerationInactiveEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "beacon": + #Write two events subsequently + extractedEvents.write("\t\t\tdef event = Verify.getInt(0,1)\n") + extractedEvents.write("\t\t\tif (event == 0) {\n") + event = open("eventSimulator/beaconPresenceEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t} else {\n") + event = open("eventSimulator/beaconLeftEvent.groovy", "r") + for line in event: + extractedEvents.write("\t\t" + line) + event.close() + extractedEvents.write("\t\t\t}\n") + elif eventList[i] == "color": + event = open("eventSimulator/colorChangeEvent.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") + elif eventList[i] == "hue": + event = open("eventSimulator/hueChangeEvent.groovy", "r") + for line in event: + extractedEvents.write(line) + event.close() + elif eventList[i] == "saturation": + event = open("eventSimulator/saturationChangeEvent.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\t\tbreak\n") extractedEvents.write("\t}\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 eventList: + 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") @@ -173,6 +428,7 @@ F2.close() #Prepare eventSimulator file while parsing the App1 and App2 files extractedEvents = open("eventSimulator/eventSimulator.groovy", "w+") +CheckIfOnlyTouchEvents() ExtractEvents(extractedEvents) extractedEvents.close() @@ -194,7 +450,7 @@ extractorFile.close() Extractor.close() F1.close() #Run the file to extract the objects -os.system("groovy Extractor/extractorFile.groovy") +os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy") #Save the extracted methods and app2 in a same file to extract information @@ -215,7 +471,7 @@ for line in F2: extractorFile.close() Extractor.close() F2.close() -os.system("groovy Extractor/extractorFile.groovy") +os.system("groovy -classpath lib/jpf.jar Extractor/extractorFile.groovy")