Posts Tagged ‘BPM’


Using WAPI in Oracle BPM

April 14th, 2010 by Mark Peterson • No Comments »

There are many business use cases that require using WAPI  to implement Oracle BPM. WAPI is a low-level API that involves some basic web related tools to provide special functionality needed for your business process.  Just providing these tools without explaining why they are needed won’t help you learn how to use these tools when they are needed. There are probably many more applications for using WAPI. These are just some of the use cases I’ve come upon that required me to use WAPI.
  • The business has implemented business processes that have work items that are somehow related to each other. These business processes may be hierarchical in nature such as flight planning, trips and legs; or contains work items that are related together such as line items of a particular invoice or order.
  • Business organizations wish to group tasks according to management oversight, region or by some other factor.
  • The business wants to provide short-cuts to users so they don’t have to jump around to find related instances and have special UI requirements to provide this functionality. This functionality may require implementing special graphical UIs such as adobe FLEX or require jumping around from one particular work item to another. Going through the in-box view to open an instance each time is not desired or  feasible .
WAPI provides a mechanism to create a list of related instance that you can navigate in and out of from virtually anywhere within the business process. This could be from within a screenflow, some external UI, COTS applet, or Adobe FLEX. I have used WAPI from all of these types of examples and it is easy to do once you know how these tools work.

WAPI provides an mechanism to launch into a particular instance from HTML using javascript or hidden forms.  I have two versions of this code, one for BPM version 5.x and the other for 6.x. The two key components is the action URL link and the instance stamp.

BPM version 5.x:

<form method="post" action="<%= URLForAction.instanceProcess(request)%>" name="instanceActionsForm">
<input type="hidden" name="instanceStampId" />
<input type="hidden" name="nextInstanceStampId" />
<input type="hidden" name="actionId" />
</form>

BPM version 6.x:


function runTask(id) {
 var baseUrl = "<%=UrlActions.runTask()%>";
 var instanceStampId = id;
 var itemId = 0;
 var url = "<%=request.getContextPath()%>" + baseUrl +  "&<%=UrlActions.INSTANCE_STAMP_ID%>" + "=" +  encodeURIComponent(instanceStampId) +  "&<%=UrlActions.ITEM_ID%>" + "=" + itemId;
 window.open(url);
 }
 

Getting a list of related instances and pulling the instanceStamp from the instances is complicated.  I’ll have to address that later in a separate blog. It involves using BusinessProcess.getInstanceByActivity or BusinessProcess.getInstanceByFilter. There’s a lot to know about using these methods so I won’t go into it now. If you know how to use these methods then all you may need help on is creating an instance stamp. This can be done from the list of instances returned from these methods. To create the instance Stamp just use:

InstanceStamp instanceStamp =InstanceStamp.create(instanceId : instance.id, activityName : instance.activityName).getId();

Using WAPI to open instances can be dangerous. BPM keeps track of open instances. These open instances are locked. When you jump from instance to instance without closing out of the associated screen-flow you’ll lock up a bunch of instances. This will preventing people from gaining access to them later on.  The way to avoid this is to submit or post to the open instance before you open another one. This creates problems if you can’t simply cancel out of the open instance.

If you can simply cancel the open instance and you can be sure the cancel will work in most all cases, then you simply need to submit to the form before you open the new instance. If you can’t be certain of this, then I recommend you use a simple AJAX method to do this. You just need to parse the return document to be sure the post worked before you open a new instance. Here’s some code you can use to do this:

postLoc = "<f:postResults/>";
function cancelScreenFlow() {
    var xmlHTTP = new ActiveXObject("Microsoft.XMLHTTP");
    xmlHTTP.open("POST",postLoc,false);
    xmlHTTP.send();
    var xslresponse = xmlHTTP.responseText;
}

Hopefully you find this blog useful. I'm not sure BPM product management realizes how common these use cases are. So please let me know if you have any interesting use cases and how WAPI was used to solve your problem.  Solving certain BPM use cases with WAPI has been indispensable to me.  I'm always excited to learn of similar situations as the ones I've identified here.

No Comments »

 

Customizing Oracle BPM using Worklist Decorator

February 19th, 2010 by Mark Peterson • No Comments »

Customizing the Oracle BPM Worklist can be done by creating and adding a Worklist Decorator class to your configuration. There are many reasons why you may want to do this. You may want to color code low, medium and high priority work items, format a display value with an icon or image, or you may just want to alternately shade lines in the BPM workspace as shown below.

dec_worklist

Oracle BPM versions 6.x to 10g (Aqualogic BPM )  allow you to do this.  For the complete java class see WorkListDecorator Sample Code below. This code implements three methods that can be used to alter the way the work list appears these methods are as follows:

public String getCellStyle(String viewName, InstanceInfo instance, Column columnInfo, int rowNo) ;

public String getRowStyle(String viewName, InstanceInfo instance, int rowNo) ;

public String getValue(String viewName, InstanceInfo instance, Column columnInfo, Locale locale, String value, int rowNo) ;

These three methods are call-back methods used by the BPM Workspace application to get custom attributes associated with the work-list.  The input parameters contain pertinent important information you can use to decorate the work-list as required. This information is described in the table below.

Field Name Description
String viewName Name of the view. The default work-list name is unified-inbox. If you create custom views, this will be populated with the name of the custom view.
InstanceInfo  instanceInfo Contains detailed information about the instance; like activity name, instance name, instance variables and process details.
Column Contains information about the column, like column size, format and ID.
Locale locale Contains information about the locale
String value Contains the display value (String contents) of the field value.
int rowNo The row number starting with zero.

<br/>

To register your custom decorator object with your workspace, locate the workspace.properties files and modify the entry as show below. This file is located in the <BPM_HOME>/webapps/workspace/WEB-INF directory

fuego.workspace.worklist.styleResolverClassname=com.ssglimited.workspace.view.WorkListDecoratorImpl

You will need to compile your WorkListDecorator object and place the complied java object (.class) or jar file in the <BPM_HOME>/webapps/workspace/WEB-INF/classes or <BPM_HOME>/webapps/workspace/WEB-INF/lib directory. If you are using BPM in an application server like Weblogic, you will need to re-build the workspace and redeploy the workspace ear file. This can be done in the Process Administrator.

If you are having difficulty getting this to work, turn on the Workspace log. For enterprise versions, simply look in the App Server console or edit the logging in the workspace.properties file. For Studio, refer to my blog post on Workspace Logging.

WorkListDecorator Sample Code for Shading lines in the Work-list

</code>

package com.ssglimited.workspace.view;

import java.util.Locale;

import fuego.workspace.model.view.WorkListDecorator;
import fuego.papi.InstanceInfo;
import fuego.papi.Presentation.Column;
public class WorkListDecoratorImpl implements WorkListDecorator{

public String getCellStyle(String viewName, InstanceInfo instanceInfo, Column columnInfo, int rowNo) {
return "";
}
public String getRowStyle(String viewName, InstanceInfo instanceInfo, int rowNo) {
String inlineStyle="background-color: #ffff"; //White
if (rowNo % 2 > 0) {
inlineStyle="background-color: #f8f8f8"; //Gray
}
return inlineStyle;
}

public String getValue(String viewName, InstanceInfo instance, Column columnInfo, Locale locale, String value, int rowNo) {
// System.out.println("***Mark Test **** "+viewName+" column"+ arg2.getId()+"arg4"+ value +" "+rowNo);
return value;

}
}

No Comments »

 

How to Turn on Workspace Logging in Oracle BPM Studio (10g or 6.x)

February 19th, 2010 by Mark Peterson • 3 Comments »

If you are having trouble with the Workspace in Oracle BPM Studio, it is easy to turn on logging – once you know how.  You might need to do this if you are customizing the workspace or adding a custom decorator to the worklist panel.

To access the logs, locate the eclipse.ini file and add the following line to the beginning of the file. Do not add any blank lines or spaces before or after this entry. This file is located in the <OracleBPMStudioHome>/eclipse directory.

-consoleLog

Next time you restart BPM studio, a console window will open with Studio. Logging from the workspace, Tomcat and eclipse will go into the console. This works with all versions of Oracle BPM running in eclipse; Oracle BPM 10g and Aqualogic BPM 6.x

3 Comments »

 

Creating Oracle BPM PAPI Clients

February 17th, 2010 by Mark Peterson • 1 Comment »

To interface Oracle BPM 10g (or AquaLogic BPM 6.x or Fuego) to external systems you may want to use PAPI.  PAPI is the name for the BPM API. It is a carry over from the Fuego days and stood for Portal API.  This is a good name for the API  since the Portal (or workspace) uses PAPI to interface with the BPM engine. This API is available for you to use as well.

Since the workspace uses it, anything you can do from the workspace you can do through PAPI. Likewise most things you can do from the Process Administrator, you can do from PAPI as well. Some common things you can do through PAPI.

  • Create a new process instance or work item.
  • Pause, suspend and resume process instances.
  • Interact with an external UI activity from an external UI.
  • Notify a process that some event occurred and pass in arguments to the process.
  • Create user, roles and assign users to roles.

PAPI is the most versatile tool to use to interface client apps to BPM.  If you just want to notify an instance, you can expose the process and notification waits using BPM web-services. You just have to set a switch to do this and use the WSDL to interface with the process. But you can’t do much more than this with BPM web-services. If you need more functionality, you will need to use PAPI.

I will give you the basic tools to do these things and more from a PAPI client. At the end of this blog, you will find a sample PAPI client Java code. I’ve used this client object to develop client applications. Over the years I’ve added some functionality and taken some away. This has most of what you’ll need.

Running a PAPI Client against Enterprise Standalone

It is difficult to use PAPI to interact with a process running in Studio. You will need to deploy your process to Enterprise Standalone or WebLogic. If you deploy your process to Enterprise Standalone, you will be able to connect to PAPI simply by referring to a copy of directory.properties file.  This file is located in the BPM installation directory.  Before you copy this file be sure it is valid.  This file is created by the Admin tool when it creates and configures the directory.  If you can connect to the directory and processes are being deployed and working then you have a valid directory.properties file.

Running a PAPI Client against a Weblogic Server

If  you’re trying to connect to a process running inside WLS, you need to provide a JNDI name and context factory. All you need to do is include the weblogic.jar file (or wlclient.jar)  with your PAPI client code and specify the connection properties.  The connection properties are stored in a file and referenced by the JNDI context using the following JRE system property.

-Dfuego.j2ee.initialctx.file=c:\bea\config\papiJndi.properties

Place these contents into the referenced file; i.e. papiJndi.properties.  You’ll need to modify the host name and port number according to the Weblogic container settings used by the BPM engine.

# Weblogic JNDI configuration to connect to the weblogic server
java.naming.factory.initial=weblogic.jndi.WLInitialContextFactory
java.naming.provider.url=t3://localhost:7001
# example java.naming.provider.url=t3://localhost:7001

You will also need to do this if your PAPI client is running in a different container than where the PAPI engine is running.  To make this work all you have to do is modify the setDomainEnv.cmd file by adding the JRE system property. This file is located next to the startWeblogic script,  in the user_projects/domains/<your-domain>/bin directory.

Sample PAPI Client Code (Java)

Here’s an example Java client class I find helpful getting started. It contains methods for connecting to PAPI,  searching for instances, executing global activities, and call-back methods for interacting with external interactive activities.  This code will compile if you include the fuegopapi-client.jar file with your code.

</code>

package com.ssglimited.businessServices;

import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import fuego.lang.ConnectionPassport;
import fuego.papi.Arguments;
import fuego.papi.BatchOperationException;
import fuego.papi.Comparison;
import fuego.papi.Filter;
import fuego.papi.InstanceInfo;
import fuego.papi.OperationException;
import fuego.papi.ProcessService;
import fuego.papi.ProcessServiceSession;
import fuego.papi.SearchScope;
import fuego.papi.VarDefinition;

/**
*
* Provide convenience for creating ALBPM PAPI Web Service objects needed
* to utilize External Task functionality.
*
* @author Mark Peterson
*
*/
public class PapiServiceHelper {

//    private static final Log log = LogFactory.getLog(PapiServiceHelper.class);
//    private ProcessService service = null;
private String endPointUrl = "", userId="", password="";
private ProcessServiceSession session = null;
private String directoryFile;

/**
*
* Construction will initialize the necessary PAPI objects for subsequent usage
*
* @param String containing URL of ALBPM engine SOAP server
* @param String containing userid for PAPI connection
* @param String with password
* @throws IllegalStateException if private variables not initialized
* @throws RemoteException as a consequence of using PAPI service
* @throws OperationException
*/
public PapiServiceHelper (){

}

/**
*
* Initializes the necessary PAPI objects for subsequent usage
*
* @return ProcessService used in subsequent operations
* @throws IllegalStateException if private variables not initialized
* @throws RemoteException as a consequence of using PAPI service
* @throws OperationException
*/
private void initSession() throws RemoteException, OperationException {

// Creates the properties to create the ProcessService.
Properties properties = new Properties();

// Set the directory Id that we use.
properties.setProperty(ProcessService.DIRECTORY_ID, "default");

// Set the directory file that we use, this file is in the classpath.
// The directory properties can either be in the classpath, or be a file location.
properties.setProperty(ProcessService.DIRECTORY_PROPERTIES_FILE, "C:\\workspace\\papiSample\\config\\directory.properties");

// Set the maximum size of the instance cache per process.
properties.setProperty(ProcessService.INSTANCES_CACHE_SIZE, "50000");

// Set the folder where PAPI will store catalogs and temporary files.
properties.setProperty(ProcessService.WORKING_FOLDER, "c:\\bea\\temp");

// Set that the sessions will be notified when an instance is updated.
properties.setProperty(ProcessService.UPDATE_SESSIONS_VIEWS, "true");

System.out.println("ProcessService properties=\n"+properties);
// Creates the ProcessService.
ProcessService processService = ProcessService.create(properties);

// Creates the passport for the user which will connect.
ConnectionPassport passport = processService.createPassport(userId);

// Sets the passpord of the user.
passport.setPassword(password);

// Completes the given passport for authentication purposes.
passport.fillPassport();

// Creates a new session.
// The arguments are the passport of the user and the host where the user is connected from.
session = processService.createSession(passport, "localhost");

}

public Map runGlobal(String processId, Map params) throws RemoteException, OperationException {
if (session==null) initSession();

Arguments args = Arguments.create();
Iterator itParams = params.keySet().iterator();
while(itParams.hasNext()) {
String key = (String)itParams.next();
args.putArgument(key, params.get(key));
}

session.runGlobalActivity(processId, args);

Map returnMap = new HashMap();
String[] argNames = args.getArgumentsName();
for(int i=0;i<argNames.length;i++){
returnMap.put(argNames[i], args.getArgument(argNames[i]));
}
return (Map)returnMap;
}

public List getCodes( String type ) throws OperationException, RemoteException {
if (session==null) initSession();

Arguments args = Arguments.create();
args.putArgument("type", type);

session.runGlobalActivity("/StaffReviewProcess/GetCodes", args);

List codesList = (List) args.getArgument("codesList");
System.out.println("CodesList="+codesList);
return codesList;
}

/**
*
* The PAPI <code>prepareExternalActivity</code> service is invoked for the input instance/activity.
*
* @param String containing instance ID
* @param String containing External Task activity name
* @param KeyValuePair array with input arguments of prepare method
* @return KeyValuePair containing PAPI session ID
* @throws IllegalStateException if private variables not initialized
* @throws RemoteException passed along from PAPI
* @throws OperationException
*/
public Arguments runPrepare(String instanceId,String activityNm,Arguments inArgs) throws IllegalStateException, RemoteException, OperationException {

if (session==null) initSession();
Arguments outArgs = session.prepareExternalActivity(instanceId, activityNm, inArgs);
return outArgs;
}

/**
*
* The PAPI <code>commitExternalActivity</code> service is invoked for the input instance/activity.
*
* @param String containing instance ID
* @param String containing External Task activity name
* @param KeyValuePair array with input arguments of commit method
* @throws IllegalStateException if private variables not initialized
* @throws RemoteException passed along from PAPI
* @throws OperationException
*/
public InstanceInfo runCommit(String instanceId,String activity,Arguments inArgs) throws IllegalStateException, RemoteException, OperationException {
if (session==null) initSession();
return session.commitExternalActivity(instanceId, activity, inArgs);
}

public InstanceInfo[] findInstanceByFilter(String activity) throws BatchOperationException, RemoteException, OperationException {
if (session==null) initSession();
String[] processes = session.getProcessIds();
System.out.println("Processes="+processes);
// Search instances which begin with a specific string in an external variable value and
// stay in a specific activity.
Filter filter = ProcessService.createFilter();
SearchScope searchScope = new SearchScope(fuego.papi.ParticipantScope.PARTICIPANT_ROLES,
fuego.papi.StatusScope.ALL);
filter.setSearchScope(searchScope);
filter.setMatchAll(true);
//         filter.addAttribute(session.getVar("MyExternalVariable"), Comparison.BEGIN_WITH, "Fuego");
filter.addAttribute(session.getVar(VarDefinition.ACTIVITY_ID), Comparison.IS, activity);

// Search instances.
InstanceInfo[] instances = session.getInstancesByFilter(processes, filter);
//         instances[0].getVar(arg0, arg1)
return instances;
}

}

<code>

package com.bea.bootcamp.businessServices;//import javax.xml.rpc.ServiceException;
import java.rmi.RemoteException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;import fuego.lang.ConnectionPassport;
import fuego.papi.Arguments;
import fuego.papi.BatchOperationException;
import fuego.papi.Comparison;
import fuego.papi.Filter;
import fuego.papi.InstanceInfo;
import fuego.papi.OperationException;
import fuego.papi.ProcessService;
import fuego.papi.ProcessServiceSession;
import fuego.papi.SearchScope;
import fuego.papi.VarDefinition;

/**
*
* Provide convenience for creating ALBPM PAPI Web Service objects needed
* to utilize External Task functionality.
*
* @author BEA Professional Services
*
*/
public class PapiServiceHelper {

//    private static final Log log = LogFactory.getLog(PapiServiceHelper.class);
//    private ProcessService service = null;
private String endPointUrl = “”, userId=”", password=”";
private ProcessServiceSession session = null;
private String directoryFile;

/**
*
* Construction will nitialize the necessary PAPI objects for subsequent usage
*
* @param String containing URL of ALBPM engine SOAP server
* @param String containing userid for PAPI connection
* @param String with password
* @throws IllegalStateException if private variables not initialized
* @throws RemoteException as a consequence of using PAPI service
* @throws OperationException
*/
public PapiServiceHelper (){

}

/**
*
* Initializes the necessary PAPI objects for subsequent usage
*
* @return ProcessService used in subsequent operations
* @throws IllegalStateException if private variables not initialized
* @throws RemoteException as a consequence of using PAPI service
* @throws OperationException
*/
private void initSession() throws RemoteException, OperationException {

// Creates the properties to create the ProcessService.
Properties properties = new Properties();

// Set the directory Id that we use.
properties.setProperty(ProcessService.DIRECTORY_ID, “default”);

// Set the directory file that we use, this file is in the classpath.
// The directory properties can either be in the classpath, or be a file location.
properties.setProperty(ProcessService.DIRECTORY_PROPERTIES_FILE, “C:\\workspace\\FtMeade\\papiSample\\config\\directory.properties”);

// Set the maximum size of the instance cache per process.
properties.setProperty(ProcessService.INSTANCES_CACHE_SIZE, “50000″);

// Set the folder where PAPI will store catalogs and temporary files.
properties.setProperty(ProcessService.WORKING_FOLDER, “c:\\bea\\temp”);

// Set that the sessions will be notified when an instance is updated.
properties.setProperty(ProcessService.UPDATE_SESSIONS_VIEWS, “true”);

System.out.println(“ProcessService properties=\n”+properties);
// Creates the ProcessService.
ProcessService processService = ProcessService.create(properties);

// Creates the passport for the user which will connect.
ConnectionPassport passport = processService.createPassport(userId);

// Sets the passpord of the user.
passport.setPassword(password);

// Completes the given passport for authentication purposes.
passport.fillPassport();

// Creates a new session.
// The arguments are the passport of the user and the host where the user is connected from.
session = processService.createSession(passport, “localhost”);

}

public Map runGlobal(String processId, Map params) throws RemoteException, OperationException {
if (session==null) initSession();

Arguments args = Arguments.create();
Iterator itParams = params.keySet().iterator();
while(itParams.hasNext()) {
String key = (String)itParams.next();
args.putArgument(key, params.get(key));
}

session.runGlobalActivity(processId, args);

Map returnMap = new HashMap();
String[] argNames = args.getArgumentsName();
for(int i=0;i<argNames.length;i++){
returnMap.put(argNames[i], args.getArgument(argNames[i]));
}
return (Map)returnMap;
}

public List getCodes( String type ) throws OperationException, RemoteException {
if (session==null) initSession();

Arguments args = Arguments.create();
args.putArgument(“type”, type);

session.runGlobalActivity(“/StaffReviewProcess/GetCodes”, args);

List codesList = (List) args.getArgument(“codesList”);
System.out.println(“CodesList=”+codesList);
return codesList;
}

/**
*
* The PAPI <code>prepareExternalActivity</code> service is invoked for the input instance/activity.
*
* @param String containing instance ID
* @param String containing External Task activity name
* @param KeyValuePair array with input arguments of prepare method
* @return KeyValuePair containing PAPI session ID
* @throws IllegalStateException if private variables not initialized
* @throws RemoteException passed along from PAPI
* @throws OperationException
*/
public Arguments runPrepare(String instanceId,
String activityNm,
Arguments inArgs)
throws IllegalStateException, RemoteException, OperationException {

if (session==null) initSession();
Arguments outArgs = session.prepareExternalActivity(instanceId, activityNm, inArgs);
return outArgs;
}

/**
*
* The PAPI <code>commitExternalActivity</code> service is invoked for the input instance/activity.
*
* @param String containing instance ID
* @param String containing External Task activity name
* @param KeyValuePair array with input arguments of commit method
* @throws IllegalStateException if private variables not initialized
* @throws RemoteException passed along from PAPI
* @throws OperationException
*/
public InstanceInfo runCommit(String instanceId,
String activity,
Arguments inArgs)
throws IllegalStateException, RemoteException, OperationException {
if (session==null) initSession();
return session.commitExternalActivity(instanceId, activity, inArgs);
}

/**
*
* Kill PAPI session
* @throws BatchOperationException
* @throws OperationException
* @throws RemoteException
*
* @throws RemoteException passed along from PAPI
*
*/
//    public void closeSession() throws RemoteException {

//        if (service != null && sessionId != null) {
//        service.close(sessionId);
//            log.info(“service session closed…”);
//        }

//    }
public InstanceInfo[] findInstanceByFilter(String activity) throws BatchOperationException, RemoteException, OperationException {
if (session==null) initSession();
String[] processes = session.getProcessIds();
System.out.println(“Processes=”+processes);
// Search instances which begin with a specific string in an external variable value and
// stay in a specific activity.
Filter filter = ProcessService.createFilter();
SearchScope searchScope = new SearchScope(fuego.papi.ParticipantScope.PARTICIPANT_ROLES,
fuego.papi.StatusScope.ALL);
filter.setSearchScope(searchScope);
filter.setMatchAll(true);
//         filter.addAttribute(session.getVar(“MyExternalVariable”), Comparison.BEGIN_WITH, “Fuego”);
filter.addAttribute(session.getVar(VarDefinition.ACTIVITY_ID), Comparison.IS, activity);

// Search instances.
InstanceInfo[] instances = session.getInstancesByFilter(processes, filter);
//         instances[0].getVar(arg0, arg1)
return instances;
}

/**
* @return the endPointUrl
*/
public String getEndPointUrl() {
return endPointUrl;
}

/**
* @return the password
*/
public String getPassword() {
return password;
}

/**
* @param password the password to set
*/
public void setPassword(String password) {
this.password = password;
}

/**
* @return the userId
*/
public String getUserId() {
return userId;
}

/**
* @param userId the userId to set
*/
public void setUserId(String userId) {
this.userId = userId;
}

/**
* @param endPointUrl the endPointUrl to set
*/
public void setEndPointUrl(String endPointUrl) {
this.endPointUrl = endPointUrl;
}

public String getDirectoryFile() {
return directoryFile;
}

public void setDirectoryFile(String directoryFile) {
this.directoryFile = directoryFile;
}

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
PapiServiceHelper helper = new PapiServiceHelper();
helper.setPassword(“p”);
helper.setUserId(“Colleen”);
try {
helper.findInstanceByFilter(“WorkOnTask”);
} catch (BatchOperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (OperationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

1 Comment »

 

Protected: Coming Soon: Leveraging BPM 11g Capabilities – Argument Mapping

February 11th, 2010 by Mark Peterson • Comments Off

This post is password protected. To view it please enter your password below:


Comments Off

 

Oracle BPM 11g Preview at Oracle Open World 2009

October 13th, 2009 by Mark Peterson • 4 Comments »

I think the wait was worth it. After BEA’s AquaLogic BPM (formerly Fuego) was purchased by Oracle, the product became part of the Oracle Fusion Middleware suite. But instead of being in the lime-light of Fusion, for the past year it was hardly mentioned. The Marketing story focused on SOA, Tuxedo, WebCenter and WebLogic. For BPM pure-plays, BPM has its own story, a good story; one with business centered not IT centered values.

Well there it is! It re-appeared in a General Session at Oracle Open World 2009 with all the other Fusion Middleware products. The product development team must have been busy. They took Aqualogic BPM apart and re-assemble it with more features and benefits for the business than ever before. Eduardo Chiocconi and Mariano Benitez demonstrated the new version of BPM at the Moscone West Exhibit hall. The product has been integrated with JDeveloper and Enterprise Manager. It is part of the Fusion middleware product suite and seems to have more capability than before.

For businesses, the need for a rich user-experience has been achieved. The BPM studio is integrated with the ADF development environment; a JSF-based technology. You can develop UIs from studio or import ADF projects and use them in interactive BPM activities. This segmentation of the business process from the UI should also allow the UI to take advantage of externally developed UIs; something that was lacking before in BPM. This segmentation may make it easier to integrate legacy UI applications, perhaps even UIs not based in ADF.

BPM 11g has also improved on the type of roles available for activities. You can now specify interactive tiers for approval or review activities. For instance, if the CFO needs to approve purchases over $100,000, then the work-item can be escalated without coding specialized escalation processes to route the purchase orders based on these rules. These rules of who and when people need to review or approve work can change. BPM now handles this without the need for re-writing and re-deploying the new processes. An administrator can simple re-configure the user-roles.

BPM 11g has many other features as well. It has a state-of-the-art rules engine. It can handle most business rules and conditional requirements without the need to integrate third-party rules engines. It has a new milestone activity switch to enhance business activity monitoring and instance processing by the workspace. It also has integrated Oracle BAM to enhance the ability to obtain information about the business process.

BPM 11g adds these features on top of the 10g BPM feature set, so the return for implementing BPM is improved. I was only able to get a glimpse of the new Oracle BPM 11g, but from this glimpse I am excited about the possibilities. Oracle 11g will not be available for download until Feb 2010. I am looking forward to getting my hands on the new version and feel at this time, the wait will be worth it.

4 Comments »

 

Oracle spotlights BPM in Fusion Middleware Story

October 12th, 2009 by Mark Peterson • No Comments »

After hearing the Fusion Middleware story many times now, I am so relieved and happy to see Business Process Management (BPM) in the spot light once again.  During the Oracle Open World 2009 General Session “Oracle Fusion Middleware 11g Foundation for Innovation” we heard about SOA, the Enterprise 2.0 Portal and Tuxedo; but what is that? We were given a demo of the new Oracle BPM 11g application development environment. We got to see swim-lanes, process models, simulations and dash-boards. They showed how you can obtain process model metrics and key performance indicators for your process.  They made significant improvements over the way BPM integrates with applications and systems.

I feel this completes the Oracle’s Fusion Middleware Story. BPM spans the entire Fusion product suite and needs to be in the spot-light. No other application takes a holistic view of the enterprise and provides a coherent platform to integrate business application the way the business needs them.  We’ve heard many times that it’s not about IT anymore. That is certainly true. It should be about Business Processes and BPM solutions needs be part of the strategy.

No Comments »

 

Oracle 11g Strategies for BPM: A Step in the Right Direction?

October 9th, 2009 by Mark Peterson • No Comments »

With Oracle Open World 2009 around the corner, it will be interesting to see how the BPM community reacts to the changes being offered. I have found the story around Oracle Fusion a bit confusing, especially how it plays in BPM solution space. The BPM pure plays, like AquaLogic and Lambardi had a clear vision and strategy. Now that Oracle has acquired Aqualogic (formerly Fuego) BPM, Oracle should have a strong hold on this market. Without some course correction on Oracles part, I feel the BPM strategy may get blurred. The jury is still out. I am hopeful but concerned.

More to come.

No Comments »

 

Oracle OpenWorld Updates Start Sunday

October 7th, 2009 by Robert McMillen • No Comments »

This Sunday, Oracle OpenWorld will be kicking off in San Francisco.  Five of us will be attending from SSG and several of us will be providing udpates via our blog.  The event will continue through Thursday afternoon at the Moscone Center.

The five of us will be focusing on the general sessions and attending dozens of presentations on Service Oriented Architecture, Business Intelligence, Communications Billing and Revenue Management, and Business Process Management.

This year I’m hoping to include more pictures in the blog, so I encourage you to subscribe and get our updates from each day of the conference.

As a preview, Sunday we will be attending several Special Interest Groups (SIG’s) and the Oracle Partners Network meeting.

No Comments »

 

Business Process Management Summary

June 2nd, 2009 by Mark Peterson • No Comments »

Over the last 8 blog postings, I have discussed how implementing a Process Oriented Architecture (POA) for Business Process Management (BPM) initiatives provides organizations with the agility needed to incrementally build out business processes. Companies can make improvements over time as the business is able to digest change. Yet the organization can leverage every process automation investment because the architectural structure binds them together to work as a whole. In this last entry in the series, I will summarize how BPM – using POA – can yield excellent savings for companies in any industry. Implementing BPM without POA strategy can save companies money by improving operational efficiencies within the organization. Using POA, companies attain further savings by the way BPM is implemented.  

 
POA allows businesses to realize immediate gains from BPM while putting the company in a position to evolve and expand these processes consistently and continuously within and across an organization. Businesses look to IT to increase productivity through automated systems and also expect IT to find ways to reduce the cost to implement these systems. Implementing a POA for BPM saves companies money by reusing common process designs for different departments.
 
POA can be an enabler for many BPM implementations. The basic process is the same, but can be customized to the specific needs of departments and individuals while providing the means to scale BPM across the organization inexpensively. Without the right architecture, an organization would have BPM in silos; separate, vertical divisions with no connection, in which case BPM may prove to be cost-prohibitive.
 
BPM often starts within a department – such as Procurement or Legal where human error can cause critical delays. As organizations dive into any single process to automate it, they find that it spans across departments or communities. Automated tasks such as order entry and document approval cut across most industries. However, these applications only improve productivity for “local” or single-department business problems. The productivity for the given task was greatly improved, but it didn’t solve company-wide business problems such as: Did the order make it to fulfillment? Did the offer letter get processed properly by HR? Did the final report get assembled and submitted on time with proper management oversight and control? 
 
Gaining real productivity improvements and cost savings comes from having local processes working efficiently, and having a connection between each of the local processes. BPM and POA connect all of the vertical departments together, giving C-level executives the ability to review the entire organization to see where the bottlenecks are, where inefficiencies exist and what the cost drivers might be.
 
A key to saving money is how the BPM system itself is planned and architected. Decoupling the views and back-end systems from the business process itself utilizes reusability. In BPM system architecture, reusability means that the basic process can be customized for different communities or departments in an organization. 
 
POA organizes the process, views and the calls to the back-end systems by tightly or loosely coupling these objects as it make sense for the business. Once these components are organized in this way, current and future needs of top-level management, individual contributors and communities of users can be accounted for. The design or implementation of this POA will yield the most optimally efficient system possible because it anticipates business change. By finding commonality where it makes sense and structuring the design logically, POA can achieve what has been done for business applications (using SOA) in the realm of BPM.

No Comments »