Esempio n. 1
0
    def __init__(self, param):
        self.logger = logging.getLogger(__name__)

        # memento for state machine
        self.memento = Memento(param['memento'])
        self.memento.load()

        # prepare database
        self.spider = param['spider']
        self.assembler = param['assembler']
        self.feed_builder = param['feed_builder']
        self.database = Database()

        # all states are listed here
        self.state_map = {
            'InitialState' : InitialState(self),
            'LoadState' : LoadState(self),
            'SpiderState' : SpiderState(self),
            'AssemblerState' : AssemblerState(self),
            'DatabaseState' : DatabaseState(self),
            'FinalState' : FinalState(self),
        }

        # set transition table
        self.transition_table = param['transition_table'] 

        # set current state
        self.curr_state = 'InitialState'
Esempio n. 2
0
class StateMachine():
    def __init__(self, param):
        self.logger = logging.getLogger(__name__)

        # memento for state machine
        self.memento = Memento(param['memento'])
        self.memento.load()

        # prepare database
        self.spider = param['spider']
        self.assembler = param['assembler']
        self.feed_builder = param['feed_builder']
        self.database = Database()

        # all states are listed here
        self.state_map = {
            'InitialState' : InitialState(self),
            'LoadState' : LoadState(self),
            'SpiderState' : SpiderState(self),
            'AssemblerState' : AssemblerState(self),
            'DatabaseState' : DatabaseState(self),
            'FinalState' : FinalState(self),
        }

        # set transition table
        self.transition_table = param['transition_table'] 

        # set current state
        self.curr_state = 'InitialState'

    def run(self):
        while self.curr_state != 'FinalState':
            try:
                self.state_map[self.curr_state].run()
                self.curr_state = self.next() 
            except KeyboardInterrupt:
                self.state_map[self.curr_state].tear_down()
                raise

    def next(self):
        transition_value = self.get_value('transition_value', '')
        for entry in self.transition_table:
            state, next_state, expected_value = entry
            if (self.curr_state, transition_value) == (state, expected_value):
                return next_state
        self.logger.error('transition table is not completed')
        return 'FinalState'

    def get_value(self, key, default_value=None):
        memento_value = self.memento.get_value()
        if key in memento_value:
            return memento_value[key]
        else:
            return default_value

    def set_value(self, key, value):
        memento_value = self.memento.get_value()
        memento_value[key] = value

    def save_memento(self):
        self.memento.save()