Latest Updates

Products & Applications

Showtime
My Blackberry Enterprise Server Push Utility for the Lotus Notes Client, allows you to create Jobs for individual Channel, Message, and Browser Content Pushes, as well as allows you to delete Pushed Channel Icons from defined recipient devices.

Time Tracker
The idea is simple. At the start of your day - upon completion of your first task - create an entry highlighting what you did and whether you feel it was an efficient or inefficient use of your time. Based on several requests, you can also select the priority, apply categories, or even align your time against a project.

For Lotus Notes Client v8.0 and above, you can use the Time Tracker Widget to make this process even easier!

Zephyr
My Configuration-based Rich Text Mail Merge and Emailing Utility, Zephyr allows you to create rich, data-driven emails to support automated workflow - all via Microsoft Word Mail Merge-like architecture. Dear <firstname> allows you to personalize each email message not only to the individual recipient, but also to the individual application workflow event!

xCopy
xCopy is a simple configurable xCopy client for the Lotus Notes client. By creating and defining xCopy Profiles, you can batch process your file backup or remote upload jobs. With the addition of the xCopy sidebar widget, you can easily kick-off these jobs, and modify both the xCopy Profiles and xCopy itself.

Community & Resources

Lotus Technical Information & Education Community

The Lotus Technical Information & Education community is comprised of IBM, business partner, and customer subject matter experts who use product wikis, published articles, white papers, community blogs and the latest in social media to build and share high quality technical content.

OpenNTF.org - Open Source Community for Lotus Notes Domino

OpenNTF is devoted to enabling groups of individuals all over the world to collaborate on IBM Lotus Notes/Domino applications and release them as open source.

developerWorks Lotus : Wikis

Share your deployment experiences and best practices in our wikis and help IBM to create scenarios for successful deployments. Contribute to the community by collaborating on shared content and leverage the shared knowledge from that community.

Project: Yellowcake | IBM Lotus Notes/Domino REST API

02/11/2008 11:08:48 AM by Chris Toohey

The typical application architecture for a user client interacting with a Domino application is this:

Simply put, the user client accesses the Domino application - which has been designed/modified to account for the given user client type - with direct reads/writes to said Domino application. The application design requires that security, functional UI elements, and such be built directly into the given Domino application. This architecture is nothing new to Domino Developers, but can often cause issues when a given developer does not recognize the need for separation between data and functional application UI.

The more advanced application architecture for a user client interacting with a Domino application is this:

Basically, the user interacts with a conduit or API that allows an interaction point between applications. Now, this conduit/API is typically pretty hard coded - and you see that with the web service APIs that are out there today. Check out the Google Maps API, there are statically-defined API that allow for some pretty amazing extended functionality. The problem with this approach - you are often afraid to touch anything. The conduit app is fairly hard-wired, designed for this singular need (the given API). This can often restrict both development and administration efforts, as not only is it a chore to expand the scope of functionality in your Domino applications (and forget it if you need to bring in a fresh developer who is not familiar with the given conduit design...), but the admins can't easily move databases to other servers or directories without full-well knowing that it will break something, somewhere, at sometime!

Now what is Project: Yellowcake? Project: Yellowcake is, simply put, a configurable REST API for Domino applications.

I came up with this approach and thought that I had invented the wheel - only to have someone tell me that it was a REST API - or a Representational State Transfer API. So a public thanks to Nathan for that one!

So here are some specifics about just what Project: Yellowcake is, for those of you who are still reading this far into the post...

You - the Developer/Admin, can define an Application Profile. The Application Profile will contain information about the target Domino application - both server and database, as well as allow you to define a specific dbkey - which is to be used as a key for any interaction with this particular application. One of the best parts? Admins can move the database to another directory (or another server for that matter), and all you will need to do is update the Application Profile with the target Domino applications new location! (see that, it's ADMIN-friendly!!)

You can then create either a Query Template or a Save Template for your given Application Profile. While the names should prove the following description unnecessary...

Query Template:
You will define both Content Type (by default, you can return HTML, Plain Text, XML, CSS), the result set formatting, and a given appkey. When the given appkey is invoked - typically via a GET/POST of sorts, the Query Template Author-defined API arguments are passed to the REST API, returning a NotesDocumentCollection from the target database. The Query Template then will iterate through the collection, and merge your result set on-the-fly (think of a Mail Merge), and build your resultant markup.

Save Template:
You will define one of the only static API parameters - docid - and invoke the Save Template via (typically) the result of a Form element's processing agent. The Save Template will then iterate through a series of WebQuerySave-like events that will be evaluated against the target document (defined via a combination of the dbkey and the docid parameter). Currently, the trigger options are running in-line Formula, running an Agent in the target database, or redirecting to a specific URL.

I'll post a few more entries defining the real-world usages of Project: Yellowcake in the upcoming days... while I search for a private alpha team for testing this thing out while I clean up some things...

If you're interested in being on the angel-round private alpha team, please contact me. Otherwise, check back here for more details in the upcoming days...

 
Thomas BahnName:Thomas BahnWebsite:http://www.assono.de/blog/Comment

Hi Chris,

this sound quite promising. Interesting. Mind-widening. :-D

But as far as I understand REST and RESTful, I cannot quite map your description of Project: Yellowcake to the principles and terms I know. Please have a look at: http://en.wikipedia.org/wiki/REST

REST over HTTP means using the "Verbs" GET, PUT, DELETE, POST on resources identified by some kind of URL. But using PUT and DELETE in the Domino Web server?

Okay, this is only the usual interpretation of REST over HTTP, but not the only one possible.

What are your resource identifiers and verbs, than?

Thomas

Chris TooheyName:Chris TooheyWebsite:http://www.dominoguru.comComment

@Thomas:
Well, as per my understanding, REST can also encompass the HTTP method, and that's what Yellowcake does. For example, using GET/POST as a method for a Form element's processing agent and pointing the action of said form to "rest?openagent&dbkey=abc123&...". The rest Domino Agent here - which is the heart of Yellowcake is designed to "listen" for the particlar HTTP method, and the application/utility end of Yellowcake allows for the applied processing of said request.

kerrName:kerrComment

I'm Looking forward to seeing more on this, but like Thomas, I'm seeing a conflict with my understanding of REST.

--
Kerr

Thomas BahnName:Thomas BahnWebsite:http://www.assono.de/blog/Comment

Hi Chris,

I think, Project: Yellowcake can be something really new, enlightening and very powerful, but putting the "REST" label on it isn't necessary for its usefulness, but can provoke some "resistance" due to the unusual interpretation of "REST".

The key concepts of REST are resources and verbs. I don't see the verbs in your description nor example.

REST over HTTP is not only using GET and POST, but also PUT and DELETE (as they were intended and described in the HTT protocol). For example
DELETE /employees/1992
should delete the employee 1992 and
POST /employee/1993
with some parameters in the body create or modifiy the employee.
Perhaps, if you use different agents for the verbs and the first parameter as resource identifier...

Again, I don't say anything negative about your project, but I only recommend, that you rethink the unnecessary usage of the label "REST".

Cordially,
Thomas

Chris TooheyName:Chris TooheyWebsite:http://www.dominoguru.comComment

@Thomas (again):
Here's how this basically works: There are a few required Verbs, "docid":"appkey", and a view functional-specific Verbs, "query":"docid". All/any others, are Admin-defined in the given Query or Save Templates

It's the applied logic, in combination with the Domino data management capabilities, that allow for the REST-type functionality.

Basically, I'm able to create, delete, modify, and otherwise display content from a given Domino database via this architecture. It might not be the exact definition of REST... but it's certainly (IMHO) to categorize this as a Domino REST API

If I'm wrong though, hopefully someone'll point it out to me!

@Kerr:
I'm looking forward to getting you guys more on this! ;-)

I'll be showing in the upcoming days just what I'm talking about here (not purposefully being aloof here, it's just going to take a LOT to explain it properly...)

Hopefully - whether it's a true REST API or not - it'll prove useful to those who need such a thing.

Chris TooheyName:Chris TooheyWebsite:http://www.dominoguru.comComment

@Thomas:
Was commenting the same time you were... ;-)

... I don't say anything negative about your project...

First, I posted this to get feedback and showcase an idea I had in this community. You're giving me great feedback, and it's something I'm totally thankful for - honestly. Please don't stop, or feel the need to audit your responses in any way, shape or form. Sometimes collaboration means telling me I'm not getting something... all I ask is to stay clear of the "fat jokes" ;-)

That being said -- I totally see where you're coming from, and actually agree. Based on what I've shown thus far, I haven't given a real-world example of utilizing the PUT or DELETE - but only GET/POST methods. There are several reasons for that, the biggest being that I'm still working out the kinks before I call it "complete". Some of those kinks today revolve around the correct processing of the PUT and DELETE methods.

Today, I've got GET and POST nailed down. So I can give real-world examples of those without having to worry that they don't make the v1.0 codebase when I get Yellowcake out the door.

The REST label may be a misnomer at this time... and I might actually need to change that association, but I think I can only really come to that decision after I collaborate with the rest of you after the weeks worth of show-and-tell.

Vitor PereiraName:Vitor PereiraWebsite:http://www.vitor-pereira.comComment

I've been pressing F5 on your blog for two weeks, it was well worth waiting!
This looks very promising indeed.

Just don't go hanging out with those yellowbleeders to much :-)

Nathan T. FreemanName:Nathan T. FreemanWebsite:http://nathan.lotus911.comComment

Thomas, if your complaint is that it's not truly RESTful because it doesn't support PUT and DELETE commands, we can all blame IBM for not having a CGI handler that does anything with those commands.

I suppose Yellowcake could be re-written as a Java servlet, and then there's be something to PUT to, but Chris is certainly limited by which HTTP methods Domino will even acknowledge.

Would you guys object to "semi-RESTful?" What about "Sleepy?" "Dozing?" "Nappy?"

Would that mean that an application using Yellowcake would be Nappy-headed? :-D

For the record, I was the one that suggested to Chris that he call it a REST API when he said he was going to support POST as well as GET. So your beef is more with me than with Chris.

Thomas BahnName:Thomas BahnWebsite:http://www.assono.de/blog/Comment

Hi Nathan, I don't have any meat with your nor Chris - no beef, no sheep, no chicken ;-)

BTW, the Domino URL commands could be called a REST API: ?OpenDocument, ?CreateDocument, ?SaveDocument and ?DeleteDocument are appropriate verbs and the path before the command identifies a resource properly.

Chris, the potentials I immediately see in your solution are the potent and flexible "Templating" approach, the additional abstration layer (dbkey, appkey), and the possibility for templates to use/modify data in more than one database concurrently.

Performance-wise a servlet could be beneficial and more flexible (thinking about PUT and DELETE, but also about the construction of resource identifiers aka URLs), but an agent could be "just good enough".

Writing about performance: Have you done some performance tests yet? This could get a weakness... Something to watch...

Waiting for more input :-)
Thomas

Chris TooheyName:Chris TooheyWebsite:http://www.dominoguru.comComment

@Nathan:
Play nice! ;-)

There's definitely something to checking to see if I can capture the PUT and DELETE methods like I capture the POST and GET. If I'm able to, I think I'll satisfy any objection to labeling this a Domino REST API.

@Thomas:
The Domino URL Commands, while they allow for some great functionality, have one big issue IMHO - they rely on target database design modification to achieve the results that I can get with Yellowcake. That's not me bragging - I'm just a "proud poppa"!

As for the speeds... I gotta tell ya, it worried me at first. I thought that I would be hourglassing while trying to do the more complex "templating", but I was impressed.

I'll share some metrics - as well as more details - tomorrow, but WAN was great: a queried collection of over 5,000 documents from a Domino Directory containing over 20,000 documents - fully "templated" into an application UI that allowed for the on-the-fly creation of forms that could be used to update various metrics of the given document, via a Verizon Wireless air card in Pennsylvania to a Celeron-based "beige box" in Texas... 768ms.

LAN - I kept getting 16ms through Firebug. Same result set and "templating".

Nathan T. FreemanName:Nathan T. FreemanWebsite:http://nathan.lotus911.comComment

Again, for the record, I'm playing nice. Thomas and his colleague Bernd... I would dare to call them friends. Or at least brothers-in-arms. We fight for the common good of OOP in Lotuscript! :-)

So there's never any doubt: I have the utmost respect for assono.de!

I just want to deflect a bit of the purist approach to what you're offering here. Technically, a REST API for Domino is impossible from anyone besides IBM unless you want to build a DSAPI filter, simply because the CGI processor doesn't know what to do with PUT and DELETE methods.

And while DSAPI is vaguely cool from a technology standpoint, it is essentially a giant platform-specific hack -- and I'm quite sure that Thomas (nor Kerr) wouldn't find a DSAPI program a satisfying solution.

As to actual performance metrics, well, I got to smoke test some queries. They're fast. And not to promote other technologies, but honestly -- Yellowcake follows in the same vein as both Ext.ND and Decepticon. It not-so-simply provides a more generalized model then either of those two efforts.

But the basic idea is the same: capture a query against a given NSF and turn it into an agent process that can deliver more robust information than the HTTP renderer knows how to provide. That is a great thing for Domino to have.

There's probably only a handful of people that know how to leverage that capability -- just like there's only a handful of people that know how to leverage ?ReadViewEntries. But look what Jack Ratcliff and Rich Waters have accomplished with that!

So I hope we can take Chris's abstraction here and turn it into some directly useful facilities. Web-based DbLookups spring to mind as an easy-to-implement solution.

But more generally...

Well, I'll just say that the idea of building templates to wrap HTTP return data is not a waste of time in relation to the long-term plans I've heard.

Is that vague enough?

Heh... if you hear that I got kicked out of the DP programs, then the answer is: no, it wasn't vague enough. :-D

kerrName:kerrComment

@Chris, if you've not already done so, try and get your hands on a copy of "RESTful Web Services" by Leonard Richardson & Sam Ruby.

http://safari.oreilly.com/9780596529260

I think you've got an interesting project here, but saying that it's a REST api is going to bring a lot of completely unnecessary baggage of expectation and confusion to the party. Just say it's a simplified http based api and you sidestep the whole can of worms.

Anywho, best of luck with this. :)


(not published)




Evaluate this Formula: @LowerCase(@Text("FOO"))