예제 #1
0
 def send(self, name, data={}, invokeid = None, toQueue = None, sendid=None):
     """Send an event to the statemachine 
     @param name: a dot delimited string, the event name
     @param data: the data associated with the event
     @param invokeid: if specified, the id of sending invoked process
     @param toQueue: if specified, the target queue on which to add the event
     
     """
     if isinstance(name, basestring): name = name.split(".")
     if not toQueue: toQueue = self.externalQueue
     evt = Event(name, data, invokeid, sendid=sendid)
     evt.origin = "#_scxml_" + self.dm.sessionid
     evt.origintype = ScxmlOriginType()
     #TODO: and for ecmascript?
     evt.language = "python"
     toQueue.put(evt)
예제 #2
0
def type_basichttp(session, data, sm, environ, raw=None):

    if "_scxmleventname" in data:
        evtname = data.pop("_scxmleventname")
        event = Event(evtname, data)
        event.origintype = "basichttp"
        event.origin = "unreachable"
    else:
        pth = filter(lambda x: bool(x), environ["PATH_INFO"].split("/")[3:])
        event = Event(["HTTP", environ['REQUEST_METHOD']] + pth, data=data)
        event.origintype = "basichttp"
        event.origin = "unreachable"

    event.raw = repr(environ) + "\n\n" + urllib.unquote(raw) + "\n"
    return event
예제 #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;
예제 #4
0
def type_basichttp(session, data, sm, environ, raw=None):
    
    if "_scxmleventname" in data:
        evtname = data.pop("_scxmleventname")
        event = Event(evtname, data)
        event.origintype = "basichttp"
        event.origin = "unreachable"
    else:
        pth = filter(lambda x: bool(x), environ["PATH_INFO"].split("/")[3:])
        event = Event(["HTTP", environ['REQUEST_METHOD']] + pth, data=data)
        event.origintype = "basichttp"
        event.origin = "unreachable"
        
        
    event.raw = repr(environ) + "\n\n" + urllib.unquote(raw) + "\n"
    return event
예제 #5
0
def type_basichttp(session, data, sm, environ):
#    if "_scxmleventstruct" in data:
#        event = Processor.fromxml(data["_scxmleventstruct"], "unknown")
    
    if "_scxmleventname" in data:
        evtname = data.pop("_scxmleventname")
        event = Event(evtname, data)
        event.origintype = "basichttp"
        event.origin = "unreachable"
    else:
        pth = filter(lambda x: bool(x), environ["PATH_INFO"].split("/")[3:])
        event = Event(["HTTP", environ['REQUEST_METHOD']] + pth, data=data)
        event.origintype = "basichttp"
        event.origin = "unreachable"
        
        
    event.raw = repr(environ) + "\n\n" + urllib.unquote(environ["wsgi.input"].read()) + "\n"
    return event
예제 #6
0
 def send(self, name, data=None, invokeid = None, toQueue = None, sendid=None, eventtype="platform", raw=None, language=None):
     """Send an event to the statemachine 
     @param name: a dot delimited string, the event name
     @param data: the data associated with the event
     @param invokeid: if specified, the id of sending invoked process
     @param toQueue: if specified, the target queue on which to add the event
     
     """
     if isinstance(name, basestring): name = name.split(".")
     if not toQueue: toQueue = self.externalQueue
     evt = Event(name, data, invokeid, sendid=sendid, eventtype=eventtype)
     evt.origin = "#_scxml_" + self.dm.sessionid
     evt.origintype = ScxmlOriginType() if not isinstance(self.dm, ECMAScriptDataModel) else "http://www.w3.org/TR/scxml/#SCXMLEventProcessor"
     evt.raw = raw
     #TODO: and for ecmascript?
     evt.language =  language
     toQueue.put(evt)
예제 #7
0
 def raiseFunction(self, event, data, sendid=None, type="internal"):
     e = Event(event, data, eventtype=type, sendid=sendid)
     e.origintype = None
     self.internalQueue.put(e)
예제 #8
0
 def raiseFunction(self, event, data, sendid=None, type="internal"):
     e = Event(event, data, eventtype=type, sendid=sendid)
     e.origintype = None
     self.internalQueue.put(e)
예제 #9
0
            elif self.datamodel == "xpath" and self.dm[
                    "$_ioprocessors/scxml/location/text()"][0].startswith(
                        "http://"):
                origin = self.dm["$_ioprocessors/scxml/location/text()"][0]

#            if hasattr(data, "update"):
#                data.update({"_scxmleventname" : ".".join(event),
#                             "_scxmleventstruct" : Processor.toxml(eventstr, target, data, origin, sendNode.get("id", ""))
#                             })
            sender = partial(getter.get_async, target, data)

        elif type == "x-pyscxml-soap":
            sender = partial(self.dm[target[1:]].send, event, data)
        elif type == "x-pyscxml-statemachine":
            try:
                evt_obj = Event(event, data)
                sender = partial(self.dm[target].send, evt_obj)
            except Exception:
                raise SendExecutionError(
                    "No StateMachine instance at datamodel location '%s'" %
                    target)

        elif type == "x-pyscxml-response":
            self.logger.debug("sending to _response")
            headers = data.pop("headers") if "headers" in data else {}

            #                if type == "scxml": headers["Content-Type"] = "text/xml"
            #            if headers.get("Content-Type", "/").split("/")[1] == "json":
            #                data = json.dumps(data)

            #            if type in scxmlSendType:
예제 #10
0
if __name__ == '__main__':
    import sys
    from eventprocessor import Event

    #    d = {
    #         "apa" : {"bepa" : 123, "cepa" : 34},
    #          "foo" : {"inner" : etree.fromstring("<elem/>")}
    #         }
    p = etree.Element("parent")
    d = {p: "123", "lol": 3}

    xpathData = etree.fromstring('''
    <books xmlns="">
          <book title="title1"/>
          <book title="title2"/>
        </books>
        ''',
                                 parser=xpathparser).xpath(".")
    print xpathData, Event("hello", data=xpathData).__dict__
    print etree.tostring(dictToXML(Event("hello", data=xpathData).__dict__,
                                   root="data",
                                   root_attrib={"id": "key"}),
                         pretty_print=True)
    sys.exit()
    #    e = Event("hello", data={"d1" : etree.fromstring("<elem/>")})
    e = Event("hello", data={"d1": 123})
    #    print e.__dict__
    print etree.tostring(dictToXML({"p1": "val"},
                                   root="data",
                                   root_attrib={"id": "key"}),
                         pretty_print=True)