diff --git a/order/.classpath b/order/.classpath
new file mode 100644
index 0000000..8131be0
--- /dev/null
+++ b/order/.classpath
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/order/.project b/order/.project
new file mode 100644
index 0000000..4aacb4f
--- /dev/null
+++ b/order/.project
@@ -0,0 +1,23 @@
+
+
+ chapter3-order
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.eclipse.m2e.core.maven2Builder
+
+
+
+
+
+ org.eclipse.jdt.core.javanature
+ org.eclipse.m2e.core.maven2Nature
+
+
diff --git a/order/.settings/org.eclipse.core.resources.prefs b/order/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..f022440
--- /dev/null
+++ b/order/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,4 @@
+eclipse.preferences.version=1
+encoding//src/test/java=UTF-8
+encoding//src/test/resources=UTF-8
+encoding/=UTF-8
diff --git a/order/.settings/org.eclipse.jdt.core.prefs b/order/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..2f5cc74
--- /dev/null
+++ b/order/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled
+org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
+org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=ignore
+org.eclipse.jdt.core.compiler.release=disabled
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/order/.settings/org.eclipse.m2e.core.prefs b/order/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/order/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/order/README.md b/order/README.md
new file mode 100644
index 0000000..9fcb712
--- /dev/null
+++ b/order/README.md
@@ -0,0 +1,36 @@
+Chapter 3 - order
+----------------
+
+This directory holds examples related to converting messages that contain domain objects (in this case PurchaseOrder).
+
+### 3.3.2 - Transforming from XML to a POJO using JAXB
+
+This example can be run using:
+
+ mvn test -Dtest=PurchaseOrderJaxbTest
+
+### 3.4.2 - Using Camel’s CSV data format
+
+This example can be run using:
+
+ mvn test -Dtest=PurchaseOrderCsvTest
+ mvn test -Dtest=PurchaseOrderCsvSpringTest
+
+### 3.4.3 - Using Camel’s Bindy data format
+
+ This example can be run using:
+
+ mvn test –Dtest=PurchaseOrderBindyTest
+ mvn test –Dtest=PurchaseOrderUnmarshalBindyTest
+
+### 3.4.4 - Using Camel’s JSON data format
+
+ This example can be run using:
+
+ mvn test –Dtest=PurchaseOrderJSONTest
+
+### 3.5.1 - Using Apache Velocity
+
+ This example can be run using:
+
+ mvn test -Dtest=PurchaseOrderVelocityTest
diff --git a/order/pom.xml b/order/pom.xml
new file mode 100644
index 0000000..f75b670
--- /dev/null
+++ b/order/pom.xml
@@ -0,0 +1,104 @@
+
+
+ 4.0.0
+
+
+ com.camelinaction
+ chapter3
+ 2.0.0
+ ..
+
+
+ chapter3-order
+ Camel in Action 2 :: Chapter 3 :: Order Transformation
+
+
+
+
+
+ javax.xml.bind
+ jaxb-api
+ 2.3.1
+
+
+
+
+ org.apache.camel
+ camel-core
+
+
+
+ org.apache.camel
+ camel-spring
+
+
+
+
+ org.apache.camel
+ camel-jaxb
+
+
+
+
+ org.apache.camel
+ camel-csv
+
+
+
+
+ org.apache.camel
+ camel-bindy
+
+
+
+
+ org.apache.camel
+ camel-jackson
+
+
+
+
+ org.apache.camel
+ camel-jetty
+
+
+
+
+ org.apache.camel
+ camel-velocity
+
+
+
+ org.apache.camel
+ camel-test-spring
+ test
+
+
+
+ org.apache.camel
+ camel-http
+ test
+
+
+
+ log4j
+ log4j
+ test
+
+
+
+ org.slf4j
+ slf4j-log4j12
+ test
+
+
+
+ junit
+ junit
+ test
+
+
+
+
+
diff --git a/order/src/test/java/camelinaction/PurchaseOrder.java b/order/src/test/java/camelinaction/PurchaseOrder.java
new file mode 100644
index 0000000..66a2a30
--- /dev/null
+++ b/order/src/test/java/camelinaction/PurchaseOrder.java
@@ -0,0 +1,42 @@
+package camelinaction;
+
+import javax.xml.bind.annotation.XmlAccessType;
+import javax.xml.bind.annotation.XmlAccessorType;
+import javax.xml.bind.annotation.XmlAttribute;
+import javax.xml.bind.annotation.XmlRootElement;
+
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.FIELD)
+public class PurchaseOrder {
+ @XmlAttribute
+ private String name;
+ @XmlAttribute
+ private double price;
+ @XmlAttribute
+ private double amount;
+
+ public double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(double amount) {
+ this.amount = amount;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public double getPrice() {
+ return price;
+ }
+
+ public void setPrice(double price) {
+ this.price = price;
+ }
+
+}
diff --git a/order/src/test/java/camelinaction/PurchaseOrderCsvSpringTest.java b/order/src/test/java/camelinaction/PurchaseOrderCsvSpringTest.java
new file mode 100644
index 0000000..ffa9733
--- /dev/null
+++ b/order/src/test/java/camelinaction/PurchaseOrderCsvSpringTest.java
@@ -0,0 +1,36 @@
+package camelinaction;
+
+import java.util.List;
+
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Test;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class PurchaseOrderCsvSpringTest extends CamelSpringTestSupport {
+
+ @SuppressWarnings("unchecked")
+ @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("Camel in Action", line1.get(0));
+ assertEquals("6999", line1.get(1));
+ assertEquals("1", line1.get(2));
+
+ List line2 = mock.getReceivedExchanges().get(1).getIn().getBody(List.class);
+ assertEquals("Activemq in Action", line2.get(0));
+ assertEquals("4495", line2.get(1));
+ assertEquals("2", line2.get(2));
+ }
+
+ @Override
+ protected AbstractXmlApplicationContext createApplicationContext() {
+ return new ClassPathXmlApplicationContext("camelinaction/order-csv.xml");
+ }
+}
diff --git a/order/src/test/java/camelinaction/PurchaseOrderCsvTest.java b/order/src/test/java/camelinaction/PurchaseOrderCsvTest.java
new file mode 100644
index 0000000..98b1856
--- /dev/null
+++ b/order/src/test/java/camelinaction/PurchaseOrderCsvTest.java
@@ -0,0 +1,45 @@
+package camelinaction;
+
+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 PurchaseOrderCsvTest extends CamelTestSupport {
+
+ @SuppressWarnings("unchecked")
+ @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("Camel in Action", line1.get(0));
+ assertEquals("6999", line1.get(1));
+ assertEquals("1", line1.get(2));
+
+ List line2 = mock.getReceivedExchanges().get(1).getIn().getBody(List.class);
+ assertEquals("Activemq in Action", line2.get(0));
+ assertEquals("4495", line2.get(1));
+ assertEquals("2", line2.get(2));
+ }
+
+ @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=order.csv")
+ .unmarshal().csv()
+ .split(body())
+ .to("mock:queue.csv");
+ }
+ };
+ }
+}
diff --git a/order/src/test/java/camelinaction/PurchaseOrderJSONTest.java b/order/src/test/java/camelinaction/PurchaseOrderJSONTest.java
new file mode 100644
index 0000000..921fc3f
--- /dev/null
+++ b/order/src/test/java/camelinaction/PurchaseOrderJSONTest.java
@@ -0,0 +1,66 @@
+package camelinaction;
+
+import org.apache.camel.Header;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.impl.JndiRegistry;
+import org.apache.camel.model.dataformat.JsonLibrary;
+import org.apache.camel.test.junit4.CamelTestSupport;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Example how to use JSON data format with the camel-jackson component.
+ *
+ * We use camel-jetty to expose a HTTP service which returns the JSON response.
+ */
+public class PurchaseOrderJSONTest extends CamelTestSupport {
+
+ private static Logger LOG = LoggerFactory.getLogger(PurchaseOrderJSONTest.class);
+
+ @Override
+ protected JndiRegistry createRegistry() throws Exception {
+ // register our service bean in the Camel registry
+ JndiRegistry jndi = super.createRegistry();
+ jndi.bind("orderService", new OrderServiceBean());
+ return jndi;
+ }
+
+ @Test
+ public void testJSON() throws Exception {
+ String out = template.requestBody("jetty:http://localhost:8080/order/service?id=123", null, String.class);
+ LOG.info("Response from order service: " + out);
+
+ assertNotNull(out);
+ assertTrue(out.contains("Camel in Action"));
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("jetty://http://0.0.0.0:8080/order/service")
+ .bean("orderService", "lookup")
+ .marshal().json(JsonLibrary.Jackson);
+ }
+ };
+ }
+
+ public static class OrderServiceBean {
+
+ public PurchaseOrder lookup(@Header("id") String id) {
+ LOG.info("Finding purchase order for id " + id);
+ // just return a fixed response
+ PurchaseOrder order = new PurchaseOrder();
+ order.setPrice(69.99);
+ order.setAmount(1);
+ order.setName("Camel in Action");
+ return order;
+ }
+
+ }
+
+}
+
+
diff --git a/order/src/test/java/camelinaction/PurchaseOrderJaxbTest.java b/order/src/test/java/camelinaction/PurchaseOrderJaxbTest.java
new file mode 100644
index 0000000..b3357c7
--- /dev/null
+++ b/order/src/test/java/camelinaction/PurchaseOrderJaxbTest.java
@@ -0,0 +1,31 @@
+package camelinaction;
+
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Test;
+import org.springframework.context.support.AbstractXmlApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class PurchaseOrderJaxbTest extends CamelSpringTestSupport {
+
+ @Test
+ public void testJaxb() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:order");
+ mock.expectedMessageCount(1);
+ mock.message(0).body().isInstanceOf(PurchaseOrder.class);
+
+ PurchaseOrder order = new PurchaseOrder();
+ order.setName("Camel in Action");
+ order.setPrice(6999);
+ order.setAmount(1);
+
+ template.sendBody("direct:order", order);
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected AbstractXmlApplicationContext createApplicationContext() {
+ return new ClassPathXmlApplicationContext("camelinaction/order-jaxb.xml");
+ }
+}
diff --git a/order/src/test/java/camelinaction/PurchaseOrderVelocityTest.java b/order/src/test/java/camelinaction/PurchaseOrderVelocityTest.java
new file mode 100644
index 0000000..2a612d4
--- /dev/null
+++ b/order/src/test/java/camelinaction/PurchaseOrderVelocityTest.java
@@ -0,0 +1,43 @@
+package camelinaction;
+
+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 PurchaseOrderVelocityTest extends CamelTestSupport {
+
+ @Test
+ public void testVelocity() throws Exception {
+ MockEndpoint mock = getMockEndpoint("mock:mail");
+ mock.expectedMessageCount(1);
+ mock.message(0).header("Subject").isEqualTo("Thanks for ordering");
+ mock.message(0).header("From").isEqualTo("donotreply@riders.com");
+ mock.message(0).body().contains("Thank you for ordering 1.0 piece(s) of Camel in Action at a cost of 6999.0.");
+
+ PurchaseOrder order = new PurchaseOrder();
+ order.setName("Camel in Action");
+ order.setPrice(6999);
+ order.setAmount(1);
+
+ template.sendBody("direct:mail", order);
+
+ assertMockEndpointsSatisfied();
+ }
+
+ @Override
+ protected RouteBuilder createRouteBuilder() throws Exception {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("direct:mail")
+ .setHeader("Subject", constant("Thanks for ordering"))
+ .setHeader("From", constant("donotreply@riders.com"))
+ .to("velocity://camelinaction/mail.vm")
+ .to("log:mail")
+ .to("mock:mail");
+ }
+ };
+ }
+
+}
diff --git a/order/src/test/java/camelinaction/bindy/PurchaseOrder.java b/order/src/test/java/camelinaction/bindy/PurchaseOrder.java
new file mode 100644
index 0000000..563eaa7
--- /dev/null
+++ b/order/src/test/java/camelinaction/bindy/PurchaseOrder.java
@@ -0,0 +1,43 @@
+package camelinaction.bindy;
+
+import java.math.BigDecimal;
+
+import org.apache.camel.dataformat.bindy.annotation.CsvRecord;
+import org.apache.camel.dataformat.bindy.annotation.DataField;
+
+@CsvRecord(separator = ",", crlf = "UNIX")
+public class PurchaseOrder {
+
+ @DataField(pos = 1)
+ private String name;
+
+ @DataField(pos = 2, precision = 2)
+ private BigDecimal price;
+
+ @DataField(pos = 3)
+ private int amount;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public BigDecimal getPrice() {
+ return price;
+ }
+
+ public void setPrice(BigDecimal price) {
+ this.price = price;
+ }
+
+ public int getAmount() {
+ return amount;
+ }
+
+ public void setAmount(int amount) {
+ this.amount = amount;
+ }
+}
diff --git a/order/src/test/java/camelinaction/bindy/PurchaseOrderBindyTest.java b/order/src/test/java/camelinaction/bindy/PurchaseOrderBindyTest.java
new file mode 100644
index 0000000..8d2b70f
--- /dev/null
+++ b/order/src/test/java/camelinaction/bindy/PurchaseOrderBindyTest.java
@@ -0,0 +1,64 @@
+package camelinaction.bindy;
+
+import java.math.BigDecimal;
+import java.util.Locale;
+
+import junit.framework.TestCase;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.dataformat.BindyType;
+import org.junit.Test;
+
+public class PurchaseOrderBindyTest extends TestCase {
+
+ private Locale locale;
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ // use US locale for testing so we use dot as decimal in the price
+ locale = Locale.getDefault();
+ Locale.setDefault(Locale.US);
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ // restore back
+ Locale.setDefault(locale);
+ }
+
+ @Test
+ public void testBindy() throws Exception {
+ CamelContext context = new DefaultCamelContext();
+ context.addRoutes(createRoute());
+ context.start();
+
+ MockEndpoint mock = context.getEndpoint("mock:result", MockEndpoint.class);
+ mock.expectedBodiesReceived("Camel in Action,69.99,1\n");
+
+ PurchaseOrder order = new PurchaseOrder();
+ order.setAmount(1);
+ order.setPrice(new BigDecimal("69.99"));
+ order.setName("Camel in Action");
+
+ ProducerTemplate template = context.createProducerTemplate();
+ template.sendBody("direct:toCsv", order);
+
+ mock.assertIsSatisfied();
+ }
+
+ public RouteBuilder createRoute() {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+ from("direct:toCsv")
+ .marshal().bindy(BindyType.Csv, camelinaction.bindy.PurchaseOrder.class)
+ .to("mock:result");
+ }
+ };
+ }
+
+}
diff --git a/order/src/test/java/camelinaction/bindy/PurchaseOrderUnmarshalBindyTest.java b/order/src/test/java/camelinaction/bindy/PurchaseOrderUnmarshalBindyTest.java
new file mode 100644
index 0000000..0769159
--- /dev/null
+++ b/order/src/test/java/camelinaction/bindy/PurchaseOrderUnmarshalBindyTest.java
@@ -0,0 +1,84 @@
+package camelinaction.bindy;
+
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.TestCase;
+import org.apache.camel.CamelContext;
+import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.component.mock.MockEndpoint;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.model.dataformat.BindyType;
+import org.junit.Test;
+
+/**
+ * Test that demonstrates how to turn a CSV into a Object using bindy
+ */
+public class PurchaseOrderUnmarshalBindyTest extends TestCase {
+
+ @Test
+ public void testUnmarshalBindyMultipleRows() throws Exception {
+ CamelContext context = new DefaultCamelContext();
+ context.addRoutes(createRoute());
+ context.start();
+
+ MockEndpoint mock = context.getEndpoint("mock:result", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+
+ ProducerTemplate template = context.createProducerTemplate();
+ template.sendBody("direct:toObject", "Camel in Action,39.95,1\nActiveMQ in Action,39.95,1");
+
+ mock.assertIsSatisfied();
+
+ // bindy now turned that into a list of rows so we need to grab the order from the list
+ List rows = mock.getReceivedExchanges().get(0).getIn().getBody(List.class);
+ PurchaseOrder order = (PurchaseOrder) rows.get(0);
+ assertNotNull(order);
+ PurchaseOrder order2 = (PurchaseOrder) rows.get(1);
+ assertNotNull(order2);
+
+ // assert the order contains the expected data
+ assertEquals("Camel in Action", order.getName());
+ assertEquals("39.95", order.getPrice().toString());
+ assertEquals(1, order.getAmount());
+ assertEquals("ActiveMQ in Action", order2.getName());
+ assertEquals("39.95", order2.getPrice().toString());
+ assertEquals(1, order2.getAmount());
+ }
+
+ @Test
+ public void testUnmarshalBindy() throws Exception {
+ CamelContext context = new DefaultCamelContext();
+ context.addRoutes(createRoute());
+ context.start();
+
+ MockEndpoint mock = context.getEndpoint("mock:result", MockEndpoint.class);
+ mock.expectedMessageCount(1);
+
+ ProducerTemplate template = context.createProducerTemplate();
+ template.sendBody("direct:toObject", "Camel in Action,39.95,1");
+
+ mock.assertIsSatisfied();
+
+ // bindy returns the order directly (not in a list) if there is only one element
+ PurchaseOrder order = mock.getReceivedExchanges().get(0).getIn().getBody(PurchaseOrder.class);
+ assertNotNull(order);
+
+ // assert the order contains the expected data
+ assertEquals("Camel in Action", order.getName());
+ assertEquals("39.95", order.getPrice().toString());
+ assertEquals(1, order.getAmount());
+ }
+
+ public RouteBuilder createRoute() {
+ return new RouteBuilder() {
+ public void configure() throws Exception {
+ from("direct:toObject")
+ .unmarshal().bindy(BindyType.Csv, camelinaction.bindy.PurchaseOrder.class)
+ .to("mock:result");
+ }
+ };
+ }
+
+}
diff --git a/order/src/test/resources/camelinaction/jaxb.index b/order/src/test/resources/camelinaction/jaxb.index
new file mode 100644
index 0000000..7349d1b
--- /dev/null
+++ b/order/src/test/resources/camelinaction/jaxb.index
@@ -0,0 +1 @@
+PurchaseOrder
\ No newline at end of file
diff --git a/order/src/test/resources/camelinaction/mail.vm b/order/src/test/resources/camelinaction/mail.vm
new file mode 100644
index 0000000..555718c
--- /dev/null
+++ b/order/src/test/resources/camelinaction/mail.vm
@@ -0,0 +1,5 @@
+Dear customer
+
+Thank you for ordering ${body.amount} piece(s) of ${body.name} at a cost of ${body.price}.
+
+This is an automated email, please do not reply.
\ No newline at end of file
diff --git a/order/src/test/resources/camelinaction/order-csv.xml b/order/src/test/resources/camelinaction/order-csv.xml
new file mode 100644
index 0000000..e058717
--- /dev/null
+++ b/order/src/test/resources/camelinaction/order-csv.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+ body
+
+
+
+
+
+
+
diff --git a/order/src/test/resources/camelinaction/order-jaxb.xml b/order/src/test/resources/camelinaction/order-jaxb.xml
new file mode 100644
index 0000000..fbd80e4
--- /dev/null
+++ b/order/src/test/resources/camelinaction/order-jaxb.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/order/src/test/resources/log4j.properties b/order/src/test/resources/log4j.properties
new file mode 100644
index 0000000..b0c9b1f
--- /dev/null
+++ b/order/src/test/resources/log4j.properties
@@ -0,0 +1,12 @@
+#
+# The logging properties used during tests..
+#
+log4j.rootLogger=INFO, out
+
+#log4j.logger.org.apache.camel=DEBUG
+
+# CONSOLE appender not used by default
+log4j.appender.out=org.apache.log4j.ConsoleAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
diff --git a/order/src/test/resources/order.csv b/order/src/test/resources/order.csv
new file mode 100644
index 0000000..afb8ce2
--- /dev/null
+++ b/order/src/test/resources/order.csv
@@ -0,0 +1,2 @@
+Camel in Action,6999,1
+Activemq in Action,4495,2
diff --git a/order/target/chapter3-order-2.0.0.jar b/order/target/chapter3-order-2.0.0.jar
new file mode 100644
index 0000000..286b982
Binary files /dev/null and b/order/target/chapter3-order-2.0.0.jar differ
diff --git a/order/target/maven-archiver/pom.properties b/order/target/maven-archiver/pom.properties
new file mode 100644
index 0000000..94a84af
--- /dev/null
+++ b/order/target/maven-archiver/pom.properties
@@ -0,0 +1,5 @@
+#Generated by Apache Maven
+#Sat Mar 27 12:36:03 IST 2021
+groupId=com.camelinaction
+artifactId=chapter3-order
+version=2.0.0
diff --git a/order/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/order/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
new file mode 100644
index 0000000..53403b6
--- /dev/null
+++ b/order/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst
@@ -0,0 +1,15 @@
+camelinaction\PurchaseOrderJSONTest$1.class
+camelinaction\PurchaseOrderJSONTest$OrderServiceBean.class
+camelinaction\PurchaseOrderJSONTest.class
+camelinaction\bindy\PurchaseOrderBindyTest.class
+camelinaction\bindy\PurchaseOrderUnmarshalBindyTest$1.class
+camelinaction\PurchaseOrder.class
+camelinaction\PurchaseOrderCsvSpringTest.class
+camelinaction\PurchaseOrderCsvTest$1.class
+camelinaction\PurchaseOrderVelocityTest$1.class
+camelinaction\bindy\PurchaseOrder.class
+camelinaction\bindy\PurchaseOrderBindyTest$1.class
+camelinaction\bindy\PurchaseOrderUnmarshalBindyTest.class
+camelinaction\PurchaseOrderVelocityTest.class
+camelinaction\PurchaseOrderCsvTest.class
+camelinaction\PurchaseOrderJaxbTest.class
diff --git a/order/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/order/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
new file mode 100644
index 0000000..2fa44bd
--- /dev/null
+++ b/order/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst
@@ -0,0 +1,9 @@
+G:\Project\FuseTraining\Projects\FusePOC\camelinaction2-master\chapter3\order\src\test\java\camelinaction\PurchaseOrderJaxbTest.java
+G:\Project\FuseTraining\Projects\FusePOC\camelinaction2-master\chapter3\order\src\test\java\camelinaction\PurchaseOrderCsvSpringTest.java
+G:\Project\FuseTraining\Projects\FusePOC\camelinaction2-master\chapter3\order\src\test\java\camelinaction\bindy\PurchaseOrderBindyTest.java
+G:\Project\FuseTraining\Projects\FusePOC\camelinaction2-master\chapter3\order\src\test\java\camelinaction\bindy\PurchaseOrder.java
+G:\Project\FuseTraining\Projects\FusePOC\camelinaction2-master\chapter3\order\src\test\java\camelinaction\PurchaseOrder.java
+G:\Project\FuseTraining\Projects\FusePOC\camelinaction2-master\chapter3\order\src\test\java\camelinaction\PurchaseOrderJSONTest.java
+G:\Project\FuseTraining\Projects\FusePOC\camelinaction2-master\chapter3\order\src\test\java\camelinaction\bindy\PurchaseOrderUnmarshalBindyTest.java
+G:\Project\FuseTraining\Projects\FusePOC\camelinaction2-master\chapter3\order\src\test\java\camelinaction\PurchaseOrderCsvTest.java
+G:\Project\FuseTraining\Projects\FusePOC\camelinaction2-master\chapter3\order\src\test\java\camelinaction\PurchaseOrderVelocityTest.java
diff --git a/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderCsvSpringTest.xml b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderCsvSpringTest.xml
new file mode 100644
index 0000000..3614303
--- /dev/null
+++ b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderCsvSpringTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderCsvTest.xml b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderCsvTest.xml
new file mode 100644
index 0000000..54cc01e
--- /dev/null
+++ b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderCsvTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderJSONTest.xml b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderJSONTest.xml
new file mode 100644
index 0000000..224b81c
--- /dev/null
+++ b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderJSONTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderJaxbTest.xml b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderJaxbTest.xml
new file mode 100644
index 0000000..945e88b
--- /dev/null
+++ b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderJaxbTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderVelocityTest.xml b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderVelocityTest.xml
new file mode 100644
index 0000000..33c53dc
--- /dev/null
+++ b/order/target/surefire-reports/TEST-camelinaction.PurchaseOrderVelocityTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/order/target/surefire-reports/TEST-camelinaction.bindy.PurchaseOrderBindyTest.xml b/order/target/surefire-reports/TEST-camelinaction.bindy.PurchaseOrderBindyTest.xml
new file mode 100644
index 0000000..d960e95
--- /dev/null
+++ b/order/target/surefire-reports/TEST-camelinaction.bindy.PurchaseOrderBindyTest.xml
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/order/target/surefire-reports/TEST-camelinaction.bindy.PurchaseOrderUnmarshalBindyTest.xml b/order/target/surefire-reports/TEST-camelinaction.bindy.PurchaseOrderUnmarshalBindyTest.xml
new file mode 100644
index 0000000..1904180
--- /dev/null
+++ b/order/target/surefire-reports/TEST-camelinaction.bindy.PurchaseOrderUnmarshalBindyTest.xml
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/order/target/surefire-reports/camelinaction.PurchaseOrderCsvSpringTest.txt b/order/target/surefire-reports/camelinaction.PurchaseOrderCsvSpringTest.txt
new file mode 100644
index 0000000..b8f3205
--- /dev/null
+++ b/order/target/surefire-reports/camelinaction.PurchaseOrderCsvSpringTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: camelinaction.PurchaseOrderCsvSpringTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 4.538 sec - in camelinaction.PurchaseOrderCsvSpringTest
diff --git a/order/target/surefire-reports/camelinaction.PurchaseOrderCsvTest.txt b/order/target/surefire-reports/camelinaction.PurchaseOrderCsvTest.txt
new file mode 100644
index 0000000..91d89a1
--- /dev/null
+++ b/order/target/surefire-reports/camelinaction.PurchaseOrderCsvTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: camelinaction.PurchaseOrderCsvTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.1 sec - in camelinaction.PurchaseOrderCsvTest
diff --git a/order/target/surefire-reports/camelinaction.PurchaseOrderJSONTest.txt b/order/target/surefire-reports/camelinaction.PurchaseOrderJSONTest.txt
new file mode 100644
index 0000000..eca5125
--- /dev/null
+++ b/order/target/surefire-reports/camelinaction.PurchaseOrderJSONTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: camelinaction.PurchaseOrderJSONTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.276 sec - in camelinaction.PurchaseOrderJSONTest
diff --git a/order/target/surefire-reports/camelinaction.PurchaseOrderJaxbTest.txt b/order/target/surefire-reports/camelinaction.PurchaseOrderJaxbTest.txt
new file mode 100644
index 0000000..21d776f
--- /dev/null
+++ b/order/target/surefire-reports/camelinaction.PurchaseOrderJaxbTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: camelinaction.PurchaseOrderJaxbTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.795 sec - in camelinaction.PurchaseOrderJaxbTest
diff --git a/order/target/surefire-reports/camelinaction.PurchaseOrderVelocityTest.txt b/order/target/surefire-reports/camelinaction.PurchaseOrderVelocityTest.txt
new file mode 100644
index 0000000..8c8f2fd
--- /dev/null
+++ b/order/target/surefire-reports/camelinaction.PurchaseOrderVelocityTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: camelinaction.PurchaseOrderVelocityTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.546 sec - in camelinaction.PurchaseOrderVelocityTest
diff --git a/order/target/surefire-reports/camelinaction.bindy.PurchaseOrderBindyTest.txt b/order/target/surefire-reports/camelinaction.bindy.PurchaseOrderBindyTest.txt
new file mode 100644
index 0000000..233f77d
--- /dev/null
+++ b/order/target/surefire-reports/camelinaction.bindy.PurchaseOrderBindyTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: camelinaction.bindy.PurchaseOrderBindyTest
+-------------------------------------------------------------------------------
+Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.701 sec - in camelinaction.bindy.PurchaseOrderBindyTest
diff --git a/order/target/surefire-reports/camelinaction.bindy.PurchaseOrderUnmarshalBindyTest.txt b/order/target/surefire-reports/camelinaction.bindy.PurchaseOrderUnmarshalBindyTest.txt
new file mode 100644
index 0000000..9c8d02a
--- /dev/null
+++ b/order/target/surefire-reports/camelinaction.bindy.PurchaseOrderUnmarshalBindyTest.txt
@@ -0,0 +1,4 @@
+-------------------------------------------------------------------------------
+Test set: camelinaction.bindy.PurchaseOrderUnmarshalBindyTest
+-------------------------------------------------------------------------------
+Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.325 sec - in camelinaction.bindy.PurchaseOrderUnmarshalBindyTest
diff --git a/order/target/test-classes/camelinaction/PurchaseOrder.class b/order/target/test-classes/camelinaction/PurchaseOrder.class
new file mode 100644
index 0000000..b88ab2c
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrder.class differ
diff --git a/order/target/test-classes/camelinaction/PurchaseOrderCsvSpringTest.class b/order/target/test-classes/camelinaction/PurchaseOrderCsvSpringTest.class
new file mode 100644
index 0000000..b6677a9
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrderCsvSpringTest.class differ
diff --git a/order/target/test-classes/camelinaction/PurchaseOrderCsvTest$1.class b/order/target/test-classes/camelinaction/PurchaseOrderCsvTest$1.class
new file mode 100644
index 0000000..139d97d
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrderCsvTest$1.class differ
diff --git a/order/target/test-classes/camelinaction/PurchaseOrderCsvTest.class b/order/target/test-classes/camelinaction/PurchaseOrderCsvTest.class
new file mode 100644
index 0000000..3f2d06d
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrderCsvTest.class differ
diff --git a/order/target/test-classes/camelinaction/PurchaseOrderJSONTest$1.class b/order/target/test-classes/camelinaction/PurchaseOrderJSONTest$1.class
new file mode 100644
index 0000000..5e3ef01
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrderJSONTest$1.class differ
diff --git a/order/target/test-classes/camelinaction/PurchaseOrderJSONTest$OrderServiceBean.class b/order/target/test-classes/camelinaction/PurchaseOrderJSONTest$OrderServiceBean.class
new file mode 100644
index 0000000..2e905fb
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrderJSONTest$OrderServiceBean.class differ
diff --git a/order/target/test-classes/camelinaction/PurchaseOrderJSONTest.class b/order/target/test-classes/camelinaction/PurchaseOrderJSONTest.class
new file mode 100644
index 0000000..5a0e58e
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrderJSONTest.class differ
diff --git a/order/target/test-classes/camelinaction/PurchaseOrderJaxbTest.class b/order/target/test-classes/camelinaction/PurchaseOrderJaxbTest.class
new file mode 100644
index 0000000..4ced681
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrderJaxbTest.class differ
diff --git a/order/target/test-classes/camelinaction/PurchaseOrderVelocityTest$1.class b/order/target/test-classes/camelinaction/PurchaseOrderVelocityTest$1.class
new file mode 100644
index 0000000..953579b
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrderVelocityTest$1.class differ
diff --git a/order/target/test-classes/camelinaction/PurchaseOrderVelocityTest.class b/order/target/test-classes/camelinaction/PurchaseOrderVelocityTest.class
new file mode 100644
index 0000000..d1810f2
Binary files /dev/null and b/order/target/test-classes/camelinaction/PurchaseOrderVelocityTest.class differ
diff --git a/order/target/test-classes/camelinaction/bindy/PurchaseOrder.class b/order/target/test-classes/camelinaction/bindy/PurchaseOrder.class
new file mode 100644
index 0000000..e515247
Binary files /dev/null and b/order/target/test-classes/camelinaction/bindy/PurchaseOrder.class differ
diff --git a/order/target/test-classes/camelinaction/bindy/PurchaseOrderBindyTest$1.class b/order/target/test-classes/camelinaction/bindy/PurchaseOrderBindyTest$1.class
new file mode 100644
index 0000000..9377b55
Binary files /dev/null and b/order/target/test-classes/camelinaction/bindy/PurchaseOrderBindyTest$1.class differ
diff --git a/order/target/test-classes/camelinaction/bindy/PurchaseOrderBindyTest.class b/order/target/test-classes/camelinaction/bindy/PurchaseOrderBindyTest.class
new file mode 100644
index 0000000..a0c1b27
Binary files /dev/null and b/order/target/test-classes/camelinaction/bindy/PurchaseOrderBindyTest.class differ
diff --git a/order/target/test-classes/camelinaction/bindy/PurchaseOrderUnmarshalBindyTest$1.class b/order/target/test-classes/camelinaction/bindy/PurchaseOrderUnmarshalBindyTest$1.class
new file mode 100644
index 0000000..5615d01
Binary files /dev/null and b/order/target/test-classes/camelinaction/bindy/PurchaseOrderUnmarshalBindyTest$1.class differ
diff --git a/order/target/test-classes/camelinaction/bindy/PurchaseOrderUnmarshalBindyTest.class b/order/target/test-classes/camelinaction/bindy/PurchaseOrderUnmarshalBindyTest.class
new file mode 100644
index 0000000..9b82cce
Binary files /dev/null and b/order/target/test-classes/camelinaction/bindy/PurchaseOrderUnmarshalBindyTest.class differ
diff --git a/order/target/test-classes/camelinaction/jaxb.index b/order/target/test-classes/camelinaction/jaxb.index
new file mode 100644
index 0000000..7349d1b
--- /dev/null
+++ b/order/target/test-classes/camelinaction/jaxb.index
@@ -0,0 +1 @@
+PurchaseOrder
\ No newline at end of file
diff --git a/order/target/test-classes/camelinaction/mail.vm b/order/target/test-classes/camelinaction/mail.vm
new file mode 100644
index 0000000..555718c
--- /dev/null
+++ b/order/target/test-classes/camelinaction/mail.vm
@@ -0,0 +1,5 @@
+Dear customer
+
+Thank you for ordering ${body.amount} piece(s) of ${body.name} at a cost of ${body.price}.
+
+This is an automated email, please do not reply.
\ No newline at end of file
diff --git a/order/target/test-classes/camelinaction/order-csv.xml b/order/target/test-classes/camelinaction/order-csv.xml
new file mode 100644
index 0000000..e058717
--- /dev/null
+++ b/order/target/test-classes/camelinaction/order-csv.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+ body
+
+
+
+
+
+
+
diff --git a/order/target/test-classes/camelinaction/order-jaxb.xml b/order/target/test-classes/camelinaction/order-jaxb.xml
new file mode 100644
index 0000000..fbd80e4
--- /dev/null
+++ b/order/target/test-classes/camelinaction/order-jaxb.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/order/target/test-classes/log4j.properties b/order/target/test-classes/log4j.properties
new file mode 100644
index 0000000..b0c9b1f
--- /dev/null
+++ b/order/target/test-classes/log4j.properties
@@ -0,0 +1,12 @@
+#
+# The logging properties used during tests..
+#
+log4j.rootLogger=INFO, out
+
+#log4j.logger.org.apache.camel=DEBUG
+
+# CONSOLE appender not used by default
+log4j.appender.out=org.apache.log4j.ConsoleAppender
+log4j.appender.out.layout=org.apache.log4j.PatternLayout
+log4j.appender.out.layout.ConversionPattern=%d [%-15.15t] %-5p %-30.30c{1} - %m%n
+
diff --git a/order/target/test-classes/order.csv b/order/target/test-classes/order.csv
new file mode 100644
index 0000000..afb8ce2
--- /dev/null
+++ b/order/target/test-classes/order.csv
@@ -0,0 +1,2 @@
+Camel in Action,6999,1
+Activemq in Action,4495,2