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-osgi-camel-part1 (page edited)
Date Fri, 12 Dec 2008 08:21: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-osgi-camel-part1">tutorial-osgi-camel-part1</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/CAMEL/tutorial-osgi-camel-part1">tutorial-osgi-camel-part1</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~cmoulliard@xpectis.com">Charles Moulliard</a>
            <span class="smallfont">(Dec 12, 2008)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=103709&originalVersion=26&revisedVersion=27">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><h1><a name="tutorial-osgi-camel-part1-Introduction"></a>Introduction</h1>

<p>The focus of this Tutorial is to introduce you how you can create, design a simple SOA solution using Camel and <ins>OSGI</ins>. Most of the current and commercial <ins>SOA</ins> solutions rely on standards XML/WSDL/BPMN/BPEL and Business Processes (designed through WYSIWYG editor like Eclipse or propriatary product) which are deployed and orchestrated into a <ins>B</ins>usiness <ins>P</ins>rocess <ins>E</ins>xpression <ins>L</ins>anguage engine.</p>

<p>Such a solution can be envisaged for big companies because the skills/time to market are important or when different development standards exist inside the company like (Java, .NET).</p>

<p>In the 90's, such developments have been made using CORBA or COM+/DCOM Microsoft technology. But both approaches had (and still have) significant problems and limitations. Complexity is a big issue. Any of the data that is passed requires very specific formatting, and many of the rules for programming are simply too difficult to follow without encountering errors. Even at the height of their popularity, CORBA was used primarily in large system development staffed by legions of programmers, while COM was used, often reluctantly, by teams of Microsoft developers.</p>

<p><ins>O</ins>pen <ins>S</ins>tandards <ins>G</ins>ateway <ins>I</ins>nitiative provides a Java-based platform for integrating both Java and non-Java application components. This technology provides the standardized functions for constructing applications from small, individual components and deploying them as a single application. The core component of OSGi is the OSGi Framework. The OSGi Framework is a very specific class-loading model. In addition to its normal Java execution environment, this framework incorporates an OSGi modules layer that adds private classes for modules and allows for controlled linking between modules. The OSGi Framework also includes life-cycle management for starting, stopping, adding and removing modules, as well as a service registry for sharing objects between modules.</p>

<p>Coupling the OSGI framework with a lightweight <ins>E</ins>nterprise <ins>S</ins>ervice <ins>B</ins>us  will allow you easily to design the routing between your different modules. A module can be a <ins>P</ins>lain <ins>O</ins>ld <ins>J</ins>ava <ins>O</ins>bject (POJO), a Web Service designed with Apache CXF framework, a component like an ordering system. In fact, the module or bundle which is the term used by OSGI represent the level of granularity that you identify for your application.</p>

<p>In this first part of the OSGI tutorial, we will show you how to:</p>
<ul class="alternate" type="square">
	<li>Create a simple service (derived from the <span class="nobr"><a href="http://svn.apache.org/viewvc/activemq/camel/trunk/examples/camel-example-osgi" title="Visit page outside Confluence" rel="nofollow">camel-osgi example<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>) module (interface + implementation) and package it as a bundle,</li>
	<li>Create a Camel context with a small routing and package it as a <ins>separate</ins> bundle,</li>
	<li>The Camel routing will use an OSGI reference to call the simple service</li>
</ul>


<p>The second part of this tutorial will be derived from the <a href="/confluence/display/CAMEL/Tutorial-Example-ReportIncident" title="Tutorial-Example-ReportIncident">Reporting incident tutorial</a> and will show you a more real application (which is web based) can be re-scoped into a OSGI application.</p>

<h2><a name="tutorial-osgi-camel-part1-Prerequisites"></a>Prerequisites</h2>

<p>This tutorial uses:</p>
<ul class="alternate" type="square">
	<li><span class="nobr"><a href="http://maven.apache.org/download.html" title="Visit page outside Confluence" rel="nofollow">Maven 2.0.9<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> to setup the Camel project and for dependencies for artifacts,</li>
	<li><span class="nobr"><a href="http://www.eclipse.org/downloads/packages/" title="Visit page outside Confluence" rel="nofollow">Eclipse Ganymede 3.4.x<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>,</li>
	<li><span class="nobr"><a href="http://www.springsource.org/osgi" title="Visit page outside Confluence" rel="nofollow">Spring Dynamic Modules for OSGI 1.2.0-m2<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li><span class="nobr"><a href="http://servicemix.apache.org/SMX4KNL/index.html" title="Visit page outside Confluence" rel="nofollow">Service Mix Kernel 1.0.0<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>,</li>
	<li><span class="nobr"><a href="http://www.springsource.org/dmserver" title="Visit page outside Confluence" rel="nofollow">Spring DM Server 1.0.1<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
</ul>


<p><b>Note:</b> The sample project can be downloaded, see the <a href="#tutorial-osgi-camel-part1-Resources" title="Resources on tutorial-osgi-camel-part1">resources</a> section.</p>

<h2><a name="tutorial-osgi-camel-part1-Step1%3AInitialProjectSetup"></a>Step 1 : Initial Project Setup</h2>

<p>First, we create two eclipse projects using the maven archetype '<b>spring-osgi-bundle-archetype'</b>. This archetype is helpful because it generates a pom.xml file that we will use with maven goal(s) to create the:</p>
<ul class="alternate" type="square">
	<li>MANIFEST.MF file (file required and specifying the information about the bundle to deploy on the OSGI server, dependency with another bundle, version, ... )</li>
	<li>jar of the bundle to deploy on the server</li>
</ul>


<p>To create the <b>simple service project</b>, execute the following command in your Unix/Dos console.</p>
<div class="code"><div class="codeContent">
<pre class="code-java">mvn archetype:create -DarchetypeGroupId=org.springframework.osgi -DarchetypeArtifactId=spring-osgi-bundle-archetype -DarchetypeVersion=1.2.0-m2
-DgroupId=demo -DartifactId=demo.service-bundle -Dversion=0.1</pre>
</div></div>
<p>Remarks:</p>
<ul class="alternate" type="square">
	<li>The archetype version depends on the version of Spring Dynamic Module used and must be adapted in consequence,</li>
	<li>According to your project, you can change the artifactId to point to <em>com.mycompany.application.service</em>, and <em>groupId com.mycompany.application</em></li>
</ul>


<p>&nbsp;To create the <b>Camel project</b>, execute the following command</p>
<div class="code"><div class="codeContent">
<pre class="code-java">mvn archetype:create -DarchetypeGroupId=org.springframework.osgi -DarchetypeArtifactId=spring-osgi-bundle-archetype -DarchetypeVersion=1.2.0-m2
-DgroupId=demo -DartifactId=demo.camel-bundle -Dversion=0.1</pre>
</div></div>
<p>Two folders are created with the following name:</p>
<ul class="alternate" type="square">
	<li>demo.service-bundle</li>
	<li>demo.camel-bundle</li>
</ul>


<p>Next, you import these projects into your favorite workspace of Eclipse.</p>

<h2><a name="tutorial-osgi-camel-part1-Step2%3ADeveloptheinterface"></a>Step 2 : Develop the interface</h2>

<p>Developing an OSGI project could be 'potentially' time consuming regarding to:</p>
<ul class="alternate" type="square">
	<li>The learning curve of the new technology to acquire,</li>
	<li>Packaging of the components, registering of the components,</li>
	<li>How to call the OSGI server? How Can I have access to the bundle context?</li>
</ul>


<p>You could figure out that developing OSGI is similar to develop EJB components using EJB 1.0 specification. Remember that time when the only way to design an enterprise solution was to use EJB with its proxy, stub-skeleton classes, the protocol RMI/IIOP (blocked by most of the firewall) for the communication between the client and the server, ... and so on and so on</p>

<p>Luckily, this is not the case because the specification has tried to avoid such pitfalls and because two interesting projects exist today to simplify our life:</p>
<ul class="alternate" type="square">
	<li><span class="nobr"><a href="http://felix.apache.org/site/apache-felix-ipojo.html" title="Visit page outside Confluence" rel="nofollow">iPOJO<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> (Apache Felix)</li>
	<li>Spring Dynamic Modules (Spring)</li>
</ul>


<p>The goals of these frameworks are to:</p>
<ul class="alternate" type="square">
	<li>Design the business logic as POJO,</li>
	<li>Inject dependency(ies) though IoC,</li>
	<li>Handle lifecycle of the bundle and its relation with BundleContext</li>
</ul>


<p>Although this tutorial is based on Spring Dynamic Modules, iPOJO can be used as an alternative.</p>

<p>So now, it is time to create the interface that we will use in this project. Open Eclipse environment if not already done and create a new folder "service" in{{src/main/java/demo}} tree. Add the interface <tt>TransformService.java</tt> and copy paste the code below:</p>
<div class="code"><div class="codeHeader"><b>TransformService.java</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> demo.service;

<span class="code-keyword">public</span> <span class="code-keyword">interface</span> TransformService {

    <span class="code-keyword">public</span> <span class="code-object">Object</span> transform(<span class="code-object">Object</span> obj);

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

<h2><a name="tutorial-osgi-camel-part1-Step3%3ACreatetheclassimplementingtheinterface"></a>Step 3 : Create the class implementing the interface</h2>

<p>Next, we will create the class <tt>TransformServiceImpl</tt> implmenting the interface <tt>TransformService</tt>.</p>

<p>Create the class <tt>TransformServiceImpl.java</tt> in the folder <tt>src/main/java/demo/service</tt></p>
<div class="code"><div class="codeHeader"><b>TransformServiceImpl.java</b></div><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> demo.service;

<span class="code-keyword">import</span> java.util.Date;

<span class="code-keyword">import</span> org.apache.commons.logging.Log;
<span class="code-keyword">import</span> org.apache.commons.logging.LogFactory;

<span class="code-keyword">public</span> class TransformServiceImpl <span class="code-keyword">implements</span> TransformService {
    <span class="code-keyword">private</span> <span class="code-keyword">static</span> <span class="code-keyword">final</span> <span class="code-keyword">transient</span> Log LOG = LogFactory.getLog(TransformServiceImpl.class);
    <span class="code-keyword">private</span> <span class="code-object">boolean</span> verbose = <span class="code-keyword">true</span>;
    <span class="code-keyword">private</span> <span class="code-object">String</span> prefix = <span class="code-quote">"MyTransform"</span>;

    <span class="code-keyword">public</span> <span class="code-object">Object</span> transform(<span class="code-object">Object</span> body) {
        <span class="code-object">String</span> answer = prefix + <span class="code-quote">" set body:  "</span> + <span class="code-keyword">new</span> Date();
        <span class="code-keyword">if</span> (verbose) {
            <span class="code-object">System</span>.out.println(<span class="code-quote">"&gt;&gt; call &gt;&gt; "</span> + answer);
        }
        LOG.info(<span class="code-quote">"&gt;&gt; call &gt;&gt;"</span> + answer);
        <span class="code-keyword">return</span> answer;
    }

    <span class="code-keyword">public</span> <span class="code-object">boolean</span> isVerbose() {
        <span class="code-keyword">return</span> verbose;
    }

    <span class="code-keyword">public</span> void setVerbose(<span class="code-object">boolean</span> verbose) {
        <span class="code-keyword">this</span>.verbose = verbose;
    }

    <span class="code-keyword">public</span> <span class="code-object">String</span> getPrefix() {
        <span class="code-keyword">return</span> prefix;
    }

    <span class="code-keyword">public</span> void setPrefix(<span class="code-object">String</span> prefix) {
        <span class="code-keyword">this</span>.prefix = prefix;
    }
}</pre>
</div></div>

<h2><a name="tutorial-osgi-camel-part1-Step4%3ACreatethespringconfigurationfiles"></a>Step 4 : Create the spring configuration files</h2>

<p>The next step concerns the creation of the configuration files who will allow the dependency injection and later the deployment of the bundle into the OSGI server and its registration as a 'service'.</p>

<p>a) Dependency Injection</p>

<p>Create the file <tt>demo-service-bundle-contxt.xml</tt> in the folder <tt>src/main/resources/META-INF/spring</tt></p>
<div class="code"><div class="codeHeader"><b>demo-service-bundle-contxt.xml</b></div><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&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=<span class="code-quote">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"</span>&gt;

  &lt;!-- regular spring configuration file defining the beans for this
       bundle. The configuration of OSGi definitions is kept in a separate
       configuration file so that this file can easily be used
       for integration testing outside of an OSGi environment --&gt;
    <span class="code-tag">&lt;bean id=<span class="code-quote">"transformService"</span> class=<span class="code-quote">"demo.service.TransformServiceImpl"</span>&gt;</span>
    <span class="code-tag">&lt;/bean&gt;</span>
<span class="code-tag">&lt;/beans&gt;</span></pre>
</div></div>
<p>b) OSGI 'Injection'</p>

<p>Create the file <tt>demo-service-bundle-contxt-osgi.xml</tt> in the folder <tt>src/main/resources/META-INF/spring</tt></p>
<div class="code"><div class="codeHeader"><b>demo-service-bundle-contxt-osgi.xml</b></div><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&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:osgi</span>=<span class="code-quote">"http://www.springframework.org/schema/osgi"</span>
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/osgi
    http://www.springframework.org/schema/osgi/spring-osgi.xsd"&gt;

	&lt;!--
		definitions using elements of the osgi namespace can be included in
		this file. There is no requirement to keep these definitions in a
		separate file if you do not want to. The rationale for keeping these
		definitions separate is to facilitate integration testing of the
		bundle outside of an OSGi container
	--&gt;

	<span class="code-tag">&lt;osgi:service ref=<span class="code-quote">"transformService"</span>&gt;</span>
		<span class="code-tag">&lt;osgi:interfaces&gt;</span>
			<span class="code-tag">&lt;value&gt;</span>demo.service.TransformService<span class="code-tag">&lt;/value&gt;</span>
		<span class="code-tag">&lt;/osgi:interfaces&gt;</span>
	<span class="code-tag">&lt;/osgi:service&gt;</span>

<span class="code-tag">&lt;/beans&gt;</span></pre>
</div></div>
<p><b>Remark:</b> for more information about Spring Dynamic Modules and configuration, I recommend to read its <span class="nobr"><a href="http://static.springframework.org/osgi/docs/1.2.0-m2/reference/html/" title="Visit page outside Confluence" rel="nofollow">documentation<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p>

<table cellpadding='5' width='85%' cellspacing='8px' class='tipMacro' border="0" align='center'><colgroup><col width='24'><col></colgroup><tr><td valign='top'><img src="/confluence/images/icons/emoticons/check.gif" width="16" height="16" align="absmiddle" alt="" border="0"></td><td><b class="strong">Spring configuration files</b><br />
<p>Two XML files have been created to work with Spring beans and Spring OSGI beans separately (as proposed by <span class="nobr"><a href="http://static.springframework.org/osgi/docs/current/reference/html/appendix-archetype.html" title="Visit page outside Confluence" rel="nofollow">spring<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> - section D.1 Generated Project Features at-a-glance) but you can also merge the content in one file.</p></td></tr></table>

<h2><a name="tutorial-osgi-camel-part1-Step5%3AGeneratetheMANIFEST.MFfileandjarofthebundle"></a>Step 5 : Generate the MANIFEST.MF file and jar of the bundle</h2>

<p>Now, that the code and the configuration files are ready, we will use maven to generate the <tt>MANIFEST.MF</tt> file describing the information about our bundle, its version number, the package to export or import, etc.</p>

<p>This command can be launched from Eclipse (if you have integrated maven within Eclipse (<span class="nobr"><a href="http://m2eclipse.codehaus.org/" title="Visit page outside Confluence" rel="nofollow">eclipse maven plugin<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>)) or a Unix/Dos prompt in the folder where your pom.xml file is located:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">mvn <span class="code-keyword">package</span></pre>
</div></div>
<p>If this command does not report any error, then a 'MANIFEST.MF' file containing the following information is created in the folder 'META-INF' and<br/>
a <tt>demo.service-bundle-0.1.0.jar</tt> jar is created in the <tt>target</tt> folder:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">Manifest-Version: 1.0
Export-Package: demo.service;uses:=<span class="code-quote">"org.apache.commons.logging"</span>
Built-By: Charlesm
Build-Jdk: 1.6.0_07
Bundle-Version: 0.1.0
Tool: Bnd-0.0.238
Bundle-Name: Demo Service Bundle
Bnd-LastModified: 1228122578185
Created-By: Apache Maven Bundle Plugin
Bundle-ManifestVersion: 2
Bundle-SymbolicName: demo.demo.service-bundle
Import-Package: demo.service,org.apache.commons.logging</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">bnd tool</b><br />
<p>The pom of spring dm uses the maven bundle plugin and the tool <span class="nobr"><a href="http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html" title="Visit page outside Confluence" rel="nofollow">bnd<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span><br/>
to generate this manifest file. Bnd stands for BuNDle tool and has been created by Peter Kriens (OSGi Technical Officer) </p></td></tr></table>

<h2><a name="tutorial-osgi-camel-part1-Step6%3ACreatetheCamelcontextfileandOSGIdependency"></a>Step 6 : Create the Camel context file and OSGI dependency</h2>

<p>The next step is quite simple for Camel users because we will create two configurations files, one containing the routing and the other with a reference to our TransformationService deployed in a OSGI bundle.</p>
<ul>
	<li>For the routing, create the following file in the folder <tt>src/main/resources/META-INF/spring</tt> of the project <tt>demo.camel-bundle</tt>:</li>
</ul>


<div class="code"><div class="codeHeader"><b>CamelContext.xml</b></div><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&lt;beans xmlns=<span class="code-quote">"http://www.springframework.org/schema/beans"</span>
       <span class="code-keyword">xmlns:xsi</span>=<span class="code-quote">"http://www.w3.org/2001/XMLSchema-instance"</span>
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://activemq.apache.org/camel/schema/spring
       http://activemq.apache.org/camel/schema/spring/camel-spring.xsd"&gt;

  <span class="code-tag">&lt;camelContext xmlns=<span class="code-quote">"http://activemq.apache.org/camel/schema/spring"</span>&gt;</span>
    <span class="code-tag">&lt;route&gt;</span>
      <span class="code-tag">&lt;from uri=<span class="code-quote">"timer://myTimer?fixedRate=true&amp;amp;period=10000"</span>/&gt;</span>
      <span class="code-tag">&lt;bean ref=<span class="code-quote">"myTransform"</span> method=<span class="code-quote">"transform"</span>/&gt;</span>
      <span class="code-tag">&lt;to uri=<span class="code-quote">"log:ExampleRouter"</span>/&gt;</span>
    <span class="code-tag">&lt;/route&gt;</span>
  <span class="code-tag">&lt;/camelContext&gt;</span>
<span class="code-tag">&lt;/beans&gt;</span></pre>
</div></div>
<p>The routing defined here is a timer which will trigger every 10th second and call the POJO 'MyTransform' and send the result to the 'camel:log' component. As, you can see, this is a pure Camel configuration file without any reference to an OSGI bundle</p>
<ul>
	<li>To inject the dependency, we will create a second file named <tt>bundle-context-osgi.xml</tt> in the same folder:</li>
</ul>


<div class="code"><div class="codeHeader"><b>bundle-context-osgi.xml</b></div><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;?xml version=<span class="code-quote">"1.0"</span> encoding=<span class="code-quote">"UTF-8"</span>?&gt;</span>
&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:osgi</span>=<span class="code-quote">"http://www.springframework.org/schema/osgi"</span>
  xsi:schemaLocation="
  http://www.springframework.org/schema/beans
  http://www.springframework.org/schema/beans/spring-beans.xsd
  http://www.springframework.org/schema/osgi
  http://www.springframework.org/schema/osgi/spring-osgi.xsd"&gt;

      <span class="code-tag">&lt;osgi:reference id=<span class="code-quote">"myTransform"</span> interface=<span class="code-quote">"demo.service.TransformService"</span>/&gt;</span>

<span class="code-tag">&lt;/beans&gt;</span></pre>
</div></div>
<p>Remarks:</p>
<ul class="alternate" type="square">
	<li>The id of the bean referenced <tt>myTransform</tt> used by the Camel context has a reference to the OSGI interface <tt>demo.service.TransformService</tt></li>
	<li>How could we imagine something more simplest? We don't have to call a JNDI server with a reference or something like that. Only a reference to the service interface.</li>
</ul>


<h2><a name="tutorial-osgi-camel-part1-Step7%3AGeneratethemanifestandjarfile"></a>Step 7 : Generate the manifest and jar file</h2>

<p>Prior to run/launch the command generating the MANIFEST file, you must modify the pom.xml file and add the following line in order to allow the OSGI bundle to import/use the services classes : demo.service</p>

<div class="code"><div class="codeContent">
<pre class="code-java">...
&lt;Export-Package&gt;!demo.routing&lt;/Export-Package&gt;
&lt;!-- text to be added after Export-Package tag --&gt;
&lt;Import-Package&gt;demo.service,*&lt;/Import-Package&gt;
...</pre>
</div></div>

<p>Run the command <tt><b>mvn package</b></tt> (= Repeat step #5).</p>

<h2><a name="tutorial-osgi-camel-part1-Step8%3ADeploythebundles"></a>Step 8 : Deploy the bundles</h2>

<p>We will show you now that we can easily deploy our bundles in two OSGI servers running a different OSGI kernel:</p>
<ul>
	<li>Felix for ServiceMix Kernel</li>
	<li>Equinox for Spring Dynamic Module</li>
</ul>


<h3><a name="tutorial-osgi-camel-part1-ServiceMixKernel"></a>ServiceMix Kernel</h3>

<p>As mentioned in the documentation, <span class="nobr"><a href="http://servicemix.apache.org/SMX4KNL/index.html" title="Visit page outside Confluence" rel="nofollow">Apache ServiceMix Kernel<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> is a small OSGi based runtime which provides a lightweight container onto which various components and applications can be deployed. Moreover, the server provides administration, security, logging and provisioning features who will help you during the deployment and administration steps.</p>

<p>If this is not yet done, download ServiceMix Kernel 1.0.0 server and install it. Launch the server by executing the command in the <tt>bin</tt> folder:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">c:\apache-servicemix-kernel-1.0.0\bin&gt;servicemix</pre>
</div></div>
<p>If this is the first time Servicemix is started, then you will see that a new data folder is created.</p>

<p>In order to allow our bundles to work with Camel, execute the following commands to download and install the 'Camel and Spring bundles':</p>
<div class="code"><div class="codeContent">
<pre class="code-java">servicemix&gt; osgi install \-s mvn:org.springframework/spring-tx/2.5.5
servicemix&gt; osgi install \-s mvn:org.apache.camel/camel-core/1.5.0
servicemix&gt; osgi install \-s mvn:org.apache.camel/camel-spring/1.5.0
servicemix&gt; osgi install \-s mvn:org.apache.camel/camel-osgi/1.5.0</pre>
</div></div>
<p>Next, copy the two jar into the <tt>deploy</tt> folder, first the service and next the Camel bundle. After a few seconds, you should see on the Servicemix log console the following text:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">&gt;&gt; call &gt;&gt; MyTransform set body:  Mon Dec 01 11:02:28 CET 2008</pre>
</div></div>
<p>Remarks :</p>
<ul class="alternate" type="square">
	<li>In case of trouble, use the command: <tt>osgi list</tt> to see if all the deployed bundles are installed correctly and have their status equals to active</li>
	<li>To see the log of ServiceMix, use the command: <tt>log d</tt></li>
</ul>


<h3><a name="tutorial-osgi-camel-part1-SpringDMserver"></a>Spring DM server</h3>

<p>Spring DM server compare to ServiceMix Kernel, Eclipse Equinox or Apache Felix is much more than a OSGI server. This is a completely module-based Java application server that is designed to run enterprise Java applications and Spring-powered applications with a new degree of flexibility and reliability. It offers a simple yet comprehensive platform to develop, deploy, and service enterprise Java applications.</p>

<p>We have decided to it inside this tutorial not only because we have designed spring-based applications but because we are convince that OSGI platform will become the next standard for the Web Application Server. Existing Commercial and open-source are gradually migrating their servers to support OSGI.</p>

<p>Like ServiceMix Kernel, start the Spring DM server by launching the following command in your Unix/Dos environement :</p>
<div class="code"><div class="codeContent">
<pre class="code-java">c:\springsource-dm-server-1.0.0.RELEASE\bin&gt;startup</pre>
</div></div>
<p>When the server is started, open your favorite browser and point to the following url <tt><span class="nobr"><a href="http://localhost:8080/admin" title="Visit page outside Confluence" rel="nofollow">http://localhost:8080/admin<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></tt> using 'admin' as login and 'springsource' as password. In the administration page, click on the button "browse" to upload the different jars to be deployed. Select the folder where you have copied the following jars and upload them one by one (by respecting the order)</p>
<ul class="alternate" type="square">
	<li>camel-core-1.5.0.jar</li>
	<li>camel-spring-1.5.0.jar</li>
	<li>demo.service-bundle-0.1.0.jar</li>
	<li>demo.camel-bundle-0.1.0.jar</li>
</ul>


<p>When the bundles are uploaded, the screen is refreshed and shows a list of the deployed applications like this :</p>

<table class='confluenceTable'><tbody>
<tr>
<th class='confluenceTh'>Name</th>
<th class='confluenceTh'>Version</th>
<th class='confluenceTh'>Origin</th>
<th class='confluenceTh'>Date</th>
<th class='confluenceTh'>Undeploy</th>
</tr>
<tr>
<td class='confluenceTd'>org.apache.camel.camel-core</td>
<td class='confluenceTd'>1.5</td>
<td class='confluenceTd'>Admin Console</td>
<td class='confluenceTd'>Dec 2, 2008 10:21:02 AM CET</td>
<td class='confluenceTd'>undeploy</td>
</tr>
<tr>
<td class='confluenceTd'>org.apache.camel.camel-spring</td>
<td class='confluenceTd'>1.5</td>
<td class='confluenceTd'>Admin Console</td>
<td class='confluenceTd'>Dec 2, 2008 10:21:05 AM CET</td>
<td class='confluenceTd'>undeploy</td>
</tr>
<tr>
<td class='confluenceTd'>demo.demo.service-bundle</td>
<td class='confluenceTd'>0.1</td>
<td class='confluenceTd'>Admin Console</td>
<td class='confluenceTd'>Dec 2, 2008 10:21:06 AM CET</td>
<td class='confluenceTd'>undeploy</td>
</tr>
<tr>
<td class='confluenceTd'>demo.demo.camel-bundle</td>
<td class='confluenceTd'>0.1</td>
<td class='confluenceTd'>Admin Console</td>
<td class='confluenceTd'>Dec 2, 2008 10:21:07 AM CET</td>
<td class='confluenceTd'>undeploy</td>
</tr>
</tbody></table>

<p>To verify that the Camel service bundle works perfectly, open the trace.log file located in the folder : </p>

<div class="code"><div class="codeContent">
<pre class="code-java">c:\springsource-dm-server-1.0.0.RELEASE\serviceability\trace\demo.demo.camel-bundle-0.1\trace.log</pre>
</div></div>

<p>and you should see the following text</p>

<div class="code"><div class="codeContent">
<pre class="code-java">[2008-12-02 10:43:19.500] edRate=<span class="code-keyword">true</span>&amp;period=10000 <span class="code-object">System</span>.out I &gt;&gt; call &gt;&gt; MyTransform set body:  Tue Dec 02 10:43:19 CET 2008
[2008-12-02 10:43:19.500] edRate=<span class="code-keyword">true</span>&amp;period=10000 demo.service.TransformServiceImpl.unknown I &gt;&gt; call &gt;&gt;MyTransform set body:  Tue Dec 02 10:43:19 CET 2008
[2008-12-02 10:43:19.500] edRate=<span class="code-keyword">true</span>&amp;period=10000 ExampleRouter.unknown I Exchange[BodyType:<span class="code-object">String</span>, Body:MyTransform set body:  Tue Dec 02 10:43:19 CET 2008]</pre>
</div></div>

<h2><a name="tutorial-osgi-camel-part1-Conclusion"></a>Conclusion</h2>

<p>Well, we have finished the first part of the tutorial. Even if the example is simple, we have introduced very important concepts and show you how to design a small SOA solution, package it and deploy it under two different OSGI servers. I'm really sure that in a near future a maven plugin will be created to facilitate this task and will automate the deployment within your favorite OSGI servers.</p>

<h2><a name="tutorial-osgi-camel-part1-%23Resources"></a><a href="#tutorial-osgi-camel-part1-Resources" title="Resources on tutorial-osgi-camel-part1">Resources</a></h2>

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

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


    }
    </script>


            <table class="tableview" cellpadding="0" cellspacing="0" width="100%">
            <tr>
                <th width="1%">&nbsp;</th>
                <th width="1%"><a href="/confluence/display/CAMEL/tutorial-osgi-camel-part1?sortBy=name">Name</a></th>
                <th width="1%"><a href="/confluence/display/CAMEL/tutorial-osgi-camel-part1?sortBy=size">Size</a></th>
                <th width="1%">Creator</th>
                <th width="1%"><a href="/confluence/display/CAMEL/tutorial-osgi-camel-part1?sortBy=date">Date</a></th>
                <th>Comment</th>
                <th width="1%">&nbsp;</th>
            </tr>
            
                            <tr      id="attachment_9396">
                            <td nowrap><img align="absmiddle" height="16" width="16" id="arrow9396" src="/confluence/images/border/spacer.gif"></td>
                <td nowrap><a name="tutorial-osgi-camel-part1-attachment-tutorial-osgi-camel-part1.zip"><img src="/confluence/images/icons/attachments/zip.gif" height=16 width=16 border=0 vspace=1 align=absmiddle alt="ZIP Archive"></a> <a href="/confluence/download/attachments/103709/tutorial-osgi-camel-part1.zip">tutorial-osgi-camel-part1.zip</a></td>
                <td nowrap>14 kb</td>
                <td nowrap>    <a href="/confluence/display/~cmoulliard@xpectis.com">Charles Moulliard</a></td>
                <td nowrap>Dec 01, 2008</td>
                <td>                        &nbsp;
                                    </td>
                <td nowrap>&nbsp;

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

                                </table>
    
<br>

    
    </li>
</ul>
</div>


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

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

</div>

</body>
</html>


Mime
View raw message