In this post, I am going to explain, how to transform the
message using processor API.
Scenario
Source folder ‘jsonOrders’ has all the orders information
in json files format. We need to use camel transformation to convert these json
orders into csv format and save it in another folder ‘csvOrders’.
jsonOrder contain two orders order1.json, order2.json.
order1.json
{ "orderId" : "Ord11279327", "productId" : "Prod342", "noOfProducts" : 5 }
order2.json
{ "orderId" : "Ord19897", "productId" : "Prod76", "noOfProducts" : 1 }
Our task is to read the orders from jsonOrders folder and
convert them to csv format and place it in csvOrders folder.
You can do this by writing a custom processor that
converts the json data to csv.
public class JsonToCsvTranslator implements Processor {
private
static Gson gson = new Gson();
@Override
public void
process(Exchange exchange) throws Exception {
String
jsonData = exchange.getIn().getBody(String.class);
String
fileName = (String) exchange.getIn().getHeader("CamelFileName");
Order
order = gson.fromJson(jsonData, Order.class);
String
csvData = order.getOrderId() + "," + order.getProductId() +
"," + order.getNoOfProducts();
String
csvFileName = fileName.substring(0, fileName.indexOf(".json")) +
".csv";
System.out.println("Data
from " + fileName + " is transformed to " + csvData);
System.out.println(fileName
+ " is transfomed to " + csvFileName);
exchange.getIn().setBody(csvData);
exchange.getIn().setHeader("CamelFileName",
csvFileName);
}
}
Use the JsonToCsvTranslator to convert json data to csv.
from("file:C:\\Users\\Public\\jsonOrders?noop=true")
.process(new
JsonToCsvTranslator())
.to("file:C:\\Users\\Public\\csvOrders");
Step 1: Create new
maven project ‘camelMessageTransformation’.
Step 2: Open
pom.xml and update maven dependencies
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>camelMessageTransformation</groupId> <artifactId>camelMessageTransformation</artifactId> <version>1</version> <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.camel/camel-core --> <dependency> <groupId>org.apache.camel</groupId> <artifactId>camel-core</artifactId> <version>2.22.1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.5</version> </dependency> </dependencies> </project>
Step 3: Create a
package ‘com.sample.app.model’ and define Order class.
Order.java
package com.sample.model; public class Order { private String orderId; private String productId; private int noOfProducts; public String getOrderId() { return orderId; } public void setOrderId(String orderId) { this.orderId = orderId; } public String getProductId() { return productId; } public void setProductId(String productId) { this.productId = productId; } public int getNoOfProducts() { return noOfProducts; } public void setNoOfProducts(int noOfProducts) { this.noOfProducts = noOfProducts; } }
Step 4: Create a
package 'com.sample.app.translators' and define the class JsonToCsvTranslator.
JsonToCsvTranslator.java
package com.sample.app.translators; import org.apache.camel.Exchange; import org.apache.camel.Processor; import com.google.gson.Gson; import com.sample.model.Order; public class JsonToCsvTranslator implements Processor { private static Gson gson = new Gson(); @Override public void process(Exchange exchange) throws Exception { String jsonData = exchange.getIn().getBody(String.class); String fileName = (String) exchange.getIn().getHeader("CamelFileName"); Order order = gson.fromJson(jsonData, Order.class); String csvData = order.getOrderId() + "," + order.getProductId() + "," + order.getNoOfProducts(); String csvFileName = fileName.substring(0, fileName.indexOf(".json")) + ".csv"; System.out.println("Data from " + fileName + " is transformed to " + csvData); System.out.println(fileName + " is transfomed to " + csvFileName); exchange.getIn().setBody(csvData); exchange.getIn().setHeader("CamelFileName", csvFileName); } }
Step 5: Create a
package ‘com.sample.app.routes’ and define the class ‘FileCopyRoute.java’.
FileCopyRoute.java
package com.sample.app.routes; import org.apache.camel.builder.RouteBuilder; import com.sample.app.translators.JsonToCsvTranslator; public class FileCopyRoute extends RouteBuilder { @Override public void configure() throws Exception { from("file:C:\\Users\\Public\\jsonOrders?noop=true").process(new JsonToCsvTranslator()) .to("file:C:\\Users\\Public\\csvOrders"); } }
Step 6: Create a
package ‘com.sample.app’ and define the class Application.java.
Application.java
package com.sample.app; import java.util.concurrent.TimeUnit; import org.apache.camel.CamelContext; import org.apache.camel.impl.DefaultCamelContext; import com.sample.app.routes.FileCopyRoute; public class Application { public static void main(String args[]) throws Exception { CamelContext context = new DefaultCamelContext(); context.addRoutes(new FileCopyRoute()); context.start(); TimeUnit.MINUTES.sleep(1); context.stop(); } }
Run Application.java, you can see below messages in
console.
Data from order1.json is transformed to Ord11279327,Prod342,5
order1.json is transfomed to order1.csv
Data from order2.json is transformed to Ord19897,Prod76,1
order2.json is transfomed to order2.csv
Complete project structure looks like below.
No comments:
Post a Comment