April 28 2011

As an Avio consultant, I work with many different clients and with many different technologies.  During my current engagement, it dawned on me that something as simple as initializing a variable can be very different across the many technologies and programming languages that my coworkers and I encounter.  In this particular case, I wanted to perform a simple POC (Proof of Concept) in Oracle BPEL 11g using a BPEL 2.0 service.  In doing so, I came across the need to initialize a BPEL variable with an XML literal. 

Initializing a variable in this way provides the following benefits:

  • Ability to avoid SelectionFailure faults by initializing all or most important elements of the variable
  • Ability to quickly initialize a variable, once all sticking points are understood
  • Reduces the overall time taken to build and test a POC

Now as my gift to those that are Oracle BPEL 11g wise, n00bish, or in-between, I present as small example with some quick steps that walk through initializing a BPEL variable with an XML literal.  The example is performed with Oracle SOA Suite 11.1.1.4.0 (PS3) using a BPEL 2.0 service.

Example

  1. First we must view and understand the variable that needs to be initialized, in this case outputVariable.  The variable, outputVariable, will be returned upon the invocation of this synchronous BPEL service.  In order to properly populate outputVariable correctly the variable will need to be initialized first.  After it has been initialized various operations like appending array elements to outputVariable elements and such can be performed without issue. Here we have the Variables editor open for the BPEL service and can see a list of variables. 
    Variable Editor

    IMPORTANT - We now must take note that outputVariable has the namespace prefix "client", and that the type is "CreateBpmOrderBpelResponseMessage".  We need to know the namespace prefix of a BPEL variable in order to properly initialize the variable with an XML Literal.
  2. Now we see an open Assign activity editor for an Assign activity that is in the BPEL service.  In the Assign activity editor the Literal assignment icon is being dragged and dropped onto the payload element of outputVariable.  As we can see in the image below, payload contains the element type "client:readyOrdersResponsePayload".  We will need to view the WSDL and/or XSD for this BPEL service to see how to put together the XML literal in order to populate payload.

    Drag Literal


     
  3. The WSDL for our BPEL service reveals the following:

    WSDL

    In green - The output message type for the response of the BPEL service which is the message type "client:CreateBpmOrderBpelResponseMessage".
    In yellow - The message type "CreateBpmOrderBpelResponseMessage" has a part named "payload" and is of type "client:readyOrdersResponsePayload"
    In red - The XSD location and file (xsd/CreateBpmOrderBpel.xsd) that defines the "payload" type of "readyOrdersResponsePayload"
    In blue - The definition of the namespace prefix "client", which is xmlns:client="http://xmlns.oracle.com/OPA_BPMServices/OPA_BPMServices/CreateBpmOrderB…"
     
  4. After looking at the XSD file, highlighted in red (xsd/CreateBpmOrderBpel.xsd), I have viewed the XSD definition for the "readyOrdersResponsePayload" complex type and with the definition I can now create an empty XML literal of "readyOrdersResponsePayload" type which is the following:
    readyOrdersResponsePayload Literal
    <readyOrdersResponsePayload>
    	<numOfOrdersFound/>
    	<numOfOrdersCreatedInBpm/>
    	<allCreatedSuccessfully/>
    	<successfullOrdersList/>
    	<failedOrdersList/>
    </readyOrdersResponsePayload>
  5. We cannot simply paste an anonymous XML literal into the editor and expect it to populate payload properly.  As we saw earlier in step 2, payload is expecting the client prefix to be used.  In order to correctly create a valid XML Literal the correct namespacing and prefixing must be included.  The correct XML literal is look like the following:
     
    Correct XML Literal
    <client:readyOrdersResponsePayload 
    xmlns:client="http://xmlns.oracle.com/OPA_BPMServices/OPA_BPMServices/CreateBpmOrderBpel" 
    xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable">
    
    	<client:numOfOrdersFound/>
    	<client:numOfOrdersCreatedInBpm/>
    	<client:allCreatedSuccessfully/>
    	<client:successfullOrdersList/>
    	<client:failedOrdersList/>
    </client:readyOrdersResponsePayload>
    Note that the namespace prefix "client" definition is supplied in the root element of the XML literal, along with a default definition (xmlns).  Earlier in the BPEL service WSDL we noted that the "client" prefix information was highlighted in blue.

    Note that the "client" prefix is used for each element of the XML literal.

    The XML literal is valid and will now populate all elements of payload and in turn populate outputVariable.
    Literal
     
  6. Now that outputVariable is initialized numerous XPath functions and activities can be performed using the variable without issues being caused by operating on an uninitialized variable.
     

Summary

There are other ways to go about initializing variables in BPEL and, depending on the situation, some ways will be better than others.  We now have an example and the steps to initialize a BPEL variable with an XML Literal.  Just remember, it is our job as professionals to apply this approach when the correct situation calls for it.  I hope this information is found to be helpful, and best of luck from all of us here at Avio Consulting :)

Join the Conversation

Enter your first name. It will only be used to display with your comment.
Enter your email. This will be used to validate you as a real user but will NOT be displayed with the comment.
By submitting this form, you accept the Mollom privacy policy.