camel-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Camel: Intercept (page edited)
Date Mon, 04 May 2009 12:29: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/Intercept">Intercept</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/CAMEL/Intercept">Intercept</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~davsclaus">Claus Ibsen</a>
            <span class="smallfont">(May 04, 2009)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=115857&originalVersion=14&revisedVersion=15">(View changes)</a>
     </p>

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

<p>The intercept feature in Camel supports intercepting <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a>s while they are <em>on route</em>. <br/>
We have overhauled the <a href="/confluence/display/CAMEL/Intercept" title="Intercept">Intercept</a> in Camel 2.0 so the following information is based on Camel 2.0.</p>

<p>Camel supports three kinds of interceptors:</p>
<ul class="alternate" type="square">
	<li><tt>intercept</tt> that intercepts each and every processing step while routing an <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> in the route.</li>
	<li><tt>interceptFrom</tt> that intercepts incoming <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> in the route.</li>
	<li><tt>interceptSendToEndpoint</tt> that intercepts when an <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> is about to be sent to the given <a href="/confluence/display/CAMEL/Endpoint" title="Endpoint">Endpoint</a>.</li>
</ul>


<p>These interceptors supports the following features:</p>
<ul class="alternate" type="square">
	<li><a href="/confluence/display/CAMEL/Predicate" title="Predicate">Predicate</a> using <tt>when</tt> to only trigger the interceptor in certain conditions</li>
	<li><tt>stop</tt> forces to stop continue routing the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> and mark it as completed successful. Camel will by default <b>not stop</b>.</li>
	<li><tt>skip</tt> when used with <tt>interceptSendToEndpoint</tt> will <b>skip</b> sending the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> to the original intended endpoint. Camel will by default <b>not skip</b>.</li>
	<li><tt>interceptFrom</tt> and <tt>interceptSendToEndpoint</tt> supports endpoint URI matching by: exact uri, wildcard, regular expression. See advanced section.</li>
</ul>


<table cellpadding='5' width='85%' cellspacing='8px' class='tipMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td>
<p><tt>stop</tt> can be used in general, it does not have to be used with an <a href="/confluence/display/CAMEL/Intercept" title="Intercept">Intercept</a> you can use it in regular routing as well.</p>

<p>You can also instruct Camel to <tt>stop</tt> continue routing your message if you set the <tt>Exchange.ROUTE_STOP</tt> property to <tt>"true"</tt> or <tt>Boolean.TRUE</tt> on the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a>. You can for instance do this from regular Java code in a <a href="/confluence/display/CAMEL/Pojo" title="Pojo">POJO</a> or <a href="/confluence/display/CAMEL/Processor" title="Processor">Processor</a>.  </p></td></tr></table>

<h3><a name="Intercept-Intercept"></a>Intercept</h3>
<p><tt>Intercept</tt> is like a regular interceptor that is applied each each processing step the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> undergo while its being routed. You can think of it as a <em>AOP before</em> that is applied at each DSL keyword you have defined in your route. </p>

<p>The classic Hello World example would be:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">intercept().to(<span class="code-quote">"log:hello"</span>);

from(<span class="code-quote">"jms:queue:order"</span>).to(<span class="code-quote">"bean:validateOrder"</span>).to(<span class="code-quote">"bean:processOrder"</span>);</pre>
</div></div>

<p>What happens is that the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> is intercepted before each processing step, that means that it will be intercepted before</p>
<ul class="alternate" type="square">
	<li><tt>.to("bean:validateOrder")</tt></li>
	<li><tt>.to("bean:processOrder")</tt></li>
</ul>


<p>So in this sample we intercept the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> twice.</p>

<p>The <tt>when</tt> predicate is also support on the <tt>intercept</tt> so we can attach a <a href="/confluence/display/CAMEL/Predicate" title="Predicate">Predicate</a> to only trigger the interception under certain conditions.<br/>
For instance in the sample below we only intercept if the message body contains the string word <b>Hello</b>:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">intercept().when(body().contains(<span class="code-quote">"Hello"</span>)).to(<span class="code-quote">"mock:intercepted"</span>);

from(<span class="code-quote">"direct:start"</span>)
    .to(<span class="code-quote">"mock:foo"</span>, <span class="code-quote">"mock:bar"</span>, <span class="code-quote">"mock:result"</span>);</pre>
</div></div>

<p>And in the route below we want to stop in certain conditions, when the message contains the word 'Hello':</p>
<div class="code"><div class="codeContent">
<pre class="code-java">intercept().when(body().contains(<span class="code-quote">"Hello"</span>)).to(<span class="code-quote">"mock:intercepted"</span>).stop();

from(<span class="code-quote">"direct:start"</span>)
    .to(<span class="code-quote">"mock:foo"</span>, <span class="code-quote">"mock:bar"</span>, <span class="code-quote">"mock:result"</span>);</pre>
</div></div>

<h4><a name="Intercept-UsingfromSpringDSL"></a>Using from Spring DSL</h4>
<p>The same hello world sample in Spring DSL would be:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;camelContext ...&gt;</span>
    <span class="code-tag">&lt;intercept&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"log:hello"</span>/&gt;</span>
    <span class="code-tag">&lt;/intercept&gt;</span>

    <span class="code-tag">&lt;route&gt;</span>
        <span class="code-tag">&lt;from uri=<span class="code-quote">"jms:queue:order"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"bean:validateOrder"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"bean:handleOrder"</span>/&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
<span class="code-tag">&lt;/camelContext&gt;</span></pre>
</div></div>

<p>And the sample for using the <b>when</b> predicate would be:</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://camel.apache.org/schema/spring"</span>&gt;</span>
    &lt;!-- here we intercept each processing step in the routing and do a detour
         routing where we route the exhange to the mock:intercepted endpoint.
         We have applied a when predicate so the interceptor only applies
         if the message body contains the string word 'Hello' --&gt;
    <span class="code-tag">&lt;intercept&gt;</span>
        <span class="code-tag">&lt;when&gt;</span>
            <span class="code-tag">&lt;simple&gt;</span>${in.body} contains 'Hello'<span class="code-tag">&lt;/simple&gt;</span>
        <span class="code-tag">&lt;/when&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:intercepted"</span>/&gt;</span>
    <span class="code-tag">&lt;/intercept&gt;</span>

    <span class="code-tag"><span class="code-comment">&lt;!-- here we have a very simple route --&gt;</span></span>
    <span class="code-tag">&lt;route&gt;</span>
        <span class="code-tag">&lt;from uri=<span class="code-quote">"direct:start"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:foo"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:bar"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:result"</span>/&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
<span class="code-tag">&lt;/camelContext&gt;</span></pre>
</div></div>

<p>And the sample for using the <b>when</b> and <b>stop</b> would be:</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://camel.apache.org/schema/spring"</span>&gt;</span>
    <span class="code-tag">&lt;intercept&gt;</span>
        <span class="code-tag"><span class="code-comment">&lt;!-- only trigger this interceptor if the message body contains the word Hello --&gt;</span></span>
        <span class="code-tag">&lt;when&gt;</span>
            <span class="code-tag">&lt;simple&gt;</span>${in.body} contains 'Hello'<span class="code-tag">&lt;/simple&gt;</span>
        <span class="code-tag">&lt;/when&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:intercepted"</span>/&gt;</span>
        <span class="code-tag"><span class="code-comment">&lt;!-- stop continue routing --&gt;</span></span>
        <span class="code-tag">&lt;stop/&gt;</span>
    <span class="code-tag">&lt;/intercept&gt;</span>

    <span class="code-tag"><span class="code-comment">&lt;!-- here we have a very simple route --&gt;</span></span>
    <span class="code-tag">&lt;route&gt;</span>
        <span class="code-tag">&lt;from uri=<span class="code-quote">"direct:start"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:foo"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:bar"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:result"</span>/&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
<span class="code-tag">&lt;/camelContext&gt;</span></pre>
</div></div>


<h3><a name="Intercept-InterceptFrom"></a>InterceptFrom</h3>
<p><tt>InterceptFrom</tt> is for intercepting any incoming <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a>, in any route (it intercepts all the <tt>from</tt> DSLs). This allows you to do some custom behavior for received <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a>s. You can provide a specific uri for a given <a href="/confluence/display/CAMEL/Endpoint" title="Endpoint">Endpoint</a> then it only applies for that particular route.</p>

<p>So lets start with the logging example. We want to log all the <b>incoming</b> requests so we use <tt>interceptFrom</tt> to route to the <a href="/confluence/display/CAMEL/Log" title="Log">Log</a> component. As <tt>proceed</tt> is default then the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> will continue its route, and thus it will continue to <tt>mock:first</tt>.</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// intercept all incomming routes and log it
</span>interceptFrom().to(<span class="code-quote">"log:received"</span>);

<span class="code-comment">// and here we have a couple of routes
</span>from(<span class="code-quote">"direct:start"</span>).to(<span class="code-quote">"mock:first"</span>).to(<span class="code-quote">"seda:bar"</span>);

from(<span class="code-quote">"seda:bar"</span>).to(<span class="code-quote">"mock:result"</span>);</pre>
</div></div>

<p>You can also attach a <a href="/confluence/display/CAMEL/Predicate" title="Predicate">Predicate</a> to only trigger if certain conditions is meet. For instance in the route below we intercept when a test message is send to us, so we can do some custom processing before we continue routing:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">interceptFrom()
    .when(header(<span class="code-quote">"usertype"</span>).isEqualTo(<span class="code-quote">"test"</span>))
    .process(<span class="code-keyword">new</span> MyTestServiceProcessor())
    .to(<span class="code-quote">"mock:intercepted"</span>);

<span class="code-comment">// and here is our route
</span>from(<span class="code-quote">"direct:start"</span>).to(<span class="code-quote">"seda:bar"</span>).to(<span class="code-quote">"mock:result"</span>);</pre>
</div></div>

<p>And if we want to filter out certain messages we can use the <tt>stop()</tt> to instruct Camel to stop continue routing the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a>:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">interceptFrom()
    .when(header(<span class="code-quote">"usertype"</span>).isEqualTo(<span class="code-quote">"test"</span>))
    <span class="code-comment">// here we use stop() to tell Camel to NOT <span class="code-keyword">continue</span> routing the message.
</span>    <span class="code-comment">// <span class="code-keyword">this</span> let us act as a filter, to drop certain messages.
</span>    .stop();

<span class="code-comment">// and here is our route
</span>from(<span class="code-quote">"direct:start"</span>).to(<span class="code-quote">"seda:bar"</span>).to(<span class="code-quote">"mock:result"</span>);</pre>
</div></div>

<p>And if want to only apply a specific endpoint, as the <b>seda:bar</b> endpoint in the sample below, we can do it like this:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// only trigger when incoming from seda:bar endpoint
</span>interceptFrom(<span class="code-quote">"seda:bar"</span>).to(<span class="code-quote">"mock:bar"</span>);

<span class="code-comment">// and here we have a couple of routes
</span>from(<span class="code-quote">"direct:start"</span>).to(<span class="code-quote">"mock:first"</span>).to(<span class="code-quote">"seda:bar"</span>);

from(<span class="code-quote">"seda:bar"</span>).to(<span class="code-quote">"mock:result"</span>);

from(<span class="code-quote">"seda:foo"</span>).to(<span class="code-quote">"mock:result"</span>);</pre>
</div></div>


<h4><a name="Intercept-UsingfromSpringDSL"></a>Using from Spring DSL</h4>
<p>Intercept is of course also available using Spring DSL as shown in the sample below:</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://camel.apache.org/schema/spring"</span>&gt;</span>
    &lt;!-- intercept incoming messages and route them to the mock:middle1 endpoint
         before we proceed and continue routing from the point of interceptions, that
         is mock:end will be the next target --&gt;
    <span class="code-tag">&lt;interceptFrom&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:middle1"</span>/&gt;</span>
    <span class="code-tag">&lt;/interceptFrom&gt;</span>

    <span class="code-tag"><span class="code-comment">&lt;!-- here we have a very simple route --&gt;</span></span>
    <span class="code-tag">&lt;route&gt;</span>
        <span class="code-tag">&lt;from uri=<span class="code-quote">"direct:start"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:end"</span>/&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
<span class="code-tag">&lt;/camelContext&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>
<p><b>Notice:</b> <tt>stop</tt> is also supported in <tt>interceptFrom</tt> so you can intercept from certain endpoints and route then elsewhere and <tt>stop</tt> to not continue routing in the original intended route path.</p></td></tr></table>

<h3><a name="Intercept-InterceptSendToEndpoint"></a>InterceptSendToEndpoint</h3>
<p><b>Available as of Camel 2.0</b></p>

<p>Intercept send to endpoint is triggered when an <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> is being sent to the intercepted endpoint. This allows you to route the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> to a <a href="/confluence/display/CAMEL/Detour" title="Detour">Detour</a> or do some custom processing before the <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> is sent to the original intended destination. You can also skip sending to the intended destination. By default Camel will send to the original intended destination after the intercepted route completes. And as the regular intercept you can also define an <tt>when</tt> <a href="/confluence/display/CAMEL/Predicate" title="Predicate">Predicate</a> so we only intercept if the <a href="/confluence/display/CAMEL/Predicate" title="Predicate">Predicate</a> evaluates to <b>true</b>. This allows you do do a bit of filtering, to only intercept when certain criteria is meet.</p>

<p>Let start with a simple example, where we want to intercept when an <a href="/confluence/display/CAMEL/Exchange" title="Exchange">Exchange</a> is being sent to <tt>mock:foo</tt>:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// we intercept by endpoint, that means that whenever an exchange is about to be sent to
</span><span class="code-comment">// <span class="code-keyword">this</span> endpoint, its intercepted and routed with <span class="code-keyword">this</span> detour route beforehand
</span><span class="code-comment">// afterwards its send to the original intended destination. So <span class="code-keyword">this</span> is kinda AOP before.
</span><span class="code-comment">// That means mock:foo will receive the message (Bye World).
</span>interceptSendToEndpoint(<span class="code-quote">"mock:foo"</span>)
    .to(<span class="code-quote">"mock:detour"</span>).transform(constant(<span class="code-quote">"Bye World"</span>));

from(<span class="code-quote">"direct:first"</span>)
    .to(<span class="code-quote">"mock:bar"</span>)
    .to(<span class="code-quote">"mock:foo"</span>)
    .to(<span class="code-quote">"mock:result"</span>);</pre>
</div></div>

<p>And this time we add the <a href="/confluence/display/CAMEL/Predicate" title="Predicate">Predicate</a> so its only when the message body is <tt>Hello World</tt> we intercept.</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// we can also attach a predicate to the endpoint interceptor. So in <span class="code-keyword">this</span> example the exchange is
</span><span class="code-comment">// only intercepted <span class="code-keyword">if</span> the body is Hello World
</span>interceptSendToEndpoint(<span class="code-quote">"mock:foo"</span>).when(body().isEqualTo(<span class="code-quote">"Hello World"</span>))
    .to(<span class="code-quote">"mock:detour"</span>).transform(constant(<span class="code-quote">"Bye World"</span>));

from(<span class="code-quote">"direct:second"</span>)
    .to(<span class="code-quote">"mock:bar"</span>)
    .to(<span class="code-quote">"mock:foo"</span>)
    .to(<span class="code-quote">"mock:result"</span>);</pre>
</div></div>

<p>And to skip sending to the <tt>mock:foo</tt> endpoint we use the *<tt>skip()</tt> DSL in the route at the end to instruct Camel to skip sending to the original intended endpoint. </p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-comment">// since we use the skipSendToOriginalEndpoint() we instruct Camel to skip
</span><span class="code-comment">// sending the exchange to the original intended destination after the intercept
</span><span class="code-comment">// route is complete.
</span><span class="code-comment">// That means that mock:foo will NOT receive the message, but the message
</span><span class="code-comment">// is skipped and continued in the original route, so mock:result will receive
</span><span class="code-comment">// the message.
</span>interceptSendToEndpoint(<span class="code-quote">"mock:foo"</span>).skipSendToOriginalEndpoint()
    .transform(constant(<span class="code-quote">"Bye World"</span>)).to(<span class="code-quote">"mock:detour"</span>);

from(<span class="code-quote">"direct:third"</span>)
    .to(<span class="code-quote">"mock:bar"</span>)
    .to(<span class="code-quote">"mock:foo"</span>)
    .to(<span class="code-quote">"mock:result"</span>);</pre>
</div></div>

<h4><a name="Intercept-UsingfromSpringDSL"></a>Using from Spring DSL</h4>
<p>Intercept endpoint is of course also available using Spring DSL. </p>

<p>We start with the first example from above in Spring DSL:</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://camel.apache.org/schema/spring"</span>&gt;</span>

    &lt;!-- we intercept by endpoint, that means that whenever an exchange is about to be sent to
         this endpoint, its intercepted and routed with this detour route beforehand
         afterwards its send to the original intended destination. So this is kinda AOP before.
         That means mock:foo will receive the message (Bye World). --&gt;
    <span class="code-tag">&lt;interceptSendToEndpoint uri=<span class="code-quote">"mock:foo"</span>&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:detour"</span>/&gt;</span>
        <span class="code-tag">&lt;transform&gt;</span>
            <span class="code-tag">&lt;constant&gt;</span>Bye World<span class="code-tag">&lt;/constant&gt;</span>
        <span class="code-tag">&lt;/transform&gt;</span>
    <span class="code-tag">&lt;/interceptSendToEndpoint&gt;</span>

    <span class="code-tag">&lt;route&gt;</span>
        <span class="code-tag">&lt;from uri=<span class="code-quote">"direct:first"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:bar"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:foo"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:result"</span>/&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
<span class="code-tag">&lt;/camelContext&gt;</span></pre>
</div></div>

<p>And the 2nd. Notice how we can leverage the <a href="/confluence/display/CAMEL/Simple" title="Simple">Simple</a> language for the <a href="/confluence/display/CAMEL/Predicate" title="Predicate">Predicate</a>:</p>
An error occurred: http://svn.apache.org/repos/asf/camel/trunk/components/camel-spring/src/test/resources/org/apache/camel/spring/processor/interceptSendToEndpointWhen.xml. The system administrator has been notified.

<p>And the 3rd with the <tt>skip</tt>, notice skip is set with the <tt>skipSendToOriginalEndpoint</tt> attribute on the <b>interceptSendToEndpoint</b> tag:</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://camel.apache.org/schema/spring"</span>&gt;</span>

    &lt;!-- since we set the skipSendToOriginalEndpoint attribute to true we instruct
         Camel to skip sending the exchange to the original intended destination.
         That means that mock:foo will NOT receive the message, but the message
         is skipped and continued in the original route, so mock:result will receive
         the message. --&gt;
    <span class="code-tag">&lt;interceptSendToEndpoint uri=<span class="code-quote">"mock:foo"</span> skipSendToOriginalEndpoint=<span class="code-quote">"true"</span>&gt;</span>
        <span class="code-tag">&lt;transform&gt;</span>
            <span class="code-tag">&lt;constant&gt;</span>Bye World<span class="code-tag">&lt;/constant&gt;</span>
        <span class="code-tag">&lt;/transform&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:detour"</span>/&gt;</span>
    <span class="code-tag">&lt;/interceptSendToEndpoint&gt;</span>

    <span class="code-tag">&lt;route&gt;</span>
        <span class="code-tag">&lt;from uri=<span class="code-quote">"direct:third"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:bar"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:foo"</span>/&gt;</span>
        <span class="code-tag">&lt;to uri=<span class="code-quote">"mock:result"</span>/&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
<span class="code-tag">&lt;/camelContext&gt;</span></pre>
</div></div>


<h3><a name="Intercept-AdvancedusageofIntercpt"></a>Advanced usage of Intercpt</h3>
<p>The <tt>interceptFrom</tt> and <tt>interceptSendToEndpoint</tt> supports endpoint URI matching by the following rules in the given order:</p>
<ul class="alternate" type="square">
	<li>match by exact URI name. This is the sample we have seen above.</li>
	<li>match by wildcard</li>
	<li>match by regular expression.</li>
</ul>


<h4><a name="Intercept-Matchbywildcard"></a>Match by wildcard</h4>
<p>Match by wildcard allows you to match a range of endpoint or all of a given type. For instance use <tt>uri="file:*"</tt> will match all <a href="/confluence/display/CAMEL/File" title="File">File</a> based endpoints.</p>
<div class="code"><div class="codeContent">
<pre class="code-java">intercept(<span class="code-quote">"jms:*"</span>).to(<span class="code-quote">"log:fromjms"</span>);</pre>
</div></div>
<p>Wildcards is match that the text before the * is matched against the given endpoint and if it also starts with the same characters its a match. For instance you can do:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">intercept(<span class="code-quote">"file:<span class="code-comment">//order/inbox/*"</span>).to(<span class="code-quote">"log:newfileorders"</span>);</span></pre>
</div></div>
<p>To intercept any files received from the <tt>order/inbox</tt> folder.</p>

<h4><a name="Intercept-Matchbyregularexpression"></a>Match by regular expression</h4>
<p>Match by regular expression is just like match by wildcard but using regex instead. So if we want to intercept incoming messages from gold and silver JMS queues we can do:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">intercept(<span class="code-quote">"jms:queue:(gold|silver)"</span>).to(<span class="code-quote">"seda:handleFast"</span>);</pre>
</div></div>

<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">About dynamic and static behavior of interceptFrom and interceptSendToEndpoint</b><br />
<p>The <tt>interceptSendToEndpoint</tt> is dynamic hence it will also trigger if a dynamic URI is constructed that Camel was not aware of at startup time.<br/>
The <tt>interceptFrom</tt> is not dynamic as it only intercepts input to routes registered as routes in <tt>CamelContext</tt>. So if you dynamic construct a <tt>Consumer</tt> using the Camel API and consumes an <a href="/confluence/display/CAMEL/Endpoint" title="Endpoint">Endpoint</a> then the <tt>interceptFrom</tt> is not triggered.</p></td></tr></table></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