Saturday, July 13, 2013

ADF-BPM Integration: Custom Worklist.

A custom worklist is something commonly required from customers that use both ADF and BPM.
There are some user tasks that must go through a BPM process and other tasks that are performed directly.
So usually in the ADF application a worklist to display the BPM Tasks is required.

Oracle fusion gives many options to approach this and this can cause confusion.

Direction 1
My first approach some years ago was to use the exposed task flows of the BPM worklist:
See Oracle® Fusion Middleware Developer's Guide for Oracle SOA Suite,
32.13 Creating Reusable Worklist Regions
Some features available in worklist are exposed as standalone reusable components that can be embedded in any application. Moreover, these standalone task flows provide many customizations through parameters that enable you to build and customize a worklist application to meet requirements.’
The first attempt looked impressive to the moment that I tried to perform some customizations. The parameters are not well documented so I was using the trial and error methodology.
I could not customize it enough…see http://adfbugs.blogspot.gr/search?q=worklist
Also there was no way to override any of the worklist functionality (e.g add a link to another ADF task flow)

Direction 2
So we went ‘by the book’ and used the java api as described in the next chapter of Developer's Guide
33 Building a Custom Worklist Client

Along with some help from RedStack posts we managed to create the worklist we needed
http://redstack.wordpress.com/worklist/

Direction 3
Yet by reaching the next chapter of the Developer’s Guide
34 Introduction to Human Workflow Services
you see that there are also web services exposed to query and edit human tasks.
I though, why to use the java api and so many libraries? After all we are doing SOA and we should use the web services to create the custom worklist, and to update human tasks from ADF.
First I tried the easy way, to directly create data bindings from TaskQueryService web service. The result was the following:

I could not manage to create the correct structure of the input parameters in order to call the web service. Especially the ‘Predicate’ iterators were a nightmare.

So I tried a web service proxy:


A lot of types are created, similar but not the same with the java api and I managed to create and pass the correct parameters for the web service to run and return the Task list.

One issue was that the dates was exposed as iterators in the bindings?!

Yet the show stopper was that the Task type created from the web service do not have the getPayloadAsElement and setPayloadAsElement methods as the Java Api has. I did not find any way to update the human task payload from the web service.

The bottom line is that even though there seems to be 3 directions, only the second, seems to be the safe way to go for now.