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 Tue, 07 Aug 2007 08:11: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">(Aug 07, 2007)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=63270&originalVersion=1&revisedVersion=2">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><p>This tutorial presented some iPOJO features. It 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 creating instance for a component not contained in the same bundle</li>
	<li>How configuring instances</li>
</ul>


<p>The sources of this tutorial is available <span class="nobr"><a href="/confluence/download/attachments/63270/vendor.zip?version=1" title="vendor.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 tutorial used the <a href="/confluence/display/FELIX/iPOJO+Eclipse+Plug-in" title="iPOJO Eclipse Plug-in">iPOJO Eclipse plugin</a>.</p>

<h1><a name="iPOJOAdvancedTutorial-Context"></a>Context</h1>
<p>This tutorial uses a very simple application. Customers use a Vendor service to buy hot dog or pop corn according to the availability of these two providers. Both the pop corn vendor and the hot dog vendor implement (and provide) the vendor service. The hot dog vendor depends on two other services for getting ingredient. It depends on a bun service and a wiener service.</p>

<p><img src="/confluence/download/attachments/63270/vendor.png" align="absmiddle" border="0" /></p>

<h1><a name="iPOJOAdvancedTutorial-Writingacomponentprovidingtwoservices"></a>Writing a component providing two services</h1>
<p>The hot dog vendor requires at the same time the bun service and the wiener service. In our application these two services are provided by one component. This component can be implemented as following:</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. Then, the descriptor of this component 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>First, we declare a component type for our component. The component type contains the implementation class. The attribute "classname" contains simply the qualified name of the component implementation. The "name" attribute is the component type name. It is only used to refer to this type.<br/>
The attribute "factory=false" allows avoiding factory exposition. A component type publishing a factory provides a way to create instance of this type from outside this descriptor. In our case, when want to guaranty that only one instance will be created.</p>

<p>The "&lt;provides/&gt;" element means that the component provide services. IPOJO will manage automatically service publication and providing at runtime. If not describes, iPOJO publish all implemented interfaces by the implementation class. In our case, it will publish the BunService and WienerService interfaces.<br/>
Finally, we create on 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. This instance provides the BunService and the WienerService.</p>

<h1><a name="iPOJOAdvancedTutorial-Publishingaserviceproperty"></a>Publishing a service property</h1>

<p>The hot dog vendor just provides the Vendor service. To provide this service, it used a bun service and a wiener service. The following code snippet 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> VendorService {
    
    <span class="code-keyword">private</span> BunService bunProvider;
    <span class="code-keyword">private</span> WienerService wienerProvider;
    
    <span class="code-keyword">public</span> <span class="code-object">String</span> getName() {
        <span class="code-keyword">return</span> <span class="code-quote">"The Best Hot Dogs"</span>;
    }

    <span class="code-keyword">public</span> <span class="code-object">String</span> sell() {
        bunProvider.getBun();
        wienerProvider.getWiener();
        <span class="code-keyword">return</span> <span class="code-quote">"sell an hotdog"</span>;
    }
}</pre>
</div></div>

<p>The two fields are used to inject the two 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 field as other field (as illustrated in the sell method).<br/>
The metadata of this type are very simple: </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.hotdog.HotDogVendor"</span> name=<span class="code-quote">"HD"</span> factory=<span class="code-quote">"<span class="code-keyword">false</span>"</span>&gt;
	&lt;provides/&gt;
	&lt;requires field=<span class="code-quote">"bunProvider"</span>/&gt;
	&lt;requires field=<span class="code-quote">"wienerProvider"</span>/&gt;
&lt;/component&gt;

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

<p>The component type declares a provided service (the Vendor Service). Then, the component declares the two service dependencies. However, we would like to add a service property on the Vendor service describing the sale product (here hotdog). To achieve this, we just need to add a property element in the "provides" tags as following: </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.hotdog.HotDogVendor"</span> name=<span class="code-quote">"HD"</span> factory=<span class="code-quote">"<span class="code-keyword">false</span>"</span>&gt;
	&lt;provides&gt;
		&lt;property name=<span class="code-quote">"product"</span> type=<span class="code-quote">"string"</span> value=<span class="code-quote">"hotdog"</span>/&gt;
	&lt;/provides&gt;
	&lt;requires field=<span class="code-quote">"bunProvider"</span>/&gt;
	&lt;requires field=<span class="code-quote">"wienerProvider"</span>/&gt;
&lt;/component&gt;

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

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

<h1><a name="iPOJOAdvancedTutorial-Publishinga%27dynamic%27property"></a>Publishing a 'dynamic' property</h1>

<p>The bun service and the wiener service can expose service properties too. These service properties describe the stock of the ingredient. At each time the service is used, the property is decreased.</p>

<p>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 BunProvider <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> void getBun() {
        bunStock = bunStock - 1;
    }

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

<p>Then the component type metadata must describe this property :</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.BunProvider"</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;property name=<span class="code-quote">"buns"</span> field=<span class="code-quote">"bunStock"</span> value=<span class="code-quote">"10"</span>/&gt;
		&lt;property name=<span class="code-quote">"wieners"</span> field=<span class="code-quote">"wienerStock"</span> va	lue=<span class="code-quote">"10"</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 "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 at each time the fields are modified, the service property is updated (and the OSGi™ service registration is updated). </p>

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

<p>In the previous example, the properties were configured in the component type description. It is possible to customized value in the instance declaration. Then, each instance can obtain different values.</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.BunProvider"</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;property name=<span class="code-quote">"buns"</span> field=<span class="code-quote">"bunStock"</span> value=<span class="code-quote">"10"</span>/&gt;
		&lt;property name=<span class="code-quote">"wieners"</span> field=<span class="code-quote">"wienerStock"</span> va	lue=<span class="code-quote">"10"</span>/&gt;
	&lt;/provides&gt;
&lt;/component&gt;

&lt;instance component=<span class="code-quote">"buns_and_wieners"</span>&gt;
	&lt;property name=<span class="code-quote">"buns"</span> value=<span class="code-quote">"9"</span>/&gt;
	&lt;property name=<span class="code-quote">"wieners"</span> value=<span class="code-quote">"8"</span>/&gt;
&lt;/instance&gt;
&lt;/ipojo&gt;</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 must provide a value for this unvalued property. </p>

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

<p>Now that bun and wiener provider publishes its 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 simply must describe an LDAP filter in the service dependency description. The following xml snipped shows this metadata:</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.hotdog.HotDogVendor"</span> name=<span class="code-quote">"HD"</span> factory=<span class="code-quote">"<span class="code-keyword">false</span>"</span>&gt;
	&lt;provides&gt;
		&lt;property name=<span class="code-quote">"product"</span> type=<span class="code-quote">"string"</span> value=<span class="code-quote">"hotdog"</span>/&gt;
	&lt;/provides&gt;
	&lt;requires field=<span class="code-quote">"bunProvider"</span> filter=<span class="code-quote">"(buns&gt;=1)"</span>/&gt;
	&lt;requires field=<span class="code-quote">"wienerProvider"</span> filter=<span class="code-quote">"(wieners&gt;=1)"</span>/&gt;
&lt;/component&gt;

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

<p>When a used provider does no more matches with the LDAP filter, the provider is no more used, and another (matching with the filter) is looked. 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, provided services are withdraw from the service registry. </p>

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

<p>Now that we get the hot dog provider, we are going to implement customers. 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, sell method is called in a constructor. The constructor is called only if an object of the class is created. With iPOJO there is two different way to "activate" an instance as soon it becomes valid. The first one use lifecycle callback (describe 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 it becomes valid. </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.customer.Customer"</span> factory=<span class="code-quote">"customer"</span> immediate=<span class="code-quote">"<span class="code-keyword">true</span>"</span>&gt;
	&lt;requires field=<span class="code-quote">"vendor"</span>/&gt;
	&lt;properties&gt;
		&lt;property field=<span class="code-quote">"name"</span>/&gt;
	&lt;/properties&gt;
&lt;/component&gt;
&lt;instance component=<span class="code-quote">"customer"</span>&gt;
	&lt;property name=<span class="code-quote">"name"</span> value=<span class="code-quote">"my_customer"</span>/&gt;
&lt;/instance&gt;
&lt;/ipojo&gt;</pre>
</div></div>

<p>To declare a component immediate, just write "immediate=true". Then as soon as the vendor service is available, it creates the object. </p>

<p><em>Note:</em> There is a difference beetween immedaite componenet and component with a 'validate' lifecycle callback. Indeed, the callback is call at each time the instance becomes valid. IT call the constructor only if no object already exist. On the other side, the immediate component called the constructor only once time.</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. This component type does not have the "factory=false" attribute. This allows another descriptor to use this type. This feature allows deploying separately implementation from instance creation.<br/>
So another metadata file can declare instances from the customer types. This descriptor is contained in another bundle. The following descriptor creates 10 customer instances:</p>

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

<p>When deployed this bundle looks for the required factory. If not available it waits for it apparition. When this bundle is stopped, all instances are destroyed. </p>

<h1><a name="iPOJOAdvancedTutorial-Conclusion"></a>Conclusion</h1>

<p>This small tutorial has presented some iPOJO features. If you have comments or questions, do not hesitate to send me an email to <span class="error">&#91;clement.escoffier@gmail.com&#93;</span>.</p></div>


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

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

</div>

</body>
</html>


Mime
View raw message