Revision: 2248
Author: jpalanca
Date: Fri Nov 9 09:51:22 2012
Log: Version 2.1:
-JSON support for ACL Messages and Envelopes
-HTTP protocol can send both XML and JSON messages
-New unittests added: jsonTestCase and httpTestCase
-Some minor bugs fixed
-HTTP transport is now activated by default
-XMPPD server deals with max_sockets error
-AID, ACLMessage and Envelope classess can be marshalled in JSON (asJSON)
and unmarshalled from JSON (loadJSON)
http://code.google.com/p/spade2/source/detail?r=2248
Modified:
/trunk/configure.py
/trunk/runspade.py
/trunk/spade/ACLMessage.py
/trunk/spade/ACLParser.py
/trunk/spade/AID.py
/trunk/spade/Agent.py
/trunk/spade/Envelope.py
/trunk/spade/MTP.py
/trunk/spade/Platform.py
/trunk/spade/mtp/http.py
/trunk/spade/spade_backend.py
/trunk/spade/wui.py
/trunk/test/kbTestCase.py
/trunk/test/unittests_spade.xml
/trunk/test.py
=======================================
--- /trunk/configure.py Wed Aug 1 09:29:11 2012
+++ /trunk/configure.py Fri Nov 9 09:51:22 2012
@@ -87,9 +87,12 @@
# print "EXCEPTION GETTING MTPS: ", str(e)
# Fill the data
+ mtp_str = '''t\t\t<mtp
name="http">\n\t\t\t\t<instance>http</instance>\n'''
+ mtp_str = mtp_str + """\t\t\t\t<protocol>http</protocol>\n"""
+ mtp_str = mtp_str + """\t\t\t</mtp>\n\n"""
+ spadexml = spadexml.replace("#MTPS#", mtp_str)
# GUS: By default, no MTPs, thank you
- #spadexml = spadexml.replace("#MTPS#", mtp_str)
- spadexml = spadexml.replace("#MTPS#", "")
+ #spadexml = spadexml.replace("#MTPS#", "")
file = open("spade.xml", "w+")
file.write(spadexml)
=======================================
--- /trunk/runspade.py Wed Aug 1 09:29:11 2012
+++ /trunk/runspade.py Fri Nov 9 09:51:22 2012
@@ -18,7 +18,7 @@
from xmppd.xmppd import Server
__author__ = "Gustavo Aranda <
gus...@gmail.com> and Javier Palanca
<
jpal...@gmail.com>"
-__version__ = "2.0"
+__version__ = "2.1"
__copyright__ = "Copyright (C) 2006-2012"
__license__ = "LGPL"
=======================================
--- /trunk/spade/ACLMessage.py Wed Jul 14 06:10:54 2010
+++ /trunk/spade/ACLMessage.py Fri Nov 9 09:51:22 2012
@@ -5,9 +5,14 @@
import cPickle as pickle
#random.seed(time.time())
import content
-import ACLParser
+from ACLParser import ACLxmlParser
import xml
import uuid
+import json
+
+FIPA_ACL_REP_STRING = "fipa.acl.rep.string.std"
+FIPA_ACL_REP_JSON = "fipa.acl.rep.json.std"
+FIPA_ACL_REP_XML = "fipa.acl.rep.xml.std"
class ACLMessage:
"""
@@ -39,7 +44,7 @@
cid_base =
str("".join([string.ascii_letters[int(random.randint(0,len(string.ascii_letters)-1))]
for a in range(4)]))
cid_autocount = 0
- def __init__(self, performative=None):
+ def __init__(self, performative=None, jsonstring=None):
self._attrs = {}
#possible FIPA communicative acts
self.commacts = ['accept-proposal', 'agree', 'cancel', \
@@ -62,6 +67,8 @@
self.receivers = []
self.content = None
+ self._attrs["acl_representation"] = FIPA_ACL_REP_XML
+
"""
self.reply_to = []
self.reply_with = None
@@ -80,6 +87,8 @@
self._attrs['id'] = str(uuid.uuid4()).replace("-","")
#self.userDefProps = None
+
+ if jsonstring: self.loadJSON(jsonstring)
def reset(self):
"""
@@ -251,6 +260,15 @@
except:
return None
+ def setAclRepresentation(self,e):
+ self._attrs["acl_representation"] = str(e)
+
+ def getAclRepresentation(self):
+ try:
+ return str(self._attrs["acl_representation"])
+ except:
+ return None
+
def setOntology(self,e):
self._attrs["ontology"] = str(e)
@@ -324,7 +342,17 @@
def __str__(self):
- p = ACLParser.ACLxmlParser()
+ if self.getAclRepresentation() == FIPA_ACL_REP_JSON:
+ return self.asJSON()
+ elif self.getAclRepresentation() == FIPA_ACL_REP_STRING:
+ return self.asString()
+ elif self.getAclRepresentation() == FIPA_ACL_REP_XML:
+ return self.asXML()
+ else:
+ return self.asXML()
+
+ def asXML(self):
+ p = ACLxmlParser()
return p.encodeXML(self)
def asString(self):
@@ -394,11 +422,12 @@
"""
s = '<table class="servicesT" cellspacing="0">'
s += '<tr><td class="servHd">Performative</td><td
class="servBodL">'+self.getPerformative()+'</td></tr>'
- sndr = self.sender.asXML()
- sndr = sndr.replace(">", ">")
- sndr = sndr.replace("<", "<")
- sndr = sndr.replace('"', """)
- s += '<tr><td class="servHd">Sender</td><td
class="servBodL"><pre>'+sndr+'</pre></td></tr>'
+ if self.sender:
+ sndr = self.sender.asXML()
+ sndr = sndr.replace(">", ">")
+ sndr = sndr.replace("<", "<")
+ sndr = sndr.replace('"', """)
+ s += '<tr><td class="servHd">Sender</td><td
class="servBodL"><pre>'+sndr+'</pre></td></tr>'
recvs = ""
for r in self.receivers:
escaped = r.asXML()
@@ -439,3 +468,118 @@
s += '<tr><td class="servHd">Conversation ID</td><td
class="servBodL">'+str(self.getConversationId())+'</td></tr>'
s += '</table>'
return s
+
+
+ def asJSON(self):
+ """
+ returns a JSON version of the message
+ """
+ p = "{"
+
+ p+='"performative":"'+str(self.getPerformative())+'",'
+
+ if self.sender:
+ p+='"sender":' + self.sender.asJSON() + ","
+
+ if self.receivers:
+ p+='"receivers":['
+ for i in self.receivers:
+ p += i.asJSON()+","
+ if p[-1:]==",":
+ p = p[:-1]
+ p+="],"
+
+ if self.content:
+ p = p + '"content":"' + str(self.content) + '",'
+
+ if self.getReplyWith():
+ p = p + '"reply-with":"' + str(self.getReplyWith()) + '",'
+
+ if self.getReplyBy():
+ p = p+ '"reply-by":"' + self.getReplyBy() + '",'
+
+ if self.getInReplyTo():
+ p = p+ '"in-reply-to":"' + self.getInReplyTo() + '",'
+
+ if self.getReplyTo():
+ p = p+ '"reply-to":['
+ for i in self.getReplyTo():
+ p= p+ i.asJSON()+","
+ if p[-1:]==",":
+ p = p[:-1]
+ p+="],"
+
+ if self.getLanguage():
+ p = p+ '"language":"' + self.getLanguage() + '",'
+
+ if self.getEncoding():
+ p = p+ '"encoding":"' + self.getEncoding() + '",'
+
+ if self.getOntology():
+ p = p+ '"ontology":"' + self.getOntology() + '",'
+
+ if self.getProtocol():
+ p = p+ '"protocol":"' + self.getProtocol() + '",'
+
+ if self.getConversationId():
+ p = p+ '"conversation-id":"' + self.getConversationId() + '",'
+
+ if p[-1:]==",":
+ p = p[:-1]
+ p = p + "}"
+
+ return p
+
+
+ def loadJSON(self, jsonstring):
+ """
+ loads a JSON string in the message
+ """
+ p = json.loads(jsonstring)
+
+ if p.has_key("performative"): self.setPerformative(p["performative"])
+
+ if p.has_key("sender"):
+ s = AID.aid()
+ s.loadJSON(p["sender"])
+ self.setSender(s)
+
+ if p.has_key("receivers"):
+ for i in p["receivers"]:
+ s = AID.aid()
+ s.loadJSON(i)
+ self.addReceiver(s)
+
+ if p.has_key("content"):
+ self.setContent(p["content"])
+
+ if p.has_key("reply-with"):
+ self.setReplyWith(p["reply-with"])
+
+ if p.has_key("reply-by"):
+ self.setReplyBy(p["reply-by"])
+
+ if p.has_key("in-reply-to"):
+ self.setInReplyTo(p["in-reply-to"])
+
+ if p.has_key("reply-to"):
+ for i in p["reply-to"]:
+ s = AID.aid()
+ s.loadJSON(i)
+ self.addReplyTo(s)
+
+ if p.has_key("language"):
+ self.setLanguage(p["language"])
+
+ if p.has_key("encoding"):
+ self.setEncoding(p["encoding"])
+
+ if p.has_key("ontology"):
+ self.setOntology(p['ontology'])
+
+ if p.has_key("protocol"):
+ self.setProtocol(p['protocol'])
+
+ if p.has_key("conversation-id"):
+ self.setConversationId(p["conversation-id"])
+
=======================================
--- /trunk/spade/ACLParser.py Wed May 16 07:21:47 2007
+++ /trunk/spade/ACLParser.py Fri Nov 9 09:51:22 2012
@@ -1,7 +1,7 @@
# -*- coding: cp1252 -*-
from pyparsing import *
import sys
-from ACLMessage import *
+import ACLMessage
import AID
from BasicFipaDateTime import *
@@ -284,7 +284,7 @@
#print m.asXML()
#print m.asList()
- msg = ACLMessage()
+ msg = ACLMessage.ACLMessage()
if 'msgtype' in m:
msg.setPerformative(m['msgtype'])
@@ -373,7 +373,7 @@
"""
def startDocument(self):
- self.msg = ACLMessage()
+ self.msg = ACLMessage.ACLMessage()
def endDocument(self):
pass
=======================================
--- /trunk/spade/AID.py Fri Jul 30 06:42:53 2010
+++ /trunk/spade/AID.py Fri Nov 9 09:51:22 2012
@@ -213,6 +213,13 @@
co["properties"].append(p)
return co
+ def asJSON(self):
+ """
+ returns a version of an AID in JSON format
+ """
+ import json
+ return json.dumps(self.asContentObject())
+
def asXML(self):
"""
returns a printable version of an AID in XML
@@ -264,6 +271,23 @@
else: return -1
+ def loadJSON(self, content):
+ """
+ initialices an AID class using a JSON string
+ """
+
+ if content.has_key("name"):
+ self.setName(content["name"])
+ else:
+ return -1
+
+ if content.has_key("addresses"):
+ for addr in content["addresses"]:
+ self.addAddress(addr)
+
+ if content.has_key("resolvers"):
+ for res in content["resolvers"]:
+ self.addResolvers(res)
=======================================
--- /trunk/spade/Agent.py Tue Jul 31 06:58:54 2012
+++ /trunk/spade/Agent.py Fri Nov 9 09:51:22 2012
@@ -825,6 +825,8 @@
return
ACLmsg._attrs.update({"method":method})
+ if ACLmsg.getAclRepresentation()==None:
+ ACLmsg.setAclRepresentation(ACLMessage.FIPA_ACL_REP_XML)
# Check for the sender field!!! (mistake #1)
if not ACLmsg.getSender():
ACLmsg.setSender(self.getAID())
@@ -865,7 +867,7 @@
generate_envelope = False
#If there is more than one address in the sender or
#the only address is not an xmpp address,
- #we need the fill sender AID field
+ #we need the full sender AID field
try:
if method=="xmppfipa" or
len(ACLmsg.getSender().getAddresses()) > 1 or \
"xmpp" not in ACLmsg.getSender().getAddresses()[0]:
@@ -904,6 +906,7 @@
#Generate the envelope ONLY if it is needed
if generate_envelope:
+ envelope.setAclRepresentation(ACLmsg.getAclRepresentation())
xc = XMLCodec.XMLCodec()
envxml = xc.encodeXML(envelope)
xenv['content-type']='fipa.mts.env.rep.xml.std'
@@ -933,7 +936,7 @@
jabber_msg["from"]=self.getAID().getName()
jabber_msg.setBody(ACLmsg.getContent())
- if (not self._running and method=="auto") or method=="jabber":
+ if (not self._running and method=="auto") or method=="jabber"
or method=="xmppfipa":
self.jabber.send(jabber_msg)
continue
=======================================
--- /trunk/spade/Envelope.py Thu Jul 5 09:14:43 2007
+++ /trunk/spade/Envelope.py Fri Nov 9 09:51:22 2012
@@ -1,11 +1,12 @@
import types
import AID
+import json
class Envelope:
"""
FIPA envelope
"""
- def
__init__(self,to=None,_from=None,comments=None,aclRepresentation=None,payloadLength=None,payloadEncoding=None,date=None,encrypted=None,intendedReceiver=None,received=None,transportBehaviour=None,userDefinedProperties=None):
+ def
__init__(self,to=None,_from=None,comments=None,aclRepresentation=None,payloadLength=None,payloadEncoding=None,date=None,encrypted=None,intendedReceiver=None,received=None,transportBehaviour=None,userDefinedProperties=None,
jsonstring=None):
self.to = list()
if to != None:
@@ -57,6 +58,7 @@
else:
self.userDefinedProperties = list()
+ if jsonstring: self.loadJSON(jsonstring)
def getTo(self):
return
self.to
@@ -121,6 +123,9 @@
self.received = received
def __str__(self):
+ return self.asXML()
+
+ def asXML(self):
"""
returns a printable version of the envelope in XML
"""
@@ -150,7 +155,7 @@
if self.aclRepresentation:
r=r+ "\t\t\t\t<acl-representation>"+ self.aclRepresentation
+ "</acl-representation>\n"
if self.payloadLength:
-
r=r+ "\t\t\t\t<payload-length>"+self.payloadLength+"</payload-length>\n"
+
r=r+ "\t\t\t\t<payload-length>"+str(self.payloadLength)+"</payload-length>\n"
if self.payloadEncoding:
r=r+ "\t\t\t\t<payload-encoding>"+self.payloadEncoding+"</payload-encoding>\n"
if self.date:
@@ -180,3 +185,103 @@
r=r+"\t\t</envelope>\n"
return r
+
+
+ def asJSON(self):
+ """
+ returns a printable version of the envelope in JSON
+ """
+ r = "{"
+ r=r+'"to":['
+ for aid in
self.to:
+ r=r+'{'
+ r=r+'"name":"' + aid.getName() + '",'
+ r=r+'"addresses":['
+ for addr in aid.getAddresses():
+ r=r+ '"' + addr + '",'
+ if r[-1:]==",": r = r[:-1]
+ r=r+"]"
+ r=r+"},"
+ if r[-1:]==",": r = r[:-1]
+ r=r+"],"
+ if self._from:
+ r=r+'"from":{'
+ r=r+'"name":"' + self._from.getName() + '",'
+ r=r+'"addresses":['
+ for addr in self._from.getAddresses():
+ r=r+ '"' + addr + '",'
+ if r[-1:]==",": r = r[:-1]
+ r=r+"]},"
+ if self.aclRepresentation:
+ r=r+ '"acl-representation":"'+ self.aclRepresentation + '",'
+ if self.payloadLength:
+ r=r+ '"payload-length":"'+str(self.payloadLength)+'",'
+ if self.payloadEncoding:
+ r=r+ '"payload-encoding":"'+self.payloadEncoding+'",'
+ if self.date:
+ r=r+ '"date":"'+str(self.date)+'",'
+ if self.intendedReceiver:
+ r=r+ '"intended-receiver":['
+ for aid in self.intendedReceiver:
+ r=r+"{"
+ r=r+'"name":"' + aid.getName() + '",'
+ r=r+'"addresses":['
+ for addr in aid.getAddresses():
+ r=r+ '"' + addr + '",'
+ if r[-1:]==",": r = r[:-1]
+ r=r+"],"
+ if r[-1:]==",": r = r[:-1]
+ r=r+"},"
+ if r[-1:]==",": r = r[:-1]
+ r=r+"],"
+ if self.received:
+ r=r+ '"received":{'
+ if self.received.getBy():
+ r=r+ '"received-by":"'+self.received.getBy() +'",'
+ if self.received.getDate():
+ r=r+ '"received-date":"'+ str(self.received.getDate())
+'",'
+ if self.received.getId():
+ r=r+ '"received-id":"'+ self.received.getId() +'"'
+ if r[-1:]==",": r = r[:-1]
+ r=r+ "}"
+
+ if r[-1:]==",": r = r[:-1]
+ r=r+"}"
+
+ return r
+
+ def loadJSON(self, jsonstring):
+ """
+ loads a JSON string in the envelope
+ """
+ r = json.loads(jsonstring)
+
+ if r.has_key("to"):
+ for a in r["to"]:
+ aid = AID.aid()
+ aid.setName(a["name"])
+ for addr in a["addresses"]:
+ aid.addAddress(addr)
+ self.addTo(aid)
+ if r.has_key("from"):
+ aid = AID.aid()
+ aid.setName(r["from"]["name"])
+ for addr in r["from"]["addresses"]:
+ aid.addAddress(addr)
+ self.setFrom(aid)
+
+ if r.has_key("acl-representation"):
+ self.setAclRepresentation(r["acl-representation"])
+ if r.has_key("payload-length"):
+ self.setPayloadLength(r["payload-length"])
+ if r.has_key("payload-encoding"):
+ self.setPayloadEncoding(r["payload-encoding"])
+ if r.has_key("date"):
+ self.setDate(r["date"])
+ if r.has_key("intended-receiver"):
+ for ag in r["intended-receiver"]:
+ aid = AID.aid()
+ aid.setName(ag["name"])
+ for addr in ag["addresses"]:
+ aid.addAddress(addr)
+ self.addIntendedReceiver(aid)
=======================================
--- /trunk/spade/MTP.py Tue Jun 29 12:24:20 2010
+++ /trunk/spade/MTP.py Fri Nov 9 09:51:22 2012
@@ -6,83 +6,70 @@
class MTP:
- def __init__(self, name, config, acc):
+ def __init__(self, name, config, acc):
- #parser = SpadeConfigParser.ConfifParser()
- #self.config = parser.parse(CONFIGFILE)
+ #parser = SpadeConfigParser.ConfifParser()
+ #self.config = parser.parse(CONFIGFILE)
-
self.name = name
- self.config = config
- self.acc = acc
+
self.name = name
+ self.config = config
+ self.acc = acc
- self.protocol = self.config.acc.mtp[name].protocol
- #self.instance = self.config.acc.mtp[name].instance
+ try:
+ self.protocol = self.config.acc.mtp[name].protocol
+ except: pass
+ #self.instance = self.config.acc.mtp[name].instance
- self.setup()
+ self.setup()
- def setup(self):
- raise NotImplemented
+ def setup(self):
+ raise NotImplemented
- # Envelope = Envelope Class
- # Payload = raw text
- def send(self, envelope, payload):
- raise NotImplemented
+ # Envelope = Envelope Class
+ # Payload = raw text
+ def send(self, envelope, payload):
+ raise NotImplemented
- def stop(self):
- #raise NotImplemented
- pass
+ def stop(self):
+ #raise NotImplemented
+ pass
- def dispatch(self, envelope, payload):
- """
- xc = XMLCodec.XMLCodec()
- envxml = xc.encodeXML(envelope)
+ def dispatch(self, envelope, msg):
+ # Try to send message through XMPP
+ # If no xmpp address is found, try to come uo with one
+ try:
+ for recv in msg.getReceivers():
+ jabber_id = ""
+ for addr in recv.getAddresses():
+ if "xmpp" in addr:
+ jabber_id = addr
+ break
+ if not jabber_id:
+ jabber_id = "xmpp://"+str(recv.getName())
+ # Figuring out the XMPP address
+ recv.addAddress(jabber_id)
- xenv = protocol.Node('jabber:x:fipa x')
- xenv['content-type']='fipa.mts.env.rep.xml.std'
- xenv.addData(envxml)
- """
- #print "DISPATCH PAYLOAD"
- #print str(payload)
- p = ACLParser.ACLParser()
- msg = p.parse(payload)
- #print "###MTP MESSAGE PARSED"
- #print msg
-
- # Try to send message through XMPP
- # If no xmpp address is found, try to come uo with one
- try:
- for recv in msg.getReceivers():
- jabber_id = ""
- for addr in recv.getAddresses():
- if "xmpp" in addr:
- jabber_id = addr
- break
- if not jabber_id:
- jabber_id = "xmpp://"+str(recv.getName())
- # Figuring out the XMPP address
- recv.addAddress(jabber_id)
-
- self.acc.send(msg, "jabber")
+ self.acc.send(msg, "xmppfipa")
- except:
- self.acc.send(msg, "jabber")
+ except:
+ self.acc.send(msg, "xmppfipa")
- """
- for to in envelope.getTo():
+ """
+ for to in envelope.getTo():
- stanza = protocol.Message(to.getName(),payload, xmlns="")
- stanza.addChild(node=xenv)
+ stanza = protocol.Message(to.getName(),payload, xmlns="")
+ stanza.addChild(node=xenv)
- #s=None
- #s = self.acc._router._owner.getsession(to.getName())
- self.acc.send(stanza)
- print ">>>MTP: sent message to ", str(to)
- #print ">>>MTP: found session " + str(s) + "for " + str(to.getName())
- #if s:
- # s.enqueue(stanza)
- # s.push_queue()
- """
+ #s=None
+ #s = self.acc._router._owner.getsession(to.getName())
+ self.acc.send(stanza)
+ print ">>>MTP: sent message to ", str(to)
+ #print ">>>MTP: found session " + str(s) + "for " +
str(to.getName())
+ #if s:
+ # s.enqueue(stanza)
+ # s.push_queue()
+ """
=======================================
--- /trunk/spade/Platform.py Tue Jul 10 16:56:02 2012
+++ /trunk/spade/Platform.py Fri Nov 9 09:51:22 2012
@@ -33,19 +33,23 @@
class SpadePlatform(PlatformAgent):
+
class RouteBehaviour(Behaviour.Behaviour):
+ #This behavior routes messages between agents.
+ #Also uses MTPs when different protocols are required (HTTP, ...)
def __init__(self):
Behaviour.Behaviour.__init__(self)
def _process(self):
msg = self._receive(True)
if (msg != None):
- self.myAgent.DEBUG("SPADE Platform Received a message: " +
str(msg))
+ self.myAgent.DEBUG("SPADE Platform Received a message: " +
str(msg),'info')
if msg.getSender() == self.myAgent.getAID():
# Prevent self-loopholes
self.myAgent.DEBUG("ACC LOOP HOLE", "warn")
return
+ #prepare to send the message to each one of the receivers
separately
to_list = msg.getReceivers()
d = {}
for to in to_list:
@@ -68,28 +72,29 @@
self.myAgent.DEBUG("Message through protocol " +
str(protocol))
#ap = ACLParser.ACLxmlParser()
#payload = ap.encodeXML(newmsg)
- payload = str(newmsg)
+ #payload = str(newmsg)
+ payload = newmsg
envelope = Envelope.Envelope()
envelope.setFrom(newmsg.getSender())
for i in newmsg.getReceivers():
envelope.addTo(i)
-
envelope.setAclRepresentation("fipa.acl.rep.string.std") # Always the same?
- envelope.setPayloadLength(len(payload))
+
envelope.setAclRepresentation(newmsg.getAclRepresentation())
+ envelope.setPayloadLength(len(str(payload)))
envelope.setPayloadEncoding("US-ASCII")
envelope.setDate(BasicFipaDateTime.BasicFipaDateTime())
self.myAgent.mtps[protocol].send(envelope, payload)
else:
# Default case: it's an XMPP message
- self.myAgent.DEBUG("Message through protocol XMPP")
+ self.myAgent.DEBUG("Message through protocol
XMPP",'info')
platform =
self.myAgent.getSpadePlatformJID().split(".",1)[1]
if not platform in receiver_URI:
# Outside platform
- self.myAgent.DEBUG("Message for another
platform")
+ self.myAgent.DEBUG("Message for another
platform",'info')
self.myAgent.send(newmsg, "jabber")
else:
# THIS platform
- self.myAgent.DEBUG("Message for current
platform")
+ self.myAgent.DEBUG("Message for current
platform",'info')
for recv in v:
#self.myAgent._sendTo(newmsg,
recv.getName(), "jabber")
self.myAgent.send(newmsg, "jabber")
@@ -105,7 +110,7 @@
#print "Message to", to.getName(), "... Posting!"
"""
else:
- self.myAgent.DEBUG("ACC::dying... it shouldn't
happen", 'err')
+ self.myAgent.DEBUG("ACC::dying... this shouldn't
happen", 'err')
def __init__(self, node, password, server, port, config=None):
PlatformAgent.__init__(self, node, password, server, port,
config=config, debug=[])
=======================================
--- /trunk/spade/mtp/http.py Wed Dec 10 04:00:28 2008
+++ /trunk/spade/mtp/http.py Fri Nov 9 09:51:22 2012
@@ -12,7 +12,8 @@
import threading
from spade import MTP
from spade import XMLCodec
-from spade import SpadeConfigParser
+from spade import SpadeConfigParser, ACLParser
+from spade import ACLMessage, Envelope, AID
import httplib
@@ -25,12 +26,12 @@
FIPA_CT_HYPHEN = "multipart-mixed"
FIPA_CT = "multipart/mixed"
FIPA_HP =
{'Cache-Control':'no-cache', 'Host':'localhost:80', 'Mime-Version':'1.0',
- 'Content-Type':FIPA_CT+' ; boundary="'+BOUNDARY+'"',
- 'Content-Length':'0' , 'Connection':'close'}
+ 'Content-Type':FIPA_CT+' ; boundary="'+BOUNDARY+'"',
+ 'Content-Length':'0' , 'Connection':'close'}
FIPA_HP_LOWER =
{'cache-control':'no-cache', 'host':'localhost:80', 'mime-version':'1.0',
- 'content-type':FIPA_CT+' ; boundary="'+BOUNDARY+'"',
- 'content-length':'0' , 'connection':'close'}
+ 'content-type':FIPA_CT+' ; boundary="'+BOUNDARY+'"',
+ 'content-length':'0' , 'connection':'close'}
FIPA_HR =
{'Content-type':'text/plain','Cache-Control':'no-cache','Connection':'close'}
@@ -40,282 +41,322 @@
FIPA_CT_PAY = "application/fipa.acl.rep.string.std"
CONTENT_TYPE="Content-Type: "
-CT_XML = "application/xml"
+CT_XML = "application/xml"
CT_TEXT = "application/text"
+CT_JSON = "application/json"
class http(MTP.MTP):
- def setup(self):
- self.httpserver = HttpServer()
- self.httpserver.setName("SpadeHttpServer")
- self.httpserver.mtp = self
- self.httpserver.start()
- print "SPADE HTTP MTP Starting . . ."
+ def setup(self):
+ self.httpserver = HttpServer()
+ self.httpserver.setName("SpadeHttpServer")
+ self.httpserver.mtp = self
+ self.httpserver.start()
+ #print "SPADE HTTP MTP Starting . . ."
- def make_body(self,envelope,payload):
- """
- Create the body of the message
- """
- body = BI + BOUNDARY + "\r\n"
- if "/JADE" not in envelope:
- # Standard way
- body = body + CONTENT_TYPE + FIPA_CT_ENV + "\n\n"
- body = body + envelope + "\r\n" + BI + BOUNDARY + "\r\n"
- body = body + CONTENT_TYPE + FIPA_CT_PAY + "\n\n"
- else:
- # For JADE
- body = body + CONTENT_TYPE + CT_XML + "\r\n"
- body = body + envelope + "\r\n" + BI + BOUNDARY + "\r\n"
- body = body + CONTENT_TYPE + CT_TEXT + "\r\n"
+ def make_body(self,envelope,message):
+ """
+ Create the body of the message
+ """
+ language = message.getAclRepresentation()
+ payload = str(message)
+
+ body = BI + BOUNDARY + "\r\n"
+ if language == ACLMessage.FIPA_ACL_REP_JSON:
+ # the new JSON way
+ body = body + CONTENT_TYPE + CT_JSON + "\n\n"
+ body = body + envelope + "\r\n" + BI + BOUNDARY + "\r\n"
+ body = body + CONTENT_TYPE + CT_JSON + "\n\n"
+
+ elif language == ACLMessage.FIPA_ACL_REP_STRING:
+ # Standard way
+ body = body + CONTENT_TYPE + FIPA_CT_ENV + "\n\n"
+ body = body + envelope + "\r\n" + BI + BOUNDARY + "\r\n"
+ body = body + CONTENT_TYPE + FIPA_CT_PAY + "\n\n"
+
+ else: #language == ACLMessage.FIPA_ACL_REP_XML
+ if "/JADE" not in envelope:
+ # Standard way
+ body = body + CONTENT_TYPE + FIPA_CT_ENV + "\n\n"
+ body = body + envelope + "\r\n" + BI + BOUNDARY + "\r\n"
+ body = body + CONTENT_TYPE + CT_XML + "\n\n"
+ else:
+ # For JADE
+ body = body + CONTENT_TYPE + CT_XML + "\r\n"
+ body = body + envelope + "\r\n" + BI + BOUNDARY + "\r\n"
+ body = body + CONTENT_TYPE + CT_TEXT + "\r\n"
- body = body + payload + "\r\n"
- body = body + BI + BOUNDARY + BI +"\r\n"
+ body = body + payload + "\r\n"
+ body = body + BI + BOUNDARY + BI +"\r\n"
- return body
+ return body
- def stop(self):
- try:
- del self.httpserver
- except Exception, e:
- pass
- print "EXCEPTION STOPPING HTTP", str(e)
+ def stop(self):
+ try:
+ del self.httpserver
+ except Exception, e:
+ pass
+ #print "EXCEPTION STOPPING HTTP", str(e)
- def send(self,envelope,payload):
- """
- Send a message to a http agent
- """
+ def send(self,envelope,payload):
+ """
+ Send a message to a http agent
+ """
- #print ">>>HTTP TRANSPORT: A MESSAGE TO SEND FOR ME"
- #print ">>>HTTP: PAYLOAD = " + payload
+ envelope.setPayloadLength(str(len(str(payload))))
- envelope.setPayloadLength(str(len(str(payload))))
+ try:
+ if envelope.getAclRepresentation() ==
ACLMessage.FIPA_ACL_REP_JSON:
+ strenv = envelope.asJSON()
+ else:
+ strenv = envelope.asXML()
+ except:
+ #error
+ pass
- #xc = XMLCodec.XMLCodec()
- try:
- #envxml = xc.encodeXML(envelope)
- envxml = str(envelope)
- except:
- #error
- pass
+ # Making the body to send
+ body = self.make_body(strenv,payload)
+ # NO CAPS
+ #self.fipaHeadersPost = FIPA_HP_LOWER
+ #self.fipaHeadersPost['content-length'] = str(len(body))
- # Making the body to send
- body = self.make_body(envxml,payload);
+ # CAPS
+ self.fipaHeadersPost = FIPA_HP
+ self.fipaHeadersPost['Content-Length'] = str(len(str(body)))
- # NO CAPS
- #self.fipaHeadersPost = FIPA_HP_LOWER
- #self.fipaHeadersPost['content-length'] = str(len(body))
- # CAPS
- self.fipaHeadersPost = FIPA_HP
- self.fipaHeadersPost['Content-Length'] = str(len(str(body)))
+ # Geting message receivers
+ to = envelope.getTo()
+ #print ">>>HTTP TRANSPORT: TO = " + str(to)
+ for receiver in to:
+ #print ">>>HTTP TRANSPORT: RECEIVER = " + str(receiver)
+ for ad in receiver.getAddresses():
+ ad = str(ad)
+ #print ">>>HTTP TRANSPORT: ADDRESS = " + ad
- # Geting message receivers
- to = envelope.getTo()
- #print ">>>HTTP TRANSPORT: TO = " + str(to)
+ # HTTP URI = http://address:port
+ if ad[0:7] == "http://":
+ ad = ad[7:]
+ #print ">>>HTTP TRANSPORT: FINAL ADDRESS = " + ad
- for receiver in to:
- #print ">>>HTTP TRANSPORT: RECEIVER = " + str(receiver)
- for ad in receiver.getAddresses():
- ad = str(ad)
- #print ">>>HTTP TRANSPORT: ADDRESS = " + ad
+ # HTTP connection
+ #host = ad.split("/acc")[0]
+ host, remote_path = ad.split("/")
+ conn = httplib.HTTPConnection(host)
- # HTTP URI = http://address:port
- if ad[0:7] == "http://":
- ad = ad[7:]
- #print ">>>HTTP TRANSPORT: FINAL ADDRESS = " + ad
+ self.fipaHeadersPost['Host'] = host
- # HTTP connection
- #host = ad.split("/acc")[0]
- host, remote_path = ad.split("/")
- conn = httplib.HTTPConnection(host)
+ #print str(self.fipaHeadersPost)
+ #print str(body)
- self.fipaHeadersPost['Host'] = host
- #print str(self.fipaHeadersPost)
- #print str(body)
+
conn.request("POST",remote_path,body,self.fipaHeadersPost)
+ response = conn.getresponse()
- conn.request("POST",remote_path,body,self.fipaHeadersPost)
+ if response.status != 200:
+ print "Conection Error: Bad response",
str(response.status)
- response = conn.getresponse()
+ if response.reason != "OK":
+ print "Conection Error: Bad reason",
str(response.reason)
- if response.status != 200:
- print "Conection Error: Bad response", str(response.status)
+ #print response.status, response.reason
- if response.reason != "OK":
- print "Conection Error: Bad reason", str(response.reason)
+ conn.close()
- #print response.status, response.reason
+ # End connection
+ #print "HTTP Connection closed"
- conn.close()
- # End connection
- print "HTTP Connection closed"
-
-
class HttpServer(threading.Thread):
- def run(self):
- BaseHTTPServer.HTTPServer.allow_reuse_address = True
- httpd = BaseHTTPServer.HTTPServer(("", PORT), Handler)
- #print "HTTP Transport serving at port", PORT
- httpd.mtp = self.mtp
- httpd.serve_forever()
+ def run(self):
+ BaseHTTPServer.HTTPServer.allow_reuse_address = True
+ httpd = BaseHTTPServer.HTTPServer(("", PORT), Handler)
+ #print "HTTP Transport serving at port", PORT
+ httpd.mtp = self.mtp
+ httpd.serve_forever()
class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
- protocol_version = PROTOCOL_VERSION
+ protocol_version = PROTOCOL_VERSION
- def send_response(self, code, message=None):
- """
- Overloaded for fipa specification responses compliancy
- """
- self.log_request(code)
- if message is None:
- if code in self.responses:
- message = self.responses[code][0]
- else:
- message = ''
- self.wfile.write("%s %d %s\r\n" %(self.protocol_version, code, message))
+ def log_message(format,*args): pass
+ def send_response(self, code, message=None):
+ """
+ Overloaded for fipa specification responses compliancy
+ """
+ self.log_request(code)
+ if message is None:
+ if code in self.responses:
+ message = self.responses[code][0]
+ else:
+ message = ''
+ self.wfile.write("%s %d %s\r\n" %(self.protocol_version, code,
message))
- def do_POST(self):
- """
- Serve Fipa Post requests
- """
- if self.request_version != self.protocol_version:
- # fipa specification only allows HTTP/1.1
- self.send_error(505)
- new_headers = {}
- for k in self.headers.keys():
- new_headers[k.lower()] = self.headers[k]
-
- for i in FIPA_HP.keys():
- if i.lower() not in new_headers.keys():
- print "HEADERS MISMATCH", str(self.headers.keys()), str(FIPA_HP.keys())
- self.send_error(400,"FIPA headers required (
www.fipa.org)")
- break
-
- #if self.headers.keys() in FIPA_HP.keys():
- # print "HEADERS MISMATCH", str(self.headers.keys()), str(FIPA_HP.keys())
- # self.send_error(400,"FIPA headers required (
www.fipa.org)")
-
- if self.headers.getheader('Mime-Version') != FIPA_HP['Mime-Version']:
- self.send_error(400,"mime-version must be 1.0")
-
- if FIPA_CT not in self.headers.getheader('Content-Type'):
- print "FIPA_CT NOT IN CT"
- self.send_error(415)
+ def do_POST(self):
+ """
+ Serve Fipa Post requests
+ """
+ if self.request_version != self.protocol_version:
+ # fipa specification only allows HTTP/1.1
+ self.send_error(505)
- if 'boundary' not in self.headers.getparamnames():
- #print "GETPARAMNAMES", str(self.headers.getparamnames())
- self.send_error(415)
+ #print "HEADERS!!!", self.headers
+
+ new_headers = {}
+ for k in self.headers.keys():
+ new_headers[k.lower()] = self.headers[k]
- boundary = self.headers.getparam('boundary')
+ for i in FIPA_HP.keys():
+ if i.lower() not in new_headers.keys():
+ #print "HEADERS MISMATCH", str(self.headers.keys()),
str(FIPA_HP.keys())
+ self.send_error(400,"FIPA headers required (
www.fipa.org)")
+ break
- clen = self.headers.getheader('Content-Length')
- if clen <= 0:
- send_error(411)
+ #if self.headers.keys() in FIPA_HP.keys():
+ # print "HEADERS MISMATCH", str(self.headers.keys()),
str(FIPA_HP.keys())
+ # self.send_error(400,"FIPA headers required (
www.fipa.org)")
- envelopexml , payload = self.getContent(self.rfile,boundary,clen)
+ if self.headers.getheader('Mime-Version') !=
FIPA_HP['Mime-Version']:
+ self.send_error(400,"mime-version must be 1.0")
- # parsing the envelope
- xc = XMLCodec.XMLCodec()
+ if FIPA_CT not in self.headers.getheader('Content-Type'):
+ #print "FIPA_CT NOT IN CT"
+ self.send_error(415)
- envelopexml = envelopexml.strip("\r\n")
+ if 'boundary' not in self.headers.getparamnames():
+ #print "GETPARAMNAMES", str(self.headers.getparamnames())
+ self.send_error(415)
+ boundary = self.headers.getparam('boundary')
- try:
- #print "ENVELOPEXML"
- #print envelopexml
- envelope = xc.parse(envelopexml)
- except Exception, e:
- print "EXCEPTION IN POST", str(e)
- self.send_error(400,"Malformed FIPA Envelope")
+ clen = self.headers.getheader('Content-Length')
+ if clen <= 0:
+ send_error(411)
+ envelope , payload = self.getContent(self.rfile,boundary,clen)
+
+ # Dispatching message
+ if envelope and payload:
+ self.server.mtp.dispatch(envelope, payload)
- # Dispatching message
- #MTP.MTP.dispatch(envelope,payload)
- self.server.mtp.dispatch(envelope, payload)
+ # Response
+ self.send_response(200)
- # Response
- self.send_response(200)
- for header in FIPA_HR.keys():
- self.send_header(header,FIPA_HR[header])
- self.end_headers()
+ for header in FIPA_HR.keys():
+ self.send_header(header,FIPA_HR[header])
+ self.end_headers()
- def getContent(self,rfile,boundary,clen):
- """
- Parses entity body catching the envelope and payload of the incoming
message
- """
+ def getContent(self,rfile,boundary,clen):
+ """
+ Parses entity body catching the envelope and payload of the
incoming message
+ """
- env = None
- pay = None
+ env = None
+ pay = None
- part = 0
- buf1 = rfile.read(int(clen)).split(BI+boundary+BI)
+ part = 0
+ buf1 = rfile.read(int(clen)).split(BI+boundary+BI)
- if len(buf1) != 2:
- self.send_error(400,"Malformed Multipart-Mixed MIME")
+ if len(buf1) != 2:
+ self.send_error(400,"Malformed Multipart-Mixed MIME")
- buf2 = buf1[0].split(BI+boundary)
+ buf2 = buf1[0].split(BI+boundary)
- parts = len(buf2)
+ parts = len(buf2)
- try:
- if parts == 2:
- env = buf2[0]
- pay = buf2[1]
+ try:
+ if parts == 2:
+ env = buf2[0]
+ pay = buf2[1]
- elif parts == 3:
- # there is text before the first boundary delimiter line, and it is
ignored
- env = buf2[1]
- pay = buf2[2]
+ elif parts == 3:
+ # there is text before the first boundary delimiter line,
and it is ignored
+ env = buf2[1]
+ pay = buf2[2]
- else:
- self.send_error(400,"Malformed Multipart-Mixed MIME")
- except:
- self.send_error(400,"Malformed Multipart-Mixed MIME")
+ else:
+ self.send_error(400,"Malformed Multipart-Mixed MIME")
+ except:
+ self.send_error(400,"Malformed Multipart-Mixed MIME")
- # searching CLRF CLRF where envelope really starts, before this sequence
is the envelope content type
- index = env.find('\r\n\r\n')
- if index < 0:
- index = env.find('\n\n')
- type_env = env[0:index]
- env = env[index+2:]
+ # searching CLRF CLRF where envelope really starts, before this
sequence is the envelope content type
+ index = env.find('\r\n\r\n')
+ if index < 0:
+ index = env.find('\n\n')
+ type_env = env[0:index]
+ env = env[index+2:]
- # the same for payload
- index = pay.find('\r\n\r\n')
- if index < 0:
- index = env.find('\n\n')
- type_pay = pay[0:index]
- pay = pay[index+2:]
+ # the same for payload
+ index = pay.find('\r\n\r\n')
+ if index < 0:
+ index = pay.find('\n\n')
+ type_pay = pay[0:index]
+ pay = pay[index+2:]
+
+ # Content types check
+ try:
+ type_env = type_env.split(':')[1].split(';')[0].strip()
+ type_pay = type_pay.split(':')[1].split()[0].strip()
- # Content types check
- try:
- type_env = type_env.split(':')[1].split(';')[0].strip()
- type_pay = type_pay.split(':')[1].split(';')[0].strip()
+ except:
+ #self.send_error(415)
+ pass
- except:
- #self.send_error(415)
- pass
+ #if str(FIPA_CT_ENV) not in str(type_env) or str(FIPA_CT_PAY) not
in str(type_pay):
+ # if str(CT_XML) not in str(type_env) or str(CT_TEXT) not in
str(type_pay):
+ # print type_env, type_pay
+ # self.send_error(415)
+ if type_env == FIPA_CT_ENV or type_env == CT_XML:
+ # parsing the envelope
+ xc = XMLCodec.XMLCodec()
+ env = env.strip("\r\n")
+ try:
+ envelope = xc.parse(env)
+ except Exception, e:
+ self.send_error(400,"Malformed FIPA Envelope")
+ elif type_env == CT_JSON:
+ envelope = Envelope.Envelope(jsonstring=env)
+ else:
+ self.send_error(415)
+ return None, None
+
- if str(FIPA_CT_ENV) not in str(type_env) or str(FIPA_CT_PAY) not in
str(type_pay):
- if str(CT_XML) not in str(type_env) or str(CT_TEXT) not in
str(type_pay):
- self.send_error(415)
+ if FIPA_CT_PAY in type_pay or CT_TEXT in type_pay:
+ p = ACLParser.ACLParser()
+ try:
+ payload = p.parse(pay)
+ except Exception, e:
+ self.send_error(400,"Malformed FIPA ACL Payload")
+ return envelope,None
+ elif type_pay == CT_XML or type_pay
== "application/"+ACLMessage.FIPA_ACL_REP_XML:
+ p = ACLParser.ACLxmlParser()
+ try:
+ payload = p.parse(pay)
+ except Exception, e:
+ self.send_error(400,"Malformed FIPA XML Payload")
+ return envelope,None
+ elif type_pay == CT_JSON:
+ payload = ACLMessage.ACLMessage(jsonstring=pay)
+ else:
+ self.send_error(415)
+ return envelope,None
+
- return (env,pay)
+ return (envelope,payload)
@@ -328,24 +369,28 @@
if __name__ == "__main__":
- http_mtp = http("SpadeHttpSever",None,None)
+ http_mtp = http("SpadeHttpSever",None,None)
+
+ import time
+ time.sleep(5)
+ msg = ACLMessage.ACLMessage()
+ msg.setPerformative("inform")
+
msg.addReceiver(AID.aid("b@localhost",["xmpp://b@localhost", "
http://localhost:2099/b"]))
+ msg.setContent("testACLMessage")
+ msg.setLanguage(ACLMessage.FIPA_ACL_REP_XML)
+ env = Envelope.Envelope()
+
env.addTo(AID.aid("b@localhost",["xmpp://b@localhost", "
http://localhost:2099/b"]))
+
env.setFrom(AID.aid("a@localhost",["xmpp://a@localhost", "
http://localhost:2099/a"]))
+ env.setAclRepresentation(ACLMessage.FIPA_ACL_REP_XML)
+ env.setPayloadEncoding("US-ASCII")
+ env.setDate("20121105T134259368626")
- import time
- time.sleep(5)
- fenv = open('env.example','r')
- fpay = open('pay.example','r')
- envxml = fenv.read()
- payload = fpay.read()
- xc = XMLCodec.XMLCodec()
- envelope = xc.parse(envxml)
- print "HORRRRRRRRRRRRRRRRRRRRRRRR"
- print envelope
- http_mtp.send(envelope,payload)
+ http_mtp.send(env,msg)
"""
TODO
-- el send ha de tornar un codi de error quan falla, no imprimir res
+- send must return an error code when fails
"""
=======================================
--- /trunk/spade/spade_backend.py Tue Jul 10 16:56:02 2012
+++ /trunk/spade/spade_backend.py Fri Nov 9 09:51:22 2012
@@ -67,13 +67,13 @@
def shutdown(self):
if self.df:
self.df.stop()
- #del self.df
+ del self.df
if self.ams:
self.ams.stop()
- #del self.ams
+ del self.ams
if self.acc:
self.acc.stop()
- #del self.acc
+ del self.acc
def DEBUG(self,component="",msg="",typ=""):
self.acc.DEBUG(msg,typ,component)
=======================================
--- /trunk/spade/wui.py Wed Aug 1 09:29:11 2012
+++ /trunk/spade/wui.py Fri Nov 9 09:51:22 2012
@@ -108,6 +108,8 @@
class WUIHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
+ def log_message(format,*args): pass
+
def Session(self):
"""Session management
If the client has sent a cookie named sessionId, take its value and
=======================================
--- /trunk/test/kbTestCase.py Tue Jul 31 08:17:01 2012
+++ /trunk/test/kbTestCase.py Fri Nov 9 09:51:22 2012
@@ -1,6 +1,7 @@
import os
import sys
import unittest
+import urllib2
import spade
@@ -47,10 +48,18 @@
from spade import SPARQLKB
except:
self.skipTest("Could not import SPARQLKB. Try installing
SPARQLWrapper (sudo easy_install SPARQLWrapper)")
+
+ url = '
http://lod.openlinksw.com/sparql'
+ try:
+ request = urllib2.urlopen(url,timeout=5)
+ except:
+ self.skipTest("URL " + url + " is not currently available.")
+ if request.code != 200:
+ self.skipTest("URL " + url + " is not currently available.")
- self.a.configureKB("SPARQL", sentence=None,
path='
http://lod.openlinksw.com/sparql')
+ self.a.configureKB("SPARQL", sentence=None, path=url)
for result in self.a.askBelieve(sparql1):
- assert result["p"] in ["0.5", "0.55", "0.75", "0.85"]
+ assert result["p"] in
["0.5", "0.55", "0.65", "0.69", "0.75", "0.85", "1.79"]
assert result["c"] == "GBP"
def testSPARQLdbpedia(self):
@@ -58,8 +67,16 @@
from spade import SPARQLKB
except:
self.skipTest("Could not import SPARQLKB. Try installing
SPARQLWrapper (sudo easy_install SPARQLWrapper)")
+
+ url = '
http://dbpedia.org/sparql'
+ try:
+ request = urllib2.urlopen(url,timeout=5)
+ except:
+ self.skipTest("URL " + url + " is not currently available.")
+ if request.code != 200:
+ self.skipTest("URL " + url + " is not currently available.")
- self.a.configureKB("SPARQL", sentence=None,
path='
http://dbpedia.org/sparql')
+ self.a.configureKB("SPARQL", sentence=None, path=url)
for result in self.a.askBelieve(sparql2):
assert result["name"] in ["Croatia","Republic of
Croatia","Republika Hrvatska"]
=======================================
--- /trunk/test/unittests_spade.xml Tue Jul 10 16:56:52 2012
+++ /trunk/test/unittests_spade.xml Fri Nov 9 09:51:22 2012
@@ -9,7 +9,10 @@
<hostname>acc.127.0.0.1</hostname>
<password>gxFgUdtH</password>
<port>5222</port>
-
+ <mtp name="http">
+ <instance>http</instance>
+ <protocol>http</protocol>
+ </mtp>
</acc>
<ams>
=======================================
--- /trunk/test.py Tue Jul 31 06:58:54 2012
+++ /trunk/test.py Fri Nov 9 09:51:22 2012
@@ -7,6 +7,8 @@
from test.dfTestCase import *
from test.eventbehavTestCase import *
from test.factsTestCase import *
+from test.httpTestCase import *
+from test.jsonTestCase import *
from test.kbTestCase import *
from test.p2pTestCase import *
from test.pubsubTestCase import *
@@ -18,30 +20,41 @@
from xmppd.xmppd import Server
import thread
import sys
-
import os
-d="test"+os.sep
+import signal
-s = Server(cfgfile=d+"unittests_xmppd.xml",
cmd_options={'enable_debug':[], 'enable_psyco':False})
-thread.start_new_thread(s.run,tuple())
+if __name__ == '__main__':
-platform = spade_backend.SpadeBackend(d+"unittests_spade.xml")
-platform.start()
+ d="test"+os.sep
+
+ s = Server(cfgfile=d+"unittests_xmppd.xml",
cmd_options={'enable_debug':[], 'enable_psyco':False})
+
+ thread.start_new_thread(s.run,tuple())
+
+ platform = spade_backend.SpadeBackend(d+"unittests_spade.xml")
+ platform.start()
+
+
+ try:
+ import xmlrunner
+ use_xmlrunner = True
+ except:
+ use_xmlrunner = False
+
+ if use_xmlrunner:
+
unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'),exit=False)
+ else:
+ print "XMLTestRunner not found."
+ unittest.main(exit=False)
+ platform.shutdown()
+ s.shutdown("Jabber server terminated...")
+ sys.exit(0)
+ if sys.platform == 'win32':
+ os._exit(0)
+ else:
+ os.kill(os.getpid(), signal.SIGTERM)
-try:
- import xmlrunner
- use_xmlrunner = True
-except:
- use_xmlrunner = False
-if use_xmlrunner:
- unittest.main(testRunner=xmlrunner.XMLTestRunner(output='test-reports'))
-else:
- print "XMLTestRunner not found."
- unittest.main()
-platform.shutdown()
-s.shutdown("Jabber server terminated...")
-sys.exit(0)