Search code examples
loopswso2vfs

WSO2 iterative get-property from vfs file


I'm using WSO2 with the VFS. I need to take the incoming file, fileinput.xml and log the id fields together. The VFS is enabled and functional and when I move my fileinput.xml into my test_in folder it appropriately gets handled and put into test_out or test_failure correctly. I've read a lot of online documentation but have been unable to wrap my head around how to do the following.

My Question is

  1. How do I get a property from my fileinput.xml ?
  2. How do I iterate over the ids and concatenate them together in a log?

fileinput.xml

<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header/>
    <soapenv:Body>
        <customers>
            <customer>
                <id>testid1</id>
                <prop1>a</prop1>
                <prop2>b</prop2>
            <customer/>
            <customer>
                <id>testid2</id>
                <prop1>3</prop1>
                <prop2>4</prop2>
            <customer/>
        </customers>
    </soapenv:Body>
</soapenv:Envelope>

My wso2 proxy file

<?xml version="1.0" encoding="UTF-8"?>
<proxy
    xmlns="http://ws.apache.org/ns/synapse" name="FileProxy" transports="vfs" startOnLoad="true" trace="disable">
    <target>
        <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
        <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
        <parameter name="transport.PollInterval">5</parameter>
        <parameter name="transport.vfs.FileURI">file:///Users/myuser/test_in</parameter>
        <parameter name="transport.vfs.MoveAfterProcess">file:///Users/myusertest_out</parameter>
        <parameter name="transport.vfs.MoveAfterFailure">file:///Users/myuser/test_failure</parameter>
        <parameter name="transport.vfs.FileNamePattern">.*.xml</parameter>
        <parameter name="transport.vfs.ContentType">text/xml</parameter>
        <inSequence>
            <log category="WARN" level="full">
                <property name="MESSAGE" value="In Sequence"/>
            </log>
            <clone>
                <target sequence="fileWriteSequence"/>
            </clone>
        </inSequence>
    </target>
    <outSequence>
        <log category="WARN" level="full">
            <property name="MESSAGE" value="Out Sequence"/>
        </log>
        <send/>
    </outSequence>
</proxy>

My fileWriteSequence

<?xml version="1.0" encoding="UTF-8"?>
<sequence name="fileWriteSequence">
    <log level="full">
        <property name="sequence" value="fileWriteSequence"/>
    </log>
    <property name="transport.vfs.ReplyFileName" expression="fn:concat(fn:substring-after(get-property('MessageID'), 'urn:uuid:'), '.txt')" scope="transport"/>
    <property name="OUT_ONLY" value="true"/>
    <send>
        <endpoint name="FileEpr">
            <address uri="vfs:file:///Users/myuser/test_out"/>
        </endpoint>
    </send>
</sequence>

Solution

  • You can use the iterate mediator to iterate over 'id' element and use a property in the operation scope to concatenate all the id values. Refer this