Skip to Content

It’s been pretty much six years to the day since Dashboard as extension to R/3 and SAPGUI client, Nat Friedman’s project and implementation of a realtime contextual information system. So I thought it fitting to make a short demo showing integration between Google Wave and SAP, inspired by the cluepacket-driven style shown so nicely with Dashboard.

I got my Wave Sandbox account a week or so ago, and have had a bit of time to have a look at how robots and gadgets work — the two main Wave extension mechanisms. To get my feet wet, I built a robot, which is hosted in the cloud using Google App Engine (another area of interest to me) and the subject of this weblog entry. I used Python, but there’s also a Java client library available too. You can get more info in the API Overview.

What this robot does is listen to conversations in a Wave, automatically recognising SAP entities and augmenting the conversation by inserting extra contextual information directly into the flow. In this example, the robot can recognise transport requests, and will insert the request’s description into the conversation, lending a bit more information to what’s being discussed.

The robot recognises transport requests by looking for a pattern:

trkorr_match =' (SAPKw{6}|[A-Z0-9]{3}Kd{6}) ', text)

In other words, it’s looking for something starting SAPK followed by six further characters, or something starting with 3 characters, followed by a K and six digits (the more traditional customer-orientated request format). In either case, there must be a space before and a space following, to be more sure of it being a ‘word’.

How does it retrieve the description for a recognised transport request? Via a simple REST-orientated interface, of course 🙂 I use the excellent Internet Communication Framework (ICF) to build and host HTTP handlers so I can Forget SOAP – build real web services with the ICF. Each piece of data worth talking about is a first class citizen on the web; that is, each piece of data is a resource, and has a URL.

So the robot simply fetches the default representation of the recognised request’s ‘description’ resource. If the request was NSPK900115, the description resource’s URL would be something like:


Once fetched, the description is inserted into the conversation flow.

I’ve recorded a short screencast of the robot in action.

To report this post you need to login first.


You must be Logged on to comment or reply to a post.

    1. DJ Adams Post author


      Well, the port’s not half-open, if that’s what you mean 😉

      I’ve set the ICF to listen on 8990, and set a route on my router to forward TCP/UDP packets for 8990 to the machine hosting my SAP system. I chose 8990 as it’s one of the ports that you can make HTTP requests to from App Engine – see PORTS_ALLOWED_IN_PRODUCTION in



Leave a Reply