Skip to content

Instantly share code, notes, and snippets.

@MoriTanosuke
Created June 23, 2011 18:58
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save MoriTanosuke/1043310 to your computer and use it in GitHub Desktop.
Save MoriTanosuke/1043310 to your computer and use it in GitHub Desktop.
Unmarshal CSV with Apache Camel and Bindy
package de.kopis.camel.model;
import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
import org.apache.camel.dataformat.bindy.annotation.DataField;
@CsvRecord(separator = ",")
public class CsvBean {
@DataField(pos = 1)
private String first;
@DataField(pos = 2)
private String second;
@DataField(pos = 3)
private String third;
@DataField(pos = 4)
private String fourth;
public String getFirst() {
return first;
}
public void setFirst(String first) {
this.first = first;
}
public String getSecond() {
return second;
}
public void setSecond(String second) {
this.second = second;
}
public String getThird() {
return third;
}
public void setThird(String third) {
this.third = third;
}
public String getFourth() {
return fourth;
}
public void setFourth(String fourth) {
this.fourth = fourth;
}
}
package de.kopis.camel;
import static org.junit.Assert.*;
import java.util.List;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
public class CsvToBeanTest extends CamelTestSupport {
@Test
public void testCsv() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:queue.csv");
mock.expectedMessageCount(2);
assertMockEndpointsSatisfied();
List line1 = mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
assertEquals("row 01", line1.get(0));
assertEquals("row 02", line1.get(1));
assertEquals("", line1.get(2));
assertEquals("row 04", line1.get(3));
List line2 = mock.getReceivedExchanges().get(1).getIn().getBody(List.class);
assertEquals("row 11", line2.get(0));
assertEquals("row 12", line2.get(1));
assertEquals("row 13", line2.get(2));
assertEquals("row 14", line2.get(3));
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
context.setTracing(true);
from("file://src/test/resources?noop=true&fileName=test.csv")
.unmarshal().csv()
.split(body())
.to("mock:queue.csv");
}
};
}
}
package de.kopis.camel;
import java.util.List;
import java.util.Map;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.mock.MockEndpoint;
import org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.junit.Test;
import de.kopis.camel.model.CsvBean;
public class CsvToBeanWithBindyTest extends CamelTestSupport {
@Test
public void testCsv() throws Exception {
MockEndpoint mock = getMockEndpoint("mock:queue.csv");
mock.expectedMessageCount(1);
assertMockEndpointsSatisfied();
List csv = (List) mock.getReceivedExchanges().get(0).getIn().getBody();
Map map1 = (Map) csv.get(0);
CsvBean csv1 = (CsvBean) map1.get("de.kopis.camel.model.CsvBean");
assertEquals("row 01", csv1.getFirst());
Map map2 = (Map) csv.get(1);
CsvBean csv2 = (CsvBean) map2.get("de.kopis.camel.model.CsvBean");
assertEquals("row 11", csv2.getFirst());
}
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
return new RouteBuilder() {
@Override
public void configure() throws Exception {
context.setTracing(true);
from("file://src/test/resources?noop=true&fileName=test.csv")
.unmarshal(new BindyCsvDataFormat("de.kopis.camel.model"))
.to("mock:queue.csv");
}
};
}
}
<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>de.kopis.camel</groupId>
<artifactId>camel-example</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.8.2</version>
<type>jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel</artifactId>
<version>2.7.2</version>
<type>pom</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-bindy</artifactId>
<version>2.7.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-csv</artifactId>
<version>2.7.2</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test</artifactId>
<version>2.7.2</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
@Ranx0r0x
Copy link

Good clean code example. Great test with the route. I haven't used the RouteBuilder like this before but will now. In the past I've used test xml especially with blueprint but the route builder is much easier for testing (as long as not testing the route itself).

Great example.

@rajatTemaniya
Copy link

Thanx for example, But how I suppose to use pojo,How camel fill pojo I don't understand ? where you passing CSVBean.class pojo reference ?

@jazzleens
Copy link

Can you please provide the example of how to use camel bindy with subclasses(nested classes as Link annotation does not work).

Thanks

@gmillsPredix
Copy link

definately late to the party, just want to say Excellent example! thank you

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment