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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjziFcJW7Vu6rz3QDTJNpHsRrzCOU6oPPLY7ZHPCb6n5uUH-g-2nOggGHXScONauJ7TNZz87IIPrc9IZsuvBRTVTK9iwkuHErUG7jHQ1OKrIPJV-ezJtN5XkTXKy9tB1Ybe3MS1YFzqJUo/s400/1.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDGoy1wAPpFt2gDrSTAKi-F_BttX8mdaiAOCS2a5T2A91Oa2HS5sJ4FEJOp45r5glUB6njF4uw-50JiY4Ts9iLbtZhV498T7I4k3zaP4dgdzWs6P8eMldhyl7DInx7iVcii5RNf5sIhhY/s400/2.GIF)
My XSD-
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgkCLMbzg69PfDNmInkkdr_BN-yD_wrDB_hzE60QPRqQmLCyDSAmEWOF8wZS2vi6C8sdnsxvfUe8W1xs0oAKIisSIS5hRo98pHetrhTOYFmaDy18BcYjSnWlzv26w7M-ykN9bifSVxJoRU/s400/1.GIF)
My test input -
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjki2JfNuqUXozHR_jKVlmc4TDkmk6UqPCCyyHkXDFNnYAQ5AE4x8zTUQn4gWLCWbp0IG7ao5o8TNf-TlWuXrVOyoZ3K72tJju-ysq7vD7mXmjY-ydtr1MvNQ-WBfchaqCSTxnSdc3IkNo/s400/2.GIF)
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 -
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgpHidc3Oshglk5a6fWAFU4Bh1dl71Hda1V-xOQvjQ6FNOOo_6a4F0d5Xj3xsYcIKDOOZjPtUpOQ4asivtKsVmQ4QbfxMdpfQ5xguBXBPNsPWH7Pd1ig7IHg8Ai7KeF02AFdo2ZbXpjJ5g/s400/1.GIF)
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 -
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsGJ0Xys3kvxmHBvbVY_1Pe07OltOSFJTSs4-oS26OvGbMLti9f_p5jsA-kwZQrHW-mVwW49lxoiF3asrODkD0-4NbQJVdZRwxJ5gm7nfEyTQVbQroOv4rcm8stwgoWOqXShAF_mmb-vU/s400/1.GIF)
------------------------------------------------------------------------
Let's now do something with the instances e.g.
purge Stale instances.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHaVmrVcv64SsCiVorhKV5uMsfmXJiw0fIZWhj8mxPYQdwSnaFpr1yJQKSaGuzjKrSPTDrD9STnwDzXBRcv3ivLs4vTxOoDqJPQPaXFIzUiERqLMMNOda101v0IXR2kUz6xL4jUbrKSdM/s400/1.GIF)
Instance state can have the following values -
Here I have a couple of stale instances -
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhessdFX2COo9GQ3xISNHdkxf-TfhtgsnOXG3RfVlA5JPqOS-Q1ugi6g-uLE1vh9AAsMEXABp6jKyNxqs5LiqciR9f-jyHh-N0Uzml6TrPaoS2QyfipxDXTyaxK6Do-sY6zQXxHZ_FfGQ4/s400/1.GIF)
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();
}
}
***************************************************************************
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigf7R154B00wR5CDKLqn1zYygzYnZfS8uLQgEC0ilRefX729NLyZ6YOiPQzGr7K_iOn1084bZIgepGZSXWZCfIJ3HXgD6fPvYgeYVZDv90fCo-OzGQVImA6i4Vf5NLw3sFEuAf0JxksbU/s400/1.GIF)
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEizYgPVwgreThV-Pwhyphenhyphenoo5O6eu92nfE0mye3uJjQ1ZUDxP8L4lDUcicDKGOy0f9MkZ0MJdKBnV4fmDyCPagIOx07k5SqkP4s5EOJcM-KjcE5f8f8tlBLzIpNqOKv3XZUOmBxpWU_4m4fUI/s400/2.GIF)
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.
![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVA_S2jsm-4-gOlFOE5e87rEfsC8H-Ht-lECXJwuu9tCEm4wWR-G-3n4eLJP8emV8mN9xhlJLXItYdUDaaxHyp5DX331QdJHctDtKGReC2NveENpxJIbaf_9U6vEY1Y3n30KUGcJXJNPs/s400/1.GIF)
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();
}
}
**********************************************************************