Author: buildbot
Date: Fri Aug 7 10:20:07 2015
New Revision: 961046
Log:
Production update by buildbot for camel
Modified:
websites/production/camel/content/bindy.html
websites/production/camel/content/book-dataformat-appendix.html
websites/production/camel/content/book-in-one-page.html
websites/production/camel/content/cache/main.pageCache
Modified: websites/production/camel/content/bindy.html
==============================================================================
--- websites/production/camel/content/bindy.html (original)
+++ websites/production/camel/content/bindy.html Fri Aug 7 10:20:07 2015
@@ -84,7 +84,7 @@
<tbody>
<tr>
<td valign="top" width="100%">
-<div class="wiki-content maincontent"><h2 id="Bindy-Bindy">Bindy</h2><p>The
goal of this component is to allow the parsing/binding of non-structured data
(or to be more precise non-XML data)<br clear="none"> to/from Java Beans that
have binding mappings defined with annotations. Using Bindy, you can bind data
from sources such as :</p><ul class="alternate"><li>CSV
records,</li><li>Fixed-length records,</li><li>FIX messages,</li><li>or almost
any other non-structured data</li></ul><p>to one or many Plain Old Java Object
(POJO). Bindy converts the data according to the type of the java property.
POJOs can be linked together with one-to-many relationships available in some
cases. Moreover, for data type like Date, Double, Float, Integer, Short, Long
and BigDecimal, you can provide the pattern to apply during the formatting of
the property.</p><p>For the BigDecimal numbers, you can also define the
precision and the decimal or grouping separators.</p><div
class="table-wrap"><table class=
"confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Format Type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Pattern example</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Link</p></th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Date</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>DateFormat</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>"dd-MM-yyyy"</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><a shape="rect" class="external-link"
href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html"
rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Decimal*</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Decimalformat</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>
"##.###.###"</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><a
shape="rect" class="external-link"
href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html"
rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html</a></p></td></tr></tbody></table></div><p>Decimal*
= Double, Integer, Float, Short, Long</p><div
class="confluence-information-macro confluence-information-macro-note"><p
class="title">Format supported</p><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>This first release only support
comma separated values fields and key value pair fields (e.g. : FIX
messages).</p></div></div><p>To work with camel-bindy, you must first define
your model in a package (e.g. com.acme.model) and for each model class (e.g.
Order, Client, Instrument, ...) add the required annotations (described
hereafter) to the Class or field.</p><div cla
ss="confluence-information-macro confluence-information-macro-note"><p
class="title">Multiple models</p><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>If you use multiple models, each
model has to be placed in it's own package to prevent unpredictable
results.</p></div></div><h2 id="Bindy-Annotations">Annotations</h2><p>The
annotations created allow to map different concept of your model to the POJO
like :</p><ul class="alternate"><li>Type of record (csv, key value pair (e.g.
FIX message), fixed length ...),</li><li>Link (to link object in another
object),</li><li>DataField and their properties (int, type,
...),</li><li>KeyValuePairField (for key = value format like we have in FIX
financial messages),</li><li>Section (to identify header, body and footer
section),</li><li>OneToMany</li></ul><p>This section will describe them
:</p><h3 id="Bindy-1.CsvRecord">1. CsvRecord</h3><p>The Cs
vRecord annotation is used to identified the root class of the model. It
represents a record = a line of a CSV file and can be linked to several
children model classes.</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Annotation name</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Record type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Level</p></th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>CsvRecord</strong></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>csv</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>Class</p></td></tr></tbody></table></div><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh"><p>Parameter name</p></th><th colspan="1"
rowspan="1" class="confluenceTh"><p>type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Info</p></th></tr><tr><td colspan=
"1" rowspan="1" class="confluenceTd"><p>separator</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>string</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>mandatory - can be ',' or ';' or 'anything'. This value
is interpreted as a regular expression. If you want to use a sign which has a
special meaning in regular expressions, e.g. the '|' sign, than you have to
mask it, like ' <br clear="none" class="atl-forced-newline">
|'</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>skipFirstLine</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - allow to skip the
first line of the CSV file</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>crlf</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>string</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - possible values = WINDOWS,UNIX,MAC, or cust
om; default value = WINDOWS - allow to define the carriage return character to
use. If you specify a value other than the three listed before, the value you
enter (custom) will be used as the CRLF character(s)</p></td></tr><tr><td
colspan="1" rowspan="1"
class="confluenceTd"><p>generateHeaderColumns</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - uses to generate the
header columns of the CSV generates</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>autospanLine</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Camel 2.13/2.12.2:</strong> optional - default
value = false - if enabled then the last column is auto spanned to end of line,
for example if its a comment, etc this allows the line to contain all
characters, also the delimiter char.</p></td></tr><tr><td col
span="1" rowspan="1" class="confluenceTd"><p>isOrdered</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - allow to change the
order of the fields when CSV is generated</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>quote</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>String</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Camel 2.8.3/2.9:</strong> option - allow to
specify a quote character of the fields when CSV is
generated</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>This annotation is associated to the root class of the
model and must be declared one time.</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd">quoting</td><td colspan="1" rowspan="1"
class="confluenceTd">boolean</td><td colspan="1" rowspan="1"
class="confluenceTd"><strong>Camel 2.11:</strong>optional - default value =
false - Indicate if the values must be quoted when marshaling when CSV is
generated.</td></tr></tbody></table></div><p><strong>case 1 : separator =
','</strong></p><p>The separator used to segregate the fields in the CSV record
is ',' :</p><p>10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500,
USD,08-01-2009</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
+<div class="wiki-content maincontent"><h2 id="Bindy-Bindy">Bindy</h2><p>The
goal of this component is to allow the parsing/binding of non-structured data
(or to be more precise non-XML data)<br clear="none"> to/from Java Beans that
have binding mappings defined with annotations. Using Bindy, you can bind data
from sources such as :</p><ul class="alternate"><li>CSV
records,</li><li>Fixed-length records,</li><li>FIX messages,</li><li>or almost
any other non-structured data</li></ul><p>to one or many Plain Old Java Object
(POJO). Bindy converts the data according to the type of the java property.
POJOs can be linked together with one-to-many relationships available in some
cases. Moreover, for data type like Date, Double, Float, Integer, Short, Long
and BigDecimal, you can provide the pattern to apply during the formatting of
the property.</p><p>For the BigDecimal numbers, you can also define the
precision and the decimal or grouping separators.</p><div
class="table-wrap"><table class=
"confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Format Type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Pattern example</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Link</p></th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>Date</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>DateFormat</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>"dd-MM-yyyy"</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><a shape="rect" class="external-link"
href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html"
rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Decimal*</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Decimalformat</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>
"##.###.###"</p></td><td colspan="1" rowspan="1" class="confluenceTd"><p><a
shape="rect" class="external-link"
href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html"
rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html</a></p></td></tr></tbody></table></div><p>Decimal*
= Double, Integer, Float, Short, Long</p><div
class="confluence-information-macro confluence-information-macro-note"><p
class="title">Format supported</p><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>This first release only support
comma separated values fields and key value pair fields (e.g. : FIX
messages).</p></div></div><p>To work with camel-bindy, you must first define
your model in a package (e.g. com.acme.model) and for each model class (e.g.
Order, Client, Instrument, ...) add the required annotations (described
hereafter) to the Class or field.</p><div cla
ss="confluence-information-macro confluence-information-macro-note"><p
class="title">Multiple models</p><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>If you use multiple models, each
model has to be placed in it's own package to prevent unpredictable
results.</p><p>From <strong>Camel 2.16</strong> onwards this is no longer the
case, as you can safely have multiple models in the same package, as you
configure bindy using class names instead of package names
now.</p></div></div><h2 id="Bindy-Annotations">Annotations</h2><p>The
annotations created allow to map different concept of your model to the POJO
like :</p><ul class="alternate"><li>Type of record (csv, key value pair (e.g.
FIX message), fixed length ...),</li><li>Link (to link object in another
object),</li><li>DataField and their properties (int, type,
...),</li><li>KeyValuePairField (for key = value format like we have in FI
X financial messages),</li><li>Section (to identify header, body and footer
section),</li><li>OneToMany</li></ul><p>This section will describe them
:</p><h3 id="Bindy-1.CsvRecord">1. CsvRecord</h3><p>The CsvRecord annotation is
used to identified the root class of the model. It represents a record = a line
of a CSV file and can be linked to several children model classes.</p><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh"><p>Annotation name</p></th><th colspan="1"
rowspan="1" class="confluenceTh"><p>Record type</p></th><th colspan="1"
rowspan="1" class="confluenceTh"><p>Level</p></th></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p><strong>CsvRecord</strong></p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>csv</p></td><td colspan="1"
rowspan="1"
class="confluenceTd"><p>Class</p></td></tr></tbody></table></div><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rows
pan="1" class="confluenceTh"><p>Parameter name</p></th><th colspan="1"
rowspan="1" class="confluenceTh"><p>type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Info</p></th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>separator</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>string</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>mandatory - can be ',' or ';' or 'anything'. This value
is interpreted as a regular expression. If you want to use a sign which has a
special meaning in regular expressions, e.g. the '|' sign, than you have to
mask it, like ' <br clear="none" class="atl-forced-newline">
|'</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>skipFirstLine</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - allow to skip the
first line of the CSV file</p></td></tr><tr><td colspan="1" rowspan="1" clas
s="confluenceTd"><p>crlf</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>string</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - possible values = WINDOWS,UNIX,MAC, or
custom; default value = WINDOWS - allow to define the carriage return character
to use. If you specify a value other than the three listed before, the value
you enter (custom) will be used as the CRLF character(s)</p></td></tr><tr><td
colspan="1" rowspan="1"
class="confluenceTd"><p>generateHeaderColumns</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - uses to generate the
header columns of the CSV generates</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>autospanLine</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Camel 2.13/2.12.2:</strong> optional - default
value
= false - if enabled then the last column is auto spanned to end of line, for
example if its a comment, etc this allows the line to contain all characters,
also the delimiter char.</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>isOrdered</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - allow to change the
order of the fields when CSV is generated</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>quote</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>String</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Camel 2.8.3/2.9:</strong> option - allow to
specify a quote character of the fields when CSV is
generated</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1"
class="confluenc
eTd"><p>This annotation is associated to the root class of the model and must
be declared one time.</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd">quoting</td><td colspan="1" rowspan="1"
class="confluenceTd">boolean</td><td colspan="1" rowspan="1"
class="confluenceTd"><strong>Camel 2.11:</strong>optional - default value =
false - Indicate if the values must be quoted when marshaling when CSV is
generated.</td></tr></tbody></table></div><p><strong>case 1 : separator =
','</strong></p><p>The separator used to segregate the fields in the CSV record
is ',' :</p><p>10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500,
USD,08-01-2009</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[@CsvRecord( separator = "," )
public Class Order {
...
@@ -754,18 +754,32 @@ public class Security {
]]></script>
</div></div><h3 id="Bindy-UsingtheJavaDSL">Using the Java DSL</h3><p>The next
step consists in instantiating the DataFormat <em>bindy</em> class associated
with this record type and providing Java package name(s) as
parameter.</p><p>For example the following uses the class
<code>BindyCsvDataFormat</code> (who correspond to the class associated with
the CSV record type) which is configured with "com.acme.model"<br clear="none">
package name to initialize the model objects configured in this
package.</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[DataFormat bindy = new
BindyCsvDataFormat("com.acme.model");
-]]></script>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// Camel 2.15 or older (configure by package
name)
+DataFormat bindy = new BindyCsvDataFormat("com.acme.model");
+
+?
+// Camel 2.16 onwards (configure by class name)
+DataFormat bindy = new
BindyCsvDataFormat(com.acme.model.MyModel.class);]]></script>
</div></div><h4 id="Bindy-Settinglocale">Setting locale</h4><p>Bindy supports
configuring the locale on the dataformat, such as </p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[BindyCsvDataFormat bindy = new
BindyCsvDataFormat("com.acme.model");
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// Camel 2.15 or older (configure by package
name)
+BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model");
+// Camel 2.16 onwards (configure by class name)
+BindyCsvDataFormat bindy = new
BindyCsvDataFormat(com.acme.model.MyModel.class);
bindy.setLocale("us");]]></script>
</div></div><p>Or to use the platform default locale then use "default" as the
locale name. Notice this requires Camel 2.14/2.13.3/2.12.5.</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[BindyCsvDataFormat bindy = new
BindyCsvDataFormat("com.acme.model");
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// Camel 2.15 or older (configure by package
name)
+BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model");
+// Camel 2.16 onwards (configure by class name)
+BindyCsvDataFormat bindy = new
BindyCsvDataFormat(com.acme.model.MyModel.class);
bindy.setLocale("default");]]></script>
</div></div><p>for older releases you can set it using Java code as
shown</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[BindyCsvDataFormat bindy = new
BindyCsvDataFormat("com.acme.model");
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// Camel 2.15 or older (configure by package
name)
+BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model");
+// Camel 2.16 onwards (configure by class name)
+BindyCsvDataFormat bindy = new
BindyCsvDataFormat(com.acme.model.MyModel.class);
+
bindy.setLocale(Locale.getDefault().getISO3Country());]]></script>
</div></div><h4 id="Bindy-Unmarshaling">Unmarshaling</h4><div class="code
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
@@ -811,161 +825,7 @@ bindy.setLocale(Locale.getDefault().getI
.marshal(bindy)
.to("file://outbox")
]]></script>
-</div></div><h3 id="Bindy-Unittest">Unit test</h3><p>Here is two examples
showing how to marshall or unmarshall a CSV file with Camel</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>Marshall</b></div><div class="codeContent
panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[package org.apache.camel.dataformat.bindy.csv;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.Produce;
-import org.apache.camel.ProducerTemplate;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import
org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink.Client;
-import
org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink.Order;
-import org.apache.camel.spring.javaconfig.SingleRouteCamelConfiguration;
-import org.junit.Test;
-import org.springframework.config.java.annotation.Bean;
-import org.springframework.config.java.annotation.Configuration;
-import org.springframework.config.java.test.JavaConfigContextLoader;
-import org.springframework.test.context.ContextConfiguration;
-import
org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
-
-@ContextConfiguration(locations =
"org.apache.camel.dataformat.bindy.csv.BindyComplexCsvMarshallTest$ContextConfig",
loader = JavaConfigContextLoader.class)
-public class BindyComplexCsvMarshallTest extends
AbstractJUnit4SpringContextTests {
-
- private List<Map<String, Object>> models = new
ArrayList<Map<String, Object>>();
- private String result = "10,A1,Julia,Roberts,BE123456789,Belgium
Ventage 10/12,150,USD,14-01-2009";
-
- @Produce(uri = "direct:start")
- private ProducerTemplate template;
-
- @EndpointInject(uri = "mock:result")
- private MockEndpoint resultEndpoint;
-
- @Test
- public void testMarshallMessage() throws Exception {
- resultEndpoint.expectedBodiesReceived(result);
-
- template.sendBody(generateModel());
-
- resultEndpoint.assertIsSatisfied();
- }
-
- private List<Map<String, Object>> generateModel() {
- Map<String, Object> model = new HashMap<String, Object>();
-
- Order order = new Order();
- order.setOrderNr(10);
- order.setAmount(new BigDecimal("150"));
- order.setIsinCode("BE123456789");
- order.setInstrumentName("Belgium Ventage 10/12");
- order.setCurrency("USD");
-
- Calendar calendar = new GregorianCalendar();
- calendar.set(2009, 0, 14);
- order.setOrderDate(calendar.getTime());
-
- Client client = new Client();
- client.setClientNr("A1");
- client.setFirstName("Julia");
- client.setLastName("Roberts");
-
- order.setClient(client);
-
- model.put(order.getClass().getName(), order);
- model.put(client.getClass().getName(), client);
-
- models.add(0, model);
-
- return models;
- }
-
- @Configuration
- public static class ContextConfig extends SingleRouteCamelConfiguration {
- BindyCsvDataFormat camelDataFormat = new
BindyCsvDataFormat("org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink");
-
- @Override
- @Bean
- public RouteBuilder route() {
- return new RouteBuilder() {
- @Override
- public void configure() {
-
from("direct:start").marshal(camelDataFormat).to("mock:result");
- }
- };
- }
- }
-
-}
-]]></script>
-</div></div><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Unmarshall</b></div><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[package org.apache.camel.dataformat.bindy.csv;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.spring.javaconfig.SingleRouteCamelConfiguration;
-import org.junit.Test;
-import org.springframework.config.java.annotation.Bean;
-import org.springframework.config.java.annotation.Configuration;
-import org.springframework.config.java.test.JavaConfigContextLoader;
-import org.springframework.test.context.ContextConfiguration;
-import
org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
-
-@ContextConfiguration(locations =
"org.apache.camel.dataformat.bindy.csv.BindyComplexCsvUnmarshallTest$ContextConfig",
loader = JavaConfigContextLoader.class)
-public class BindyComplexCsvUnmarshallTest extends
AbstractJUnit4SpringContextTests {
-
- @EndpointInject(uri = "mock:result")
- private MockEndpoint resultEndpoint;
-
- @Test
- public void testUnMarshallMessage() throws Exception {
- resultEndpoint.expectedMessageCount(1);
- resultEndpoint.assertIsSatisfied();
- }
-
- @Configuration
- public static class ContextConfig extends SingleRouteCamelConfiguration {
- BindyCsvDataFormat csvBindyDataFormat = new
BindyCsvDataFormat("org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink");
-
- @Override
- @Bean
- public RouteBuilder route() {
- return new RouteBuilder() {
- @Override
- public void configure() {
-
from("file://src/test/data?noop=true").unmarshal(csvBindyDataFormat).to("mock:result");
- }
- };
- }
- }
-
-}
-]]></script>
-</div></div><p>In this example, BindyCsvDataFormat class has been instantiated
in a traditional way but it is also possible to provide information directly to
the function (un)marshal like this where BindyType corresponds to the Bindy
DataFormat class to instantiate and the parameter contains the list of package
names.</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ public static class ContextConfig extends
SingleRouteCamelConfiguration {
- @Override
- @Bean
- public RouteBuilder route() {
- return new RouteBuilder() {
- @Override
- public void configure() {
- from("direct:start")
- .marshal().bindy(BindyType.Csv,
"org.apache.camel.dataformat.bindy.model.simple.oneclass")
- .to("mock:result");
- }
- };
- }
- }
-]]></script>
-</div></div><h3 id="Bindy-UsingSpringXML">Using Spring XML</h3><p>This is
really easy to use Spring as your favorite DSL language to declare the routes
to be used for camel-bindy. The following example shows two routes where the
first will pick-up records from files, unmarshal the content and bind it to
their model. The result is then send to a pojo (doing nothing special) and
place them into a queue.</p><p>The second route will extract the pojos from the
queue and marshal the content to generate a file containing the csv
record</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>spring
dsl</b></div><div class="codeContent panelContent pdl">
+</div></div><h3 id="Bindy-UsingSpringXML">Using Spring XML</h3><p>This is
really easy to use Spring as your favorite DSL language to declare the routes
to be used for camel-bindy. The following example shows two routes where the
first will pick-up records from files, unmarshal the content and bind it to
their model. The result is then send to a pojo (doing nothing special) and
place them into a queue.</p><p>The second route will extract the pojos from the
queue and marshal the content to generate a file containing the csv record. The
example above is for using Camel 2.16 onwards.</p><div class="code panel pdl"
style="border-width: 1px;"><div class="codeHeader panelHeader pdl"
style="border-bottom-width: 1px;"><b>spring dsl</b></div><div
class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[<?xml version="1.0"
encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
@@ -976,13 +836,6 @@ public class BindyComplexCsvUnmarshallTe
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
- <bean id="bindyDataformat"
class="org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat">
- <constructor-arg
value="org.apache.camel.bindy.model" />
- </bean>
-
- <bean id="csv"
class="org.apache.camel.bindy.csv.HandleOrderBean" />
-
-
<!-- Queuing engine - ActiveMq - work locally in mode virtual
memory -->
<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL"
value="vm://localhost:61616"/>
@@ -990,7 +843,11 @@ public class BindyComplexCsvUnmarshallTe
<camelContext
xmlns="http://camel.apache.org/schema/spring">
- <jmxAgent id="agent" disabled="false"
/>
+
+?
+ <dataFormats>
+ <bindy id="bindyDataformat" type="Csv"
classType="org.apache.camel.bindy.model.Order"/>
+ </dataFormats>
<route>
<from uri="file://src/data/csv/?noop=true"
/>
Modified: websites/production/camel/content/book-dataformat-appendix.html
==============================================================================
--- websites/production/camel/content/book-dataformat-appendix.html (original)
+++ websites/production/camel/content/book-dataformat-appendix.html Fri Aug 7
10:20:07 2015
@@ -1029,7 +1029,7 @@ from("file://site/inbox").unma
</dependency>
]]></script>
</div></div>
-<h2 id="BookDataFormatAppendix-Bindy">Bindy</h2><p>The goal of this component
is to allow the parsing/binding of non-structured data (or to be more precise
non-XML data)<br clear="none"> to/from Java Beans that have binding mappings
defined with annotations. Using Bindy, you can bind data from sources such as
:</p><ul class="alternate"><li>CSV records,</li><li>Fixed-length
records,</li><li>FIX messages,</li><li>or almost any other non-structured
data</li></ul><p>to one or many Plain Old Java Object (POJO). Bindy converts
the data according to the type of the java property. POJOs can be linked
together with one-to-many relationships available in some cases. Moreover, for
data type like Date, Double, Float, Integer, Short, Long and BigDecimal, you
can provide the pattern to apply during the formatting of the
property.</p><p>For the BigDecimal numbers, you can also define the precision
and the decimal or grouping separators.</p><div class="table-wrap"><table
class="confluenceTable"><tb
ody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Type</p></th><th
colspan="1" rowspan="1" class="confluenceTh"><p>Format Type</p></th><th
colspan="1" rowspan="1" class="confluenceTh"><p>Pattern example</p></th><th
colspan="1" rowspan="1" class="confluenceTh"><p>Link</p></th></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Date</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>DateFormat</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>"dd-MM-yyyy"</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><a shape="rect" class="external-link"
href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html"
rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Decimal*</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Decimalformat</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>"##.###.###"</p></td>
<td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect"
class="external-link"
href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html"
rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html</a></p></td></tr></tbody></table></div><p>Decimal*
= Double, Integer, Float, Short, Long</p><div
class="confluence-information-macro confluence-information-macro-note"><p
class="title">Format supported</p><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>This first release only support
comma separated values fields and key value pair fields (e.g. : FIX
messages).</p></div></div><p>To work with camel-bindy, you must first define
your model in a package (e.g. com.acme.model) and for each model class (e.g.
Order, Client, Instrument, ...) add the required annotations (described
hereafter) to the Class or field.</p><div class="confluence-inform
ation-macro confluence-information-macro-note"><p class="title">Multiple
models</p><span class="aui-icon aui-icon-small aui-iconfont-warning
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>If you use multiple models, each
model has to be placed in it's own package to prevent unpredictable
results.</p></div></div><h2
id="BookDataFormatAppendix-Annotations">Annotations</h2><p>The annotations
created allow to map different concept of your model to the POJO like :</p><ul
class="alternate"><li>Type of record (csv, key value pair (e.g. FIX message),
fixed length ...),</li><li>Link (to link object in another
object),</li><li>DataField and their properties (int, type,
...),</li><li>KeyValuePairField (for key = value format like we have in FIX
financial messages),</li><li>Section (to identify header, body and footer
section),</li><li>OneToMany</li></ul><p>This section will describe them
:</p><h3 id="BookDataFormatAppendix-1.CsvRecord">1. CsvRecord<
/h3><p>The CsvRecord annotation is used to identified the root class of the
model. It represents a record = a line of a CSV file and can be linked to
several children model classes.</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Annotation name</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Record type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Level</p></th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>CsvRecord</strong></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>csv</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>Class</p></td></tr></tbody></table></div><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th colspan="1"
rowspan="1" class="confluenceTh"><p>Parameter name</p></th><th colspan="1"
rowspan="1" class="confluenceTh"><p>type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Info</p></th></tr><tr
><td colspan="1" rowspan="1" class="confluenceTd"><p>separator</p></td><td
>colspan="1" rowspan="1" class="confluenceTd"><p>string</p></td><td
>colspan="1" rowspan="1" class="confluenceTd"><p>mandatory - can be ',' or ';'
>or 'anything'. This value is interpreted as a regular expression. If you want
>to use a sign which has a special meaning in regular expressions, e.g. the
>'|' sign, than you have to mask it, like ' <br clear="none"
>class="atl-forced-newline"> |'</p></td></tr><tr><td colspan="1" rowspan="1"
>class="confluenceTd"><p>skipFirstLine</p></td><td colspan="1" rowspan="1"
>class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
>class="confluenceTd"><p>optional - default value = false - allow to skip the
>first line of the CSV file</p></td></tr><tr><td colspan="1" rowspan="1"
>class="confluenceTd"><p>crlf</p></td><td colspan="1" rowspan="1"
>class="confluenceTd"><p>string</p></td><td colspan="1" rowspan="1"
>class="confluenceTd"><p>optional - possible values = WINDOWS,UNIX
,MAC, or custom; default value = WINDOWS - allow to define the carriage return
character to use. If you specify a value other than the three listed before,
the value you enter (custom) will be used as the CRLF
character(s)</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>generateHeaderColumns</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - uses to generate the
header columns of the CSV generates</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>autospanLine</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Camel 2.13/2.12.2:</strong> optional - default
value = false - if enabled then the last column is auto spanned to end of line,
for example if its a comment, etc this allows the line to contain all
characters, also the delimiter char.</p></td></t
r><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>isOrdered</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - allow to change the
order of the fields when CSV is generated</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>quote</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>String</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Camel 2.8.3/2.9:</strong> option - allow to
specify a quote character of the fields when CSV is
generated</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>This annotation is associated to the root class of the
model and must be declared one time.</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd">quoting</td><td colspan="1"
rowspan="1" class="confluenceTd">boolean</td><td colspan="1" rowspan="1"
class="confluenceTd"><strong>Camel 2.11:</strong>optional - default value =
false - Indicate if the values must be quoted when marshaling when CSV is
generated.</td></tr></tbody></table></div><p><strong>case 1 : separator =
','</strong></p><p>The separator used to segregate the fields in the CSV record
is ',' :</p><p>10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500,
USD,08-01-2009</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
+<h2 id="BookDataFormatAppendix-Bindy">Bindy</h2><p>The goal of this component
is to allow the parsing/binding of non-structured data (or to be more precise
non-XML data)<br clear="none"> to/from Java Beans that have binding mappings
defined with annotations. Using Bindy, you can bind data from sources such as
:</p><ul class="alternate"><li>CSV records,</li><li>Fixed-length
records,</li><li>FIX messages,</li><li>or almost any other non-structured
data</li></ul><p>to one or many Plain Old Java Object (POJO). Bindy converts
the data according to the type of the java property. POJOs can be linked
together with one-to-many relationships available in some cases. Moreover, for
data type like Date, Double, Float, Integer, Short, Long and BigDecimal, you
can provide the pattern to apply during the formatting of the
property.</p><p>For the BigDecimal numbers, you can also define the precision
and the decimal or grouping separators.</p><div class="table-wrap"><table
class="confluenceTable"><tb
ody><tr><th colspan="1" rowspan="1" class="confluenceTh"><p>Type</p></th><th
colspan="1" rowspan="1" class="confluenceTh"><p>Format Type</p></th><th
colspan="1" rowspan="1" class="confluenceTh"><p>Pattern example</p></th><th
colspan="1" rowspan="1" class="confluenceTh"><p>Link</p></th></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Date</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>DateFormat</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>"dd-MM-yyyy"</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p><a shape="rect" class="external-link"
href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html"
rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html</a></p></td></tr><tr><td
colspan="1" rowspan="1" class="confluenceTd"><p>Decimal*</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>Decimalformat</p></td><td
colspan="1" rowspan="1" class="confluenceTd"><p>"##.###.###"</p></td>
<td colspan="1" rowspan="1" class="confluenceTd"><p><a shape="rect"
class="external-link"
href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html"
rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html</a></p></td></tr></tbody></table></div><p>Decimal*
= Double, Integer, Float, Short, Long</p><div
class="confluence-information-macro confluence-information-macro-note"><p
class="title">Format supported</p><span class="aui-icon aui-icon-small
aui-iconfont-warning confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>This first release only support
comma separated values fields and key value pair fields (e.g. : FIX
messages).</p></div></div><p>To work with camel-bindy, you must first define
your model in a package (e.g. com.acme.model) and for each model class (e.g.
Order, Client, Instrument, ...) add the required annotations (described
hereafter) to the Class or field.</p><div class="confluence-inform
ation-macro confluence-information-macro-note"><p class="title">Multiple
models</p><span class="aui-icon aui-icon-small aui-iconfont-warning
confluence-information-macro-icon"></span><div
class="confluence-information-macro-body"><p>If you use multiple models, each
model has to be placed in it's own package to prevent unpredictable
results.</p><p>From <strong>Camel 2.16</strong> onwards this is no longer the
case, as you can safely have multiple models in the same package, as you
configure bindy using class names instead of package names
now.</p></div></div><h2
id="BookDataFormatAppendix-Annotations">Annotations</h2><p>The annotations
created allow to map different concept of your model to the POJO like :</p><ul
class="alternate"><li>Type of record (csv, key value pair (e.g. FIX message),
fixed length ...),</li><li>Link (to link object in another
object),</li><li>DataField and their properties (int, type,
...),</li><li>KeyValuePairField (for key = value format like we have in FIX fi
nancial messages),</li><li>Section (to identify header, body and footer
section),</li><li>OneToMany</li></ul><p>This section will describe them
:</p><h3 id="BookDataFormatAppendix-1.CsvRecord">1. CsvRecord</h3><p>The
CsvRecord annotation is used to identified the root class of the model. It
represents a record = a line of a CSV file and can be linked to several
children model classes.</p><div class="table-wrap"><table
class="confluenceTable"><tbody><tr><th colspan="1" rowspan="1"
class="confluenceTh"><p>Annotation name</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Record type</p></th><th colspan="1" rowspan="1"
class="confluenceTh"><p>Level</p></th></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>CsvRecord</strong></p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>csv</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>Class</p></td></tr></tbody></table></div><div
class="table-wrap"><table class="confluenceTable"><tbody><tr><th col
span="1" rowspan="1" class="confluenceTh"><p>Parameter name</p></th><th
colspan="1" rowspan="1" class="confluenceTh"><p>type</p></th><th colspan="1"
rowspan="1" class="confluenceTh"><p>Info</p></th></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>separator</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>string</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>mandatory - can be ',' or ';' or 'anything'. This value
is interpreted as a regular expression. If you want to use a sign which has a
special meaning in regular expressions, e.g. the '|' sign, than you have to
mask it, like ' <br clear="none" class="atl-forced-newline">
|'</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p>skipFirstLine</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - allow to skip the
first line of the CSV file</p></td></tr><tr><td colspan="1" row
span="1" class="confluenceTd"><p>crlf</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>string</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - possible values = WINDOWS,UNIX,MAC, or
custom; default value = WINDOWS - allow to define the carriage return character
to use. If you specify a value other than the three listed before, the value
you enter (custom) will be used as the CRLF character(s)</p></td></tr><tr><td
colspan="1" rowspan="1"
class="confluenceTd"><p>generateHeaderColumns</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - uses to generate the
header columns of the CSV generates</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>autospanLine</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Camel 2.13/2.12.2:</strong> optional -
default value = false - if enabled then the last column is auto spanned to end
of line, for example if its a comment, etc this allows the line to contain all
characters, also the delimiter char.</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>isOrdered</p></td><td colspan="1"
rowspan="1" class="confluenceTd"><p>boolean</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>optional - default value = false - allow to change the
order of the fields when CSV is generated</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd"><p>quote</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p>String</p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p><strong>Camel 2.8.3/2.9:</strong> option - allow to
specify a quote character of the fields when CSV is
generated</p></td></tr><tr><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1"
class="confluenceTd"><p> </p></td><td colspan="1" rowspan="1" cla
ss="confluenceTd"><p>This annotation is associated to the root class of the
model and must be declared one time.</p></td></tr><tr><td colspan="1"
rowspan="1" class="confluenceTd">quoting</td><td colspan="1" rowspan="1"
class="confluenceTd">boolean</td><td colspan="1" rowspan="1"
class="confluenceTd"><strong>Camel 2.11:</strong>optional - default value =
false - Indicate if the values must be quoted when marshaling when CSV is
generated.</td></tr></tbody></table></div><p><strong>case 1 : separator =
','</strong></p><p>The separator used to segregate the fields in the CSV record
is ',' :</p><p>10, J, Pauline, M, XD12345678, Fortis Dynamic 15/15, 2500,
USD,08-01-2009</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[@CsvRecord( separator = "," )
public Class Order {
...
@@ -1699,18 +1699,32 @@ public class Security {
]]></script>
</div></div><h3 id="BookDataFormatAppendix-UsingtheJavaDSL.2">Using the Java
DSL</h3><p>The next step consists in instantiating the DataFormat
<em>bindy</em> class associated with this record type and providing Java
package name(s) as parameter.</p><p>For example the following uses the class
<code>BindyCsvDataFormat</code> (who correspond to the class associated with
the CSV record type) which is configured with "com.acme.model"<br clear="none">
package name to initialize the model objects configured in this
package.</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[DataFormat bindy = new
BindyCsvDataFormat("com.acme.model");
-]]></script>
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// Camel 2.15 or older (configure by package
name)
+DataFormat bindy = new BindyCsvDataFormat("com.acme.model");
+
+?
+// Camel 2.16 onwards (configure by class name)
+DataFormat bindy = new
BindyCsvDataFormat(com.acme.model.MyModel.class);]]></script>
</div></div><h4 id="BookDataFormatAppendix-Settinglocale">Setting
locale</h4><p>Bindy supports configuring the locale on the dataformat, such
as </p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[BindyCsvDataFormat bindy = new
BindyCsvDataFormat("com.acme.model");
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// Camel 2.15 or older (configure by package
name)
+BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model");
+// Camel 2.16 onwards (configure by class name)
+BindyCsvDataFormat bindy = new
BindyCsvDataFormat(com.acme.model.MyModel.class);
bindy.setLocale("us");]]></script>
</div></div><p>Or to use the platform default locale then use "default" as the
locale name. Notice this requires Camel 2.14/2.13.3/2.12.5.</p><div class="code
panel pdl" style="border-width: 1px;"><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[BindyCsvDataFormat bindy = new
BindyCsvDataFormat("com.acme.model");
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// Camel 2.15 or older (configure by package
name)
+BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model");
+// Camel 2.16 onwards (configure by class name)
+BindyCsvDataFormat bindy = new
BindyCsvDataFormat(com.acme.model.MyModel.class);
bindy.setLocale("default");]]></script>
</div></div><p>for older releases you can set it using Java code as
shown</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[BindyCsvDataFormat bindy = new
BindyCsvDataFormat("com.acme.model");
+<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[// Camel 2.15 or older (configure by package
name)
+BindyCsvDataFormat bindy = new BindyCsvDataFormat("com.acme.model");
+// Camel 2.16 onwards (configure by class name)
+BindyCsvDataFormat bindy = new
BindyCsvDataFormat(com.acme.model.MyModel.class);
+
bindy.setLocale(Locale.getDefault().getISO3Country());]]></script>
</div></div><h4 id="BookDataFormatAppendix-Unmarshaling">Unmarshaling</h4><div
class="code panel pdl" style="border-width: 1px;"><div class="codeContent
panelContent pdl">
@@ -1756,161 +1770,7 @@ bindy.setLocale(Locale.getDefault().getI
.marshal(bindy)
.to("file://outbox")
]]></script>
-</div></div><h3 id="BookDataFormatAppendix-Unittest">Unit test</h3><p>Here is
two examples showing how to marshall or unmarshall a CSV file with
Camel</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Marshall</b></div><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[package org.apache.camel.dataformat.bindy.csv;
-
-import java.math.BigDecimal;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.Produce;
-import org.apache.camel.ProducerTemplate;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import
org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink.Client;
-import
org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink.Order;
-import org.apache.camel.spring.javaconfig.SingleRouteCamelConfiguration;
-import org.junit.Test;
-import org.springframework.config.java.annotation.Bean;
-import org.springframework.config.java.annotation.Configuration;
-import org.springframework.config.java.test.JavaConfigContextLoader;
-import org.springframework.test.context.ContextConfiguration;
-import
org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
-
-@ContextConfiguration(locations =
"org.apache.camel.dataformat.bindy.csv.BindyComplexCsvMarshallTest$ContextConfig",
loader = JavaConfigContextLoader.class)
-public class BindyComplexCsvMarshallTest extends
AbstractJUnit4SpringContextTests {
-
- private List<Map<String, Object>> models = new
ArrayList<Map<String, Object>>();
- private String result = "10,A1,Julia,Roberts,BE123456789,Belgium
Ventage 10/12,150,USD,14-01-2009";
-
- @Produce(uri = "direct:start")
- private ProducerTemplate template;
-
- @EndpointInject(uri = "mock:result")
- private MockEndpoint resultEndpoint;
-
- @Test
- public void testMarshallMessage() throws Exception {
- resultEndpoint.expectedBodiesReceived(result);
-
- template.sendBody(generateModel());
-
- resultEndpoint.assertIsSatisfied();
- }
-
- private List<Map<String, Object>> generateModel() {
- Map<String, Object> model = new HashMap<String, Object>();
-
- Order order = new Order();
- order.setOrderNr(10);
- order.setAmount(new BigDecimal("150"));
- order.setIsinCode("BE123456789");
- order.setInstrumentName("Belgium Ventage 10/12");
- order.setCurrency("USD");
-
- Calendar calendar = new GregorianCalendar();
- calendar.set(2009, 0, 14);
- order.setOrderDate(calendar.getTime());
-
- Client client = new Client();
- client.setClientNr("A1");
- client.setFirstName("Julia");
- client.setLastName("Roberts");
-
- order.setClient(client);
-
- model.put(order.getClass().getName(), order);
- model.put(client.getClass().getName(), client);
-
- models.add(0, model);
-
- return models;
- }
-
- @Configuration
- public static class ContextConfig extends SingleRouteCamelConfiguration {
- BindyCsvDataFormat camelDataFormat = new
BindyCsvDataFormat("org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink");
-
- @Override
- @Bean
- public RouteBuilder route() {
- return new RouteBuilder() {
- @Override
- public void configure() {
-
from("direct:start").marshal(camelDataFormat).to("mock:result");
- }
- };
- }
- }
-
-}
-]]></script>
-</div></div><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width:
1px;"><b>Unmarshall</b></div><div class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[package org.apache.camel.dataformat.bindy.csv;
-
-import org.apache.camel.EndpointInject;
-import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.component.mock.MockEndpoint;
-import org.apache.camel.spring.javaconfig.SingleRouteCamelConfiguration;
-import org.junit.Test;
-import org.springframework.config.java.annotation.Bean;
-import org.springframework.config.java.annotation.Configuration;
-import org.springframework.config.java.test.JavaConfigContextLoader;
-import org.springframework.test.context.ContextConfiguration;
-import
org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;
-
-@ContextConfiguration(locations =
"org.apache.camel.dataformat.bindy.csv.BindyComplexCsvUnmarshallTest$ContextConfig",
loader = JavaConfigContextLoader.class)
-public class BindyComplexCsvUnmarshallTest extends
AbstractJUnit4SpringContextTests {
-
- @EndpointInject(uri = "mock:result")
- private MockEndpoint resultEndpoint;
-
- @Test
- public void testUnMarshallMessage() throws Exception {
- resultEndpoint.expectedMessageCount(1);
- resultEndpoint.assertIsSatisfied();
- }
-
- @Configuration
- public static class ContextConfig extends SingleRouteCamelConfiguration {
- BindyCsvDataFormat csvBindyDataFormat = new
BindyCsvDataFormat("org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink");
-
- @Override
- @Bean
- public RouteBuilder route() {
- return new RouteBuilder() {
- @Override
- public void configure() {
-
from("file://src/test/data?noop=true").unmarshal(csvBindyDataFormat).to("mock:result");
- }
- };
- }
- }
-
-}
-]]></script>
-</div></div><p>In this example, BindyCsvDataFormat class has been instantiated
in a traditional way but it is also possible to provide information directly to
the function (un)marshal like this where BindyType corresponds to the Bindy
DataFormat class to instantiate and the parameter contains the list of package
names.</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeContent panelContent pdl">
-<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[ public static class ContextConfig extends
SingleRouteCamelConfiguration {
- @Override
- @Bean
- public RouteBuilder route() {
- return new RouteBuilder() {
- @Override
- public void configure() {
- from("direct:start")
- .marshal().bindy(BindyType.Csv,
"org.apache.camel.dataformat.bindy.model.simple.oneclass")
- .to("mock:result");
- }
- };
- }
- }
-]]></script>
-</div></div><h3 id="BookDataFormatAppendix-UsingSpringXML.2">Using Spring
XML</h3><p>This is really easy to use Spring as your favorite DSL language to
declare the routes to be used for camel-bindy. The following example shows two
routes where the first will pick-up records from files, unmarshal the content
and bind it to their model. The result is then send to a pojo (doing nothing
special) and place them into a queue.</p><p>The second route will extract the
pojos from the queue and marshal the content to generate a file containing the
csv record</p><div class="code panel pdl" style="border-width: 1px;"><div
class="codeHeader panelHeader pdl" style="border-bottom-width: 1px;"><b>spring
dsl</b></div><div class="codeContent panelContent pdl">
+</div></div><h3 id="BookDataFormatAppendix-UsingSpringXML.2">Using Spring
XML</h3><p>This is really easy to use Spring as your favorite DSL language to
declare the routes to be used for camel-bindy. The following example shows two
routes where the first will pick-up records from files, unmarshal the content
and bind it to their model. The result is then send to a pojo (doing nothing
special) and place them into a queue.</p><p>The second route will extract the
pojos from the queue and marshal the content to generate a file containing the
csv record. The example above is for using Camel 2.16 onwards.</p><div
class="code panel pdl" style="border-width: 1px;"><div class="codeHeader
panelHeader pdl" style="border-bottom-width: 1px;"><b>spring dsl</b></div><div
class="codeContent panelContent pdl">
<script class="brush: java; gutter: false; theme: Default"
type="syntaxhighlighter"><![CDATA[<?xml version="1.0"
encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
@@ -1921,13 +1781,6 @@ public class BindyComplexCsvUnmarshallTe
http://camel.apache.org/schema/spring
http://camel.apache.org/schema/spring/camel-spring.xsd">
- <bean id="bindyDataformat"
class="org.apache.camel.dataformat.bindy.csv.BindyCsvDataFormat">
- <constructor-arg
value="org.apache.camel.bindy.model" />
- </bean>
-
- <bean id="csv"
class="org.apache.camel.bindy.csv.HandleOrderBean" />
-
-
<!-- Queuing engine - ActiveMq - work locally in mode virtual
memory -->
<bean id="activemq"
class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL"
value="vm://localhost:61616"/>
@@ -1935,7 +1788,11 @@ public class BindyComplexCsvUnmarshallTe
<camelContext
xmlns="http://camel.apache.org/schema/spring">
- <jmxAgent id="agent" disabled="false"
/>
+
+?
+ <dataFormats>
+ <bindy id="bindyDataformat" type="Csv"
classType="org.apache.camel.bindy.model.Order"/>
+ </dataFormats>
<route>
<from uri="file://src/data/csv/?noop=true"
/>