Adsense

December 16, 2020

RAML 1.0 Multiple Types for a Single Request

 Bonjour!

You must have come across a situation where you need to define two different Types for a particular resource in your RAML specification.

In this article, I'll show you how to do that!

you can define multiple Types using the pipe symbol ("|") as follows: 

The request Types can be defined in the header of the RAML. The examples can be specified using facet "examples" and added in the form of either files using the keyword "include" or the example itself.
 



Adios amigos!
Read More »

December 12, 2020

Mulesoft Interview Questions With Answers - Part 1

Bonjour!

What is Mulesoft?

The first and the most basic question asked in Mulesoft developer interviews. 

Mulesoft is the vendor that provides an integration platform to help businesses connect data, applications, and devices.

Mule is the runtime engine of the Anypoint Platform. It is a lightweight Java-based enterprise service bus (ESB) that allows developers to connect applications and exchange data. It can connect any systems by using different protocols like HTTP, JMS, JDBC etc.


What is Anypoint Platform?

Anypoint platform is a hybrid integration platform which is highly productive, unified and helps to create a smooth distributed systems. It helps to manage full API lifecycles. It provides unified platform to deploy, manage, monitor and rapid development of apps into single place.


What is a Mule Application?

A Mulesoft application is a package of codes and files that runs inside Mule Runtime. Mulesoft application can be triggered with set of events that can be external and inside mulesoft. It can process events and route to next components or endpoints. Endpoints can be external system, another mulesoft application or local resources like file.

A Mule Application may consists of one or more flows, subflows and private flows.


What is the difference between Flow, Subflow, and Private flow?

Flow is a message/event processing block. It can have Mule sources (e.g. an HTTP listener) to trigger the execution of a flow. It can have its own processing strategy and error handling strategy.

Subflow is a scope that enables you to process messages synchronously. It doesn't have any source or error handling block. It inherits the processing strategy and error handling strategy from parent flow. It can be used to split common logic and reusability.

Private flow is a flow without a Mule source. It can be synchronous or asynchronous based on the processing strategy selected. They can have their own error handling strategy.

All three above can be called using a flow-ref. Source will be skipped while calling using flow-ref.


How Mule Applications can be build?

Mule application can be created using online flow-designer and offline by downloading Anypointsudio. 

Link for Online flow-designer

Link to download AnypointStudio


How Mule4 Application flow executes?

Mule4 application flows executes events in multiple threads. Mule4 automatically optimizes performance and uses thread switching and parallel processing if required.


Variables in Mule 4 vs Mule 3?

In Mule 3, we had three types of variables: Session variables, Record variables, and Flow variables.

In Mule 4, we only have Flow variables. These variables can be accessed using the keyword "vars".

Example:

vars.variableName


What is API-led connectivity?

API-led connectivity is a methodical way to connect applications to data through reusable APIs. APIs are created in three distinct layers: Experience, Process, and System.




API Life Cycle?

An API life cycle consists of 3 layers:



The first step towards API development is API Specification. This phase involves designing of the API based on the requirements of business. An API Specification is a blueprint of an API.

Anypoint Platform provides Design center to design API's REST interfaces.

The next phase is API Implementation. This phase involves actual implementation of the API.

Anypoint Platform provides Flow Designer which is a web based tool to create a prototype of the API.

Anypoint Studio is the IDE for development and testing of Mule applications. 

Final phase in API life cycle is API management, uses a tool named API manager on Anypoint Platform which is used to apply policies to secure APIs and restrict access. 


What are the advantages of API-led approach?

  • Mulesoft prefers Design first approach for API development that helps non-technical stakeholders easy to understand the API specs/contracts.
  • It simplifies the interface between Client and application by hiding complex details.
  • Business validation and contracts can be defined at API specification. So, developers don't need to invest time to write code for validation and error type checks.
  • It encourages "fail fast" approach which helps in fast and parallel development.
  • It encourages reusability of assets and collaboration across teams.
  • Apis can be mocked before implementation starts which helps early feedback and parallel development.
  • Mulesoft anypoint platform provides tools to write, publish, share and manage versions of API.


What is RAML?

RAML stands for RESTful (REpresentational State Transfer) API Modeling Language. It's a way of describing a RESTful API that is readable by both human and computers. 

They use https methods such as GET, PUT, POST, DELETE, etc.


Difference between URI parameters and Query parameters.

URI parameter is used to specify a specific resource whereas Query parameter is used to filter or sort those resources.

let's say we need to filter products based on productType, we use query parameters in this case:

GET: /products?productType=electronics

Let's consider another scenario where we need to retrieve particular product details, we use URI parameters in this case:

GET: /products/{productID}

here, productID will be replaced by a value.


Error Handling in Mule 4?

Error handling in Mule 4 is redesigned. It has three mechanisms to handle errors now.

1. On-Error Propagate:  In an On-error Propagate scope, when an error occurs, it terminates the current execution of flow and then throws the error to its parent flow where it's handled.

2. On-Error Continue: In case of an error in an On-error Continue scope, the execution of the flow continues as if successful sending a 200 OK response.

3. Try Catch scope: A Try Catch scope is used to handle errors on individual components. It is especially useful when you need to separate error handling strategies for different components in a flow.


What are the Logger levels?

There are 5 logger levels namely: DEBUG, ERROR, INFO, TRACE, and WARN. 


What does scatter-gather return?

A scatter-gather returns a Mule event.


What is the use of Async scope?

Async scope can be used to trigger flows subflows or any components asynchronously from a parent flow. Async scope is very helpful while using logger component or parallel processing requires.


What is the difference between map and mapObject?

map operator is used for array. It takes an array as input and returns an array.

mapObject operator is used for object with key: value pairs. It takes an object as input and returns an object.


map invokes lambda with two parameters: value and index from the input array. 

Example:

%dw 2.0
output application/json
---
["apple", "orange", "banana"] map (value, index) -> { 
    (index) : value}

Output:

[ { "0": "apple" }, { "1": "orange" }, { "2": "banana" } ]


mapObject invokes lambda with keyvalue, or index for mapping given object.

Example:

%dw 2.0
output application/json
---
{"chandler":"bing","monica":"geller"} mapObject (value,key,index) -> { 
    (index) : { (value):key} }

Output:

{ "0": { "bing": "chandler" }, "1": { "geller": "monica" } }



What is batch processing?

Mule allows you to handle large quantities of data in batches. 

This is achieved using a Batch job scope which splits messages into individual records, performs actions on records, and reports the results. A Batch job scope processes data asynchronously.


Each batch job contains three different Processing Phases:  

1. Load and Dispatch: In this phase, Mule splits the message, creates a Batch Job Instance, a persistent queue and associates it with the Batch Job Instance.

2. Process: This phase does the actual processing of records asynchronously. 

3. On Complete: This is an optional phase where you can configure the runtime to create a report or summary of records. 


Stay tuned for more!





Read More »

December 05, 2020

splitBy and joinBy function dataweave2

 Hello friends, 

In this article I want show you the uses of two very common dataweave functions splitBy and joinBy. 

These two functions are very useful while doing transformation with Array and Strings. 

Here, we will see how we can use these dataweave functions converting data from String to Array and vice versa.

splitBy

Splits a string into a string array based on a value of input or matches part of that input string. It filters out the matching part from the returned array.

A string or a Java regular expression used to split the string. If it does not match some part of the string, the function will return the original, unsplit string in the array.

splitBy(String, Regex): Array<String>

Example 1:
------------------------------
Input
Hello World
------------------------------
Dataweave 2.0 Expression
------------------------------
%dw 2.0
output application/java
---
"Hello World" splitBy(/\s/)
------------------------------
Output
[Hello, World]

splitBy(String, String): Array<String>


Example 2:
------------------------------
Input
Manish Kumar
------------------------------
Dataweave 2.0 Expression
------------------------------
%dw 2.0
output application/java
---
payload splitBy(" ")
------------------------------
Output
[Manish, Kumar]


The regex/separator can match any character in the input. splitBy performs the opposite operation of joinBy.


joinBy

joinBy function Merges an array into a single string value and uses the provided string as a separator between each item in the list. 

You can use joinBy Dataweave 2.0 function to convert array to string.

Example 3:
------------------------------
Dataweave 2.0 Expression
------------------------------
%dw 2.0
output application/json
---
{ "joinName" : ["Manish","Kumar"] joinBy "-" }
------------------------------
Output
{
  "joinName": "Manish-Kumar"
}

joinBy performs the opposite task of splitBy.


Happy Learning :)


Read More »

December 01, 2020

Array comparison use case Dataweave2

Hello friends,

In this article we will see one of the common and challenging real-time use-case in IT industry during application development where we require to compare between arrays. These arrays could be from two different source or api responses.

Here we will see how we can compare two arrays results/payloads and get required results. Also we will see the complete example of our use-case.

To achieve this we will see how we can use the combination of some dataweave functions and how we can utilise these functions for our use-case.

  • flatMap
  • filter
  • contains
  • partation


There are many ways to achieve these functionality. Here, I have tried to show you two different methods to achieve this.


Method I:


flatMap

flatMap(Array<T>, (item: T, index: Number) -> Array<R>): Array<R>
It comes under dw::Core package from dataweave library.

Iterates over each item in an array and flattens the results. It produces output as Array. 

Instead of returning an array of arrays (as map does when you iterate over the values within an input like [ [1,2], [3,4] ]), flatMap returns a flattened array that looks like this: [1, 2, 3, 4]. flatMap is similar to flatten, but flatten only acts on the values of the arrays, while flatMap can act on values and indices of items in the array.

%dw 2.0
output application/json indent=false
---
[ ["a":1,"b":0], ["c":0.1,"d":7] ] flatMap (value, index) -> value
-------------------------------------------------------------------
Output:
[{"a": 1},{"b": 0},{"c": 0.1},{"d": 7}]


filter

filter(Array<T>, (item: T, index: Number) -> Boolean): Array<T>

It comes under dw::Core package from dataweave library. It produces output as array.

Iterates over an array and applies an expression that returns matching values. The expression must return true or false. If the expression returns true for a value or index in the array, the value gets captured in the output array. If it returns false for a value or index in the array, that item gets filtered out of the output. If there are no matches, the output array will be empty.


%dw 2.0
output application/json
---
[9,2,3,4,5] filter (value, index) -> (value > 4)

-------------------------------------------------
Output:
[
9,
5
]


Complete example below by using flatMap and filter function:



%dw 2.0
output application/json
var filterCriteria = [
{
"IDENTITY": "D40000",
"NM": "Delta",
"CODE": "D12"
},
{
"IDENTITY": "C30000",
"NM": "Charlie",
"CODE": "C11"
}
]
var responsePayload= [
{
"CODE": "A11",
"NAME": "Alpha",
"ID": "C10000"
},
{
"CODE": "B12",
"NAME": "Bravo",
"ID": "B20000"
},
{
"CODE": "C11",
"NAME": "Charlie",
"ID": "C30000"
},
{
"CODE": "D12",
"NAME": "Delta",
"ID": "D40000"
},
{
"CODE": "E12",
"NAME": "Echo",
"ID": "E50000"
}
]
---
filterCriteria flatMap(v) -> (
responsePayload filter (v.IDENTITY == $.ID and v.NM == $.NAME and v.CODE == $.CODE)
)
---------------------------------------------------------------------------------------------------------------
Output:
[
{
"CODE": "D12",
"NAME": "Delta",
"ID": "D40000"
},
{
"CODE": "C11",
"NAME": "Charlie",
"ID": "C30000"
}
]

----------------------------------------------------------------------------------------------------------------------

Method II:


Now, let use see the 2nd way to compare array by using contains and partition function. Here the input arrays can be from two different source or api responses. Let's see how we can compare and filter the incoming arrays by using these two useful function.

contains

contains(Array<T>, Any): Boolean

It comes under dw::Core package from dataweave library. It returns true if an input contains a given value, false if not.

This version of contains accepts an array as input. Other versions accept a string and can use another string or regular expression to determine whether there is a match.


partation

partition(Array<T>, (item: T) -> Boolean): { success: Array<T>, failure: Array<T> }


It comes under dw::core::Arrays package from dataweave library.

It separates the array into the elements that satisfy the condition from those that do not.
Elements that satisfies conditions will come under "success" array partation and which it don't satisfy comes "failure" array partation. So, you can retrieve the matching results under "success" partation node.


Note: Introduced in DataWeave 2.2.0. Supported by Mule 4.2 and later.


%dw 2.0
import partition from dw::core::Arrays
output application/json
var responsePayload = [
{
"CODE": "A11",
"NAME": "Alpha",
"ID": "C10000"
},
{
"CODE": "B12",
"NAME": "Bravo",
"ID": "B20000"
},
{
"CODE": "C11",
"NAME": "Charlie",
"ID": "C30000"
},
{
"CODE": "D12",
"NAME": "Delta",
"ID": "D40000"
},
{
"CODE": "E12",
"NAME": "Echo",
"ID": "E50000"
}
]

var filterCriteria = [
{
"IDENTITY": "D40000",
"NM": "Delta",
"CODE": "D12"
},
{
"IDENTITY": "C30000",
"NM": "Charlie",
"CODE": "C11"
}
]
---
responsePayload partition (e) -> filterCriteria contains {IDENTITY:e.ID,NM:e.NAME,CODE:e.CODE}
--------------------------------------------------------------------------------------------------------------------------

Output
{
"success": [
{
"CODE": "C11",
"NAME": "Charlie",
"ID": "C30000"
},
{
"CODE": "D12",
"NAME": "Delta",
"ID": "D40000"
}
],
"failure": [
{
"CODE": "A11",
"NAME": "Alpha",
"ID": "C10000"
},
{
"CODE": "B12",
"NAME": "Bravo",
"ID": "B20000"
},
{
"CODE": "E12",
"NAME": "Echo",
"ID": "E50000"
}
]
}

You can choose any of these methods while doing comparison of arrays for your use-cases.

Happy Learning :)
Read More »

May 17, 2020

Dataweave useful String functions-Part1

Hello friends, In this article we will see some common dataweave String functions from String core package(dw::core::Strings)  along with their use-cases.


To use these functions in dataweave scripts we need to add/import the module header as below.

you can either import complete package by using * or if you want to use specific function you can use just function name in place of placeholder as given below <functionName>

%dw 2.0

import * from dw::core::Strings or import <functionName> from dw::core::Strings 

output application/json

---

{}


Here, we will see 4 common String functions and their usage.

  • capitalize(String): String
  • camelize(String): String
  • dasherize(String): String
  • underscore(String): String 


capitalize(String): String


This function accepts input as String and returns results as String. It capitalizes the first letter of each word in a string. It also removes underscores between words and puts a space before each capitalized word.

%dw 2.0

import capitalize from dw::core::Strings
output application/json
---
{
"a" : capitalize("manish"),
"b" : capitalize("mr_manish_kumar"),
"c" : capitalize("manish-KUMAR"),
"d" : capitalize("manishKumar")
}

Output:
{
"a": "Manish",
"b": "Mr Manish Kumar",
"c": "Manish Kumar",
"d": "Manish Kumar"
}


camelize(String): String


This function accepts input as String and returns results as String.  It returns a string in camel case based on underscores in the string. All underscores are deleted, including any underscores at the beginning of the string.


%dw 2.0
import camelize from dw::core::Strings
output application/json
---
{
"a" : camelize("1_manish"),
"b" : camelize("mr_manish_kumar"),
"c" : camelize("_manish_kumar")
}

Output:
{
"a": "1Manish",
"b": "mrManishKumar",
"c": "manishKumar"
}

dasherize(String): String


This function accepts input as String and returns results as String. It replaces spaces, underscores, and camel-casing in a string with dashes (hyphens). If no spaces, underscores, and camel-casing are present, the output will match the input. 

%dw 2.0

import dasherize from dw::core::Strings
output application/json
---
{
"a" : dasherize("Manish"),
"b" : dasherize("Manish_first_name"),
"c" : dasherize("Manish Kumar"),
"d" : dasherize("ManishKumar")
}

Output:
{ "a": "manish", "b": "manish-first-name", "c": "manish-kumar", "d": "manish-kumar" }



Above function works based String input containing underscore. Below underscore function will help you to revert String  to underscore format. 


underscore(String): String 


This function accepts input as String and returns results as String. It replaces hyphens, spaces, and camel-casing in a string with underscores. If no hyphens, spaces, and camel-casing are present, the output will match the input. Also it converts string into lower case.

%dw 2.0
import underscore from dw::core::Strings
output json
---
{
"a" : underscore("Manish"),
"b" : underscore("Manish-first-name"),
"c" : underscore("Manish KUMAR"),
"d" : underscore("ManishKumar")
}

Output:
{ "a": "manish", "b": "manish_first_name", "c": "manish_kumar", "d": "manish_kumar" }

Also, If you want to use multiple functions in your transformation
you can import with either * or comma separated as example below:

%dw 2.0
import dasherize,underscore,capitalize,camelize from dw::core::Strings
output json
---
{
"a" : capitalize("manish_kumar"),
"b" : underscore("Mr-Manish-Kumar"),
"c" : dasherize("Manish KUMAR"),
"d" : camelize("manish_kumar")
}

Output:
{ "a": "Manish Kumar", "b": "mr_manish_kumar", "c": "manish-kumar", "d": "manishKumar" }

Note:: dasherize, underscore will convert result strings into lower case.


Happy Learning :)
Read More »