Esempio n. 1
0
 def exitStates(self, enabledTransitions):
     statesToExit = OrderedSet()
     for t in enabledTransitions:
         if t.target:
             tstates = self.getTargetStates(t.target)
             if t.type == "internal" and isCompoundState(t.source) and all(map(lambda s: isDescendant(s,t.source), tstates)):
                 ancestor = t.source
             else:
                 ancestor = self.findLCA([t.source] + tstates)
             
             for s in self.configuration:
                 if isDescendant(s,ancestor):
                     statesToExit.add(s)
     
     for s in statesToExit:
         self.statesToInvoke.delete(s)
     
     statesToExit.sort(key=exitOrder)
     
     for s in statesToExit:
         for h in s.history:
             if h.type == "deep":
                 f = lambda s0: isAtomicState(s0) and isDescendant(s0,s)
             else:
                 f = lambda s0: s0.parent == s
             self.historyValue[h.id] = filter(f,self.configuration) #+ s.parent 
     for s in statesToExit:
         for content in s.onexit:
             self.executeContent(content)
         for inv in s.invoke:
             self.cancelInvoke(inv)
         self.configuration.delete(s)
Esempio n. 2
0
 def exitStates(self, enabledTransitions):
     statesToExit = OrderedSet()
     for t in enabledTransitions:
         if t.target:
             tstates = self.getTargetStates(t.target)
             if t.type == "internal" and isCompoundState(t.source) and all(map(lambda s: isDescendant(s,t.source), tstates)):
                 ancestor = t.source
             else:
                 ancestor = self.findLCA([t.source] + tstates)
             
             for s in self.configuration:
                 if isDescendant(s,ancestor):
                     statesToExit.add(s)
     
     for s in statesToExit:
         self.statesToInvoke.delete(s)
     
     statesToExit.sort(key=exitOrder)
     
     for s in statesToExit:
         for h in s.history:
             if h.type == "deep":
                 f = lambda s0: isAtomicState(s0) and isDescendant(s0,s)
             else:
                 f = lambda s0: s0.parent == s
             self.historyValue[h.id] = filter(f,self.configuration) #+ s.parent 
     for s in statesToExit:
         for content in s.onexit:
             self.executeContent(content)
         for inv in s.invoke:
             self.cancelInvoke(inv)
         self.configuration.delete(s)
Esempio n. 3
0
    def enterStates(self, enabledTransitions):
        statesToEnter = OrderedSet()
        statesForDefaultEntry = OrderedSet()
        for t in enabledTransitions:
            if t.target:
                tstates = self.getTargetStates(t.target)
                if t.type == "internal" and isCompoundState(t.source) and all(map(lambda s: isDescendant(s,t.source), tstates)):
                    ancestor = t.source
                else:
                    ancestor = self.findLCA([t.source] + tstates)
                for s in tstates:
                    self.addStatesToEnter(s,statesToEnter,statesForDefaultEntry)
                for s in tstates:
                    for anc in getProperAncestors(s,ancestor):
                        statesToEnter.add(anc)
                        if isParallelState(anc):
                            for child in getChildStates(anc):
                                if not any(map(lambda s: isDescendant(s,child), statesToEnter)):
                                    self.addStatesToEnter(child, statesToEnter,statesForDefaultEntry)

        statesToEnter.sort(key=enterOrder)
        for s in statesToEnter:
            self.statesToInvoke.add(s)
            self.configuration.add(s)
            if self.doc.binding == "late" and s.isFirstEntry:
                s.initDatamodel()
                s.isFirstEntry = False

            for content in s.onentry:
                self.executeContent(content)
            if s in statesForDefaultEntry:
                self.executeContent(s.initial)
            if isFinalState(s):
                parent = s.parent
                grandparent = parent.parent
                self.internalQueue.put(Event(["done", "state", parent.id], s.donedata()))
                if isParallelState(grandparent):
                    if all(map(self.isInFinalState, getChildStates(grandparent))):
                        self.internalQueue.put(Event(["done", "state", grandparent.id]))
        for s in self.configuration:
            if isFinalState(s) and isScxmlState(s.parent):
                self.running = False;
Esempio n. 4
0
    def enterStates(self, enabledTransitions):
        statesToEnter = OrderedSet()
        statesForDefaultEntry = OrderedSet()
        for t in enabledTransitions:
            if t.target:
                tstates = self.getTargetStates(t.target)
                if t.type == "internal" and isCompoundState(t.source) and all(map(lambda s: isDescendant(s,t.source), tstates)):
                    ancestor = t.source
                else:
                    ancestor = self.findLCA([t.source] + tstates)
                for s in tstates:
                    self.addStatesToEnter(s,statesToEnter,statesForDefaultEntry)
                for s in tstates:
                    for anc in getProperAncestors(s,ancestor):
                        statesToEnter.add(anc)
                        if isParallelState(anc):
                            for child in getChildStates(anc):
                                if not any(map(lambda s: isDescendant(s,child), statesToEnter)):
                                    self.addStatesToEnter(child, statesToEnter,statesForDefaultEntry)

        statesToEnter.sort(key=enterOrder)
        for s in statesToEnter:
            self.statesToInvoke.add(s)
            self.configuration.add(s)
            if self.doc.binding == "late" and s.isFirstEntry:
                s.initDatamodel()
                s.isFirstEntry = False

            for content in s.onentry:
                self.executeContent(content)
            if s in statesForDefaultEntry:
                self.executeContent(s.initial)
            if isFinalState(s):
                parent = s.parent
                grandparent = parent.parent
                self.internalQueue.put(Event(["done", "state", parent.id], s.donedata()))
                if isParallelState(grandparent):
                    if all(map(self.isInFinalState, getChildStates(grandparent))):
                        self.internalQueue.put(Event(["done", "state", grandparent.id]))
        for s in self.configuration:
            if isFinalState(s) and isScxmlState(s.parent):
                self.running = False;