Saturday, August 15, 2009

Dynamically passing the file name to read adapter



Sync Read option in BPEL file adapter allows us to read the file from the middle of the process, this is different from the Read option which polls for the new files and is the start of the BPEL process.

As we design the file adapter for sync read it asks for the file name whcih is static, this means that only file with this given name will be read. Now suppose if we need to read files having same format but different names. How are we going to do that?

I found this question posted on the oracle forums http://forums.oracle.com/forums/thread.jspa?threadID=935976&start=0&tstart=0 that is when I worked on it and found the solution.

There's a simple way to do this. Whenever we create an adapter a fileAadapterOutboundHeader.wsdl file is created. If we open this file we'll find an inline schema having the fileName element. Below is the fileAadapterOutboundHeader.wsdl file:

<definitions
name="fileAdapter"
targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/file/"
xmlns:tns="http://xmlns.oracle.com/pcbpel/adapter/file/"
xmlns="http://schemas.xmlsoap.org/wsdl/" >

<types>
<schema attributeFormDefault="qualified" elementFormDefault="qualified"
targetNamespace="http://xmlns.oracle.com/pcbpel/adapter/file/"
xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:FILEAPP="http://xmlns.oracle.com/pcbpel/adapter/file/">
<element name="OutboundFileHeaderType">
<complexType>
<sequence>
<element name="fileName" type="string"/>
</sequence>
</complexType>
</element>
</schema>
</types>
<!-- Header Message -->
<message name="OutboundHeader_msg">
<part element="tns:OutboundFileHeaderType" name="outboundHeader"/>
</message>

</definitions>


While invoking the adapter we only need to set this fileName element with some dynamic generated value. Below are the steps to do this:

  1. Double click the invoke activity which invokes the sync read adapter.

  2. Go to adapters tab and click the torch icon.

  3. Click on Variables and create a new variable.

  4. Give some name like OutboundheaderVariable, choose message type and click the torch.

  5. Drill down to fileAadapterOutboundHeader.wsdl > Message Types and select OutboundHeader_msg. Click Ok till you are back in the diagram.

  6. Place an assign activity above this invoke and copy the file name to the OutboundHeaderVariable > fileName variable.

That's it.

Now we can give the name of the file at runtime as the input parameter or we can define deployment descriptor to give the file name.

We can also set the input/output directory at runtime which I'll write in my next post.

Using BPEL Variables in Transformations

Sometimes we do require to use the variables in the BPEL process into the xslt transformation but we cannot use bpws:getVariableData() function in the transform activity to fetch the values.

Here is a solution which I learned recently during my project.

The signature of the transform function is as below:
ora:processXSLT('template','input','properties'?).

Generally we only use the first two parameters i.e. template and input which is the name of the transformation file and the input parameter respectively. With the help of third parameter 'properties' we can pass the desired variables from the process to the xslt.

'properties' is an xml element which has name/value pairs. The xml is based on the following schema which we need to import in the BPEL process.

<xml version="1.0" encoding="windows-1252" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:p="http://schemas.oracle.com/service/bpel/common"
xmlns="http://schemas.oracle.com/service/bpel/common"
targetNamespace="http://schemas.oracle.com/service/bpel/common"
elementFormDefault="qualified">
<xsd:element name="parameters">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="item" minOccurs="1" maxOccurs="unbounded">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
<xsd:element name="value" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>

Now we can assign the values to the name/value pair and pass the parameters element into the xslt.

The sample xml will look like:

<parameters>
<item>
<name>parameter1</name>
<value>value1<value>
</item>
<item>
<name>parameter2</name>
<value>value2</value>
</item>
<parameters>


Suppose the name of the xsl file is Transformation.xsl and the source variable is source then the transformation function will look as below:
ora:processXSLT('Transformation.xsl', bpws:getVariableData('source'),bpws:getVariableData('parameters'))

To access the passed values in the transformation we have to add xsl:param tag in the xsl file.
Open the xsl in the source view and add the following tag:

<xsl:param name="parameter1"/>
<xsl:param name="parameter2"/>


Now we can access the variables in the transformation by appending the '$' sign before the parameter for eg: $parameter1, $parameter2.

 
Protected by Copyscape DMCA Copyright Detector