camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Camel: Bindy (page edited)
Date Tue, 24 Feb 2009 13:50:00 GMT
<html>
<head>
    <base href="http://cwiki.apache.org/confluence" />
    <style type="text/css">
    <!--
    body, p, td, table, tr, .bodytext, .stepfield {
	font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	color: #000000;
	font-weight: normal;
}
#PageContent {
	text-align: left;
	background-color: #fff;
	padding: 0px;
	margin: 0px;
    padding-bottom:20px;
}
/*
** when this stylesheet is used for the Tiny MCE Wysiwyg editor's edit area, we can't
** use an id=PageContent or class=wiki-content, so we must
** set the body style to that used for PageContent, and p to that used for wiki-content.
*/

body {
	margin: 0px;
	padding: 0px;
	text-align: center;
    background-color: #f0f0f0;
}

@media print {

body {
    background-color: #fff;
}

}

.monospaceInput {
    font:12px monospace
}

.wiki-content p, .commentblock p {
    margin: 16px 0px 16px 0px;
    padding: 0px;
}

.wiki-content-preview {
    padding: 5px;
    border-left: 1px solid #3c78b5;
    border-right: 1px solid #3c78b5;
}

ul, ol {
    margin-top: 2px;
    margin-bottom: 2px;
    padding-top: 0px;
    padding-bottom: 0px;
}

pre {
    padding: 0px;
    margin-top: 5px;
    margin-left: 15px;
    margin-bottom: 5px;
    margin-right: 5px;
    text-align: left;
}

.helpheading {
    font-weight: bold;
    background-color: #D0D9BD;
        border-bottom: 1px solid #3c78b5;
        padding: 4px 4px 4px 4px;
        margin: 0px;
        margin-top: 10px;
}
.helpcontent {
        padding: 4px 4px 20px 4px;
    background-color: #f5f7f1;
}

.code {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.focusedComment {
    background: #ffffce;
}

.commentBox, .focusedComment {
    padding: 10px;
    margin: 5px 0 5px 0;
    border: 1px #bbb solid;
}

.codeHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.codeContent {
    text-align: left;
    background-color: #f0f0f0;
    padding: 3px;
}

.preformatted {
 	border: 1px dashed #3c78b5;
    font-size: 11px;
	font-family: Courier;
    margin: 10px;
	line-height: 13px;
}

.preformattedHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.preformattedContent {
    background-color: #f0f0f0;
    padding: 3px;
}

.panel {
 	border: 1px dashed #3c78b5;
    margin: 10px;
    margin-top: 0px;
}

.panelHeader {
    background-color: #f0f0f0;
 	border-bottom: 1px dashed #3c78b5;
    padding: 3px;
	text-align: center;
}

.panelContent {
    background-color: #f0f0f0;
    padding: 5px;
}

.anonymousAlert {
    background-color: #f0f0f0;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}

.lockAlert {
    background-color: #f0f0f0;
    width: 50%;
 	border: 1px dashed red;
    font-size: 11px;
    padding: 10px 5px 10px 5px;
    margin: 4px;
	line-height: 13px;
}


.code-keyword {
  color: #000091;
  background-color: inherit;
}

.code-object {
  color: #910091;
  background-color: inherit;
}

.code-quote {
  color: #009100;
  background-color: inherit;
}

.code-comment {
  color: #808080;
  background-color: inherit;
}


.code-xml .code-keyword {
  color: inherit;
  font-weight: bold;
}

.code-tag {
  color: #000091;
  background-color: inherit;
}

.breadcrumbs {
    background-color: #f0f0f0;
 	border-color: #3c78b5;
	border-width: 1px 0px 1px 0px;
	border-style: solid;
    font-size: 11px;
    padding: 3px 0px 3px 0px;
}

.navmenu {
    border: 1px solid #ccc;
}

.menuheading {
    font-weight: bold;
    background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 2px 4px;
}

.menuitems {
	padding: 4px 4px 20px 4px;
}

.rightpanel {
    border-left: 1px solid #ccc;
    border-bottom: 1px solid #ccc;
}

#helpheading {
    text-align: left;
    font-weight: bold;
    background-color: #D0D9BD;
 	border-bottom: 1px solid #3c78b5;
	padding: 4px 4px 4px 4px;
	margin: 0px;
}
#helpcontent {
	padding: 4px 4px 4px 4px;
    background-color: #f5f7f1;
}
.helptab-unselected {
    font-weight: bold;
	padding: 5px;
    background-color: #f5f7f1;
}
.helptab-selected {
    font-weight: bold;
    background-color: #D0D9BD;
	padding: 5px;
}
.helptabs {
    margin: 0px;
    background-color: #f5f7f1;
	padding: 5px;
}
.infopanel-heading {
    font-weight: bold;
	padding: 4px 0px 2px 0px;
}

.pagebody {
}

.pageheader {
	padding: 5px 5px 5px 0px;
 	border-bottom: 1px solid #3c78b5;
}

.pagetitle {
	font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.newpagetitle {
    color: #ccc !important;
}

.steptitle {
	font-size: 18px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
	margin-bottom: 7px;
}

.substeptitle {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
    margin: 2px 4px 4px 4px;
    padding: 2px 4px 1px 4px;
}

.stepdesc {
    font-family: Verdana, arial, sans-serif;
	font-size: 11px;
	line-height: 16px;
	font-weight: normal;
    color: #666666;
    margin-top: 7px;
    margin-bottom: 7px;
}

.steplabel {
    font-weight: bold;
    margin-right: 4px;
    color: black;
    float: left;
    width: 15%;
    text-align: right;
}

.stepfield {
    background: #f0f0f0;
    padding: 5px;
}

.submitButtons{
    margin-top:5px;
    text-align:right;
}

.formtitle {
	font-size: 12px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: #003366;
}

.sectionbottom {
    border-bottom: 1px solid #3c78b5;
}

.topRow {
    border-top: 2px solid #3c78b5;
}

.tabletitle {
	font-size: 14px;
	font-weight: bold;
	font-family: Arial, sans-serif;
    padding: 3px 0px 2px 0px;
    margin: 8px 4px 2px 0px;
	color: #003366;
	border-bottom: 2px solid #3c78b5;
}
.pagesubheading {
    color: #666666;
    font-size: 10px;
    padding: 0px 0px 5px 0px;
}

HR {
	color: 3c78b5;
	height: 1;
}

A:link, A:visited, A:active, A:hover {
	color: #003366;
}

h1 A:link, h1 A:visited, h1 A:active {
	text-decoration: none;
}

h1 A:hover {
    border-bottom: 1px dotted #003366;
}

.wiki-content > :first-child, .commentblock > :first-child {
    margin-top: 3px;
}

.logocell {
    padding: 10px;
}

input {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #000000;
}

textarea, textarea.editor {
	font-family: verdana, geneva, arial, sans-serif;
	font-size: 11px;
	color: #333333;
}

/* use logoSpaceLink instead.
.spacenametitle {
	font: 21px/31px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle img {
  margin: 0 0 -4px 0;
}
.spacenametitle a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle a:visited {
    text-decoration: none;
    color: #999999;
}*/

.spacenametitle-printable {
	font: 20px/25px Impact, Arial, Helvetica;
    font-weight: 100;
    color: #999999;
	margin: 0px;
}
.spacenametitle-printable a {
    text-decoration: none;
    color: #999999;
}
.spacenametitle-printable a:visited {
    text-decoration: none;
    color: #999999;
}

.blogDate {
	font-weight: bold;
	text-decoration: none;
	color: black;
}

.blogSurtitle {
    background: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.blogHeading {
    font-size: 20px;
    line-height: normal;
    font-weight: bold;
    padding: 0px;
    margin: 0px;
}

.blogHeading a {
   text-decoration: none;
   color: black;
}

.endsection {
	align: right;
	color: #666666;
	margin-top: 10px;
}
.endsectionleftnav {
	align: right;
	color: #666666;
	margin-top: 10px;
}

h1 {
	font-size: 24px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	color: #003366;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 36px 0px 4px 0px;
}

h2 {
	font-size: 18px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
 	border-bottom: 1px solid #3c78b5;
	padding: 2px;
	margin: 27px 0px 4px 0px;
}

h3 {
	font-size: 14px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 21px 0px 4px 0px;
}

h4 {
	font-size: 12px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 18px 0px 4px 0px;
}

h4.search {
	font-size: 12px;
	line-height: normal;
	font-weight: normal;
	background-color: #f0f0f0;
	padding: 4px;
	margin: 18px 0px 4px 0px;
}

h5 {
	font-size: 10px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

h6 {
	font-size: 8px;
	line-height: normal;
	font-weight: bold;
	background-color: #f0f0f0;
	padding: 2px;
	margin: 14px 0px 4px 0px;
}

.smallfont {
    font-size: 10px;
}
.descfont {
    font-size: 10px;
    color: #666666;
}
.smallerfont {
    font-size: 9px;
}
.smalltext {
    color: #666666;
    font-size: 10px;
}
.smalltext a {
    color: #666666;
}
.smalltext-blue {
    color: #3c78b5;
    font-size: 10px;
}
.surtitle {
    margin-left: 1px;
    margin-bottom: 5px;
    font-size: 14px;
    color: #666666;
}

/* css hack found here:  http://www.fo3nix.pwp.blueyonder.co.uk/tutorials/css/hacks/ */
.navItemOver { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #003366; cursor: hand; voice-family: '\'}\''; voice-family:inherit; cursor: pointer;}
.navItemOver a { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:visited { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItemOver a:hover { color: #ffffff; background-color:#003366; text-decoration: none; }
.navItem { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; }
.navItem a { color: #ffffff; text-decoration: none; }
.navItem a:hover { color: #ffffff; text-decoration: none; }
.navItem a:visited { color: #ffffff; text-decoration: none; }

div.padded { padding: 4px; }
div.thickPadded { padding: 10px; }
h3.macrolibrariestitle {
    margin: 0px 0px 0px 0px;
}

div.centered { text-align: center; margin: 10px; }
div.centered table {margin: 0px auto; text-align: left; }

.tableview table {
    margin: 0;
}

.tableview th {
    text-align: left;
    color: #003366;
    font-size: 12px;
    padding: 5px 0px 0px 5px;
    border-bottom: 2px solid #3c78b5;
}
.tableview td {
    text-align: left;
    border-color: #ccc;
    border-width: 0px 0px 1px 0px;
    border-style: solid;
    margin: 0;
    padding: 4px 10px 4px 5px;
}

.grid {
    margin: 2px 0px 5px 0px;
    border-collapse: collapse;
}
.grid th  {
    border: 1px solid #ccc;
    padding: 2px 4px 2px 4px;
    background: #f0f0f0;
    text-align: center;
}
.grid td  {
    border: 1px solid #ccc;
    padding: 3px 4px 3px 4px;
}
.gridHover {
	background-color: #f9f9f9;
}

td.infocell {
    background-color: #f0f0f0;
}
.label {
	font-weight: bold;
	color: #003366;
}

label {
	font-weight: bold;
	color: #003366;
}

.error {
	background-color: #fcc;
}

.errorBox {
	background-color: #fcc;
    border: 1px solid #c00;
    padding: 5px;
    margin: 5px;
}

.errorMessage {
	color: #c00;
}

.success {
	background-color: #dfd;
}

.successBox {
	background-color: #dfd;
    border: 1px solid #090;
    padding: 5px;
    margin-top:5px;
    margin-bottom:5px;
}

blockquote {
	padding-left: 10px;
	padding-right: 10px;
	margin-left: 5px;
	margin-right: 0px;
	border-left: 1px solid #3c78b5;
}

table.confluenceTable
{
    margin: 5px;
    border-collapse: collapse;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

/* Added as a temporary fix for CONF-4223. The table elements appear to be inheriting the border: none attribute from the sectionMacro class */
table.confluenceTable th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

td.confluenceTd
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
}

th.confluenceTh
{
    border-width: 1px;
    border-style: solid;
    border-color: #ccc;
    padding: 3px 4px 3px 4px;
    background-color: #f0f0f0;
    text-align: center;
}

DIV.small {
	font-size: 9px;
}

H1.pagename {
	margin-top: 0px;
}

IMG.inline  {}

.loginform {
    margin: 5px;
    border: 1px solid #ccc;
}

/* The text how the "This is a preview" comment should be shown. */
.previewnote { text-align: center;
                font-size: 11px;
                    color: red; }

/* How the preview content should be shown */
.previewcontent { background: #E0E0E0; }

/* How the system messages should be shown (DisplayMessage.jsp) */
.messagecontent { background: #E0E0E0; }

/* How the "This page has been modified..." -comment should be shown. */
.conflictnote { }

.createlink {
    color: maroon;
}
a.createlink {
    color: maroon;
}
.templateparameter {
    font-size: 9px;
    color: darkblue;
}

.diffadded {
    background: #ddffdd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkgreen;
}
.diffdeleted {
    color: #999;
    background: #ffdddd;
    padding: 1px 1px 1px 4px;
	border-left: 4px solid darkred;
}
.diffnochange {
    padding: 1px 1px 1px 4px;
	border-left: 4px solid lightgrey;
}
.differror {
    background: brown;
}
.diff {
    font-family: lucida console, courier new, fixed-width;
	font-size: 12px;
	line-height: 14px;
}
.diffaddedchars {
    background-color:#99ff99;
    font-weight:bolder;
}
.diffremovedchars {
    background-color:#ff9999;
    text-decoration: line-through;
    font-weight:bolder;
}

.greybackground {
    background: #f0f0f0
}

.greybox {
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.borderedGreyBox {
    border: 1px solid #cccccc;
    background-color: #f0f0f0;
    padding: 10px;
}

.greyboxfilled {
 	border: 1px solid #ddd;
    background: #f0f0f0;
    padding: 3px;
	margin: 1px 1px 10px 1px;
}

.navBackgroundBox {
    padding: 5px 5px 5px 5px;
    font-size: 22px;
	font-weight: bold;
	font-family: Arial, sans-serif;
	color: white;
    background: #3c78b5;
    text-decoration: none;
}

.previewBoxTop {
	background-color: #f0f0f0;
    border-width: 1px 1px 0px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 5px 0px 0px 0px;
    text-align: center;
}
.previewContent {
    background-color: #fff;
 	border-color: #3c78b5;
	border-width: 0px 1px 0px 1px;
	border-style: solid;
	padding: 10px;
	margin: 0px;
}
.previewBoxBottom {
	background-color: #f0f0f0;
    border-width: 0px 1px 1px 1px;
    border-style: solid;
    border-color: #3c78b5;
    padding: 5px;
    margin: 0px 0px 5px 0px;
    text-align: center;
}

.functionbox {
    background-color: #f0f0f0;
 	border: 1px solid #3c78b5;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.functionbox-greyborder {
    background-color: #f0f0f0;
 	border: 1px solid #ddd;
	padding: 3px;
	margin: 1px 1px 10px 1px;
}

.search-highlight {
    background-color: #ffffcc;
}

/* normal (white) background */
.rowNormal {
    background-color: #ffffff;
 }

/* alternate (pale yellow) background */
.rowAlternate {
    background-color: #f7f7f7;
}

/* used in the list attachments table */
.rowAlternateNoBottomColor {
    background-color: #f7f7f7;
}

.rowAlternateNoBottomNoColor {
}

.rowAlternateNoBottomColor td {
    border-bottom: 0px;
}

.rowAlternateNoBottomNoColor td {
    border-bottom: 0px;
}

/* row highlight (grey) background */
.rowHighlight {
    background-color: #f0f0f0;

}

TD.greenbar {FONT-SIZE: 2px; BACKGROUND: #00df00; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.redbar {FONT-SIZE: 2px; BACKGROUND: #df0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }
TD.darkredbar {FONT-SIZE: 2px; BACKGROUND: #af0000; BORDER: 1px solid #9c9c9c; PADDING: 0px; }

TR.testpassed {FONT-SIZE: 2px; BACKGROUND: #ddffdd; PADDING: 0px; }
TR.testfailed {FONT-SIZE: 2px; BACKGROUND: #ffdddd; PADDING: 0px; }

.toolbar  {
    margin: 0px;
    border-collapse: collapse;
}

.toolbar td  {
    border: 1px solid #ccc;
    padding: 2px 2px 2px 2px;
    color: #ccc;
}

td.noformatting {
    border-width: 0px;
    border-style: none;
    text-align: center;
	padding: 0px;
}

.commentblock {
    margin: 12px 0 12px 0;
}

/*
 * Divs displaying the license information, if necessary.
 */
.license-eval, .license-none, .license-nonprofit {
    border-top: 1px solid #bbbbbb;
    text-align: center;
    font-size: 10px;
    font-family: Verdana, Arial, Helvetica, sans-serif;
}

.license-eval, .license-none {
    background-color: #ffcccc;
}

.license-eval b, .license-none b {
    color: #990000
}

.license-nonprofit {
    background-color: #ffffff;
}

/*
 * The shadow at the bottom of the page between the main content and the
 * "powered by" section.
 */
.bottomshadow {
    height: 12px;
    background-image: url("$req.contextPath/images/border/border_bottom.gif");
    background-repeat: repeat-x;
}

/*
 * Styling of the operations box
 */
.navmenu .operations li, .navmenu .operations ul {
    list-style: none;
    margin-left: 0;
    padding-left: 0;
}

.navmenu .operations ul {
    margin-bottom: 9px;
}

.navmenu .label {
    font-weight: inherit;
}

/*
 * Styling of ops as a toolbar
 */
.toolbar div {
    display: none;
}

.toolbar .label {
    display: none;
}

.toolbar .operations {
    display: block;
}

.toolbar .operations ul {
    display: inline;
    list-style: none;
    margin-left: 10px;
    padding-left: 0;
}

.toolbar .operations li {
    list-style: none;
    display: inline;
}

/* list page navigational tabs */
#foldertab {
padding: 3px 0px 3px 8px;
margin-left: 0;
border-bottom: 1px solid #3c78b5;
font: bold 11px Verdana, sans-serif;
}

#foldertab li {
list-style: none;
margin: 0;
display: inline;
}

#foldertab li a {
padding: 3px 0.5em;
margin-left: 3px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
text-decoration: none;
}

#foldertab li a:link { color: #ffffff; }
#foldertab li a:visited { color: #ffffff; }

#foldertab li a:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

#foldertab li a.current {
background: white;
border-bottom: 1px solid white;
color: black;
}

#foldertab li a.current:link { color: black; }
#foldertab li a.current:visited { color: black; }
#foldertab li a.current:hover {
background: white;
border-bottom: 1px solid white;
color: black;
}

/* alphabet list */
ul#squaretab {
margin-left: 0;
padding-left: 0;
white-space: nowrap;
font: bold 8px Verdana, sans-serif;
}

#squaretab li {
display: inline;
list-style-type: none;
}

#squaretab a {
padding: 2px 6px;
border: 1px solid #3c78b5;
}

#squaretab a:link, #squaretab a:visited {
color: #fff;
background-color: #3c78b5;
text-decoration: none;
}

#squaretab a:hover {
color: #ffffff;
background-color: #003366;
border-color: #003366;
text-decoration: none;
}

#squaretab li a#current {
background: white;
color: black;
}

.blogcalendar * {
    font-family:verdana, arial, sans-serif;
    font-size:x-small;
    font-weight:normal;
    line-height:140%;
    padding:2px;
}


table.blogcalendar {
    border: 1px solid #3c78b5;
}

.blogcalendar th.calendarhead, a.calendarhead {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    text-transform:uppercase;
    background-color: #3c78b5;
    color: #ffffff;
    letter-spacing: .3em;
    text-transform: uppercase;
}

.calendarhead:visited {color: white;}
.calendarhead:active {color: white;}
.calendarhead:hover {color: white;}

.blogcalendar th {
    font-size:x-small;
    font-weight:bold;
    padding:2px;
    background-color:#f0f0f0;
}

.blogcalendar td {
    font-size:x-small;
    font-weight:normal;
}

.searchGroup { padding: 0 0 10px 0; background: #f0f0f0; }
.searchGroupHeading { font-size: 10px; font-weight: bold; color: #ffffff; background-color: #3c78b5; padding: 2px 4px 1px 4px; }
.searchItem { padding: 1px 4px 1px 4px; }
.searchItemSelected { padding: 1px 4px 1px 4px; font-weight: bold; background: #ddd; }

/* permissions page styles */
.permissionHeading {
    border-bottom: #bbb; border-width: 0 0 1px 0; border-style: solid; font-size: 16px; text-align: left;
}
.permissionTab {
    border-width: 0 0 0 1px; border-style: solid; background: #3c78b5; color: #ffffff; font-size: 10px;
}
.permissionSuperTab {
    border-width: 0 0 0 1px; border-style: solid; background: #003366; color: #ffffff;
}
.permissionCell {
    border-left: #bbb; border-width: 0 0 0 1px; border-style: solid;
}

/* warning panel */
.warningPanel { background: #FFFFCE; border:#F0C000 1px solid; padding: 8px; margin: 10px; }
/* alert panel */
.alertPanel { background: #FFCCCC; border:#C00 1px solid; padding: 8px; margin: 10px; }
/* info panel */
.infoPanel { background: #D8E4F1; border:#3c78b5 1px solid; padding: 8px; margin: 10px; }

/* side menu highlighting (e.g. space content screen) */
.optionPadded { padding: 2px; }
.optionSelected { background-color: #ffffcc; padding: 2px; border: 1px solid #ddd; margin: -1px; }
.optionSelected a { font-weight: bold; text-decoration: none; color: black; }

/* information macros */
.noteMacro { border-style: solid; border-width: 1px; border-color: #F0C000; background-color: #FFFFCE; text-align:left; margin-top: 5px; margin-bottom: 5px}
.warningMacro { border-style: solid; border-width: 1px; border-color: #c00; background-color: #fcc; text-align:left; margin-top: 5px; margin-bottom: 5px}
.infoMacro { border-style: solid; border-width: 1px; border-color: #3c78b5; background-color: #D8E4F1; text-align:left; margin-top: 5px; margin-bottom: 5px}
.tipMacro { border-style: solid; border-width: 1px; border-color: #090; background-color: #dfd; text-align:left; margin-top: 5px; margin-bottom: 5px}
.informationMacroPadding { padding: 5px 0 0 5px; }

table.infoMacro td, table.warningMacro td, table.tipMacro td, table.noteMacro td, table.sectionMacro td {
    border: none;
}

table.sectionMacroWithBorder td.columnMacro { border-style: dashed; border-width: 1px; border-color: #cccccc;}

.pagecontent
{
    padding: 10px;
    text-align: left;
}

/* styles for links in the top bar */
.topBarDiv a:link {color: #ffffff;}
.topBarDiv a:visited {color: #ffffff;}
.topBarDiv a:active {color: #ffffff;}
.topBarDiv a:hover {color: #ffffff;}
.topBarDiv {color: #ffffff;}

.topBar {
    background-color: #003366;
}


/* styles for extended operations */
.greyLinks a:link {color: #666666; text-decoration:underline;}
.greyLinks a:visited {color: #666666; text-decoration:underline;}
.greyLinks a:active {color: #666666; text-decoration:underline;}
.greyLinks a:hover {color: #666666; text-decoration:underline;}
.greyLinks {color: #666666; display:block; padding: 10px}

.logoSpaceLink {color: #999999; text-decoration: none}
.logoSpaceLink a:link {color: #999999; text-decoration: none}
.logoSpaceLink a:visited {color: #999999; text-decoration: none}
.logoSpaceLink a:active {color: #999999; text-decoration: none}
.logoSpaceLink a:hover {color: #003366; text-decoration: none}

/* basic panel (basicpanel.vmd) style */
.basicPanelContainer {border: 1px solid #3c78b5; margin-top: 2px; margin-bottom: 8px; width: 100%}
.basicPanelTitle {padding: 5px; margin: 0px; background-color: #f0f0f0; color: black; font-weight: bold;}
.basicPanelBody {padding: 5px; margin: 0px}

.separatorLinks a:link {color: white}
.separatorLinks a:visited {color: white}
.separatorLinks a:active {color: white}

.greynavbar {background-color: #f0f0f0; border-top: 1px solid #3c78b5; margin-top: 2px}

div.headerField {
    float: left;
    width: auto;
    height: 100%;
}

.headerFloat {
    margin-left: auto;
    width: 50%;
}

.headerFloatLeft {
    float: left;
    margin-right: 20px;
    margin-bottom: 10px;
}

#headerRow {
    padding: 10px;
}

div.license-personal {
   background-color: #003366;
   color: #ffffff;
}

div.license-personal a {
   color: #ffffff;
}

.greyFormBox {
    border: 1px solid #cccccc;
    padding: 5px;
}

/* IE automatically adds a margin before and after form tags. Use this style to remove that */
.marginlessForm {
    margin: 0px;
}

.openPageHighlight {
    background-color: #ffffcc;
    padding: 2px;
    border: 1px solid #ddd;
}

.editPageInsertLinks, .editPageInsertLinks a
{
    color: #666666;
    font-weight: bold;
    font-size: 10px;
}

/* Style for label heatmap. */
.top10 a {
    font-weight: bold;
    font-size: 2em;
    color: #003366;
}
.top25 a {
    font-weight: bold;
    font-size: 1.6em;
    color: #003366;
}
.top50 a {
    font-size: 1.4em;
    color: #003366;
}
.top100 a {
    font-size: 1.2em;
    color: #003366;
}

.heatmap {
    list-style:none;
    width: 95%;
    margin: 0px auto;
}

.heatmap a {
    text-decoration:none;
}

.heatmap a:hover {
    text-decoration:underline;
}

.heatmap li {
    display: inline;
}

.minitab {
padding: 3px 0px 3px 8px;
margin-left: 0;
margin-top: 1px;
margin-bottom: 0px;
border-bottom: 1px solid #3c78b5;
font: bold 9px Verdana, sans-serif;
text-decoration: none;
float:none;
}
.selectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
background: white;
border-bottom: 1px solid white;
color: #000000;
text-decoration: none;
}
.unselectedminitab {
padding: 3px 0.5em;
margin-left: 3px;
margin-top: 1px;
border: 1px solid #3c78b5;
border-bottom: none;
background: #3c78b5;
color: #ffffff;
text-decoration: none;
}

a.unselectedminitab:hover {
color: #ffffff;
background: #003366;
border-color: #003366;
}

a.unselectedminitab:link { color: white; }
a.unselectedminitab:visited { color: white; }

a.selectedminitab:link { color: black; }
a.selectedminitab:visited { color: black; }

.linkerror { background-color: #fcc;}

a.labelOperationLink:link {text-decoration: underline}
a.labelOperationLink:active {text-decoration: underline}
a.labelOperationLink:visited {text-decoration: underline}
a.labelOperationLink:hover {text-decoration: underline}

a.newLabel:link {background-color: #ddffdd}
a.newLabel:active {background-color: #ddffdd}
a.newLabel:visited {background-color: #ddffdd}
a.newLabel:hover {background-color: #ddffdd}

ul.square {list-style-type: square}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
}


.inline-control-link a:link {text-decoration: none}
.inline-control-link a:active {text-decoration: none}
.inline-control-link a:visited {text-decoration: none}
.inline-control-link a:hover {text-decoration: none}

.inline-control-link {
    background: #ffc;
    font-size: 9px;
    color: #666;
    padding: 2px;
    text-transform: uppercase;
    text-decoration: none;
    cursor: pointer;
}

div.auto_complete {
    width: 350px;
    background: #fff;
}
div.auto_complete ul {
    border: 1px solid #888;
    margin: 0;
    padding: 0;
    width: 100%;
    list-style-type: none;
}
div.auto_complete ul li {
    margin: 0;
    padding: 3px;
}
div.auto_complete ul li.selected {
    background-color: #ffb;
}
div.auto_complete ul strong.highlight {
    color: #800;
    margin: 0;
    padding: 0;
}

/******* Edit Page Styles *******/
.toogleFormDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    padding:5px;
    margin-top: 5px;
}

.toogleInfoDiv{
    border:1px solid #A7A6AA;
    background-color:white;
    display:none;
    padding:5px;
    margin-top: 10px;
}

.inputSection{
    margin-bottom:20px;
}

#editBox{
   border:1px solid lightgray;
   background-color:#F0F0F0;
}

/******* Left Navigation Theme Styles ********/
.leftnav li a {
    text-decoration:none;
    color:white;
    margin:0px;
    display:block;
    padding:2px;
    padding-left:5px;
    background-color: #3c78b5;
    border-top:1px solid #3c78b5;
}

.leftnav li a:active {color:white;}
.leftnav li a:visited {color:white;}
.leftnav li a:hover {background-color: #003366; color:white;}

/* Added by Shaun during i18n */
.replaced
{
    background-color: #33CC66;
}

.topPadding
{
    margin-top: 20px;
}

/* new form style */
.form-block {
    padding: 6px;
}
.form-error-block {
    padding: 6px;
    background: #fcc;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-element-large {
    font-size: 16px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-element-small {
    font-size: 12px;
    font-weight: bold;
    font-family: Arial, sans-serif;
    color: #003366;
}

.form-header {
    background: lightyellow;
    border-top: #f0f0f0 1px solid;
    border-bottom: #f0f0f0 1px solid;
    margin-bottom: 6px;
    padding: 0 12px 0 12px;
}
.form-header p, .form-block p, .form-error-block p {
    line-height: normal;
    margin: 12px 0 12px 0;
}
.form-example {
    color: #888;
    font-size: 11px;
}
.form-divider {
    border-bottom: #ccc 1px solid;
    margin-bottom: 6px;
}
.form-buttons {
    margin-top: 6px;
    border-top: #ccc 1px solid;
    border-bottom: #ccc 1px solid;
    background: #f0f0f0;
    padding: 10px;
    text-align: center;
}
.form-buttons input {
    width: 100px;
}
.form-block .error {
    padding: 6px;
    margin-bottom: 6px;
}
    -->
    </style>
</head>
<body>

<div id="PageContent">
<table class="pagecontent" border="0" cellpadding="0" cellspacing="0" width="100%"><tr>
<td valign="top" class="pagebody">

    <div class="pageheader">
        <span class="pagetitle">
            Page Edited :
            <a href="http://cwiki.apache.org/confluence/display/CAMEL">CAMEL</a> :
            <a href="http://cwiki.apache.org/confluence/display/CAMEL/Bindy">Bindy</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/CAMEL/Bindy">Bindy</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~cmoulliard@xpectis.com">Charles Moulliard</a>
            <span class="smallfont">(Feb 24, 2009)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=108680&originalVersion=147&revisedVersion=148">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><h2><a name="Bindy-Bindy"></a>Bindy</h2>

<p><b>Available as of Camel 2.0</b></p>

<p>The idea that the developers have followed to design this component was to allow the binding of non structured data (or to be more precise non-XML data)<br/>
to Java Bean using annotations. Using Bindy, you can bind data like :</p>
<ul class="alternate" type="square">
	<li>CSV record,</li>
	<li>Fixedlength record,</li>
	<li>FIX messages,</li>
	<li>or any other non-structured data</li>
</ul>


<p>to one or many POJOS and to convert the data according to the type of the java property. POJOS can be linked together. 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 number, you can also define the precision and the decimal or grouping separators</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Type </th>
<th class='confluenceTh'> Format Type </th>
<th class='confluenceTh'> Pattern example </th>
<th class='confluenceTh'> Link </th>
</tr>
<tr>
<td class='confluenceTd'> Date </td>
<td class='confluenceTd'> DateFormat </td>
<td class='confluenceTd'> "dd-MM-yyyy" </td>
<td class='confluenceTd'> <span class="nobr"><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html" title="Visit page outside Confluence" rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/SimpleDateFormat.html<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> </td>
</tr>
<tr>
<td class='confluenceTd'> Decimal&#42; </td>
<td class='confluenceTd'> Decimalformat </td>
<td class='confluenceTd'> "##.###.###" </td>
<td class='confluenceTd'> <span class="nobr"><a href="http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html" title="Visit page outside Confluence" rel="nofollow">http://java.sun.com/j2se/1.5.0/docs/api/java/text/DecimalFormat.html<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> </td>
</tr>
</tbody></table>
<p>Decimal&#42; = Double, Integer, Float, Short, Long</p>
<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Be careful</b><br />This first release only support CSV record.</td></tr></table>
<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, ...) associate the required annotations (described hereafter) with Class or property name.</p>

<h2><a name="Bindy-Annotations"></a>Annotations</h2>

<p>The annotations created allow to map different concept of your model to the POJOs like :</p>

<ul class="alternate" type="square">
	<li>Type of record/message (csv, fixed length, key value pair (e.g. FIX message) ...),</li>
	<li>Link,</li>
	<li>Data field and their properties (int, type, ...)</li>
	<li>Key value Pair field</li>
</ul>


<p>This section will describe them :</p>

<h3><a name="Bindy-1.CsvRecord"></a>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>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Annotation name </th>
<th class='confluenceTh'> Record type </th>
<th class='confluenceTh'> Level </th>
</tr>
<tr>
<td class='confluenceTd'> <b>CsvRecord</b> </td>
<td class='confluenceTd'> csv </td>
<td class='confluenceTd'> Class </td>
</tr>
</tbody></table>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Parameter name </th>
<th class='confluenceTh'> type </th>
<th class='confluenceTh'> Info </th>
</tr>
<tr>
<td class='confluenceTd'> separator </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> mandatory - can be ',' or ';' or 'anything' </td>
</tr>
<tr>
<td class='confluenceTd'> skipFirstLine </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> optional - default value = false - allow to skip the first line of the CSV file </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>This annotation is associated to the root class of the model and must be declared one time.</td>
</tr>
</tbody></table>

<p><b>case 1 : separator = ','</b></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"><div class="codeHeader"><b>Separator ,</b></div><div class="codeContent">
<pre class="code-java">@CsvRecord( separator = <span class="code-quote">","</span> )
<span class="code-keyword">public</span> <span class="code-object">Class</span> Order {
...
}</pre>
</div></div>

<p><b>case 2 : separator = ';'</b></p>

<p>Compare to the previous cae, the separator here is ';' instead of ',' :</p>

<p>10; J; Pauline; M; XD12345678; Fortis Dynamic 15/15; 2500; USD; 08-01-2009</p>

<div class="code"><div class="codeHeader"><b>Separator ;</b></div><div class="codeContent">
<pre class="code-java">@CsvRecord( separator = <span class="code-quote">";"</span> )
<span class="code-keyword">public</span> <span class="code-object">Class</span> Order {
...
}</pre>
</div></div>

<p><b>case 3 : separator &amp; skipfirstline</b></p>

<p>The feature is interesting when the client wants to have in the first line of the file, the name of the data fields : </p>

<p>order id, client id, first name, last name, isin code, instrument name, quantity, currency, date</p>

<div class="code"><div class="codeHeader"><b>Separator &amp; skipFirstLine</b></div><div class="codeContent">
<pre class="code-java">@CsvRecord(separator = <span class="code-quote">","</span>, skipFirstLine = <span class="code-keyword">true</span>)
<span class="code-keyword">public</span> <span class="code-object">Class</span> Order {
...
}</pre>
</div></div>

<h3><a name="Bindy-2.Link"></a>2. Link</h3>

<p>The link annotation will allow to link objects together. </p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Annotation name </th>
<th class='confluenceTh'> Record type </th>
<th class='confluenceTh'> Level </th>
</tr>
<tr>
<td class='confluenceTd'> <b>Link</b> </td>
<td class='confluenceTd'> all </td>
<td class='confluenceTd'> Class &amp; Property </td>
</tr>
</tbody></table>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Parameter name </th>
<th class='confluenceTh'> type </th>
<th class='confluenceTh'> Info </th>
</tr>
<tr>
<td class='confluenceTd'> linkType </td>
<td class='confluenceTd'> LinkType </td>
<td class='confluenceTd'> optional - by default the value is LinkType.oneToOne - so you are not obliged to mention it </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'> Only one-to-one relation is allowed. </td>
</tr>
</tbody></table>

<p>e.g : If the model Class Client is linked to the Order class, then use annotation Link in the Order class like this :</p>

<div class="code"><div class="codeHeader"><b>Property Link</b></div><div class="codeContent">
<pre class="code-java">@CsvRecord(separator = <span class="code-quote">","</span>)
<span class="code-keyword">public</span> class Order {

    @DataField(pos = 0)
    <span class="code-keyword">private</span> <span class="code-object">int</span> orderNr;

    @Link
    <span class="code-keyword">private</span> Client client;
...</pre>
</div></div>

<p>AND for the class Client :</p>

<div class="code"><div class="codeHeader"><b>Class Link</b></div><div class="codeContent">
<pre class="code-java">@Link
<span class="code-keyword">public</span> class Client {
...
}</pre>
</div></div>


<h3><a name="Bindy-3.DataField"></a>3. DataField</h3>

<p>The DataField annotation defines the property of the field. Each datafield is identified by its position in the record, a type (string, int, date, ...) and optionaly of a pattern</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Annotation name </th>
<th class='confluenceTh'> Record type </th>
<th class='confluenceTh'> Level </th>
</tr>
<tr>
<td class='confluenceTd'> <b>DataField</b> </td>
<td class='confluenceTd'> all </td>
<td class='confluenceTd'> Property </td>
</tr>
</tbody></table>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Parameter name </th>
<th class='confluenceTh'> type </th>
<th class='confluenceTh'> Info </th>
</tr>
<tr>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> pos </td>
<td class='confluenceTd'> mandatory - digit number </td>
</tr>
<tr>
<td class='confluenceTd'> pattern </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> optional - default value = "" - will be used to format Decimal, Date, ... </td>
</tr>
<tr>
<td class='confluenceTd'> length </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> optional - digit number - represents the length of the field for fixed length format </td>
</tr>
<tr>
<td class='confluenceTd'> precision </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> optional - digit number - represents the precision to be used when the Decimal number will be formatted/parsed </td>
</tr>
</tbody></table>

<p><b>case 1 : position</b></p>

<p>This parameter represents the position of the field in the csv record</p>

<div class="code"><div class="codeHeader"><b>Position</b></div><div class="codeContent">
<pre class="code-java">@CsvRecord(separator = <span class="code-quote">","</span>)
<span class="code-keyword">public</span> class Order {

    @DataField(pos = 0)
    <span class="code-keyword">private</span> <span class="code-object">int</span> orderNr;

    @Link 
    <span class="code-keyword">private</span> Client client; -- class to link

    @DataField(pos = 4)
    <span class="code-keyword">private</span> <span class="code-object">String</span> isinCode;

...
}</pre>
</div></div>

<p>As you can see in this example the position starts at '0' but continues at '4'. The number '1' to '3' are defined in the class linked to Order.</p>

<div class="code"><div class="codeHeader"><b>Position continues in another model class</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class Client {

    @DataField(pos = 1)
    <span class="code-keyword">private</span> <span class="code-object">String</span> clientNr;

    @DataField(pos = 2)
    <span class="code-keyword">private</span> <span class="code-object">String</span> firstName;

    @DataField(pos = 3)
    <span class="code-keyword">private</span> <span class="code-object">String</span> lastName;
...
}</pre>
</div></div>

<p><b>case 2 : pattern</b></p>

<p>The pattern allows to enrich the format of your data</p>

<div class="code"><div class="codeHeader"><b>Pattern</b></div><div class="codeContent">
<pre class="code-java">@CsvRecord(separator = <span class="code-quote">","</span>)
<span class="code-keyword">public</span> class Order {

    @DataField(pos = 0)
    <span class="code-keyword">private</span> <span class="code-object">int</span> orderNr;

    @Link
    <span class="code-keyword">private</span> Client client;

    @DataField(pos = 4)
    <span class="code-keyword">private</span> <span class="code-object">String</span> isinCode;

    @DataField(name = <span class="code-quote">"Name"</span>, pos = 5)
    <span class="code-keyword">private</span> <span class="code-object">String</span> instrumentName;

    @DataField(pos = 6, precision = 2)
    <span class="code-keyword">private</span> BigDecimal amount;

    @DataField(pos = 7)
    <span class="code-keyword">private</span> <span class="code-object">String</span> currency;

    @DataField(pos = 8, pattern = <span class="code-quote">"dd-MM-yyyy"</span>) -- pattern
    <span class="code-keyword">private</span> Date orderDate;
...
}</pre>
</div></div>

<p><b>case 3 : precision</b></p>

<p>The precision is helpful when you want to define the decimal part of your number</p>

<div class="code"><div class="codeHeader"><b>Precision</b></div><div class="codeContent">
<pre class="code-java">@CsvRecord(separator = <span class="code-quote">","</span>)
<span class="code-keyword">public</span> class Order {

    @DataField(pos = 0)
    <span class="code-keyword">private</span> <span class="code-object">int</span> orderNr;

    @Link
    <span class="code-keyword">private</span> Client client;

    @DataField(pos = 4)
    <span class="code-keyword">private</span> <span class="code-object">String</span> isinCode;

    @DataField(name = <span class="code-quote">"Name"</span>, pos = 5)
    <span class="code-keyword">private</span> <span class="code-object">String</span> instrumentName;

    @DataField(pos = 6, precision = 2) -- precision
    <span class="code-keyword">private</span> BigDecimal amount;

    @DataField(pos = 7)
    <span class="code-keyword">private</span> <span class="code-object">String</span> currency;

    @DataField(pos = 8, pattern = <span class="code-quote">"dd-MM-yyyy"</span>)
    <span class="code-keyword">private</span> Date orderDate;
...
}</pre>
</div></div>

<h3><a name="Bindy-4.Message"></a>4. Message</h3>

<p>The Message annotation is used to identified the class of your model who will contain key value pairs fields. This kind of format is used mainly in Financial Exchange Protocol Messages (FIX). Nevertheless, this annotation can be used for any other format where data are identified by keys. The key pair values are separated each other by a separator which can be a special character like a tab delimitor (unicode representation : \u0009) or a start of heading (unicode representation : \u0001)</p>

<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">"FIX information"</b><br />More information about FIX can be found on this web site : <span class="nobr"><a href="http://www.fixprotocol.org/" title="Visit page outside Confluence" rel="nofollow">http://www.fixprotocol.org/<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>. To work with FIX messages, the model must contain a Header and Trailer classes linked to the root message class which could be a Order class. This is not mandatory but will be very helpful when you will use camel-bindy in combination with camel-fix which is a Fix gateway based on quickFix project [http://www.quickfixj.org.</td></tr></table>


<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Annotation name </th>
<th class='confluenceTh'> Record type </th>
<th class='confluenceTh'> Level </th>
</tr>
<tr>
<td class='confluenceTd'> <b>Message</b> </td>
<td class='confluenceTd'> key value pair </td>
<td class='confluenceTd'> Class </td>
</tr>
</tbody></table>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Parameter name </th>
<th class='confluenceTh'> type </th>
<th class='confluenceTh'> Info </th>
</tr>
<tr>
<td class='confluenceTd'> pairSeparator </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> mandatory - can be '=' or ';' or 'anything' </td>
</tr>
<tr>
<td class='confluenceTd'> keyValuePairSeparair</td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> mandatory - can be '\u0001', '\u0009', '#' or 'anything' </td>
</tr>
<tr>
<td class='confluenceTd'> type </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> optional - define the type of message (e.g. FIX, EMX, ...) </td>
</tr>
<tr>
<td class='confluenceTd'> version </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> optional - version of the message (e.g. 4.1) </td>
</tr>
<tr>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>&nbsp;</td>
<td class='confluenceTd'>This annotation is associated to the message class of the model and must be declared one time.</td>
</tr>
</tbody></table>

<p><b>case 1 : separator = 'u0001'</b></p>

<p>The separator used to segregate the key value pair fields in a FIX message is the ASCII '01' character or in unicode format '\u0001'. This character must be escaped a second time to avoid a java runtime error. Here is an example :</p>

<p>8=FIX.4.1 9=20 34=1 35=0 49=INVMGR 56=BRKR 1=BE.CHM.001 11=CHM0001-01 22=4 ...</p>

<p>and how to use the annotation</p>

<div class="code"><div class="codeHeader"><b>FIX - message</b></div><div class="codeContent">
<pre class="code-java">@Message(keyValuePairSeparator = <span class="code-quote">"="</span>, pairSeparator = <span class="code-quote">"\u0001"</span>, type=<span class="code-quote">"FIX"</span>, version=<span class="code-quote">"4.1"</span>)
<span class="code-keyword">public</span> class Order {
...
}</pre>
</div></div>

<table cellpadding='5' width='85%' cellspacing='8px' class='noteMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/warning.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Look at test cases</b><br />The ASCII character like tab, ... cannot be displayed in WIKI page. So, have a look to the test case of camel-bindy to see exactly how the FIX message looks like (src\test\data\fix\fix.txt) and the Order, Trailer, Header classes (src\test\java\org\apache\camel\dataformat\bindy\model\fix\simple\Order.java)</td></tr></table>

<h3><a name="Bindy-5.KeyValuePairField"></a>5. KeyValuePairField</h3>

<p>The KeyValuePairField annotation defines the property of a key value pair field. Each KeyValuePairField is identified by a tag (= key) and its value associated, a type (string, int, date, ...), optionaly a pattern and if the field is required</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Annotation name </th>
<th class='confluenceTh'> Record type </th>
<th class='confluenceTh'> Level </th>
</tr>
<tr>
<td class='confluenceTd'> <b>KeyValuePairField</b> </td>
<td class='confluenceTd'> Key Value Pair - FIX</td>
<td class='confluenceTd'> Property </td>
</tr>
</tbody></table>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'> Parameter name </th>
<th class='confluenceTh'> type </th>
<th class='confluenceTh'> Info </th>
</tr>
<tr>
<td class='confluenceTd'> tag </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> mandatory - digit number identifying the field in the message - must be unique </td>
</tr>
<tr>
<td class='confluenceTd'> pattern </td>
<td class='confluenceTd'> string </td>
<td class='confluenceTd'> optional - default value = "" - will be used to format Decimal, Date, ... </td>
</tr>
<tr>
<td class='confluenceTd'> precision </td>
<td class='confluenceTd'> int </td>
<td class='confluenceTd'> optional - digit number - represents the precision to be used when the Decimal number will be formatted/parsed </td>
</tr>
<tr>
<td class='confluenceTd'> required </td>
<td class='confluenceTd'> boolean </td>
<td class='confluenceTd'> optional </td>
</tr>
</tbody></table>

<p><b>case 1 : tag</b></p>

<p>This parameter represents the key of the field in the message</p>

<div class="code"><div class="codeHeader"><b>FIX message - Tag</b></div><div class="codeContent">
<pre class="code-java">@Message(keyValuePairSeparator = <span class="code-quote">"="</span>, pairSeparator = <span class="code-quote">"\u0001"</span>, type=<span class="code-quote">"FIX"</span>, version=<span class="code-quote">"4.1"</span>)
<span class="code-keyword">public</span> class Order {
    
    @Link Header header;
    
    @Link Trailer trailer;

    @KeyValuePairField(tag = 1) <span class="code-comment">// Client reference
</span>    <span class="code-keyword">private</span> <span class="code-object">String</span> Account;

    @KeyValuePairField(tag = 11) <span class="code-comment">// Order reference
</span>    <span class="code-keyword">private</span> <span class="code-object">String</span> ClOrdId;
    
    @KeyValuePairField(tag = 22) <span class="code-comment">// Fund ID type (Sedol, ISIN, ...)
</span>    <span class="code-keyword">private</span> <span class="code-object">String</span> IDSource;
    
    @KeyValuePairField(tag = 48) <span class="code-comment">// Fund code
</span>    <span class="code-keyword">private</span> <span class="code-object">String</span> SecurityId;
    
    @KeyValuePairField(tag = 54) <span class="code-comment">// Movement type ( 1 = Buy, 2 = sell)
</span>    <span class="code-keyword">private</span> <span class="code-object">String</span> Side;
    
    @KeyValuePairField(tag = 58) <span class="code-comment">// Free text
</span>    <span class="code-keyword">private</span> <span class="code-object">String</span> Text;

...
}</pre>
</div></div>

<h3><a name="Bindy-UsingtheJavaDSL"></a>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 CsvBindyFormat (who correspond to the class associated with the CSV record type) which is configured with "com.acme.model"<br/>
package name to initialize the model objects configured in this package.</p>
<div class="code"><div class="codeContent">
<pre class="code-java">DataFormat bindy = <span class="code-keyword">new</span> CsvBindyDataFormat(<span class="code-quote">"com.acme.model"</span>);

from(<span class="code-quote">"file:<span class="code-comment">//inbox"</span>).
</span>  unmarshal(bindy).
  to(<span class="code-quote">"bean:handleOrder"</span>);</pre>
</div></div>
<p>The Camel route will pick-up files in the inbox directory, unmarshall CSV records in a collection of model objects and send the collection<br/>
to the bean referenced by 'handleOrder'.</p>

<p>The collection is a list of Map. Each Map of the list contains the objects of the model. Each object can be retrieve using its class name.</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-object">int</span> count = 0;

    List&lt;Map&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt;&gt; models = <span class="code-keyword">new</span> ArrayList&lt;Map&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt;&gt;();
    Map&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt; model = <span class="code-keyword">new</span> HashMap&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt;();

    models = (List&lt;Map&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt;&gt;) exchange.getIn().getBody();

    Iterator&lt;Map&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt;&gt; it = models.iterator();

    <span class="code-keyword">while</span>(it.hasNext()){

          model = it.next();

	  <span class="code-keyword">for</span>(<span class="code-object">String</span> key : model.keySet()) {
	     <span class="code-object">Object</span> obj = model.get(key);
	     LOG.info(<span class="code-quote">"Count : "</span> + count + <span class="code-quote">", "</span> + obj.toString());
	  }

	 count++;
    }

    LOG.info(<span class="code-quote">"Nber of CSV records received by the csv bean : "</span> + count);</pre>
</div></div>
<p>To generate CSV records from a collection of model objects, you create the following route :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">from(<span class="code-quote">"bean:handleOrder"</span>)
   marshal(bindy)
   to(<span class="code-quote">"file:<span class="code-comment">//outbox"</span>)</span></pre>
</div></div>
<p>You can if you prefer use a named reference to a data format which can then be defined in your <a href="/confluence/display/CAMEL/Registry" title="Registry">Registry</a> such as via your <a href="/confluence/display/CAMEL/Spring" title="Spring">Spring</a> XML file. e.g.</p>
<div class="code"><div class="codeContent">
<pre class="code-java">from(<span class="code-quote">"file:<span class="code-comment">//inbox"</span>).
</span>  unmarshal(<span class="code-quote">"myBindyDataFormat"</span>).
  to(<span class="code-quote">"bean:handleOrder"</span>);</pre>
</div></div>

<h3><a name="Bindy-Unittest"></a>Unit test</h3>

<p>Here is two examples showing how to marshall or unmarshall a CSV file with Camel</p>

<div class="code"><div class="codeHeader"><b>Marshall</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> org.apache.camel.dataformat.bindy.csv;

<span class="code-keyword">import</span> java.math.BigDecimal;
<span class="code-keyword">import</span> java.util.ArrayList;
<span class="code-keyword">import</span> java.util.Calendar;
<span class="code-keyword">import</span> java.util.GregorianCalendar;
<span class="code-keyword">import</span> java.util.HashMap;
<span class="code-keyword">import</span> java.util.List;
<span class="code-keyword">import</span> java.util.Map;

<span class="code-keyword">import</span> org.apache.camel.EndpointInject;
<span class="code-keyword">import</span> org.apache.camel.Produce;
<span class="code-keyword">import</span> org.apache.camel.ProducerTemplate;
<span class="code-keyword">import</span> org.apache.camel.builder.RouteBuilder;
<span class="code-keyword">import</span> org.apache.camel.component.mock.MockEndpoint;
<span class="code-keyword">import</span> org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink.Client;
<span class="code-keyword">import</span> org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink.Order;
<span class="code-keyword">import</span> org.apache.camel.spring.javaconfig.SingleRouteCamelConfiguration;
<span class="code-keyword">import</span> org.junit.Test;
<span class="code-keyword">import</span> org.springframework.config.java.annotation.Bean;
<span class="code-keyword">import</span> org.springframework.config.java.annotation.Configuration;
<span class="code-keyword">import</span> org.springframework.config.java.test.JavaConfigContextLoader;
<span class="code-keyword">import</span> org.springframework.test.context.ContextConfiguration;
<span class="code-keyword">import</span> org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;

@ContextConfiguration(locations = <span class="code-quote">"org.apache.camel.dataformat.bindy.csv.BindyComplexCsvMarshallTest$ContextConfig"</span>, loader = JavaConfigContextLoader.class)
<span class="code-keyword">public</span> class BindyComplexCsvMarshallTest <span class="code-keyword">extends</span> AbstractJUnit4SpringContextTests {

    <span class="code-keyword">private</span> List&lt;Map&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt;&gt; models = <span class="code-keyword">new</span> ArrayList&lt;Map&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt;&gt;();
    <span class="code-keyword">private</span> <span class="code-object">String</span> result = <span class="code-quote">"10,A1,Julia,Roberts,BE123456789,Belgium Ventage 10/12,150,USD,14-01-2009"</span>;

    @Produce(uri = <span class="code-quote">"direct:start"</span>)
    <span class="code-keyword">private</span> ProducerTemplate template;

    @EndpointInject(uri = <span class="code-quote">"mock:result"</span>)
    <span class="code-keyword">private</span> MockEndpoint resultEndpoint;

    @Test
    <span class="code-keyword">public</span> void testMarshallMessage() <span class="code-keyword">throws</span> Exception {
        resultEndpoint.expectedBodiesReceived(result);

        template.sendBody(generateModel());

        resultEndpoint.assertIsSatisfied();
    }

    <span class="code-keyword">private</span> List&lt;Map&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt;&gt; generateModel() {
        Map&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt; model = <span class="code-keyword">new</span> HashMap&lt;<span class="code-object">String</span>, <span class="code-object">Object</span>&gt;();

        Order order = <span class="code-keyword">new</span> Order();
        order.setOrderNr(10);
        order.setAmount(<span class="code-keyword">new</span> BigDecimal(<span class="code-quote">"150"</span>));
        order.setIsinCode(<span class="code-quote">"BE123456789"</span>);
        order.setInstrumentName(<span class="code-quote">"Belgium Ventage 10/12"</span>);
        order.setCurrency(<span class="code-quote">"USD"</span>);

        Calendar calendar = <span class="code-keyword">new</span> GregorianCalendar();
        calendar.set(2009, 0, 14);
        order.setOrderDate(calendar.getTime());

        Client client = <span class="code-keyword">new</span> Client();
        client.setClientNr(<span class="code-quote">"A1"</span>);
        client.setFirstName(<span class="code-quote">"Julia"</span>);
        client.setLastName(<span class="code-quote">"Roberts"</span>);

        order.setClient(client);

        model.put(order.getClass().getName(), order);
        model.put(client.getClass().getName(), client);

        models.add(0, model);

        <span class="code-keyword">return</span> models;
    }

    @Configuration
    <span class="code-keyword">public</span> <span class="code-keyword">static</span> class ContextConfig <span class="code-keyword">extends</span> SingleRouteCamelConfiguration {
        BindyCsvDataFormat camelDataFormat = <span class="code-keyword">new</span> BindyCsvDataFormat(<span class="code-quote">"org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink"</span>);

        @Override
        @Bean
        <span class="code-keyword">public</span> RouteBuilder route() {
            <span class="code-keyword">return</span> <span class="code-keyword">new</span> RouteBuilder() {
                @Override
                <span class="code-keyword">public</span> void configure() {
                    from(<span class="code-quote">"direct:start"</span>).marshal(camelDataFormat).to(<span class="code-quote">"mock:result"</span>);
                }
            };
        }
    }

}</pre>
</div></div>

<div class="code"><div class="codeHeader"><b>Unmarshall</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> org.apache.camel.dataformat.bindy.csv;

<span class="code-keyword">import</span> org.apache.camel.EndpointInject;
<span class="code-keyword">import</span> org.apache.camel.builder.RouteBuilder;
<span class="code-keyword">import</span> org.apache.camel.component.mock.MockEndpoint;
<span class="code-keyword">import</span> org.apache.camel.spring.javaconfig.SingleRouteCamelConfiguration;
<span class="code-keyword">import</span> org.junit.Test;
<span class="code-keyword">import</span> org.springframework.config.java.annotation.Bean;
<span class="code-keyword">import</span> org.springframework.config.java.annotation.Configuration;
<span class="code-keyword">import</span> org.springframework.config.java.test.JavaConfigContextLoader;
<span class="code-keyword">import</span> org.springframework.test.context.ContextConfiguration;
<span class="code-keyword">import</span> org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests;

@ContextConfiguration(locations = <span class="code-quote">"org.apache.camel.dataformat.bindy.csv.BindyComplexCsvUnmarshallTest$ContextConfig"</span>, loader = JavaConfigContextLoader.class)
<span class="code-keyword">public</span> class BindyComplexCsvUnmarshallTest <span class="code-keyword">extends</span> AbstractJUnit4SpringContextTests {

    @EndpointInject(uri = <span class="code-quote">"mock:result"</span>)
    <span class="code-keyword">private</span> MockEndpoint resultEndpoint;

    @Test
    <span class="code-keyword">public</span> void testUnMarshallMessage() <span class="code-keyword">throws</span> Exception {
        resultEndpoint.expectedMessageCount(1);
        resultEndpoint.assertIsSatisfied();
    }

    @Configuration
    <span class="code-keyword">public</span> <span class="code-keyword">static</span> class ContextConfig <span class="code-keyword">extends</span> SingleRouteCamelConfiguration {
        BindyCsvDataFormat camelDataFormat = <span class="code-keyword">new</span> BindyCsvDataFormat(<span class="code-quote">"org.apache.camel.dataformat.bindy.model.complex.twoclassesandonelink"</span>);

        @Override
        @Bean
        <span class="code-keyword">public</span> RouteBuilder route() {
            <span class="code-keyword">return</span> <span class="code-keyword">new</span> RouteBuilder() {
                @Override
                <span class="code-keyword">public</span> void configure() {
                    from(<span class="code-quote">"file:<span class="code-comment">//src/test/data?noop=<span class="code-keyword">true</span>"</span>).unmarshal(camelDataFormat).to(<span class="code-quote">"mock:result"</span>);
</span>                }
            };
        }
    }

}</pre>
</div></div>

<h3><a name="Bindy-UsingSpringXML"></a>Using Spring XML</h3>

<p>TODO:</p>

<h3><a name="Bindy-Dependencies"></a>Dependencies</h3>

<p>To use Bindy in your camel routes you need to add the a dependency on <b>camel-bindy</b> which implements this data format.</p>

<p>If you use maven you could just add the following to your pom.xml, substituting the version number for the latest &amp; greatest release (see <a href="/confluence/display/CAMEL/Download" title="Download">the download page for the latest versions</a>).</p>
<div class="code"><div class="codeContent">
<pre class="code-java">&lt;dependency&gt;
  &lt;groupId&gt;org.apache.camel&lt;/groupId&gt;
  &lt;artifactId&gt;camel-bindy&lt;/artifactId&gt;
  &lt;version&gt;2.0.0&lt;/version&gt;
&lt;/dependency&gt;</pre>
</div></div></div>


</td></tr></table></div>
<p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
    <tr>
        <td height="12" background="http://cwiki.apache.org/confluence/images/border/border_bottom.gif"><img src="http://cwiki.apache.org/confluence/images/border/spacer.gif" width="1" height="1" border="0"/></td>
    </tr>
</table>

<div class="smalltext">
    Powered by
    <a href="http://www.atlassian.com/software/confluence/default.jsp?clicked=footer" class="smalltext">Atlassian Confluence</a>
    (Version: 2.2.9 Build:#527 Sep 07, 2006)
    -
    <a href="http://jira.atlassian.com/secure/BrowseProject.jspa?id=10470" class="smalltext">Bug/feature request</a><br/>
    <br>
    <a href="http://cwiki.apache.org/confluence/users/viewnotifications.action">Unsubscribe or edit your notifications preferences</a>

</div>

</body>
</html>


Mime
View raw message