Oracle SOA Suite Online Training

Interested in learning Oracle SOA Suite 12c?
Learn from the author of this blog!
A complete and comprehensive course on the #1 platform on SOA - Oracle SOA Suite

Click here to find the complete course details
Click here to check the first session on Oracle SOA Suite 12c

================================================================================================

Exception while deploying UI project associated with a Human Task

Hi

You may sometimes encounter an exception while deploying the ADF UI project associated with a Human Task.

Exception looks like this:

Weblogic Server Exception: weblogic.application.ModuleException:
Caused by: weblogic.common.ResourceException: java.security.PrivilegedActionException: weblogic.common.ResourceException: java.security.PrivilegedActionException: weblogic.common.ResourceException: No credential mapper entry found for password indirection user=hr for data source Connection1
  See server logs or server console for more details.
weblogic.application.ModuleException:
Taskflow deployment failed to deploy to server. Remote deployment failed
####  Deployment incomplete.  ####
Remote deployment failed (oracle.jdevimpl.deploy.common.Jsr88RemoteDeployer)


To resolve this, just remove the reference to 'Connection1'(as indicated in the exception trace) from the connections.xml file. This can happen when you create the connection with that name, and later on, remove it.

Just remove the whole <Reference> tag for this connection. And it gets deployed this time.
Hope this helps you resolve the issue.

My Notes - 'Message throw & catch' VS 'Message Send & Receive' tasks - Oracle BPM Suite 11g

Both 'Message throw & catch' VS 'Message Send & Receive' tasks are used to invoke services/Processes asynchronously. That is, once a throw task is executed or a Send task is executed, the token does not wait for the response, rather, it continues to the next task.

Both act almost similarly, however there is a slight difference

You cannot use a Send task to invoke a process that is instantiated with a message start event
AND
You cannot use a throw task to invoke a process that is instantiated with a Message Receive task

All the 4 tasks can be at any place with in a process.
A process can be started using a Message Receive task / Message Catch Event
And at the same time, a Message Receive task / Message Catch Event can even be in mid-process

When a process encounters one of these 2 in the middle of the process, the token waits at that point till it receives that message(from either a Throw task or a Send task)

Message Send and Receive : these tasks can be at any position of the process
Description of Figure 6-22 follows

Message throw and catch task : These tasks can be at any position of the process
Description of Figure 6-25 follows

My Notes - Manual Task :: Oracle BPM Suite 11g

Manual task is something which is not managed by BPM runtime, but stil you may want to represent a particular manual activity in BPMN diagram.
For example, in a process, there may be a step where you need signature of the management after all the approvals, which is to be done specifically, seperate from BPM, meaning you need to take out the printout, sign it and submit. This is where a Manual task can be used. This doens't do anything with respect to BPM runtime, but acts as a place holder for some human Intervention.

Starting a BPM Process : Oracle BPM Suite 11g

A BPM Process can be started/triggered in one of the following ways

1. A Start event of type Message / Signal / Timer
2. A none start event followed by a User task with Initiator pattern
3. A none start event followed by a Receive Task. The Receive task must be configured to create a process instance(Instantiate property set)

You can even have a combination of the listed ways to start a process, in which case the process has multiple start events

When creating a process that has multiple end events, you must ensure that any tokens that reach a message end event were created by a message start. Ex, you cannot have a Message End Event for a process that starts with Timer Start Event

Manual Process VS Reusable Process : Oracle BPM Suite 11g

When you try to create a BPM Process, the editor gives you 4 options
Synchronous Process
Asynchronous Process
Manual Process
Reusable Process

The first 2 are obvious, with begin and end activities as 'Message Type'
But both Manual and Reusable processes has begin and end activities as 'None Events'. If both are same, then why two different options?

There is a difference

The Manual Process, though the start event is a None Event, has an Initiator node that starts the process. Also, A manual process' start event can be transformed into another type. Also, there can be multiple start events to the same process.
On the other hand, the Reusable Process starts with a None start event. And there wont be an initiator after that. If any initiator node is added, or the start event is changed, this no longer becomes a reusable process. A Reusable Process can be called from a 'Call' Activity

Grouping XML elelments using XSLT - xsl:for-each-group

This is an informal post on XSLT for-each-group which is very powerful function to group xml elements based on some criteria.

For Ex, you may want to convert a flat structure, typically returned by DB into an xml which is, say department wise. for-each-group is what you want

This sample is to convert a flat structure into a projectOwner wise grouping

Input

<MailPayload>                              
    <ActivityPayload>                              
        <ActivityId>101</ActivityId>      
        <ActivityName>T1</ActivityName>      
        <ActivityOwner>Act1Owner</ActivityOwner>      
        <ProjectId>1001</ProjectId>          
        <ProjectName>Prj1</ProjectName>      
        <ProjectOwner>PrjOwner</ProjectOwner>      
        <ApprovalStatus>some desc 1</ApprovalStatus>
        <Comments>comments1</Comments>
    </ActivityPayload>                              
    <ActivityPayload>                              
        <ActivityId>102</ActivityId>      
        <ActivityName>T2</ActivityName>      
        <ActivityOwner>Act2Owner</ActivityOwner>      
        <ProjectId>1002</ProjectId>          
        <ProjectName>Prj2</ProjectName>      
        <ProjectOwner>PrjOwner</ProjectOwner>      
        <ApprovalStatus>some desc 2</ApprovalStatus>
        <Comments>comments2</Comments>
    </ActivityPayload>                              
</MailPayload>

Ouput Format required

<?xml version="1.0" encoding="UTF-8"?>
<MailPayload>
<ProjectOwnerWise>
<ProjectOwner>PrjOwner</ProjectOwner>
<Activities>
<IndActivity>
<ActivityId>101</ActivityId>
<ActivityName>T1</ActivityName>
<ProjectId>1001</ProjectId>
<ProjectName>Prj1</ProjectName>
<Comments>comments1</Comments>
</IndActivity>
<IndActivity>
<ActivityId>102</ActivityId>
<ActivityName>T2</ActivityName>
<ProjectId>1002</ProjectId>
<ProjectName>Prj2</ProjectName>
<Comments>comments2</Comments>
</IndActivity>
</Activities>
</ProjectOwnerWise>
<ProjectOwnerWise>
<ProjectOwner>PrjOwner2</ProjectOwner>
<Activities>
<IndActivity>
<ActivityId>103</ActivityId>
<ActivityName>T3</ActivityName>
<ProjectId>1002</ProjectId>
<ProjectName>Prj3</ProjectName>
<Comments>comments2</Comments>
</IndActivity>
</Activities>
</ProjectOwnerWise>
</MailPayload>

XSLT
-------

<?xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/">
   <MailPayload>
<xsl:for-each-group select="/MailPayload/ActivityPayload" group-by="ProjectOwner">
   <ProjectOwnerWise>
<ProjectOwner>
 <xsl:value-of select="current-grouping-key()"/>
</ProjectOwner>
<Activities>
 <xsl:for-each select="current-group()">
  <IndActivity>
<xsl:copy-of select="ActivityId|ActivityName|ProjectId|ProjectName|ReviewerDecision|Comments"/>
  </IndActivity>
 </xsl:for-each>
</Activities>
</ProjectOwnerWise>
</xsl:for-each-group>
   </MailPayload>
  </xsl:template>
</xsl:stylesheet>

for-each-group groups the entire xml as per the group-by value defined and loads in memory
ex : <xsl:for-each-group select="/MailPayload/ActivityPayload" group-by="ProjectOwner">  -- ProjectOwner here

current-grouping-key() gives the values of all ProjectOwner
current-group() lists all the tags defined in a particular set