felix-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From conflue...@apache.org
Subject [CONF] Apache Felix: iPOJO Advanced Tutorial (page edited)
Date Thu, 17 Apr 2008 23:16: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/FELIX">FELIX</a> :
            <a href="http://cwiki.apache.org/confluence/display/FELIX/iPOJO+Advanced+Tutorial">iPOJO Advanced Tutorial</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/FELIX/iPOJO+Advanced+Tutorial">iPOJO Advanced Tutorial</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~clement.escoffier">Clement Escoffier</a>
            <span class="smallfont">(Apr 15, 2008)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=63270&originalVersion=6&revisedVersion=7">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr>
<td class="confluenceTd"  valign="top" width="80%">
<h1><a name="iPOJOAdvancedTutorial-TheiPOJOSnackBar"></a>The iPOJO Snack Bar</h1>
<p>This tutorial presents some iPOJO features and shows:</p>
<ul>
	<li>How a component can provide two services</li>
	<li>How to attach a service property to provided service</li>
	<li>How a service property can be dynamically updated by component code</li>
	<li>How to configure instances</li>
	<li>How a service dependency can filter providers</li>
	<li>How to create instance(s) for a component not contained in the same bundle</li>
	<li>How to configure instances</li>
	<li>How to use the lifecycle controller handler</li>
	<li>How to use the Configuration Admin to reconfigure instances</li>
</ul>


<h2><a name="iPOJOAdvancedTutorial-Context"></a>Context</h2>
<p>This tutorial is based on a very simple application; customers are using a vendor service to buy hot dog or pop corn according to the availability of appropriate providers. Both of the vendors implement (and provide) the vendor service. The hot dog vendor depends on two others services to get the ingredients (buns and wiener). To sell pop corn, the pop corn vendor requires having enough corn in stock.<br/>
<img src="/confluence/download/attachments/63270/vendor.png" align="absmiddle" border="0" /></p>
<h2><a name="iPOJOAdvancedTutorial-Preparingthetutorial"></a>Preparing the tutorial</h2>
<p>The tutorial archive is available <span class="nobr"><a href="/confluence/download/attachments/63270/advanced.tutorial.zip?version=1" title="advanced.tutorial.zip attached to iPOJO Advanced Tutorial">here<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>. This archive contains both the source code and a pre-configured version of Felix. First, unzip the archive. Then, launch <em>'ant'</em> to compile the bundles composing this tutorial. Once compiled, you can launch Felix and start the tutorial. To launch, Felix launch the following command from the felix-1.0.3 directory:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">java -jar bin/felix.jar</pre>
</div></div>

<h2><a name="iPOJOAdvancedTutorial-Writingacomponentprovidingtwoservices"></a>Writing a component providing two services</h2>
<p>The sources of this project are inside the _ vendor.buns-and-wieners_ directory.<br/>
The hot dog vendor requires at the same time the bun service and the wiener service. In our application these services are provided by the same component. This component can be implemented as follows (src\org\apache\felix\ipojo\example\vendor\provider\BunWienerProvider.java):</p>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class BunWienerProvider <span class="code-keyword">implements</span> BunService, WienerService {
    
    <span class="code-keyword">public</span> void getBun() {
        <span class="code-object">System</span>.out.println(<span class="code-quote">"Get a bun"</span>);
    }

    <span class="code-keyword">public</span> void getWiener() {
        <span class="code-object">System</span>.out.println(<span class="code-quote">"Get a wiener"</span>);
    }
}</pre>
</div></div>
<p>This class just implements the two service interfaces. Its descriptor (contained in the metadata.xml file) is:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">&lt;ipojo&gt;
&lt;component classname=<span class="code-quote">"org.apache.felix.ipojo.example.vendor.provider.BunWienerProvider"</span> name=<span class="code-quote">"buns_and_wieners"</span> factory=<span class="code-quote">"<span class="code-keyword">false</span>"</span>&gt;
	&lt;provides/&gt;
&lt;/component&gt;

&lt;instance component=<span class="code-quote">"buns_and_wieners"</span>/&gt;
&lt;/ipojo&gt;</pre>
</div></div>

<p>In the descriptor, we declare a component type for this vendor which contains the implementation class. The "classname" attribute contains the qualified name of the component implementation. The "name" attribute is the component type name. It is only used to refer to this type.</p>

<p>The "factory=false" attribute disables factory exposition. A component type publishing a factory provides a way to create instance of this type from outside this descriptor. In our case, we want to guarantee that only one instance (singleton) can be created, so we disable the factory mechanism.</p>

<p>iPOJO manages service publication and providing automatically at runtime. The "&lt;provides/&gt;" element means that the component provides services. If this element is not present, iPOJO will publish all implemented interfaces by the implementation class (and parent class too). In our case, it will publish the BunService and WienerService interfaces.</p>

<p>Finally, we create one instance of our component. The instance contains the component attribute describing the component type to use. We use the component type name to target the wanted component type. </p>

<p>At runtime, the bundle containing this component will create an instance which provides the BunService and the WienerService.</p>


<h2><a name="iPOJOAdvancedTutorial-Publishingserviceproperties"></a>Publishing service properties</h2>
<p>The sources of this project are inside the <em>vendor.hotdog</em> directory.<br/>
The hot dog vendor only provides the Vendor service. To provide this service, it uses a bun service and a wiener service. The following code (contained in the <em>src/org/apache/felix/ipojo/example/vendor/hotdog/HotDogVendor.java</em> file) shows a very simple implementation of this component:</p>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class HotDogVendor <span class="code-keyword">implements</span> Vendor {
    
    /**
     * Bun provider (required service).
     */
    <span class="code-keyword">private</span> Bun bunProvider;
    
    /**
     * Wiener provider (required service). 
     */
    <span class="code-keyword">private</span> Wiener wienerProvider;
    
    /**
     * Sell method.
     * To provide an hotdog, the vendor consume a bun and a wiener.
     * This method is <span class="code-keyword">synchronized</span> to avoid serving to client at the same time.
     * @<span class="code-keyword">return</span> a hotdog.
     * @see org.apache.felix.ipojo.example.vendor.service.Vendor#sell()
     */
    <span class="code-keyword">public</span> <span class="code-keyword">synchronized</span> Product sell() {
        bunProvider.getBun();
        wienerProvider.getWiener();
        <span class="code-keyword">return</span> <span class="code-keyword">new</span> HotDog();
    }</pre>
</div></div>

<p>Once implemented, we need to describe this component type. The descriptor file is the <em>metadata.xml</em> file. The field attributes in the "requires" elements are used to inject the required services. At runtime, iPOJO injects automatically a BunService provider in the "bunProvider" field and a WienerService provider in the "wienerProvider" field. The implementation uses these fields the same way it would have used any other fields (as illustrated in the sell method).</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;ipojo&gt;</span>
<span class="code-tag">&lt;component classname=<span class="code-quote">"org.apache.felix.ipojo.example.vendor.hotdog.HotDogVendor"</span> name=<span class="code-quote">"HD"</span> factory=<span class="code-quote">"false"</span>&gt;</span>
	<span class="code-tag">&lt;provides/&gt;</span>
	<span class="code-tag">&lt;requires field=<span class="code-quote">"bunProvider"</span>/&gt;</span>
	<span class="code-tag">&lt;requires field=<span class="code-quote">"wienerProvider"</span>/&gt;</span>
<span class="code-tag">&lt;/component&gt;</span>

<span class="code-tag">&lt;instance component=<span class="code-quote">"HD"</span>/&gt;</span>
<span class="code-tag">&lt;/ipojo&gt;</span></pre>
</div></div>

<p>The component type declares a provided service (the Vendor Service). Then, the component declares the two service dependencies (using the "requires" element). However, we would like to add a service property on the Vendor service describing the sold product (here, "hotdog"). To achieve this, we just need to add a property element in the "provides" tags: </p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;ipojo&gt;</span>
<span class="code-tag">&lt;component classname=<span class="code-quote">"org.apache.felix.ipojo.example.vendor.hotdog.HotDogVendor"</span> name=<span class="code-quote">"HD"</span> factory=<span class="code-quote">"false"</span>&gt;</span>
	<span class="code-tag">&lt;provides&gt;</span>
		<span class="code-tag">&lt;property name=<span class="code-quote">"product"</span> type=<span class="code-quote">"string"</span> value=<span class="code-quote">"hotdog"</span>/&gt;</span>
	<span class="code-tag">&lt;/provides&gt;</span>
	<span class="code-tag">&lt;requires field=<span class="code-quote">"bunProvider"</span>/&gt;</span>
	<span class="code-tag">&lt;requires field=<span class="code-quote">"wienerProvider"</span>/&gt;</span>
<span class="code-tag">&lt;/component&gt;</span>

<span class="code-tag">&lt;instance component=<span class="code-quote">"HD"</span>/&gt;</span>
<span class="code-tag">&lt;/ipojo&gt;</span></pre>
</div></div>

<p>iPOJO then publishes the "product" property in the "vendor" service registration. This property has the "hotdog" value.</p>

<h2><a name="iPOJOAdvancedTutorial-Publishing%27dynamic%27properties"></a>Publishing 'dynamic' properties</h2>

<p>The bun service and the wiener service can also expose service properties. In our case, these service properties will describe the stock of ingredients. Each time the service is used, the property value is decreased.<br/>
To achieve this, we modify the current implementation to add a field representing the property:</p>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class BunWienerProvider <span class="code-keyword">implements</span> BunService, WienerService {
    
    <span class="code-keyword">private</span> <span class="code-object">int</span> bunStock;
    
    <span class="code-keyword">private</span> <span class="code-object">int</span> wienerStock;

    <span class="code-keyword">public</span> <span class="code-keyword">synchronized</span> void getBun() {
        bunStock = bunStock - 1;
    }

    <span class="code-keyword">public</span> <span class="code-keyword">synchronized</span> void getWiener() {
        wienerStock = wienerStock - 1;
    }
}</pre>
</div></div>

<p>The stock accesses are synchronized to avoid multiple accesses at the same time. The component type metadata must also be modified in order to describe this property:</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;ipojo&gt;</span>
<span class="code-tag">&lt;component classname=<span class="code-quote">"org.apache.felix.ipojo.example.vendor.provider.BunProvider"</span> name=<span class="code-quote">"buns_and_wieners"</span> factory=<span class="code-quote">"false"</span>&gt;</span>
	<span class="code-tag">&lt;provides&gt;</span>
		<span class="code-tag">&lt;property name=<span class="code-quote">"buns"</span> field=<span class="code-quote">"bunStock"</span> value=<span class="code-quote">"10"</span>/&gt;</span>
		<span class="code-tag">&lt;property name=<span class="code-quote">"wieners"</span> field=<span class="code-quote">"wienerStock"</span> value=<span class="code-quote">"10"</span>/&gt;</span>
	<span class="code-tag">&lt;/provides&gt;</span>
<span class="code-tag">&lt;/component&gt;</span>

<span class="code-tag">&lt;instance component=<span class="code-quote">"buns_and_wieners"</span>/&gt;</span>
<span class="code-tag">&lt;/ipojo&gt;</span></pre>
</div></div>

<p>In the "provides" element, two properties are added. This property contains a "field" attribute aiming to attach the service property with a field of the implementation class. Then a default value is given. In the code, the property fields will obtain the initial value (10). Then each time the fields are modified, the service property is updated (as well as the OSGi™ service registration). Notice that iPOJO support method injection for property too. In this case, a getter method is called to inject the property value.</p>

<h2><a name="iPOJOAdvancedTutorial-Configuringinstances"></a>Configuring instances</h2>

<p>In the previous example, the properties were configured in the component type description. It is also possible to customize any property value in the instance declaration. This way, each instance can obtain different values.</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;ipojo&gt;</span>
<span class="code-tag">&lt;component classname=<span class="code-quote">"org.apache.felix.ipojo.example.vendor.provider.BunProvider"</span> name=<span class="code-quote">"buns_and_wieners"</span> factory=<span class="code-quote">"false"</span>&gt;</span>
	<span class="code-tag">&lt;provides&gt;</span>
		<span class="code-tag">&lt;property name=<span class="code-quote">"buns"</span> field=<span class="code-quote">"bunStock"</span> value=<span class="code-quote">"10"</span>/&gt;</span>
		<span class="code-tag">&lt;property name=<span class="code-quote">"wieners"</span> field=<span class="code-quote">"wienerStock"</span> value=<span class="code-quote">"10"</span>/&gt;</span>
	<span class="code-tag">&lt;/provides&gt;</span>
<span class="code-tag">&lt;/component&gt;</span>

<span class="code-tag">&lt;instance component=<span class="code-quote">"buns_and_wieners"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"buns"</span> value=<span class="code-quote">"9"</span>/&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"wieners"</span> value=<span class="code-quote">"8"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;/ipojo&gt;</span></pre>
</div></div>

<p>The previous metadata shows how to push a configuration in instance declarations. The instance declaration contains two property elements containing the name of the value of the property. Instance configuration override component type initial value. If a property does not have an initial value, the instance <b>must</b> provide a value for every unvalued property. </p>

<h2><a name="iPOJOAdvancedTutorial-Usingfilterinservicerequirement"></a>Using filter in service requirement</h2>

<p>Now that bun and wiener providers publish their remaining stock, the hot dog provider can look for a bun service and a wiener service with a non empty stock. To achieve this, we must describe an LDAP filter in the service requirement description. The following XML snipped shows this metadata:</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;ipojo&gt;</span>
<span class="code-tag">&lt;component classname=<span class="code-quote">"org.apache.felix.ipojo.example.vendor.hotdog.HotDogVendor"</span> name=<span class="code-quote">"HD"</span> factory=<span class="code-quote">"false"</span>&gt;</span>
	<span class="code-tag">&lt;provides&gt;</span>
		<span class="code-tag">&lt;property name=<span class="code-quote">"product"</span> type=<span class="code-quote">"string"</span> value=<span class="code-quote">"hotdog"</span>/&gt;</span>
	<span class="code-tag">&lt;/provides&gt;</span>
	<span class="code-tag">&lt;requires field=<span class="code-quote">"bunProvider"</span> filter=<span class="code-quote">"(buns&gt;</span>=1)"</span>/&gt;
	<span class="code-tag">&lt;requires field=<span class="code-quote">"wienerProvider"</span> filter=<span class="code-quote">"(wieners&gt;</span>=1)"</span>/&gt;
<span class="code-tag">&lt;/component&gt;</span>

<span class="code-tag">&lt;instance component=<span class="code-quote">"HD"</span>/&gt;</span>
<span class="code-tag">&lt;/ipojo&gt;</span></pre>
</div></div>

<p>When a provider does no more matches with the LDAP filter, the provider is no more used, and another (matching with the filter) is tracked. If no provider fulfilling the constraint is found, the instance becomes invalid and waits a matching provider.</p>

<p><em>Note:</em> when an instance becomes invalid, all its provided services are withdrawn from the service registry. </p>

<h2><a name="iPOJOAdvancedTutorial-Immediatecomponentinstance"></a>Immediate component instance</h2>

<p>Now that we get the hot dog provider, we are going to implement customers. Customers are implemented in the _ vendor.customer _ project). A customer simply looks for a vendor service and buys a product:</p>

<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class Customer {
    
    <span class="code-keyword">private</span> VendorService vendor;
    
    <span class="code-keyword">private</span> <span class="code-object">String</span> name;
    
    <span class="code-keyword">public</span> Customer() {
        <span class="code-object">System</span>.out.println(<span class="code-quote">"Customer "</span> + name + <span class="code-quote">" bought "</span> +  vendor.sell() + <span class="code-quote">" from "</span> + vendor.getName());
    }</pre>
</div></div>

<p>The previous code shows a possible implementation of a customer. However, the "sell" method is called in a constructor, and the constructor can only be called only if an object of the class is created. With iPOJO there are two different way to "activate" an instance as soon as it becomes valid. <br/>
The first one uses the lifecycle callback (described in the previous tutorial).  The second one is by declaring the component as an immediate component. An immediate component instance creates an object of its implementation as soon as it becomes valid. </p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;ipojo&gt;</span>
<span class="code-tag">&lt;component classname=<span class="code-quote">"org.apache.felix.ipojo.example.vendor.customer.Customer"</span> factory=<span class="code-quote">"customer"</span> immediate=<span class="code-quote">"true"</span>&gt;</span>
	<span class="code-tag">&lt;requires field=<span class="code-quote">"vendor"</span>/&gt;</span>
	<span class="code-tag">&lt;properties&gt;</span>
		<span class="code-tag">&lt;property field=<span class="code-quote">"name"</span>/&gt;</span>
	<span class="code-tag">&lt;/properties&gt;</span>
<span class="code-tag">&lt;/component&gt;</span>
<span class="code-tag">&lt;/ipojo&gt;</span></pre>
</div></div>

<p>To declare a component immediate, just add "immediate=true" in the component descriptor. Then as soon as the vendor service is available, the object is created. Moreover, this type declares a property (to give a name to the customers). This property is not a service property, but just an internal property. As for service properties, the name field will be injected by a value necessary given during the instance creation (i.e. contained inside the instance configuration).</p>

<p><em>Note:</em> there is a difference between immediate components and components with a 'validate' lifecycle callback. Indeed, the callback is call at each time the instance becomes valid and calls the constructor only if no object already exists. On the other side, the immediate component's constructor is call only once.</p>

<h1><a name="iPOJOAdvancedTutorial-Creatinginstancesfromanexternalcomponenttype"></a>Creating instances from an external component type</h1>

<p>In the previous section we have declared a customer component type, which does not have the "factory=false" attribute. This feature allows separate deployment from instance creation. Moreover, we didn't declare instances in the descriptor. <br/>
Another metadata file can be used to declare instances from the customer type, this descriptor being contained in another bundle. The following descriptor creates 10 customer instances (look at the <em>vendor.customer.creator\metadata.xml</em> file):</p>

<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;ipojo&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-1"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-2"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-3"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-4"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-5"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-6"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-7"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-8"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-9"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;instance component=<span class="code-quote">"customer"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"customer-10"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;/ipojo&gt;</span></pre>
</div></div>

<p>Once deployed, this bundle looks for the required factory. If it's not available the bundle waits for the factory. As soon as the required factory is available, all instances are created. When this bundle is stopped, all instances are destroyed. </p>
<h2><a name="iPOJOAdvancedTutorial-Deployingtheapplication"></a>Deploying the application</h2>
<p>Compile the bundles, by launching ant at the root of the tutorial. Then launch Felix is indicated above. <br/>
Once started (write any profile name), launch the following commands </p>
<div class="code"><div class="codeContent">
<pre class="code-java">start file:../vendor.services/output/vendor.services.jar
start file:../vendor.buns-and-wieners/output/vendor.buns-and-wieners.jar
start file:../vendor.hotdog/output/vendor.hotdog.jar
start file:../vendor.customer/output/vendor.customer.jar
start file:../vendor.customer.creator/output/vendor.customer.creator.jar</pre>
</div></div>
<p>Something like this should appear:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">Customer customer-1 bought Hotdog from Fenway Park
Customer customer-2 bought Hotdog from Fenway Park
Customer customer-3 bought Hotdog from Fenway Park
Customer customer-4 bought Hotdog from Fenway Park
Customer customer-5 bought Hotdog from Fenway Park
Customer customer-6 bought Hotdog from Fenway Park
Customer customer-7 bought Hotdog from Fenway Park
Customer customer-8 bought Hotdog from Fenway Park</pre>
</div></div>
<p>Only 8 customers can buy a hotdog, as the stock of wieners and buns can't supply more hotdog. The remainder of this tutorial will try to solve the problem of these two hungry customers.</p>
<h2><a name="iPOJOAdvancedTutorial-Usingthelifecyclecontroller"></a>Using the lifecycle controller</h2>
<p>Sometimes you want to invalidate your instance in the code (for example: to unregister a service). That's possible with the lifecycle controller handler.<br/>
Let's take the popcorn vendor with a corn stock from the _ vendor.popcorn_ project. Each time it sells some popcorn, its stock is decreased. When the stock reaches 0, it cannot sell popcorns any more (so the vendor service needs to be withdrawn).</p>

<p>The following implementation (<em>rc\org\apache\felix\ipojo\example\vendor\popcorn\PopCornVendor.java</em>) uses a field to control the lifecycle.</p>

<div class="code"><div class="codeContent">
<pre class="code-java">/**
     * The corn stock.
     */
    <span class="code-keyword">private</span> <span class="code-object">int</span> m_corn_stock;
    
    /**
     * Lifecycle controller.
     * If set to <span class="code-keyword">false</span>, the instance becomes invalid. 
     */
    <span class="code-keyword">private</span> <span class="code-object">boolean</span> m_can_sell = <span class="code-keyword">true</span>;

    /**
     * The sell method.
     * To provide popcorn, the vendor needs to decrease its corn stock level.
     * This method is <span class="code-keyword">synchronized</span> to avoid to client being serve at the same time. 
     * @<span class="code-keyword">return</span>
     * @see org.apache.felix.ipojo.example.vendor.service.Vendor#sell()
     */
    <span class="code-keyword">public</span> <span class="code-keyword">synchronized</span> Product sell() {
        m_corn_stock--;
        <span class="code-keyword">if</span> (m_corn_stock == 0 &amp;&amp; m_can_sell) { <span class="code-comment">// Last pop corn
</span>            m_can_sell = <span class="code-keyword">false</span>;
            <span class="code-object">System</span>.out.println(<span class="code-quote">"Stop selling popcorn ... Run out of stock"</span>);
            <span class="code-keyword">return</span> <span class="code-keyword">new</span> PopCorn();
        } <span class="code-keyword">else</span> <span class="code-keyword">if</span> (m_corn_stock &gt; 0) { <span class="code-comment">// Normal <span class="code-keyword">case</span>
</span>            <span class="code-keyword">return</span> <span class="code-keyword">new</span> PopCorn();
        } <span class="code-keyword">else</span> { <span class="code-comment">// Cannot serve.
</span>            <span class="code-keyword">return</span> PopCorn.NO_MORE_POPCORN;
        }
    }</pre>
</div></div>

<p>Once the field is set to "false", the instance is invalidated (the vendor service is no more available). To configure the controller, you can use the following metadata:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;ipojo&gt;</span>
<span class="code-tag">&lt;component classname=<span class="code-quote">"org.apache.felix.ipojo.example.vendor.popcorn.PopCornVendor"</span> name=<span class="code-quote">"popcorn"</span> factory=<span class="code-quote">"false"</span> architecture=<span class="code-quote">"true"</span>&gt;</span>
	<span class="code-tag">&lt;provides/&gt;</span>
	<span class="code-tag">&lt;controller field=<span class="code-quote">"m_can_sell"</span>/&gt;</span>
<span class="code-tag">&lt;/component&gt;</span>

<span class="code-tag">&lt;instance component=<span class="code-quote">"popcorn"</span>/&gt;</span>
<span class="code-tag">&lt;/ipojo&gt;</span></pre>
</div></div>
<p>The instance can be re-validated by setting the field to true.<br/>
So, no deploy the pop corn vendor.</p>
<div class="code"><div class="codeContent">
<pre class="code-java">-&gt; start file:../vendor.popcorn/output/vendor.popcorn.jar
Customer customer-10 bought popcorn from D &amp; P
Customer customer-9 bought popcorn from D &amp; P</pre>
</div></div>
<p>Our two last customers are no more hungry. However, new customers arrives, we have the following situation:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">-&gt; update 10
Customer customer-1 bought popcorn from D &amp; P
Customer customer-2 bought popcorn from D &amp; P
Stop selling popcorn ... Run out of stock
Customer customer-3 bought popcorn from D &amp; P</pre>
</div></div>
<p>To recreate new customers, just update the customer.creator bundle (bundle 10). So, now we have 7 customers hungry! There is neither popcorn nor hotdog!</p>
<h2><a name="iPOJOAdvancedTutorial-Reconfiguringaninstance"></a>Reconfiguring an instance</h2>
<p>OSGi specified the Configuration Admin mechanism aiming to handler service and bundle configuration. This section will describe how you can use the Configuration Admin and iPOJO to add corn inside our popcorn vendor.<br/>
First, we will change the pop corn vendor to add a method reinjecting the new stock:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">/**
     * A transporter refills the stock of corn.
     * This method is <span class="code-keyword">synchronized</span> to avoid to client being served during the update.
     * @param newStock : the stock of corn to add to the current stock.
     */
    <span class="code-keyword">public</span> <span class="code-keyword">synchronized</span> void refillStock(<span class="code-object">int</span> newStock) {
        m_corn_stock += newStock;
        <span class="code-object">System</span>.out.println(<span class="code-quote">"Refill the stock : "</span> + m_corn_stock);
        <span class="code-keyword">if</span> (m_corn_stock &gt; 0) {
            m_can_sell = <span class="code-keyword">true</span>;
        }
    }</pre>
</div></div>
<p>Once added, we need to update the component type descriptor to use this method:</p>
<div class="code"><div class="codeContent">
<pre class="code-xml"><span class="code-tag">&lt;ipojo&gt;</span>
<span class="code-tag">&lt;component classname=<span class="code-quote">"org.apache.felix.ipojo.example.vendor.popcorn.PopCornVendor"</span> name=<span class="code-quote">"popcorn"</span> architecture=<span class="code-quote">"true"</span>&gt;</span>
	<span class="code-tag">&lt;provides/&gt;</span>
	<span class="code-tag">&lt;controller field=<span class="code-quote">"m_can_sell"</span>/&gt;</span>
	<span class="code-tag">&lt;properties&gt;</span>
		<span class="code-tag">&lt;property name=<span class="code-quote">"stock"</span> method=<span class="code-quote">"refillStock"</span> value=<span class="code-quote">"5"</span>/&gt;</span>
	<span class="code-tag">&lt;/properties&gt;</span>
<span class="code-tag">&lt;/component&gt;</span>

<span class="code-tag">&lt;instance component=<span class="code-quote">"popcorn"</span> name=<span class="code-quote">"SuperPopCorn"</span>&gt;</span>
	<span class="code-tag">&lt;property name=<span class="code-quote">"managed.service.pid"</span> value=<span class="code-quote">"Super.PopCorn.Stock"</span>/&gt;</span>
<span class="code-tag">&lt;/instance&gt;</span>
<span class="code-tag">&lt;/ipojo&gt;</span></pre>
</div></div>
<p>We add two different things. First we add a "stock" property attached to the <em>refillStock</em> method. When this instance is configured or reconfigured, this method is called to push the new stock value. Then we add the _managed.service.pid" property inside the instance creation. This property will be used by the Configuration Admin to attach configuration to instances. The property value must be unique.<br/>
So now, our popcorn vendor can be reconfigured dynamically to get increments its corn stock.<br/>
However, we need to create something refilling the stock ... a corn transporter !<br/>
Inside the <em>vendor.corn.transporter</em> project, we have a component dealing with the ConfigurationAdmin to push the new pop corn vendor configuration.<br/>
Thie implementation is contained in the _ src\org\apache\felix\ipojo\example\vendor\corn\transporter\CornTransporter.java_ file.</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">public</span> class CornTransporter {
    
    <span class="code-keyword">private</span> ConfigurationAdmin m_configAdmin;
    
    
    /**
     * Reconfigure the popcorn vendor with the configuration admin. 
     */
    <span class="code-keyword">public</span> void refillStock() {
        <span class="code-keyword">try</span> {
            <span class="code-comment">// Retrieve or Create the instance configuration from the configuration admin
</span>            Configuration configuration = m_configAdmin.getConfiguration(<span class="code-quote">"Super.PopCorn.Stock"</span>, <span class="code-quote">"file:../vendor.popcorn/output/vendor.popcorn.jar"</span>);
            configuration.setBundleLocation(<span class="code-quote">"file:../vendor.popcorn/output/vendor.popcorn.jar"</span>);
            Properties props = <span class="code-keyword">new</span> Properties();
            props.put(<span class="code-quote">"stock"</span>, <span class="code-keyword">new</span> <span class="code-object">Integer</span>(15)); <span class="code-comment">// Delivered corn
</span>            configuration.update(props);
            <span class="code-object">System</span>.out.println(<span class="code-quote">"Update the configuration of "</span> + configuration.getPid() + <span class="code-quote">"("</span> + configuration.getBundleLocation() + <span class="code-quote">")"</span>);
            configuration.delete();
        } <span class="code-keyword">catch</span> (IOException e) {
            e.printStackTrace();
        } <span class="code-comment">//We indicates the set ManagedService PID
</span>    }
}</pre>
</div></div>
<p>Create a new configuration from the configuration admin and configure this configuration to add corn. Then, we update this configuration. This will reconfigured our popcorn vendor. More information on the Configuration Admin is available in the OSGi R4 Compendium.<br/>
So, now if we deploy this bundle, we will provide enough corn to feed all the customers:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">-&gt; start file:../vendor.corn.transporter/output/vendor.corn.transporter.jar
Update configuration of Super.PopCorn.Stock(file:../vendor.popcorn/output/vendor.popcorn.jar)
Refill the stock : 5
Customer customer-10 bought popcorn from D &amp; P
Customer customer-9 bought popcorn from D &amp; P
Customer customer-8 bought popcorn from D &amp; P
Customer customer-7 bought popcorn from D &amp; P
Customer customer-6 bought popcorn from D &amp; P
Customer customer-5 bought popcorn from D &amp; P
Customer customer-4 bought popcorn from D &amp; P</pre>
</div></div>
<p>That's it!</p>
<h1><a name="iPOJOAdvancedTutorial-Conclusion"></a>Conclusion</h1>
<p>This small tutorial has presented some of iPOJO features. Subscribe to the Felix users mailing list by sending a message to users-subscribe@felix.apache.org; after subscribing, email questions or feedback to users@felix.apache.org.</p></td>
<td class="confluenceTd"  valign="top" width="20%">
<form method="get" class="confluence-searchbox marginlessForm " action="/confluence/dosearchsite.action">
    <input type="hidden" name="searchQuery.spaceKey" value="FELIX" />
    <input type="text" name="searchQuery.queryString" />
    <input type="submit" value="Search" />
</form>
<hr />
<h6><a name="iPOJOAdvancedTutorial-Overview"></a><b>Overview</b></h6>
<ul>
	<li><a href="/confluence/display/FELIX/apache-felix-ipojo-index-tmp" title="apache-felix-ipojo-index-tmp">Home Page</a></li>
	<li><a href="/confluence/display/FELIX/Apache+Felix+iPOJO+Feature+Overview" title="Apache Felix iPOJO Feature Overview">iPOJO Feature Overview</a></li>
</ul>


<h6><a name="iPOJOAdvancedTutorial-GettingStarted"></a><b>Getting Started</b></h6>
<ul>
	<li><a href="/confluence/display/FELIX/iPOJO+in+10+minutes" title="iPOJO in 10 minutes">iPOJO in 10 minutes</a></li>
	<li><a href="/confluence/display/FELIX/iPOJO+Hello+Word+%28Maven-Based%29+tutorial" title="iPOJO Hello Word (Maven-Based) tutorial">iPOJO Hello Word &#40;Maven&#45;Based&#41; tutorial</a></li>
	<li><a href="/confluence/display/FELIX/iPOJO+Advanced+Tutorial" title="iPOJO Advanced Tutorial">iPOJO Advanced Tutorial</a></li>
	<li><a href="/confluence/display/FELIX/Download" title="Download">Download &amp; Install </a></li>
</ul>


<h6><a name="iPOJOAdvancedTutorial-UserGuide"></a><b>User Guide</b></h6>
<ul>
	<li><a href="/confluence/display/FELIX/Describing+components" title="Describing components">Describing components</a></li>
	<li><a href="/confluence/display/FELIX/How+to+use+iPOJO+Annotations" title="How to use iPOJO Annotations">How to use iPOJO Annotations</a></li>
	<li><a href="/confluence/display/FELIX/apache-felix-ipojo-advanced-topics" title="apache-felix-ipojo-advanced-topics">Advanced Topics</a></li>
	<li><a href="/confluence/display/FELIX/apache-felix-ipojo-faq" title="apache-felix-ipojo-faq">FAQ</a></li>
</ul>


<h6><a name="iPOJOAdvancedTutorial-Tools"></a><b>Tools</b></h6>
<ul>
	<li><a href="/confluence/display/FELIX/iPOJO+Eclipse+Plug-in" title="iPOJO Eclipse Plug-in">iPOJO Eclipse Plug&#45;in</a></li>
	<li><a href="/confluence/display/FELIX/iPOJO+Ant+Task" title="iPOJO Ant Task">iPOJO Ant Task</a></li>
	<li><a href="/confluence/display/FELIX/iPOJO+Maven+Plug-in" title="iPOJO Maven Plug-in">iPOJO Maven Plug&#45;in</a></li>
	<li><a href="/confluence/display/FELIX/iPOJO+Concepts+Overview" title="iPOJO Concepts Overview">iPOJO concepts overview</a></li>
</ul>


<h6><a name="iPOJOAdvancedTutorial-DeveloperGuide"></a><b>Developer Guide</b></h6>
<ul>
	<li><a href="/confluence/display/FELIX/How+to+write+your+own+handler" title="How to write your own handler">How to write your own handler</a></li>
	<li><a href="/confluence/display/FELIX/How+to+use+iPOJO+Manipulation+Metadata" title="How to use iPOJO Manipulation Metadata">How to use iPOJO Manipulation Metadata</a></li>
</ul>


<h6><a name="iPOJOAdvancedTutorial-Misc%26Contact"></a><b>Misc &amp; Contact</b></h6>
<ul>
	<li><a href="/confluence/display/FELIX/Issues+Tracker" title="Issues Tracker">Issues Tracker</a></li>
	<li><span class="nobr"><a href="/confluence/pages/createpage.action?spaceKey=FELIX&amp;title=Supported+JVMs&amp;linkCreation=true&amp;fromPageId=82824" title="Create Page: Supported JVMs" class="createlink">Supported JVMs<sup><img class="rendericon" src="/confluence/images/icons/plus.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li><span class="nobr"><a href="/confluence/pages/createpage.action?spaceKey=FELIX&amp;title=Supported+OSGi+Implementations&amp;linkCreation=true&amp;fromPageId=82824" title="Create Page: Supported OSGi Implementations" class="createlink">Supported OSGi Implementations<sup><img class="rendericon" src="/confluence/images/icons/plus.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li><a href="/confluence/display/FELIX/Future+Ideas" title="Future Ideas">Future Ideas</a></li>
	<li><span class="nobr"><a href="/confluence/pages/createpage.action?spaceKey=FELIX&amp;title=Contact&amp;linkCreation=true&amp;fromPageId=82824" title="Create Page: Contact" class="createlink">Contact<sup><img class="rendericon" src="/confluence/images/icons/plus.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></li>
	<li><a href="/confluence/display/FELIX/Related+Works" title="Related Works">Related Works</a></li>
	<li><a href="/confluence/pages/viewpage.action?pageId=54954" title="Article &amp; Presentations">Article &amp; Presentations</a></li>
</ul>


<hr />
<div class="" align="center">
<p><span class="nobr"><a href="http://cwiki.apache.org/confluence/createrssfeed.action?types=blogpost&amp;statuses=created&amp;statuses=modified&amp;spaces=FELIX&amp;labelString=iPOJO&amp;rssType=atom&amp;maxResults=10&amp;timeSpan=5&amp;publicFeed=true&amp;title=iPOJO+Atom+Feed" title="Stay tuned!" rel="nofollow"><img src="http://cwiki.apache.org/confluence/images/icons/feed-icon-32x32.png" align="absmiddle" border="0" /><sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></p></div></td></tr></tbody></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