Skip to Content
Technical Articles
Author's profile photo Bhalchandra Wadekar

EIPinCPI – Content Enricher

Previous – Envelope Wrapper | Index | Next – Content Filter

This week, we’ll study yet another Message Transformation pattern known as Content Enricher.

When do I use this pattern?

Content Enricher pattern, as the name suggests, enriches the content of the message by adding related information to it. For example, when order is sent from one system to another, the customer information can be added to the message. This adding of customer information to order is known as enriching the content and the pattern is said to be Content Enricher pattern.

Content Enricher in CPI

CPI has a dedicated component for Content Enricher. And, I’ll be using Northwind service to enrich Orders with Customer information.

Integration Flow

Enriching%20Order%20with%20Customer%20Details

Enriching Order with Customer Details

This integration flow starts immediately using a Timer Start, gets the Orders from an Order Management System (OMS) using Command Message pattern, enriches the orders with customer information from Customer Relationship Management (CRM) system using Content Enricher component, and Logs the output using Groovy Script. Note that, in this example, Northwind is acting as Order Management System (OMS) and Customer Relationship Management (CRM).

Here’s the configuration of OData Adapter for getting the orders:

Tab Property Value
Connection Address https://services.odata.org/V2/Northwind/Northwind.svc
Connection CSRF Protected Unchecked
Processing Operation Details Query (GET)
Processing Resource Path Orders

This is the configuration of the OData Adapter for enriching with customer information:

Tab Property Value
Connection Address https://services.odata.org/V2/Northwind/Northwind.svc
Connection CSRF Protected Unchecked
Processing Operation Details Query (GET)
Processing Resource Path Customers

Finally, the Content Enricher component is configured as:

Tab Property Value
Processing
Aggregation Algorithm Enrich
Processing
Path to Node /Orders/Order
Processing
Key Element CustomerID
Processing
Path to Node /Customers/Customer
Processing
Key Element CustomerID

Output

When the orders are fetched the payload looks like below:

<Orders>
    <Order>
        <RequiredDate>1996-08-01T00:00:00.000</RequiredDate>
        <ShipName>Vins et alcools Chevalier</ShipName>
        <ShippedDate>1996-07-16T00:00:00.000</ShippedDate>
        <ShipCity>Reims</ShipCity>
        <CustomerID>VINET</CustomerID>
        <ShipVia>3</ShipVia>
        <ShipPostalCode>51100</ShipPostalCode>
        <OrderID>10248</OrderID>
        <OrderDate>1996-07-04T00:00:00.000</OrderDate>
        <ShipRegion/>
        <ShipAddress>59 rue de l&apos;Abbaye</ShipAddress>
        <ShipCountry>France</ShipCountry>
        <EmployeeID>5</EmployeeID>
        <Freight>32.3800</Freight>
    </Order>
    <Order>
        <RequiredDate>1996-08-16T00:00:00.000</RequiredDate>
        <ShipName>Toms Spezialitäten</ShipName>
        <ShippedDate>1996-07-10T00:00:00.000</ShippedDate>
        <ShipCity>Münster</ShipCity>
        <CustomerID>TOMSP</CustomerID>
        <ShipVia>1</ShipVia>
        <ShipPostalCode>44087</ShipPostalCode>
        <OrderID>10249</OrderID>
        <OrderDate>1996-07-05T00:00:00.000</OrderDate>
        <ShipRegion/>
        <ShipAddress>Luisenstr. 48</ShipAddress>
        <ShipCountry>Germany</ShipCountry>
        <EmployeeID>6</EmployeeID>
        <Freight>11.6100</Freight>
    </Order>
    ...
</Orders>

The Customers payload looks like below:

<Customers>
    <Customer>
        <CompanyName>Vins et alcools Chevalier</CompanyName>
        <Address>59 rue de l'Abbaye</Address>
        <Phone>26.47.15.10</Phone>
        <Region/>
        <PostalCode>51100</PostalCode>
        <Country>France</Country>
        <CustomerID>VINET</CustomerID>
        <City>Reims</City>
        <Fax>26.47.15.11</Fax>
        <ContactName>Paul Henriot</ContactName>
        <ContactTitle>Accounting Manager</ContactTitle>
    </Customer>
    <Customer>
        <CompanyName>Toms Spezialitäten</CompanyName>
        <Address>Luisenstr. 48</Address>
        <Phone>0251-031259</Phone>
        <Region/>
        <PostalCode>44087</PostalCode>
        <Country>Germany</Country>
        <CustomerID>TOMSP</CustomerID>
        <City>Münster</City>
        <Fax>0251-035695</Fax>
        <ContactName>Karin Josephs</ContactName>
        <ContactTitle>Marketing Manager</ContactTitle>
    </Customer>
    ...
</Customers>

Now the Content Enricher component matches CustomerID ‘VINET’ under /Orders/Order with CustomerID ‘VINET’ under /Customers/Customer, matches CustomerID ‘TOMSP’ under /Orders/Order with CustomerID ‘TOMSP’ under /Customers/Customer, and so on. The output payload after Content Enricher looks like below. Notice how Customer tag with matching CustomerID is added under each Order tag, this is how Order is enriched with the Customer information.

<Orders>
    <Order>
        <RequiredDate>1996-08-01T00:00:00.000</RequiredDate>
        <ShipName>Vins et alcools Chevalier</ShipName>
        <ShippedDate>1996-07-16T00:00:00.000</ShippedDate>
        <ShipCity>Reims</ShipCity>
        <CustomerID>VINET</CustomerID>
        <Customer>
            <CompanyName>Vins et alcools Chevalier</CompanyName>
            <Address>59 rue de l'Abbaye</Address>
            <Phone>26.47.15.10</Phone>
            <Region/>
            <PostalCode>51100</PostalCode>
            <Country>France</Country>
            <CustomerID>VINET</CustomerID>
            <City>Reims</City>
            <Fax>26.47.15.11</Fax>
            <ContactName>Paul Henriot</ContactName>
            <ContactTitle>Accounting Manager</ContactTitle>
        </Customer>
        <ShipVia>3</ShipVia>
        <ShipPostalCode>51100</ShipPostalCode>
        <OrderID>10248</OrderID>
        <OrderDate>1996-07-04T00:00:00.000</OrderDate>
        <ShipRegion/>
        <ShipAddress>59 rue de l'Abbaye</ShipAddress>
        <ShipCountry>France</ShipCountry>
        <EmployeeID>5</EmployeeID>
        <Freight>32.3800</Freight>
    </Order>
    <Order>
        <RequiredDate>1996-08-16T00:00:00.000</RequiredDate>
        <ShipName>Toms Spezialitäten</ShipName>
        <ShippedDate>1996-07-10T00:00:00.000</ShippedDate>
        <ShipCity>Münster</ShipCity>
        <CustomerID>TOMSP</CustomerID>
        <Customer>
            <CompanyName>Toms Spezialitäten</CompanyName>
            <Address>Luisenstr. 48</Address>
            <Phone>0251-031259</Phone>
            <Region/>
            <PostalCode>44087</PostalCode>
            <Country>Germany</Country>
            <CustomerID>TOMSP</CustomerID>
            <City>Münster</City>
            <Fax>0251-035695</Fax>
            <ContactName>Karin Josephs</ContactName>
            <ContactTitle>Marketing Manager</ContactTitle>
        </Customer>
        <ShipVia>1</ShipVia>
        <ShipPostalCode>44087</ShipPostalCode>
        <OrderID>10249</OrderID>
        <OrderDate>1996-07-05T00:00:00.000</OrderDate>
        <ShipRegion/>
        <ShipAddress>Luisenstr. 48</ShipAddress>
        <ShipCountry>Germany</ShipCountry>
        <EmployeeID>6</EmployeeID>
        <Freight>11.6100</Freight>
    </Order>
    ...
</Orders>

Limitations of the Content Enricher component

The Content Enricher component supports only XML data format and only SuccessFactors, Soap1.x, and OData adapter types. However, there is a way to overcome this and I discussed it a couple of years ago in my blog Cloud Platform Integration: Enrich your content with ProcessDirect.

Conclusion

Content Enricher is a Message Transformation pattern used to enrich the content with information from a third server. Content Enricher component implements the Content Enricher pattern in CPI.

References/Further Readings

Hope this helps,
Bala

Previous – Envelope Wrapper | Index | Next – Content Filter

Assigned Tags

      3 Comments
      You must be Logged on to comment or reply to a post.
      Author's profile photo Jay Malla
      Jay Malla

      Hi Bala,

       

      Nice blog!

       

      Regards,

      Jay

      Author's profile photo Daniel Matcovich
      Daniel Matcovich

      Nice blog! Do you know if it is possible to use multiple key elements?

      Author's profile photo Bhalchandra Wadekar
      Bhalchandra Wadekar
      Blog Post Author

      Hi Daniel Matcovich,

      I tried using the Concat function in the Key Element input box. However, it did not work.

      The only way to achieve multiple Key Elements is to concatenate them into a single field before feeding them into the Content Enricher. Please note you can use ProcessDirect to feed the lookup message into the Content Enricher. And, with a flow using ProcessDirect, you can add a mapping step to concatenate multiple key elements into a single field. And, then use the concatenated field in the Key Element input box in Content Enricher.

      Hope this helps,
      Bala