In this post, I am going to explain how to write your own
custom data formatter.
You can write the custom data formatter by implementing
DataFormat interface.
For example, below custom data formatter, reverse the
data while marshalling and unreversed the data while unmarshalling.
public class TextReverseFormatter implements DataFormat { @Override public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception { byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, graph); String body = reverseData(bytes); stream.write(body.getBytes()); } @Override public Object unmarshal(Exchange exchange, InputStream stream) throws Exception { byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, stream); String body = reverseData(bytes); return body; } }
Below statement uses TextReverseFormatter before copying
the data from soruceFolder to destFolder.
from(sourceFolder).marshal(new TextReverseFormatter()).to(destFolder);
Follow below steps to create complete working
application.
Create new maven project ‘camelDataFormatter’ in Eclipse.
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>camelDataFormatter</groupId> <artifactId>camelDataFormatter</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> </dependencies> </project>
Create a package ‘com.sample.app.formatters’ and define
the class TextReverseFormatter.
TextReverseFormatter.java
package com.sample.app.formatters; import java.io.InputStream; import java.io.OutputStream; import org.apache.camel.Exchange; import org.apache.camel.spi.DataFormat; public class TextReverseFormatter implements DataFormat { @Override public void marshal(Exchange exchange, Object graph, OutputStream stream) throws Exception { byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, graph); String body = reverseData(bytes); stream.write(body.getBytes()); } @Override public Object unmarshal(Exchange exchange, InputStream stream) throws Exception { byte[] bytes = exchange.getContext().getTypeConverter().mandatoryConvertTo(byte[].class, stream); String body = reverseData(bytes); return body; } private static String reverseData(byte[] data) { StringBuilder builder = new StringBuilder(); for (int i = data.length - 1; i >= 0; i--) { builder.append((char) data[i]); } return builder.toString(); } }
Create a package ‘com.sample.routes’ and define the class
FileCopyRoute.java.
FileCopyRoute.java
package com.sample.app.routes; import org.apache.camel.builder.RouteBuilder; import com.sample.app.formatters.TextReverseFormatter; public class FileCopyRoute extends RouteBuilder { @Override public void configure() throws Exception { String sourceFolder = "file:C:\\Users\\Public\\demo?noop=true"; String destFolder = "file:C:\\\\Users\\\\Public\\\\demoCopy"; from(sourceFolder).marshal(new TextReverseFormatter()).to(destFolder); } }
Define the class Application in com.sample.app package.
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(); } }
Project structure looks like below.
No comments:
Post a Comment