Index: trunk/src/services/XMLtoJSON.py =================================================================== --- trunk/src/services/XMLtoJSON.py (revision 0) +++ trunk/src/services/XMLtoJSON.py (revision 0) @@ -0,0 +1,66 @@ +#! /usr/bin/python + +from xml.sax.handler import ContentHandler +from xml.sax.saxutils import XMLGenerator +from xml.sax.xmlreader import XMLReader +from xml.sax import make_parser +import simplejson as json + +class ArtifactHandler(ContentHandler): + def __init__(self): + self.curr = '' + self.parent = '' + self.count = 0 + self.d = {} + self.currd = {} + self.parentd = {} + self.stack = [] + self.stack2 = [] + + def startElement(self, name, attrs): + if self.count == 0: + self.parent = name + self.d[name] = [dict(attrs), '', []] + self.currd = self.d + else: + chld = {name: [dict(attrs), '', []]} + self.parent = self.stack[-1] + self.parentd = self.stack2[-1] + chldlist = (self.parentd[self.parent])[2] + chldlist.append(chld) + self.currd = chld + + self.stack.append(name) + self.stack2.append(self.currd) + + self.curr = name + self.count += 1 + + def endElement(self, name): + self.stack.remove(name) + for item in self.stack2: + if item.has_key(name): + self.cleanUp(item, name) + self.stack2.remove(item) + + def cleanUp(self, item, name): + item[name] = [elem for elem in item[name] if len(elem) > 0] + if len(item[name]) == 1: + item[name] = item[name][0] + + def characters(self, content): + content = (content.encode('utf-8')).strip() + if content: + myd = ((self.parentd[self.parent])[2])[-1] + currcontent = (myd[self.curr])[1] + (myd[self.curr])[1] = "".join((currcontent, content)) + +def readXML(): + handler = ArtifactHandler() + parser = make_parser() + parser.setContentHandler(handler) + parser.parse("../testdata/artifacts/Cartoon.xml") + return parser._cont_handler.d + +def formatReadXML(): + return json.dumps(readXML(), sort_keys=True, indent=4) Index: trunk/src/services/couch.py =================================================================== --- trunk/src/services/couch.py (revision 0) +++ trunk/src/services/couch.py (revision 0) @@ -0,0 +1,96 @@ +#! /usr/bin/python + +import httplib, simplejson +from XMLtoJSON import * + +def prettyPrint(s): + """Prettyprints the json response of an HTTPResponse object""" + # HTTPResponse instance -> Python object -> str + print simplejson.dumps(simplejson.loads(s.read()), sort_keys=True, indent=4) + +class Couch: + """Basic wrapper class for operations on a couchDB""" + def __init__(self, host, port=5984, options=None): + self.host = host + self.port = port + + def connect(self): + return httplib.HTTPConnection(self.host, self.port) # No close() + + def getdbName(self, dbName): + return ''.join(['/', dbName, '/']) + + + # Database operations + + def createDb(self, dbName): + """Creates a new database on the server""" + r = self.put(self.getdbName(dbName), "") + prettyPrint(r) + + def deleteDb(self, dbName): + """Deletes the database on the server""" + r = self.delete(self.getdbName(dbName)) + prettyPrint(r) + + def listDb(self): + """List the databases on the server""" + prettyPrint(self.get('/_all_dbs')) + + def infoDb(self, dbName): + """Returns info about the couchDB""" + r = self.get(self.getdbName(dbName)) + prettyPrint(r) + + # Document operations + + def listDoc(self, dbName): + """List all documents in a given database""" + r = self.get(''.join(['/', dbName, '/', '_all_docs'])) + prettyPrint(r) + + def openDoc(self, dbName, docId): + """Open a document in a given database""" + r = self.get(''.join(['/', dbName, '/', docId,])) + prettyPrint(r) + + def saveDoc(self, dbName, body, docId=None): + """Save/create a document to/in a given database""" + if docId: + r = self.put(''.join(['/', dbName, '/', docId]), body) + else: + r = self.post(self.getdbName(dbName), body) + prettyPrint(r) + + def deleteDoc(self, dbName, docId): + # XXX Crashed if resource is non-existent; not so for DELETE on db. Bug? + r = self.delete(''.join(['/', dbName, '/', docId])) + prettyPrint(r) + + # Basic http methods + + def get(self, uri): + c = self.connect() + headers = {"Accept": "application/json"} + c.request("GET", uri, None, headers) + return c.getresponse() + + def post(self, uri, body): + c = self.connect() + headers = {"Content-type": "application/json"} + c.request('POST', uri, body, headers) + return c.getresponse() + + def put(self, uri, body): + c = self.connect() + if len(body) > 0: + headers = {"Content-type": "application/json"} + c.request("PUT", uri, body, headers) + else: + c.request("PUT", uri, body) + return c.getresponse() + + def delete(self, uri): + c = self.connect() + c.request("DELETE", uri) + return c.getresponse()