import groovy.xml.StreamingMarkupBuilder import groovy.util.XmlSlurper class BackPack { def myAccount def myKey def slurper = new XmlSlurper() def builder = new StreamingMarkupBuilder() def methods = [listAllPages: {makeRemoteCall("pages/all", "")}, newPage: {title, description -> makeRemoteCall("pages/new", {it.page{it.title(title); it.description(description)}})}, showPage: {pageNumber -> makeRemoteCall("page/${pageNumber}", "")}, destroyPage: {pageNumber -> makeRemoteCall("page/${pageNumber}/destroy", "")}, updateTitle: {pageNumber, title -> makeRemoteCall("page/${pageNumber}/update_title", {it.page{it.title(title)}})}, updateBody: {pageNumber, description -> makeRemoteCall("page/${pageNumber}/update_body", {it.page{it.description(description)}})}, duplicatePage: {number -> makeRemoteCall("page/${number}/duplicate", "")}, linkToPage: {pageNumber, link -> makeRemoteCall("page/${pageNumber}/link", {it.linked_page_id(link)})}, unlinkFromPage: {pageNumber, link -> makeRemoteCall("page/${pageNumber}/unlink", {it.linked_page_id(link)})}, sharePage: {pageNumber, people -> makeRemoteCall("page/${pageNumber}/share", people)}, unshareFromPage: {pageNumber -> makeRemoteCall("page/${pageNumber}/unshare_friend_page", "")}, emailPage: {pageNumber -> makeRemoteCall("page/${pageNumber}/email", "")}, listItems: {pageNumber -> makeRemoteCall("page/${pageNumber}/items/list", "")}, createItem: {pageNumber, content -> makeRemoteCall("page/${pageNumber}/items/add", {it.item{it.content(content)}})}, updateItem: {pageNumber, itemNumber, content -> makeRemoteCall("page/${pageNumber}/items/update/${itemNumber}", {it.item{it.content(content)}})}, toggleItem: {pageNumber, itemNumber -> makeRemoteCall("page/${pageNumber}/items/toggle/${itemNumber}", "")}, destroyItem: {pageNumber, itemNumber -> makeRemoteCall("page/${pageNumber}/items/destroy/${itemNumber}", "")}, moveItem: {pageNumber, itemNumber, direction -> makeRemoteCall("page/${pageNumber}/items/move/${itemNumber}", {it.direction(direction)})}, listNotes: {pageNumber -> makeRemoteCall("page/${pageNumber}/notes/list", "")}, createNote: {pageNumber, title, body -> makeRemoteCall("page/${pageNumber}/notes/create", {it.note{it.title(title); it.body(body)}})}, updateNote: {pageNumber, noteNumber, title, body -> makeRemoteCall("page/${pageNumber}/notes/update/${noteNumber}", {it.note{it.title(title); it.body(body)}})}, destroyNote: {pageNumber, noteNumber -> makeRemoteCall("page/${pageNumber}/notes/destroy/${noteNumber}", "")}, getTaggedPages: {tagNumber -> makeRemoteCall("tags/select/${tagNumber}", "")}, tagPage: {pageNumber -> makeRemoteCall("page/${pageNumber}/tags/tag", "")}, listReminders: {makeRemoteCall("reminders", "")}, createReminder: {Object[] data -> makeRemoteCall("reminders/create", {it.reminder{it.content(data[0]); if (data.size() > 1){it.remind_at(data[1])}}})}, updateReminder: {reminderNumber, Object[] data -> makeRemoteCall("reminders/update/${reminderNumber}", {it.reminder{it.content(data[0]); if (data.size() > 1){it.remind_at(data[1])}}})}, deleteReminder: {reminderNumber -> makeRemoteCall("reminders/destroy/${reminderNumber}", "")}, listEmails: {pageNumber -> makeRemoteCall("page/${pageNumber}/emails/list", "")}, showEmail: {pageNumber, emailNumber -> makeRemoteCall("page/${pageNumber}/emails/show/${emailNumber}", "")}, destroyEmail: {pageNumber, emailNumber -> makeRemoteCall("page/${pageNumber}/emails/destroy/${emailNumber}", "")}, exportBackpack: {makeRemoteCall("account/export", "")}] BackPack(myAccount, myKey) { this.myAccount = myAccount this.myKey = myKey } public invokeMethod(String name, params) { def method = methods[name] if (method == null) throw new GroovyRuntimeException("No method called $name") return method(*params.toList()) } def makeRemoteCall(typeOfRequest, body) { def secondTry = false while(true) { def httpConnection = new URL("http://${myAccount}.backpackit.com/ws/${typeOfRequest}").openConnection() httpConnection.addRequestProperty("X-POST_DATA_FORMAT", "xml") httpConnection.requestMethod = "POST" httpConnection.doOutput = true httpConnection.outputStream.withWriter("ASCII") { it << builder.bind {request{token myKey; delegate.mkp.yield body}} } if (httpConnection.responseCode == httpConnection.HTTP_OK) { def response httpConnection.inputStream.withStream { response = slurper.parse(it) } return response } else if (httpConnection.responseCode == httpConnection.HTTP_MOVED_TEMP) { if (secondTry) { throw new GroovyRuntimeException("Operation failed. Tried twice") } secondTry = true } else { throw new GroovyRuntimeException("Operation failed. HTTP PUT response code: ${httpConnection.responseCode}") } } } } // Test the operation of BackPack def dump = { msg -> System.out << new StreamingMarkupBuilder().bind { it.mkp.yield msg } println "" } def bp = new BackPack("*** Your ID Here ***", "*** Your Key Here ***") def response = bp.newPage("Page Title", "Page Description") dump(response) def pageId = response.page.@id response = bp.updateBody(pageId, "new Body") dump(response) response = bp.updateTitle(pageId, "new Title") dump(response) response = bp.createItem(pageId, "new Item") dump(response) response = bp.updateItem(pageId, response.item.@id, "updated Item") dump(response) response = bp.createItem(pageId, "new Item") dump(response) response = bp.moveItem(pageId, response.item.@id, "move_to_top") dump(response) response = bp.createNote(pageId, "new Note Title", "new Note Body") dump(response) response = bp.updateNote(pageId, response.note.@id, "updated Note", "updated Body") dump(response) response = bp.createReminder("+50 remember!") dump(response) response = bp.deleteReminder(response.reminder.@id) dump(response) response = bp.createReminder("remember!", new Date()) dump(response) response = bp.deleteReminder(response.reminder.@id) dump(response) response = bp.destroyPage(pageId) dump(response)