0% found this document useful (0 votes)
990 views487 pages

DEX401 SP24v1 en Exercise Guide

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
990 views487 pages

DEX401 SP24v1 en Exercise Guide

Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 487

‭EXERCISE GUIDE‬

‭ nypoint Platform:‬
A
‭Development‬
‭Fundamentals‬
‭DEX401 | June 7, 2024‬
‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Table of Contents‬
‭ able of Contents‬
T ‭‬
2
‭Introducing the course‬ ‭4‬
‭Walkthrough: Set up your computer for class‬ ‭5‬
‭Module 1: Accessing and modifying Mule events‬ ‭12‬
‭Walkthrough 1-1: View event data‬ ‭13‬
‭Walkthrough 1-2: Debug a Mule application‬ ‭24‬
‭Walkthrough 1-3: Track event data as it moves in and out of a Mule application‬ ‭35‬
‭Walkthrough 1-4: Set request and response data‬ ‭45‬
‭Walkthrough 1-5: Get and set event data using DataWeave expressions‬ ‭51‬
‭Walkthrough 1-6: Set and get variables‬ ‭64‬
‭Module 2: Structuring Mule applications‬ ‭70‬
‭Walkthrough 2-1: Create and reference subflows and private flows‬ ‭71‬
‭Walkthrough 2-2: Trigger flows using the VM connector‬ ‭79‬
‭Walkthrough 2-3: Encapsulate global elements in a separate configuration file‬ ‭91‬
‭Walkthrough 2-4: Use property placeholders in connectors‬ ‭103‬
‭Walkthrough 2-5: Create a well-organized Mule project‬ ‭109‬
‭Walkthrough 2-6: Manage metadata for a project‬ ‭123‬
‭Module 3: Consuming web services‬ ‭133‬
‭ alkthrough 3-1: Consume a RESTful web service that has an API (and connector)‬
W
‭in Exchange‬ ‭134‬
‭Walkthrough 3-2: Consume a RESTful web service‬ ‭152‬
‭Walkthrough 3-3: Consume a SOAP web service‬ ‭164‬
‭Walkthrough 3-4: Transform data from multiple services to a canonical format‬‭180‬
‭Module 4: Controlling event flow‬ ‭192‬
‭Walkthrough 4-1: Multicast an event‬ ‭193‬
‭Walkthrough 4-2: Route events based on conditions‬ ‭202‬
‭Walkthrough 4-3: Validate events‬ ‭217‬
‭Module 5: Handling errors‬ ‭226‬
‭Walkthrough 5-1: Explore default error handling‬ ‭227‬
‭Walkthrough 5-2: Handle errors at the application level‬ ‭238‬
‭Walkthrough 5-3: Handle specific types of errors‬ ‭250‬
‭Walkthrough 5-4: Handle errors at the flow level‬ ‭257‬
‭Walkthrough 5-5: Handle errors at the processor level‬ ‭270‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭2‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 5-6: Map an error to a custom error type‬ ‭281‬


‭Walkthrough 5-7: Review and integrate with APIkit error handlers‬ ‭290‬
‭Walkthrough 5-8: Set a reconnection strategy for a connector‬ ‭308‬
‭Module 6: Writing DataWeave transformations‬ ‭310‬
‭ alkthrough 6-1: Create transformations with the Transform Message component‬
W
‭312‬
‭Walkthrough 6-2: Transform basic JSON, Java, and XML data structures‬ ‭328‬
‭Walkthrough 6-3: Transform complex data structures with arrays‬ ‭336‬
‭Walkthrough 6-4: Transform to and from XML with repeated elements‬ ‭350‬
‭Walkthrough 6-5: Define and use variables and functions‬ ‭360‬
‭Walkthrough 6-6: Coerce and format strings, numbers, and dates‬ ‭367‬
‭Walkthrough 6-7: Define and use custom data types‬ ‭376‬
‭Walkthrough 6-8: Use DataWeave functions‬ ‭382‬
‭Module 7: Triggering flows‬ ‭389‬
‭Walkthrough 7-1: Trigger a flow when a new file is added to a directory‬ ‭390‬
‭ alkthrough 7-2: Trigger a flow when a new record is added to a database and‬
W
‭use automatic watermarking‬ ‭402‬
‭Walkthrough 7-3: Schedule a flow and use manual watermarking‬ ‭417‬
‭Walkthrough 7-4: Publish and listen for JMS messages‬ ‭436‬
‭Module 8: Processing records‬ ‭447‬
‭Walkthrough 8-1: Process items in a collection using the For Each scope‬ ‭448‬
‭Walkthrough 8-2: Process records using the Batch Job scope‬ ‭458‬
‭Walkthrough 8-3: Use filtering and aggregation in a batch step‬ ‭468‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭3‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Introducing the course‬

‭In this module, you will:‬

‭●‬ ‭Learn about the course format.‬

‭●‬ ‭Access the course files.‬

‭●‬ ‭Make sure your computer is set up for class.‬

‭●‬ ‭Review the course outline.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭4‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough: Set up your computer for class‬

‭In this walkthrough, you make sure your computer is set up correctly, so you can‬
‭complete the class exercises. You will:‬

‭●‬ ‭Access the course files.‬

‭●‬ ‭Make sure Anypoint Studio starts successfully.‬

‭●‬ ‭Install Advanced REST client (if you did not already).‬

‭●‬ ‭Make sure you have an active Anypoint Platform account.‬

‭●‬ ‭Make sure you have a Salesforce developer account and an API security token.‬

‭Access course files‬

‭1.‬ ‭Locate your course enrollment email and follow the instructions to download‬
‭the student files ZIP.‬

‭2.‬ ‭On your computer, locate the student files ZIP and expand it.‬

‭3.‬ ‭Open the two course snippets.txt files, one for each part of the course.‬

‭NOTE:‬ ‭Keep these files open. You will copy and paste‬‭text from them during class.‬

‭4.‬ ‭Again, follow your course enrollment email to access the student manuals and‬
‭slides.‬

‭Start Anypoint Studio‬

‭5.‬ ‭In your computer's file browser, navigate to where you installed Anypoint‬
‭Studio and open it.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭5‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE:‬‭If you do not have Anypoint Studio, you can download it from‬
‭https://www.mulesoft.com/lp/dl/studio‬‭.‬

‭Upon starting Anypoint Studio, users on Windows may get a popup asking to allow‬
‭Windows Defender Firewall access for OpenJDK; access should be allowed.‬

‭6.‬ ‭In the Workspace Launcher dialog box, look at the location of the default‬
‭workspace; change the workspace location if you want.‬

‭7.‬ ‭Click‬‭OK‬‭to select the workspace; Anypoint Studio‬‭should open.‬

‭NOTE:‬‭If you cannot successfully start Anypoint Studio,‬‭make sure that you have‬
‭enough available memory (at least 8GB available) to run Anypoint Studio.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭6‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭8.‬ ‭If you get a new features page, click the‬‭Continue to Studio‬‭button to close it.‬

‭9.‬ ‭If you get an Updates Available popup in the lower-right corner of the‬
‭application, click it and install the available updates.‬

‭Open Advanced REST Client‬

‭10.‬‭Open‬‭Advanced REST Client‬‭.‬

‭NOTE:‬‭If you do not have Advanced REST Client (or‬‭another REST API client) installed,‬
‭download it now from‬ ‭https://install.advancedrestclient.com/‬‭and install it.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭7‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Leave Advanced REST Client open; you will use it throughout class.‬

‭Make sure you have an active Anypoint Platform account‬

‭12.‬‭In a web browser, navigate to‬‭http://anypoint.mulesoft.com/‬‭and log in.‬

‭NOTE:‬‭If you do not have an account, sign up for a‬‭free, 30-day trial account now.‬
‭Also, if you get prompted here or in other parts of the course to enable multi-factor‬
‭authentication, select Not Now.‬

‭13.‬‭Click the menu button located in the upper left in the main menu bar.‬

‭14.‬‭In the menu that appears, select‬‭Access Management‬‭.‬

‭NOTE:‬‭This will be called the main menu from now on.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭8‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭15.‬‭In the left-side navigation, click the Runtime Manager link under Subscription.‬

‭16.‬‭Check your subscription level and if it is a trial account, make sure it is not‬
‭expired.‬

‭NOTE:‬‭If your trial is expired or will expire during‬‭class, sign out and then sign up for a‬
‭new trial account now.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭9‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Make sure you have a Salesforce developer account and an API‬


‭security token‬

‭17.‬‭In the same or another web browser tab, navigate to‬‭http://salesforce.com‬


‭and log in to your Salesforce org.‬

‭NOTE:‬‭If you did not sign up for a free developer‬‭account yet, go to‬
‭http://developer.salesforce.com/‬‭and sign up for one‬‭now. You will want to use a free‬
‭developer account and not your company account (if you already have one) for class.‬
‭You will use the API to add new fictitious accounts to it and will probably not want to‬
‭add those to your real data.‬

‭18.‬‭In Salesforce, click your avatar at the top of the screen and select‬‭Settings‬‭. ‬

‭19.‬‭In the left-side navigation, select‬‭My Personal Information‬‭> Reset My‬


‭Security Token‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭10‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭20.‬‭If you did not already request a security token, click the‬‭Reset Security Token‬
‭button.‬

‭NOTE:‬‭A security token will be sent to your email in a few minutes. You will need‬
‭this token to make API calls to Salesforce from your Mule applications.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭11‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭ odule 1: Accessing and modifying Mule‬


M
‭events‬

‭At the end this module, you should be able to:‬


‭●‬ ‭Log event data.‬

‭●‬ ‭Debug Mule applications.‬

‭●‬ ‭Read and write event properties.‬

‭●‬ ‭Write expressions with the DataWeave expression language.‬

‭●‬ ‭Create variables.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭12‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 1-1: View event data‬

‭In this walkthrough, you create a new project to use in the next two modules to learn‬
‭about Mule events and Mule applications. You will:‬

‭●‬ ‭Create a new Mule project with an HTTP Listener and set the event payload.‬

‭●‬ ‭View event data in the DataSense Explorer.‬

‭●‬ ‭Use a Logger to view event data in the Anypoint Studio console.‬

‭Create a new Mule project‬

‭1.‬ ‭Return to Anypoint Studio.‬

‭2.‬ ‭Select‬‭File > New > Mule Project‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭13‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭3.‬ ‭Set the project name to‬‭apdev-examples‬‭and click‬‭Finish‬‭.‬

‭Create an HTTP Listener to receive requests‬

‭4.‬ ‭In the Mule Palette, select‬‭Favorites‬‭.‬

‭5.‬ ‭Drag an‬‭HTTP Listener‬‭from the Mule Palette to the‬‭canvas.‬

‭6.‬ ‭In the Listener properties view, click the‬‭Add‬‭button‬‭next to Connector‬


‭configuration.‬

‭7.‬ ‭In the Global Element Properties dialog box, verify the host value is set to‬
‭0.0.0.0‬‭and the port value to‬‭8081‬‭.‬

‭8.‬ ‭Click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭14‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭9.‬ ‭In the Listener properties view, set the path to‬‭/hello‬‭.‬

‭10.‬‭Click the‬‭Advanced‬‭tab and set the allowed methods to‬‭GET‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭15‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Click the‬‭General‬‭tab and set the display name to‬‭GET /hello‬‭.‬

‭Change the flow name‬

‭12.‬‭Select the flow.‬

‭13.‬‭In the apdev-examplesFlow properties view, change the name to‬‭helloFlow‬‭.‬

‭Set the event payload‬

‭14.‬‭Drag a‬‭Set Payload‬‭transformer from the Favorites‬‭section of the Mule Palette‬


‭into the process section of the flow.‬

‭15.‬‭In the Set Payload properties view, set the display name to‬‭Hello‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭16‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭16.‬‭Switch the value to literal mode and set its value to‬‭Hello‬‭.‬

‭Add a Logger‬

‭17.‬‭Drag a Logger component from the Mule Palette and drop it at the end of the‬
‭flow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭17‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭View event structure and metadata in the DataSense Explorer‬

‭18.‬‭Select the‬‭GET /hello‬‭HTTP Listener‬‭and locate the DataSense Explorer in the‬


‭right side of its properties view.‬

‭19.‬‭In the Input tab, examine Payload and Attributes.‬

‭20.‬‭Select the‬‭Output‬‭tab and examine Payload, Attributes,‬‭and‬


‭HttpRequestAttributes.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭18‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Select the‬‭Set Payload‬‭component in helloFlow.‬

‭22.‬‭In the DataSense Explorer, examine‬‭Payload‬‭and‬‭Attributes‬‭on the Input tab.‬

‭23.‬‭Select the‬‭Output‬‭tab and examine‬‭Payload‬‭and‬‭Attributes‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭19‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭24.‬‭Select the‬‭Logger‬‭component in helloFlow.‬

‭25.‬‭In the DataSense Explorer, examine‬‭Payload‬‭and‬‭Attributes‬‭on the Input tab.‬

‭26.‬‭Select the‬‭Output‬‭tab and examine‬‭Payload‬‭and‬‭Attributes‬‭.‬

‭Run the application and review response data‬

‭27.‬‭Save the file and run the project.‬

‭28.‬‭Return to‬‭Advanced REST Client‬‭and click the button‬‭to create a new tab.‬

‭NOTE:‬‭You are adding a new tab so that you can keep‬‭the request to the American‬
‭API you created in the Getting Started with Anypoint Platform course saved in‬
‭another tab for later use.‬

‭29.‬‭In the new tab, make a GET request to‬‭http://localhost:8081/hello‬‭; you‬


‭should see‬‭Hello‬‭displayed.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭20‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭View event data in the Anypoint Studio console‬

‭30.‬‭Return to Anypoint Studio and look at the console.‬

‭31.‬‭Locate the data displayed by using the Logger.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭21‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭32.‬‭Review the event attributes.‬

‭Send query parameters with a request‬

‭33.‬‭Return to Advanced REST Client and add a query parameter with a key of‬
‭fname‬‭and a value of‬‭max‬‭.‬

‭34.‬‭Add a second key/value pair of‬‭lname‬‭and‬‭mule‬‭.‬

‭35.‬‭Click‬‭Send‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭22‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭36.‬‭Return to Anypoint Studio and look at the console.‬

‭37.‬‭Locate the query parameters in the logged event data.‬

‭38.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭23‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 1-2: Debug a Mule application‬

‭In this walkthrough, you debug and step through the code in a Mule application. You‬
‭will:‬

‭●‬ ‭Locate the port used by the Mule Debugger.‬

‭●‬ ‭Add a breakpoint, debug an application, and step through the code.‬

‭●‬ ‭Use the Mule Debugger to view event properties.‬

‭●‬ ‭Pass query parameters to a request and locate them in the Mule Debugger.‬

‭●‬ ‭Increase the request timeout for Advanced REST Client.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭24‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Locate the port used by the Mule Debugger‬

‭1.‬ ‭Return to Anypoint Studio.‬

‭2.‬ ‭In the main menu bar, select‬‭Run > Debug Configurations‬‭.‬

‭3.‬ ‭Select‬‭apdev-examples‬‭in the left menu bar under Mule‬‭Applications; you‬


‭should see that the apdev-examples project is selected to launch.‬

‭4.‬ ‭Select the‬‭Mule Debug‬‭tab; you should see the debugger‬‭port is set to 6666‬
‭for the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭25‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE:‬‭If you know you have another program using port‬‭6666 like McAfee on‬
‭Windows, change this to a different value. Otherwise, you can test the Debugger first‬
‭and come back and change the value here later if there is a conflict.‬

‭5.‬ ‭Click‬‭Close‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭26‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add a breakpoint‬

‭6.‬ ‭Right-click the‬‭Set Payload‬‭component and select‬‭Add‬‭breakpoint‬‭.‬

‭Debug the application‬

‭7.‬ ‭Right-click in the canvas and select‬‭Debug project‬‭apdev-examples‬‭.‬

‭NOTE:‬‭You can also select Run > Debug or click the‬‭Debug button in the main menu‬
‭bar.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭27‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭8.‬ ‭If you get a Confirm Perspective Switch dialog box, select‬‭Remember my‬
‭decision‬‭and click‬‭Yes‬‭.‬

‭9.‬ ‭Look at the console and wait until the application starts.‬

‭10.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/hello?fname=max&lname=mule‬‭.‬

‭View event data in the Mule Debugger‬

‭11.‬‭Return to Anypoint Studio and locate the‬‭Mule Debugger‬‭view.‬

‭12.‬‭Look at the value of the payload.‬

‭13.‬‭Expand‬‭Attributes‬‭and review the values.‬

‭14.‬‭Expand‬‭queryParams‬‭and review the values.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭28‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Step through the application‬

‭15.‬‭Click the‬‭Next processor‬‭button.‬

‭16.‬‭Look at the new value of the payload; it should be‬‭Hello‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭29‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭17.‬‭Expand‬‭Attributes‬‭and review the values.‬

‭18.‬‭Click the‬‭Next processor‬‭button again to finish stepping‬‭through the‬


‭application.‬

‭Use Resume to step to the next breakpoint and then the end of‬
‭the application‬

‭19.‬‭Add a breakpoint to the Logger.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭30‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭20.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/hello?fname=max&lname=mule‬‭.‬

‭21.‬‭In the Mule Debugger, click the‬‭Resume‬‭button; you‬‭should step to the‬


‭Logger.‬

‭22.‬‭Click the‬‭Resume‬‭button again; you should step through‬‭the rest of the‬


‭application.‬

‭Cause the HTTP request to timeout‬

‭23.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/hello?fname=max&lname=mule‬‭.‬

‭24.‬‭Do not step through the application and wait (90 seconds by default) for the‬
‭request to timeout.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭31‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Increase the request timeout for Advanced REST Client‬

‭25.‬‭In the Advanced REST Client main menu, select‬‭File‬‭then‬‭Settings‬‭to navigate‬


‭to the application settings.‬

‭NOTE:‬‭Depending on your platform, accessing the application‬‭settings may differ‬


‭such as AdvancedRestClient then Preferences.‬

‭26.‬‭In the application settings, locate the‬‭Request timeout‬‭setting and click the‬
‭arrow next to it.‬

‭27.‬‭Change the request timeout to‬‭300 seconds‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭32‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭28.‬‭Click the arrow next to‬‭API Client‬‭to return to the request.‬

‭29.‬‭In the main screen, verify the tab with your last failed request is selected.‬

‭Switch perspectives‬

‭30.‬‭Return to Anypoint Studio.‬

‭31.‬‭Click the‬‭Resume‬‭button twice to finish stepping through‬‭the application.‬

‭32.‬‭Click the‬‭Mule Design‬‭button in the upper-right corner‬‭of Anypoint Studio to‬


‭switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭33‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE:‬‭In Eclipse, a perspective is a specific arrangement of views in specific locations.‬


‭You can rearrange the perspective by dragging and dropping tabs and views to‬
‭different locations. Use the Window menu in the main menu bar to save and reset‬
‭perspectives.‬

‭33.‬‭Leave the project running.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭34‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 1-3: Track event data as it moves in and out of‬


‭a Mule application‬

‭In this walkthrough, you call an external resource, which for simplicity is another‬
‭HTTP Listener in the same application, so that you can watch event data as it moves‬
‭in and out of a Mule application. You will:‬

‭●‬ ‭Create a second flow with an HTTP Listener.‬

‭●‬ ‭Make an HTTP request from the first flow to the new HTTP Listener.‬

‭●‬ ‭View the event data as it moves through both flows.‬

‭NOTE:‬‭You are making an HTTP request from one flow‬‭to another in this exercise only‬
‭so you can watch the value of event data as it moves in and out of a Mule application.‬
‭You will learn how to pass events between flows within and between Mule‬
‭applications in the next module.‬

‭Starting file‬

‭If you did not complete walkthrough 1-1, you can get a starting file ‬‭here‬‭. This file is‬
‭also located in the solutions folder of the student files ZIP located in the Course‬
‭Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭35‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a second flow with an HTTP Listener‬

‭1.‬ ‭Return to apdev-examples.xml.‬

‭2.‬ ‭Drag an HTTP Listener from the Mule Palette and drop it in the canvas beneath‬
‭the first flow.‬

‭3.‬ ‭Change the name of the flow to goodbyeFlow.‬

‭4.‬ ‭In the Listener view, ensure the connector configuration is set to the existing‬
‭HTTP_Listener_config‬‭.‬

‭5.‬ ‭Set the path to‬‭/goodbye‬‭and the allowed methods to‬‭GET‬‭.‬

‭6.‬ ‭Set the display name to‬‭GET /goodbye‬‭.‬

‭7.‬ ‭Add a‬‭Set Payload‬‭transformer and a‬‭Logger‬‭to the‬‭flow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭36‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭8.‬ ‭In the Set Payload properties view, set the display name to‬‭Goodbye‬‭and then‬
‭use literal mode to set the value to‬‭Goodbye‬‭.‬

‭Make an HTTP request‬

‭9.‬ ‭From the Mule Palette, drag an‬‭HTTP Request‬‭to the‬‭canvas and drop it before‬
‭the Logger in helloFlow.‬

‭10.‬‭In the Request properties view, set the display name to‬‭GET /goodbye‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭37‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Set the path to‬‭/goodbye‬‭and leave the method set to GET.‬

‭12.‬‭Click the‬‭Add‬‭button next to configuration.‬

‭13.‬‭In the HTTP Request configuration dialog box, set the host to‬‭localhost‬‭and‬
‭the port to‬‭8081‬‭and click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭38‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭View event structure and metadata in the DataSense Explorer‬

‭14.‬‭In the DataSense Explorer, examine‬‭Payload‬‭,‬‭Attributes‬‭,‬‭and‬


‭HttpRequestAttributes‬‭on the Input tab.‬

‭15.‬‭Select the‬‭Output‬‭tab and examine‬‭Payload‬‭,‬‭Attributes‬‭, and‬


‭HttpResponseAttributes‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭39‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Change timeout for HTTP Request response‬

‭16.‬‭In the properties view for the GET /goodbye HTTP Request, click the‬‭Response‬
‭tab.‬

‭17.‬‭Set the Response timeout to‬‭300000‬‭.‬

‭NOTE:‬‭This is being set only for debugging purposes‬‭so that the HTTP Request does‬
‭not timeout when you are stepping through the application and examining data in‬
‭the Mule Debugger.‬

‭Debug the application‬

‭18.‬‭Save the file to redeploy the application.‬

‭19.‬‭In Advanced REST Client, send the same request to‬


‭http://localhost:8081/hello?fname=max&lname=mule‬‭.‬

‭20.‬‭In the Mule Debugger, step to the‬‭GET /goodbye‬‭request.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭40‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Look at the values of the payload and the attributes, including the‬
‭queryParams.‬

‭22.‬‭Step into‬‭goodbyeFlow‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭41‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭Look at the values of the payload and the attributes.‬

‭24.‬‭Step through the flow until the event returns to the Logger in helloFlow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭42‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭25.‬‭Look at the values of the payload and the attributes.‬

‭26.‬‭Step through the rest of the application.‬

‭Review response data‬

‭27.‬‭Return to Advanced REST Client and view the return data and the http status‬
‭code.‬

‭28.‬‭Select Headers from the options menu above the http status code.‬

‭29.‬‭Look at the response headers; you should see content-type, content-length,‬


‭and date headers.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭43‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭30.‬‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭44‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 1-4: Set request and response data‬

‭In this walkthrough, you set response and request data for HTTP Listener and HTTP‬
‭Request operations. You will:‬

‭●‬ ‭View the default setting for a response body.‬

‭●‬ ‭Set a response header.‬

‭●‬ ‭View the default setting for a request body.‬

‭●‬ ‭Set a request query parameter.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭45‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Starting file‬

I‭ f you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭View default response body‬

‭1.‬ ‭Return to‬‭apdev-examples.xml‬‭.‬

‭2.‬ ‭Double-click the‬‭GET /hello HTTP Listener‬‭in helloFlow.‬

‭3.‬ ‭In the GET /hello properties view, click the‬‭Responses‬‭tab.‬

‭4.‬ ‭In the Response section, locate the expression that sets the response body by‬
‭default to the value of the payload.‬

‭Set a response header‬

‭5.‬ ‭In the Headers section for the response, click the‬‭Add‬‭button.‬

‭6.‬ ‭Set the name to‬‭"name"‬‭and the value to “‬‭Max”‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭46‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭7.‬ ‭Locate the status code field and leave it blank so the default value‬‭200‬‭is‬
‭returned.‬

‭8.‬ ‭Set the reason phrase to‬‭Success‬‭.‬

‭Run the application and review response data‬

‭9.‬ ‭Save the file to deploy the project.‬

‭10.‬‭Return to Advanced REST Client and send the same request.‬

‭11.‬‭In the Mule Debugger, click‬‭Resume‬‭until you step‬‭through the application.‬

‭12.‬‭In Advanced REST Client, locate the status code and your new reason phrase‬
‭on the Raw or Response tab.‬

‭13.‬‭On the Headers tab, review the response headers; you should now see the‬
‭new name header.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭47‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭View default request body‬

‭14.‬‭Return to Anypoint Studio and switch perspectives.‬

‭15.‬‭Double-click the‬‭GET /goodbye HTTP Request‬‭in helloFlow.‬

‭16.‬‭In the GET /goodbye properties view, locate the Request section on the‬
‭General tab.‬

‭17.‬‭On the Body tab, locate the expression that sets the request body by default to‬
‭the value of the payload.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭48‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Set a request query parameter‬

‭18.‬‭Select the Query Parameters tab and click the‬‭Add‬‭button.‬

‭19.‬‭Set the name to "fullName" and the value to‬‭"Max Mule"‬‭.‬

‭Debug and verify that the query parameter is sent with the‬
‭request‬

‭20.‬‭Save the file to redeploy the project.‬

‭21.‬‭Return to Advanced REST Client and send the same request.‬

‭22.‬‭Return to the Mule Debugger and step into‬‭goodbyeFlow‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭49‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭Expand‬‭Attributes‬‭and locate the‬‭fullName‬‭query parameter.‬

‭24.‬‭Step through the rest of the application.‬

‭25.‬‭Switch to the‬‭Mule Design‬‭perspective.‬

‭26.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭50‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 1-5: Get and set event data using DataWeave‬


‭expressions‬

‭In this walkthrough, you get and set event data using DataWeave expressions. You‬
‭will:‬

‭●‬ ‭Use expressions to set the payload and a logged value.‬

‭●‬ ‭Use expressions to set a response header and a request query parameter.‬

‭●‬ ‭In expressions, reference values for the event payload and attributes.‬

‭●‬ ‭Use the DataWeave upper() function, the concatenation, as, and default‬
‭operators.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Use an expression to set the payload‬

‭1.‬ ‭Return to apdev-examples.xml.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭51‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭2.‬ ‭Navigate to the properties view for the Goodbye Set Payload transformer in‬
‭goodbyeFlow.‬

‭3.‬ ‭Use expression mode to change the value to an expression.‬

#['Goodbye']‬

‭4.‬ ‭Save the file and run the project.‬

‭5.‬ ‭In Advanced REST Client, send the same request; you should get the same‬
‭result of Goodbye as before.‬

‭Use a DataWeave function‬

‭6.‬ ‭In Anypoint Studio, return to the Goodbye Set Payload properties view.‬

‭7.‬ ‭Inside the brackets and before the string, type the word‬‭up‬‭and press‬
‭Ctrl+Spacebar‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭52‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭8.‬ ‭Ensure auto-completion inserts the upper function.‬

‭9.‬ ‭Move the Goodbye string into the parentheses.‬

#[upper('Goodbye')]‬

‭10.‬‭Save the file to redeploy the application.‬

‭11.‬‭In Advanced REST Client, send the same request; the return string should now‬
‭be in upper case.‬

‭Use an expression that references the payload in a Logger‬

‭12.‬‭Return to Anypoint Studio.‬

‭13.‬‭Navigate to the properties view for the Logger in helloFlow.‬

‭14.‬‭Change the display name to payload.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭53‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭15.‬‭Type‬‭#‬‭in the message field and double-click‬‭#[payload]‬‭in the‬


‭auto-completion menu.‬

‭16.‬‭Save the file to redeploy the application.‬

‭17.‬‭In Advanced REST Client, send the same request.‬

‭18.‬‭Return to the console in Anypoint Studio; you should see GOODBYE displayed‬
‭for the second Logger instead of the entire event object.‬

‭Use a string literal and a DataWeave expression in a property‬


‭value‬

‭19.‬‭Return to the properties view for the Logger in helloFlow.‬

‭20.‬‭Switch the message field to literal mode then change the value to display the‬
‭string Message in front of the payload.‬

Message: #[payload]‬

‭21.‬‭Save the file to redeploy the application.‬

‭22.‬‭In Advanced REST Client, send the same request.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭54‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭Return to the console in Anypoint Studio; you should see the new string‬
‭displayed.‬

‭24.‬‭Return to the properties view for the Logger in helloFlow.‬

‭Use the DataWeave concatenation operator‬

‭25.‬‭Switch the message field to expression mode then change its value so the‬
‭string is part of the evaluated expression and use the concatenation operator.‬

#['Message: ' ++ payload]‬


‭26.‬‭Add‬‭\n‬‭in front of the message to display it on a‬‭new line.‬

‭27.‬‭Save the file to redeploy the application.‬

‭28.‬‭In Advanced REST Client, send the same request.‬

‭29.‬‭Return to the console in Anypoint Studio; you should see the same string‬
‭displayed on a new line.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭55‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Use an expression that references an attribute in a Logger‬

‭30.‬‭Navigate to the properties view for the Logger in goodbyeFlow.‬

‭31.‬‭Change the display name to‬‭fullName‬‭.‬

‭32.‬‭Switch the message field to expression mode then type the word‬‭at‬‭and press‬
‭Ctrl+Spacebar‬‭; you should see auto-completion insert‬‭the attributes keyword.‬

‭33.‬‭At the end of attributes, add a period, type‬‭q‬‭and‬‭double-click‬‭queryParams‬‭in‬


‭the auto-completion menu.‬

#[attributes.queryParams]‬

‭34.‬‭Click‬‭Apply Changes‬‭to redeploy the application.‬

‭35.‬‭In Advanced REST Client, send the same request.‬

‭36.‬‭Return to the Anypoint Studio console; you should see an object displayed by‬
‭the first Logger.‬

‭37.‬‭Modify the message for the Logger in goodbyeFlow to display the value of the‬
‭query parameter.‬

#[attributes.queryParams.fullName]‬

‭38.‬‭Click‬‭Apply Changes‬‭to redeploy the application.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭56‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭39.‬‭In Advanced REST Client, send the same request.‬

‭40.‬‭Return to the console; you should now see the value of the parameter‬
‭displayed.‬

‭Use an expression that references an attribute when setting the‬


‭payload‬

‭41.‬‭Navigate to the properties view for the Goodbye Set Payload in goodbyeFlow.‬

‭42.‬‭Use the concatenation operator to also display the value of the query‬
‭parameter separated by a space.‬

#[upper('Goodbye') ++ ' ' ++‬



attributes.queryParams.fullName]‬

‭43.‬‭Select the‬‭Problems‬‭tab and review the error.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭57‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Use the as operator to coerce the attribute to a String‬

‭44.‬‭Add the as operator to display the value of the query parameter as a string.‬

#[upper('Goodbye') ++ ' ' ++ attributes.queryParams.fullName‬



as String]‬

‭NOTE:‬‭This step coerces a null value to a String,‬‭to avoid UI errors. The recommended‬
‭way to handle null values is by using a default value, which is explained later in this‬
‭walkthrough.‬

‭45.‬‭Click‬‭Apply Changes‬‭to redeploy the application.‬

‭46.‬‭In Advanced REST Client, send the same request; you should now also see the‬
‭name displayed.‬

‭Use an expression to set a request header‬

‭47.‬‭Return to the Anypoint Studio and navigate to the properties view for the GET‬
‭/goodbye HTTP Request in helloFlow.‬

‭48.‬‭In the Request section, select the‬‭Query Parameters‬‭tab.‬

‭49.‬‭Change the value of‬‭fullName‬‭to the value of the‬‭fname‬‭query parameter.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭58‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭50.‬‭Click‬‭Apply Changes‬‭to redeploy the application.‬

‭51.‬‭In Advanced REST Client, send the same request; you should now see the‬
‭name of the fname query parameter displayed.‬

‭Make a request and do not send a query parameter‬

‭52.‬‭Remove the query parameters and make a request to‬


‭http://localhost:8081/hello‬‭; you should get an error.‬

‭Set a default value in an expression‬

‭53.‬‭Return to the Anypoint Studio and navigate to the properties view for the‬
‭Goodbye Set Payload in goodbyeFlow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭59‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭54.‬‭Remove‬‭as String‬‭.‬

‭55.‬‭Use the default operator to add a default value of‬‭Maxine‬‭.‬

#[upper('Goodbye') ++ ' ' ++‬



(attributes.queryParams.fullName‬‭
‭ default‬‭
'Maxine')]‬

‭56.‬‭Click‬‭Apply Changes‬‭to redeploy the application.‬

‭57.‬‭In Advanced REST Client, send the same request; you should now see the‬
‭default value Maxine displayed.‬

‭Use a query parameter in the expression for a response header‬

‭58.‬‭Return to the Anypoint Studio and navigate to the properties view for the GET‬
‭/hello HTTP Listener.‬

‭59.‬‭Select the‬‭Responses‬‭tab.‬

‭60.‬‭Change the name header value to the value of the‬‭fname‬‭query parameter.‬

attributes.queryParams.fname‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭60‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭61.‬‭Click‬‭Apply Changes‬‭to redeploy the application.‬

‭62.‬‭In Advanced REST Client, add an‬‭fname‬‭query parameter‬‭and set it equal to‬
‭max or some other value and send the request.‬

‭63.‬‭Look at the response headers; you should no longer see a name header.‬

‭Debug and verify that the query parameter is sent with the‬
‭request‬

‭64.‬‭Return to Anypoint Studio.‬

‭65.‬‭Stop and then debug the project.‬

‭66.‬‭Return to Advanced REST Client and send the same request.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭61‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭67.‬‭Return to the Mule Debugger and look at the attributes and query parameters;‬
‭you should see the fname query parameter.‬

‭68.‬‭Step into goodbyeFlow and look at the attributes and query parameters; you‬
‭should see the fullName query parameter.‬

‭69.‬‭Step back to helloFlow and look at the value of the attributes; you should not‬
‭see any query parameters.‬

‭70.‬‭Step through the rest of the application.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭62‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭71.‬‭Switch to the Mule Design perspective.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭63‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 1-6: Set and get variables‬

‭In this walkthrough, you create variables associated with an event. You will:‬

‭●‬ ‭Use the Set Variable transformer to create a variable.‬

‭●‬ ‭Reference a variable in a DataWeave expression.‬

‭●‬ ‭Use a variable to dynamically set a response header.‬

‭●‬ ‭Use the Mule Debugger to see the value of a variable.‬

‭●‬ ‭Track variables across a transport boundary.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭64‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add the Set Variable transformer to the Favorites section of the‬


‭Mule Palette‬

‭1.‬ ‭Return to‬‭apdev-examples.xml‬‭.‬

‭2.‬ ‭In the Mule Palette, select‬‭Core‬‭.‬

‭3.‬ ‭Locate the Set Variable transformer and right-click it and select‬‭Add to‬
‭favorites‬‭.‬

‭Create a variable‬

‭4.‬ ‭Drag the‬‭Set Variable‬‭transformer from the Favorites‬‭section of the Mule‬


‭Palette and drop it after the GET /hello HTTP Listener in helloFlow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭65‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭5.‬ ‭In the Set Variable properties view, set the display name and name to‬
‭firstName.‬

‭6.‬ ‭Set the value to your query parameter, fname.‬

‭Use an expression that references the variable to set a response‬


‭header‬

‭7.‬ ‭Return to the properties view for the GET /hello HTTP Listener in helloFlow.‬

‭8.‬ ‭Select the‬‭Responses‬‭tab.‬

‭9.‬ ‭Change the name header value from‬‭attributes.queryParams.fname‬‭to the‬


‭value of the‬‭firstName‬‭variable.‬

vars.firstName‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭66‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭View variables in the Mule Debugger‬

‭10.‬‭Save the file to redeploy the project in debug mode.‬

‭11.‬‭In Advanced REST Client, send the same request.‬

‭12.‬‭In the Mule Debugger, locate and expand the new‬‭Variables‬‭section; you‬
‭should see your firstName variable.‬

‭13.‬‭Step into‬‭goodbyeFlow‬‭; you should see no variables‬‭in the vars section.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭67‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭14.‬‭Step back to‬‭helloFlow‬‭; you should see the Variables section again with your‬
‭firstName variable.‬

‭15.‬‭Step through the rest of the application.‬

‭16.‬‭Return to Advanced REST Client; you should see the header with the value of‬
‭the query parameter.‬

‭17.‬‭Change the value of the query parameter and send another request.‬

‭18.‬‭In the Mule Debugger, click the‬‭Resume‬‭button until‬‭you step through the‬
‭application.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭68‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭19.‬‭Return to Advanced REST Client; you should see the new query parameter‬
‭value returned in both the body and the header.‬

‭20.‬‭Return to Anypoint Studio and switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭69‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Module 2: Structuring Mule applications‬

‭At the end of this module, you should be able to:‬

‭●‬ ‭Create applications composed of multiple flows and subflows.‬

‭●‬ ‭Pass events between flows using asynchronous queues.‬

‭●‬ ‭Encapsulate global elements in separate configuration files.‬

‭●‬ ‭Specify application properties in a separate properties file and use them in the‬
‭application.‬

‭●‬ ‭Describe the purpose of each file and folder in a Mule project.‬

‭●‬ ‭Define and manage application metadata.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭70‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 2-1: Create and reference subflows and private‬


‭flows‬

‭In this walkthrough, you continue to work with apdev-examples.xml. You will:‬

‭●‬ ‭Extract processors into separate subflows and private flows.‬

‭●‬ ‭Use the Flow Reference component to reference other flows.‬

‭●‬ ‭Explore event data persistence through subflows and private flows.‬

‭Starting file‬

I‭ f you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭71‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Collapse a flow‬

‭1.‬ ‭Return to‬‭apdev-examples.xml‬‭in Anypoint Studio.‬

‭2.‬ ‭Click the arrow to the left of the‬‭goodbyeFlow‬‭to‬‭collapse it.‬

‭Create a subflow‬

‭3.‬ ‭In the Mule Palette, select‬‭Core‬‭.‬

‭4.‬ ‭Drag a‬‭Sub Flow‬‭scope from the Mule Palette and drop‬‭it between the existing‬
‭flows in the canvas.‬

‭5.‬ ‭Right-click the‬‭Set Payload‬‭transformer in helloFlow‬‭and select‬‭Remove‬


‭breakpoint‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭72‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭6.‬ ‭Select the‬‭Set Variable‬‭and‬‭Set Payload‬‭transformers in helloFlow and drag‬


‭them into the subflow.‬

‭Reference a subflow‬

‭7.‬ ‭Drag a‬‭Flow Reference‬‭component from the Mule Palette‬‭and drop it into‬
‭helloFlow between the GET /hello HTTP Listener and the GET /goodbye HTTP‬
‭Request.‬

‭8.‬ ‭In the Flow Reference properties view, set the flow name to‬
‭apdev-examplesSub_Flow‬‭and the display name to‬‭subflow‬‭.‬

‭9.‬ ‭Change the name of the subflow from‬‭apdev-examplesSub_Flow‬‭to‬‭subflow‬‭.‬

‭10.‬‭In the subflow Flow Reference properties view, notice that value in the Flow‬
‭name field has been automatically changed to subflow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭73‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Add a breakpoint to the subflow Flow Reference.‬

‭Extract processors into another flow‬

‭12.‬‭Right-click the‬‭GET /goodbye HTTP Request‬‭and select‬‭Extract to > Flow‬‭.‬

‭13.‬‭In the Extract Flow dialog box, set the flow name to‬‭privateFlow‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭74‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭14.‬‭Click the‬‭Metadata Preferences‬‭button and review the metadata propagation‬


‭information.‬

‭15.‬‭Leave the target Mule configuration set to‬‭Current‬‭and click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭75‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭16.‬‭Look at the new Flow Reference properties view; set the display name to‬
‭privateFlow‬‭.‬

‭17.‬‭Drag‬‭privateFlow‬‭above‬‭subflow‬‭in the canvas.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭76‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭18.‬‭Save the file to redeploy the application in debug mode.‬

‭19.‬‭In Advanced REST Client, send a request to‬


‭http://localhost:8081/hello?fname=Maxwell‬‭.‬

‭20.‬‭In the Mule Debugger, step through the application, watching as you step into‬
‭and out of the flows and subflows.‬

‭21.‬‭Step through the rest of the application.‬

‭22.‬‭In Advanced REST Client, send the same request again.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭77‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭In the Mule Debugger, step through the application again, this time watching‬
‭the values of the attributes, payload, and variables in each of the flows.‬

‭24.‬‭Step through the rest of the application.‬

‭25.‬‭Switch to the‬‭Mule Design‬‭perspective.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭78‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 2-2: Trigger flows using the VM connector‬

‭In this walkthrough, you trigger flows to run both synchronously and asynchronously.‬
‭You will:‬

‭●‬ ‭Trigger flows using the VM connector.‬

‭●‬ ‭Explore variable persistence with VM communication.‬

‭●‬ ‭Publish content to a VM queue and then wait for a response.‬

‭●‬ ‭Publish content to a VM queue without waiting for a response.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Add the VM module to the project‬

‭1.‬ ‭Return to‬‭apdev-examples.xml‬‭.‬

‭2.‬ ‭In the Mule Palette, select‬‭Add Modules‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭79‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭3.‬ ‭Select the‬‭VM connector‬‭in the right side of the Mule Palette and drag and‬
‭drop it into the left side.‬

‭4.‬ ‭In the Package Explorer, locate the‬‭JAR‬‭file for the‬‭VM connector.‬

‭Add a VM Publish Consume operation‬

‭5.‬ ‭In helloFlow, delete the‬‭privateFlow‬‭Flow Reference.‬

‭6.‬ ‭Select‬‭VM‬‭in the Mule Palette.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭80‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭7.‬ ‭Select the‬‭Publish consume‬‭operation and drag and drop it before the‬‭Logger‬
‭in helloFlow.‬

‭8.‬ ‭In the Publish consume properties view, change the display name to‬‭VM‬
‭goodbye‬‭.‬

‭9.‬ ‭Click the‬‭Add‬‭button next to connector configuration.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭81‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭10.‬‭In the queues dropdown menu, select‬‭Edit inline‬‭then click the‬‭Add Queue‬
‭button.‬

‭11.‬‭In the Queue dialog box, set the queue name to‬‭goodbye‬‭and click‬‭Finish‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭82‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭12.‬‭In the Global Element Properties dialog box, click‬‭OK‬‭.‬

‭13.‬‭In the VM goodbye Publish consume properties view, set the queue name to‬
‭goodbye‬‭.‬

‭NOTE:‬‭If you do not see the queue name in the dropdown‬‭menu, click the refresh‬
‭icon for it to be populated and then set it.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭83‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭14.‬‭Set the timeout to‬‭300 seconds‬‭for debugging purposes.‬

‭Add a VM Listener‬

‭15.‬‭Expand‬‭goodbyeFlow‬‭and delete its‬‭HTTP Listener‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭84‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭16.‬‭Locate the‬‭Listener‬‭operation for the VM connector in the right side of the‬


‭Mule Palette and drag and drop it in the source section of goodbyeFlow.‬

‭17.‬‭In the VM Listener properties view, change the display name to‬‭VM goodbye‬‭.‬

‭18.‬‭Ensure the connector configuration is set to the existing‬‭VM_Config‬‭then, if‬


‭necessary, set the queue name to‬‭goodbye‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭85‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭19.‬‭Save the file to redeploy the project in debug mode.‬

‭20.‬‭In Advanced REST Client, send the same request.‬

‭21.‬‭In the Mule Debugger, step through the application to the‬‭VM Publish‬
‭consume‬‭.‬

‭22.‬‭Look at the payload, attributes, and variables.‬

‭23.‬‭Step into‬‭goodbyeFlow‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭86‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭24.‬‭Look at the payload, attributes, and variables (or lack thereof).‬

‭25.‬‭Step through the flow until the event returns to helloFlow.‬

‭26.‬‭Look at the payload, attributes, and variables.‬

‭27.‬‭Step through the rest of the application.‬

‭28.‬‭Switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭87‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Change the VM Publish Consume operation to Publish‬

‭29.‬‭Delete the‬‭VM Publish consume‬‭operation in helloFlow.‬

‭30.‬‭Drag a‬‭VM Publish operation‬‭from the Mule Palette‬‭and drop it before the‬
‭Logger.‬

‭31.‬‭In the Publish properties view, set the display name to‬‭VM goodbye‬‭.‬

‭32.‬‭Ensure the connector configuration is set to the existing‬‭VM_Config‬‭and the‬


‭queue name is set to‬‭goodbye‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭88‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭33.‬‭Save the file to redeploy the project in debug mode.‬

‭34.‬‭In Advanced REST Client, send the same request.‬

‭35.‬‭In the Mule Debugger, step through the application to the VM Publish‬
‭operation.‬

‭36.‬‭Step again; you should step to the Logger in helloFlow.‬

‭37.‬‭Look at the value of the payload.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭89‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭38.‬‭Step again; you should see execution stopped in goodbyeFlow.‬

‭39.‬‭Step to the end of the application.‬

‭40.‬‭Return to Advanced REST Client; you should see a response of Hello – not‬
‭GOODBYE.‬

‭41.‬‭Return to Anypoint Studio and switch perspectives.‬

‭42.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭90‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 2-3: Encapsulate global elements in a separate‬


‭configuration file‬

‭In this walkthrough, you refactor your apdev-examples project. You will:‬

‭●‬ ‭Create a new configuration file with an endpoint that uses an existing global‬
‭element.‬

‭●‬ ‭Create a configuration file global.xml for just global elements.‬

‭●‬ ‭Move the existing global elements to global.xml.‬

‭●‬ ‭Create a new global element in global.xml and configure a new connector to‬
‭use it.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭91‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a new configuration file‬

‭1.‬ ‭Return to the‬‭apdev-examples‬‭project.‬

‭2.‬ ‭In the Package Explorer, right-click the project and select‬‭New > Mule‬
‭Configuration File‬‭.‬

‭3.‬ ‭In the dialog box, set the name to accounts and click‬‭Finish‬‭.‬

‭4.‬ ‭Drag an HTTP Listener to the canvas from the Mule Palette.‬

‭5.‬ ‭In the Listener properties view, set the display name to‬‭GET /sfdc‬‭.‬

‭6.‬ ‭Ensure the connector configuration is set to the existing‬


‭HTTP_Listener_config‬‭.‬

‭7.‬ ‭Set the path to‬‭/sfdc‬‭and the allowed methods to‬‭GET‬‭.‬

‭8.‬ ‭Add a Transform Message component to the flow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭92‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭9.‬ ‭In the Transform Message properties view, change the output type to‬
‭application/json and set the expression to payload.‬

‭10.‬‭Change the name of the flow to‬‭getSFDCaccounts‬‭.‬

‭11.‬‭Switch to the Global Elements view; you should not see any global elements.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭93‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a global configuration file‬

‭12.‬‭Create a new Mule configuration file called‬‭global.xml‬‭.‬

‭13.‬‭In global.xml, switch to the‬‭Configuration XML‬‭view.‬

‭14.‬‭Place some empty lines between the start and end mule tags.‬

‭Move the existing global elements to the new global‬


‭configuration file‬

‭15.‬‭Return to‬‭apdev-examples.xml‬‭.‬

‭16.‬‭Switch to the‬‭Global Elements‬‭view and see there are‬‭three configurations.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭94‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭17.‬‭Switch to the Configuration XML view.‬

‭18.‬‭Select and cut the three configuration elements defined before the flows.‬

‭NOTE:‬‭If you delete the global elements from the Global‬‭Elements view instead, the‬
‭config-ref values are also removed from the connector operations and you need to‬
‭re-add them.‬

‭19.‬‭Return to the Message Flow view.‬

‭20.‬‭Return to‬‭global.xml‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭95‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Paste the global elements you cut to the clipboard between the start and end‬
‭mule tags.‬

‭NOTE:‬‭If you are prompted to regenerate ID values,‬‭click Yes.‬

‭22.‬‭Switch to the Global Elements view; you should see the three configurations.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭96‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭23.‬‭Return to‬‭apdev-examples.xml‬‭.‬

‭24.‬‭Select the‬‭GET /hello HTTP Listener‬‭in helloFlow; the connector configuration‬


‭should still be set to HTTP_Listener_config, which is now defined in global.xml.‬

‭25.‬‭Run the project.‬

‭26.‬‭In the dialog box, ensure all the resources are selected and click Save 3 of 3.‬

‭27.‬‭In Advanced REST Client, send the same request; you should still get a‬
‭response of Hello.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭97‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a new global element for the Salesforce component in‬


‭global.xml‬

‭28.‬‭Return to apdev-examples.xml.‬

‭29.‬‭In the Mule Palette, select‬‭Add Modules‬‭.‬

‭30.‬‭Select the‬‭Salesforce‬‭connector in the right side‬‭of the Mule Palette and drag‬
‭and drop it into the left side.‬

‭31.‬‭Locate the new set of Salesforce JAR files in the project.‬

‭32.‬‭Return to global.xml.‬

‭33.‬‭In the Global Elements view, click‬‭Create‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭98‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭34.‬‭In the Choose Global Type dialog box, select‬‭Connector Configuration >‬
‭Salesforce Config‬‭and click‬‭OK‬‭.‬

‭35.‬‭In the Global Element Properties dialog box, locate the Connection section‬
‭and enter your‬‭Salesforce username‬‭,‬‭password‬‭, and‬‭security token‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭99‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭36.‬‭Click‬‭Test Connection‬‭; your connection should be successful.‬

‭37.‬‭In the Test connection dialog box, click‬‭OK‬‭.‬

‭38.‬‭In the Global Element Properties dialog box, click‬‭OK‬‭; you should now see the‬
‭new configuration in global.xml.‬

‭Add a new Salesforce operation that uses the global configuration‬

‭39.‬‭Return to the Message Flow view in accounts.xml.‬

‭40.‬‭In the Mule Palette, select‬‭Salesforce‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭100‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭41.‬‭Locate the Query operation in the right side of the Mule Palette and drag and‬
‭drop it before the Transform Message component in getSFDCaccounts.‬

‭42.‬‭In the Query properties view, set the display name to‬‭Account‬‭.‬

‭43.‬‭Ensure the connector configuration is set to the existing‬‭Salesforce_Config‬‭.‬

‭44.‬‭Return to the course snippets.txt file and copy the‬‭Salesforce query‬‭.‬

‭45.‬‭Return to Anypoint Studio and paste the query in the Salesforce query section‬
‭of the Query properties view.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭101‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭46.‬‭Save all the files; the application should successfully redeploy.‬

‭47.‬‭In Advanced REST Client, send a GET request to‬‭http://localhost:8081/sfdc‬‭;‬


‭you should get a list of the accounts in your Salesforce account.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭102‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 2-4: Use property placeholders in connectors‬

‭In this walkthrough, you introduce properties into your API implementation. You will:‬

‭●‬ ‭Create a YAML properties file for an application.‬

‭●‬ ‭Configure an application to use a properties file.‬

‭●‬ ‭Define and use HTTP and Salesforce connector properties.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭103‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a properties file‬

‭1.‬ ‭Return to the‬‭apdev-examples‬‭project.‬

‭2.‬ ‭Right-click the‬‭src/main/resources‬‭folder in the Package Explorer and select‬


‭New > File‬‭.‬

‭3.‬ ‭Set the file name to‬‭config.yaml‬‭and click‬‭Finish‬‭.‬

‭Create a Configuration properties global element‬

‭4.‬ ‭Return to‬‭global.xml‬‭.‬

‭5.‬ ‭In the Global Elements view, click‬‭Create‬‭.‬

‭6.‬ ‭In the Choose Global Type dialog box, select‬‭Global‬‭Configurations >‬
‭Configuration properties‬‭and click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭104‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭7.‬ ‭In the Global Element Properties dialog box, set the file to‬‭config.yaml‬‭and‬
‭click‬‭OK‬‭.‬

‭Parameterize the HTTP Listener port‬

‭8.‬ ‭In config.yaml, define a property called‬‭http.port‬‭and set it to‬‭8081‬‭.‬

‭9.‬ ‭Save the file.‬

‭10.‬‭Return to‬‭global.xml‬‭.‬

‭11.‬‭Double-click the‬‭HTTP Listener‬‭config global element.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭105‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭12.‬‭Change the port from‬‭8081‬‭to the application property,‬‭${http.port}‬‭.‬

‭13.‬‭Click‬‭OK‬‭.‬

‭Parameterize the Salesforce credentials‬

‭14.‬‭Double-click the‬‭Salesforce Config‬‭global element.‬

‭15.‬‭Copy the username value and click‬‭OK‬‭.‬

‭16.‬‭Return to config.yaml.‬

‭17.‬‭Define a property called‬‭sfdc.username‬‭and set it‬‭to your Salesforce‬


‭username.‬

‭18.‬‭Add properties for password and token and set them to your values.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭106‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭19.‬‭Save the file.‬

‭20.‬‭Return to‬‭global.xml‬‭.‬

‭21.‬‭Double-click the‬‭Salesforce Config‬‭global element.‬

‭22.‬‭Change the values to use the application properties.‬

‭23.‬‭Click‬‭Test Connection‬‭and make sure it succeeds.‬

‭NOTE:‬‭If your connection fails, click OK and then‬‭go back and make sure you do not‬
‭have any syntax errors in config.yaml and that you saved the file.‬

‭24.‬‭Click‬‭OK‬‭.‬

‭25.‬‭In the Global Element Properties dialog box, click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭107‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭26.‬‭Save all files to redeploy the application.‬

‭27.‬‭In Advanced REST Client, make the same request to‬


‭http://localhost:8081/sfdc‬ ‭and confirm you still‬‭get data.‬

‭28.‬‭Return to Anypoint Studio and stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭108‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 2-5: Create a well-organized Mule project‬

‭In this walkthrough, you create a new project for the Mule United Airlines (MUA)‬
‭flights application that you will build during the course and then review and organize‬
‭its files and folders. You will:‬

‭●‬ ‭Create a project based on a new API in Design Center.‬

‭●‬ ‭Review the project's configuration and properties files.‬

‭●‬ ‭Create an application properties file and a global configuration file for the‬
‭project.‬

‭●‬ ‭Add Java files and test resource files to the project.‬

‭●‬ ‭Create and examine the contents of a deployable archive for the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭109‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a new API in Design Center using Import from File‬

‭1.‬ ‭Return to Anypoint Platform in a web browser.‬

‭2.‬ ‭In Design Center, select the‬‭Create +‬‭button and select‬‭Import from File‬‭.‬

‭3.‬ ‭In the Import from file dialog box, set the project name to‬‭MUA Flights API‬
‭then select the‬‭Choose file‬‭button.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭110‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭4.‬ ‭Browse to your student files and select the‬‭MUA Flights API.zip‬‭file located in‬
‭the resources folder.‬

‭5.‬ ‭Click‬‭Open‬‭.‬

‭6.‬ ‭Back in the Import from file dialog box, ensure‬‭API‬‭specification‬‭is selected‬
‭with‬‭REST API‬‭in its dropdown menu.‬

‭7.‬ ‭Click‬‭Import‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭111‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭8.‬ ‭Explore the API; be sure to look at what resources are defined, the name of‬
‭the query parameters, and the structure of the Flight data type.‬

‭Create a new project to implement this API in Anypoint Studio‬

‭9.‬ ‭Return to Anypoint Studio.‬

‭10.‬‭Right-click in the‬‭Package Explorer‬‭and select‬‭New‬‭> Mule Project‬‭.‬

‭11.‬‭In the New Mule Project dialog box, set the project name to‬‭apdev-flights-ws‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭112‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭12.‬‭Ensure the‬‭Download RAML from Design Center‬‭tab is selected.‬

‭13.‬‭On this tab, click the‬‭browse‬‭button next to‬‭Location‬‭.‬

‭14.‬‭Sign into Anypoint Platform if prompted, then, in the Browse Design Center for‬
‭APIs dialog box, select‬‭MUA Flights API‬‭and click‬‭OK‬‭.‬

‭15.‬‭In the New Mule Project dialog box, click‬‭Finish‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭113‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Locate the new RAML files in Anypoint Studio‬

‭16.‬‭In the Package Explorer, expand the folders in the‬‭src/main/resources‬‭folder‬


‭of the new‬‭apdev-flights-ws‬‭project; you should see‬‭the MUA Flights API files.‬

‭17.‬‭Open‬‭mua-flights-api.raml‬‭and review the file.‬

‭18.‬‭Leave the file open.‬

‭Review project configuration files‬

‭19.‬‭Look at the‬‭mua-flights-api.xml‬‭file that was created;‬‭it should have a‬


‭get:\flights‬‭flow and a‬‭post:\flights‬‭flow.‬

‭20.‬‭Rename‬‭mua-flights-api.xml‬‭to‬‭interface.xml‬‭.‬

‭21.‬‭Create a new Mule configuration file called‬‭implementation.xml‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭114‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭22.‬‭Locate‬‭log4j2.xml‬‭in src/main/resources and open it.‬

‭23.‬‭Review its contents and then close the file.‬

‭24.‬‭Locate pom.xml in the project and open it.‬

‭25.‬‭Review its contents.‬

‭26.‬‭Return to the apdev-examples project and open its‬‭pom.xml‬‭file.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭115‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭27.‬‭Compare the two pom.xml files.‬

‭28.‬‭Close both pom.xml files.‬

‭29.‬‭In the Package Explorer, right-click‬‭apdev-examples‬‭and select‬‭Close Project‬‭.‬

‭Create a properties file for application properties‬

‭30.‬‭In the apdev-flights-ws project, right-click‬‭src/main/resources‬‭and select‬‭New‬


‭> File‬‭.‬

‭31.‬‭In the Create New File dialog box, set the file name to‬‭config.yaml‬‭and click‬
‭Finish‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭116‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭32.‬‭In config.yaml, define a property called‬‭http.port‬‭equal to‬‭“8081”.‬

‭33.‬‭Save and close the file.‬

‭Create a global configuration file‬

‭34.‬‭In src/main/mule, create a new Mule configuration file called‬‭global.xml‬‭.‬

‭35.‬‭In global.xml, switch to the‬‭Global Elements‬‭view.‬

‭36.‬‭Create a new Configuration properties element with the file set to‬‭config.yaml‬‭.‬

‭37.‬‭Create a new HTTP Listener config element with the host set to‬‭0.0.0.0‬‭and‬
‭the port set to the‬‭http.port‬‭property.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭117‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭38.‬‭Confirm you now have two global elements defined in global.xml.‬

‭39.‬‭Save and close the file.‬

‭40.‬‭Go to the Global Elements view in interface.xml.‬

‭41.‬‭Delete the‬‭mua-flights-api-httpListenerConfig HTTP‬‭Listener Configuration‬‭.‬

‭42.‬‭Return to the Message Flow view.‬

‭43.‬‭Select the‬‭HTTP Listener‬‭in mua-flights-api-main,‬‭and in the Listener‬


‭properties view, ensure the connector configuration is set to‬
‭HTTP_Listener_config‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭118‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭44.‬‭Select the HTTP Listener in mua-flights-api-console, and in the Listener‬


‭properties view, ensure the connector configuration is set to‬
‭HTTP_Listener_config‬‭.‬

‭Add Java files to src/main/java‬

‭45.‬‭In the Package Explorer, right-click the src/main/java folder and select‬‭New >‬
‭Package‬‭.‬

‭46.‬‭In the New Java Package dialog box, set the name to‬‭com.mulesoft.training‬
‭and click‬‭Finish‬‭.‬

‭47.‬‭In your computer's file browser, locate the‬‭Flight.java‬‭file in the resources‬


‭folder of the student files.‬

‭48.‬‭Drag the Flight.java file into the new com.mulesoft.training package in the‬
‭src/main/java folder in the apdev-flights-ws project.‬

‭49.‬‭In the File Operation dialog box, ensure‬‭Copy files‬‭is selected and click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭119‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭50.‬‭Open the‬‭Flight.java‬‭file.‬

‭51.‬‭Review the code.‬

‭Review src/test folders‬

‭52.‬‭In the project, locate the three src/test folders.‬

‭53.‬‭Expand the src/test/resources folder.‬

‭Add test resources‬

‭54.‬‭In your computer's file browser, expand the‬‭resources/examples‬‭folder in the‬


‭student files.‬

‭55.‬‭Select the three flights and one united-flights files (JSON and XML) and drag‬
‭them into the src/test/resources folder in the apdev-flights-ws project.‬

‭56.‬‭In the File Operation dialog box, ensure‬‭Copy files‬‭is selected and click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭120‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Examine the contents of a deployable archive‬

‭57.‬‭In Anypoint Studio, save all files, and then right-click the project and select‬
‭Export‬‭.‬

‭58.‬‭In the Export dialog box, select Mule > Anypoint Studio Project to Mule‬
‭Deployable Archive and click Next.‬

‭59.‬‭In the Export Mule Project dialog box, set the JAR file to a location that you‬
‭can find and click‬‭Finish‬‭.‬

‭60.‬‭In the Export Mule Project dialog box, click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭121‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭61.‬‭In your computer's file browser, locate the‬‭JAR‬‭file and expand it.‬

‭62.‬‭Open the resulting‬‭apdev-flights-ws‬‭folder and examine‬‭the contents.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭122‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 2-6: Manage metadata for a project‬

‭In this walkthrough, you define metadata for the apdev-flights-ws project. You will:‬

‭●‬ ‭Review existing metadata for the training4-american-ws project.‬

‭●‬ ‭Define new metadata to be used in transformations in the new‬


‭apdev-flights-ws project.‬

‭●‬ ‭Manage metadata.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭123‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Locate existing metadata in the training4-american-ws project‬

‭1.‬ ‭Open the‬‭training4-american-ws‬‭project.‬

‭2.‬ ‭Locate‬‭application-types.xml in src/main/resources‬‭.‬

‭3.‬ ‭Open the file and review the code.‬

‭4.‬ ‭Right-click the‬‭training4-american-ws‬‭project in the‬‭Package Explorer and‬


‭review the options under Mule; you should see two for metadata.‬

‭5.‬ ‭Select‬‭Mule > Manage Metadata Types‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭124‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭6.‬ ‭In the Manage Metadata Types dialog box, select the‬‭american_flights_json‬
‭type‬‭.‬

‭7.‬ ‭Click‬‭OK‬‭.‬

‭8.‬ ‭Close the project.‬

‭Review the API specification and resources for the‬


‭apdev-flights-ws project‬

‭9.‬ ‭Return to the‬‭apdev-flights-ws‬‭project.‬

‭10.‬‭Return to‬‭mua-flights-api.raml‬‭and review the specified‬‭response and request‬


‭types.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭125‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Locate the files you added to the src/test/resources folder.‬

‭12.‬‭Locate the file you added to the src/main/java folder.‬

‭Create flights_json metadata type‬

‭13.‬‭Right-click the project and select‬‭Mule > Manage Metadata‬‭Types‬‭.‬

‭14.‬‭In the Manage Metadata Types dialog box, click the‬‭Add‬‭button.‬

‭15.‬‭In the Create new type dialog box, set the type id to‬‭flights_json‬‭.‬

‭16.‬‭Click‬‭Create type‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭126‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭17.‬‭In the Manage Metadata Types dialog box, set the first type to‬‭JSON‬‭.‬

‭18.‬‭In the dropdown menu beneath the type, select‬‭Example‬‭.‬

‭19.‬‭Click the‬‭browse‬‭button and select the‬‭flights-example.json‬‭file in‬


‭src/test/resources‬‭.‬

‭20.‬‭In the Manage Metadata Types dialog box, click‬‭OK‬‭.‬

‭21.‬‭In the Apply changes dialog box, click‬‭Yes‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭127‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Locate the new metadata definition file‬

‭22.‬‭Locate‬‭application-types.xml‬‭in src/main/resources.‬

‭23.‬‭Open the file and review the code.‬

‭Create flight_json metadata type‬

‭24.‬‭Right-click the project and select‬‭Mule > Manage Metadata‬‭Types‬‭.‬

‭25.‬‭In the Manage Metadata Types dialog box, click‬‭Add‬‭.‬

‭26.‬‭In the Create new type dialog box, set the type id to‬‭flight_json‬‭and click‬
‭Create type‬‭.‬

‭27.‬‭In the Manage Metadata Types dialog box, set the first type to‬‭JSON‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭128‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭28.‬‭Select‬‭Example‬‭and browse to and select the‬‭flight-example.json‬‭file in‬


‭src/test/resources.‬

‭Create flights_xml metadata type‬

‭29.‬‭In the Manage Metadata Types dialog box, click‬‭Add‬‭.‬

‭30.‬‭In the Create new type dialog box, set the type id to‬‭flights_xml‬‭and click‬
‭Create type‬‭.‬

‭31.‬‭In the Apply changes dialog box, click‬‭Yes‬‭.‬

‭32.‬‭In the Manage Metadata Types dialog box, set the first type to‬‭XML‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭129‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭33.‬‭Select Example and browse to the‬‭flights-example.xml‬‭file in‬


‭src/test/resources.‬

‭Create Flight_pojo metadata type‬

‭34.‬‭In the Manage Metadata Types dialog box, click the‬‭Add‬‭button.‬

‭35.‬‭In the Create new type dialog box, set the type id to‬‭Flight_pojo‬‭and click‬
‭Create type‬‭.‬

‭36.‬‭In the Apply changes dialog box, click‬‭Yes‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭130‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭37.‬‭In the Manage Metadata Types dialog box, set the first type to‬‭Object‬‭.‬

‭38.‬‭In the Data structure section, click‬‭Click here‬‭to‬‭select an option.‬

‭39.‬‭In the dropdown menu that appears, select‬‭Java object‬‭.‬

‭40.‬‭In the dialog box that opens, type‬‭fli‬‭in the Select‬‭entries field and then in the‬
‭list of classes that appears, select‬‭Flight – com.mulesoft.training‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭131‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭41.‬‭Click‬‭OK‬‭.‬

‭42.‬‭In the Manage Metadata Types dialog box, click‬‭OK‬‭.‬

‭43.‬‭In the Apply changes dialog box, click‬‭Yes‬‭.‬

‭Review the metadata definition file‬

‭44.‬‭Return to‬‭application-types.xml‬‭.‬

‭45.‬‭Close the file.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭132‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Module 3: Consuming web services‬

‭At the end of this module, you should be able to:‬

‭●‬ ‭Consume web services that have an API (and connector) in Exchange.‬

‭●‬ ‭Consume RESTful web services.‬

‭●‬ ‭Consume SOAP web services.‬

‭●‬ ‭Pass parameters to SOAP web services using the Transform Message component.‬

‭●‬ ‭Transform data from multiple services to a canonical format.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭133‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 3-1: Consume a RESTful web service that has‬


‭an API (and connector) in Exchange‬

‭In this walkthrough, you consume a pre-built American flights RESTful web service‬
‭that has an API and a connector in Exchange. You will:‬

‭●‬ ‭Create a new flow to call the American RESTful web service.‬

‭●‬ ‭Add a REST connector from Exchange to an Anypoint Studio project.‬

‭●‬ ‭Configure and use a REST connector to make a call to a web service.‬

‭●‬ ‭Dynamically set a query parameter for a web service call.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭134‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Examine the REST connectors for the pre-built Training:‬


‭American Flights API in Exchange‬

‭1.‬ ‭Navigate to‬‭Exchange‬‭in Anypoint Platform.‬

‭2.‬ ‭Locate the‬‭Training: American flights API‬‭in the public‬‭Exchange.‬

‭NOTE:‬ ‭If you still have access to the American Flights‬‭API you created in the Getting‬
‭Started with Anypoint Platform course, you are encouraged to review and use that‬
‭API instead in the steps that follow. If you do not have access to port 3306, using your‬
‭API (or, if necessary, a new API created using the Derby Database connector option‬
‭detailed in Walkthrough 4-2 of the Getting Started course) is required. In order to use‬
‭your API, you'll need its client credentials and endpoint URL.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭135‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭3.‬ ‭Select the API and review its information.‬

‭4.‬ ‭Click the‬‭Download‬‭dropdown menu button; you should‬‭see that REST‬


‭Connect has created connectors for the API in Exchange.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭136‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Make a request to the web service‬

‭5.‬ ‭Return to the course‬‭snippets.txt‬‭file and copy the‬‭value for the Training:‬
‭American Flights API client_id.‬

‭6.‬ ‭Return to Advanced REST Client, select the first tab, and add a header called‬
‭client_id‬‭.‬

‭7.‬ ‭Set‬‭client_id‬‭to the value you copied from the snippets.txt‬‭file.‬

‭8.‬ ‭Repeat for‬‭client_secret‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭137‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭9.‬ ‭Return to the course‬‭snippets.txt‬‭file and copy the value for the Training:‬
‭America Flights API web service URL.‬

‭10.‬‭Return to Advanced REST Client and send a GET request to the value you‬
‭copied; you should see JSON data for the American flights as a response.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭138‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE:‬‭The client credentials in the snippets file may be different than what is shown‬
‭here; the values in the snippets file differ for instructor-led and self-study training‬
‭classes.‬

‭Add a new flow with an HTTP Listener‬

‭11.‬‭Return to the‬‭apdev-flights-ws‬‭project in Anypoint‬‭Studio.‬

‭12.‬‭Return to‬‭implementation.xml‬‭.‬

‭13.‬‭Drag out an HTTP Listener and drop it in the canvas.‬

‭14.‬‭Rename the flow to‬‭getAmericanFlights‬‭.‬

‭15.‬‭In the Listener properties view, set the display name to‬‭GET /american‬‭.‬

‭16.‬‭Ensure the connector configuration is set to the existing HTTP_Listener_config.‬

‭17.‬‭Set the path to‬‭/american‬‭.‬

‭18.‬‭Set the allowed methods to‬‭GET‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭139‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add the American Flights API module to Anypoint Studio‬

‭19.‬‭In the Mule Palette, select‬‭Search in Exchange‬‭.‬

‭20.‬‭In the Add Dependencies to Project dialog box, enter‬‭american‬‭in the search‬
‭field.‬

‭21.‬‭Select the‬‭Training - American Flights API‬‭and click‬‭Add‬‭.‬

‭22.‬‭Click‬‭Finish‬‭.‬

‭23.‬‭Wait for the module to be downloaded.‬

‭24.‬‭Select the new‬‭American Flights API‬‭module in the‬‭Mule Palette.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭140‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add a Get all flights operation‬

‭25.‬‭Select the‬‭Get flights‬‭operation on the right side‬‭of the Mule Palette and drag‬
‭and drop it in the process section of the flow.‬

‭26.‬‭Select the‬‭Get flights‬‭operation in the canvas and‬‭in its properties view, see‬
‭that you need to create a new configuration and enter a‬‭client_id and‬
‭client_secret‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭141‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Configure the American Flights API connector‬

‭27.‬‭Open‬‭global.xml‬‭.‬

‭28.‬‭In the Global Elements view, click‬‭Create‬‭.‬

‭29.‬‭In the Choose Global Type dialog box, select‬‭Connector‬‭Configuration >‬


‭American Flights API‬‭Config and click‬‭OK‬‭.‬

‭30.‬‭In the Global Element Properties dialog box, set each field to a corresponding‬
‭property placeholder (that you will define and set next):‬

‭●‬ ‭host‬‭: ${american.host}‬

‭●‬ ‭port‬‭: ${american.port}‬

‭●‬ ‭protocol‬‭: ${american.protocol}‬

‭●‬ ‭basePath‬‭: ${american.basepath}‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭142‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭31.‬‭Click‬‭OK‬‭.‬

‭32.‬‭Return to the course snippets.txt file and copy the text for the American‬
‭RESTful web service properties.‬

‭33.‬‭Open‬‭config.yaml‬‭in‬‭src/main/resources‬‭and paste the‬‭code at the end of the‬


‭file.‬

‭34.‬‭Return to Advanced REST Client and copy the value for your client_id.‬

‭35.‬‭Return to‬‭config.yaml‬‭and paste the value within double‬‭quotes.‬

‭36.‬‭Repeat for your‬‭client_secret‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭143‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Configure the Get flights operation‬

‭37.‬‭Return to‬‭implementation.xml‬‭.‬

‭38.‬‭In the Get flights properties view, ensure the Connector configuration is set to‬
‭American_Flights_API_Config‬‭.‬

‭39.‬‭Set the client id to the‬‭${american.client_id}‬‭property.‬

‭40.‬‭Set the client secret to the‬‭${american.client_secret}‬‭property.‬

‭41.‬‭Leave the destination field blank.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭144‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review metadata associated with the operation‬

‭42.‬‭Select the‬‭Output‬‭tab in the DataSense Explorer and‬‭expand‬‭Payload‬‭.‬

‭Test the application‬

‭43.‬‭Run the project.‬

‭44.‬‭In the dialog box, ensure all the resources are selected and click‬‭Save 3 of 3‬‭.‬

‭45.‬‭In Advanced REST Client, return to the tab with the localhost request.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭145‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭46.‬‭Change the URL to make a GET request to‬‭http://localhost:8081/american‬‭;‬


‭you should get all the flights.‬

‭Review the specification for the API you are building‬

‭47.‬‭Return to‬‭mua-flights-api.raml‬‭in‬‭src/main/resources/api‬‭.‬

‭48.‬‭Review the optional query parameters.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭146‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭49.‬‭Locate the return type for the get method of the /flights resource.‬

‭50.‬‭Open‬‭FlightsExample.raml‬‭in src/main/resources/api.examples‬‭and review its‬


‭structure.‬

‭Create a variable to set the destination airport code‬

‭51.‬‭Return to‬‭implementation.xml‬‭.‬

‭52.‬‭Drag a‬‭Sub Flow‬‭scope from the Mule Palette and drop‬‭it at the top of the‬
‭canvas.‬

‭53.‬‭Change the name of the flow to‬‭setCode‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭147‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭54.‬‭Drag a‬‭Set Variable‬‭transformer from the Mule Palette and drop it in the‬
‭setCode‬‭subflow.‬

‭55.‬‭In the Set Variable properties view, set the name and display name to‬‭code‬‭.‬

‭56.‬‭Switch the value field to expression mode then set its value to a query‬
‭parameter called‬‭code‬‭and give it a default value‬‭of‬‭SFO‬‭if no query parameter‬
‭is passed to the flow.‬

message.attributes.queryParams.code default 'SFO'‬


‭Dynamically set a query parameter for the web service call‬

‭57.‬‭Drag a‬‭Flow Reference‬‭component from the Mule Palette‬‭and drop it after the‬
‭GET /american‬‭Listener‬‭in getAmericanFlights.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭148‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭58.‬‭In the Flow Reference properties view, set the flow name and display name to‬
‭setCode‬‭.‬

‭59.‬‭In the Get flights properties view, switch the destination field to expression‬
‭mode then set its value to the variable containing the airport code.‬

vars.code‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭149‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭60.‬‭Save the file to redeploy the application.‬

‭61.‬‭In Advanced REST Client, send the same request; this time you should only get‬
‭flights to SFO.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭150‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭62.‬‭Add a query parameter called‬‭code‬‭equal to LAX and make the request; you‬
‭should now only see flights to LAX.‬

‭63.‬‭Examine the data structure of the JSON response.‬

‭NOTE:‬‭You will transform the data to the format specified‬‭by the mua-flights-api in a‬
‭later walkthrough.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭151‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 3-2: Consume a RESTful web service‬

‭In this walkthrough, you consume the United RESTful web service that does not have‬
‭an API in Exchange. You will:‬

‭●‬ ‭Create a new flow to call the United RESTful web service.‬

‭●‬ ‭Use the HTTP Request operation to call a RESTful web service.‬

‭●‬ ‭Dynamically set a URI parameter for a web service call.‬

‭●‬ ‭Add metadata for an HTTP Request operation’s response.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭152‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Make a request to the United web service‬

‭1.‬ ‭Return to the course‬‭snippets.txt‬‭file.‬

‭2.‬ ‭Locate and copy the‬‭United RESTful web service URL‬‭.‬

‭3.‬ ‭In Advanced REST Client, make a new tab and make a GET request to this URL.‬

‭4.‬ ‭Review the structure of the JSON response.‬

‭5.‬ ‭Look at the destination values; you should see SFO, LAX, CLE, PDX, and PDF.‬

‭6.‬ ‭In the URL field, add the destination CLE as a URI parameter.‬

‭7.‬ ‭Send the request; you should now only see flights to CLE.‬

‭Add a new flow with an HTTP Listener operation‬

‭8.‬ ‭Return to implementation.xml in Anypoint Studio.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭153‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭9.‬ ‭Drag out an‬‭HTTP Listener‬‭from the Mule Palette and drop it at the bottom of‬
‭the canvas.‬

‭10.‬‭Change the name of the flow to‬‭getUnitedFlights‬‭.‬

‭11.‬‭In the Listener properties view, set the display name to‬‭GET /united‬‭.‬

‭12.‬‭Ensure the connector configuration is set to the existing‬


‭HTTP_Listener_config‬‭.‬

‭13.‬‭Set the path to‬‭/united‬‭.‬

‭14.‬‭Set the allowed methods to‬‭GET‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭154‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add an HTTP Request operation‬

‭15.‬‭Drag out an‬‭HTTP Request‬‭from the Mule Palette and‬‭drop it into the process‬
‭section of getUnitedFlights.‬

‭16.‬‭In the Request properties view, set the display name to‬‭Get flights‬‭.‬

‭Create an HTTP Request configuration‬

‭17.‬‭Return to the‬‭course snippets.txt‬‭file and copy the‬‭text for the‬‭Training web‬


‭service‬‭properties.‬

‭18.‬‭Return to‬‭config.yaml‬‭and paste the code at the end‬‭of the file.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭155‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE:‬ ‭The Training web service properties you see may be different than what is‬
‭shown here; the values in the snippets file differ for instructor-led and self-study‬
‭training classes.‬

‭19.‬‭Return to the Global Elements view in global.xml.‬

‭20.‬‭Create a new HTTP Request configuration with the following values:‬

‭●‬ ‭Name‬‭: HTTP_Request_config_training‬

‭●‬ ‭Base Path‬‭: ${training.basepath}‬

‭●‬ ‭Host‬‭: ${training.host}‬

‭●‬ ‭Port‬‭: ${training.port}‬

‭21.‬‭Click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭156‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Configure the HTTP Request operation‬

‭22.‬‭Return to‬‭implementation.xml‬‭.‬

‭23.‬‭Navigate to the‬‭Get flights Request‬‭properties view‬‭in‬‭getUnitedFlights‬‭.‬

‭24.‬‭Set the configuration to the existing‬‭HTTP_Request_config_training‬‭.‬

‭25.‬‭Leave the method set to‬‭GET‬‭.‬

‭26.‬‭Set the path to‬‭/united/flights‬‭.‬

‭Review metadata associated with the United Get flights operation‬


‭response‬

‭27.‬‭Select the‬‭Output‬‭tab in the DataSense Explorer; you‬‭should see no metadata‬


‭for the payload.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭157‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭28.‬‭Save the files to redeploy the project.‬

‭29.‬‭In Advanced REST Client, return to the tab with the localhost request.‬

‭30.‬‭Change the URL to make a GET request to‬‭http://localhost:8081/united‬‭;‬‭you‬


‭should get JSON flight data for all destinations returned.‬

‭31.‬‭Add a query parameter named code and set it to one of the destination‬
‭airport code values:‬‭http://localhost:8081/united?code=CLE‬‭;‬‭you should still‬
‭get flights to all destinations.‬

‭Add a URI parameter to the web service call‬

‭32.‬‭Return to‬‭implementation.xml‬‭in Anypoint Studio.‬

‭33.‬‭Drag a‬‭Flow Reference‬‭component from the Mule Palette‬‭and drop it after the‬
‭GET /united Listener in getUnitedFlights.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭158‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭34.‬‭In the Flow Reference properties view, set the flow name and display name to‬
‭setCode‬‭.‬

‭35.‬‭Navigate to the Get flights Request properties view in getUnitedFlights.‬

‭36.‬‭In the Request section, change the path to /united/flights/{dest}.‬

‭37.‬‭Select the‬‭URI Parameters‬‭tab.‬

‭38.‬‭Click the‬‭Add‬‭button.‬

‭39.‬‭Set the name to‬‭dest‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭159‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭40.‬‭Set the value to the value of the code variable.‬

vars.code‬

‭Test the application‬

‭41.‬‭Save the file to redeploy the application.‬

‭42.‬‭In Advanced REST Client, make the same request; you should now only get‬
‭flights to CLE.‬

‭43.‬‭Remove the code parameter and make the request; you should now only get‬
‭results for SFO.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭160‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE:‬ ‭You will transform the data to the format specified by the mua-flights-api in a‬
‭later walkthrough.‬

‭Add metadata for the United Get flights operation response‬

‭44.‬‭Return to Anypoint Studio.‬

‭45.‬‭Navigate to the properties view for the‬‭Get flights‬‭operation in‬


‭getUnitedFlights.‬

‭46.‬‭Select the‬‭Output‬‭tab in the DataSense Explorer and‬‭examine‬‭Payload‬‭; you‬


‭should still see no metadata for the payload.‬

‭47.‬‭In the Get flights properties view, select the‬‭Metadata‬‭tab.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭161‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭48.‬‭Click the‬‭Add metadata‬‭button.‬

‭49.‬‭Change the dropdown menu to‬‭Output:‬‭Payload‬‭.‬

‭50.‬‭Click the‬‭Edit‬‭button.‬

‭51.‬‭In the Select metadata type dialog box, click the‬‭Add‬‭button.‬

‭52.‬‭In the Create new type dialog box, set the type id to‬‭united_flights_json‬‭.‬

‭53.‬‭Click‬‭Create type‬‭.‬

‭54.‬‭In the Select metadata type dialog box, set the first type to‬‭JSON‬‭.‬

‭55.‬‭Change the Schema selection to‬‭Example‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭162‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭56.‬‭Click the browse button and navigate to the projects's‬‭src/test/resources‬


‭folder.‬

‭57.‬‭Select united-flights-example.json and click Open; you should see the‬


‭example data for the metadata type.‬

‭58.‬‭Click‬‭Select‬‭.‬

‭59.‬‭In the DataSense Explorer, ensure the‬‭Output‬‭tab is‬‭selected and expand‬


‭Payload‬‭; you should now see the structure for the‬‭payload.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭163‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 3-3: Consume a SOAP web service‬

‭In this walkthrough, you consume a Delta SOAP web service. You will:‬

‭●‬ ‭Create a new flow to call the Delta SOAP web service.‬

‭●‬ ‭Use a Web Service Consumer connector to consume a SOAP web service.‬

‭●‬ ‭Use the Transform Message component to pass arguments to a SOAP web‬
‭service.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Browse the WSDL‬

‭1.‬ ‭Return to the course‬‭snippets.txt‬‭file and copy the‬‭Delta SOAP web service‬
‭WSDL.‬

‭2.‬ ‭In Advanced REST Client, return to the tab with the‬‭mule-training‬‭request.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭164‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭3.‬ ‭Paste the URL and send the GET request; you should see the web service‬
‭WSDL returned.‬

‭4.‬ ‭Browse the WSDL; you should find references to operations listAllFlights and‬
‭findFlight.‬

‭Create a new flow with an HTTP Listener connector endpoint‬

‭5.‬ ‭Return to Anypoint Studio.‬

‭6.‬ ‭Drag out another‬‭HTTP Listener‬‭from the Mule Palette‬‭and drop it in the‬
‭canvas after the existing flows.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭165‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭7.‬ ‭Rename the flow to‬‭getDeltaFlights‬‭.‬

‭8.‬ ‭In the Listener properties view, set the display name to‬‭GET /delta‬‭.‬

‭9.‬ ‭Ensure the connector configuration is set to the existing‬


‭HTTP_Listener_config‬‭.‬

‭10.‬‭Set the path to‬‭/delta‬‭and the allowed methods to‬‭GET‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭166‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add the Web Service Consumer module to the project‬

‭11.‬‭In the Mule Palette, select‬‭Add Modules‬‭.‬

‭12.‬‭Select the Web Service Consumer connector on the right side of the Mule‬
‭Palette and drag and drop it into the left side.‬

‭13.‬‭If you get a Select module version dialog box, select the latest version and‬
‭click‬‭Add‬‭.‬

‭Configure the Web Service Consumer connector‬

‭14.‬‭Return to the course‬‭snippets.txt‬‭file and copy the‬‭text for the Delta web‬
‭service properties.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭167‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭15.‬‭Return to‬‭config.yaml‬‭in src/main/resources and paste the code at the end of‬
‭the file.‬

‭NOTE‬‭: The Delta web service properties you see may‬‭be different than what is shown‬
‭here; the values in the snippets file differ for instructor-led and self-study training‬
‭classes.‬

‭16.‬‭Save the file.‬

‭17.‬‭Return to‬‭global.xml‬‭.‬

‭18.‬‭Click‬‭Create‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭168‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭19.‬‭In the Choose Global Type dialog box, select‬‭Connector Configuration > Web‬
‭Service Consumer Config‬‭.‬

‭20.‬‭Click‬‭OK‬‭.‬

‭21.‬‭In the Global Element Properties dialog box, change the name to‬
‭Delta_Web_Service_Consumer_Config‬‭.‬

‭22.‬‭Set the following values:‬

‭●‬ ‭Wsdl location‬‭: ${delta.wsdl}‬

‭●‬ ‭Service‬‭: ${delta.service}‬

‭●‬ ‭Port‬‭: ${delta.port}‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭169‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭Click‬‭OK‬‭.‬

‭Add and configure a Consume operation‬

‭24.‬‭Return to‬‭implementation.xml‬‭.‬

‭25.‬‭Locate the‬‭Consume‬‭operation for the Web Service Consumer‬‭connector in‬


‭the Mule Palette and drag and drop it in the process section of‬
‭getDeltaFilghts‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭170‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭26.‬‭In the Consume properties view, change its display name to‬‭Get flights‬‭.‬

‭27.‬‭Ensure the connector configuration is set to the existing‬


‭Delta_Web_Service_Consumer_Config‬‭.‬

‭28.‬‭Click the operation dropdown menu; you should see the web service‬
‭operations listed.‬

‭29.‬‭Select the‬‭listAllFlights‬‭operation.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭171‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review metadata associated with the Delta Get flights operation‬


‭response‬

‭30.‬‭Select the‬‭Output‬‭tab in the DataSense Explorer and‬‭expand‬‭Payload‬‭; you‬


‭should see the payload structure.‬

‭Test the application‬

‭31.‬‭Save the files and wait for the application to redeploy.‬

‭32.‬‭In Advanced REST Client, return to the tab with the localhost request.‬

‭33.‬‭Make a GET request to‬‭http://localhost:8081/delta‬‭;‬‭you should get a 200‬


‭status code and a response listing the contents of listAllFlightsResponse.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭172‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Transform the response to JSON‬

‭34.‬‭Return to Anypoint Studio.‬

‭35.‬‭Add a‬‭Transform Message‬‭component to the end of the‬‭flow.‬

‭36.‬‭Set the display name to‬‭SOAP to JSON‬‭.‬

‭37.‬‭In the Transform Message properties view, change the output type to‬
‭application/json‬‭and set the expression to‬‭payload‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭173‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭38.‬‭Save the file to redeploy the project.‬

‭39.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/delta‬‭then examine the Response‬‭tab; you should get‬
‭JSON returned.‬

‭40.‬‭Click the‬‭Raw‬‭tab; you should see all the flights.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭174‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭41.‬‭Add a query parameter called code and set it equal to‬‭LAX‬‭.‬

‭42.‬‭Send the request; you should still get all flights.‬

‭Call a different web service operation‬

‭43.‬‭Return to the‬‭getDeltaFlights‬‭flow in Anypoint Studio.‬

‭44.‬‭In the properties view for Get flights Consume operation, change the‬
‭operation to‬‭findFlight‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭175‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review metadata associated with the Delta Get flights operation‬


‭response‬

‭45.‬‭Select the‬‭Output‬‭tab in the DataSense Explorer and‬‭expand‬‭Payload‬‭; you‬


‭should now see the payload metadata for findFlightResponse.‬

‭46.‬‭Select the‬‭Input‬‭tab and expand‬‭Payload‬‭; you should‬‭see this operation now‬


‭expects a destination.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭176‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭47.‬‭Save the file to redeploy the project.‬

‭48.‬‭In Advanced REST Client, send the same request with the query parameter;‬
‭you should get a 500 Server Error with a message that the operation requires‬
‭input parameters.‬

‭Use the set airport code subflow‬

‭49.‬‭Return to the‬‭getDeltaFlights‬‭flow in Anypoint Studio.‬

‭50.‬‭Add a‬‭Flow Reference‬‭component after the GET /delta‬‭Listener.‬

‭51.‬‭In the Flow Reference properties view, set the flow name and display name to‬
‭setCode‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭177‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭ se the Transform Message component to pass a parameter to‬


U
‭the web service‬

‭52.‬‭Add a‬‭Transform Message‬‭component after the Flow Reference‬‭component.‬

‭53.‬‭Change its display name to‬‭Pass code‬‭.‬

‭54.‬‭In the Pass code properties view, look at the input and output sections.‬

‭55.‬‭Drag the code variable in the input section to the destination element in the‬
‭output section.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭178‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭56.‬‭Save the file to redeploy the application.‬

‭57.‬‭In Advanced REST Client, make another request; you should now only see‬
‭flights to LAX.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭179‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 3-4: Transform data from multiple services to a‬


‭canonical format‬

‭In this walkthrough, you will transform the JSON returned from the American and‬
‭United web services and the SOAP returned from the Delta web service to the same‬
‭format. You will:‬

‭●‬ ‭Define a metadata type for the Flight Java class.‬

‭●‬ ‭Transform the results from RESTful and SOAP web service calls to a collection‬
‭of Flight objects.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭180‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review Flight.java‬

‭1.‬ ‭Return to‬‭apdev-flights-ws‬‭in Anypoint Studio.‬

‭2.‬ ‭Return to‬‭Flight.java in src/main/java‬‭and review‬‭the file.‬

‭3.‬ ‭Close the file.‬

‭Change the American flow to return Java Flight objects instead of‬
‭JSON‬

‭4.‬ ‭Return to‬‭getAmericanFlights‬‭in implementation.xml.‬

‭5.‬ ‭Add a‬‭Transform Message‬‭component to the end of the‬‭flow.‬

‭6.‬ ‭Add a‬‭Logger‬‭at the end of the flow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭181‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭7.‬ ‭Change the name of the Transform Message component to‬‭JSON to [Flight]‬‭.‬

‭8.‬ ‭In the Transform Message properties view, look at the input section; you‬
‭should see metadata already defined.‬

‭9.‬ ‭In the output section of the Transform Message properties view, click the‬
‭Define metadata‬‭link.‬

‭10.‬‭In the Select metadata type dialog box, select the‬‭user-defined Flight_pojo‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭182‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Select‬‭Wrap element in a collection‬‭in the lower-left corner.‬

‭12.‬‭Click‬‭Select‬‭; you should now see output metadata in‬‭the output section of the‬
‭Transform Message properties view.‬

‭13.‬‭Map fields (except ID and totalSeats) by dragging them from the input section‬
‭and dropping them on the corresponding field in the output section.‬

‭14.‬‭Double-click the‬‭airlineName‬‭field in the output section.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭183‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭15.‬‭In the generated DataWeave expression, change the airlineName value from‬
‭null to "American".‬

‭Test the application‬

‭16.‬‭Save the file to redeploy the project.‬

‭17.‬‭In Advanced REST Client, change the URL and make a request to‬
‭http://localhost:8081/american‬‭; you should see a representation‬‭of a‬
‭collection of Java objects.‬

‭Debug the application‬

‭18.‬‭Return to Anypoint Studio.‬

‭19.‬‭Stop the project.‬

‭20.‬‭Add a breakpoint to the‬‭Get flights‬‭operation in‬‭getAmericanFlights‬‭.‬

‭21.‬‭Debug the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭184‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭22.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/american‬‭.‬

‭23.‬‭In the Mule Debugger, step to the‬‭Transform Message‬‭component and‬


‭examine the payload.‬

‭24.‬‭Step to the‬‭Logger‬‭and look at the payload; it should‬‭be a collection of Flight‬


‭objects.‬

‭25.‬‭Step through the rest of the application and switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭185‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Change the United airline flows to return Java Flight objects‬


‭instead of JSON‬

‭26.‬‭Return to‬‭getUnitedFlights‬‭in‬‭implementation.xml‬‭.‬

‭27.‬‭Add a‬‭Transform Message‬‭component at the end of the‬‭flow.‬

‭28.‬‭Change the name of the Transform Message component to‬‭JSON to [Flight]‬‭.‬

‭29.‬‭Add a‬‭Logger‬‭to the end of the flow.‬

‭30.‬‭In the Transform Message properties view, look at the input section; you‬
‭should see metadata already defined.‬

‭31.‬‭In the output section of the Transform Message properties view, click the‬
‭Define metadata‬‭link.‬

‭32.‬‭In the Select metadata type dialog box, select the‬‭user-defined Flight_pojo‬‭.‬

‭33.‬‭Select‬‭Wrap element in a collection‬‭in the lower-left‬‭corner.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭186‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭34.‬‭Click‬‭Select‬‭; you should now see output metadata in the output section of the‬
‭Transform Message properties view.‬

‭35.‬‭Map fields by dragging them from the input section and dropping them on‬
‭the corresponding field in the output section.‬

‭Debug the application‬

‭36.‬‭Add a breakpoint to the Transform Message component.‬

‭37.‬‭Save the file to redeploy the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭187‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭38.‬‭In Advanced REST Client, change the URL to make a request to‬
‭http://localhost:8081/united‬‭.‬

‭39.‬‭In the Mule Debugger, examine the payload.‬

‭40.‬‭Step to the Logger and look at the payload; it should be a collection of Flight‬
‭objects.‬

‭41.‬‭Step through the rest of the application and switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭188‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Change the Delta flow to return Java Flight objects‬

‭42.‬‭Return to‬‭geDeltaFlights‬‭in‬‭implementation.xm‬‭l.‬

‭43.‬‭Change the name of the‬‭SOAP to JSON‬‭Transform Message‬‭component to‬


‭SOAP to [Flight]‬‭.‬

‭44.‬‭Add a Logger to the end of the flow.‬

‭45.‬‭Look at the input section in the SOAP to [Flight] Transform Message properties‬
‭view; you should see metadata already defined.‬

‭46.‬‭In the output section of the Transform Message properties view, click the‬
‭Define metadata‬‭link.‬

‭47.‬‭In the Select metadata type dialog box, select the user-defined‬‭Flight_pojo‬‭.‬

‭48.‬‭Select‬‭Wrap element in a collection‬‭in the lower-left‬‭corner.‬

‭49.‬‭Click‬‭Select‬‭; you should now see output metadata in‬‭the output section of the‬
‭Transform Message properties view.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭189‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭50.‬‭Map the fields by dragging them from the input section and dropping them‬
‭on the corresponding field in the output section.‬

‭Debug the application‬

‭51.‬‭Add a breakpoint to the‬‭SOAP to [Flight]‬‭Transform‬‭Message component.‬

‭52.‬‭Save the file to redeploy the project.‬

‭53.‬‭In Advanced REST Client, change the URL to make a request to‬
‭http://localhost:8081/delta‬‭.‬

‭54.‬‭In the Mule Debugger, examine the payload.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭190‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭55.‬‭Step to the Logger and look at the payload; it should be a collection of Flight‬
‭objects.‬

‭56.‬‭Step through the rest of the application and switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭191‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Module 4: Controlling event flow‬

‭At the end of this module, you should be able to:‬

‭●‬ ‭Multicast events.‬

‭●‬ ‭Route events based on conditions.‬

‭●‬ ‭Validate events.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭192‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 4-1: Multicast an event‬

‭In this walkthrough, you create a flow that calls each of the three airline services and‬
‭combines the results. You will:‬

‭●‬ ‭Use a Scatter-Gather router to concurrently call all three flight services.‬

‭●‬ ‭Use DataWeave to flatten multiple collections into one collection.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭193‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a new flow‬

‭1.‬ ‭Return to‬‭implementation.xml‬‭in the‬‭apdev-flights-ws‬‭project in Anypoint‬


‭Studio.‬

‭2.‬ ‭From the Mule Palette, drag an‬‭HTTP Listener‬‭and drop‬‭it at the top of the‬
‭canvas.‬

‭3.‬ ‭Change the flow name to‬‭getAllAirlineFlights‬‭.‬

‭4.‬ ‭In the Listener properties view, set the display name to‬‭GET /flights‬‭.‬

‭5.‬ ‭Ensure the connector configuration is set to the existing‬


‭HTTP_Listener_config‬‭.‬

‭6.‬ ‭Set the path to /flights and the allowed methods to‬‭GET‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭194‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Browse the flow control elements in the Mule Palette‬

‭7.‬ ‭In the Core section of the Mule Palette, locate the‬‭Flow Control‬‭elements.‬

‭Add a Scatter-Gather to call all three airline services‬

‭8.‬ ‭Drag a‬‭Scatter-Gather‬‭flow control element from the‬‭Mule Palette and drop it‬
‭in the process section of‬‭getAllAirlineFlights‬‭.‬

‭9.‬ ‭Add three parallel‬‭Flow Reference‬‭components to the‬‭Scatter-Gather router.‬

‭10.‬‭In the first Flow Reference properties view, set the flow name and display‬
‭name to‬‭getAmericanFlights‬‭.‬

‭11.‬‭Set the flow name and display name of the second Flow Reference to‬
‭getUnitedFlights‬‭.‬

‭12.‬‭Set the flow name and display name of the third Flow Reference to‬
‭getDeltaFlights‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭195‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭13.‬‭Add a‬‭Logger‬‭after the‬‭Scatter-Gather‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭196‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review the metadata for the Scatter-Gather output‬

‭14.‬‭In the Logger properties view, explore the input payload structure in the‬
‭DataSense Explorer.‬

‭Debug the application‬

‭15.‬‭Add a‬‭breakpoint‬‭to the‬‭Scatter-Gather‬‭.‬

‭16.‬‭Add a‬‭breakpoint‬‭to the‬‭Logger‬‭.‬

‭17.‬‭Save the file to redeploy the project in debug mode.‬

‭18.‬‭In Advanced REST Client, change the URL to make a request to‬
‭http://localhost:8081/flights‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭197‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭19.‬‭In the Mule Debugger, step through the application; you should step through‬
‭each of the airline flows.‬

‭20.‬‭Stop at the Logger after the Scatter-Gather and explore the payload.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭198‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Drill down into one of the objects in the payload.‬

‭22.‬‭Step through the rest of the application and switch perspectives.‬

‭23.‬‭Return to Advanced REST Client and review the response; you should get a‬
‭500 Server Error with a message that the object could not be serialized.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭199‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Flatten the combined results‬

‭24.‬‭Return to Anypoint Studio.‬

‭25.‬‭In getAllAirlineFlights, add a‬‭Transform Message‬‭component‬‭before the‬


‭Logger‬‭.‬

‭26.‬‭Change the display name to flatten to‬‭[Flight]‬‭.‬

‭27.‬‭In the input section of the Transform Message properties view, review the‬
‭payload data structure.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭200‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭28.‬‭In the expression section, use the DataWeave flatten function to flatten the‬
‭collection of objects into a single collection.‬

‭Debug the application‬

‭29.‬‭Save the file to redeploy the project.‬

‭30.‬‭In Advanced REST Client, make the same request to‬


‭http://localhost:8081/flights‬‭.‬

‭31.‬‭In the Mule Debugger, click‬‭Resume‬‭until you are stopped‬‭at the Logger at the‬
‭end of the Scatter-Gather; you should see the payload is now one ArrayList of‬
‭Flights.‬

‭32.‬‭Step through the rest of the application and switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭201‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 4-2: Route events based on conditions‬

‭In this walkthrough, you create a flow to route events to either the American, United,‬
‭Delta, or get all airline flows based on the value of an airline query parameter. You‬
‭will:‬

‭●‬ ‭Use a Choice router.‬

‭●‬ ‭Use DataWeave expressions to set the router paths.‬

‭●‬ ‭Route all flight requests through the router.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭202‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Look at possible airline values specified in the API‬

‭1.‬ ‭Return to the‬‭apdev-flights-ws‬‭project in Anypoint‬‭Studio.‬

‭2.‬ ‭Return to‬‭mua-flights-api.raml‬‭in‬‭src/main/resources/api‬‭.‬

‭3.‬ ‭Locate the airline query parameter and its possible values.‬

‭Create a new flow‬

‭4.‬ ‭Return to‬‭implementation.xml‬‭.‬

‭5.‬ ‭Drag a‬‭Flow‬‭scope from the Mule Palette and drop it‬‭at the top of the canvas‬
‭above all the other flows.‬

‭6.‬ ‭Change the name of the flow to‬‭getFlights‬‭.‬

‭7.‬ ‭Move the‬‭GET /flights‬‭HTTP Listener from‬‭getAllAirlineFlights‬‭to the source‬


‭section of‬‭getFlights‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭203‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add a Choice router‬

‭8.‬ ‭Drag a Choice flow control element from the Mule Palette and drop it in the‬
‭process section of‬‭getFlights‬‭.‬

‭9.‬ ‭Add three parallel‬‭Flow Reference‬‭components to the‬‭Choice router.‬

‭10.‬‭Add a‬‭Flow Reference‬‭component to the default branch‬‭of the router.‬

‭11.‬‭In the first Flow Reference properties view, set the flow name and display‬
‭name to‬‭getAmericanFlights‬‭.‬

‭12.‬‭Set the flow names and display names for the other two Flow References to‬
‭getUnitedFlights‬‭and‬‭getDeltaFlights‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭204‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭13.‬‭For the Flow Reference in the default branch, set the flow name and display‬
‭name to‬‭getAllAirlineFlights‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭205‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Store the airline query parameter in a variable‬

‭14.‬‭Add a‬‭Set Variable‬‭transformer before the Choice router.‬

‭15.‬‭In the Set Variable properties view, set the name and display name to‬‭airline‬‭.‬

‭16.‬‭Switch the value field to‬‭expression mode‬‭then set‬‭its value to a query‬


‭parameter called‬‭airline‬‭.‬

message.attributes.queryParams.airline‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭206‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Configure the Choice router‬

‭17.‬‭In the Choice router getAmericanFlights flow reference branch, click the‬‭When‬
‭scope.‬

‭18.‬‭In the When properties view, switch the value field to‬‭expression mode‬‭, and‬
‭then add an expression to check if the airline variable is equal to‬‭american‬‭.‬

vars.airline == "american"‬

‭19.‬‭Set a similar expression for the‬‭United‬‭route, routing‬‭to it when‬‭vars.airline‬‭is‬


‭equal to‬‭united‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭207‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭20.‬‭Set a similar expression for the‬‭Delta‬‭route, routing to it when‬‭vars.airline‬‭is‬


‭equal to‬‭delta‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭208‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Route all requests through the router‬

‭21.‬‭Add a‬‭Flow Reference‬‭to the flow before the Choice‬‭router.‬

‭22.‬‭Set the flow name and display name to‬‭setCode‬‭.‬

‭23.‬‭In‬‭getAmericanFlights‬‭, delete the‬‭HTTP Listener‬‭and‬‭the‬‭setCode‬‭Flow‬


‭Reference.‬

‭24.‬‭In‬‭getUnitedFlights‬‭, delete the‬‭HTTP Listener‬‭and‬‭the‬‭setCode‬‭Flow‬


‭Reference.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭209‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭25.‬‭In‬‭getDeltaFlights‬‭, delete the‬‭HTTP Listener‬‭and the‬‭setCode‬‭Flow Reference.‬

‭Return JSON from the flow‬

‭26.‬‭In the getFlights flow, add a‬‭Transform Message‬‭component‬‭after the‬‭Choice‬


‭router.‬

‭27.‬‭Change its display name to‬‭[Flight] to JSON‬‭.‬

‭28.‬‭Add a‬‭Logger‬‭at the end of the flow.‬

‭29.‬‭In the Transform Message properties view, change the output type to‬
‭application/json and set the expression to payload.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭210‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭30.‬‭Add a‬‭breakpoint‬‭to the airline‬‭Set Variable‬‭transformer at the beginning of‬


‭getFlights‬‭.‬

‭31.‬‭Add a‬‭breakpoint‬‭to the‬‭[Flight] to JSON‬‭Transform‬‭Message component‬


‭after the‬‭Choice‬‭router.‬

‭32.‬‭Save the file to redeploy the project in debug mode.‬

‭33.‬‭In Advanced REST Client, make a request to‬‭http://localhost:8081/flights‬‭.‬

‭34.‬‭In the Mule Debugger, step through the application; you should see the‬
‭Choice router pass the event to the default branch.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭211‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭35.‬‭Resume to the Transform Message component after the Choice router; the‬
‭payload should be an ArrayList of Flight objects‬

‭36.‬‭Step to the‬‭Logger‬‭; the payload should be JSON.‬

‭37.‬‭Step to the end of the application.‬

‭38.‬‭Return to Advanced REST Client; you should see American, United, and Delta‬
‭flights to SFO (the default airport code).‬

‭39.‬‭Add an airline query parameter set to‬‭american‬‭and‬‭send the request:‬


‭http://localhost:8081/flights?airline=american‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭212‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭40.‬‭In the Mule Debugger, step through the application; you should see the event‬
‭passed to getAmericanFlights and then back to getFlights.‬

‭41.‬‭Return to Advanced REST Client; you should see only‬‭American flights to SFO‬
‭returned.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭213‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭42.‬‭Change the airline to‬‭united‬‭and add a second query parameter code set to‬
‭LAX‬‭:‬‭http://localhost:8081/flights?airline=united&code=LAX‬‭.‬

‭43.‬‭Send the request.‬

‭44.‬‭In the Mule Debugger, step through the application; the event should be‬
‭routed to the United branch.‬

‭45.‬‭Return to Advanced REST Client; you should see only‬‭United flights to LAX‬‭are‬
‭returned.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭214‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭46.‬‭Change the airline to‬‭delta‬‭and the code to‬‭PDX‬‭:‬


‭http://localhost:8081/flights?airline=delta&code=PDX‬‭.‬

‭47.‬‭Send the request.‬

‭48.‬‭In the Mule Debugger, step through the application; the event should be‬
‭routed to the Delta branch.‬

‭49.‬‭Return to Advanced REST Client; you should see only‬‭Delta flights to PDX‬‭are‬
‭returned.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭215‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE‬‭: This JSON structure does not match that specified in the API:‬
‭mua-flights-api.raml in src/main/resources/api. The data‬‭should‬‭, of course, be‬
‭transformed so the response from the API matches this specification – but we are‬
‭going to hold off doing that right now so that the scenario stays simpler for the error‬
‭handling module (there is one less error to handle at the beginning).‬

‭Test the application with a destination that has no flights‬

‭50.‬‭Remove the airline parameter and set the code to‬‭FOO‬‭:‬


‭http://localhost:8081/flights?code=FOO‬‭.‬

‭51.‬‭Send the request.‬

‭52.‬‭In the Mule Debugger, step through the application; you should see multiple‬
‭errors.‬

‭53.‬‭Return to Advanced REST Client; you should get a 500 Server Response and an‬
‭exception.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭216‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 4-3: Validate events‬

‭In this walkthrough, you use a validator to check if a query parameter called code‬
‭with a value of SFO, LAX, CLE, PDX, or PDF is sent with a request and to throw an‬
‭error if it is not. You will:‬

‭●‬ ‭Add the Validation module to a project.‬

‭●‬ ‭Use an Is true validator to check if a query parameter called code with a value‬
‭of SFO, LAX, CLE, PDX, or PDF is sent with a request.‬

‭●‬ ‭Return a custom error message if the condition is not met.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭217‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add the Validation module to the project‬

‭1.‬ ‭Switch to the Mule Design perspective and return to‬‭implementation.xml‬‭.‬

‭2.‬ ‭In the Mule Palette, select‬‭Add Modules‬‭.‬

‭3.‬ ‭Select the‬‭Validation‬‭module in the right side of‬‭the Mule Palette and drag‬
‭and drop it into the left side.‬

‭4.‬ ‭If you get a Select module version dialog box, select the latest version and‬
‭click‬‭Add‬‭.‬

‭Use the Is true validator to check for a valid destination code‬

‭5.‬ ‭Locate the‬‭Is true‬‭validator in the right side of‬‭the Mule Palette.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭218‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭6.‬ ‭Drag and drop the‬‭Is true‬‭validator after the‬‭setCode‬‭Flow Reference in the‬
‭getFlights‬‭flow.‬

‭7.‬ ‭In the‬‭Is true‬‭properties view, set the display name‬‭to‬‭Is valid‬‭destination.‬

‭8.‬ ‭Change the expression from‬‭False (Default)‬‭to‬‭Expression‬‭.‬

‭9.‬ ‭Add a‬‭DataWeave expression‬‭to check if the code variable‬‭is one of the five‬
‭destination codes.‬

#[['SFO','LAX','CLE','PDX','PDF'] contains vars.code]‬


‭NOTE‬‭: You can copy this expression from the course‬‭snippets.txt file.‬

‭10.‬‭Using expression mode, set the error message to Invalid destination followed‬
‭by the provided code.‬

'Invalid destination' ++ ' ' ++ (vars.code default ' ')‬


‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭219‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE‬‭: You can copy this expression from the course snippets.txt file.‬

‭Debug the application‬

‭11.‬‭Save the file and wait for the application to redeploy.‬

‭12.‬‭In Advanced REST Client, change the code to make a request to‬
‭http://localhost:8081/flights?code=CLE‬‭.‬

‭13.‬‭In the Mule Debugger, step past the validator; you should see the code is valid‬
‭and application execution steps to the Choice router.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭220‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭14.‬‭Resume through the rest of the application.‬

‭15.‬‭In Advanced REST Client, you should see flights for CLE.‬

‭16.‬‭Change the code and make a request to‬


‭http://localhost:8081/flights?code=FOO‬‭.‬

‭17.‬‭In the Mule Debugger, attempt to step past the validator; you should see an‬
‭error.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭221‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭18.‬‭Resume through the rest of the application; you should see your Invalid‬
‭destination message in the console.‬

‭19.‬‭Return to Advanced REST Client; you should get a 500 Server Error with your‬
‭Invalid destination message.‬

‭NOTE‬‭: You will catch this error and send a JSON response‬‭with a different status code‬
‭in the next module.‬

‭20.‬‭Remove the code and make a request to‬‭http://localhost:8081/flights‬‭.‬

‭21.‬‭In the Mule Debugger, step past the validator; you should not get any errors.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭222‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭22.‬‭Resume through the rest of the application.‬

‭23.‬‭Return to Advanced REST Client; you should get a 200 response with all airline‬
‭flights to SFO.‬

‭24.‬‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭223‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Remove the default destination‬

‭25.‬‭Locate the‬‭setCode‬‭subflow.‬

‭26.‬‭In the Set Variable properties view, review the default value.‬

‭27.‬‭Remove the default value from the value.‬

‭Debug the application‬

‭28.‬‭Save the file to redeploy the project.‬

‭29.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights‬‭.‬

‭30.‬‭In the Mule Debugger, attempt to step past the validator; you should now get‬
‭an error.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭224‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭31.‬‭Resume through the rest of the application.‬

‭32.‬‭Return to Advanced REST Client; you should get a 500 Server Error with your‬
‭Invalid destination message.‬

‭NOTE‬‭: You will catch this error and send a JSON response‬‭with a different status code‬
‭in the next module.‬

‭33.‬‭Return to Anypoint Studio and stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭225‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Module 5: Handling errors‬

‭At the end of this module, you should be able to:‬

‭●‬ ‭Handle messaging errors at the application, flow, and processor level.‬

‭●‬ ‭Handle different types of errors, including custom errors.‬

‭●‬ ‭Use different error scopes to either handle an error and continue execution of the‬
‭parent flow or propagate an error to the parent flow.‬

‭●‬ ‭Set the success and error response settings for an HTTP Listener.‬

‭●‬ ‭Set reconnection strategies for system errors.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭226‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 5-1: Explore default error handling‬

‭In this walkthrough, you get familiar with the three errors you will learn to handle in‬
‭this module. You will:‬

‭●‬ ‭Explore information about different types of errors in the Mule Debugger and‬
‭the console.‬

‭●‬ ‭Review the default error handling behavior.‬

‭●‬ ‭Review and modify the error response settings for an HTTP Listener.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭227‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a connectivity error‬

‭1.‬ ‭Return to‬‭apdev-flights-ws‬‭in Anypoint Studio.‬

‭2.‬ ‭Return to‬‭config.yaml‬‭.‬

‭3.‬ ‭Change the‬‭delta.wsdl‬‭property from‬‭/delta?wsdl‬‭to‬‭/deltas?wsdl‬‭.‬

‭4.‬ ‭Save the file.‬

‭5.‬ ‭Return to‬‭implementation.xml‬‭and debug the project.‬

‭6.‬ ‭If you get an Errors in Workspace dialog box, click‬‭Proceed‬‭.‬

‭Review a validation error in the Mule Debugger and console‬

‭7.‬ ‭In Advanced REST Client, add a code and make a request to‬
‭http://localhost:8081/flights?code=FOO‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭228‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭8.‬ ‭In the Mule Debugger, step to where the error is thrown and examine the error‬
‭object; you should see an error description, errorType, and other properties.‬

‭9.‬ ‭Step through the rest of the application and review the error information‬
‭logged in the console.‬

‭10.‬‭In Advanced REST Client, locate the response status code, status reason, and‬
‭body; you should see a 500 status code, a status reason of Server Error, and a‬
‭response body equal to the error description.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭229‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review a connectivity error in the Mule Debugger and console‬

‭11.‬‭Add an airline and change the code to make a request to‬


‭http://localhost:8081/flights?airline=delta&code=PDX‬‭.‬

‭12.‬‭In the Mule Debugger, step to where the error is thrown and review the error‬
‭object.‬

‭13.‬‭Step again and review the error information logged in the console.‬

‭14.‬‭Step through the rest of the application.‬

‭15.‬‭Return to Advanced REST Client; you should see a 500 Server Error with the‬
‭error description.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭230‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review a bad request error in the Mule Debugger and console‬

‭16.‬‭Change the airline to make a request to‬


‭http://localhost:8081/flights?airline=american&code=PDX‬‭.‬

‭17.‬‭In the Mule Debugger, step to where the error is thrown and review the error‬
‭object.‬

‭18.‬‭Step through the rest of the application.‬

‭19.‬‭Review the error information logged in the console.‬

‭20.‬‭Return to Advanced REST Client; you should see a 500 Server Error with the‬
‭error description.‬

‭21.‬‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭22.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭231‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review the default error response settings for an HTTP Listener‬

‭23.‬‭Navigate to the properties view for the‬‭GET /flights‬‭Listener in getFlights.‬

‭24.‬‭Select the‬‭Responses‬‭tab.‬

‭25.‬‭Locate the‬‭Error Response‬‭section and review the default‬‭settings for the‬


‭body, status code, and reason phrase.‬

‭Remove the default error response settings for the HTTP Listener‬

‭26.‬‭Select and cut the body expression (so it has no value, but you can paste it‬
‭back later).‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭232‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭27.‬‭Save the file, run the project, and proceed through any errors in the‬
‭workspace.‬

‭28.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?airline=american&code=PDX‬‭;‬‭you should get the‬
‭same response.‬

‭Modify the default error response settings for the HTTP Listener‬

‭29.‬‭Return to Anypoint Studio.‬

‭30.‬‭Return to the Responses tab in the properties view for the GET /flights‬
‭Listener.‬

‭31.‬‭In the error response body, paste back the original value.‬

output‬‭
‭ text/plain --- error.description‬

‭32.‬‭Change the output type of the error response to‬‭application/json‬‭and display‬


‭the‬‭error.errorType‬‭.‬

output‬‭
‭ application/json --- error.errorType‬

‭NOTE‬‭: Ensure the error response body is in expression‬‭mode.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭233‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭33.‬‭Set the error response status code to 400.‬

‭Test the application‬

‭34.‬‭Save the file to redeploy the application.‬

‭35.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?airline=american&code=PDX‬‭;‬‭you should get the‬
‭new status code and reason and the response body should be the errorType‬
‭object.‬

‭36.‬‭Look at the error namespace and identifier.‬

‭37.‬‭Change the airline to make a request to‬


‭http://localhost:8081/flights?airline=delta&code=PDX‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭234‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭38.‬‭Look at the error namespace and identifier.‬

‭39.‬‭Change the code to make a request to‬


‭http://localhost:8081/flights?airline=delta&code=FOO‬‭.‬

‭40.‬‭Look at the namespace and identifier.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭235‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Return the default error response settings for the HTTP Listener‬

‭41.‬‭Return to Anypoint Studio.‬

‭42.‬‭Return to the‬‭Responses‬‭tab in the properties view‬‭for the GET /flights‬


‭Listener.‬

‭43.‬‭Change the error response output type back to‬‭text/plain‬‭and display the‬
‭error.description‬‭.‬

output‬‭
‭ text/plain --- error.description‬

‭44.‬‭Remove the status code.‬

‭Test the application‬

‭45.‬‭Save the file to redeploy the application.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭236‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭46.‬‭In Advanced REST Client, change the airline and code to make a request to‬
‭http://localhost:8081/flights?airline=american&code=PDX‬‭;‬‭you should get the‬
‭500 Server Error again with the plain text error description.‬

‭47.‬‭Return to Anypoint Studio.‬

‭48.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭237‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 5-2: Handle errors at the application level‬

‭In this walkthrough, you create a default error handler for the application. You will:‬

‭●‬ ‭Create a global error handler in an application.‬

‭●‬ ‭Configure an application to use a global default error handler.‬

‭●‬ ‭Explore the differences between the On Error Continue and On Error‬
‭Propagate scopes.‬

‭●‬ ‭Modify the default error response settings for an HTTP Listener.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Browse the error handling elements in the Mule Palette‬

‭1.‬ ‭Return to‬‭global.xml‬‭and switch to the Message Flow‬‭view.‬

‭2.‬ ‭In the Core section of the Mule Palette, locate the Error Handling elements.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭238‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a global error handler with an On Error Continue scope‬

‭3.‬ ‭Drag out an Error Handler element and drop it in the canvas of‬‭global.xml‬‭.‬

‭4.‬ ‭Drag out an On Error Continue element and drop it in‬‭globalError_Handler‬‭.‬

‭5.‬ ‭In the On Error Continue properties view, click the‬‭search‬‭button for type.‬

‭6.‬ ‭In the dropdown menu that appears, select‬‭ANY‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭239‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Set the payload in the error handler to a JSON message‬

‭7.‬ ‭Add a‬‭Transform Message‬‭component to the‬‭On Error‬‭Continue‬‭.‬

‭8.‬ ‭Set the‬‭Transform Message‬‭display name to‬‭error.description‬‭.‬

‭9.‬ ‭In the Transform Message properties view, change the output type to‬
‭application/json‬‭.‬

‭10.‬‭Add a message property to the output JSON and give it a value of the‬
‭error.description‬‭.‬

‭Set a default error handler for the application‬

‭11.‬‭Switch to the Global Elements view of‬‭global.xml‬‭.‬

‭12.‬‭Click‬‭Create‬‭.‬

‭13.‬‭In the Choose Global Type dialog box, select‬‭Global‬‭Configurations >‬


‭Configuration‬‭and click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭240‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭14.‬‭In the Global Element Properties dialog box, set the default error handler to‬
‭globalError_Handler‬‭and click‬‭OK‬‭.‬

‭15.‬‭Switch to the‬‭Message Flow‬‭view.‬

‭Review the default response settings for an HTTP Listener‬

‭16.‬‭Return to‬‭implementation.xml‬‭.‬

‭17.‬‭Navigate to the properties view for the‬‭GET /flights‬‭Listener in‬‭getFlights‬‭.‬

‭18.‬‭Select the‬‭Responses‬‭tab.‬

‭19.‬‭Locate the Response section (not the Error Response section) and review the‬
‭default settings for the body, status code, and reason phrase.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭241‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭20.‬‭Locate the Error Response section and review the default settings for the body,‬
‭status code, and reason phrase.‬

‭Test the On Error Continue behavior‬

‭21.‬‭Save all files, debug the project, and proceed through any errors in the‬
‭workspace.‬

‭22.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?airline=american&code=PDX‬‭.‬

‭23.‬‭In the Mule Debugger, step through the application until the event is passed‬
‭to‬‭globalError_Handler‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭242‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭24.‬‭Expand the error object and review the exception.‬

‭25.‬‭Step again; the event should be passed back to getFlights, which continues to‬
‭execute after the error occurs.‬

‭26.‬‭Review the payload and note the absence of an error object.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭243‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭27.‬‭Resume through the rest of the application.‬

‭28.‬‭Return to Advanced REST Client; you should see a 200 OK response with the‬
‭response body equal to the payload value set in the error handler.‬

‭Change the default error handler to use an On Error Propagate‬


‭scope‬

‭29.‬‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭30.‬‭Return to‬‭global.xml‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭244‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭31.‬‭Drag an‬‭On Error Propagate‬‭element from the Mule Palette and drop it to the‬
‭right or left of the‬‭On Error Continue‬‭to add it to‬‭globalError_Handler‬‭.‬

‭32.‬‭In the‬‭On Error Propagate‬‭properties view, set the‬‭type to‬‭ANY‬‭.‬

‭33.‬‭Move the‬‭Transform Message‬‭component from the‬‭On Error‬‭Continue‬‭to the‬


‭On Error Propagate‬‭.‬

‭34.‬‭Delete the On Error Continue scope.‬

‭Test the On Error Propagate behavior‬

‭35.‬‭Save the file to redeploy the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭245‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭36.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?airline=american&code=PDX‬‭.‬

‭37.‬‭Step through the application until the event is passed to globalError_Handler.‬

‭38.‬‭Look at the error object in the Mule Debugger; it should be the same as‬
‭before.‬

‭39.‬‭Step again; the error is propagated up to the getFlights parent flow.‬

‭40.‬‭Look at the payload and the error object in the Mule Debugger.‬

‭41.‬‭Step twice more; the error is handled by the application’s default error handler‬
‭again.‬

‭42.‬‭Look at the payload and the error object in the Mule Debugger.‬

‭43.‬‭Resume through the rest of the application.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭246‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭44.‬‭Return to Advanced REST Client; you should get a 500 Server Error response‬
‭with the response body equal to the plain text error description – not the‬
‭payload.‬

‭45.‬‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭46.‬‭Stop the project.‬

‭Modify the default error response settings for the HTTP Listener‬

‭47.‬‭Return to‬‭implementation.xml‬‭.‬

‭48.‬‭Navigate to the‬‭Responses‬‭tab in the properties view‬‭for the GET /flights‬


‭Listener.‬

‭49.‬‭Change the error response body to return the payload instead of‬
‭error.description.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭247‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

payload‬

‭Test the application‬

‭50.‬‭Save the file, run the project, and proceed through any errors in the‬
‭workspace.‬

‭51.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?airline=american&code=PDX‬‭;‬‭you should now‬
‭get the message that you set in the error handler.‬

‭NOTE‬‭: You will handle this error differently in a‬‭later walkthrough, so it does not‬
‭return a server error. It is a valid request; there are just no American flights to PDX.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭248‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭52.‬‭Change the airline to make a request to‬


‭http://localhost:8081/flights?airline=delta&code=PDX‬‭; the error is handled by‬
‭the same default handler.‬

‭53.‬‭Return to Anypoint Studio.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭249‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 5-3: Handle specific types of errors‬

‭In this walkthrough, you continue to work with the application’s default error handler.‬
‭You will:‬

‭●‬ ‭Review the possible types of errors thrown by different processors.‬

‭●‬ ‭Create error handler scopes to handle different error types.‬

‭Starting file‬

I‭ f you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Review the possible types of errors thrown by a Web Service‬


‭Consumer operation‬

‭1.‬ ‭Return to‬‭implementation.xml‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭250‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭2.‬ ‭Navigate to the properties view for the Get flights Consume operation in‬
‭getDeltaFlights.‬

‭3.‬ ‭Select the‬‭Error Mapping‬‭tab.‬

‭4.‬ ‭Click the‬‭Add new mapping‬‭button and review (but don’t‬‭select!) the‬‭WSC‬
‭error types.‬

‭Review the possible types of errors thrown by a REST Connector‬


‭operator‬

‭5.‬ ‭Navigate to the properties view for the‬‭Get flights‬‭operation in‬


‭getAmericanFlights‬‭.‬

‭6.‬ ‭Select the‬‭Error Mapping‬‭tab.‬

‭7.‬ ‭Click the‬‭Add new mapping‬‭button, and review (but‬‭don’t select!) the‬
‭AMERICAN-FLIGHTS-API‬‭error types.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭251‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review the possible types of errors thrown by a Validator‬


‭operation‬

‭8.‬ ‭Navigate to the properties view for the‬‭Is true‬‭validator‬‭in‬‭getFlights‬‭.‬

‭9.‬ ‭Select the‬‭Error Mapping‬‭tab.‬

‭10.‬‭Click the‬‭Add new mapping‬‭button and locate (but don’t‬‭select!) the‬


‭VALIDATION‬‭error type.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭252‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add a second error handler scope to catch Web Service Consumer‬


‭connectivity errors‬

‭11.‬‭Return to‬‭global.xml‬‭.‬

‭12.‬‭Add a second‬‭On Error Propagate‬‭to‬‭globalError_Handler‬‭.‬

‭13.‬‭If necessary, drag and drop it so it is the first scope inside the error handler.‬

‭14.‬‭Return to the course‬‭snippets.txt‬‭file and copy the‬‭expression for the error‬


‭type.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭253‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭15.‬‭Return to‬‭global.xml‬‭in Anypoint Studio.‬

‭16.‬‭In the properties view for the new‬‭On Error Propagate‬‭,‬‭set the error type by‬
‭pasting the expression you copied.‬

WSC:CONNECTIVITY, WSC:INVALID_WSDL‬

‭17.‬‭Add a Transform Message component to the new‬‭On Error‬‭Propagate‬‭and set‬


‭its display name to‬‭Data unavailable‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭254‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭18.‬‭In the Transform Message properties view, change the output type to‬
‭application/json‬‭.‬

‭19.‬‭Add a message property to the output JSON and give it a value of‬‭Data‬
‭unavailable. Try later‬‭.‬

‭20.‬‭For development purposes, concatenate the‬‭error.description‬‭to the message;‬


‭be sure to use the auto-completion menu.‬

‭21.‬‭Coerce the variable to a String.‬

‭Test the application‬

‭22.‬‭Save the file to redeploy the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭255‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?airline=delta&code=PDX‬‭;‬‭you should now get a‬
‭500 Server Error response with your new Data unavailable message.‬

‭24.‬‭Change the code to make a request to‬


‭http://localhost:8081/flights?airline=delta&code=FOO‬‭;‬‭you should still get a‬
‭500 Server Error response with the Invalid destination JSON message.‬

‭NOTE‬‭: This should also not be a server error, but‬‭either a 4XX bad request or a 200‬
‭OK with an appropriate message. You will handle this error differently in the next‬
‭walkthrough.‬

‭25.‬‭Return to Anypoint Studio.‬

‭26.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭256‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 5-4: Handle errors at the flow level‬

‭In this walkthrough, you add multiple error handlers to a flow. You will:‬

‭●‬ ‭Add error handlers to a flow.‬

‭●‬ ‭Test the behavior of errors thrown in a flow and by a child flow.‬

‭●‬ ‭Compare On Error Propagate and On Error Continue scopes in a flow.‬

‭●‬ ‭Set an HTTP status code in an error handler and modify an HTTP Listener to‬
‭return it.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭257‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Add an On Error Propagate error handler to a flow‬

‭1.‬ ‭Return to‬‭implementation.xml‬‭.‬

‭2.‬ ‭Expand the‬‭Error handling‬‭section of the‬‭getFlights‬‭flow.‬

‭3.‬ ‭Add an‬‭On Error Propagate‬‭scope.‬

‭4.‬ ‭Set the error type to‬‭ANY‬‭so it will initially catch‬‭both the validation and‬
‭American flights errors.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭258‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Set the payload in the error handler to the error description‬

‭5.‬ ‭Add a‬‭Transform Message‬‭component to the scope and set the display name‬
‭to‬‭No flights‬‭.‬

‭6.‬ ‭In the Transform Message properties view, set the payload to a‬‭JSON message‬
‭property‬‭equal to the string‬‭No flights to‬‭and concatenate‬‭the code variable.‬

‭7.‬ ‭Coerce the variable to a‬‭String‬‭.‬

‭Set the HTTP status code in the error handler to 200‬

‭8.‬ ‭Add a Set Variable transformer to the‬‭On Error Propagate‬‭.‬

‭9.‬ ‭In the Set Variable properties view, set the display name and name to‬
‭httpStatus‬‭.‬

‭10.‬‭Set the value to‬‭200‬‭.‬

‭Set the HTTP Listener error response status code to use a variable‬

‭11.‬‭Navigate to the‬‭Responses‬‭tab in the properties view‬‭for the GET /flights‬


‭Listener.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭259‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭12.‬‭Use expression mode to change the error response status code (not the‬
‭response status code!) to an expression that sets it equal to the value of an‬
‭httpStatus variable with a default value of‬‭500‬‭.‬

vars.httpStatus‬‭
‭ default‬‭
500‬

‭Test the flow’s On Error Propagate with an error in the flow‬

‭13.‬‭Save the file, debug the project, and proceed through any errors in the‬
‭workspace.‬

‭14.‬‭In Advanced REST Client, change the airline to make a request to‬
‭http://localhost:8081/flights?airline=american&code=FOO‬‭.‬

‭15.‬‭In the Mule Debugger, step until the event is passed to the flow’s error‬
‭handler.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭260‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭16.‬‭Step through the rest of the application.‬

‭17.‬‭Return to Advanced REST Client; you should get the 200 status code and the‬
‭JSON message.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭261‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the flow’s On Error Propagate with an error in a child flow‬

‭18.‬‭In Advanced REST Client, change the code to make a request to‬
‭http://localhost:8081/flights?airline=american&code=PDX‬‭.‬

‭19.‬‭Step until the event is passed to the globalError_Handler.‬

‭20.‬‭Step until the error is passed to the parent flow’s error handler.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭262‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Step through the rest of the application.‬

‭22.‬‭Return to Advanced REST Client; you should get the 200 status code and the‬
‭JSON error message.‬

‭23.‬‭Return to Anypoint Studio and switch to the Mule design perspective.‬

‭Specify the type of error to be handled by the flow’s error handler‬

‭24.‬‭Navigate to the properties view for the‬‭On Error Propagate‬‭in‬‭getFlights‬‭.‬

‭25.‬‭Change the type from‬‭ANY‬‭to‬‭AMERICAN-FLIGHTS-API:BAD_REQUEST‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭263‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭26.‬‭Save the file to redeploy the project.‬

‭27.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?airline=american&code=PDX‬‭.‬

‭28.‬‭In the Mule Debugger, step through the application; the error should still be‬
‭handled by globalError_Handler and then the getFlights flow error handler.‬

‭29.‬‭In Advanced REST Client, change the code to make a request to‬
‭http://localhost:8081/flights?airline=american&code=FOO‬‭.‬

‭30.‬‭In the Mule Debugger, step through the application; you should get a 500‬
‭Server Error and no message because the error is not handled by the getFlights‬
‭flow error handler or by globalError_handler.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭264‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭31.‬‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭32.‬‭Stop the project.‬

‭33.‬‭Navigate to the‬‭Responses‬‭tab in the properties view‬‭for the‬‭GET /flights‬


‭Listener.‬

‭34.‬‭Review the‬‭error response body‬‭(not the response body!)‬‭and ensure you‬


‭know why you got the last response for‬
‭http://localhost:8081/flights?airline=american&code=FOO‬‭.‬

‭Use an On Error Continue error handler in a flow‬

‭35.‬‭Add an‬‭On Error Continue‬‭scope to‬‭getFlights‬‭.‬

‭36.‬‭In the On Error Continue properties view, set the type to‬
‭VALIDATION:INVALID_BOOLEAN‬‭.‬

‭37.‬‭Add a‬‭Transform Message‬‭component to the scope and‬‭set the display name‬


‭to‬‭error.description‬‭.‬

‭38.‬‭In the Transform Message properties view, set the payload to a‬‭JSON message‬
‭property equal to the error.description.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭265‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭39.‬‭Add a‬‭Set Variable‬‭transformer to the On Error Continue‬‭scope.‬

‭40.‬‭Set the display name and name to httpStatus and set the value to 400.‬

‭Test the application‬

‭41.‬‭Save the file, run the project, and proceed through any errors in the‬
‭workspace.‬

‭42.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?airline=american&code=FOO‬‭;‬‭you should get a‬
‭200 response and the invalid destination message again – not the 400‬
‭response.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭266‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Set the HTTP Listener response status code‬

‭43.‬‭Return to Anypoint Studio.‬

‭44.‬‭Navigate to the‬‭Responses‬‭tab in the properties view‬‭for the GET /flights‬


‭Listener.‬

‭45.‬‭Use expression mode to set the‬‭response status code‬‭(not the error response‬
‭status code!) to an expression that sets it equal to the value of an httpStatus‬
‭variable with a default value of 200.‬

vars.httpStatus‬‭
‭ default‬‭
200‬

‭Test the application‬

‭46.‬‭Save the file to redeploy the project.‬

‭47.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?airline=american&code=FOO‬‭;‬‭you should now‬
‭get the 400 response.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭267‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application to see what happens with the Scatter-Gather‬

‭48.‬‭In Advanced REST Client, change the code and make a request to‬
‭http://localhost:8081/flights?airline=american&code=PDX‬‭;‬‭you should get a‬
‭200 response and no flights to PDX.‬

‭49.‬‭Change the airline to make a request to‬


‭http://localhost:8081/flights?airline=united&code=PDX‬‭;‬‭you should get‬
‭United flights to PDX.‬

‭50.‬‭Remove the airline to make a request to‬


‭http://localhost:8081/flights?code=PDX‬‭; you should‬‭get flights to PDX‬
‭because United has flights, but you get none.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭268‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭51.‬‭Return to Anypoint Studio.‬

‭52.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭269‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 5-5: Handle errors at the processor level‬

‭In this walkthrough, you work with the Scatter-Gather in getAllAirlineFlights so that it‬
‭correctly returns results when one but not all airlines have flights. You will:‬

‭●‬ ‭Wrap the Flow Reference in each branch of a Scatter-Gather in a Try scope.‬

‭●‬ ‭Use an On Error Continue scope in each Try scope error handler to provide a‬
‭valid response so flow execution can continue.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭270‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application when a Scatter-Gather branch has an error‬

‭1.‬ ‭Return to‬‭implementation.xml‬‭in Anypoint Studio.‬

‭2.‬ ‭Debug the project and proceed through any errors in the workspace.‬

‭3.‬ ‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?code=PDX‬‭.‬

‭4.‬ ‭Return to the Mule Debugger and step through the application until you see a‬
‭routing exception.‬

‭5.‬ ‭Step through the rest of the application.‬

‭6.‬ ‭Return to Advanced REST client, you should get the 500 Server Error that there‬
‭were exceptions in routes 0 and 2.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭271‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭7.‬ ‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭Place each Flow Reference in the Scatter-Gather in a Try scope‬

‭8.‬ ‭Locate the‬‭getAllAirlineFlights‬‭flow.‬

‭9.‬ ‭Drag a‬‭Try‬‭scope from the Mule Palette and drop it‬‭in the‬‭Scatter-Gather‬
‭before the‬‭getAmericanFlights‬‭Flow Reference.‬

‭10.‬‭Drag the‬‭getAmericanFlights‬‭Flow Reference into the‬‭Try‬‭scope.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭272‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Add‬‭Try‬‭scopes to the other two routes of the Scatter-Gather.‬

‭12.‬‭Move the getUnitedFlights Flow Reference into one of the Try scopes and the‬
‭getDeltaFlights Flow Reference into the other.‬

‭Add an error handler to each branch that passes through the error‬
‭message‬

‭13.‬‭Expand the error handling section of the first Try scope.‬

‭14.‬‭Add an‬‭On Error Continue‬‭scope and set the types of‬‭errors it handles to ANY.‬

‭15.‬‭Repeat these steps to add the same error handler to the two other Try scopes.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭273‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭16.‬‭Save the file to redeploy the project.‬

‭17.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?code=PDX‬‭.‬

‭18.‬‭In the Mule Debugger, resume to the Logger after the Scatter-Gather in‬
‭getAllAirlineFlights.‬

‭19.‬‭Expand‬‭Payload‬‭; you should see three flights (from‬‭United) and two error‬
‭messages.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭274‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭20.‬‭Step through the rest of the application.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭275‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Return to Advanced REST Client; you should see United flights and error‬
‭messages.‬

‭Modify each error handler to set the payload to an empty array‬

‭22.‬‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭23.‬‭In getAllAirlineFlights, add a‬‭Transform Message‬‭component‬‭to one of the On‬


‭Error Continue scopes.‬

‭24.‬‭Set the display name to‬‭[]‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭276‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭25.‬‭In the Transform Message properties view, set the payload to an empty array.‬

‭26.‬‭Repeat the steps to add the same Transform Message component to the two‬
‭other error handlers.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭277‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭278‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭27.‬‭Save the file to redeploy the project.‬

‭28.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?code=PDX‬‭.‬

‭29.‬‭In the Mule Debugger, resume to the Logger after the Scatter-Gather in‬
‭getAllAirlineFlights.‬

‭30.‬‭Expand‬‭Payload‬‭; you should now see the three flights‬‭and no error messages.‬

‭31.‬‭Step through the rest of the application.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭279‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭32.‬‭Return to Advanced REST Client; you should now only see the three flights.‬

‭33.‬‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭34.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭280‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 5-6: Map an error to a custom error type‬

‭In this walkthrough, you map the Validation error to a custom error type for the‬
‭application. You will:‬

‭●‬ ‭Map a module error to a custom error type for an application.‬

‭●‬ ‭Create an event handler for the custom error type.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Map a validation module error to a custom error type‬

‭1.‬ ‭Return to‬‭implementation.xml‬‭.‬

‭2.‬ ‭Navigate to the properties view for the validator in‬‭getFlights‬‭.‬

‭3.‬ ‭Select the‬‭Error Mapping‬‭tab.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭281‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭4.‬ ‭Click the‬‭Add new mapping‬‭button.‬

‭5.‬ ‭Select the‬‭VALIDATION:INVALID_BOOLEAN‬‭error type.‬

‭6.‬ ‭Leave the namespace of the custom error to map to set to‬‭APP‬‭.‬

‭7.‬ ‭Set the identifier to‬‭INVALID_DESTINATION‬‭.‬

‭8.‬ ‭Press‬‭Enter‬‭; you should see your new error mapping.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭282‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Change the existing validation error handler to catch the new‬


‭custom type‬

‭9.‬ ‭Navigate to the properties view for the getFlights validation On Error Continue‬
‭error handler.‬

‭10.‬‭Change the type from‬‭VALIDATION:INVALID_BOOLEAN‬‭to‬‭the new‬


‭APP:INVALID_DESTINATION‬‭that should now appear in‬‭the type drop-down‬
‭menu.‬

‭Test the application‬

‭11.‬‭Save the file, run the project, and proceed through any errors in the‬
‭workspace.‬

‭12.‬‭In Advanced REST Client, change the code and make a request to‬
‭http://localhost:8081/flights?code=FOO‬‭; you should‬‭still get a 400 response‬
‭with the invalid destination error.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭283‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Move the American error handler into the American flow‬

‭13.‬‭Collapse the‬‭getAllAirlineFlights‬‭and‬‭setCode‬‭flows.‬

‭14.‬‭Move the‬‭AMERICAN-FLIGHTS-API‬‭error scope from‬‭getFlights‬‭into‬


‭getAmericanFlights‬‭.‬

‭Move the error handler to the global error handler‬

‭NOTE‬‭: The following steps have instructions to make‬‭changes in the XML. If you‬
‭prefer, you can copy and paste the error handler to move it between files and then‬
‭delete the original.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭284‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭15.‬‭Right-click the validation‬‭On Error Continue‬‭error handler in getFlights and‬


‭select‬‭Go to XML‬‭.‬

‭16.‬‭Select and cut the‬‭APP:INVALID_DESTINATION‬‭on-error-continue.‬

‭17.‬‭Delete the remaining empty error-handler tag set.‬

‭18.‬‭Return to‬‭global.xml‬‭.‬

‭19.‬‭Right-click the‬‭globalError_Handler‬‭and select‬‭Go‬‭to XML‬‭.‬

‭20.‬‭Place the cursor on a new line inside and at the start of the‬
‭globalError_Handler error-handler‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭285‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Paste the on-error-continue you cut to the clipboard.‬

‭NOTE‬‭: If you are prompted to regenerate ID values,‬‭click‬‭Yes‬‭.‬

‭22.‬‭Switch back to the Message Flow view; you should see the‬
‭APP:INVALID_DESTINATION handler.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭286‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭Return to implementation.xml and switch to the Message Flow view; you‬


‭should no longer see an error handler in getFlights.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭287‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭24.‬‭Save the files to redeploy the project.‬

‭25.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?code=FOO‬‭; you should‬‭still get a 400 response‬
‭with the invalid destination error.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭288‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭26.‬‭Change the code and make a request to‬


‭http://localhost:8081/flights?code=PDX‬‭; you should‬‭still get only United‬
‭flights to PDX.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭289‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 5-7: Review and integrate with APIkit error‬


‭handlers‬

‭In this walkthrough, you connect the application’s implementation to the interface‬
‭and ensure all the error handling works. You will:‬

‭●‬ ‭Review the error handlers generated by APIkit.‬

‭●‬ ‭Review settings for the APIkit Router and HTTP Listener in the APIkit‬
‭generated interface.‬

‭●‬ ‭Connect the implementation to the interface and test the error handling‬
‭behavior.‬

‭●‬ ‭Modify implementation error scopes so they work with the APIkit generated‬
‭interface.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭290‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Review APIkit generated error handlers‬

‭1.‬ ‭Return to‬‭apdev-flights-ws‬‭in Anypoint Studio.‬

‭2.‬ ‭Return to‬‭interface.xml‬‭.‬

‭3.‬ ‭Review the error handling section in‬‭mua-flights-api-main‬‭.‬

‭4.‬ ‭Review the types of errors handled by each error handler scope.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭291‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭5.‬ ‭Navigate to the Transform Message properties view for the first error handling‬
‭scope.‬

‭6.‬ ‭Review the expression that sets the payload.‬

‭7.‬ ‭Use the output dropdown menu to change the output to‬‭Variable –‬
‭httpStatus‬‭.‬

‭8.‬ ‭Review the expression that sets an httpStatus variable; you should see that for‬
‭a bad request the httpStatus variable is set to 400.‬

‭Review settings for the APIkit Router‬

‭9.‬ ‭Navigate to the properties view for the APIkit Router in mua-flights-api-main.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭292‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭10.‬‭Click the‬‭Edit‬‭button next to router configuration.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭293‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭In the Global Element Properties dialog box, locate the HTTP status var name‬
‭setting; you should see‬‭httpStatus‬‭.‬

‭12.‬‭Click‬‭OK‬‭.‬

‭Review settings for the HTTP Listener‬

‭13.‬‭Navigate to the‬‭Responses‬‭tab in the properties view‬‭for the HTTP Listener in‬


‭mua-flights-api-main.‬

‭14.‬‭Review the response body and status code.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭294‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭15.‬‭Review the error response body and status code.‬

‭Connect the interface to the implementation‬

‭16.‬‭In interface.xml, locate the‬‭get:\flights‬‭flow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭295‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭17.‬‭Review the default transformation in this flow.‬

‭18.‬‭Delete the‬‭Transform Message‬‭component.‬

‭19.‬‭Add a‬‭Flow Reference‬‭component to the flow.‬

‭20.‬‭In the Flow Reference properties view, set the flow name and display name to‬
‭getFlights‬‭.‬

‭21.‬‭Return to‬‭implementation.xml‬‭.‬

‭22.‬‭Delete the‬‭GET /flights‬‭Listener in getFlights.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭296‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭Save all the files to redeploy the application.‬

‭Test the application‬

‭24.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/flights?code=PDX‬‭; you should‬‭get a 404 response with‬
‭a no listener message.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭297‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭25.‬‭Add‬‭/api‬‭to the URL and make a request to‬


‭http://localhost:8081/api/flights?code=PDX‬‭; you should‬‭get the United flights‬
‭to PDX as before.‬

‭26.‬‭Change the code to make a request to‬


‭http://localhost:8081/api/flights?code=FOO‬‭; you should‬‭now get a 400 Bad‬
‭Request response instead of your custom message.‬

‭27.‬‭Remove the code to make a request to‬‭http://localhost:8081/api/flights‬‭;‬‭you‬


‭should now get your custom error message.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭298‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭28.‬‭Add the airline and code to make a request to‬


‭http://localhost:8081/api/flights?airline=american&code=PDX‬‭;‬‭you should‬
‭now get a 200 response with the bad request description in the error message.‬

‭Review the API‬

‭29.‬‭Return to Anypoint Studio and stop the project.‬

‭30.‬‭Return to‬‭mua-flights-api.raml‬‭and review the code;‬‭you should see the code‬


‭query parameter is not required but it has allowed values enumerated.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭299‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭31.‬‭Return to‬‭interface.xml‬‭.‬

‭32.‬‭Add a breakpoint to the APIkit Router in‬‭mua-flights-api-main‬‭.‬

‭33.‬‭Debug the project and proceed through any errors in the workspace.‬

‭34.‬‭In Advanced REST Client, make another request to‬


‭http://localhost:8081/api/flights?airline=american&code=PDX‬‭.‬

‭35.‬‭In the Mule Debugger, watch the payload and variables and step through the‬
‭application.‬

‭36.‬‭Step back to the APIkit router.‬

‭37.‬‭Review the exception, the payload, and the variables.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭300‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭38.‬‭Resume through the rest of the application.‬

‭39.‬‭In Advanced REST Client, change the code to make a request to‬
‭http://localhost:8081/api/flights?airline=american&code=FOO‬‭.‬

‭40.‬‭In the Mule Debugger, step through the application; the APIkit router should‬
‭immediately throw an error.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭301‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭41.‬‭Step again; you should see that the error is handled by the‬
‭APIKIT:BAD_REQUEST‬‭handler.‬

‭42.‬‭Resume through the rest of the application.‬

‭43.‬‭In Advanced REST Client, remove the airline and code to make a request to‬
‭http://localhost:8081/api/flights‬‭.‬

‭44.‬‭In the Mule Debugger, step through the application; the validator should‬
‭throw an error and execution should not return to the APIkit router.‬

‭45.‬‭Return to Advanced REST Client; you should get a 400 response with the‬
‭custom message.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭302‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE‬‭: If you had specified the code query parameter to be required in the RAML file‬
‭from which the interface was generated, the APIkit router would catch this‬
‭immediately and respond with a 400 Bad Request response. The event would never‬
‭get to the validator in your implementation.‬

‭Change the American flights error scope to On Error Continue‬

‭46.‬‭Return to Anypoint Studio and switch to the Mule Design perspective.‬

‭47.‬‭Return to‬‭implementation.xml‬‭.‬

‭48.‬‭Locate the error handler in the‬‭getAmericanFlights‬‭flow.‬

‭49.‬‭Right-click it and select‬‭Go To XML‬‭.‬

‭50.‬‭Change the‬‭on-error-propagate‬‭start and end tags in‬‭the‬‭getAmericaFlights‬


‭flow to‬‭on-error-continue‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭303‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭51.‬‭Change the doc:name in the start tag to‬‭On Error Continue‬‭.‬

‭52.‬‭Switch back to the Message Flow view; you should now see an On Error‬
‭Continue.‬

‭Change the global default error scopes to On Error Continue‬

‭53.‬‭Return to‬‭global.xml‬‭.‬

‭54.‬‭Review the types of error handler scopes.‬

‭55.‬‭Right-click the‬‭WSC‬‭error handler and select‬‭Go To‬‭XML‬‭.‬

‭56.‬‭Change the four‬‭on-error-propagate start and end‬‭tags‬‭to‬‭on-error-continue‬‭.‬

‭57.‬‭Change the doc:names in both start tags to‬‭On Error‬‭Continue‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭304‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭58.‬‭Switch back to the Message Flow view; you should now see both are On Error‬
‭Continue scopes.‬

‭Set the HTTP status code for the On Error Continue scopes so you‬
‭do not get 200‬

‭59.‬‭Add a‬‭Set Variable‬‭transformer to the‬‭WSC‬‭error handler.‬

‭60.‬‭In the Set Variable properties view, set the display name and name to‬
‭httpStatus‬‭.‬

‭61.‬‭Set the value to‬‭500‬‭.‬

‭62.‬‭Copy the‬‭Set Variable‬‭transformer and add it to the‬‭ANY‬‭error scope.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭305‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭63.‬‭Save the files to redeploy the project.‬

‭64.‬‭In Advanced REST Client, add the airline and code to make a request to‬
‭http://localhost:8081/api/flights?airline=american&code=PDX‬‭.‬

‭65.‬‭In the Mule Debugger, step through the application; the application now does‬
‭not return to the APIkit router.‬

‭66.‬‭Return to Advanced REST Client; you should now get a 200 response with the‬
‭No flights to PDX message.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭306‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭67.‬‭In Advanced REST Client, change the airline to make a request to‬
‭http://localhost:8081/api/flights?airline=delta&code=PDX‬‭.‬

‭68.‬‭In the Mule Debugger, step through the application.‬

‭69.‬‭Return to Advanced REST Client; you should now get the 500 response with‬
‭the data unavailable message.‬

‭70.‬‭Return to Anypoint Studio and switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭307‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 5-8: Set a reconnection strategy for a‬


‭connector‬

‭In this walkthrough, you will:‬

‭●‬ ‭Set a reconnection strategy for the Web Service Consumer connector.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Set a reconnection strategy for a connector‬

‭1.‬ ‭Return to‬‭global.xml‬‭in Anypoint Studio.‬

‭2.‬ ‭Switch to the‬‭Global Elements‬‭view.‬

‭3.‬ ‭Double-click the‬‭Web Service Consumer Config‬‭.‬

‭4.‬ ‭In the Global Element Properties dialog box, select the‬‭Advanced‬‭tab in the‬
‭second tab bar.‬

‭5.‬ ‭Select the‬‭Reconnection‬‭checkbox.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭308‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭6.‬ ‭Change the reconnection strategy to‬‭standard‬‭.‬

‭7.‬ ‭Review the default frequency and attempts.‬

‭8.‬ ‭Click‬‭OK‬‭.‬

‭9.‬ ‭Save the file.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭309‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭ odule 6: Writing DataWeave‬


M
‭transformations‬

‭At the end of this module, you should be able to:‬

‭●‬ ‭Write DataWeave expressions for basic XML, JSON, and Java transformations.‬

‭●‬ ‭Write DataWeave transformations for complex data structures with repeated‬
‭elements.‬

‭●‬ ‭Define and use global and local variables and functions.‬

‭●‬ ‭Use DataWeave functions.‬

‭●‬ ‭Coerce and format strings, numbers, and dates.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭310‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭●‬ ‭Define and use custom data types.‬

‭●‬ ‭Use flow results in DataWeave expression‬‭s.‬

‭●‬ ‭Store DataWeave scripts in external files.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭311‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 6-1: Create transformations with the Transform‬


‭Message component‬

‭In this walkthrough, you create a new flow that receives flight POST requests that you‬
‭will use as the input for writing transformations in the next several walkthroughs. You‬
‭will:‬

‭●‬ ‭Create a new flow that receives POST requests of JSON flight objects.‬

‭●‬ ‭Customize propagated metadata.‬

‭●‬ ‭Add sample data and use live preview.‬

‭●‬ ‭Create a second transformation that stores the output in a variable.‬

‭●‬ ‭Save a DataWeave script in an external file.‬

‭●‬ ‭Review DataWeave script errors.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭312‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a new flow that receives POST requests and returns the‬
‭payload as Java‬

‭1.‬ ‭In the‬‭apdev-flights-ws‬‭Mule project, return to‬‭config.yaml‬‭.‬

‭2.‬ ‭Change the‬‭delta.wsdl‬‭property from‬‭/deltas?wsdl‬‭to‬‭/delta?wsdl‬‭.‬

‭3.‬ ‭Return to‬‭implementation.xml‬‭.‬

‭4.‬ ‭Right-click in the canvas and select‬‭Collapse All‬‭.‬

‭5.‬ ‭Drag a Transform Message component from the Mule Palette to the bottom of‬
‭the canvas; a new flow should be created.‬

‭6.‬ ‭Change the name of the flow to‬‭postFlight‬‭.‬

‭7.‬ ‭In the Transform Message properties view, set the expression to‬‭payload‬‭.‬

‭NOTE‬‭: If you see a metadata propagation error on the‬‭Transform Message, you can‬
‭proceed normally.‬

‭8.‬ ‭Add a‬‭breakpoint‬‭to the‬‭Transform Message‬‭component.‬

‭9.‬ ‭Add a‬‭Logger‬‭to the flow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭313‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭10.‬‭Return to‬‭interface.xml‬‭.‬

‭11.‬‭Remove the breakpoint from the‬‭APIkit Router‬‭in‬‭mua-flights-api-main‬‭.‬

‭12.‬‭Locate the‬‭post:\flights:application\json:mua-flights-api-config‬‭flow.‬

‭13.‬‭Delete the‬‭Transform Message‬‭component and replace‬‭it with a Flow‬


‭Reference.‬

‭14.‬‭In the Flow Reference properties view, set the flow name and display name to‬
‭postFlight‬‭.‬

‭15.‬‭Save the files to redeploy the project in debug mode.‬

‭Post a flight to the flow‬

‭16.‬‭Open‬‭flight-example.json‬‭in‬‭src/test/resources‬‭.‬

‭17.‬‭Copy the code and close the file.‬

‭18.‬‭In Advanced REST Client, change the method to POST and remove any query‬
‭parameters.‬

‭19.‬‭Add a request header called‬‭Content-Type‬‭and set it‬‭equal to‬


‭application/json‬‭.‬

‭20.‬‭Set the request body to the value you copied from‬‭flight-example.json‬‭.‬

‭21.‬‭Make the request to‬‭http://localhost:8081/api/flights‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭314‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭22.‬‭In the Mule Debugger, expand‬‭Attributes‬‭and locate‬‭the‬‭content-type‬‭header.‬

‭23.‬‭Review the payload; you should see it has a mime-type of application/json.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭315‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭24.‬‭Step to the‬‭Logger‬‭; you should see the payload now has a mime-type of‬
‭application/java and is a LinkedHashMap.‬

‭25.‬‭Step to the end of the application and switch perspectives.‬

‭Customize the transformation input metadata propagated from‬


‭the API specification‬

‭26.‬‭Examine the input section of the Transform Message properties view; note the‬
‭field for the optional ID property.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭316‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭27.‬‭Return to‬‭interface.xml‬‭.‬

‭28.‬‭In the postFlight Flow Reference properties view, select the‬‭Metadata‬‭tab.‬

‭29.‬‭Click the‬‭Add metadata‬‭button.‬

‭30.‬‭Ensure the dropdown menu is set to‬‭Input: Payload‬‭and click the‬‭Edit‬‭button.‬

‭31.‬‭In the‬‭Select‬‭metadata type dialog box, select‬‭flight_json‬‭and click‬‭Select‬‭.‬

‭32.‬‭On the Metadata tab, click the‬‭Set metadata‬‭button.‬

‭33.‬‭In the Custom metadata dialog box, click‬‭Customize‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭317‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭34.‬‭In the Custom Metadata dialog box, locate and expand the expected payload‬
‭on the Input Metadata tab; note the absence of the optional ID property.‬

‭35.‬‭Click‬‭OK‬‭.‬

‭36.‬‭Save and close the file.‬

‭37.‬‭In the Transform Message properties view for the transformation in postFlight;‬
‭you should now see updated metadata for the input.‬

‭38.‬‭Open‬‭application-types.xml‬‭in‬‭src/main/resources‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭318‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭39.‬‭Review the enrichment elements for‬‭flight_json‬‭.‬

‭40.‬‭Close the file.‬

‭Preview sample data and sample output‬

‭41.‬‭In the input section of the Transform Message properties view, right-click the‬
‭payload and select‬‭Edit Sample Data‬‭; you should see‬‭a new tab called‬
‭payload‬‭and it should contain the sample input of‬‭type JSON.‬

‭42.‬‭Click the‬‭Preview‬‭button; you should see a new preview‬‭section and it should‬


‭contain the sample output of type Java.‬

‭NOTE‬‭: If sample data doesn't automatically appear‬‭in the preview section, click the‬
‭Create required sample data‬‭to execute the preview‬‭link.‬

‭43.‬‭Click the‬‭Source Only‬‭button to the left of the‬‭Preview‬‭button.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭319‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Locate the new sample data file‬

‭44.‬‭In the Package Explorer, locate the new‬‭sample_data‬‭folder‬‭in‬


‭src/test/resources‬‭.‬

‭45.‬‭Open‬‭json.json‬‭.‬

‭46.‬‭Review the code and close the file.‬

‭Create a second transformation with the same component‬

‭47.‬‭In the Transform Message properties view, click the‬‭Add new target‬‭button.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭320‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭48.‬‭In the Selection dialog box, change the output to‬‭Variable‬‭.‬

‭49.‬‭Set Variable name to‬‭DWoutput‬‭.‬

‭50.‬‭Click‬‭OK‬‭.‬

‭51.‬‭Click the dropdown menu for the output; you should see that you can switch‬
‭between the two transformations.‬

‭52.‬‭For the new transformation, set the output type to json and set the expression‬
‭to‬‭payload‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭321‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Test the application‬

‭53.‬‭Save the file to redeploy the project in debug mode.‬

‭54.‬‭In Advanced REST Client, post the same request to‬


‭http://localhost:8081/api/flights‬‭.‬

‭55.‬‭In the Mule Debugger, step to the‬‭Logger‬‭.‬

‭56.‬‭Review‬‭Payload‬‭; it should be Java as before.‬

‭57.‬‭Expand‬‭Variables‬‭; you should see the new DWoutput‬‭variable.‬

‭58.‬‭Step through the rest of the application and switch perspectives.‬

‭Review the Transform Message XML code‬

‭59.‬‭Right-click the‬‭Transform Message‬‭component and select‬‭Go to XML‬‭.‬

‭60.‬‭Locate and review the code for both DataWeave transformations.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭322‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭61.‬‭Switch back to the‬‭Message Flow‬‭view.‬

‭Save a DataWeave script to an external file‬

‭62.‬‭In the Transform Message Properties view, make sure the payload output‬
‭expression is selected.‬

‭63.‬‭Click the‬‭Edit current target‬‭button (the pencil)‬‭above the code.‬

‭64.‬‭In the Selection dialog box, change the source code selection from‬‭inline‬‭to‬
‭file‬‭.‬

‭65.‬‭Set the file name to‬‭json_flight_playground‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭323‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭66.‬‭Click‬‭OK‬‭.‬

‭Locate and review the code that uses an external DataWeave‬


‭script‬

‭67.‬‭Switch to‬‭Configuration XML‬‭view.‬

‭68.‬‭Locate the new code for the transformation in‬‭postFlight‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭324‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭69.‬‭In the Package Explorer, expand‬‭src/main/resources‬‭.‬

‭70.‬‭Open‬‭json_flight_playground.dwl‬‭.‬

‭71.‬‭Review and then close the file.‬

‭72.‬‭Return to‬‭Message Flow‬‭view in implementation.xml.‬

‭Change the output type to XML and review errors‬

‭73.‬‭In the Transform Message properties view, select the‬‭Variable – DWoutput‬


‭output.‬

‭74.‬‭Change the output type from‬‭application/json‬‭to‬‭application/xml‬‭.‬

‭75.‬‭Locate the warning icons indicating that there is a problem.‬

‭NOTE‬‭: If you do not see the warnings, click the Preview‬‭button.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭325‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭76.‬‭Mouse over the icon located to the left of the code; you should see a message‬
‭that there was an exception trying to output the second root‬‭<flightCode>‬‭.‬

‭77.‬‭Click the icon above the code; a‬‭List of warnings‬‭and errors‬‭dialog box should‬
‭open.‬

‭78.‬‭Select and review the first issue.‬

‭79.‬‭Click‬‭OK‬‭.‬

‭NOTE‬‭: You will learn how to successfully transform‬‭to XML in the next walkthrough.‬

‭Test the application‬

‭80.‬‭Save the file to redeploy the project in debug mode.‬

‭81.‬‭In Advanced REST Client, post the same request to‬


‭http://localhost:8081/api/flights‬‭.‬

‭82.‬‭In the Mule Debugger, step once; you should get an error.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭326‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭83.‬‭Review the error information; you should see there is a DataWeave error when‬
‭trying to output the second root.‬

‭84.‬‭Step to the end of the application and switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭327‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 6-2: Transform basic JSON, Java, and XML data‬


‭structures‬

‭In this walkthrough, you continue to work with the JSON flight data posted to the‬
‭flow. You will:‬

‭●‬ ‭Write scripts to transform the JSON payload to various JSON and Java‬
‭structures.‬

‭●‬ ‭Write scripts to transform the JSON payload to various XML structures.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Write expressions to transform JSON to various Java structures‬

‭1.‬ ‭Return to the Transform Message properties view for the transformation in‬
‭postFlight.‬

‭2.‬ ‭In the output dropdown menu, make sure the‬‭payload‬‭output expression‬‭is‬
‭selected.‬

‭3.‬ ‭Change the output type from‬‭java‬‭to‬‭json‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭328‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭4.‬ ‭Type a period after payload and double-click‬‭price‬‭(or navigate with row keys‬
‭and press‬‭Enter‬‭) in the auto-completion menu.‬

‭5.‬ ‭Look at the preview.‬

‭NOTE‬‭: Click the Preview button (‬‭Cmd+Shift+P‬‭or‬‭Ctrl+Shift+P‬‭)‬‭if the preview section‬


‭is not displayed.‬

‭6.‬ ‭Change the output type from‬‭json‬‭to‬‭java‬‭.‬

‭7.‬ ‭Change the DataWeave expression to‬‭data: payload.price‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭329‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭8.‬ ‭Change the output type from‬‭java‬‭to‬‭json‬‭.‬

‭9.‬ ‭Change the DataWeave expression to data: payload.‬

‭10.‬‭Change the output type from‬‭json‬‭to‬‭java‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭330‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Change the DataWeave expression to‬‭data: {}‬‭.‬

‭12.‬‭Add a field called hub and set it to‬‭MUA‬‭.‬

‭13.‬‭Change the output type from‬‭java‬‭to‬‭json‬‭.‬

‭14.‬‭Add a field called code and use auto-completion to set it to the‬‭toAirportCode‬


‭property of the payload.‬

‭15.‬‭Add a field called‬‭airline‬‭and set it to the airline‬‭property of the payload.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭331‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Write an expression to output data as XML‬

‭16.‬‭In the output dropdown menu, select‬‭Variable – DWoutput‬‭.‬

‭17.‬‭Change the DataWeave expression to‬‭data: payload‬‭.‬

‭18.‬‭Look at the preview; you should now see XML.‬

‭NOTE‬‭: Click the Preview button (‬‭Cmd+Shift+P‬‭or‬‭Ctrl+Shift+P‬‭)‬‭if the preview section‬


‭is not displayed.‬

‭19.‬‭In the output dropdown menu, select‬‭Payload‬‭.‬

‭20.‬‭Copy the DataWeave expression.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭332‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Switch back to‬‭Variable – DWoutput‬‭and replace the DataWeave expression‬


‭with the one you just copied.‬

‭22.‬‭Modify the expression so the code and airline properties are child elements of‬
‭a new element called‬‭flight‬‭.‬

‭23.‬‭Modify the expression so the airline is an attribute of the flight element.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭333‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭24.‬‭In the Logger properties view, set the message to the value of the‬‭DWoutput‬
‭variable.‬

‭25.‬‭Save the file to redeploy the project in debug mode.‬

‭26.‬‭In Advanced REST Client, post the same request to‬


‭http://localhost:8081/api/flights‬‭.‬

‭27.‬‭In the Mule Debugger, step to the Logger; you should see the transformed‬
‭JSON payload and that the DWoutput variable has a mime-type of‬
‭application/xml.‬

‭28.‬‭Step through the application and switch perspectives.‬

‭29.‬‭Look at the Logger output in the console; you should see the XML.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭334‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭335‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 6-3: Transform complex data structures with‬


‭arrays‬

‭In this walkthrough, you create a new flow that allows multiple flights to be posted to‬
‭it, so you have more complex data with which to work. You will:‬

‭●‬ ‭Create a new flow that receives POST requests of a JSON array of flight objects.‬

‭●‬ ‭Transform a JSON array of objects to DataWeave, JSON, and Java.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Create a new flow that receives POST requests of a JSON array of‬
‭flight objects‬

‭1.‬ ‭Return to‬‭implementation.xml‬‭.‬

‭2.‬ ‭Drag out an‬‭HTTP Listener‬‭from the Mule Palette to‬‭the bottom of the canvas.‬

‭3.‬ ‭Change the flow name to‬‭postMultipleFlights‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭336‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭4.‬ ‭In the HTTP Listener properties view, set the display name to‬‭POST‬
‭/multipleflights‬‭.‬

‭5.‬ ‭Ensure the connector configuration is set to the existing HTTP_Listener_config.‬

‭6.‬ ‭Set the path to‬‭/multipleflights‬‭and set the allowed‬‭methods to POST.‬

‭NOTE‬‭: You are bypassing the APIkit router because‬‭a corresponding‬


‭resource/method pair is not defined in the API.‬

‭7.‬ ‭Add a‬‭Transform Message‬‭component to the flow.‬

‭8.‬ ‭In the Transform Message properties view, set the expression to‬‭payload‬‭.‬

‭9.‬ ‭Add a‬‭Logger‬‭to the flow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭337‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add input metadata for the transformation‬

‭10.‬‭In the Transform Message properties view, click‬‭Define‬‭metadata‬‭in the input‬


‭section.‬

‭11.‬‭In the Select metadata type dialog box, select‬‭flights_json‬‭and click‬‭Select‬‭.‬

‭12.‬‭In the Transform Message Properties view, you should now see metadata for‬
‭the input.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭338‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Preview sample data and sample output‬

‭13.‬‭In the input section, right-click the payload and select‬‭Edit Sample Data‬‭to get‬
‭sample input data.‬

‭14.‬‭Click the‬‭Preview‬‭button to get sample output data.‬

‭NOTE‬‭: If sample data doesn't automatically appear‬‭in the preview section, click the‬
‭Create required sample data to execute‬‭preview link.‬

‭15.‬‭Look at the preview section; the sample output should be an array of objects.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭339‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭16.‬‭Change the output type to‬‭application/dw‬‭.‬

‭Return values for the first object in the collection‬

‭17.‬‭Change the DataWeave expression to‬‭payload[0]‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭340‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭18.‬‭Change the DataWeave expression to‬‭payload[0].price‬‭.‬

‭19.‬‭Change the DataWeave expression to‬‭payload[0].*price‬‭.‬

‭Return collections of values‬

‭20.‬‭Change the DataWeave expression to return a collection of all the prices.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭341‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Change the DataWeave expression to payload.price; you should get the same‬
‭result.‬

‭22.‬‭Change the DataWeave expression to return a collection of prices and‬


‭available seats.‬

[payload.price, payload.emptySeats]‬

‭Use the map function to return object collections with different‬


‭data structures‬

‭23.‬‭Change the DataWeave expression to‬‭payload map $‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭342‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭24.‬‭Change the DataWeave expression to set a property called‬‭flight‬‭for each‬


‭object that is equal to its index value in the collection.‬

‭25.‬‭Change the DataWeave expression to create a property called‬‭destination‬‭for‬


‭each object that is equal to the value of the toAirportCode field in the payload‬
‭collection.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭343‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭26.‬‭Change the DataWeave expression to dynamically add each of the properties‬


‭present on the payload objects.‬

‭27.‬‭Remove the first flight property assignment.‬

‭28.‬‭Change the DataWeave expression so the name of each object is‬‭flight+index‬


‭and you get‬‭flight0‬‭and‬‭flight1‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭344‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Use explicit named parameters with the map function‬

‭29.‬‭Change the map function so that it uses two parameters called‬‭object‬‭and‬


‭index‬‭and set the field name to just the index value.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭345‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭30.‬‭Change the DataWeave expression so the name of each object is‬‭flight+index‬


‭and you get flight0 and flight1.‬

‭NOTE‬‭: If you want to test the application, change‬‭the output type to application/json‬
‭and then in Advanced REST Client, make a request to‬
‭http://localhost:8081/multipleflights and replace the request body with JSON from‬
‭the flights-example.json file.‬

‭Change the expression to output different data types‬

‭31.‬‭Change the DataWeave expression output type from‬‭application/dw‬‭to‬


‭application/json‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭346‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭32.‬‭Change the output type to‬‭application/java‬‭.‬

‭33.‬‭Change the output type to‬‭application/xml‬‭; you should‬‭get issues displayed.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭347‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭34.‬‭Click the warning icon above the code, review the issues, then click OK.‬

‭35.‬‭Change the DataWeave expression to create a root node called‬‭flights‬‭; you‬


‭should still get issues.‬

‭36.‬‭Click the warning icon above the code, review the issues, then click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭348‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭349‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 6-4: Transform to and from XML with repeated‬


‭elements‬

‭In this walkthrough, you continue to work with the JSON data for multiple flights‬
‭posted to the flow. You will:‬

‭●‬ ‭Transform a JSON array of objects to XML.‬

‭●‬ ‭Replace sample data associated with a transformation.‬

‭●‬ ‭Transform XML with repeated elements to different data types.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Transform the JSON array of objects to XML‬

‭1.‬ ‭Return to the Transform Message properties view for the transformation in‬
‭postMultipleFlights‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭350‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭2.‬ ‭Change the expression to map each item in the input array to an XML‬
‭element.‬

flights: {(payload map (object,index) -> {‬



'flight$(index)': object‬

}‬

)}‬

‭3.‬ ‭Look at the preview; the JSON should be transformed to XML successfully.‬

‭4.‬ ‭Modify the expression so the flights object has a single property called‬‭flight‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭351‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Change the input metadata to XML‬

‭5.‬ ‭In the input section, right-click the‬‭payload‬‭and‬‭select‬‭Clear Metadata‬‭.‬

‭6.‬ ‭Click the‬‭Define metadata‬‭link.‬

‭7.‬ ‭In the Select metadata type dialog box, select‬‭flights_xml‬‭and click‬‭Select‬‭.‬

‭8.‬ ‭In the Transform Message Properties view, you should now see new metadata‬
‭for the input.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭352‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Preview sample data and sample output‬

‭9.‬ ‭In the input section, click the‬‭x‬‭on the payload tab‬‭to close it.‬

‭10.‬‭In the Close Sample Data dialog box, click‬‭Close tab‬‭and Keep file‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭353‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Right-click the payload and select‬‭Edit Sample Data‬‭to get sample input data.‬

‭12.‬‭Look at the XML sample payload.‬

‭13.‬‭Look at the‬‭sample_data‬‭folder in‬‭src/test/resources‬‭.‬

‭14.‬‭Review the transformation expression; you should see an issue.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭354‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE‬‭: You may see more than one issue. If so, only‬‭one should be an error, the rest‬
‭warnings.‬

‭15.‬‭Look at the error then click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭355‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Transform XML with repeated elements to a different XML‬


‭structure‬

‭16.‬‭In the input section, click on the‬‭Context‬‭tab to‬‭look at the payload metadata.‬

‭17.‬‭Change the DataWeave expression so that the map is iterating over‬


‭payload..return‬‭.‬

‭18.‬‭Change the DataWeave expression so that the map is iterating over the‬
‭repeated return elements of the input.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭356‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭19.‬‭Change the DataWeave expression to return flight elements with‬‭dest‬‭and‬


‭price‬‭elements that map to the corresponding destination‬‭and price input‬
‭values.‬

‭NOTE‬‭: If you want to test the application with Advanced‬‭REST Client, be sure to‬
‭change the content-type header to application/xml and replace the request body‬
‭with XML from the flights-example.xml file.‬

‭Change the expression to output different data types‬

‭20.‬‭Change the output type from‬‭application/xml‬‭to‬‭application/dw‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭357‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Change the output type to‬‭application/json‬‭.‬

‭22.‬‭Change the output type to‬‭application/java‬‭.‬

‭23.‬‭In the DataWeave expression, remove the‬‭{( )}‬‭around‬‭the map expression.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭358‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭24.‬‭In the DataWeave expression, remove the flight property; you should get an‬
‭object consisting of an array of five objects.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭359‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 6-5: Define and use variables and functions‬

‭In this walkthrough, you continue to work with the DataWeave transformation in‬
‭postMultipleFlights. You will:‬

‭●‬ ‭Define and use a global constant.‬

‭●‬ ‭Define and use a global variable that is equal to a lambda expression.‬

‭●‬ ‭Define and use a lambda expression assigned to a variable as a function.‬

‭●‬ ‭Define and use a local variable.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Define and use a global constant‬

‭1.‬ ‭Return to the Transform Message properties view for the transformation in‬
‭postMultipleFlights‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭360‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭2.‬ ‭Change the output type to‬‭application/dw‬‭.‬

‭3.‬ ‭In the header, define a global variable called‬‭numSeats‬‭that is equal to‬‭400‬‭.‬

var numSeats = 400‬


‭4.‬ ‭In the body, add a‬‭totalSeats‬‭property that is equal‬‭to the‬‭numSeats‬‭constant.‬

totalSeats: numSeats‬

‭5.‬ ‭Look at the preview.‬

‭6.‬ ‭Comment out the variable declaration in the header.‬

//var numSeats = 400‬


‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭361‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Define and use a global variable that is equal to a lambda‬


‭expression that maps to a constant‬

‭7.‬ ‭In the header, define a global variable called‬‭numSeats‬‭that is equal to a‬


‭lambda expression with an input parameter‬‭x equal‬‭to 400‬‭.‬

‭8.‬ ‭Inside the expression, set‬‭numSeats‬‭to‬‭x‬‭.‬

var numSeats = (x=400) -> x‬


‭9.‬ ‭Add parentheses after numSeats in the totalSeats property assignment.‬

totalSeats: numSeats()‬

‭10.‬‭Look at the preview.‬

‭Add a plane property to the output‬

‭11.‬‭Add a‬‭plane property‬‭to the DataWeave expression equal‬‭to the value of the‬
‭input planeType values.‬

‭12.‬‭Look at the values of plane type in the preview.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭362‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Define and use a global variable that is that is equal to a lambda‬


‭expression with input parameters‬

‭13.‬‭Comment out the‬‭numSeats‬‭variable declaration in the‬‭header.‬

‭14.‬‭In the header, define a global variable called‬‭numSeats‬‭that is equal to a‬


‭lambda expression with an input parameter called‬‭planeType‬‭of type‬‭String‬‭.‬

var numSeats = (planeType: String) ->‬


‭15.‬‭Inside the expression, add an if/else block that checks to see if planeType‬
‭contains the string 737 and sets numSeats to‬‭150 or‬‭300‬‭otherwise.‬

‭16.‬‭Change the‬‭totalSeats‬‭property assignment to pass‬‭the object’s planeType‬


‭property to‬‭numSeats‬‭.‬

totalSeats: numSeats(object.planeType)‬

‭17.‬‭Force the argument to a String.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭363‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

totalSeats: numSeats(object.planeType as String)‬


‭18.‬‭Look at the preview; you should see values of‬‭150‬‭and‬‭300‬‭.‬

‭19.‬‭Surround the variable declaration in the header with‬‭/*‬‭and‬‭*/‬‭to comment it‬


‭out.‬

‭Define and use a lambda expression assigned to a variable as a‬


‭function‬

‭20.‬‭In the header, use the‬‭fun‬‭keyword to define a function‬‭called‬‭getNumSeats‬


‭with a parameter called‬‭planeType‬‭of type‬‭String‬‭.‬

fun getNumSeats(planeType: String)‬


‭21.‬‭Copy the‬‭if/else‬‭expression in the numSeats declaration.‬

‭22.‬‭Set the‬‭getNumSeats‬‭function equal to the‬‭if/else‬‭expression.‬

fun getNumSeats(planeType: String) =‬


‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭364‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

if (planeType contains('737'))‬

150‬

else‬

300‬

‭23.‬‭In the body, change the totalSeats property to be equal to the result of the‬
‭getNumSeats function.‬

totalSeats: getNumSeats(object.planeType‬‭
‭ as‬‭
String)‬

‭24.‬‭Look at the preview.‬

‭Create and use a local variable‬

‭25.‬‭Add a‬‭do‬‭statement around the definition of the‬‭getNumSeats‬‭function.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭365‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭26.‬‭At the beginning of the‬‭do‬‭scope, define a local variable‬‭called‬‭maxSeats‬‭that‬


‭is equal to the if/else block.‬

‭27.‬‭After the if/else block, add a body separator then set the body of the do scope‬
‭to the‬‭maxSeats‬‭local variable.‬

‭28.‬‭Modify the indentation to your liking.‬

‭29.‬‭Look at the preview.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭366‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 6-6: Coerce and format strings, numbers, and‬


‭dates‬

‭In this walkthrough, you continue to work with the XML flights data posted to the‬
‭postMultipleFlights flow. You will:‬

‭●‬ ‭Coerce data types.‬

‭●‬ ‭Format strings, numbers, and dates.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Format a string‬

‭1.‬ ‭Return to the Transform Message properties view for the transformation in‬
‭postMultipleFlights.‬

‭2.‬ ‭Use the upper function to return the plane value in uppercase.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭367‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭3.‬ ‭Coerce the argument to a String.‬

plane: upper(object.planeType as String)‬


‭4.‬ ‭Look at the preview.‬

‭Coerce a string to a number‬

‭5.‬ ‭In the preview, look at the data type of the prices; you should see that they are‬
‭strings.‬

‭6.‬ ‭Change the DataWeave expression to use the as keyword to return the prices‬
‭as numbers.‬

price: object.price as Number,‬


‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭368‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭7.‬ ‭Look at the preview.‬

‭8.‬ ‭Change the output type from‬‭application/dw‬‭to‬‭application/java‬‭.‬

‭9.‬ ‭Look at the preview; you should see the prices are now either integer (Integer‬
‭objects) or non-integer (Double objects).‬

‭Coerce a string to a specific type of number object‬

‭10.‬‭Change the DataWeave expression to use the class metadata key to coerce the‬
‭prices to java.lang.Double objects.‬

price: object.price as Number {class:"java.lang.Double"},‬


‭11.‬‭Look at the preview; you should see the prices are now all Double objects‬
‭(non-integers).‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭369‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭12.‬‭Change the output type from application/java back to application/dw.‬

‭Format a number‬

‭13.‬‭Remove the coercion of the price to a java.lang.Double.‬

‭14.‬‭Coerce the price to a String and use the format schema property to format the‬
‭prices to zero decimal places.‬

price: object.price as Number as String {format: "###"},‬


‭15.‬‭Look at the preview; the prices should now be formatted.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭370‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭16.‬‭Change the DataWeave expression to format the prices to two decimal places.‬

price: object.price as Number as String {format: "###.##"},‬


‭17.‬‭Look at the preview.‬

‭18.‬‭Change the DataWeave expression to format the prices to two minimal‬


‭decimal places.‬

price: object.price as Number as String {format: "###.00"},‬


‭19.‬‭Look at the preview; all the prices should now be formatted to two decimal‬
‭places.‬

‭NOTE‬‭: If you are not a Java programmer, you may want‬‭to look at the Java‬
‭documentation for the DecimalFormatter class to review documentation on‬
‭DecimalFormat patterns.‬
‭https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭371‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Coerce a string to a date‬

‭20.‬‭Add a date field to the return object.‬

date: object.departureDate‬

‭21.‬‭Look at the preview; you should see the date property is a String.‬

‭22.‬‭Change the DataWeave expression to use the as operator to convert‬


‭departureDate to a date object; you should get issues displayed.‬

date: object.departureDate as Date‬


‭23.‬‭Look at the errors then click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭372‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭24.‬‭Look at the format of the dates in the preview.‬

‭25.‬‭Change the DataWeave expression to use the format schema property to‬
‭specify the pattern of the input date strings.‬

date: object.departureDate as Date {format: "yyyy/MM/dd"}‬


‭NOTE‬‭: If you are not a Java programmer, you may want‬‭to look at the Java‬
‭documentation for the DateTimeFormatter class to review documentation on pattern‬
‭letters.‬
‭https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.ht‬
‭ml‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭373‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭26.‬‭Look at the preview; you should see date is now a Date object.‬

‭Format a date‬

‭27.‬‭Use the as operator to convert the dates to strings, which can then be‬
‭formatted.‬

‭ate: object.departureDate as Date {format: "yyyy/MM/dd"} as‬


d
String‬

‭28.‬‭Look at the preview section; the date is again a String – but with a different‬
‭format.‬

‭29.‬‭Use the format schema property with any pattern letters and characters to‬
‭format the date strings.‬

date: object.departureDate as Date {format: "yyyy/MM/dd"} as‬



String {format: "MMM dd, yyyy"}‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭374‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭30.‬‭Look at the preview; the dates should now be formatted according to the‬
‭pattern.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭375‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 6-7: Define and use custom data types‬

‭In this walkthrough, you continue to work with the flight JSON posted to the flow. You‬
‭will:‬

‭●‬ ‭Define and use custom data types.‬

‭●‬ ‭Transform objects to POJOs.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Define a custom data type‬

‭1.‬ ‭Return to the Transform Message properties view for the transformation in‬
‭postMultipleFlights.‬

‭2.‬ ‭Select and cut the string formatting expression for the prices.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭376‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭3.‬ ‭In the header section of the expression, define a custom data type called‬
‭Currency‬‭.‬

‭4.‬ ‭Set it equal to the value you cut.‬

type Currency = String {format: "###.00"}‬


‭Use a custom data type‬

‭5.‬ ‭In the DataWeave expression, set the price to be of type‬‭currency‬‭.‬

price: object.price as Number as Currency,‬


‭6.‬ ‭Look at the preview; the prices should still be formatted as strings to two‬
‭decimal places.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭377‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Transform objects to POJOs‬

‭7.‬ ‭Open the‬‭Flight.java‬‭class in the project's src/main/java folder, look at the‬


‭names of the properties then close the file.‬

‭8.‬ ‭Return to the Transform Message properties view for the transformation in‬
‭postMultipleFlights.‬

‭9.‬ ‭In the header section of the expression, define a custom data type called‬
‭Flight‬‭that is of type‬‭com.mulesoft.training.Flight‬‭.‬

type Flight = Object {class: "com.mulesoft.training.Flight"}‬


‭10.‬‭In the DataWeave expression, set the map objects to be of type‬‭Flight‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭378‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭Look at the preview.‬

‭NOTE‬‭: Click the Preview button (‬‭Cmd+Shift+P‬‭or‬‭Ctrl+Shift+P‬‭)‬‭if the preview section‬


‭is not displayed.‬

‭12.‬‭Change the output type from application/dw to application/java.‬

‭13.‬‭Look at the issues you get then click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭379‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭14.‬‭Change the name of the dest key to destination.‬

destination: object.destination,‬

‭15.‬‭Change the other keys to match the names of the‬‭Flight‬‭class‬‭properties:‬

‭●‬ ‭plane to planeType‬

‭●‬ ‭date to departureDate‬

‭16.‬‭Comment out the‬‭totalSeats‬‭property.‬

‭17.‬‭Look at the preview.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭380‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE‬‭: If you want to test the application with Advanced‬‭REST Client, be sure to‬
‭change the content-type header to application/xml and replace the request body‬
‭with XML from the flights-example.xml file.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭381‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 6-8: Use DataWeave functions‬


‭In this walkthrough, you continue to work with the flights JSON posted to the flow.‬
‭You will:‬

‭●‬ ‭Use functions in the Core module that are imported automatically.‬

‭●‬ ‭Replace data values using pattern matching.‬

‭●‬ ‭Order data, remove duplicate data, and filter data.‬

‭●‬ ‭Use a function in another module that you must explicitly import into a script‬
‭to use.‬

‭●‬ ‭Dasherize data.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Use the replace function‬

‭1.‬ ‭Return to the Transform Message properties view for the transformation in‬
‭postMultipleFlights.‬

‭2.‬ ‭Change the output type from‬‭application/java‬‭to‬‭application/dw‬‭.‬

‭3.‬ ‭Look at the preview and see that‬‭Boeing‬‭is misspelled.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭382‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭4.‬ ‭For planeType, use the replace function to replace the string‬‭Boing‬‭with‬
‭Boeing‬‭.‬

planeType: upper(replace(object.planeType,/(Boing)/) with‬



"Boeing"),‬

‭5.‬ ‭Look at the preview;‬‭Boeing‬‭should now be spelled‬‭correctly.‬

‭Use the dasherize function in the Strings module‬

‭6.‬ ‭For planeType, replace the upper function with the dasherize function.‬

planeType: dasherize(replace(object.planeType,/(Boing)/)‬

with "Boeing"),‬

‭7.‬ ‭Look at the error you get then click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭383‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭8.‬ ‭In the script header, add an import statement to import dasherize from the‬
‭Strings module.‬

import‬‭
‭ dasherize‬‭
from‬‭
dw::core::Strings‬

‭9.‬ ‭Look at the preview.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭384‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Use the orderBy function‬

‭10.‬‭In the preview section, look at the flight prices; the flights are not ordered by‬
‭price.‬

‭11.‬‭Add parentheses around the value of the flights root node then use the‬
‭orderBy function to order the flights by price.‬

orderBy $.price‬

‭12.‬‭Look at the preview; the flights should now be ordered by price.‬

‭13.‬‭Look at the three $283 flights; there is a duplicate and they are not ordered by‬
‭date.‬

‭14.‬‭Change the DataWeave expression to sort flights by date and then by price.‬

orderBy $.departureDate orderBy $.price‬


‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭385‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭15.‬‭Look at the preview; the flights should now be ordered by price and flights of‬
‭the same price should be sorted by date.‬

‭Remove duplicate data‬

‭16.‬‭Use the distinctBy function to first remove any duplicate objects.‬

distinctBy $ orderBy $.departureDate‬



orderBy $.price‬

‭17.‬‭Look at the preview; you should now see only two $283 flights to PDX instead‬
‭of three.‬

‭18.‬‭Add an availableSeats field that is equal to the emptySeats field and coerce it‬
‭to a number.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭386‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

availableSeats: object.emptySeats as Number‬


‭19.‬‭Look at the preview; you should get three $283 flights to PDX again.‬

‭Use the filter function‬

‭20.‬‭In the preview, look at the values of the‬‭availableSeats‬‭properties; you should‬


‭see one is equal to zero.‬

‭21.‬‭Use the filter function to remove any objects that have availableSeats equal to‬
‭0.‬

‭istinctBy $ filter ($.availableSeats !=0)‬


d
orderBy $.departureDate orderBy $.price‬

‭22.‬‭Look at the preview; you should no longer get the flight that had no available‬
‭seats.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭387‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭388‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Module 7: Triggering flows‬

‭At the end of this module, you should be able to:‬

‭●‬ ‭Read and write files.‬

‭●‬ ‭Trigger flows when files are added or updated.‬

‭●‬ ‭Trigger flows when new records are added to a database table.‬

‭●‬ ‭Schedule flows to run at a certain time or frequency.‬

‭●‬ ‭Persist and share data in flows using the Object Store.‬

‭●‬ ‭Publish and consume JMS messages.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭389‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 7-1: Trigger a flow when a new file is added to‬


‭a directory‬

‭In this walkthrough, you load data from a local CSV file when a new file is added to a‬
‭directory. You will:‬

‭●‬ ‭Add and configure a File listener to watch an input directory.‬

‭●‬ ‭Restrict the type of file read.‬

‭●‬ ‭Rename and move the processed files.‬

‭Starting file‬

‭If you did not complete walkthrough 2-4, you can get a starting file ‬‭here‬‭. This file is‬
‭also located in the solutions folder of the student files ZIP located in the Course‬
‭Resources.‬

‭Locate files and folders‬

‭1.‬ ‭In your computer’s file browser, return to the student files for the course.‬

‭2.‬ ‭Open the resources folder and locate the accounts.csv file and the input and‬
‭output folders.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭390‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭3.‬ ‭Leave this folder open.‬

‭Add the File module to the project‬

‭4.‬ ‭Return to Anypoint Studio and open the‬‭apdev-examples‬‭project.‬

‭5.‬ ‭Open‬‭accounts.xml‬‭.‬

‭6.‬ ‭In the Mule Palette, select‬‭Add Modules‬‭.‬

‭7.‬ ‭Select the File connector in the right side of the Mule Palette and drag and‬
‭drop it into the left side.‬

‭8.‬ ‭If you get a Select module version dialog box, select the latest version and‬
‭click‬‭Add‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭391‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a flow that monitors a location for new files‬

‭9.‬ ‭Locate the‬‭On New or Updated File‬‭operation for the‬‭File connector in the‬
‭right side of the Mule Palette and drag and drop it at the top of the canvas to‬
‭create a new flow.‬

‭10.‬‭Rename the flow to‬‭getCSVaccounts‬‭.‬

‭Configure the File connector‬

‭11.‬‭Open‬‭global.xml‬‭and switch to the Global Elements‬‭view.‬

‭12.‬‭Click‬‭Create‬‭.‬

‭13.‬‭In the Choose Global Type dialog box, select‬‭Connector‬‭Configuration > File‬
‭Config‬‭and click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭392‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭14.‬‭In the Global Element Properties dialog box, select the‬‭Connection‬‭checkbox‬


‭then click the browse button next to Working Directory.‬

‭15.‬‭Browse to the student files folder for the course.‬

‭16.‬‭Select the resources folder and click‬‭Open‬‭.‬

‭17.‬‭Select and cut the value of the working directory that got populated and‬
‭replace it with a property‬‭${file.accountsDir}‬‭.‬

‭18.‬‭In the Global Element Properties dialog box, click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭393‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭19.‬‭Open‬‭config.yaml‬‭in‬‭src/main/resources‬‭.‬

‭20.‬‭Create a new property‬‭file.accountsDir‬‭and set it‬‭equal to the value you cut.‬

‭NOTE‬‭: Users on all OSs, including Windows, should‬‭use forward slash characters as‬
‭shown.‬

‭Configure the On New or Updated File operation‬

‭21.‬‭Return to‬‭accounts.xml‬‭.‬

‭22.‬‭In the On New or Updated File properties view, change the display name to‬
‭accounts.csv‬‭.‬

‭23.‬‭Set the connector configuration to the existing File_Config.‬

‭24.‬‭In the General section, set the directory to‬‭input‬‭.‬

‭25.‬‭Set the matcher to‬‭Edit inline‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭394‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭26.‬‭Set filename pattern to‬‭*.csv‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭395‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭27.‬‭In the Post processing action section, set the move to directory to‬‭output‬‭.‬

‭28.‬‭In the General section, review the default scheduling information; the‬
‭endpoint checks for new files every 1000 milliseconds.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭396‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Review event metadata in the DataSense Explorer‬

‭29.‬‭Select the‬‭Output‬‭tab in the DataSense Explorer; you should see no metadata‬


‭about the structure of the CSV file.‬

‭Display the file contents‬

‭30.‬‭Add a Logger to the flow.‬

‭31.‬‭In the Logger properties view, set the display name to payload and the‬
‭message to display the payload.‬

#[payload]‬

‭Debug the application‬

‭32.‬‭Add a breakpoint to the Logger.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭397‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭33.‬‭Save the files and debug the project.‬

‭34.‬‭In your computer’s file browser, return to the resources folder in student files‬
‭for the course.‬

‭35.‬‭Move the‬‭accounts.csv‬‭file to the input folder.‬

‭36.‬‭Return to the Mule Debugger and look at the payload.‬

‭37.‬‭Expand‬‭Attributes‬‭and locate the‬‭fileName‬‭and‬‭path‬‭attributes.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭398‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭38.‬‭Step to the end of the application.‬

‭39.‬‭In your computer’s file browser, return to the student files for the course; you‬
‭should see accounts.csv has been moved to the output folder.‬

‭40.‬‭Return to Anypoint Studio and look at the console; you should see the file‬
‭contents displayed.‬

‭Rename the file‬

‭41.‬‭Return to the‬‭accounts.csv‬‭properties view and in‬‭the Post processing action‬


‭section, set the Rename to property to an expression that appends‬‭.backup‬‭to‬
‭the original filename.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭399‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

#[attributes.fileName ++ ".backup"]‬

‭Test the application‬

‭42.‬‭Save the file to redeploy the project.‬

‭43.‬‭Remove the breakpoint from the Logger.‬

‭44.‬‭In your computer’s file explorer, move the‬‭accounts.csv‬‭file from the output‬
‭folder back to the input folder; you should see it appear in the output folder‬
‭with its new name.‬

‭45.‬‭Move the‬‭accounts.csv.backup‬‭file from the output‬‭folder back to the input‬


‭folder; it should not be processed and should stay in the input folder.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭400‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭46.‬‭Return to Anypoint Studio and switch perspectives.‬

‭47.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭401‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 7-2: Trigger a flow when a new record is added‬


‭to a database and use automatic watermarking‬

‭In this walkthrough, you work with the accounts table in the training database. You‬
‭will:‬

‭●‬ ‭Add and configure a Database listener to check a table on a set frequency for‬
‭new records.‬

‭●‬ ‭Use the listener’s automatic watermarking to track the ID of the latest record‬
‭retrieved and trigger the flow whenever a new record is added.‬

‭●‬ ‭Output new records to a CSV file.‬

‭●‬ ‭Use a form to add a new account to the table and see the CSV file updated.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭402‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭View accounts data‬

‭1.‬ ‭Return to the course‬‭snippets.txt‬‭file and copy the text for the MUA Accounts‬
‭URL.‬

‭2.‬ ‭In a web browser, navigate to the‬‭MUA accounts‬‭by‬‭pasting the URL.‬

‭3.‬ ‭Review the data and the names of the columns which match those of a‬
‭database table.‬

‭Look at the File listener settings for watermarking‬

‭4.‬ ‭Return to‬‭accounts.xml‬‭in Anypoint Studio.‬

‭5.‬ ‭Return to the‬‭accounts.csv‬‭properties view for the‬‭listener in‬‭getCSVaccounts‬‭.‬

‭6.‬ ‭Locate the watermark mode setting in the General section and look at its‬
‭possible values.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭403‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add the Database module to the project‬

‭7.‬ ‭In the Mule Palette, select‬‭Add Modules‬‭.‬

‭8.‬ ‭Select the Database connector in the right side of the Mule Palette and drag‬
‭and drop it into the left side.‬

‭9.‬ ‭If you get a Select module version dialog box, select the latest version and‬
‭click‬‭Add‬‭.‬

‭Create a flow to monitor a database‬

‭10.‬‭Locate the On Table Row operation for the Database connector in the right‬
‭side of the Mule Palette and drag and drop it at the top of the canvas to create‬
‭a new flow.‬

‭11.‬‭Rename the flow to‬‭syncDBaccountsToCSV‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭404‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Configure a Database connector‬

‭12.‬‭Return to the course snippets.txt file.‬

‭13.‬‭Locate and copy the MySQL (or Derby) database properties.‬

‭14.‬‭Return to‬‭config.yaml‬‭and paste the properties.‬

‭NOTE‬‭: The database information you see may be different‬‭than what is shown here;‬
‭the values in the snippets file differ for instructor-led and self-study training classes.‬

‭15.‬‭Save the file.‬

‭16.‬‭Return to‬‭global.xml‬‭and create a new Database Config‬‭that uses these‬


‭properties.‬

‭NOTE‬‭: If necessary, refer to the detailed steps in‬‭Walkthrough 4-2 of the Getting‬
‭Started with Anypoint Platform course.‬

‭17.‬‭Add the MySQL (or Derby) JDBC driver.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭405‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭18.‬‭Test the connection and make sure it is successful.‬

‭Configure the Database listener‬

‭19.‬‭Return to‬‭accounts.xml‬‭.‬

‭20.‬‭In the On Table Row properties view, set the following values:‬

‭●‬ ‭Display Name‬‭: accounts‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭406‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭●‬ ‭Connector configuration‬‭: Database_Config‬

‭●‬ ‭Table‬‭: accounts‬

‭●‬ ‭Watermark column‬‭: accountID‬

‭●‬ ‭Id column‬‭: accountID‬

‭●‬ ‭Frequency‬‭: 10‬

‭●‬ ‭Time unit‬‭: SECONDS‬

‭Write new records to a CSV file‬

‭21.‬‭Add a File Write operation to the flow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭407‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭22.‬‭In the Write properties view, set the following values:‬

‭●‬ ‭Display Name‬‭: DBaccounts.csv‬

‭●‬ ‭Connector configuration‬‭: File_Config‬

‭●‬ ‭Path‬‭: output/DBaccounts.csv‬

‭●‬ ‭Write mode‬‭: APPEND‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭408‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭Expand‬‭Payload‬‭in the Input tab in the DataSense Explorer; you should see‬
‭the operation will get an account with account information from the Database‬
‭operation.‬

‭Transform the records to CSV‬

‭24.‬‭Add a Transform Message component before the Write operation.‬

‭25.‬‭Change the display name to‬‭Java to CSV‬‭.‬

‭26.‬‭In the Transform Message properties view, change the output type to‬
‭application/csv‬‭and add a header property equal to‬‭false‬‭.‬

‭27.‬‭Set the body expression to‬‭[payload]‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭409‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add a Logger to display the records‬

‭28.‬‭Add a Logger to the end of the flow.‬

‭29.‬‭Change the Logger display name to‬‭payload‬‭.‬

‭30.‬‭Set the Logger message to display the payload.‬

‭Set the application to prompt to clear application data when it‬


‭starts‬

‭31.‬‭Add a breakpoint to the Transform Message component.‬

‭32.‬‭Save all files then, in the main menu, select‬‭Run‬‭> Debug Configurations‬‭.‬

‭33.‬‭Select‬‭apdev-examples‬‭in the left menu bar under Mule‬‭Applications.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭410‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭34.‬‭In the Debug Configurations dialog box, locate the Clear Application Data‬
‭section in the General tab and change it to Prompt.‬

‭NOTE‬‭: You need to rerun or debug an application to‬‭get the prompt; you cannot just‬
‭save to redeploy.‬

‭Debug the project‬

‭35.‬‭Click‬‭Debug‬‭.‬

‭36.‬‭In the Clear Application Data dialog box, click‬‭Yes‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭411‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭37.‬‭After the breakpoint is hit, in the Mule Debugger, expand‬‭Payload‬‭.‬

‭38.‬‭Click‬‭Resume‬‭and step through several of the records.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭412‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭39.‬‭Look at the console; you should see the records displayed.‬

‭40.‬‭Stop the project and switch perspectives.‬

‭Clear application data and test the application‬

‭41.‬‭Run the project.‬

‭42.‬‭In the Clear Application Data dialog box, click‬‭Yes‬‭.‬

‭43.‬‭Look at the console; you should see many records.‬

‭44.‬‭Stop the project.‬

‭45.‬‭Return to the resources folder in your computer’s file explorer; you should see‬
‭a new‬‭DBaccounts.csv‬‭file appear in the output folder.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭413‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭46.‬‭Open the‬‭DBaccounts.csv‬‭file with a text editor; you‬‭should see the records.‬

‭47.‬‭Close the‬‭DBaccounts.csv‬‭file.‬

‭Test the application again without clearing application data‬

‭48.‬‭Return to Anypoint Studio and run the project.‬

‭49.‬‭In the Clear Application Data dialog box, click‬‭No‬‭.‬

‭50.‬‭Look at the console; you should see no new records output (unless someone‬
‭else just added one!).‬

‭Add a new account to the database‬

‭51.‬‭Return to the MUA Accounts page in the web browser.‬

‭52.‬‭Click‬‭Add account‬‭.‬

‭53.‬‭Fill out the form with data and click‬‭Save‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭414‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Note:‬‭Set the postal code to a specific value. In‬‭the next walkthrough, you will retrieve‬
‭only new records with this specific postal code, so you do not get all of the records.‬

‭54.‬‭On the MUA accounts page, locate your new account.‬

‭55.‬‭Return to the console in Anypoint Studio; you should see your new record.‬

‭56.‬‭Stop the project.‬

‭57.‬‭Return to your computer’s file explorer; the modified date on the‬


‭DBAccounts.csv file should have been updated.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭415‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭58.‬‭Open‬‭DBaccounts.csv‬‭and locate your new record at the end of the file.‬

‭59.‬‭Close the‬‭DBaccounts.csv‬‭file.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭416‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 7-3: Schedule a flow and use manual‬


‭watermarking‬

‭In this walkthrough, you continue to work with the accounts table in the training‬
‭database. You will:‬

‭●‬ ‭Use the Scheduler component to create a new flow that executes at a specific‬
‭frequency.‬

‭●‬ ‭Retrieve accounts with a specific postal code from the accounts table.‬

‭●‬ ‭Use the Object Store component to store the ID of the latest record and then‬
‭use it to only retrieve new records.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Create a flow that executes at a specific frequency‬

‭1.‬ ‭Return to‬‭accounts.xml‬‭in Anypoint Studio.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭417‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭2.‬ ‭Locate the‬‭Scheduler‬‭component in the Core section of the Mule Palette.‬

‭3.‬ ‭Drag a‬‭Scheduler‬‭component from the Mule Palette and‬‭drop it at the top of‬
‭the canvas to create a new flow.‬

‭4.‬ ‭Change the name of the flow to‬‭syncDBaccountsWithPostal‬‭.‬

‭5.‬ ‭In the Scheduler properties view, set the frequency to‬‭10 seconds‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭418‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Retrieve records with a specific postal code from the database‬

‭6.‬ ‭From the Mule Palette, drag a Database Select operation and drop it in the‬
‭flow.‬

‭7.‬ ‭In the Select properties view, set the following:‬

‭●‬ ‭Display Name‬‭: accounts‬

‭●‬ ‭Connector configuration‬‭: Database_Config‬

‭●‬ ‭SQL query text‬‭: SELECT * FROM accounts WHERE postal‬‭= :postal‬

‭8.‬ ‭In the Input Parameters section, use expression mode to create a postal input‬
‭parameter with the specific postal code you used in the previous walkthrough.‬

{ postal:‬‭
‭ 'yourPostalValue'‬
}‬

‭NOTE‬‭: If you want, you can store the postal code as‬‭a property in config.yaml and‬
‭then reference it here in the DataWeave expression as { postal: p('propertyName')}.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭419‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Output the records to a CSV file‬

‭9.‬ ‭Copy the‬‭Write‬‭operation in‬‭syncDBaccountsToCSV‬‭and‬‭paste it at the end of‬


‭syncDBaccountsWithPostal‬‭.‬

‭10.‬‭In the properties view for the Write operation, set the following values:‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭420‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭●‬ ‭Display Name‬‭: DBaccountsPostal.csv‬

‭●‬ ‭Path‬‭: output/DBaccountsPostal.csv‬

‭11.‬‭Change the content to output the payload as‬‭application/csv‬‭with a header‬


‭property equal to‬‭false‬‭.‬

output application/csv header=false --- payload‬


‭Log the payload‬

‭12.‬‭Add a Logger at the end of the flow and change the display name to‬‭CSV‬
‭payload‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭421‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭13.‬‭Set the message to the payload as type‬‭application/csv‬‭.‬

‭Stop the syncDBaccountsToCSV flow so it does not run‬

‭14.‬‭In the properties view for the syncDBaccountsToCSV flow, set the initial state‬
‭to‬‭stopped‬‭.‬

‭Test the application‬

‭15.‬‭Save the file and run the project.‬

‭16.‬‭In the Clear Application Data dialog box, click‬‭Yes‬‭.‬

‭17.‬‭Watch the console, you should see the same records displayed every 10‬
‭seconds.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭422‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Note:‬‭Right now, all records with matching postal‬‭code are retrieved – over and over‬
‭again. Next, you will modify this so only new records with the matching postal code‬
‭are retrieved.‬

‭18.‬‭Stop the project.‬

‭19.‬‭Return to the resources folder in your computer’s file browser; you should see‬
‭the new‬‭DBaccountsPostal.csv‬‭file in the output folder.‬

‭20.‬‭Open the file, review the contents then close the file.‬

‭21.‬‭Delete the file.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭423‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Add the ObjectStore module to the project‬

‭22.‬‭Return to Anypoint Studio and in the Mule Palette, select‬‭Add Modules‬‭.‬

‭23.‬‭Select the ObjectStore connector in the right side of the Mule Palette and drag‬
‭and drop it into the left side.‬

‭24.‬‭If you get a Select module version dialog box, select the latest version and‬
‭click‬‭Add‬‭.‬

‭Store the ID of the last record retrieved‬

‭25.‬‭Drag the Store operation for the ObjectStore connector from the Mule Palette‬
‭and drop it after the Database Select operation.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭424‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭26.‬‭In the Store properties view, set the display name and key to lastAccountID.‬

‭27.‬‭Set the value to an expression for the maximum value of lastAccountID in the‬
‭payload containing the retrieved records.‬

max(payload.*accountID)‬

‭Before the query, retrieve the ID of the last record retrieved‬

‭28.‬‭Drag the‬‭Retrieve‬‭operation for the ObjectStore connector‬‭from the Mule‬


‭Palette and drop it before the‬‭Database Select‬‭operation.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭425‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭29.‬‭In the Retrieve properties view, set the following values:‬

‭●‬ ‭Display Name‬‭: lastAccountID‬

‭●‬ ‭Key‬‭: lastAccountID‬

‭●‬ ‭Default value‬‭: 0‬

‭30.‬‭Select the‬‭Advanced‬‭tab and set the target variable‬‭to lastAccountID so the‬


‭value is stored in a variable called lastAccountID.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭426‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Modify the query to only retrieve new records with a specific‬


‭postal code‬

‭31.‬‭In the accounts Select properties view, add a second query input parameter‬
‭called‬‭lastAccountID‬‭that is equal to the watermark‬‭value.‬

{postal: '‬
‭ yourValue‬
‭ ', lastAccountID: vars.lastAccountID}‬

‭32.‬‭Modify the SQL query text to use this parameter to only retrieve new records.‬

SELECT * FROM accounts WHERE postal = :postal AND accountID‬



> :lastAccountID‬

‭Only store the value if new records were retrieved‬

‭33.‬‭Add a Choice router after the Select operation.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭427‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭34.‬‭Move the‬‭Store‬‭,‬‭Write‬‭, and‬‭Logger‬‭operations into‬‭the‬‭when‬‭branch of the‬


‭router.‬

‭35.‬‭Add a‬‭Logger‬‭to the default branch.‬

‭36.‬‭In the default branch Logger properties view, set the display name and‬
‭message to‬‭No new records‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭428‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭37.‬‭In the Choice router, click the‬‭when‬‭scope and in the properties view, add an‬
‭expression to route the event when the payload is not empty.‬

#[not isEmpty(payload)]‬

‭Clear the application data and debug the application‬

‭38.‬‭Add a breakpoint to the Retrieve operation.‬

‭39.‬‭Save the file and debug the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭429‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭40.‬‭In the Clear Application Data dialog box, click‬‭Yes‬‭.‬

‭41.‬‭In the Mule Debugger, step to the Select operation; you should see a‬
‭lastAccountID variable with a value of 0.‬

‭42.‬‭Step into the Choice router; you should see record(s) were retrieved from the‬
‭database.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭430‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭43.‬‭Click‬‭Resume‬‭; the flow should be executed again, and‬‭execution should be‬


‭stopped back at the beginning of the flow.‬

‭44.‬‭Step to the Select operation; you should see the lastAccountID variable now‬
‭has a non-zero value.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭431‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭45.‬‭Step into the Choice router; you should see no records were retrieved from the‬
‭database (unless someone else just added one with the same postal code!).‬

‭46.‬‭Stop the project and switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭432‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭47.‬‭Return to your computer’s file explorer and locate and open the new‬
‭DBaccountsPostal.csv file in the output folder.‬

‭NOTE‬‭: If you see the same records more than once,‬‭it is because during debugging,‬
‭the flow was executed again before the watermark was stored.‬

‭48.‬‭Close the‬‭DBaccountsPostal.csv‬‭file.‬

‭Debug the application and do not clear application data‬

‭49.‬‭Return to Anypoint Studio and debug the project.‬

‭50.‬‭In the Clear Application Data dialog box, click‬‭No‬‭.‬

‭51.‬‭In the Mule Debugger, step to the Select operation; you should see a‬
‭lastAccountID variable with the same non-zero value.‬

‭52.‬‭Step into the Choice router; no new records should have been returned.‬

‭53.‬‭Remove the breakpoint from the Retrieve operation.‬

‭54.‬‭Make sure there are no other breakpoints in the flow then click‬‭Resume‬‭to‬
‭continue application execution.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭433‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭NOTE‬‭: If your application still halts at the Retrieve operation, stop then debug the‬
‭project without clearing the application data.‬

‭Add a new account to the database‬

‭55.‬‭Return to the MUA Accounts page in the web browser.‬

‭56.‬‭Click‬‭Add account‬‭.‬

‭57.‬‭Fill out the form with data and use the same postal code.‬

‭58.‬‭Click‬‭Save‬‭.‬

‭59.‬‭You should see your new account on the MUA accounts page.‬

‭60.‬‭Return to Anypoint Studio; you should see your new record in the console.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭434‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭61.‬‭Return to your computer’s file explorer; the modified date on the‬


‭DBAccountsPostal.csv file should have been updated.‬

‭62.‬‭Open‬‭DBaccountsPostal.csv‬‭and locate your new record‬‭at the end of the file.‬

‭63.‬‭Close the‬‭DBaccountsPostal.csv‬‭file.‬

‭64.‬‭Return to Anypoint Studio and switch perspectives.‬

‭65.‬‭Stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭435‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 7-4: Publish and listen for JMS messages‬

‭In this walkthrough, you send a JMS message for each new database record so it can‬
‭be processed asynchronously. You will:‬

‭●‬ ‭Add and configure a JMS connector for ActiveMQ (that uses an in-memory‬
‭broker).‬

‭●‬ ‭Send messages to a JMS queue.‬

‭●‬ ‭Listen for and process messages from a JMS queue.‬

‭Starting file‬
‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Add the JMS module to the project‬

‭1.‬ ‭Return to‬‭accounts.xml‬‭.‬

‭2.‬ ‭In the Mule Palette, select‬‭Add Modules‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭436‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭3.‬ ‭Select the‬‭JMS connector‬‭in the right side of the Mule Palette and drag and‬
‭drop it into the left side.‬

‭4.‬ ‭If you get a Select module version dialog box, select the latest version and‬
‭click‬‭Add‬‭.‬

‭Configure the JMS connector‬

‭5.‬ ‭Return to the Global Elements view of global.xml.‬

‭6.‬ ‭Click‬‭Create‬‭.‬

‭7.‬ ‭In the Choose Global Type dialog box, select‬‭Connector‬‭Configuration > JMS‬
‭Config‬‭and click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭437‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭8.‬ ‭In the Global Element Properties dialog box, make sure the connection is set‬
‭to‬‭ActiveMQ Connection‬‭.‬

‭9.‬ ‭Click the‬‭Configure > Add Maven‬‭dependency option‬‭for the ActiveMQ‬


‭Broker.‬

‭10.‬‭In the Maven dependency dialog box, enter‬‭activemq-broker‬‭in the Search‬


‭Maven Central field.‬

‭11.‬‭Select the‬‭org.apache.activemq:activemq-broker‬‭in‬‭the results that are‬


‭displayed.‬

‭12.‬‭Click‬‭Edit selected‬‭.‬

‭13.‬‭Enter 5.16.5 in the Version text field.‬

‭NOTE‬‭: Version 5.16.5 is the latest ActiveMQ driver‬‭compatible with Java 8 which is‬
‭used by the Mule runtime.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭438‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭439‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭14.‬‭Click‬‭Finish‬‭.‬

‭15.‬‭Scroll down and locate the‬‭Connection Factory‬‭section.‬

‭16.‬‭For Factory configuration, select‬‭Edit inline‬‭; the‬‭Broker url should already be‬
‭populated.‬

‭17.‬‭Click‬‭OK‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭440‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Use the JMS Publish operation to send a message to a JMS queue‬

‭18.‬‭Return to‬‭accounts.xml‬‭.‬

‭19.‬‭Drag out a‬‭JMS Publish‬‭operation from the Mule Palette and drop it after the‬
‭Write operation in syncDBaccountsWithPostal.‬

‭20.‬‭In the Publish properties view, set the following values:‬

‭●‬ ‭Display Name‬‭: JMS accountsQ‬

‭●‬ ‭Connector configuration‬‭: JMS_Config‬

‭●‬ ‭Destination‬‭: accountsQ‬

‭●‬ ‭Destination type‬‭: QUEUE‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭441‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Modify the message body to be of type‬‭application/json‬‭.‬

output application/json --- payload‬


‭22.‬‭Scroll down and locate the User Properties field.‬

‭23.‬‭Use expression mode and set it equal to an object with a key called‬‭publisher‬
‭and a value of‬‭training‬‭.‬

{"publisher":"training"}‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭442‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create a flow to listen to a JMS topic‬

‭24.‬‭Drag out the‬‭JMS On New Message‬‭operation from the‬‭Mule Palette and drop‬
‭it in the canvas to create a new flow.‬

‭25.‬‭Give the flow a new name of‬‭receiveJMSMessages‬‭.‬

‭26.‬‭In the On New Message properties view, set the following values:‬

‭●‬ ‭Display Name‬‭: JMS accountsQ‬

‭●‬ ‭Connector configuration‬‭: JMS_Config‬

‭●‬ ‭Destination‬‭: accountsQ‬

‭●‬ ‭Consumer type‬‭: Queue consumer‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭443‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭27.‬‭Add a Logger to the flow.‬

‭28.‬‭Set its display name to‬‭payload‬‭and its message to‬‭#[payload]‬‭.‬

‭Clear application data and debug the application‬

‭29.‬‭Add a breakpoint to the Logger in receiveJMSmessages.‬

‭30.‬‭Save the files and debug the project.‬

‭31.‬‭In the Clear Application Data dialog box, click‬‭Yes‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭444‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭32.‬‭Wait until the project deploys; application execution should stop in‬
‭receiveJMSMessages.‬

‭33.‬‭In the Mule Debugger view, look at the value of the payload.‬

‭34.‬‭Expand the‬‭Attributes‬‭and locate the publisher property‬‭in the userProperties.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭445‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭35.‬‭Step through the rest of the application; you should see the JSON message in‬
‭the console.‬

‭NOTE‬‭: If you want to test further, return to the MUA‬‭Accounts in the web browser and‬
‭add a new record with the same postal code.‬

‭36.‬‭Stop the project and switch perspectives.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭446‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Module 8: Processing records‬

‭At the end of this module, you should be able to:‬

‭●‬ ‭Process items in a collection using the For Each scope.‬

‭●‬ ‭Process records using the Batch Job scope.‬

‭●‬ ‭Use filtering and aggregation in a batch step.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭447‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 8-1: Process items in a collection using the For‬


‭Each scope‬

‭In this walkthrough, you split a collection and process each item in it. You will:‬

‭●‬ ‭Use the For Each scope element to process each item in a collection‬
‭individually.‬

‭●‬ ‭Change the value of an item inside the scope.‬

‭●‬ ‭Examine the payload before, during, and after the scope.‬

‭●‬ ‭Look at the thread used to process each item.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Stop the syncDBaccountsWithPostal flow so it does not run‬

‭1.‬ ‭Return to‬‭accounts.xml‬‭.‬

‭2.‬ ‭In the properties view for the syncDBaccountsWithPostal flow, set the initial‬
‭state to‬‭stopped‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭448‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭3.‬ ‭Right-click in the canvas and select‬‭Collapse All‬‭.‬

‭Add a For Each scope‬

‭4.‬ ‭Expand‬‭getCSVaccounts‬‭.‬

‭5.‬ ‭In the Mule Palette, select‬‭Core‬‭.‬

‭6.‬ ‭Locate the For Each scope and drag and drop it before the Logger.‬

‭Transform the input to a collection‬

‭7.‬ ‭Add a Transform Message component before the For Each scope.‬

‭8.‬ ‭Set its display name to‬‭CSV to Java‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭449‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭9.‬ ‭In the Transform Message properties view, leave the output type set to‬‭java‬
‭and set the expression to‬‭payload‬‭.‬

‭Process each element in the For Each scope‬

‭10.‬‭Add a‬‭Set Payload‬‭transformer and a Logger to the‬‭For Each scope.‬

‭11.‬‭In the Set Payload properties view, set the display name and value to‬
‭processed.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭450‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭12.‬‭Set the Logger display name to payload and have it display the payload.‬

‭Change the File listener so it does not rename files‬

‭13.‬‭In the accounts.csv properties view, delete the‬‭Rename‬‭to value‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭451‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭14.‬‭Add a breakpoint to the Transform Message component.‬

‭15.‬‭Save the file, debug the project, and do not clear application data.‬

‭16.‬‭Return to the student files in your computer’s file browser.‬

‭17.‬‭Rename‬‭accounts.csv.backup‬‭to‬‭accounts.csv‬‭in the‬‭input folder.‬

‭18.‬‭Return to Anypoint Studio; application execution should have stopped at the‬


‭Transform Message component.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭452‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭19.‬‭In the Mule Debugger view, look at the payload type and value.‬

‭20.‬‭Step to the For Each scope; the payload should now be an ArrayList of‬
‭LinkedHashMaps.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭453‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭21.‬‭Step into the Set Payload in the For Each scope; the payload should now be a‬
‭LinkedHashMap.‬

‭22.‬‭Expand‬‭Variables‬‭; you should see a counter variable.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭454‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭23.‬‭Step again; you should see the payload for this record inside the scope has‬
‭been set to the string, processed.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭455‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭24.‬‭Step again and look at the payload and counter for the second record.‬

‭25.‬‭Step through the application to the Logger after the For Each scope; the‬
‭payload should be equal to the original ArrayList of LinkedHashMaps and not a‬
‭list of processed strings.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭456‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭26.‬‭Step to the end of the application.‬

‭27.‬‭Stop the project and switch perspectives.‬

‭Look at the processing threads‬

‭28.‬‭In the console, locate the thread number used to process each item in the‬
‭collection; the same thread should be used for each:‬‭cpuIntensive.01‬‭in the‬
‭following screenshot.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭457‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 8-2: Process records using the Batch Job scope‬

‭In this walkthrough, you create a batch job to process the records in a CSV file. You‬
‭will:‬

‭●‬ ‭Use the Batch Job scope to process items in a collection.‬

‭●‬ ‭Examine the payload as it moves through the batch job.‬

‭●‬ ‭Explore variable persistence across batch steps and phases.‬

‭●‬ ‭Examine the payload that contains information about the job in the‬
‭On Complete phase.‬

‭●‬ ‭Look at the threads used to process the records in each step.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭Create a new flow to read CSV files‬

‭1.‬ ‭Return to‬‭accounts.xml‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭458‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭2.‬ ‭Drag a Flow scope from the Mule Palette and drop it above getCSVaccounts.‬

‭3.‬ ‭Change the flow name to‬‭batchProcessCSVaccounts‬‭.‬

‭4.‬ ‭Select the On New or Updated File operation in getCSVaccounts and copy it.‬

‭5.‬ ‭Click the Source section of batchProcessCSVaccounts and paste it.‬

‭6.‬ ‭Add a Transform Message component to the flow.‬

‭7.‬ ‭Set the display name to‬‭CSV to Java‬‭.‬

‭8.‬ ‭In the Transform Message properties view, change the body expression to‬
‭payload‬‭.‬

‭Add a Batch Job scope‬

‭9.‬ ‭In the Mule Palette, select‬‭Core‬‭and locate the‬‭Batch‬‭elements.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭459‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭10.‬‭Drag a‬‭Batch Job‬‭scope and drop it after the‬‭Transform‬‭Message‬‭component.‬

‭Set a variable before the Batch Job scope‬

‭11.‬‭Add a‬‭Set Variable‬‭transformer before the‬‭Batch Job‬‭scope.‬

‭12.‬‭In the Set Variable properties view, set the following:‬

‭●‬ ‭Display Name‬‭: size‬

‭●‬ ‭Name‬‭: size‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭460‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭●‬ ‭Value‬‭: #[sizeOf(payload)]‬

‭Set a variable inside the Batch Job scope‬

‭13.‬‭Add a‬‭Set Variable‬‭transformer to the‬‭processors‬‭phase‬‭of the batch step.‬

‭14.‬‭Add a‬‭Logger‬‭component after the‬‭Set Variable‬‭transformer.‬

‭15.‬‭In the Set Variable properties view, set the following:‬

‭●‬ ‭Display Name‬‭: cname‬

‭●‬ ‭Name‬‭: cname‬

‭●‬ ‭Value‬‭: #[payload.Name]‬

‭Create a second batch step‬

‭16.‬‭Drag a‬‭Batch Step‬‭scope from the Mule Palette and‬‭drop it in the process‬
‭records phase of the Batch Job scope after the first batch step.‬

‭17.‬‭Add a‬‭Logger‬‭to the processors phase of the second‬‭batch step.‬

‭18.‬‭Add a‬‭Logger‬‭to the‬‭On Complete‬‭phase.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭461‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Stop the other flow watching the same file directory from being‬
‭executed‬

‭19.‬‭In the properties view for the getCSVaccounts flow, set the initial state to‬
‭stopped‬‭.‬

‭Debug the application‬

‭20.‬‭In batchProcessCSVaccounts, add a breakpoint to the Transform Message‬


‭component.‬

‭21.‬‭Save the file, debug the project, and do not clear application data.‬

‭22.‬‭Return to the student files in your computer’s file browser and move‬
‭accounts.csv from the output folder to the input folder.‬

‭23.‬‭In the Mule Debugger view, watch the payload as you step to the Batch Job‬
‭scope; it should go from CSV to an ArrayList.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭462‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭24.‬‭In the Mule Debugger view, expand‬‭Variables‬‭; you should see the size‬
‭variable.‬

‭25.‬‭Step to the Logger in the first batch step.‬

‭26.‬‭In the Mule Debugger view, look at the value of the payload; it should be a‬
‭HashMap.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭463‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭27.‬‭Expand‬‭Variables‬‭; you should see the‬‭size‬‭variable and the‬‭cname‬‭variable‬


‭specific for that record.‬

‭28.‬‭Step through the rest of the records in the first batch step and watch the‬
‭payload‬‭and the‬‭cname‬‭variable change.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭464‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭29.‬‭Step into the second batch step and look at the‬‭payload‬‭and the‬‭cname‬
‭variable; you should see the cname variable is defined and has a value.‬

‭30.‬‭Step through the rest of the records in the second batch step and watch the‬
‭value of‬‭cname‬‭.‬

‭31.‬‭Step into the On Complete phase; you should see the payload is an‬
‭ImmutableBatchJobResult‬‭.‬

‭32.‬‭Expand the payload and locate the values for‬‭totalRecords‬‭,‬


‭successfulRecords‬‭, and‬‭failedRecords‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭465‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭33.‬‭Step through the rest of the application and switch perspectives.‬

‭34.‬‭Stop the project.‬

‭Look at the processing threads‬

‭35.‬‭In the console, locate the thread number used to process each record in the‬
‭collection in each step of the batch process; you should see more than one‬
‭thread used.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭466‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭467‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Walkthrough 8-3: Use filtering and aggregation in a batch‬


‭step‬

‭In this walkthrough, you use a batch job to synchronize account database records to‬
‭Salesforce. You will:‬

‭●‬ ‭Use a batch job to synchronize database records (with your postal code) to‬
‭Salesforce.‬

‭●‬ ‭In a first batch step, check to see if the record already exists in Salesforce.‬

‭●‬ ‭In a second batch step, add the record to Salesforce.‬

‭●‬ ‭Use a batch step filter so the second batch step is only executed for specific‬
‭records.‬

‭●‬ ‭Use a Batch Aggregator scope to commit records in batches.‬

‭Starting file‬

‭If you did not complete the previous walkthrough, you can get a starting file ‬‭here‬‭.‬
‭This file is also located in the solutions folder of the student files ZIP located in the‬
‭Course Resources.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭468‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Look at existing Salesforce account data‬

‭1.‬ ‭In a web browser, navigate to‬‭http://login.salesforce.com/‬‭and log in with your‬


‭Salesforce Developer account.‬

‭2.‬ ‭Click the‬‭App Launcher‬‭, click‬‭View All‬‭, then click‬‭the‬‭Accounts‬‭link.‬

‭3.‬ ‭In the view drop-down menu, select‬‭All Accounts‬‭.‬

‭4.‬ ‭Look at the existing account data; a Salesforce Developer account is populated‬
‭with some sample data.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭469‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭5.‬ ‭Notice that countries and postal codes are not displayed by default.‬

‭6.‬ ‭In the List View Controls dropdown menu, select‬‭New‬‭.‬

‭7.‬ ‭In the New List View dialog box, set the list name to‬‭All Accounts with Postal‬
‭Code‬‭.‬

‭8.‬ ‭Select‬‭All users can see this list view‬‭.‬

‭9.‬ ‭Click‬‭Save‬‭.‬

‭10.‬‭In the List View Controls dropdown menu, select‬‭Select‬‭Fields to Display‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭470‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭11.‬‭In the Select Fields to Display dialog box, select‬‭Billing Zip/Postal Code‬‭as the‬
‭available field and click the‬‭Move selection to Visible‬‭Fields‬‭button.‬

‭12.‬‭Select‬‭Billing Country‬‭as the available field and‬‭click the‬‭Move selection to‬


‭Visible Fields‬‭button.‬

‭13.‬‭Use the‬‭Up‬‭and‬‭Down‬‭buttons to order the fields as‬‭you prefer.‬

‭14.‬‭Click‬‭Save‬‭; you should now see all the accounts with‬‭postal codes and‬
‭countries.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭471‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭15.‬‭Adjust the column widths as you prefer.‬

‭Add an account to Salesforce with a name matching one of the‬


‭database records‬

‭16.‬‭Click the‬‭New‬‭button.‬

‭17.‬‭In the New Account dialog box, enter an account name (one that matches one‬
‭of the accounts you added with your postal code to the database) and click‬
‭Save‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭472‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭18.‬‭Leave this browser tab open.‬

‭Add a Batch Job scope to the receiveJMSmessages flow‬

‭19.‬‭Return to‬‭accounts.xml‬‭in Anypoint Studio.‬

‭20.‬‭Drag a Batch Job scope from the Mule Palette and drop it before the Logger in‬
‭the receiveJMSmessages flow.‬

‭21.‬‭Change the display name of the batch job to‬‭syncWithSalesforce‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭473‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Query Salesforce to see if an account already exists‬

‭22.‬‭Change the name of the batch step inside the batch job to‬
‭isAccountInSalesforce‬‭.‬

‭23.‬‭Drag a‬‭Salesforce Query‬‭operation from the Mule Palette‬‭and drop it in the‬


‭processors‬‭phase in the batch step.‬

‭24.‬‭In the Query properties view, set the following values:‬

‭●‬ ‭Display Name‬‭: Account‬

‭●‬ ‭Connector configuration‬‭: Salesforce_Config‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭474‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭●‬ ‭Salesforce query‬‭: SELECT Name FROM Account‬

‭NOTE‬‭: You will add to this query shortly.‬

‭Transform the input JSON data to Salesforce Account objects‬

‭25.‬‭Add a‬‭Transform Message‬‭component before the‬‭Batch‬‭Job‬‭.‬

‭26.‬‭Change the display name to‬‭JSON to Accounts‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭475‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭27.‬‭In the Transform Message properties view, look at the metadata in the input‬
‭section.‬

‭28.‬‭Right-click‬‭Payload‬‭and select‬‭Set Metadata‬‭.‬

‭29.‬‭Create a new metadata type with the following information:‬

‭●‬ ‭Type id‬‭: accounts_json‬

‭●‬ ‭Type‬‭: JSON‬

‭●‬ ‭Example‬‭: Use the accounts.json file in the resources/examples‬


‭folder of the student files‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭476‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭30.‬ ‭In the Transform Message properties view, click the Show Graphics button‬
‭and map the following fields:‬

‭●‬ ‭name‬‭: Name‬

‭●‬ ‭street‬‭: BillingStreet‬

‭●‬ ‭city‬‭: BillingCity‬

‭●‬ ‭state‬‭: BillingState‬

‭●‬ ‭postal‬‭: BillingPostalCode‬

‭●‬ ‭country‬‭: BillingCountry‬

‭NOTE‬‭: If you do not get Salesforce metadata for the‬‭Account object, you can copy the‬
‭DataWeave transformation from the course snippets.txt file.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭477‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Finish the batch step to check if an account already exists in‬


‭Salesforce‬

‭31.‬‭In the Query properties view, add an input parameter named‬‭cname‬‭.‬

‭32.‬‭Set the parameter value to‬‭payload.Name‬‭, ensure it‬‭is a‬‭String‬‭, and give it a‬
‭default value.‬

payload.Name default "" as String‬


‭33.‬‭Modify the Salesforce query to look for accounts with this name.‬

SELECT Name FROM Account‬



WHERE Name= ':cname'‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭478‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Store the result in a variable instead of overriding the payload‬

‭34.‬‭Select the‬‭Advanced‬‭tab.‬

‭35.‬‭Set the target variable to‬‭exists‬‭.‬

‭36.‬‭Set the target value to:‬

#[(sizeOf(payload as Array) > 0)]‬


‭37.‬‭Add a‬‭Logger‬‭after the‬‭Query‬‭operation.‬

‭38.‬‭Add a‬‭Logger‬‭to the‬‭On Complete‬‭phase.‬

‭Change the initial state of the flow‬

‭39.‬‭In the properties view for the syncDBaccountsWithPostal flow, change the‬
‭initial state to‬‭started‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭479‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Debug the application‬

‭40.‬‭In the receiveJMSmessages flow, add a breakpoint to the Transform Message‬


‭component before the batch job.‬

‭41.‬‭Save the file and debug the project.‬

‭42.‬‭Clear the application data.‬

‭43.‬‭In the Mule Debugger, wait until application execution stops in the‬
‭receiveJMSmessages flow.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭480‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭44.‬‭Step to the Logger in the first batch step and expand Variables; you should see‬
‭the‬‭exists‬‭variable set to‬‭true or false‬‭.‬

‭45.‬‭Step through the application; you should see the‬‭exists‬‭variable set to false for‬
‭records with names that don’t exist in Salesforce and true for those that do.‬

‭46.‬‭Stop the project and switch perspectives.‬

‭Set a filter for the insertion step‬

‭47.‬‭Add a second batch step to the batch job.‬

‭48.‬‭Change its display name to‬‭writeToSalesforce‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭481‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭49.‬‭In the properties view for the second batch step, set the accept expression so‬
‭that only records that have the variable exists set to false are processed.‬

#[not vars.exists]‬

‭Use the Salesforce Create operation to add new account records‬


‭to Salesforce‬

‭50.‬‭Add a‬‭Salesforce Create‬‭operation to the second batch‬‭step in the processors‬


‭phase.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭482‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭51.‬‭In the Create properties view, set the following:‬

‭●‬ ‭Display Name‬‭: Accounts‬

‭●‬ ‭Connector configuration‬‭: Salesforce_Config‬

‭●‬ ‭Type‬‭: Account‬

‭●‬ ‭Records‬‭: payload‬

‭52.‬‭Select the‬‭Input‬‭tab in the DataSense Explorer; you‬‭should see this operation‬


‭expects an Array of Account objects – not just one.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭483‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭Create the Array of objects that the operation is expecting‬

‭53.‬‭Drag a‬‭Batch Aggregator‬‭scope from the Mule Palette‬‭and drop it in the‬


‭aggregator phase of the second batch step.‬

‭54.‬‭Move the‬‭Salesforce Create‬‭operation into the‬‭Batch‬‭Aggregator‬‭.‬

‭55.‬‭In the Batch Aggregator properties view, set the aggregator size to 3.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭484‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭56.‬‭Add a‬‭Logger‬‭after the‬‭Create‬‭operation.‬

‭Test the application‬

‭57.‬‭Save the file, debug the project, and clear the application data.‬

‭58.‬‭Step through the application until you step into the Batch Aggregator.‬

‭59.‬‭Expand‬‭Payload‬‭.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭485‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭60.‬‭Step through the rest of the flow.‬

‭61.‬‭Return to Salesforce and look at the accounts; you should see the records from‬
‭the legacy MySQL database are now in Salesforce.‬

‭NOTE‬‭: You could also check for the records by making‬‭a request to‬
‭http://localhost:8081/sfdc‬‭.‬

‭62.‬‭Stop the application then run it again but do not clear the application data; no‬
‭records should be processed.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭486‬


‭EXERCISE GUIDE‬
‭Anypoint Platform: Development Fundamentals (DEX401)‬

‭63.‬‭Return to salesforce.com and locate your new record(s); they should have‬
‭been inserted only once.‬

‭64.‬‭Return to Anypoint Studio and stop the project.‬

‭© Copyright 2023 salesforce.com, inc. All rights reserved.‬ ‭487‬

You might also like

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy