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-Example-ReportIncident-Part2 (page edited)
Date Tue, 22 Jul 2008 04:54:03 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-Example-ReportIncident-Part2">Tutorial-Example-ReportIncident-Part2</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/CAMEL/Tutorial-Example-ReportIncident-Part2">Tutorial-Example-ReportIncident-Part2</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~davsclaus">Claus Ibsen</a>
            <span class="smallfont">(Jul 21, 2008)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=90919&originalVersion=16&revisedVersion=17">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><h1><a name="Tutorial-Example-ReportIncident-Part2-Part2"></a>Part 2</h1>

<h2><a name="Tutorial-Example-ReportIncident-Part2-AddingCamel"></a>Adding Camel</h2>
<p>In this part we will introduce Camel so we start by adding Camel to our pom.xml:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;properties&gt;</span>
            ...
            <span class="code-tag">&lt;camel-version&gt;</span>1.4.0<span class="code-tag">&lt;/camel-version&gt;</span>
        <span class="code-tag">&lt;/properties&gt;</span>

        <span class="code-tag"><span class="code-comment">&lt;!-- camel --&gt;</span></span>
        <span class="code-tag">&lt;dependency&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;artifactId&gt;</span>camel-core<span class="code-tag">&lt;/artifactId&gt;</span>
            <span class="code-tag">&lt;version&gt;</span>${camel-version}<span class="code-tag">&lt;/version&gt;</span>
        <span class="code-tag">&lt;/dependency&gt;</span></pre>
</div></div>

<p>That's it, only <b>one</b> dependency for now.</p>
<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">Synchronize IDE</b><br />
<p>If you continue from part 1, remember to update your editor project settings since we have introduce new .jar files. For instance IDEA has a feature to synchronize with Maven projects.</p></td></tr></table>

<p>Now we turn towards our webservice endpoint implementation where we want to let Camel have a go at the input we receive. As Camel is very non invasive its basically a .jar file then we can just grap Camel but creating a new instance of <tt>DefaultCamelContext</tt> that is the hearth of Camel its context.</p>
<div class="code"><div class="codeContent">
<pre class="code-java">CamelContext camel = <span class="code-keyword">new</span> DefaultCamelContext();</pre>
</div></div>

<p>In fact we create a constructor in our webservice and add this code:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">private</span> CamelContext camel;

    <span class="code-keyword">public</span> ReportIncidentEndpointImpl() <span class="code-keyword">throws</span> Exception {
        <span class="code-comment">// create the camel context that is the <span class="code-quote">"heart"</span> of Camel
</span>        camel = <span class="code-keyword">new</span> DefaultCamelContext();

        <span class="code-comment">// add the log component
</span>        camel.addComponent(<span class="code-quote">"log"</span>, <span class="code-keyword">new</span> LogComponent());

        <span class="code-comment">// start Camel
</span>        camel.start();
    }</pre>
</div></div>

<h2><a name="Tutorial-Example-ReportIncident-Part2-Loggingthe%22HelloWorld%22"></a>Logging the "Hello World"</h2>
<p>Here at first we want Camel to log the <b>givenName</b> and <b>familyName</b> parameters we receive, so we add the <tt>LogComponent</tt> with the key <b>log</b>. And we must <b>start</b> Camel before its ready to act.</p>
<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">Component Documentation</b><br />
<p>The <a href="/confluence/display/CAMEL/Log" title="Log">Log</a> and <a href="/confluence/display/CAMEL/File" title="File">File</a> components is documented as well, just click on the links. Just return to this documentation later when you must use these components for real.</p></td></tr></table>
<p>Then we change the code in the method that is invoked by Apache CXF when a webservice request arrives. We get the name and let Camel have a go at it in the new method we create <b>sendToCamel</b>:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> OutputReportIncident reportIncident(InputReportIncident parameters) {
        <span class="code-object">String</span> name = parameters.getGivenName() + <span class="code-quote">" "</span> + parameters.getFamilyName();

        <span class="code-comment">// let Camel <span class="code-keyword">do</span> something with the name
</span>        sendToCamelLog(name);

        OutputReportIncident out = <span class="code-keyword">new</span> OutputReportIncident();
        out.setCode(<span class="code-quote">"OK"</span>);
        <span class="code-keyword">return</span> out;
    }</pre>
</div></div>

<p>Next is the Camel code. At first it looks like there are many code lines to do a simple task of logging the name - yes it is. But later you will in fact realize this is one of Camels true power. Its concise API. Hint: The same code can be used for <b>any</b> component in Camel.</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">private</span> void sendToCamelLog(<span class="code-object">String</span> name) {
        <span class="code-keyword">try</span> {
            <span class="code-comment">// get the log component
</span>            Component component = camel.getComponent(<span class="code-quote">"log"</span>);

            <span class="code-comment">// create an endpoint and configure it.
</span>            <span class="code-comment">// Notice the URI parameters <span class="code-keyword">this</span> is a common pratice in Camel to configure
</span>            <span class="code-comment">// endpoints based on URI.
</span>            <span class="code-comment">// com.mycompany.part2 = the log category used. Will log at INFO level as <span class="code-keyword">default</span>
</span>            Endpoint endpoint = component.createEndpoint(<span class="code-quote">"log:com.mycompany.part2"</span>);

            <span class="code-comment">// create an Exchange that we want to send to the endpoint
</span>            Exchange exchange = endpoint.createExchange();
            <span class="code-comment">// set the in message payload (=body) with the name parameter
</span>            exchange.getIn().setBody(name);

            <span class="code-comment">// now we want to send the exchange to <span class="code-keyword">this</span> endpoint and we then need a producer
</span>            <span class="code-comment">// <span class="code-keyword">for</span> <span class="code-keyword">this</span>, so we create and start the producer.
</span>            Producer producer = endpoint.createProducer();
            producer.start();
            <span class="code-comment">// process the exchange will send the exchange to the log component, that will process
</span>            <span class="code-comment">// the exchange and yes log the payload
</span>            producer.process(exchange);

            <span class="code-comment">// stop the producer, we want to be nice and cleanup
</span>            producer.stop();

        } <span class="code-keyword">catch</span> (Exception e) {
            <span class="code-comment">// we ignore any exceptions and just rethrow as runtime
</span>            <span class="code-keyword">throw</span> <span class="code-keyword">new</span> RuntimeException(e);

        }
    }</pre>
</div></div>
<p>Okay there are code comments in the code block above that should explain what is happening. We run the code by invoking our unit test with maven <tt>mvn test</tt>, and we should get this log line:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">INFO: Exchange[BodyType:<span class="code-object">String</span>, Body:Claus Ibsen]</pre>
</div></div>

<h2><a name="Tutorial-Example-ReportIncident-Part2-Writetofileeasywiththesamecodestyle"></a>Write to file - easy with the same code style</h2>
<p>Okay that isn't to impressive, Camel can log <img class="emoticon" src="/confluence/images/icons/emoticons/wink.gif" height="20" width="20" align="absmiddle" alt="" border="0"/> Well I promised that the above code style can be used for <b>any</b> component, so let's store the payload in a file. We do this by adding the file component to the Camel context</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// add the file component
</span>        camel.addComponent(<span class="code-quote">"file"</span>, <span class="code-keyword">new</span> FileComponent());</pre>
</div></div>

<p>And then we let camel write the payload to the file after we have logged, by creating a new method <b>sendToCamelFile</b>. We want to store the payload in filename with the incident id so we need this parameter also:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// let Camel <span class="code-keyword">do</span> something with the name
</span>        sendToCamelLog(name);
        sendToCamelFile(parameters.getIncidentId(), name);</pre>
</div></div>

<p>And then the code that is 99% identical. We have change the URI configuration when we create the endpoint as we pass in configuration parameters to the file component.<br/>
And then we need to set the output filename and this is done by adding a special header to the exchange. That's the only difference:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">private</span> void sendToCamelFile(<span class="code-object">String</span> incidentId, <span class="code-object">String</span> name) {
        <span class="code-keyword">try</span> {
            <span class="code-comment">// get the file component
</span>            Component component = camel.getComponent(<span class="code-quote">"file"</span>);

            <span class="code-comment">// create an endpoint and configure it.
</span>            <span class="code-comment">// Notice the URI parameters <span class="code-keyword">this</span> is a common pratice in Camel to configure
</span>            <span class="code-comment">// endpoints based on URI.
</span>            <span class="code-comment">// file://target instructs the base folder to output the files. We put in the target folder
</span>            <span class="code-comment">// then its actumatically cleaned by mvn clean
</span>            Endpoint endpoint = component.createEndpoint(<span class="code-quote">"file:<span class="code-comment">//target"</span>);
</span>
            <span class="code-comment">// create an Exchange that we want to send to the endpoint
</span>            Exchange exchange = endpoint.createExchange();
            <span class="code-comment">// set the in message payload (=body) with the name parameter
</span>            exchange.getIn().setBody(name);

            <span class="code-comment">// now a special header is set to instruct the file component what the output filename
</span>            <span class="code-comment">// should be
</span>            exchange.getIn().setHeader(FileComponent.HEADER_FILE_NAME, <span class="code-quote">"incident-"</span> + incidentId + <span class="code-quote">".txt"</span>);

            <span class="code-comment">// now we want to send the exchange to <span class="code-keyword">this</span> endpoint and we then need a producer
</span>            <span class="code-comment">// <span class="code-keyword">for</span> <span class="code-keyword">this</span>, so we create and start the producer.
</span>            Producer producer = endpoint.createProducer();
            producer.start();
            <span class="code-comment">// process the exchange will send the exchange to the file component, that will process
</span>            <span class="code-comment">// the exchange and yes write the payload to the given filename
</span>            producer.process(exchange);

            <span class="code-comment">// stop the producer, we want to be nice and cleanup
</span>            producer.stop();
        } <span class="code-keyword">catch</span> (Exception e) {
            <span class="code-comment">// we ignore any exceptions and just rethrow as runtime
</span>            <span class="code-keyword">throw</span> <span class="code-keyword">new</span> RuntimeException(e);
        }
    }</pre>
</div></div>

<p>After running our unit test again with <tt>mvn test</tt> we have a output file in the target folder:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">D:\demo\part-two&gt;type target\incident-123.txt
Claus Ibsen</pre>
</div></div>

<h2><a name="Tutorial-Example-ReportIncident-Part2-Fullyjavabasedconfigurationofendpoints"></a>Fully java based configuration of endpoints</h2>
<p>In the file example above the configuration was URI based. What if you want 100% java setter based style, well this is of course also possible. We just need to cast to the component specific endpoint and then we have all the setters available:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// create the file endpoint, we <span class="code-keyword">cast</span> to FileEndpoint because then we can <span class="code-keyword">do</span>
</span>            <span class="code-comment">// 100% java settter based configuration instead of the URI sting based
</span>            <span class="code-comment">// must pass in an empty string, or part of the URI configuration <span class="code-keyword">if</span> wanted 
</span>            FileEndpoint endpoint = (FileEndpoint)component.createEndpoint("");
            endpoint.setFile(<span class="code-keyword">new</span> File(<span class="code-quote">"target/subfolder"</span>));
            endpoint.setAutoCreate(<span class="code-keyword">true</span>);</pre>
</div></div>
<p>That's it. Now we have used the setters to configure the <tt>FileEndpoint</tt> that it should store the file in the folder target/subfolder. Of course Camel now stores the file in the subfolder.</p>
<div class="code"><div class="codeContent">
<pre class="code-java">D:\demo\part-two&gt;type target\subfolder\incident-123.txt
Claus Ibsen</pre>
</div></div>

<h2><a name="Tutorial-Example-ReportIncident-Part2-Lessonslearned"></a>Lessons learned</h2>
<p>Okay I wanted to demonstrate how you can be in 100% control of the configuration and usage of Camel based on plain Java code with no hidden magic or special <b>XML</b> or other configuration files. Just add the camel-core.jar and you are ready to go.</p>

<p>You must have noticed that the code for sending a message to a given endpoint is the same for both the <b>log</b> and <b>file</b>, in fact <b>any</b> Camel endpoint. You as the client shouldn't bother with component specific code such as file stuff for file components, jms stuff for JMS messaging etc. This is what the <a href="/confluence/display/CAMEL/Message+Endpoint" title="Message Endpoint">Message Endpoint</a> EIP pattern is all about and Camel solves this very very nice - a key pattern in Camel.</p>

<h2><a name="Tutorial-Example-ReportIncident-Part2-Reducingcodelines"></a>Reducing code lines</h2>
<p>Now that you have been introduced to Camel and one of its masterpiece patterns solved elegantly with the <a href="/confluence/display/CAMEL/Message+Endpoint" title="Message Endpoint">Message Endpoint</a> its time to give productive and show a solution in fewer code lines, in fact we can get it down to 5, 4, 3, 2 .. yes only <b>1 line of code</b>.</p>

<p>The key is the <b>ProducerTemplate</b> that is a Spring'ish xxxTemplate based producer. Meaning that it has methods to send messages to any Camel endpoints. First of all we need to get hold of such a template and this is done from the CamelContext</p>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">private</span> ProducerTemplate template;

    <span class="code-keyword">public</span> ReportIncidentEndpointImpl() <span class="code-keyword">throws</span> Exception {
        ...

        <span class="code-comment">// get the ProducerTemplate thst is a Spring'ish xxxTemplate based producer <span class="code-keyword">for</span> very
</span>        <span class="code-comment">// easy sending exchanges to Camel.
</span>        template = camel.createProducerTemplate();

        <span class="code-comment">// start Camel
</span>        camel.start();
    }</pre>
</div></div>

<p>Now we can use <b>template</b> for sending payloads to any endpoint in Camel. So all the logging gabble can be reduced to:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">template.sendBody(<span class="code-quote">"log:com.mycompany.part2.easy"</span>, name);</pre>
</div></div>

<p>And the same goes for the file, but we must also send the header to instruct what the output filename should be:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-object">String</span> filename = <span class="code-quote">"easy-incident-"</span> + incidentId + <span class="code-quote">".txt"</span>;
    template.sendBodyAndHeader(<span class="code-quote">"file:<span class="code-comment">//target/subfolder"</span>, name, FileComponent.HEADER_FILE_NAME, filename);</span></pre>
</div></div>

<h2><a name="Tutorial-Example-ReportIncident-Part2-Reducingevenmorecodelines"></a>Reducing even more code lines</h2>
<p>Well we got the Camel code down to 1-2 lines for sending the message to the component that does all the heavy work of wring the message to a file etc. But we still got 5 lines to initialize Camel.</p>
<div class="code"><div class="codeContent">
<pre class="code-java">camel = <span class="code-keyword">new</span> DefaultCamelContext();
    camel.addComponent(<span class="code-quote">"log"</span>, <span class="code-keyword">new</span> LogComponent());
    camel.addComponent(<span class="code-quote">"file"</span>, <span class="code-keyword">new</span> FileComponent());
    template = camel.createProducerTemplate();
    camel.start();</pre>
</div></div>
<p>This can also be reduced. All the standard components in Camel is auto discovered on-the-fly so we can remove these code lines and we are down to 3 lines.</p>

<table cellpadding='5' width='85%' cellspacing='8px' class='infoMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/information.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Component auto discovery</b><br />
<p>When an endpoint is requested with a scheme that Camel hasn't seen before it will try to look for it in the classpath. It will do so by looking for special Camel component marker files that reside in the folder <tt>META-INF/services/org/apache/camel/component</tt>. If there are files in this folder it will read them as the filename is the <b>scheme</b> part of the URL. For instance the <b>log</b> component is defined in this file <tt>META-INF/services/org/apache/component/log</tt> and its content is:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">class=org.apache.camel.component.log.LogComponent</pre>
</div></div>
<p>The class property defines the component implementation.</p>

<p><b>Tip:</b> End-users can create their 3rd party components using the same technique and have them been auto discovered on-the-fly.</p></td></tr></table>

<p>Okay back to the 3 code lines:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">camel = <span class="code-keyword">new</span> DefaultCamelContext();
    template = camel.createProducerTemplate();
    camel.start();</pre>
</div></div>
<p>Later will we see how we can reduce this to ... in fact 0 java code lines. But the 3 lines will do for now.</p>

<h2><a name="Tutorial-Example-ReportIncident-Part2-MessageTranslation"></a>Message Translation</h2>
<p>Okay lets head back to the over goal of the integration. Looking at the EIP diagrams at the introduction page we need to be able to translate the incoming webservice to an email. Doing so we need to create the email body. When doing the message translation we could put up our sleeves and do it manually in pure java with a StringBuilder such as:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">private</span> <span class="code-object">String</span> createMailBody(InputReportIncident parameters) {
        StringBuilder sb = <span class="code-keyword">new</span> StringBuilder();
        sb.append(<span class="code-quote">"Incident "</span>).append(parameters.getIncidentId());
        sb.append(<span class="code-quote">" has been reported on the "</span>).append(parameters.getIncidentDate());
        sb.append(<span class="code-quote">" by "</span>).append(parameters.getGivenName());
        sb.append(<span class="code-quote">" "</span>).append(parameters.getFamilyName());
        
        <span class="code-comment">// and the <span class="code-keyword">rest</span> of the mail body with more appends to the string builder
</span>        
        <span class="code-keyword">return</span> sb.toString();
    }</pre>
</div></div>
<p>But as always it is a hardcoded template for the mail body and the code gets kinda ugly if the mail message has to be a bit more advanced. But of course it just works out-of-the-box with just classes already in the JDK.</p>

<p>Lets use a template language instead such as <span class="nobr"><a href="http://velocity.apache.org/" title="Visit page outside Confluence" rel="nofollow">Apache Velocity<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>. As Camel have a component for <a href="/confluence/display/CAMEL/Velocity" title="Velocity">Velocity</a> integration we will use this component. Looking at the <a href="/confluence/display/CAMEL/Component" title="Component">Component List</a> overview we can see that camel-velocity component uses the artifactId <b>camel-velocity</b> so therefore we need to add this to the <b>pom.xml</b></p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;dependency&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;artifactId&gt;</span>camel-velocity<span class="code-tag">&lt;/artifactId&gt;</span>
            <span class="code-tag">&lt;version&gt;</span>${camel-version}<span class="code-tag">&lt;/version&gt;</span>
        <span class="code-tag">&lt;/dependency&gt;</span></pre>
</div></div>

<p>And now we have a Spring conflict as Apache CXF is dependent on Spring 2.0.8 and camel-velocity is dependent on Spring 2.5.5. To remedy this we could wrestle with the <b>pom.xml</b> with excludes settings in the dependencies or just bring in another dependency <b>camel-spring</b>:</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;dependency&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;artifactId&gt;</span>camel-spring<span class="code-tag">&lt;/artifactId&gt;</span>
            <span class="code-tag">&lt;version&gt;</span>${camel-version}<span class="code-tag">&lt;/version&gt;</span>
        <span class="code-tag">&lt;/dependency&gt;</span></pre>
</div></div>

<p>In fact camel-spring is such a vital part of Camel that you will end up using it in nearly all situations - we will look into how well Camel is seamless integration with Spring in part 3. For now its just another dependency. </p>

<p>We create the mail body with the Velocity template and create the file <tt>src/main/resources/MailBody.vm</tt>. The content in the <b>MailBody.vm</b> file is:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">Incident $body.incidentId has been reported on the $body.incidentDate by $body.givenName $body.familyName.

The person can be contact by:
- email: $body.email
- phone: $body.phone

Summary: $body.summary

Details:
$body.details

This is an auto generated email. You can not reply.</pre>
</div></div>

<p>Letting Camel creating the mail body and storing it as a file is as easy as the following 3 code lines:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">private</span> void generateEmailBodyAndStoreAsFile(InputReportIncident parameters) {
        <span class="code-comment">// generate the mail body using velocity template
</span>        <span class="code-comment">// notice that we just pass in our POJO (= InputReportIncident) that we
</span>        <span class="code-comment">// got from Apache CXF to Velocity.
</span>        <span class="code-object">Object</span> response = template.sendBody(<span class="code-quote">"velocity:MailBody.vm"</span>, parameters);
        <span class="code-comment">// Note: the response is a <span class="code-object">String</span> and can be <span class="code-keyword">cast</span> to <span class="code-object">String</span> <span class="code-keyword">if</span> needed
</span>
        <span class="code-comment">// store the mail in a file
</span>        <span class="code-object">String</span> filename = <span class="code-quote">"mail-incident-"</span> + parameters.getIncidentId() + <span class="code-quote">".txt"</span>;
        template.sendBodyAndHeader(<span class="code-quote">"file:<span class="code-comment">//target/subfolder"</span>, response, FileComponent.HEADER_FILE_NAME, filename);
</span>    }</pre>
</div></div>

<p>What is impressive is that we can just pass in our POJO object we got from Apache CXF to Velocity and it will be able to generate the mail body with this object in its context. Thus we don't need to prepare <b>anything</b> before we let Velocity loose and generate our mail body. Notice that the <b>template</b> method returns a object with out response. This object contains the mail body as a String object. We can cast to String if needed. </p>

<p>If we run our unit test with <tt>mvn test</tt> we can in fact see that Camel has produced the file and we can type its content:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">D:\demo\part-two&gt;type target\subfolder\mail-incident-123.txt
Incident 123 has been reported on the 2008-07-16 by Claus Ibsen.

The person can be contact by:
- email: davsclaus@apache.org
- phone: +45 2962 7576

Summary: bla bla

Details:
more bla bla

This is an auto generated email. You can not reply.</pre>
</div></div>

<h2><a name="Tutorial-Example-ReportIncident-Part2-Firstpartofthesolution"></a>First part of the solution</h2>
<p>What we have seen here is actually what it takes to build the first part of the integration flow. Receiving a request from a webservice, transform it to a mail body and store it to a file, and return an OK response to the webservice. All possible within 10 lines of code. So lets wrap it up here is what it takes:</p>

<div class="code"><div class="codeContent">
<pre class="code-java">/**
 * The webservice we have implemented.
 */
<span class="code-keyword">public</span> class ReportIncidentEndpointImpl <span class="code-keyword">implements</span> ReportIncidentEndpoint {

    <span class="code-keyword">private</span> CamelContext camel;
    <span class="code-keyword">private</span> ProducerTemplate template;

    <span class="code-keyword">public</span> ReportIncidentEndpointImpl() <span class="code-keyword">throws</span> Exception {
        <span class="code-comment">// create the camel context that is the <span class="code-quote">"heart"</span> of Camel
</span>        camel = <span class="code-keyword">new</span> DefaultCamelContext();

        <span class="code-comment">// get the ProducerTemplate thst is a Spring'ish xxxTemplate based producer <span class="code-keyword">for</span> very
</span>        <span class="code-comment">// easy sending exchanges to Camel.
</span>        template = camel.createProducerTemplate();

        <span class="code-comment">// start Camel
</span>        camel.start();
    }

    <span class="code-keyword">public</span> OutputReportIncident reportIncident(InputReportIncident parameters) {
        <span class="code-comment">// transform the request into a mail body
</span>        <span class="code-object">Object</span> mailBody = template.sendBody(<span class="code-quote">"velocity:MailBody.vm"</span>, parameters);

        <span class="code-comment">// store the mail body in a file
</span>        <span class="code-object">String</span> filename = <span class="code-quote">"mail-incident-"</span> + parameters.getIncidentId() + <span class="code-quote">".txt"</span>;
        template.sendBodyAndHeader(<span class="code-quote">"file:<span class="code-comment">//target/subfolder"</span>, mailBody, FileComponent.HEADER_FILE_NAME, filename);
</span>
        <span class="code-comment">// <span class="code-keyword">return</span> an OK reply
</span>        OutputReportIncident out = <span class="code-keyword">new</span> OutputReportIncident();
        out.setCode(<span class="code-quote">"OK"</span>);
        <span class="code-keyword">return</span> out;
    }

}</pre>
</div></div>
<p>Okay I missed by one, its in fact only <b>9 lines of java code and 2 fields</b>.</p>

<h2><a name="Tutorial-Example-ReportIncident-Part2-Endofpart2"></a>End of part 2</h2>
<p>I know this is a bit different introduction to Camel to how you can start using it in your projects just as a plain java .jar framework that isn't invasive at all. I took you through the coding parts that requires 6 - 10 lines to send a message to an endpoint, buts it's important to show the <a href="/confluence/display/CAMEL/Message+Endpoint" title="Message Endpoint">Message Endpoint</a> EIP pattern in action and how its implemented in Camel. Yes of course Camel also has to one liners that you can use, and will use in your projects for sending messages to endpoints. This part has been about good old plain java, nothing fancy with Spring, XML files, auto discovery, OGSi or other new technologies. I wanted to demonstrate the basic building blocks in Camel and how its setup in pure god old fashioned Java. There are plenty of eye catcher examples with one liners that does more than you can imagine - we will come there in the later parts. </p>

<p>Okay part 3 is about building the last pieces of the solution and now it gets interesting since we have to wrestle with the event driven consumer.<br/>
Brew a cup of coffee, tug the kids and kiss the wife, for now we will have us some fun with the Camel. See you in part 3.</p>

<h2><a name="Tutorial-Example-ReportIncident-Part2-%23Resources"></a><a href="#Tutorial-Example-ReportIncident-Part2-Resources" title="Resources on Tutorial-Example-ReportIncident-Part2">Resources</a></h2>
<ul>
	<li>    <script language="javascript">
    function toggle(id) {
        var oldAttachmentVersionsBlock = document.getElementById('history_' + id);
        var latestAttachmentVersionBlock = document.getElementById("attachment_" + id);
        with (oldAttachmentVersionsBlock.style)
        {
            if ( display == "none" )
            {
                display = "";
                // change the css class of the tr so that all td's sitting inside willbe stripped of their bottom borders (so it looks nice!)
                if (latestAttachmentVersionBlock.className != '')
                    latestAttachmentVersionBlock.className = 'rowAlternateNoBottomColor';
                else
                    latestAttachmentVersionBlock.className = 'rowAlternateNoBottomNoColor';
            }
            else
            {
                display = "none";
                if (latestAttachmentVersionBlock.className == 'rowAlternateNoBottomColor')
                    latestAttachmentVersionBlock.className = 'rowAlternate';
                else
                    latestAttachmentVersionBlock.className = null;
            }
        }

        var arrowIcon = document.getElementById('arrow' + id);
        with (arrowIcon)
        {
            if (src != null && (src.indexOf('/confluence/images/icons/arrow_closed_active_16.gif') != -1 || src.indexOf('/confluence/images/icons/arrow_closing_active_16.gif') != -1))
            {
                src = '/confluence/images/icons/arrow_opening_active_16.gif';
            }
            else
            {
                src = '/confluence/images/icons/arrow_closing_active_16.gif';
            }
        }


    }
    </script>


            <table class="tableview" cellpadding="0" cellspacing="0" width="100%">
            <tr>
                <th width="1%">&nbsp;</th>
                <th width="1%"><a href="/confluence/display/CAMEL/Tutorial-Example-ReportIncident-Part2?sortBy=name">Name</a></th>
                <th width="1%"><a href="/confluence/display/CAMEL/Tutorial-Example-ReportIncident-Part2?sortBy=size">Size</a></th>
                <th width="1%">Creator</th>
                <th width="1%"><a href="/confluence/display/CAMEL/Tutorial-Example-ReportIncident-Part2?sortBy=date">Date</a></th>
                <th>Comment</th>
                <th width="1%">&nbsp;</th>
            </tr>
            
                            <tr      id="attachment_7721">
                            <td nowrap><img align="absmiddle" height="16" width="16" id="arrow7721" src="/confluence/images/border/spacer.gif"></td>
                <td nowrap><a name="Tutorial-Example-ReportIncident-Part2-attachment-part-two.zip"><img src="/confluence/images/icons/attachments/zip.gif" height=16 width=16 border=0 vspace=1 align=absmiddle alt="ZIP Archive"></a> <a href="/confluence/download/attachments/90919/part-two.zip">part-two.zip</a></td>
                <td nowrap>17 kb</td>
                <td nowrap>    <a href="/confluence/display/~davsclaus">Claus Ibsen</a></td>
                <td nowrap>Jul 19, 2008</td>
                <td>                        &nbsp;
                                    </td>
                <td nowrap>&nbsp;

                                                                        <a href="/confluence/pages/movepageattachment.action?pageId=90919&fileName=part-two.zip" id="edit_attachment">Edit</a> |
                                            
                                                                        <a href="/confluence/pages/removeattachmentonpage.action?pageId=90919&fileName=part-two.zip&version=2"
                            onClick="javascript:if( confirm('Are you sure you want to remove attached file part-two.zip?')) return true; else return false;">Remove</a>
                                                            </td>
            </tr>

                                </table>
    
<br>

    
    </li>
</ul>


<h2><a name="Tutorial-Example-ReportIncident-Part2-Links"></a>Links</h2>
<ul class="alternate" type="square">
	<li><a href="/confluence/display/CAMEL/Tutorial-Example-ReportIncident" title="Tutorial-Example-ReportIncident">Introduction</a></li>
	<li><a href="/confluence/display/CAMEL/Tutorial-Example-ReportIncident-Part1" title="Tutorial-Example-ReportIncident-Part1">Part 1</a></li>
	<li><a href="/confluence/display/CAMEL/Tutorial-Example-ReportIncident-Part2" title="Tutorial-Example-ReportIncident-Part2">Part 2</a></li>
	<li><a href="/confluence/display/CAMEL/Tutorial-Example-ReportIncident-Part3" title="Tutorial-Example-ReportIncident-Part3">Part 3</a></li>
</ul>
</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