camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Camel: Tutorial-Business-Partners (page edited)
Date Wed, 17 Sep 2008 14:42: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/Tutorial-Business-Partners">Tutorial-Business-Partners</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/CAMEL/Tutorial-Business-Partners">Tutorial-Business-Partners</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~ammulder">Aaron Mulder</a>
            <span class="smallfont">(Sep 17, 2008)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=97175&originalVersion=22&revisedVersion=23">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><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">Under Construction</b><br />
<p>This tutorial is a work in progress.</p></td></tr></table>

<h2><a name="Tutorial-Business-Partners-BackgroundandIntroduction"></a>Background and Introduction</h2>

<h3><a name="Tutorial-Business-Partners-BusinessBackground"></a>Business Background</h3>

<p>So there's a company, which we'll call Acme.  Acme sells widgets, in a fairly unusual way.  Their customers are responsible for telling Acme what they purchased.  The customer enters into their own systems (ERP or whatever) which widgets they bought from Acme.  Then at some point, their systems emit a record of the sale which needs to go to Acme so Acme can bill them for it.  Obviously, everyone wants this to be as automated as possible, so there needs to be integration between the customer's system and Acme.</p>

<p>Sadly, Acme's sales people are, technically speaking, doormats.  They tell all their prospects, "you can send us the data in whatever format, using whatever protocols, whatever.  You just can't change once it's up and running."</p>

<p>The result is pretty much what you'd expect.  Taking a random sample of 3 customers:</p>
<ul>
	<li>Customer 1: <b>XML over FTP</b></li>
	<li>Customer 2: <b>CSV over HTTP</b></li>
	<li>Customer 3: <b>Excel via e-mail</b></li>
</ul>


<p>Now on the Acme side, all this has to be converted to a canonical XML format and submitted to the Acme accounting system via JMS.  Then the Acme accounting system does its stuff and sends an XML reply via JMS, with a summary of what it processed (e.g. 3 line items accepted, line item #2 in error, total invoice $123.45).  Finally, that data needs to be formatted into an e-mail, and sent to a contact at the customer in question ("Dear Joyce, we received an invoice on 1/2/08.  We accepted 3 line items totaling $123.45, though there was an error with line items #2 [invalid quantity ordered].  Thank you for your business.  Love, Acme.").</p>

<p>So it turns out Camel can handle all this:</p>
<ul>
	<li>Listen for HTTP, e-mail, and FTP files</li>
	<li>Grab attachments from the e-mail messages</li>
	<li>Convert XML, XLS, and CSV files to a canonical XML format</li>
	<li>read and write JMS messages</li>
	<li>route based on company ID</li>
	<li>format e-mails using Velocity templates</li>
	<li>send outgoing e-mail messages</li>
</ul>


<h3><a name="Tutorial-Business-Partners-TutorialBackground"></a>Tutorial Background</h3>

<p>This tutorial will cover all that, plus setting up tests along the way.  You'll learn:</p>
<ul>
	<li>How to set up a Maven build for a Camel project</li>
	<li>How to transform XML, CSV, and Excel data into a standard XML format with Camel
	<ul>
		<li>How to write POJOs (Plain Old Java Objects), Velocity templates, and XSLT stylesheets that are invoked by Camel routes for message transformation</li>
	</ul>
	</li>
	<li>How to configure simple and complex Routes in Camel, using either the XML or the Java DSL format</li>
	<li>How to set up unit tests that load a Camel configuration and test Camel routes</li>
	<li>How to use Camel's Data Formats to automatically convert data between Java objects and XML, CSV files, etc.</li>
	<li>How to send and receive e-mail from Camel</li>
	<li>How to send and receive JMS messages from Camel</li>
	<li>How to use Enterprise Integration Patterns including Message Router and Pipes and Filters
	<ul>
		<li>How to use various languages to express content-based routing rules in Camel</li>
	</ul>
	</li>
	<li>How to deal with Camel messages, headers, and attachments</li>
</ul>


<p>You may choose to treat this as a hands-on tutorial, and work through building the code and configuration files yourself.  Each of the sections gives detailed descriptions of the steps that need to be taken to get the components and routes working in Camel, and takes you through tests to make sure they are working as expected.</p>

<p>But each section also links to working copies of the source and configuration files, so if you don't want the hands-on approach, you can simply review and/or download the finished files.</p>

<h3><a name="Tutorial-Business-Partners-HighLevelDiagram"></a>High-Level Diagram</h3>

<p>Here's more or less what the integration process looks like.</p>

<p>First, the input from the customers to Acme:</p>

<p><img src="/confluence/download/attachments/97175/camel-trading-partners-input.png" align="absmiddle" border="0" /></p>

<p>And then, the output from Acme to the customers:</p>

<p><img src="/confluence/download/attachments/97175/camel-trading-partners-output.png" align="absmiddle" border="0" /></p>

<h3><a name="Tutorial-Business-Partners-TutorialTasks"></a>Tutorial Tasks</h3>

<p>To get through this scenario, we're going to break it down into smaller pieces, implement and test those, and then try to assemble the big scenario and test that.</p>

<p>Here's what we'll try to accomplish:</p>
<ol>
	<li>Create a Maven build for the project</li>
	<li>Get sample files for the customer Excel, CSV, and XML input</li>
	<li>Get a sample file for the canonical XML format that Acme's accounting system uses</li>
	<li>Create an XSD for the canonical XML format</li>
	<li>Create JAXB POJOs corresponding to the canonical XSD</li>
	<li>Create an XSLT stylesheet to convert the Customer 1 (XML over FTP) messages to the canonical format</li>
	<li>Create a unit test to ensure that a simple Camel route invoking the XSLT stylesheet works</li>
	<li>Create a POJO that converts a <tt>List&lt;List&lt;String&gt;&gt;</tt> to the above JAXB POJOs
	<ul>
		<li>Note that Camel can automatically convert CSV input to a List of Lists of Strings representing the rows and columns of the CSV, so we'll use this POJO to handle Customer 2 (CSV over HTTP)</li>
	</ul>
	</li>
	<li>Create a unit test to ensure that a simple Camel route invoking the CSV processing works</li>
	<li>Create a POJO that converts a Customer 3 Excel file to the above JAXB POJOs (using POI to read Excel)</li>
	<li>Create a unit test to ensure that a simple Camel route invoking the Excel processing works</li>
	<li>Create a POJO that reads an input message, takes an attachment off the message, and replaces the body of the message with the attachment
	<ul>
		<li>This is assuming for Customer 3 (Excel over e-mail) that the e-mail contains a single Excel file as an attachment, and the actual e-mail body is throwaway</li>
	</ul>
	</li>
	<li>Build a set of Camel routes to handle the entire input (Customer -&gt; Acme) side of the scenario.</li>
	<li>Build unit tests for the Camel input.</li>
	<li><b>TODO:</b> Tasks for the output (Acme -&gt; Customer) side of the scenario</li>
</ol>


<h2><a name="Tutorial-Business-Partners-Let%27sGetStarted%21"></a>Let's Get Started!</h2>

<h3><a name="Tutorial-Business-Partners-Step1%3AInitialMavenbuild"></a>Step 1: Initial Maven build</h3>

<p>We'll use Maven for this project as there will eventually be quite a few dependencies and it's nice to have Maven handle them for us.  You should have a current version of Maven (e.g. 2.0.9) installed.</p>

<p>You can start with a pretty empty project directory and a Maven POM file, or use a simple JAR archetype to create one.</p>

<p>Here's a sample POM.  We've added a dependency on <b>camel-core</b>, and set the compile version to 1.5 (so we can use annotations):</p>

<div class="code"><div class="codeHeader"><b>pom.xml</b></div><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
<span class="code-tag">&lt;project xmlns=<span class="code-quote">"http://maven.apache.org/POM/4.0.0"</span>&gt;</span>
    <span class="code-tag">&lt;modelVersion&gt;</span>4.0.0<span class="code-tag">&lt;/modelVersion&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.apache.camel.tutorial<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>business-partners<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;version&gt;</span>1.0-SNAPSHOT<span class="code-tag">&lt;/version&gt;</span>
    <span class="code-tag">&lt;name&gt;</span>Camel Business Partners Tutorial<span class="code-tag">&lt;/name&gt;</span>
    <span class="code-tag">&lt;dependencies&gt;</span>
        <span class="code-tag">&lt;dependency&gt;</span>
            <span class="code-tag">&lt;artifactId&gt;</span>camel-core<span class="code-tag">&lt;/artifactId&gt;</span>
            <span class="code-tag">&lt;groupId&gt;</span>org.apache.camel<span class="code-tag">&lt;/groupId&gt;</span>
            <span class="code-tag">&lt;version&gt;</span>1.4.0<span class="code-tag">&lt;/version&gt;</span>
        <span class="code-tag">&lt;/dependency&gt;</span>
    <span class="code-tag">&lt;/dependencies&gt;</span>
    <span class="code-tag">&lt;build&gt;</span>
        <span class="code-tag">&lt;plugins&gt;</span>
            <span class="code-tag">&lt;plugin&gt;</span>
                <span class="code-tag">&lt;groupId&gt;</span>org.apache.maven.plugins<span class="code-tag">&lt;/groupId&gt;</span>
                <span class="code-tag">&lt;artifactId&gt;</span>maven-compiler-plugin<span class="code-tag">&lt;/artifactId&gt;</span>
                <span class="code-tag">&lt;configuration&gt;</span>
                    <span class="code-tag">&lt;source&gt;</span>1.5<span class="code-tag">&lt;/source&gt;</span>
                    <span class="code-tag">&lt;target&gt;</span>1.5<span class="code-tag">&lt;/target&gt;</span>
                <span class="code-tag">&lt;/configuration&gt;</span>
            <span class="code-tag">&lt;/plugin&gt;</span>
        <span class="code-tag">&lt;/plugins&gt;</span>
    <span class="code-tag">&lt;/build&gt;</span>
<span class="code-tag">&lt;/project&gt;</span></pre>
</div></div>

<h3><a name="Tutorial-Business-Partners-Step2%3AGetSampleFiles"></a>Step 2: Get Sample Files</h3>

<p>You can make up your own if you like, but here are the "off the shelf" ones.  You can save yourself some time by downloading these to <tt>src/test/resources</tt> in your Maven project.</p>
<ul>
	<li>Customer 1 (XML): <span class="nobr"><a href="/confluence/download/attachments/97175/input-customer1.xml?version=1" title="input-customer1.xml attached to Tutorial-Business-Partners">input-customer1.xml<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li>Customer 2 (CSV): <span class="nobr"><a href="/confluence/download/attachments/97175/input-customer2.csv?version=1" title="input-customer2.csv attached to Tutorial-Business-Partners">input-customer2.csv<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li>Customer 3 (Excel): <span class="nobr"><a href="/confluence/download/attachments/97175/input-customer3.xls?version=1" title="input-customer3.xls attached to Tutorial-Business-Partners">input-customer3.xls<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li>Canonical Acme XML Request: <span class="nobr"><a href="/confluence/download/attachments/97175/canonical-acme-request.xml?version=1" title="canonical-acme-request.xml attached to Tutorial-Business-Partners">canonical-acme-request.xml<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li>Canonical Acme XML Response: <b>TODO</b></li>
</ul>


<p>If you look at these files, you'll see that the different input formats use different field names and/or ordering, because of course the sales guys were totally OK with that.  Sigh.</p>

<h3><a name="Tutorial-Business-Partners-Step3%3AXSDandJAXBBeansfortheCanonicalXMLFormat"></a>Step 3: XSD and JAXB Beans for the Canonical XML Format</h3>

<p>Here's the sample of the canonical XML file:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
<span class="code-tag">&lt;invoice xmlns=<span class="code-quote">"http://activemq.apache.org/camel/tutorial/partners/invoice"</span>&gt;</span>
  <span class="code-tag">&lt;partner-id&gt;</span>2<span class="code-tag">&lt;/partner-id&gt;</span>
  <span class="code-tag">&lt;date-received&gt;</span>9/12/2008<span class="code-tag">&lt;/date-received&gt;</span>
  <span class="code-tag">&lt;line-item&gt;</span>
    <span class="code-tag">&lt;product-id&gt;</span>134<span class="code-tag">&lt;/product-id&gt;</span>
    <span class="code-tag">&lt;description&gt;</span>A widget<span class="code-tag">&lt;/description&gt;</span>
    <span class="code-tag">&lt;quantity&gt;</span>3<span class="code-tag">&lt;/quantity&gt;</span>
    <span class="code-tag">&lt;item-price&gt;</span>10.45<span class="code-tag">&lt;/item-price&gt;</span>
    <span class="code-tag">&lt;order-date&gt;</span>6/5/2008<span class="code-tag">&lt;/order-date&gt;</span>
  <span class="code-tag">&lt;/line-item&gt;</span>
  <span class="code-tag"><span class="code-comment">&lt;!-- // more line-item elements here --&gt;</span></span>
  <span class="code-tag">&lt;order-total&gt;</span>218.82<span class="code-tag">&lt;/order-total&gt;</span>
<span class="code-tag">&lt;/invoice&gt;</span></pre>
</div></div>

<p>If you're ambitions, you can write your own XSD (XML Schema) for files that look like this, and save it to <tt>src/main/xsd</tt>.</p>

<p><b>Solution:</b> If not, you can <span class="nobr"><a href="/confluence/download/attachments/97175/canonical-acme-request.xsd?version=1" title="canonical-acme-request.xsd attached to Tutorial-Business-Partners">download mine<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>, and save that to save it to <tt>src/main/xsd</tt>.</p>

<h4><a name="Tutorial-Business-Partners-GeneratingJAXBBeans"></a>Generating JAXB Beans</h4>

<p>Down the road we'll want to deal with the XML as Java POJOs.  We'll take a moment now to set up those XML binding POJOs.  So we'll update the Maven POM to generate JAXB beans from the XSD file.</p>

<p>We need a dependency:</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>camel-jaxb<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.apache.camel<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;version&gt;</span>1.4.0<span class="code-tag">&lt;/version&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span></pre>
</div></div>

<p>And a plugin configured:</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;plugin&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.codehaus.mojo<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>jaxb2-maven-plugin<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;executions&gt;</span>
        <span class="code-tag">&lt;execution&gt;</span>
            <span class="code-tag">&lt;goals&gt;</span>
                <span class="code-tag">&lt;goal&gt;</span>xjc<span class="code-tag">&lt;/goal&gt;</span>
            <span class="code-tag">&lt;/goals&gt;</span>
        <span class="code-tag">&lt;/execution&gt;</span>
    <span class="code-tag">&lt;/executions&gt;</span>
<span class="code-tag">&lt;/plugin&gt;</span></pre>
</div></div>

<p>That should do it (it automatically looks for XML Schemas in <tt>src/main/xsd</tt> to generate beans for).  Run <b>mvn install</b> and it should emit the beans into <tt>target/generated-sources/jaxb</tt>.  Your IDE should see them there, though you may need to update the project to reflect the new settings in the Maven POM.</p>

<h3><a name="Tutorial-Business-Partners-Step4%3AInitialWorkonCustomer1Input%28XMLoverFTP%29"></a>Step 4: Initial Work on Customer 1 Input (XML over FTP)</h3>

<p>To get a start on Customer 1, we'll create an XSLT template to convert the Customer 1 sample file into the canonical XML format, write a small Camel route to test it, and build that into a unit test.  If we get through this, we can be pretty sure that the XSLT template is valid and can be run safely in Camel.</p>

<h4><a name="Tutorial-Business-Partners-CreateanXSLTtemplate"></a>Create an XSLT template</h4>

<p>Start with the <span class="nobr"><a href="/confluence/download/attachments/97175/input-customer1.xml?version=1" title="input-customer1.xml attached to Tutorial-Business-Partners">Customer 1 sample input<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>.  You want to create an XSLT template to generate XML like the canonical XML sample above &#8211; an <tt>invoice</tt> element with <tt>line-item</tt> elements (one per item in the original XML document).  If you're especially clever, you can populate the current date and order total elements too.</p>

<p><b>Solution:</b> My <span class="nobr"><a href="/confluence/download/attachments/97175/XMLConverter.xsl?version=1" title="XMLConverter.xsl attached to Tutorial-Business-Partners">sample XSLT template<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> isn't that smart, but it'll get you going if you don't want to write one of your own.</p>

<h4><a name="Tutorial-Business-Partners-Createaunittest"></a>Create a unit test</h4>

<p>Here's where we get to some meaty Camel work.  We need to:</p>
<ul>
	<li>Set up a unit test</li>
	<li>That loads a Camel configuration</li>
	<li>That has a route invoking our XSLT</li>
	<li>Where the test sends a message to the route</li>
	<li>And ensures that some XML comes out the end of the route</li>
</ul>


<p>The easiest way to do this is to set up a Spring context that defines the Camel stuff, and then use a base unit test class from Spring that knows how to load a Spring context to run tests against.  So, the procedure is:</p>

<h5><a name="Tutorial-Business-Partners-SetUpaSkeletalCamel%2FSpringUnitTest"></a>Set Up a Skeletal Camel/Spring Unit Test</h5>
<ol>
	<li>Add dependencies on Camel-Spring, and the Spring test JAR (which will automatically bring in JUnit 3.8.x) to your POM:
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>camel-spring<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.apache.camel<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;version&gt;</span>1.4.0<span class="code-tag">&lt;/version&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span>
<span class="code-tag">&lt;dependency&gt;</span>
    <span class="code-tag">&lt;artifactId&gt;</span>spring-test<span class="code-tag">&lt;/artifactId&gt;</span>
    <span class="code-tag">&lt;groupId&gt;</span>org.springframework<span class="code-tag">&lt;/groupId&gt;</span>
    <span class="code-tag">&lt;version&gt;</span>2.5.5<span class="code-tag">&lt;/version&gt;</span>
    <span class="code-tag">&lt;scope&gt;</span>test<span class="code-tag">&lt;/scope&gt;</span>
<span class="code-tag">&lt;/dependency&gt;</span></pre>
</div></div></li>
	<li>Create a new unit test class in <tt>src/test/java/your-package-here</tt>, perhaps called <tt>XMLInputTest.java</tt></li>
	<li>Make the test extend Spring's <span class="nobr"><a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/test/context/junit38/AbstractJUnit38SpringContextTests.html" title="Visit page outside Confluence" rel="nofollow">AbstractJUnit38SpringContextTests<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> class, so it can load a Spring context for the test</li>
	<li>Create a Spring context configuration file in <tt>src/test/resources</tt>, perhaps called <tt>XMLInputTest-context.xml</tt></li>
	<li>In the unit test class, use the class-level <span class="nobr"><a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/test/context/ContextConfiguration.html" title="Visit page outside Confluence" rel="nofollow">@ContextConfiguration<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> annotation to indicate that a Spring context should be loaded
	<ul>
		<li>By default, this looks for a Context configuration file called <tt>TestClassName-context.xml</tt> in a subdirectory corresponding to the package of the test class.  For instance, if your test class was <tt>org.apache.camel.tutorial.XMLInputTest</tt>, it would look for <tt>org/apache/camel/tutorial/XMLInputTest-context.xml</tt></li>
		<li>To override this default, use the <b>locations</b> attribute on the @ContextConfiguration annotation to provide specific context file locations (starting each path with a / if you don't want it to be relative to the package directory).  My solution does this so I can put the context file directly in <tt>src/test/resources</tt> instead of in a package directory under there.</li>
	</ul>
	</li>
	<li>Add a <span class="nobr"><a href="http://activemq.apache.org/camel/maven/camel-core/apidocs/org/apache/camel/CamelContext.html" title="Visit page outside Confluence" rel="nofollow">CamelContext<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> instance variable to the test class, with the <span class="nobr"><a href="http://static.springframework.org/spring/docs/2.5.x/api/org/springframework/beans/factory/annotation/Autowired.html" title="Visit page outside Confluence" rel="nofollow">@Autowired<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> annotation.  That way Spring will automatically pull the CamelContext out of the Spring context and inject it into our test class.</li>
	<li>Add a <span class="nobr"><a href="http://activemq.apache.org/camel/maven/camel-core/apidocs/org/apache/camel/ProducerTemplate.html" title="Visit page outside Confluence" rel="nofollow">ProducerTemplate<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> instance variable and a <tt>setUp</tt> method that instantiates it from the CamelContext.  We'll use the ProducerTemplate later to send messages to the route.
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">protected</span> ProducerTemplate&lt;Exchange&gt; template;

<span class="code-keyword">protected</span> void setUp() <span class="code-keyword">throws</span> Exception {
    <span class="code-keyword">super</span>.setUp();
    template = camelContext.createProducerTemplate();
}</pre>
</div></div></li>
	<li>Put in an empty test method just for the moment (so when we run this we can see that "1 test succeeded")</li>
	<li>Add the Spring <span class="nobr"><a href="http://static.springframework.org/spring/docs/2.5.x/reference/beans.html#beans-factory-metadata" title="Visit page outside Confluence" rel="nofollow">&lt;beans&gt;<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> element (including the <span class="nobr"><a href="http://activemq.apache.org/camel/xml-reference.html" title="Visit page outside Confluence" rel="nofollow">Camel Namespace<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>) with an empty <a href="/confluence/display/CAMEL/Spring#Spring-UsingSpringtoconfiguretheCamelContext" title="UsingSpringtoconfiguretheCamelContext on Spring">&lt;camelContext&gt;</a> element to the Spring context, like this:
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&lt;beans xmlns=<span class="code-quote">"http://www.springframework.org/schema/beans"</span>
       <span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span>
       xsi:schemaLocation="http://www.springframework.org/schema/beans
                               http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                           http://activemq.apache.org/camel/schema/spring
                               http://activemq.apache.org/camel/schema/spring/camel-spring-1.4.0.xsd"&gt;

    <span class="code-tag">&lt;camelContext id=<span class="code-quote">"camel"</span> xmlns=<span class="code-quote">"http://activemq.apache.org/camel/schema/spring"</span>&gt;</span>
    <span class="code-tag">&lt;/camelContext&gt;</span>
<span class="code-tag">&lt;/beans&gt;</span></pre>
</div></div></li>
</ol>


<p>Test it by running <b>mvn install</b> and make sure there are no build errors.  So far it doesn't test much; just that your project and test and source files are all organized correctly, and the one empty test method completes successfully.</p>

<p><b>Solution:</b> Your test class might look something like this:</p>
<ul>
	<li>src/test/java/org/apache/camel/tutorial/<span class="nobr"><a href="/confluence/download/attachments/97175/empty-XMLInputTest.java?version=3" title="empty-XMLInputTest.java attached to Tutorial-Business-Partners">XMLInputTest.java<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li>src/test/resources/XMLInputTest-context.xml (same as just above)</li>
</ul>


<h5><a name="Tutorial-Business-Partners-FleshOuttheUnitTest"></a>Flesh Out the Unit Test</h5>

<p>So now we're going to write a Camel route that applies the XSLT to the sample Customer 1 input file, and makes sure that some XML output comes out:</p>
<ol>
	<li>Save the <span class="nobr"><a href="/confluence/download/attachments/97175/input-customer1.xml?version=1" title="input-customer1.xml attached to Tutorial-Business-Partners">input-customer1.xml<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> file to <tt>src/test/resources</tt></li>
	<li>Save your XSLT file (created in the previous step) to <tt>src/main/resources</tt></li>
	<li>Write a Camel Route, either right in the Spring XML, or using the Java DSL (in another class under <tt>src/test/java</tt> somewhere).  This route should use the <a href="/confluence/display/CAMEL/Pipes+and+Filters" title="Pipes and Filters">Pipes and Filters</a> integration pattern to:
	<ol>
		<li>Start from the endpoint <a href="/confluence/display/CAMEL/Direct" title="Direct">direct:start</a> (which lets the test conveniently pass messages into the route)</li>
		<li>Call the endpoint <a href="/confluence/display/CAMEL/XSLT" title="XSLT">xslt:YourXSLTFile.xsl</a> (to transform the message with the specified XSLT template)</li>
		<li>Send the result to the endpoint <a href="/confluence/display/CAMEL/Mock" title="Mock">mock:finish</a> (which lets the test verify the route output)</li>
	</ol>
	</li>
	<li>Add a test method to the unit test class that:
	<ol>
		<li>Get a reference to the Mock endpoint <tt>mock:finish</tt> using code like this:
<div class="code"><div class="codeContent">
<pre class="code-java">MockEndpoint finish = MockEndpoint.resolve(camelContext, <span class="code-quote">"mock:finish"</span>);</pre>
</div></div></li>
		<li>Set the <span class="nobr"><a href="http://activemq.apache.org/camel/maven/camel-core/apidocs/org/apache/camel/component/mock/MockEndpoint.html#setExpectedMessageCount(int)" title="Visit page outside Confluence" rel="nofollow">expectedMessageCount<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> on that endpoint to 1</li>
		<li>Get a reference to the Customer 1 input file, using code like this:
<div class="code"><div class="codeContent">
<pre class="code-java">InputStream in = XMLInputTest.class.getResourceAsStream(<span class="code-quote">"/input-partner1.xml"</span>);
assertNotNull(in);</pre>
</div></div></li>
		<li>Send that InputStream as a message to the <tt>direct:start</tt> endpoint, using code like this:
<div class="code"><div class="codeContent">
<pre class="code-java">template.sendBody(<span class="code-quote">"direct:start"</span>, in);</pre>
</div></div>
<p>Note that we can send the sample file body in several formats (File, InputStream, String, etc.) but in this case an InputStream is pretty convenient.</p></li>
		<li>Ensure that the message made it through the route to the final endpoint, by testing all configured Mock endpoints <span class="nobr"><a href="http://activemq.apache.org/camel/maven/camel-core/apidocs/org/apache/camel/component/mock/MockEndpoint.html#assertIsSatisfied(org.apache.camel.CamelContext)" title="Visit page outside Confluence" rel="nofollow">like this<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>:
<div class="code"><div class="codeContent">
<pre class="code-java">MockEndpoint.assertIsSatisfied(camelContext);</pre>
</div></div></li>
		<li>If you like, inspect the final message body using some code like <tt>finish.getExchanges().get(0).getIn().getBody()</tt>.
		<ul>
			<li>If you do this, you'll need to know what format that body is &#8211; String, byte array, InputStream, etc.</li>
		</ul>
		</li>
	</ol>
	</li>
	<li>Run your test with <b>mvn install</b> and make sure the build completes successfully.</li>
</ol>


<p><b>Solution:</b> Your finished test might look something like this:</p>
<ul>
	<li>src/test/java/org/apache/camel/tutorial/<span class="nobr"><a href="/confluence/download/attachments/97175/XMLInputTest.java?version=2" title="XMLInputTest.java attached to Tutorial-Business-Partners">XMLInputTest.java<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li>For XML Configuration:
	<ul>
		<li>src/test/resources/<span class="nobr"><a href="/confluence/download/attachments/97175/XMLInputTest-context.xml?version=1" title="XMLInputTest-context.xml attached to Tutorial-Business-Partners">XMLInputTest-context.xml<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	</ul>
	</li>
	<li>Or, for Java DSL Configuration:
	<ul>
		<li>src/test/resources/<span class="nobr"><a href="/confluence/download/attachments/97175/XMLInputTest-dsl-context.xml?version=1" title="XMLInputTest-dsl-context.xml attached to Tutorial-Business-Partners">XMLInputTest-dsl-context.xml<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
		<li>src/test/java/org/apache/camel/tutorial/routes/<span class="nobr"><a href="/confluence/download/attachments/97175/XMLInputTestRoute.java?version=1" title="XMLInputTestRoute.java attached to Tutorial-Business-Partners">XMLInputTestRoute.java<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	</ul>
	</li>
</ul>


<table cellpadding='5' width='85%' cellspacing='8px' class='tipMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Test Base Class</b><br />
<p>Once your test class is working, you might want to extract things like the @Autowired CamelContext, the ProducerTemplate, and the setUp method to a custom base class that you extend with your other tests.</p></td></tr></table>

<h3><a name="Tutorial-Business-Partners-Step5%3AInitialWorkonCustomer2Input%28CSVoverHTTP%29"></a>Step 5: Initial Work on Customer 2 Input (CSV over HTTP)</h3>

<p>To get a start on Customer 2, we'll create a POJO to convert the Customer 2 sample CSV data into the JAXB POJOs representing the canonical XML format, write a small Camel route to test it, and build that into a unit test. If we get through this, we can be pretty sure that the CSV conversion and JAXB handling is valid and can be run safely in Camel.</p>

<h4><a name="Tutorial-Business-Partners-CreateaCSVhandlingPOJO"></a>Create a CSV-handling POJO</h4>

<p>To begin with, <a href="/confluence/display/CAMEL/CSV" title="CSV">CSV is a known data format</a> in Camel.  Camel can convert a CSV file to a List (representing rows in the CSV) of Lists (representing cells in the row) of Strings (the data for each cell).  That means our POJO can just assume the data coming in is of type <tt>List&lt;List&lt;String&gt;&gt;</tt>, and we can declare a method with that as the argument.</p>

<p>Looking at the JAXB code in <tt>target/generated-sources/jaxb</tt>, it looks like an <tt>Invoice</tt> object represents the whole document, with a nested list of LineItemType objects for the line items.  Therefore our POJO method will return an <tt>Invoice</tt> (a document in the canonical XML format).</p>

<p>So to implement the CSV-to-JAXB POJO, we need to do something like this:</p>
<ol>
	<li>Create a new class under <tt>src/main/java</tt>, perhaps called <tt>CSVConverterBean</tt>.</li>
	<li>Add a method, with one argument of type <tt>List&lt;List&lt;String&gt;&gt;</tt> and the return type <tt>Invoice</tt>
	<ul>
		<li>You may <a href="/confluence/display/CAMEL/Bean#Bean-UsingAnnotationstobindparameterstotheExchange" title="UsingAnnotationstobindparameterstotheExchange on Bean">annotate</a> the argument with <span class="nobr"><a href="http://activemq.apache.org/camel/maven/camel-core/apidocs/org/apache/camel/Body.html" title="Visit page outside Confluence" rel="nofollow">@Body<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> to specifically designate it as the body of the incoming message</li>
	</ul>
	</li>
	<li>In the method, the logic should look roughly like this:
	<ol>
		<li>Create a new <tt>Invoice</tt>, using the method on the generated <tt>ObjectFactory</tt> class</li>
		<li>Loop through all the rows in the incoming CSV (the outer <tt>List</tt>)</li>
		<li>Skip the first row, which contains headers (column names)</li>
		<li>For the other rows:
		<ol>
			<li>Create a new <tt>LineItemType</tt> (using the <tt>ObjectFactory</tt> again)</li>
			<li>Pick out all the cell values (the Strings in the inner <tt>List</tt>) and put them into the correct fields of the <tt>LineItemType</tt>
			<ul>
				<li>Not all of the values will actually go into the line item in this example</li>
				<li>You may hardcode the column ordering based on the sample data file, or else try to read it dynamically from the headers in the first line</li>
				<li>Note that you'll need to use a JAXB <tt>DatatypeFactory</tt> to create the <tt>XMLGregorianCalendar</tt> values that JAXB uses for the <tt>date</tt> fields in the XML &#8211; which probably means using a <tt>SimpleDateFormat</tt> to parse the date and setting that date on a <tt>GregorianCalendar</tt></li>
			</ul>
			</li>
			<li>Add the line item to the invoice</li>
		</ol>
		</li>
		<li>Populate the partner ID, date of receipt, and order total on the <tt>Invoice</tt></li>
		<li>Throw any exceptions out of the method, so Camel knows something went wrong</li>
		<li>Return the finished <tt>Invoice</tt></li>
	</ol>
	</li>
</ol>


<p><b>Solution:</b> Here's an example of what the <span class="nobr"><a href="/confluence/download/attachments/97175/CSVConverterBean.java?version=1" title="CSVConverterBean.java attached to Tutorial-Business-Partners">CSVConverterBean<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> might look like.</p>

<h4><a name="Tutorial-Business-Partners-Createaunittest"></a>Create a unit test</h4>

<p>Start with a simple test class and test Spring context like last time, perhaps based on the name <tt>CSVInputTest</tt>:</p>

<div class="code"><div class="codeHeader"><b>CSVInputTest.java</b></div><div class="codeContent">
<pre class="code-java"></pre>
</div></div>

<div class="code"><div class="codeHeader"><b>CSVInputTest-context.xml</b></div><div class="codeContent">
<pre class="code-xml"></pre>
</div></div>

<h3><a name="Tutorial-Business-Partners-Step6%3AInitialWorkonCustomer3Input%28Exceloveremail%29"></a>Step 6: Initial Work on Customer 3 Input (Excel over e-mail)</h3>

<h4><a name="Tutorial-Business-Partners-CreateanExcelhandlingPOJO"></a>Create an Excel-handling POJO</h4>

<h4><a name="Tutorial-Business-Partners-Createaunittest"></a>Create a unit test</h4>

<h3><a name="Tutorial-Business-Partners-Step7%3APutthisalltogetherintoCamelroutesfortheCustomerInput"></a>Step 7: Put this all together into Camel routes for the Customer Input</h3>

<h3><a name="Tutorial-Business-Partners-Step8%3ACreateaunittestfortheCustomerInputRoutes"></a>Step 8: Create a unit test for the Customer Input Routes</h3></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