com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links' is unknown.

Enrich Mediator

The Enrich Mediator can process a message based on a given source configuration and then perform the specified action on the message by using the target configuration. It gets an OMElement using the configuration specified in the source and then modifies the message by putting it on the current message using the configuration in the target.

The Enrich mediator is a content-aware mediator.



Syntax

<enrich>
    <source [clone=true|false] [type=custom|envelope|body|property|inline] xpath="" property="" />
    <target [action=replace|child|sibiling] [type=custom|envelope|body|property] xpath="" property="" />
</enrich>

Configuration

The main properties of the Enrich Mediator available are:

Source configuration

The following properties are available:

  • Clone- By setting the clone configuration, the message can be cloned or used as a reference during enriching. The default value is true.
    • True
    • False
  • Type- The type that the mediator uses from the original message to enrich the modified message that passes through the mediator.
    • Custom - Custom XPath value.
    • Envelope - Envelope of the original message used for enriching.
    • Body - Body of the original message used for enriching.
    • Property - Specifies a property. For information on how you can use the Property mediator to specify properties, see Property Mediator.
  • XPath Expression - This field is used to specify the custom XPath value if you selected custom for the Type field.

Tip

You can click the Namespaces link to add namespaces if you are providing an expression. You will be provided another panel named "Namespace Editor," where you can provide any number of namespace prefixes and URL that you have used in the XPath expression. 

Target Configuration

The following properties are available:

  • Action - By specifying the action type, the relevant action can be applied to outgoing messages.
    • Replace - Replace is the default value of Action. It will be used if a specific value for Action is not given. This replaces the XML message based on the target type specified on the target configuration. 

    • Child - Adding as a child of the specified target type.
    • Sibling - Adding as a sibling of the specified target type.

    For the target type 'envelope', the action type should be 'replace'. Herein, action type 'child' is not acceptable because it adds an envelope within an envelope, and action type 'sibling' is also not acceptable because there will be two envelopes in a message if you use it.

  • Type and XPath Expression - Refer the Source configuration above.

    The target type depends on the source type. For the valid and invalid combinations of source and target types, see below table.



    Target type
    Source type
    customenvelopebodyproperty
    customvalidinvalidvalidvalid
    envelopeinvalidinvalidinvalidvalid
    bodyvalidinvalidinvalidvalid
    propertyvalidvalidvalidvalid
    inlinevalidvalidvalidvalid




Examples

Example 1: Setting the property symbol

In this example, you are setting the property symbol. Later, you can log it using the Log Mediator .

<enrich xmlns="http://ws.apache.org/ns/synapse">
           <source clone="false" type="envelope"/>
           <target type="property" property="payload" />
 </enrich>

Example 2: Adding a child object to a property

In this example, you add a child property named Lamborghini to a property named Cars. The configuration for this is as follows:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="_TestEnrich" transports="https,http" statistics="disable" trace="enable" startOnLoad="true"> 
   <target> 
      <inSequence> 
         <enrich> 
            <source type="inline" clone="true"> 
               <Cars/> 
            </source> 
            <target type="property" property="Cars"/> 
         </enrich> 
         <log level="custom"> 
            <property name="PekeCarListBeforeEnrich" expression="get-property('Cars')"/> 
         </log> 
         <enrich> 
            <source type="inline" clone="true"> 
               <Car>Lamborghini</Car> 
            </source> 
            <target action="child" xpath="$ctx:Cars"/> 
         </enrich> 
         <log level="custom"> 
            <property name="PekeCarListAfterEnrich" expression="get-property('Cars')"/> 
         </log> 
      </inSequence> 
      <outSequence/> 
   </target> 
   <description></description> 
</proxy>

Example 3 - Adding a SOAPEnvelope type object as a property to a message

In this example, you add the SOAP envelope in a SOAP request as a property to a message. The Enrich mediator is useful in this scenario since adding the property directly using the Property mediator results in the SOAPEnvelope object being created as an OM type object. The OM type object created cannot be converted back to a SOAPEnvelope object.

<enrich> 
<source type="envelope" clone="true"/>
<target type="property" property="ExtractedEnvelope"/>
</enrich>

Example 4 - Preserving the original payload

In this example, you copy the original payload to a property using the Enrich mediator.

<enrich>
      <source clone="false" type="body"/>
      <target action="replace" type="property" property="ORIGINAL_PAYLOAD"/>
   </enrich>

Then whenever you need the original payload, you replace the message body with this property value using the Enrich mediator as follows:

<enrich>
      <source clone="false" type="property" property="ORIGINAL_PAYLOAD"/>
      <target action="replace" type="body"/>
   </enrich>


Example 5 - Enriching in JSON format

For a message to be enriched as a JSON current message in the message flow or incoming message should be a JSON and one of the following conditions should be matched.

Both source and target do not have custom path expressions.
Source has a custom json-path and target does not have any expressions.
Target has a custom json-path and source does not have any expressions.
Both target and source have custom json-path expressions.

The following sample scenarioes can be used to test the differnt JSON enriching scenarioes.

In JSON enriching scenarios if the enrich mediator source defined as a property it should contain a json object or json array.

Sample 1 - Setting the custom path expressions to message body

<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="TestEnrich" startOnLoad="true" statistics="disable" trace="enable" transports="http,https">
    <target>
        <inSequence>
            <enrich>
                <source clone="false" xpath="json-eval($.SamplePayload)"/>
                <target type="body"/>
            </enrich>
            <respond/>
            <log level="full"/>
        </inSequence>
        <outSequence/>
    </target>
    <description/>
</proxy> 

Sample request 

{
    "SamplePayload": {
        "SampleArray": [
            123.45
        ]
    }
}

Response

{
    "SampleArray": [
        123.45
    ]
}

Sample 2 - Setting the property to custom as a sibling

 <?xml version="1.0" encoding="UTF-8"?>
<inSequence xmlns="http://ws.apache.org/ns/synapse">
    <property name="Greeting" scope="default" type="STRING" value="{&quot;name&quot;:&quot;John&quot;}"/>
    <enrich>
        <source clone="true" property="Greeting" type="property"/>
        <target action="child" type="custom" xpath="json-eval($.SamplePayload.SampleArray)"/>
    </enrich>
    <respond/>
    <log level="full"/>
</inSequence>

Sample request 

{
    "SamplePayload": {
        "SampleArray": [
            123.45
        ]
    }
}

Response

{  
   "SamplePayload":{  
      "SampleArray":[  
         123.45,
         {  
            "name":"John"
         }
      ]
   }
}

Sample 3 - Setting the property to custom as a child

<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="TestEnrich1" startOnLoad="true" statistics="disable" trace="enable" transports="http,https">
    <target>
        <inSequence>
            <property name="Greeting" scope="default" type="STRING" value="{ &quot;name&quot;:&quot;John&quot;}"/>
            <enrich>
                <source clone="true" property="Greeting" type="property"/>
                <target action="child" xpath="json-eval(SamplePayload.SampleArray)"/>
            </enrich>
            <respond/>
            <log level="full"/>
        </inSequence>
        <outSequence/>
    </target>
    <description/>
</proxy>

Sample request

{
    "SamplePayload": {
        "SampleArray": [
            123.45
        ]
    }
}

Response

{  
   "SamplePayload":{  
      "SampleArray":[  
         123.45,
         {  
            "name":"John"
         }
      ]
   }
}



Sample 4 - Setting the inline to custom as a child

<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="TestEnrich1" startOnLoad="true" statistics="disable" trace="enable" transports="http,https">
    <target>
        <inSequence>
            <enrich>
                <source clone="true" type="inline"> { "isEnrichJsonSupported": true } </source>
                <target action="child" xpath="json-eval($.SamplePayload.SampleArray)"/>
            </enrich>
            <respond/>
            <log level="full"/>
        </inSequence>
        <outSequence/>
    </target>
    <description/>
</proxy>

Sample request

{
    "SamplePayload": {
        "SampleArray": [
            123.45
        ]
    }
}

Response

{
    "SamplePayload": {
        "SampleArray": [
            123.45,
            {
                "isEnrichJsonSupported": true
            }
        ]
    }
}


Sample 5 - Setting the inline to body

<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="TestEnrich1" startOnLoad="true" statistics="disable" trace="enable" transports="http,https">
    <target>
        <inSequence>
            <enrich>
                <source clone="true" type="inline"> { "isEnrichJsonSupported": true } </source>
                <target action="child" xpath="json-eval($.SamplePayload.SampleArray)"/>
            </enrich>
            <respond/>
            <log level="full"/>
        </inSequence>
        <outSequence/>
    </target>
    <description/>
</proxy>

Sample request
empty {} or any JSON payload

Response

{  
   "Speed of light":299792458
}


Sample 6 - Setting the custom path expressions to property

<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="TestEnrich1" startOnLoad="true" statistics="disable" trace="enable" transports="http,https">
    <target>
        <inSequence>
            <enrich>
                <source clone="true" xpath="json-eval(SamplePayload.SampleArray[1])"/>
                <target property="ValueOfPi" type="property"/>
            </enrich>
            <log level="custom">
                <property expression="get-property('ValueOfPi')" name="Value of Pi : "/>
            </log>
        </inSequence>
        <outSequence/>
    </target>
    <description/>
</proxy>                                

Sample request
{  
   "SamplePayload":{  
      "SampleArray":[  
         1.618,
         3.14
      ]
   }
}

Response

Following line will appear as a log
Value of Pi :  = 3.14

Sample 7 - Remove selected parts from the payload ( this feature is available from EI 6.6.0 WUM level 1595516738094 )

<?xml version="1.0" encoding="UTF-8"?><proxy xmlns="http://ws.apache.org/ns/synapse" name="TestEnrich1" startOnLoad="true" statistics="disable" trace="enable" transports="http,https">
    <target>
       <inSequence>
         <enrich>
            <source clone="true" xpath="json-eval($.store.book[*].author,$.store.book[0])"/>
            <target type="body" action="remove"/>
         </enrich>
         <respond/>
      </inSequence>
      <outSequence/>
    </target>
    <description/>
</proxy>                                

Sample request

{
    "store": {
        "book": [
            {
                "category": "fiction",
                "author": "Evelyn Waugh",
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "category": "fiction",
                "author": "Herman Melville",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "author": "J. R. R. Tolkien",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    }
}
                        

Response

{
    "store": {
        "book": [
            {
                "category": "fiction",
                "title": "Moby Dick",
                "isbn": "0-553-21311-3",
                "price": 8.99
            },
            {
                "category": "fiction",
                "title": "The Lord of the Rings",
                "isbn": "0-395-19395-8",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    }
}


For other example using the Enrich mediator, see  /wiki/spaces/EI6xx/pages/49610946 and /wiki/spaces/EI6xx/pages/49611297



com.atlassian.confluence.content.render.xhtml.migration.exceptions.UnknownMacroMigrationException: The macro 'next_previous_links2' is unknown.