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 Tutorial (0.7.3) (page edited)
Date Tue, 14 Aug 2007 15:30: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+Tutorial+%280.7.3%29">iPOJO Tutorial (0.7.3)</a>
        </span>
    </div>

     <p>
        <a href="http://cwiki.apache.org/confluence/display/FELIX/iPOJO+Tutorial+%280.7.3%29">iPOJO Tutorial (0.7.3)</a>
        has been edited by             <a href="http://cwiki.apache.org/confluence/display/~clement.escoffier">Clement Escoffier</a>
            <span class="smallfont">(Aug 14, 2007)</span>.
     </p>
    
     <p>
                 <a href="http://cwiki.apache.org/confluence/pages/diffpagesbyversion.action?pageId=28768&originalVersion=35&revisedVersion=36">(View changes)</a>
     </p>

    <span class="label">Content:</span><br/>
    <div class="greybox wiki-content"><p><em>This page presents how to use the</em> <b><em>iPOJO</em></b> <em>runtime and its associated service component model. The concepts of the service component model are introduced, followed by a simple example that demonstrates the features of iPOJO.</em></p>

<h2><a name="iPOJOTutorial%280.7.3%29-Introduction"></a>Introduction</h2>

<p>iPOJO aims to simplify service-oriented programming on OSGi frameworks; the name iPOJO is an abbreviation for <em>injected POJO</em>. iPOJO provides a new way to develop OSGi service components with the main goal being to simplify service component implementation by transparently managing the dynamics of the environment as well as other non-functional requirements. The iPOJO framework allows developers to more clearly separate functional code (i.e., the POJO) from the non-functional code (i.e., dependecy management, service provision, configuration, etc.). iPOJO combines the functional and non-functional aspects at run time. To achieve this, iPOJO provides a simple and extensible service component model based on POJOs.</p>

<h2><a name="iPOJOTutorial%280.7.3%29-ThePOJOconcept"></a>The POJO concept</h2>

<p>POJO is an acronym for Plain Old Java Object, but it embodies a concept that the simpler and less intrusive the design of a given framework, the better. The name is used to emphasize that a given object is not somehow special, but is an ordinary Java Object. Martin Fowler, Rebecca Parsons and Josh MacKenzie coined the term POJO in September 2000: "We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and it's caught on very nicely." From the developer's perspective, the iPOJO framework strives to only require POJOs in as much as it is possible.</p>

<h2><a name="iPOJOTutorial%280.7.3%29-iPOJOservicecomponentoverview"></a>iPOJO service component overview</h2>

<p>A service component is able to provide and/or require services, where a service is an object that implements a given service interface embodied as a Java interface. Creating components the provide and/or require services comprises the core features of the iPOJO service component model. In addition, iPOJO introduces a callback concept to notify a component about various state changes.</p>

<p>The component is the central concept in iPOJO. In the core IPOJO model, a component describes service dependencies, provided services, and callbacks; this information is recorded in the component's metadata. Then, the second important concept in iPOJO is component instances. A component instances is a special <em>version</em> of the component. By merging component metadata and instance configuration, the iPOJO runtime is able to manage the component, i.e., manage its life cycle, inject required services, publish provided services, discover needed services.</p>

<h2><a name="iPOJOTutorial%280.7.3%29-Asimpleexample"></a>A simple example</h2>

<p>The following is a simple example illustrating how to use the core iPOJO concepts. The example is comprised of two components, one providing a <em>Hello</em> service and one requiring any number of <em>Hello</em> services. The components are packaged into two different bundles using Maven. The <em>Hello</em> service bundle contains the service interface and a component implementing the service. The <em>Hello</em> service consumer bundle contains the consumer component only.</p>

<p>You can download the <span class="nobr"><a href="/confluence/download/attachments/28768/hello.impl-0.0.1-src.zip?version=1" title="hello.impl-0.0.1-src.zip attached to iPOJO Tutorial (0.7.3)">provider<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> and the <span class="nobr"><a href="/confluence/download/attachments/28768/hello.client-0.0.1-src.zip?version=1" title="hello.client-0.0.1-src.zip attached to iPOJO Tutorial (0.7.3)">consumer<sup><img class="rendericon" src="/confluence/images/icons/link_attachment_7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span> projects.</p>

<h3><a name="iPOJOTutorial%280.7.3%29-PreparingMaven"></a>Preparing Maven</h3>

<p>The first step is to download and installMaven; the example was created using Maven 2.0.4. Once Maven is installed, then download and compile Felix trunk (<span class="nobr"><a href="http://cwiki.apache.org/confluence/display/FELIX/Building+Felix" title="Visit page outside Confluence" rel="nofollow">help here<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>). iPOJO is a part of the Felix project, by compiling Felix, you compile iPOJO too.</p>

<p><em>Be aware that Maven outputs a lot of information while it executes and often downloads a lot of required JAR files into its local repository.</em></p>

<h3><a name="iPOJOTutorial%280.7.3%29-HelloServiceProvider"></a>Hello Service Provider</h3>

<p>The first thing to do is to create a skeleton Maven project for the <em>Hello</em> service provider. To do this, type the following command:</p>
<div class="preformatted"><div class="preformattedContent">
<pre>mvn archetype:create -DarchetypeGroupId=org.apache.felix \
     -DarchetypeArtifactId=org.apache.felix.ipojo.plugin -DarchetypeVersion=0.7.3-incubator-SNAPSHOT \
     -DgroupId=ipojo.example -DartifactId=hello.impl \
     -DpackageName=ipojo.example.hello.impl
</pre>
</div></div>
<p>This will create a project directory called "hello.impl" in the current directory. The project directory will contain a "pom.xml" file and a "src" directory. The "pom.xml" is Maven's Project Object Model (POM), used by Maven to describe the project.</p>

<p>Create the file "src/main/java/ipojo/example/hello/Hello.java" for the following <em>Hello</em> service interface:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> ipojo.example.hello;
<span class="code-keyword">public</span> <span class="code-keyword">interface</span> Hello {
/**
   * Return a message like: <span class="code-quote">"Hello $user_name"</span>
   * @param name: the name of the user
   * @<span class="code-keyword">return</span> the hello message
 **/
<span class="code-keyword">public</span> <span class="code-object">String</span> sayHello(<span class="code-object">String</span> name);
}</pre>
</div></div>
<p>The component implementation of the service is a simple Java class implementing the <em>Hello</em>service interface. Create the file "src/main/java/ipojo/example/hello/impl/HelloImpl.java" for the following service implementation:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> ipojo.example.hello.impl;

<span class="code-keyword">import</span> ipojo.example.hello.Hello;

/**
  * Component implementing the Hello service.
 **/
<span class="code-keyword">public</span> class HelloImpl <span class="code-keyword">implements</span> Hello {
    <span class="code-keyword">public</span> <span class="code-object">String</span> sayHello(<span class="code-object">String</span> name) { <span class="code-keyword">return</span> <span class="code-quote">"hello "</span> + name;  }
}</pre>
</div></div>
<p>To manage the component, iPOJO needs some metadata to understand that the component provides the <em>Hello</em>service. Edit the skeleton iPOJO metadata file in "src/main/resources/metadata.xml" to match the following metadata (Note: iPOJO also supports a JAR manifest-based syntax):</p>
<div class="panel"><div class="panelContent">
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br/>
&lt;iPOJO&gt;<br/>
&nbsp;&nbsp;&lt;component className="<font color="red">ipojo.example.hello.impl.HelloImpl</font>"&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;<font color="#ff0000">&lt;provides/&gt;</font><br/>
&nbsp;&nbsp;&lt;/component&gt;<br/>
&nbsp;&nbsp;<font color="red">&lt;instance component="ipojo.example.hello.impl.HelloImpl</font><font color="red">" name="HelloService"/&gt;</font><br/>
&lt;/iPOJO&gt;</p>
</div></div>
<p>The text highlighted in <font color="red"><b>red</b></font> above indicates the information that needs to be edited. In the above XML-based metadata, the <em>component</em> element has a mandatory <em>className</em> attribute. This attribute tells iPOJO the implementation class of the component. Since the component in this example provides a service, the component element also specifies a child <em>provides</em> element. The provides element informs iPOJO that it must manage the publishing of a service. When the provides element does not contain an interface attribute, as is the case in this example, iPOJO will expose all implemented interfaces of the component as a service; it is also possible to specify the precise service interface. The instance element ask iPOJO to create an instance of your component when the component is started.</p>

<p>Finally, edit the skeleton "pom.xml" file in the project directory to reflect the following information about the <em>Hello</em> service provider project:</p>
<div class="panel"><div class="panelContent">
<p>&lt;project&gt;<br/>
&nbsp;&nbsp;&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;<br/>
&nbsp;&lt;packaging&gt;bundle&lt;/packaging&gt;<br/>
&nbsp;&nbsp;&lt;groupId&gt;ipojo.example&lt;/groupId&gt;<br/>
&nbsp;&nbsp;&lt;artifactId&gt;hello.impl&lt;/artifactId&gt;<br/>
&nbsp;&nbsp;<font color="#ff0000">&lt;version&gt;0.0.1&lt;/version&gt;</font><br/>
&nbsp;&nbsp;<font color="#ff0000">&lt;name&gt;Hello Service&lt;/name&gt;</font><br/>
&nbsp;&nbsp;<font color="#ff0000">&lt;pluginRepositories&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&lt;pluginRepository&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&gt;apache.snapshots&lt;/id&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;snapshot plugins&lt;/name&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;url&gt;</font><font color="#ff0000"><span class="nobr"><a href="http://people.apache.org/repo/m2-snapshot-repository/" title="Visit page outside Confluence" rel="nofollow">http://people.apache.org/repo/m2-snapshot-repository/<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></font><font color="#ff0000">&lt;/url&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&lt;/pluginRepository&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&lt;/pluginRepositories&gt;</font><br/>
&nbsp;&nbsp;&lt;build&gt;<br/>
&nbsp;&nbsp; &lt;plugins&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.felix&lt;/groupId&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-bundle-plugin&lt;/artifactId&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;extensions&gt;true&lt;/extensions&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;instructions&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Bundle-SymbolicName&gt;${pom.artifactId}&lt;/Bundle-SymbolicName&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">&lt;Private-Package&gt;ipojo.example.hello.impl&lt;/Private-Package&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Export-Package&gt;ipojo.example.hello&lt;/Export-Package&gt;</font><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/instructions&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.felix&lt;/groupId&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;org.apache.felix.ipojo.plugin&lt;/artifactId&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;executions&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;execution&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;goals&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;goal&gt;ipojo-bundle&lt;/goal&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/goals&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/execution&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/executions&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/plugin&gt;<br/>
&nbsp;&nbsp; &lt;/plugins&gt;<br/>
&nbsp;&lt;/build&gt;<br/>
&lt;/project&gt;&nbsp;</p>
</div></div>
<p>The text highlighted in <font color="red"><b>red</b></font> above indicates the information that needs to be edited in the POM file. The first part of the POM file indicates that the packaging format is an iPOJO bundle and also includes some information about the project (name, groupId, and artifactId). This information is not used by iPOJO, but is used by Maven. The rest of the POM file contains the bundle configuration. In the <em>osgiManifest</em> element, you need to enter the bundle name, the bundle description, and the exported packages. The service provider bundle exports the package of <em>Hello</em> interface.</p>

<p>After the skeleton "pom.xml" file is modified, the project is ready to be built issuing the following Maven command inside the project directory:</p>
<div class="panel"><div class="panelContent">
<p>mvn clean install</p>
</div></div>
<p>Maven should report that the build was a success; if an error was reported then verify the previous steps. Upon success the <em>Hello</em>service component JAR file is installed into the local Maven repository. A copy of the bundle JAR file will also be present in the "target" directory inside the project directory.</p>

<h3><a name="iPOJOTutorial%280.7.3%29-HelloServiceClient"></a>Hello Service Client</h3>

<p>The first thing to do is to create a skeleton Maven project for the <em>Hello</em> service client. To do this, type the following command:</p>
<div class="code"><div class="codeContent">
<pre class="code-java">mvn archetype:create -DarchetypeGroupId=org.apache.felix \
 -DarchetypeArtifactId=org.apache.felix.ipojo.plugin -DarchetypeVersion=0.7.3-incubator-SNAPSHOT \
 -DgroupId=ipojo.example -DartifactId=hello.client \
 -DpackageName=ipojo.example.hello.client</pre>
</div></div>
<p>This will create a project directory called "hello.client" in the current directory. The project directory will contain a "pom.xml" file and a "src" directory.</p>

<p>Create the file "src/main/java/ipojo/example/hello/client/HelloClient.java" for the following <em>Hello</em> service client:</p>
<div class="code"><div class="codeContent">
<pre class="code-java"><span class="code-keyword">package</span> ipojo.example.hello.client;

<span class="code-keyword">import</span> ipojo.example.hello.Hello;

<span class="code-keyword">public</span> class HelloClient <span class="code-keyword">implements</span> <span class="code-object">Runnable</span> {

<span class="code-keyword">private</span> Hello[] m_hello; <span class="code-comment">// Service Dependency
</span><span class="code-keyword">private</span> <span class="code-keyword">final</span> <span class="code-keyword">static</span> <span class="code-object">int</span> DELAY=10000;
<span class="code-keyword">private</span> <span class="code-object">boolean</span> end;

 <span class="code-keyword">public</span> void run() {
    <span class="code-keyword">while</span> (!end) {
               <span class="code-keyword">try</span> {
				invokeHelloServices();
                <span class="code-object">Thread</span>.sleep(DELAY);
              } <span class="code-keyword">catch</span> (InterruptedException ie) { }
              /* will recheck end */
     }
}

 <span class="code-keyword">public</span> void invokeHelloServices() {
	<span class="code-keyword">for</span> (<span class="code-object">int</span> i = 0; i &lt; m_hello.length; i++) { <span class="code-object">System</span>.out.println(m_hello[i].sayHello(<span class="code-quote">"Clement"</span>)); }
 }

 <span class="code-keyword">public</span> void starting() {    <span class="code-object">Thread</span> T = <span class="code-keyword">new</span> <span class="code-object">Thread</span>(<span class="code-keyword">this</span>);     end = <span class="code-keyword">false</span>;     T.start();   }
 <span class="code-keyword">public</span> void stopping() {    end = <span class="code-keyword">true</span>;   }
}</pre>
</div></div>
<p>The <em>Hello</em> service client creates a thread that periodically invokes the available <em>Hello</em> services. The thread starts when at least one <em>Hello</em> service provider is present using iPOJO's call back mechanism. In the client code, to use the <em>hello</em> the component implementation simply declares a field of the type of the service and then simply uses it directly in its code. In this example, it is the m_hello field is declared as the service field; notice that the field is an array of <em>Hello</em>. In iPOJO an array of services represents an aggregate or multiple cardinality dependency, whereas if a scalar value represents a singular or unary cardinality dependency. In other words, for a singular dependency simply remove the array brackets from the example (e.g., HelloService m_hello[]. After declaring a field for the service, the rest of the component code can simply assume that the service field will be initialized, e.g., m_hello[i].sayHello("Clement").</p>

<p>Notive that iPOJO managew service synchronisation too. So, the service invocations does not require synchronization blocks.</p>

<p>The component provides two callback methods for its activation and deactivation, starting() and stopping(), respectively. Callbacks are used when the component needs to be informed about a component state change. In iPOJO, the component state is either <b>INVALID</b> (i.e., not all of the component's constraints are satisfied) or <b>VALID</b> (i.e., all of the component's constraints are satisfied). In this example, the starting() callback method creates and starts a thread; the stopping()callback method stops the thread. The component metadata will instruct iPOJO to invoke these methods when the component's state changes to <b>VALID</b> or <b>INVALID</b> respectively.</p>

<p>Edit the skeleton iPOJO metadata file in "src/main/resource/metadata.xml" to match the following metadata:</p>
<div class="panel"><div class="panelContent">
<p>&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br/>
 &lt;iPOJO&gt;<br/>
 &nbsp;&nbsp;&lt;component className="<font color="#ff0000">ipojo.example.hello.client.HelloClient</font>"&gt;<br/>
<font color="red">&nbsp;&nbsp;&nbsp;&nbsp;&lt;requires field="m_hello"/&gt;</font><br/>
<font color="red">&nbsp;&nbsp;&nbsp;&nbsp;&lt;callback transition="validate" method="starting"/&gt;</font><br/>
<font color="#000000">&nbsp;&nbsp; &nbsp;</font><font color="#ff0000">&lt;callback transition="invalidate" method="stopping"/&gt;</font><br/>
 &nbsp;&nbsp;&lt;/component&gt;<br/>
<font color="red">&nbsp; &lt;instance component="ipojo.example.hello.client.HelloClient" name="HelloClient"/&gt;</font><br/>
 &lt;/iPOJO&gt;</p>
</div></div>
<p>The text highlighted in <font color="red"><b>red</b></font> above indicates the information that needs to be edited. The component element again has the <em>className</em> attribute that refers to the component implementation class. The dependency element describes the <em>Hello</em> service dependency by simply specifying its associated component field. The callback elements describe which method to invoke when the component's state changes from the specified initial state to the specified final state, one for each call back method. Then the instance element ask iPOJO to create an instance of the component.</p>

<p>Finally, edit the skeleton "pom.xml" file in the project directory to reflect the following information about the <em>Hello</em> service client project:</p>
<div class="panel"><div class="panelContent">
<p>&lt;project&gt;<br/>
 &nbsp;&nbsp;&lt;modelVersion&gt;4.0.0&lt;/modelVersion&gt;<br/>
 &nbsp;&nbsp;&lt;packaging&gt;bundle&lt;/packaging&gt;<br/>
 &nbsp;&nbsp;&lt;groupId&gt;<font color="#ff0000">ipojo.example</font>&lt;/groupId&gt;<br/>
 &nbsp;&nbsp;&lt;artifactId&gt;ipojo.example.hello.client&lt;/artifactId&gt;<br/>
 &nbsp;&nbsp;&lt;version&gt;<font color="#ff0000">0.0.1</font>&lt;/version&gt;<br/>
 &nbsp;&nbsp;&lt;name&gt;<font color="#ff0000">Hello Client</font>&lt;/name&gt;<br/>
<font color="red">&nbsp;&nbsp;&lt;dependencies&gt;</font><br/>
<font color="red">&nbsp;&nbsp; &nbsp;&lt;dependency&gt;</font><br/>
<font color="red">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;groupId&gt;ipojo.example&lt;/groupId&gt;</font><br/>
<font color="red">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;artifactId&gt;hello.impl&lt;/artifactId&gt;</font><br/>
<font color="red">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;version&gt;0.0.1&lt;/version&gt;</font><br/>
<font color="red">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&lt;scope&gt;provided&lt;/scope&gt;</font><br/>
<font color="red">&nbsp;&nbsp; &nbsp;&lt;/dependency&gt;</font><br/>
<font color="red">&nbsp; &lt;/dependencies&gt;</font><br/>
&nbsp; <font color="#ff0000">&lt;pluginRepositories&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp; &lt;pluginRepository&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;id&gt;apache.snapshots&lt;/id&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;name&gt;snapshot plugins&lt;/name&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;url&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font> <font color="#ff0000"><span class="nobr"><a href="http://people.apache.org/repo/m2-snapshot-repository/" title="Visit page outside Confluence" rel="nofollow">http://people.apache.org/repo/m2-snapshot-repository/<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span></font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/url&gt;</font><br/>
<font color="#ff0000">&nbsp;&nbsp;&nbsp; &lt;/pluginRepository&gt;</font><br/>
<font color="#ff0000">&nbsp; &lt;/pluginRepositories</font>&gt;<br/>
 &nbsp; &lt;build&gt;<br/>
 &nbsp;&nbsp;&nbsp;&nbsp; &lt;plugins&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;plugin&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.felix&lt;/groupId&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;maven-bundle-plugin&lt;/artifactId&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;extensions&gt;true&lt;/extensions&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;configuration&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;instructions&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Bundle-SymbolicName&gt;${pom.artifactId}&lt;/Bundle-SymbolicName&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <font color="#ff0000">&lt;Private-Package&gt;ipojo.example.hello.client&lt;/Private-Package&gt;</font><br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Import-Package&gt;*&lt;/Import-Package&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/instructions&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/configuration&gt;<br/>
&nbsp;&nbsp; &lt;/plugin&gt;<br/>
&nbsp;&nbsp; &lt;plugin&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;groupId&gt;org.apache.felix&lt;/groupId&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;artifactId&gt;org.apache.felix.ipojo.plugin&lt;/artifactId&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;executions&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;execution&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;goals&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;goal&gt;ipojo-bundle&lt;/goal&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/goals&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/execution&gt;<br/>
&nbsp;&nbsp;&nbsp;&nbsp; &lt;/executions&gt;<br/>
&nbsp;&nbsp; &lt;/plugin&gt;<br/>
&nbsp;&lt;/plugins&gt;<br/>
&nbsp; &lt;/build&gt;<br/>
&lt;/project&gt;</p>
</div></div>
<p>The text highlighted in <font color="red"><b>red</b></font> above indicates the information that needs to be edited. The <em>dependencies</em> element tells Maven that the client bundle has a compilation dependency on the service provider bundle. In this case, the client bundle needs the <em>Hello</em> service interface to compile. After building the service provider bundle JAR file, Maven installs it into a local repository on your machine. To resolve compilation dependencies, Maven looks in the local repository to find required JAR files.</p>

<p>After the skeleton "pom.xml" file is modified, the project is ready to be built issuing the following Maven command inside the project directory:</p>
<div class="panel"><div class="panelContent">
<p>mvn clean install</p>
</div></div>
<p>Maven should report that the build was a success; if an error was reported then verify the previous steps. Upon success the <em>Hello</em>service component JAR file is installed into the local Maven repository. A copy of the bundle JAR file will also be present in the "target" directory inside the project directory.</p>

<h3><a name="iPOJOTutorial%280.7.3%29-Runningtheexample"></a>Running the example</h3>

<p>To run the example, start Felix:</p>
<div class="panel"><div class="panelContent">
<p>java &#45;jar bin/felix.jar</p>
</div></div>
<p>At the Felix command shell prompt, install the iPOJO runtime bundle. You can download the iPOJO runtime bundle on (take the last version) : <span class="nobr"><a href="http://people.apache.org/maven-snapshot-repository/org/apache/felix/org.apache.felix.ipojo/0.7.3-incubator-SNAPSHOT/" title="Visit page outside Confluence" rel="nofollow">http://people.apache.org/maven-snapshot-repository/org/apache/felix/org.apache.felix.ipojo/0.7.3-incubator-SNAPSHOT/<sup><img class="rendericon" src="/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"/></sup></a></span>.</p>

<p><ins>Note :</ins> If you have compile the Felix trunk, you can install iPOJO from your local maven repository&nbsp; too : $mvn_repo/org/apache/felix/org.apache.felix.ipojo/0.7.3-incubator-SNAPSHOT/org.apache.felix.ipojo-0.7.3-incubator-SNAPSHOT.jar</p>
<div class="preformatted"><div class="preformattedContent">
<pre>install file:/&lt;ipojo-directory&gt;/org.apache.felix.ipojo-0.7.3-incubator-SNAPSHOT.jar
</pre>
</div></div>
<p>Install both the <em>Hello</em> service provider and client bundles that were created above:</p>
<div class="preformatted"><div class="preformattedContent">
<pre>start file:/&lt;hello-service-project-directory&gt;/target/hello.impl-0.0.1.jar
start file:/&lt;hello-client-project-directory&gt;/target/hello.client-0.0.1.jar
</pre>
</div></div>
<p>Start the client bundle. Start the <em>Hello</em> service provider bundle and the client component will automatically be activated. Stop the provider and the client will automatically be deactivated since its dependency is no longer valid. If multiple Hello services are deployed, the client will connect to all of them.</p>

<p><em>Note</em>: if you compile iPOJO and projects, with Maven you can directly use the following script :</p>
<div class="preformatted"><div class="preformattedContent">
<pre>cd file:/&lt;your-local-maven-repository&gt;
start org\apache\felix\org.apache.felix.ipojo\0.7.3-SNAPSHOT\org.apache.felix.ipojo-0.7.3-SNAPSHOT.jar
start ipojo\example\hello.impl\0.0.1\hello.impl-0.0.1.jar
start ipojo\example\hello.client\0.0.1\hello.client-0.0.1.jar
</pre>
</div></div>

<h2><a name="iPOJOTutorial%280.7.3%29-Conclusion"></a>Conclusion</h2>

<p>We saw how to use easily <b>iPOJO</b> to build service-oriented component. If you have questions or remarks, feel free to send me an email at : <span class="nobr"><a href="mailto:clement.escoffier@imag.fr" title="Send mail to clement.escoffier@imag.fr" rel="nofollow">clement.escoffier@imag.fr<sup><img class="rendericon" src="/confluence/images/icons/mail_small.gif" height="12" width="13" align="absmiddle" alt="" border="0"/></sup></a></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