prime
prime

Reputation: 809

How to use filter for more than one parameter of a JSON message

I'm using ESB-4.9.0 version.

An ESB mediation flow has to be continued based on two filtering logic. JSON message is transformed in the mediation flow. Currently, I'm using two Filter mediators to achieve this. Is there any possibility to use a single filter mediator to fulfill the same scenario?

Input JSON message

{
  "filterId": "CorrectId",
  "approvalStatus": "approved",
  "lifeCycleStatus": "BRANCH_READY",
  "channelData": [
    {
      "status": "pending",
      "indexId": "correctIndexId",
      "description": "Test Description"
    }
  ]
}

The used ESB Synapse part

<filter description="" regex="CorrectId" source="json-eval($.filterId)">
        <then>
           <filter description="" regex="correctIndexId" source="json-eval($.indexId)">
                <then>
                   <!-- continue the mediation flow-1-->
                </then>
                <else>
                    <!-- continue the mediation flow-2-->
                </else>
            </filter>
        </then>
        <else>
            <drop/>
        </else>
    </filter>

Upvotes: 1

Views: 372

Answers (1)

MiddlewareManiac
MiddlewareManiac

Reputation: 570

Yes, this is possible with a filter mediator and the xpath concat function:

<resource methods="POST" uri-template="/onefilter">
  <inSequence>
     <property name="filterId" expression="json-eval($.filterId)"/>
     <property name="correctIndexId" expression="json-eval($.channelData[0].indexId)"/>
     <property name="combinedID" expression="fn:concat($ctx:filterId, $ctx:correctIndexId)"/>
     <filter source="$ctx:combinedID" regex="CorrectIdcorrectIndexId">
        <then>
           <log level="custom">
              <property name="message" value="continue 1"/>
           </log>
           <drop/>
        </then>
        <else>
           <log level="custom">
              <property name="message" value="continue 2"/>
           </log>
           <drop/>
        </else>
     </filter>
  </inSequence>

By the way your code snippet would NEVER go into the continue 1 route because your JSON path is invalid.

Upvotes: 1

Related Questions