Thursday, December 22, 2011

Invoking BPM processes via Java

Simple scenario -



Client will do a sync invoke the expressOrderProcess and get back an acknowledgement.

Steps -

1. Define conversation/interface for ProcessExpressOrder and Acknowledge
This will generate the wsdl and the required artifacts therein.




2. Create an EJB Service Interface based on the WSDL



3. Deploy and check that you can see the EJB in the JNDI tree




4. Create the Java client



Full doc at

https://docs.google.com/open?id=0B7YrnfO7h717ZDhmYjk0ODMtZTg5NS00NGRjLWFiOWEtYTM5NDhhNDMwNGU0

Wednesday, December 21, 2011

BPM 11g Feature Pack - Collaboration Diagrams

Collaboration diagrams allows us to see the flow of messages between participants.
The participants are represented by pools and swimlanes. Each pool is essentially a
standalone process.

Here is a simple example with 2 pools -





Now all you need to do is click on the Collaboration Diagram tab...



BPM 11g Feature Pack - Activity Guides

A great feature available OOTB with feature pack.

Here is my sample BPM process -



Here is the activity guide UI -



Full lab doc at -

https://docs.google.com/open?id=0B7YrnfO7h717NTc5NDMwZTMtOTNiZS00NjJiLTkxYTEtZDc1YjlhNTI1OGIz

JDev Project -

https://docs.google.com/open?id=0B7YrnfO7h717YjJkZTc2YTYtNTg3MS00OTQ1LTllN2QtZmU1YzQ0OTMwMDJh

Monday, December 19, 2011

SOA/BPM APIs - Manipulating Composites and purging instances

With the release of the BPM 11g Feature Pack, I've started revisiting the whole API space. There are many blog entries out there dealing with this area - however it is usually only one particular use case that's covered e.g. how to purge instances etc.

However, there are exceptions - Rommel Pino's series of posts on the API are well worth reading, as well as anything from Mark Nelson http://redstack.wordpress.com/author/markxnelson/


Over the next couple of posts I want to look at the different API levels -

- composite / composite instance
- component/ component instance --> BPM process
- human task

My starting point is the following simple BPM process.





My XSD-



My test input -




Notice I have created a composite sensor on the FileAdapter (Read)

Composite API


I going to go thru the composite API - querying composites and their components.
I will also show a couple of approaches to purging instances.

1. Purge all instances of a composite based on instance state e.g. STALE.
This we can do at composite level.

2. Purge all instances of a composite based on instance state e.g. STALE. but doing
individual auditing for each instance. This we can do at composite instance level.

3. Purge a composite instance based on a sensor value. e.g. purge instance for orderID = 3.

The following code - will query all composites and list their components -

****************************************************************************

public void getAllComposites() throws Exception {
System.out.println("getAllComposites()");
Locator locator = null;
int purgedInstanceCount = 0;

try {
locator = this.getLocator();
CompositeFilter compositeFilter = new CompositeFilter();
CompositeInstanceFilter instanceFilter = new CompositeInstanceFilter();

//Get all composites from the domain based on the filter given
List composites =
locator.getComposites(compositeFilter);

System.out.println("*** Found " + composites.size() + " Composites.");

//Iterate through the composites.
Iterator compositeIter = composites.iterator();
while (compositeIter.hasNext()) {
Composite composite = (Composite)compositeIter.next();
System.out.println("Composite DN = " +composite.getCompositeDN());
System.out.println("Composite State = " + composite.getState());
System.out.println("Composite Instance count = " + composite.getInstanceCount());
List components = composite.getComponents();

// List Components

Iterator componentsIter = components.iterator();
while (componentsIter.hasNext()) {
Component component = (Component)componentsIter.next();
System.out.println("*** Component DN = " +component.getDN());
System.out.println("*** Component Name = " + component.getName());
System.out.println("*** Component Type = " + component.getImplementationType());
System.out.println("*** Component Total Instances = " + component.getNumberOfInstances());
System.out.println("*** Component Active Instances = " + component.getNumberOfActiveInstances());

}
//
}

} catch (Exception e) {
e.printStackTrace();
}
}
********************************************************************

My test output is as follows -



The following code will query the composite instances and output their composite sensor values -

*******************************************************************

public void getInstances(String compositeName) throws Exception {
System.out.println("getInstances() for composite " + compositeName);
Locator locator = null;

try {
locator = this.getLocator();
CompositeFilter compositeFilter = new CompositeFilter();
CompositeInstanceFilter instanceFilter = new CompositeInstanceFilter();

instanceFilter.setCompositeDN(compositeName);

//Get composite from the domain based on the filter given
List compositeInstances =
locator.getCompositeInstances(instanceFilter);

System.out.println("*** Found " + compositeInstances.size() + " Composite Instances.");

//Iterate through the composites.
Iterator compositeIter = compositeInstances.iterator();
while (compositeIter.hasNext()) {
CompositeInstance compositeInstance = (CompositeInstance)compositeIter.next();
System.out.println("Composite Instance DN = " +compositeInstance.getCompositeDN());
System.out.println("Composite Instance State = " + compositeInstance.getState());
System.out.println("Looking for Composite Sensors...");

List l_sensorData = compositeInstance.getSensorData();
for (int i =0; i < l_sensorData.size(); i++){
SensorData sensorData = l_sensorData.get(i);
System.out.println("*** Sensor name " + sensorData.getSensor().getName());
System.out.println("*** Sensor value " + sensorData.getData().toString());
}
}

}
catch (Exception e){
e.printStackTrace();
}
}

************************************************************************

My test output -



------------------------------------------------------------------------

Let's now do something with the instances e.g.
purge Stale instances.



Instance state can have the following values -






Here I have a couple of stale instances -








I use the following method -

***************************************************************************+

public void deleteCompositeInstances(String compositeName, int state) throws Exception {
System.out.println("deleteCompositeInstances() for composite " + compositeName + " with state " + state );
Locator locator = null;
String orderID = null;
try {
locator = this.getLocator();
CompositeInstanceFilter instanceFilter = new CompositeInstanceFilter();

instanceFilter.setCompositeDN(compositeName);
instanceFilter.setState(state);

//Get composite from the domain based on the filter given
List compositeInstances =
locator.getCompositeInstances(instanceFilter);

System.out.println("*** Found " + compositeInstances.size() + " stale composite instances.");

//Iterate through the composites.
Iterator compositeIter = compositeInstances.iterator();
while (compositeIter.hasNext()) {
CompositeInstance compositeInstance = (CompositeInstance)compositeIter.next();

List l_sensorData = compositeInstance.getSensorData();
for (int i =0; i < l_sensorData.size(); i++){
SensorData sensorData = l_sensorData.get(i);
orderID = sensorData.getData().toString();
}
System.out.println("About to delete instance for orderID = " + orderID);
compositeInstance.delete();

}

}
catch (Exception e){
e.printStackTrace();
}
}


***************************************************************************






We can also purge at the composite, as opposed to the compositeInstance level

************************************************************************

public void deleteCompositeInstancesNoAudit(String compositeName, int state) throws Exception {
System.out.println("deleteCompositeInstancesNoAudit() for composite " + compositeName + " with state " + state );
Locator locator = null;
try {
locator = this.getLocator();
CompositeFilter compositeFilter = new CompositeFilter();
compositeFilter.setCompositeDN(compositeName);

CompositeInstanceFilter instanceFilter = new CompositeInstanceFilter();
instanceFilter.setState(state);

//Get composite from the domain based on the filter given
List l_composites =
locator.getComposites(compositeFilter);

//Iterate through the composites.
Iterator compositeIter = l_composites.iterator();
while (compositeIter.hasNext()) {
Composite composite = (Composite)compositeIter.next();
System.out.println("About to purge "+ composite.getInstances(instanceFilter).size() + " instances... ");
composite.purgeInstances(instanceFilter);

}

}
catch (Exception e){
e.printStackTrace();
}
}


******************************************************************************

The composite sensor can be used in em to find instances based on orderID.



We can also purge instances based on the composite sensor value.
My composite sensor is called compSensor_orderID -

Here is the code -

**********************************************************************
public void deleteCompositeInstance4OrderId(String compositeName, String orderID) throws Exception {
System.out.println("deleteCompositeInstance4OrderId() for composite " + compositeName + " with orderID " + orderID );
Locator locator = null;

try {
locator = this.getLocator();
CompositeInstanceFilter instanceFilter = new CompositeInstanceFilter();

instanceFilter.setCompositeDN(compositeName);

List l_sensorFilter = new ArrayList ();
SensorFilter sensorFilter = new SensorFilter("compSensor_orderID",Sensor.SensorDataType.STRING,Operator.EQUALS,orderID);
l_sensorFilter.add(sensorFilter);

instanceFilter.setSensorFilter(l_sensorFilter);

//Get composite from the domain based on the filter given
List compositeInstances =
locator.getCompositeInstances(instanceFilter);

System.out.println("*** Found " + compositeInstances.size() + " composite instance(s) for orderID " + orderID);

//Iterate through the composites.
Iterator compositeIter = compositeInstances.iterator();
while (compositeIter.hasNext()) {
CompositeInstance compositeInstance = (CompositeInstance)compositeIter.next();

System.out.println("About to delete instance for orderID = " + orderID);
compositeInstance.delete();

}

}
catch (Exception e){
e.printStackTrace();
}
}

**********************************************************************

Wednesday, December 14, 2011

BPM 11g Feature Pack - Update Task

Nice feature -



In this scenario I have an order process that includes an event sub-process that listens for order modifications. Once a modification is received, the payload is updated and the original User Task is withdrawn/resubmitted.



Full lab doc at
https://docs.google.com/open?id=0B7YrnfO7h717ZjdlY2Q1YzctYjhiYi00ZTQ2LWIxZmEtODY5YTI3ZTdmZmE3

JDev app at

https://docs.google.com/open?id=0B7YrnfO7h717MzhjNzcyYjQtOWM1OS00MDA5LTk5N2MtYjhhOGRlY2VjNTEz

BPM 11g Feature Pack - Parametric Roles

In this simple example, I create a parametric role for Sales based on area and custStatus.

Here is the XSD -



My sales force is jcooper, mtwain, cdickens and wfaulk.
Responsibilities are as follows -




The broad steps are as follows -

1. Create 2 org units in BPM workspace - EMEA SALES and APAC SALES
2. Add users appropriately
3. Create Extended user properties for area and status
4. Map the properties to the users e.g. jcooper property area will be set to EMEA.
5. Create a parametric role that leverages the properties.

6. Create your BPM app
7. Add a User Task - Set participant list to parametric roles and configure
8. Deploy and test

Full description at -

https://docs.google.com/open?id=0B7YrnfO7h717M2U1MTlmMmEtZjI3Mi00ZTNhLWFhNTQtYzkyZjc5OGI5Y2I4

Monday, December 5, 2011

Oracle Enterprise Gateway (OEG) - changing the default Alert subject

Merci beaucoup Isabelle for the pointer!

Here is an example email output from a lab I created.



Now you notice that the subject defaults to Alert from Vordel. You will probably want to change this. To do this we need to add a new Subject to the default Alert configuration.

Start esexplorer.






Point to your OEG configuration file



Select the Default Alert Configuration – then the SysAlert you already created.
Right-click --> Create a Subject



Set to a value of your choice




Start your email server e.g. James
Start the gateway
Test