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)
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
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;
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
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)
def raiseFunction(self, event, data, sendid=None, type="internal"): e = Event(event, data, eventtype=type, sendid=sendid) e.origintype = None self.internalQueue.put(e)
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:
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)