Contact Us 1-800-596-4880

Rosettanet Connector Examples - Mule 4

This example consists of two apps:

  • The Buyer app sends a purchase order request message to a Seller App.

  • The Seller app sends a purchase order confirmation message to the Buyer app when the order is fulfilled.

The following diagram shows the relationship between the two apps:

Relationship between the Buyer and Seller apps

Buyer App

The Buyer app performs the following actions:

  1. Receives an input purchase order request document via an HTTP POST.

  2. Uses the RosettaNet Send action operation to send a purchase order request message to the Seller app.

  3. Transforms the message ID from the purchase order request message to plain text for use in responding to the HTTP POST.

  4. Receives an acknowledgment signal from the Seller app and logs information about the signal.

  5. Receives a purchase order confirmation message from the seller and logs information about the confirmation message.

  6. Receives the completion state from the Seller app and logs information about the completion state.

The following screenshot shows the Anypoint Studio app flows for the Buyer app:

Studio flow for the Buyer app
The keystore for the Buyer app, which includes the buyer private key, buyer certificate, and seller certificate is located in the project under src/main/resources.

Create the First Flow of the Buyer App

The first flow of the Buyer app receives a purchase order request document via an HTTP POST and sends this as a RosettaNet action message to the Seller app. Configuring this flow involves creating a new Mule project, configuring the HTTP Listener source, adding a Send action operation, and adding a Transform component.

Configure the HTTP Listener Source

Configure the HTTP Listener source to initiate a Mule flow when a call is made to the default path (/):

  1. Create a new Mule project in Studio.

  2. From the Mule Palette view, select HTTP and drag the Listener component to the canvas.

  3. In the properties window, click + next to the Connector configuration field to add a global element.

  4. In the Name field, enter HTTP_InputListener and accept the default values.

Add the PO_InitiatorConfig_Buyer Global Element

Add the PO_InitiatorConfig_Buyer global element for the Send action operation:

  1. In the properties window for the Send action operation, click + next to the Module configuration field to add a global element.

  2. In the RosettaNet Config window, complete the following fields:

    Global HTTP Listener HTTP_Listener-config

    Service Endpoint Path

    /partner1

    Global HTTP Request

    HTTP_Request_configuration

    Request Endpoint Path

    /partner2

    Keystore Path

    /partner1.jks

    Keystore Access password

    nosecret

    Signing key password

    partner1

    Global usage code

    Test

    Mule DUNS identifier

    123456789

    Mule location identifier

    partner1

    Partner DUNS identifier

    123456788

    Partner location identifier

    partner2

    role in PIP

    INITIATOR

    PIP definition path

    /PIP3A4/V02_02.xml

  3. Click OK.

Add the Send Action Operation

Add the Send action operation to send the purchase order request message to the Seller app by using the configuration defined for the PO_InitiatorConfig_Buyer global element:

  1. From the Mule Palette view, select RosettaNet and drag the Send action operation next to Listener.

  2. In the properties window, complete the following fields:

    Field Value

    Display Name

    Send action

    Module configuration

    PO_InitiatorConfig_Buyer

Add a Transform Message Component

Add a Transform Message component to transform the message ID in the purchase order request message to plain text:

  1. From the Mule Palette view, select Core and drag a Transform Message component next to Send action.

  2. In the properties window, overlay the brackets in the Output section with this DataWeave code:

    %dw 2.0
    output text/plain
    ---
    "Buyer sent action message " ++ attributes.messageId ++ "\n"

Create the Second Flow of the Buyer App

The second flow of the Buyer app receives an acknowledgment signal from the Seller app and logs information about the signal. It also receives the purchase order confirmation message from the Seller app and logs information about the message.

Configure the Action Source

Configure the Action source source to initiate a Mule flow when a call is made to the /partner2 path:

  1. From the Mule Palette view, select Rosettanet and drag the Action source source to the canvas.

  2. In the Module configuration field, enter PO_InitiatorConfig_Buyer.

Add a Logger Component

Add a Logger component to log a message that includes information about the acknowledgment and purchase order confirmation message:

  1. From the Mule Palette view, select Core and drag a Logger component next to Action source on the canvas.

  2. In the Message field, enter the following text:

    "Buyer received action message #[attributes.messageId]"

Create the Third Flow of the Buyer App

The third flow of the Buyer app receives the completion state from the Seller app and logs information about the completion state.

Configure the Completion Source

Configure the Completion source source to listen for a purchase order completion state message from the seller:

  1. From the Mule Palette view, select Rosettanet and drag the Completion source source to the canvas.

  2. In the Module configuration field, enter PO_InitiatorConfig_Buyer.

Add a Logger Component

Add a Logger component to log information about the purchase order completion state:

  1. From the Mule Palette view, select Core and drag a Logger component next to Completion source on the canvas.

  2. In the Message field, enter the following text:

    Buyer action message #[attributes.replyAttributes.messageId] completed as #[payload.completionCode]

Save and Run the App

To save the app, click File > Save.

To run the app, click Run > Run as > Mule Application.

XML for the Buyer App

Paste this code into the Studio XML editor to quickly load the flow for the Buyer app into your Mule app:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core"
	xmlns:http="http://www.mulesoft.org/schema/mule/http"
	xmlns:rosetta="http://www.mulesoft.org/schema/mule/rosetta"
	xmlns="http://www.mulesoft.org/schema/mule/core"
	xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd
http://www.mulesoft.org/schema/mule/core
http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/rosetta
http://www.mulesoft.org/schema/mule/rosetta/current/mule-rosetta.xsd
http://www.mulesoft.org/schema/mule/http
http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/core
http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">
	<http:listener-config name="HTTP_Listener_config"
	doc:name="HTTP Listener config" >
		<http:listener-connection host="localhost" port="8081" />
	</http:listener-config>
	<http:request-config name="HTTP_Request_configuration"
	doc:name="HTTP Request configuration">
		<http:request-connection host="localhost" port="8082" />
	</http:request-config>
	<rosetta:config name="PO_InitiatorConfig_Buyer"
	pipRole="INITIATOR" doc:name="RosettaNet Config"
	listenerConfigName="HTTP_Listener_config"
	servicePath="/partner1"
	requesterConfigName="HTTP_Request_configuration"
	requestPath="/partner2"
	keystorePath="/partner1.jks"
	keystorePass="nosecret"
	privatePass="partner1"
	globalUsageCode="Test"
	selfBusinessIdentifier="123456789"
	selfLocationId="partner1"
	partnerBusinessIdentifier="123456788"
	partnerLocationId="partner2"
	pipFile="/PIP3A4/V02_02.xml"/>
	<http:listener-config name="HTTP_InputListener"
	doc:name="HTTP Listener config" >
		<http:listener-connection host="localhost" port="8801" />
	</http:listener-config>
	<flow name="Send-Purchase-Order-Request" >
		<http:listener doc:name="Listener" config-ref="HTTP_InputListener"
		path="/"
		allowedMethods="POST"/>
		<rosetta:send-action doc:name="Send action"
		 config-ref="PO_InitiatorConfig_Buyer"/>
		<ee:transform doc:name="Transform Message"  >
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output text/plain
---
"Buyer sent action message " ++ attributes.messageId ++ "\n"]]></ee:set-payload>
			</ee:message>
		</ee:transform>
	</flow>
	<flow name="Receive-Purchase-Order-Confirmation"  >
		<rosetta:action-source doc:name="Action source"
		config-ref="PO_InitiatorConfig_Buyer"/>
		<logger level="INFO" doc:name="Logger"
		message="Buyer received action message #[attributes.messageId]"/>
	</flow>
	<flow name="Send-Purchase-Order-Completion" >
		<rosetta:completion-source doc:name="Completion"
		config-ref="PO_InitiatorConfig_Buyer"/>
		<logger level="INFO" doc:name="Logger"
		message="Buyer action message #[attributes.replyAttributes.messageId] completed as #[payload.completionCode]"/>
	</flow>
</mule>

Seller App

The Seller app performs the following actions:

  1. Receives an input purchase order request confirmation document via an HTTP POST.

  2. Uses a RosettaNet Send action operation to send a purchase order confirmation message to the buyer.

  3. Transforms the RosettaNet message ID from the purchase order confirmation message to plain text for use in responding to the HTTP POST.

  4. Receives a purchase order request message from the Buyer app and logs information about the request message.

  5. Receives an acknowledgment signal from the Buyer app and logs information about the signal.

  6. Receives a completion state message from the Buyer app and logs information about the completion state message.

The following screenshot shows the Anypoint Studio app flows for the Seller app:

Studio flow for the Seller app
The keystore in the Seller app, which includes the seller private key, seller certificate, and buyer certificate is located in the project under src/main/resources.

Create the First Flow of the Seller App

The first flow of the Seller app receives a purchase order request confirmation document via HTTP POST and sends this as a RosettaNet action message to the Buyer app. Configuring this flow involves creating a new Mule project, configuring the HTTP Listener source, configuring the RosettaNet Send action operation, and adding a Transform component.

Configure the HTTP Listener Source

Configure the HTTP Listener source to initiate a Mule flow when a call is made to the default path (/):

  1. Create a new Mule project in Studio.

  2. From the Mule Palette view, select HTTP and drag the Listener component to the canvas.

  3. In the properties window, click + next to the Connector configuration field to add a global element.

  4. In Name, enter HTTP_InputListener.

  5. In Port, enter 8082.

  6. In Read timeout, enter 3000.

Add a Global Element for the Send Action Operation

Create a global element named PO_ResponderConfig_Seller for the Send action operation.

  1. In the properties window for the Send action operation, click + next to the Module configuration field to add a global element.

  2. In the RosettaNet Config window, configure the following fields:

    Field Value

    Global HTTP Listener

    HTTP_Listener-config

    Service Endpoint Path

    /partner2

    Global HTTP Request

    HTTP_Request_configuration

    Request Endpoint Path

    /partner1

    Keystore Path

    /partner2.jks

    Keystore Access password

    nosecret

    Signing key password

    partner2

    Global usage code

    Test

    Mule DUNS identifier

    123456788

    Mule location identifier

    partner2

    Partner DUNS identifier

    123456789

    Partner location identifier

    partner1

    role in PIP

    RESPONDER

    PIP definition path

    /PIP3A4/V02_02.xml

  3. Click OK.

Add the Send Action Operation

Add the Send action operation to send a purchase order confirmation message to the Buyer app:

  1. From the Mule Palette view, select RosettaNet and drag the Send action operation next to Listener.

  2. In the properties window, configure the following fields:

    Field Value

    Display Name

    Send action

    Module configuration

    PO_ResponderConfig_Seller

  3. Click OK.

Add a Transform Message Component

Add a Transform Message component to transform the message ID from the purchase order confirmation message for use in responding to the HTTP POST.

  1. From the Mule Palette view, select Core and drag a Transform Message component next to Send action on the canvas.

  2. In the properties window, overlay the brackets in the Output section with this DataWeave code:

    %dw 2.0
    output text/plain
    ---
    "Seller sent action message " ++ attributes.messageId ++ "\n"

Create the Second Flow of the Seller App

The second flow of the Seller app receives an acknowledgment signal from the Buyer app and logs information about the signal. It also receives a purchase order request message from the Buyer app and logs information about the request.

Configure the Action Source

Configure the Action source to initiate a Mule flow when a call is made to the default path (/):

  1. From the Mule Palette view, select Rosettanet and drag the Action source source to the canvas.

  2. In the Module configuration field, enter PO_ResponderConfig_Seller.

Add a Logger Component

Add a Logger component to log information about the acknowledgment signal and purchase order request message:

  1. From the Mule Palette view, select Core and drag a Logger component next to Completion source on the canvas.

  2. In the Message field, enter the following text:

    Seller received action message #[attributes.messageId]

Create the Third Flow of the Seller App

The third flow of the Seller app sends a purchase order completion state message to the Buyer app and logs information about the purchase order completion state message. Configuring this flow involves configuring the Action source and adding a Logger component.

Configure the Action Source

Configure the Action source to receive the completion state from the Buyer app.

Adding a Logger Component

Add a Logger component to log information about the purchase order state completion message.

  1. From the Mule Palette view, select Core and drag a Logger component next to Action source on the canvas.

  2. In the Message field, enter the following text:

    Seller action message #[attributes.replyAttributes.messageId] completed as #[payload.completionCode]

Save and Run the App

To save the app, click File > Save.

To run the app, click Run > Run as > Mule Application.

XML for the Seller App

Paste this code into the Studio XML editor to quickly load the flow for the Seller app into your Mule app:

<?xml version="1.0" encoding="UTF-8"?>

<mule xmlns:ee="http://www.mulesoft.org/schema/mule/ee/core"
	xmlns:http="http://www.mulesoft.org/schema/mule/http"
	xmlns:rosetta="http://www.mulesoft.org/schema/mule/rosetta"
	xmlns="http://www.mulesoft.org/schema/mule/core"
	xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="
http://www.mulesoft.org/schema/mule/core
http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/rosetta
http://www.mulesoft.org/schema/mule/rosetta/current/mule-rosetta.xsd
http://www.mulesoft.org/schema/mule/http
http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/ee/core
http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">
	<http:listener-config name="HTTP_Listener_config"
	doc:name="HTTP Listener config" >
		<http:listener-connection host="localhost" port="8082" />
	</http:listener-config>
	<http:request-config name="HTTP_Request_configuration"
	doc:name="HTTP Request configuration" >
		<http:request-connection host="localhost" port="8081" />
	</http:request-config>
	<rosetta:config name="PO_ResponderConfig_Seller"
	pipRole="RESPONDER"
	doc:name="RosettaNet Config"
	listenerConfigName="HTTP_Listener_config"
	servicePath="/partner2"
	requesterConfigName="HTTP_Request_configuration"
	requestPath="/partner1"
	keystorePath="/partner2.jks"
	keystorePass="nosecret"
	privatePass="partner2"
	globalUsageCode="Test"
	partnerBusinessIdentifier="123456789"
	partnerLocationId="partner1"
	selfBusinessIdentifier="123456788"
	selfLocationId="partner2" pipFile="/PIP3A4/V02_02.xml"/>
	<http:listener-config name="HTTP_InputListener"
	doc:name="HTTP Listener config" >
		<http:listener-connection host="localhost" port="8802" />
	</http:listener-config>
	<flow name="Send-Purchase-Order-Confirmation">
		<http:listener doc:name="Listener"
		config-ref="HTTP_InputListener"
		path="/" allowedMethods="POST"/>
		<rosetta:send-action doc:name="Send action"
		 config-ref="PO_ResponderConfig_Seller"/>
		<ee:transform doc:name="Transform Message">
			<ee:message >
				<ee:set-payload ><![CDATA[%dw 2.0
output text/plain
---
"Seller sent action message " ++ attributes.messageId ++ "\n"]]></ee:set-payload>
			</ee:message>
		</ee:transform>
	</flow>
	<flow name="Receive-Purchase-Order-Request">
		<rosetta:action-source doc:name="Action source"
		config-ref="PO_ResponderConfig_Seller"/>
		<logger level="INFO" doc:name="Logger"
		 message="Seller received action message #[attributes.messageId]"/>
	</flow>
	<flow name="Send-Purchase-Order-Completion">
		<rosetta:completion-source doc:name="Completion"
		config-ref="PO_ResponderConfig_Seller"/>
		<logger level="INFO" doc:name="Logger"
		message="Seller action message #[attributes.replyAttributes.messageId] completed as #[payload.completionCode]"/>
	</flow>
</mule>

Test the Examples

To test the Buyer and Seller apps, do the following after you run the apps:

  1. Provide the purchase order request to the Buyer app.

  2. Provide the purchase order request response to the Seller app.

Provide the Purchase Order Request Document

Use an HTTP POST to the Buyer app HTTP_InputListener endpoint to provide the purchase order request to send to the seller.

You can download a sample purchase order request. You can then use any HTTP tool, such as a browser plugin, standalone tool such as PostMan, or console tool such as curl to POST the data to the Buyer app.

For example, the following curl command posts a purchase order request:

curl -v -H "Content-Type: application/xml" -XPOST --data-binary @sample-purchase-order-request-content.xml http://localhost:8801

RosettaNet Connector generates a RosettaNet message based on the purchase order request and sends it to the seller, responding to the HTTP POST operation with a message identifier. In your console, your output should look like this:

INFO  ... Seller received action message pMAIhTBMsGzAf/NFx83KBO9nt+T+DV2RNLhwlpNqnXM=0
INFO  ... Buyer action message pMAIhTBMsGzAf/NFx83KBO9nt+T+DV2RNLhwlpNqnXM=0 completed as SUCCESS

Provide the Purchase Order Confirmation Document

Use an HTTP POST to the Seller app HTTP_InputListener endpoint to provide the purchase order confirmation to send to the buyer.

You can download a sample purchase order confirmation and then use any HTTP tool to post the data to the Seller app.

For example, the following curl command posts a purchase order confirmation:

curl -v -H "Content-Type: application/xml" -XPOST --data-binary @sample-purchase-order-confirmation-content.xml http://localhost:8802

RosettaNet Connector generates a RosettaNet message based on the purchase order confirmation and sends it to the buyer, responding to the HTTP POST operation with a message identifier. In your console, your output should look like this:

INFO  ... Buyer received action message ng7+TalLLPTJZHok4tQSBi8RYZD8IsD9+iB85cubzM=1
INFO  ... Seller action message sng7+TalLLPTJZHok4tQSBi8RYZD8IsD9+iB85cubzM=1 completed as SUCCESS

The purchase order confirmation action sent by this sample app is only an example. To send a real purchase order confirmation, you must configure the replyAttributes on the RosettaNet send-action operation with the information provided by when you received the corresponding purchase order request. These replayAttributes enable the RosettaNet protocol to distinguish between many concurrent requests.

View on GitHub