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-Part5 (page edited)
Date Tue, 06 Jan 2009 08:38: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-Example-ReportIncident-Part5">Tutorial-Example-ReportIncident-Part5</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/CAMEL/Tutorial-Example-ReportIncident-Part5">Tutorial-Example-ReportIncident-Part5</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~davsclaus">Claus Ibsen</a>
            <span class="smallfont">(Jan 06, 2009)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=96177&originalVersion=14&revisedVersion=15">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><h2><a name="Tutorial-Example-ReportIncident-Part5-Part5"></a>Part 5</h2>

<p>We continue from part 4 where we have the routing in place. However as you might have noticed we aren't quiet there yet with a nice solution, we are still coding to much. In this part we will look into to address these two concerns:</p>
<ul class="alternate" type="square">
	<li>Starting Camel automatically</li>
	<li>Using CXF in routing</li>
</ul>


<h3><a name="Tutorial-Example-ReportIncident-Part5-StartingCamelautomatically"></a>Starting Camel automatically</h3>
<p>Our current deployment model is as a war and we have the <tt>web.xml</tt> to help start things. Well in fact we will leverage Spring to start the world <img class="emoticon" src="/confluence/images/icons/emoticons/wink.gif" height="20" width="20" align="absmiddle" alt="" border="0"/>. We use it's ContextListener</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- the listener that kick-starts Spring --&gt;</span></span>
	<span class="code-tag">&lt;listener&gt;</span>
		<span class="code-tag">&lt;listener-class&gt;</span>org.springframework.web.context.ContextLoaderListener<span class="code-tag">&lt;/listener-class&gt;</span>
	<span class="code-tag">&lt;/listener&gt;</span></pre>
</div></div>

<p>Then we need a standard Spring XML file so we create a new file in <tt>src/main/resources</tt> and name it <b>camel-config.xml</b>. Before we start editing this XML file we need to link to it from the web.xml file. So we add this snippet to the web.xml:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- location of spring xml files --&gt;</span></span>
	<span class="code-tag">&lt;context-param&gt;</span>
	    <span class="code-tag">&lt;param-name&gt;</span>contextConfigLocation<span class="code-tag">&lt;/param-name&gt;</span>
            <span class="code-tag">&lt;param-value&gt;</span>classpath:camel-config.xml<span class="code-tag">&lt;/param-value&gt;</span>
	<span class="code-tag">&lt;/context-param&gt;</span></pre>
</div></div>

<p>Now we are ready to edit the <b>camel-config.xml</b> file that is a standard Spring XML bean file. So you can add standard spring beans and whatnot you like to do and can do with Spring.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml">&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"&gt;

<span class="code-tag">&lt;/beans&gt;</span></pre>
</div></div>

<p>Now we are nearly there, we just need to add Camel to the Spring XML file, so Spring knows Camel exists and can start it. First we need to add Camel to the schema location in the top of the XML file.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml">...
       xsi:schemaLocation="
            http://activemq.apache.org/camel/schema/spring http://activemq.apache.org/camel/schema/spring/camel-spring.xsd
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&gt;</pre>
</div></div>

<p>Now we are ready to let <a href="/confluence/display/CAMEL/Spring" title="Spring">Spring and Camel</a> work together. What we need to do is adding a <a href="/confluence/display/CAMEL/CamelContext" title="CamelContext">CamelContext</a> to the Spring XML file. Camel ships with a CamelContextFactoryBean that is a Spring factory bean we should use for creating and initializing the SpringCamelContext. SpringCamelContext is extending CamelContext to be Spring aware so Camel and Spring can work nicely together. For instance the <a href="/confluence/display/CAMEL/Registry" title="Registry">Registry</a> will now use Spring bean lookup. So any spring bean can now easily be lookup and used from Camel. Well back to today's lesson. So we can create a SpringCamelContext using the factory bean as illustrated below:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;bean id=<span class="code-quote">"camel"</span> class=<span class="code-quote">"org.apache.camel.spring.CamelContextFactoryBean"</span>/&gt;</span></pre>
</div></div>

<p>However this is not used very often as Spring has support for custom namespace, so Camel has a CamelNamespaceHandler so we can create Camel using nice XML syntax as:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><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></pre>
</div></div>

<h4><a name="Tutorial-Example-ReportIncident-Part5-Addingroutebuilder"></a>Adding route builder</h4>
<p>Now we have Camel integrated but we still need to add our route bulder that we did manually from the javacode as:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// append the routes to the context
</span>    context.addRoutes(<span class="code-keyword">new</span> ReportIncidentRoutes());</pre>
</div></div>

<p>There are two solutions to this</p>
<ul class="alternate" type="square">
	<li>using spring bean</li>
	<li>package scanning</li>
</ul>


<p>Using a spring bean we just declare the route builder using a regular spring bean:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;bean id=<span class="code-quote">"myrouter"</span> class=<span class="code-quote">"org.apache.camel.example.reportincident.ReportIncidentRoutes"</span>/&gt;</span></pre>
</div></div>

<p>And then we can refer to it from our CamelContext:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><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;routeBuilderRef ref=<span class="code-quote">"myrouter"</span>/&gt;</span>
    <span class="code-tag">&lt;/camelContext&gt;</span></pre>
</div></div>

<p>So now when Spring start's it will read the <b>camel-context.xml</b> file and thus also start Camel as well. As SpringCamelContext is spring lifecycle event aware, Camel will also shutdown when Spring is shutting down. So when you stop the web application Spring will notify this and Camel is also shutdown nice and properly. So as an end user no need to worry. </p>

<p>The package scanning solution is for convenience to refer to a java package and Camel will scan all classes within this package for RouteBuilder classes. If using this then you dont need to declare your route builder as a Spring bean. So the XML can be reduced to.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><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;package&gt;</span>org.apache.camel.example.reportincident<span class="code-tag">&lt;/package&gt;</span>
    <span class="code-tag">&lt;/camelContext&gt;</span></pre>
</div></div>

<h3><a name="Tutorial-Example-ReportIncident-Part5-UsingCXFdirectly"></a>Using CXF directly</h3>
<p>Now we have seen how you can leverage <a href="/confluence/display/CAMEL/Spring" title="Spring">Spring</a> to start Camel, in fact it handles the lifecycle of Camel, so you can say Camel is embedded with Spring in your application.</p>

<p>From the very start of this tutorial we have used CXF as the webservice framework and we haven't integrated it directly with Camel as it can do out-of-the-box. Camel ships with a <a href="/confluence/display/CAMEL/CXF" title="CXF"><b>camel-cxf</b></a> component for integrating CXF directly within Camel routing. In our tutorial we are exposing a webservice so we want continue to do this. Before we continue let's recap at what the webservice implementation we have from part 4</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 context;

    <span class="code-keyword">public</span> ReportIncidentEndpointImpl() <span class="code-keyword">throws</span> Exception {
        <span class="code-comment">// create the context
</span>        context = <span class="code-keyword">new</span> DefaultCamelContext();

        <span class="code-comment">// append the routes to the context
</span>        context.addRoutes(<span class="code-keyword">new</span> ReportIncidentRoutes());

        <span class="code-comment">// at the end start the camel context
</span>        context.start();
    }

    <span class="code-keyword">public</span> OutputReportIncident reportIncident(InputReportIncident parameters) {
        <span class="code-comment">// create the producer template to use <span class="code-keyword">for</span> sending messages
</span>        ProducerTemplate producer = context.createProducerTemplate();
        <span class="code-comment">// send the body and the filename defined with the special header key
</span>        <span class="code-object">Object</span> mailBody = producer.sendBody(<span class="code-quote">"direct:start"</span>, parameters);
        <span class="code-object">System</span>.out.println(<span class="code-quote">"Body:"</span> + mailBody);

        <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>We have already seen how we can get Spring starting Camel so the constructor method can be removed. What next is that the CamelContext needed in this code should be the one from our <b>camel-context.xml</b> file. So we change the code to use a plain setter injection (we can use Spring annotations and whatelse but we keep it simple with a setter):</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 context;

    <span class="code-keyword">public</span> void setCamelContext(CamelContext context) {
        <span class="code-keyword">this</span>.context = context;
    }

    <span class="code-keyword">public</span> OutputReportIncident reportIncident(InputReportIncident parameters) {
        <span class="code-comment">// create the producer template to use <span class="code-keyword">for</span> sending messages
</span>        ProducerTemplate producer = context.createProducerTemplate();
        <span class="code-comment">// send the body and the filename defined with the special header key
</span>        <span class="code-object">Object</span> mailBody = producer.sendBody(<span class="code-quote">"direct:start"</span>, parameters);
        <span class="code-object">System</span>.out.println(<span class="code-quote">"Body:"</span> + mailBody);

        <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>And then we need to instruct Spring to set this property. Turning back to cxf-config.xml from part 4 we can add a reference to our camel context</p>
<div class="code"><div class="codeContent">
<pre class="code-xml">&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>
       <span class="code-keyword">xmlns:jaxws</span>=<span class="code-quote">"http://cxf.apache.org/jaxws"</span>
       xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
            http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"&gt;

    <span class="code-tag">&lt;import resource=<span class="code-quote">"classpath:META-INF/cxf/cxf.xml"</span>/&gt;</span>
    <span class="code-tag">&lt;import resource=<span class="code-quote">"classpath:META-INF/cxf/cxf-extension-soap.xml"</span>/&gt;</span>
    <span class="code-tag">&lt;import resource=<span class="code-quote">"classpath:META-INF/cxf/cxf-servlet.xml"</span>/&gt;</span>

    <span class="code-tag"><span class="code-comment">&lt;!-- implementation of the webservice, and we refer to our camel context with the id = camel from camel-context.xml --&gt;</span></span>
    <span class="code-tag">&lt;bean id=<span class="code-quote">"reportIncidentEndpoint"</span> class=<span class="code-quote">"org.apache.camel.example.reportincident.ReportIncidentEndpointImpl"</span>&gt;</span>
       <span class="code-tag">&lt;property name=<span class="code-quote">"context"</span> ref=<span class="code-quote">"camel"</span>/&gt;</span>
    <span class="code-tag">&lt;/bean&gt;</span>

    <span class="code-tag"><span class="code-comment">&lt;!-- export the webservice using jaxws --&gt;</span></span>
    &lt;jaxws:endpoint id=<span class="code-quote">"reportIncident"</span>
                    implementor=<span class="code-quote">"#reportIncidentEndpoint"</span>
                    address=<span class="code-quote">"/incident"</span>
                    wsdlLocation=<span class="code-quote">"/WEB-INF/wsdl/report_incident.xml"</span>
                    endpointName=<span class="code-quote">"s:ReportIncidentPort"</span>
                    serviceName=<span class="code-quote">"s:ReportIncidentService"</span>
                    <span class="code-keyword">xmlns:s</span>=<span class="code-quote">"http://reportincident.example.camel.apache.org"</span>/&gt;
<span class="code-tag">&lt;/beans&gt;</span></pre>
</div></div>

<p>So now we have two spring XML files</p>
<ul class="alternate" type="square">
	<li>cxf-config.xml</li>
	<li>camel-config.xml</li>
</ul>


<p>And since <b>cxf-config.xml</b> is dependent on <b>camel-config.xml</b> we need to have correct ordering in our web.xml where we have defined the XML files to load by Spring. So we set the <b>camel-config.xml</b> before the <b>cxf-config.xml</b> so Spring have created the SpringCamelContext and registered it in its registry with the id = camel.</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag"><span class="code-comment">&lt;!-- location of spring xml files --&gt;</span></span>
    <span class="code-tag">&lt;context-param&gt;</span>
        <span class="code-tag">&lt;param-name&gt;</span>contextConfigLocation<span class="code-tag">&lt;/param-name&gt;</span>
        <span class="code-tag">&lt;param-value&gt;</span>classpath:camel-config.xml<span class="code-tag">&lt;/param-value&gt;</span>
        <span class="code-tag">&lt;param-value&gt;</span>classpath:cxf-config.xml<span class="code-tag">&lt;/param-value&gt;</span>
    <span class="code-tag">&lt;/context-param&gt;</span></pre>
</div></div>

<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">Sidenote on spring XML files</b><br />
<p>The solution presented here with two spring XML files (cxf-config and camel-config) that is pendent on each other and thus has to be ordered can also be done using a different solution. You can for instance add an <b>import</b> in cxf-config and only have the cxf-config listed in web.xml. Another solution is to merge the two files into one combined file. Yes you can add the camelContext in the cxf-config file.</p></td></tr></table> 

<p>But hey this isn't using <a href="/confluence/display/CAMEL/CXF" title="CXF">CXF</a> directly in the routing? Yes it's not but I wanted to show the halfway solution as well. What we have now is having Spring creating and handling lifecycle of Camel and showing how you can inject CamelContext using standard Spring into whatever code you have. This is very powerful as you can use the solution that you (or your team) already master and is familiar with. If they have Spring experience then the IoC principle of injecting resources is of course also possible with Camel as well. In fact it's a best practice principle. Later you will learn that you can inject other Camel types such as <a href="/confluence/display/CAMEL/Endpoint" title="Endpoint">Endpoint</a>, <a href="/confluence/display/CAMEL/ProducerTemplate" title="ProducerTemplate">ProducerTemplate</a> as well.</p>

<h3><a name="Tutorial-Example-ReportIncident-Part5-Usingthecamelcxfcomponent"></a>Using the camel-cxf component</h3>
<p>Okay let's continue and try to integrate <a href="/confluence/display/CAMEL/CXF" title="CXF">CXF</a> directly into our routing in Camel. This can be a bit more tricky than at first sight. Our goal is to avoid implementing the <tt>ReportIncidentEndpoint</tt> as we did with our code in <tt>ReportIncidentEndpointImpl</tt> (see above). Camel should be able to handle this automatically and integrate directly within our route. </p>

<p>Before we started our routing using the <a href="/confluence/display/CAMEL/Direct" title="Direct">Direct</a> endpoint with <tt>"direct:start"</tt>. We should replace this with the <a href="/confluence/display/CAMEL/CXF" title="CXF">CXF</a> endpoint.</p>

<p>But before going to far we have to make a few adjustments to the .wsdl file and it's location in our project folder. We move <b>report_incident.wsdl</b> from src/main/webapp/WEB-INF/wsdl* to <b>src/main/resources</b> as we want to be able to refer to it from within our route builder from Java code and thus it should be on the classpath for easy access. Secondly we have upgrade the CXF to a newer version and it identified a minor issue with the .wsdl file itself. We have to give the complexType a name otherwise we get some JAXB error. </p>

<p>So the .wsdl should be changed from:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;xs:element name=<span class="code-quote">"inputReportIncident"</span>&gt;</span>
        <span class="code-tag">&lt;xs:complexType&gt;</span></pre>
</div></div>

<p>To include a name attribute of the complex types:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;xs:element name=<span class="code-quote">"inputReportIncident"</span>&gt;</span>
        <span class="code-tag">&lt;xs:complexType name=<span class="code-quote">"inputReportIncident"</span>&gt;</span></pre>
</div></div>

<h4><a name="Tutorial-Example-ReportIncident-Part5-UsingCXFendpoint"></a>Using CXF endpoint</h4>

<p>Okay now we are ready to turn our attention to using <a href="/confluence/display/CAMEL/CXF" title="CXF">CXF</a> directly in Camel routing. So we zap <tt>ReportIncidentEndpointImpl</tt> as we no longer need this code. So what's left is:</p>
<ul class="alternate" type="square">
	<li><tt>FilenameGenerator.java</tt></li>
	<li><tt>ReportIncidentRoutes.java</tt><br/>
And that is all what's needed, well for now... <img class="emoticon" src="/confluence/images/icons/emoticons/wink.gif" height="20" width="20" align="absmiddle" alt="" border="0"/></li>
</ul>


<p>The idea now is to replace the endpoint the starts the ball going from "direct:start" to the <a href="/confluence/display/CAMEL/CXF" title="CXF">CXF</a> endpoint.</p>

<p><a href="/confluence/display/CAMEL/CXF" title="CXF">CXF</a> endpoint can be configured in either or both CXF spring configuration file or/and in the route directly. It accepts one parameter and others are optional. The parameter it <b>must</b> have is the service class. The service class is the interface for the WSDL operation's. As we have the <b>wsdl2java</b> goal to generate this class for us, we have it already as <tt>org.apache.camel.example.reportincident.ReportIncidentEndpoint</tt>. </p>

<p>The other parameter we will provide is the url to the .wsdl file. And finally we must provide the http address we expose the webservice at. The URI is therefore:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// endpoint to our CXF webservice
</span>        <span class="code-object">String</span> cxfEndpoint = <span class="code-quote">"cxf:<span class="code-comment">//http://localhost:8080/part-five/webservices/incident"</span>
</span>                + <span class="code-quote">"?serviceClass=org.apache.camel.example.reportincident.ReportIncidentEndpoint"</span>
                + <span class="code-quote">"&amp;wsdlURL=report_incident.wsdl"</span>;</pre>
</div></div>

<p>Then we can replace "direct:start" with our cxf endpoint instead, so it's:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">from(cxfEndpoint)...</pre>
</div></div>

<p>The next issue you might now have guessed is that before (in part 4) we did a traditional codeing style to start a task and return a response to the caller in the method:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> OutputReportIncident reportIncident(InputReportIncident parameters) {
        <span class="code-comment">// create the producer template to use <span class="code-keyword">for</span> sending messages
</span>        ProducerTemplate producer = context.createProducerTemplate();
        <span class="code-comment">// send the body and the filename defined with the special header key
</span>        <span class="code-object">Object</span> mailBody = producer.sendBody(<span class="code-quote">"direct:start"</span>, parameters);
        <span class="code-object">System</span>.out.println(<span class="code-quote">"Body:"</span> + mailBody);

        <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>As you can see the method <tt>reportIncident</tt> is invoked with the webservice input parameters and we return the response to to the webservice from the method. But our situation now is that we don't have this method anymore. So how do we return a response to the webservice?</p>

<p>Houston we have a problem! Well of course not but the mindset have to be changed slightly to understand the routing concept, and how it works. So let's step back a bit. What we have here is a webservice that we expose. And our webservice is synchronous request/response based so the caller waits for a response. This is a InOut Message Exchange Pattern. Camel will default use InOut for webservices so we don't need to specify this explicitly. When we have a InOut pattern then Camel will return the response to the original caller when the routes ends. Looking at our route we have:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">from(cxfEndpoint)
            .to(<span class="code-quote">"velocity:MailBody.vm"</span>)
            <span class="code-comment">// then set the file name using the FilenameGenerator bean
</span>            .setHeader(FileComponent.HEADER_FILE_NAME, BeanLanguage.bean(FilenameGenerator.class, <span class="code-quote">"generateFilename"</span>))
            <span class="code-comment">// and store the file    
</span>            .to(<span class="code-quote">"file:<span class="code-comment">//target/subfolder"</span>)</span></pre>
</div></div>
<p>When the route ends after the file endpoint has been processed Camel will return the OUT message to the original caller (the caller of the webservice). However our route currently as it stands have not set any OUT message, so this is what we need to do, <a href="/confluence/display/CAMEL/Message+Translator" title="Message Translator">transforming (Message Translator EIP)</a> the message into the response. We will therefore use a processor where we have 100% control in the Java code to set the response.</p>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> void process(Exchange exchange) <span class="code-keyword">throws</span> Exception {
            <span class="code-comment">// the response we want to send
</span>            OutputReportIncident OK = <span class="code-keyword">new</span> OutputReportIncident();
            OK.setCode(<span class="code-quote">"0"</span>);

            <span class="code-comment">// set the response on the OUT message as we use InOut
</span>            exchange.getOut().setBody(OK);
       }</pre>
</div></div>

<p>And with the route:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// first part from the webservice -&gt; file backup
</span>        from(cxfEndpoint)
            .to(<span class="code-quote">"velocity:MailBody.vm"</span>)
            <span class="code-comment">// then set the file name using the FilenameGenerator bean
</span>            .setHeader(FileComponent.HEADER_FILE_NAME, BeanLanguage.bean(FilenameGenerator.class, <span class="code-quote">"generateFilename"</span>))
            <span class="code-comment">// and store the file    
</span>            .to(<span class="code-quote">"file:<span class="code-comment">//target/subfolder"</span>)
</span>            <span class="code-comment">// <span class="code-keyword">return</span> OK as response
</span>            .process(<span class="code-keyword">new</span> Processor() {
                <span class="code-keyword">public</span> void process(Exchange exchange) <span class="code-keyword">throws</span> Exception {
                    <span class="code-comment">// the response we want to send
</span>                    OutputReportIncident OK = <span class="code-keyword">new</span> OutputReportIncident();
                    OK.setCode(<span class="code-quote">"0"</span>);

                    <span class="code-comment">// set the response on the OUT message as we use InOut
</span>                    exchange.getOut().setBody(OK);
                }
            });</pre>
</div></div>

<p>The route using the inlined processor is a bit ugly as we have high level routing logic combined with low level java code. First of all I wanted to show how flexible Camel is, allowing use as a developer to always be in control and can use Java code for whatever you needs is. First of all we could move the code into a inner class and just refer to it:</p>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">private</span> <span class="code-keyword">static</span> class OKResponseProcessor <span class="code-keyword">implements</span> Processor {
        <span class="code-keyword">public</span> void process(Exchange exchange) <span class="code-keyword">throws</span> Exception {
            <span class="code-comment">// the response we want to send
</span>            OutputReportIncident OK = <span class="code-keyword">new</span> OutputReportIncident();
            OK.setCode(<span class="code-quote">"0"</span>);

            <span class="code-comment">// set the response on the OUT message as we use InOut
</span>            exchange.getOut().setBody(OK);
        }
    }</pre>
</div></div>

<p>And then out route is much nicer:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// first part from the webservice -&gt; file backup
</span>        from(cxfEndpoint)
            .to(<span class="code-quote">"velocity:MailBody.vm"</span>)
            <span class="code-comment">// then set the file name using the FilenameGenerator bean
</span>            .setHeader(FileComponent.HEADER_FILE_NAME, BeanLanguage.bean(FilenameGenerator.class, <span class="code-quote">"generateFilename"</span>))
            <span class="code-comment">// and store the file    
</span>            .to(<span class="code-quote">"file:<span class="code-comment">//target/subfolder"</span>)
</span>            <span class="code-comment">// <span class="code-keyword">return</span> OK as response
</span>            .process(<span class="code-keyword">new</span> OKResponseProcessor());</pre>
</div></div>

<p>Since our response is static and we don't need to any code logic to set it we can use the <b>transform</b> DSL in the route to set a constant OUT message. So we refactor the code a bit to loose the processor. First we define the OK response as:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// webservice response <span class="code-keyword">for</span> OK 
</span>        OutputReportIncident OK = <span class="code-keyword">new</span> OutputReportIncident();
        OK.setCode(<span class="code-quote">"0"</span>);</pre>
</div></div>

<p>And then we can refer to it in the route as a constant expression:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// <span class="code-keyword">return</span> OK as response
</span>            .transform(constant(OK));</pre>
</div></div>

<h4><a name="Tutorial-Example-ReportIncident-Part5-ImportantissueregardingusingCXFendpointsinCamel"></a>Important issue regarding using <a href="/confluence/display/CAMEL/CXF" title="CXF">CXF</a> endpoints in Camel</h4>
<p>Now we are nearly there, there is an important issue left with using <a href="/confluence/display/CAMEL/CXF" title="CXF">CXF</a> endpoints in Camel. <br/>
TODO:</p></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