Exemple #1
0
class Location(Subject):
    def __init__(self, name, service, view, data, caller):
        Subject.__init__(self)

        self.observers = []
        self.name = name
        self.caller = caller
        self.temperature = Temperature(None)
        self.rainfall = Rainfall(None)
        self.timestamp = None
        self.datestamp = None

        self.serviceType = service
        self.viewType = view
        self.dataType = data

        self.client = None
        self.timer = None
        self.setupClient()

    def register(self, newObserver):
        self.observers.append(newObserver)

    def unregister(self, deleteObserver):
        self.observers.remove(deleteObserver)

    def notifyObservers(self):
        for observer in self.observers:
            observer.update(self.temperature.getTemperature(),
                            self.rainfall.getAmount(), self.datestamp,
                            self.timestamp)

    def setupClient(self):
        if self.serviceType == "MelbWeather2":
            # set up client and timer
            self.client = WebClientMelb()
            self.timer = UpdateTimer(300, self.updateData)

            # update data for the first time, then start the timer
            self.updateData()
            self.timer.start()
        elif self.serviceType == "WeatherTimeLapse":
            # set up client and timer
            incompatibleClient = WebClientTimeLapse()
            self.client = WebClientTimelapseAdapter(incompatibleClient)
            self.timer = UpdateTimer(2, self.updateData)

            # update data for the first time, then start the timer
            self.updateData()
            self.timer.start()
        else:
            print "Web Client Setup Error: web client name not found"

    """
    Updates data of the location's attributes from the WebClient
    """

    def updateData(self):
        locInfo = self.client.getWeatherData(self.name)
        self.setTemperature(locInfo[0])
        self.setRainfall(locInfo[1])
        self.setDatestamp(locInfo[2])
        self.setTimestamp(locInfo[3])
        self.notifyObservers()

    """
    Removes the location object from the location collection when a monitor is shut down
    """

    def removeLocation(self):
        self.caller.removeFromCollection(self)

    """
    Stops the timer by calling cancel()
    """

    def stopTimer(self):
        self.timer.cancel()

    """
    Getters
    """

    def getName(self):
        return self.name

    def getTemperature(self):
        return self.temperature.getTemperature()

    def getRainfall(self):
        return self.rainfall.getAmount()

    def getTimeStamp(self):
        return self.timestamp

    def getDateStamp(self):
        return self.datestamp

    """
    Setters
    """

    def setTemperature(self, newTemperature):
        self.temperature.setTemperature(newTemperature)

    def setRainfall(self, newAmount):
        self.rainfall.setAmount(newAmount)

    def setTimestamp(self, newTimestamp):
        self.timestamp = newTimestamp

    def setDatestamp(self, newDatestamp):
        self.datestamp = newDatestamp