blob: 810015cf6ee463f7dc36cc3524e4ffddeb349665 [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="SMILA/Documentation/Declarative Services" />
<link rel="shortcut icon" href="http://wiki.eclipse.org/SMILA/Documentation/favicon.ico" />
<link rel="search" type="application/opensearchdescription+xml" href="http://wiki.eclipse.org/opensearch_desc.php" title="Eclipsepedia (English)" />
<link rel="alternate" type="application/rss+xml" title="Eclipsepedia RSS Feed" href="http://wiki.eclipse.org/index.php?title=Special:Recentchanges&amp;feed=rss" />
<link rel="alternate" type="application/atom+xml" title="Eclipsepedia Atom Feed" href="http://wiki.eclipse.org/index.php?title=Special:Recentchanges&amp;feed=atom" />
<title>SMILA/Documentation/Declarative Services - Eclipsepedia</title>
<style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "http://wiki.eclipse.org/skins/eclipsenova/novaWide.css?116"; /*]]>*/</style>
<link rel="stylesheet" type="text/css" media="print" href="http://wiki.eclipse.org/skins/eclipsenova/eclipsenovaPrint.css?116" />
<link rel="stylesheet" type="text/css" media="handheld" href="http://wiki.eclipse.org/skins/eclipsenova/handheld.css?116" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/header.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/tabs.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/visual.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/layout.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/footer.css" media="screen" />
<!--[if IE]><link rel="stylesheet" type="text/css" href="/skins/eclipsenova/IEpngfix.css" media="screen" /><![endif]-->
<!--[if lt IE 5.5000]><style type="text/css">@import "/skins/eclipsenova/IE50Fixes.css?116";</style> <![endif]-->
<!--[if IE 5.5000]><style type="text/css">@import "/skins/eclipsenova/IE55Fixes.css?116";</style><![endif]-->
<!--[if IE 6]><style type="text/css">@import "/skins/eclipsenova/IE60Fixes.css?116";</style><![endif]-->
<!--[if IE 7]><style type="text/css">@import "/skins/eclipsenova/IE70Fixes.css?116";</style><![endif]-->
<!--[if lt IE 7]><script type="text/javascript" src="/skins/common/IEFixes.js?116"></script>
<meta http-equiv="imagetoolbar" content="no" /><![endif]-->
<script type= "text/javascript">/*<![CDATA[*/
var skin = "eclipsenova";
var stylepath = "/skins";
var wgArticlePath = "/$1";
var wgScriptPath = "";
var wgScript = "/index.php";
var wgServer = "http://wiki.eclipse.org";
var wgCanonicalNamespace = "";
var wgCanonicalSpecialPageName = false;
var wgNamespaceNumber = 0;
var wgPageName = "SMILA/Documentation/Declarative_Services";
var wgTitle = "SMILA/Documentation/Declarative Services";
var wgAction = "view";
var wgRestrictionEdit = [];
var wgRestrictionMove = [];
var wgArticleId = "15198";
var wgIsArticle = true;
var wgUserName = null;
var wgUserGroups = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
var wgBreakFrames = false;
var wgCurRevisionId = "286147";
var wgVersion = "1.12.0";
var wgEnableAPI = true;
var wgEnableWriteAPI = false;
/*]]>*/</script>
<script type="text/javascript" src="http://wiki.eclipse.org/skins/common/wikibits.js?116"><!-- wikibits js --></script>
<!-- Performance mods similar to those for bug 166401 -->
<script type="text/javascript" src="http://wiki.eclipse.org/index.php?title=-&amp;action=raw&amp;gen=js&amp;useskin=eclipsenova"><!-- site js --></script>
<!-- Head Scripts -->
<script type="text/javascript" src="http://wiki.eclipse.org/skins/common/ajax.js?116"></script>
<style type="text/css">/*<![CDATA[*/
.source-java {line-height: normal; font-size: medium;}
.source-java li {line-height: normal;}
/**
* GeSHi Dynamically Generated Stylesheet
* --------------------------------------
* Dynamically generated stylesheet for java
* CSS class: source-java, CSS id:
* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter)
*/
.source-java .de1, .source-java .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.source-java {}
.source-java .head {}
.source-java .foot {}
.source-java .imp {font-weight: bold; color: red;}
.source-java .ln-xtra {color: #cc0; background-color: #ffc;}
.source-java li {font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;}
.source-java li.li2 {font-weight: bold;}
.source-java .kw1 {color: #7F0055; font-weight: bold;}
.source-java .kw2 {color: #7F0055; font-weight: bold;}
.source-java .kw3 {color: #000000; font-weight: normal}
.source-java .kw4 {color: #7F0055; font-weight: bold;}
.source-java .co1 {color: #3F7F5F; font-style: italic;}
.source-java .co2 {color: #3F7F5F;}
.source-java .co3 {color: #3F7F5F; font-style: italic; font-weight: bold;}
.source-java .coMULTI {color: #3F5FBF; font-style: italic;}
.source-java .es0 {color: #000000;}
.source-java .br0 {color: #000000;}
.source-java .st0 {color: #2A00ff;}
.source-java .nu0 {color: #000000;}
.source-java .me1 {color: #000000;}
.source-java .me2 {color: #000000;}
/*]]>*/
</style>
<style type="text/css">/*<![CDATA[*/
@import "http://wiki.eclipse.org/index.php?title=MediaWiki:Geshi.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
/*]]>*/
</style><style type="text/css">/*<![CDATA[*/
.source-xml {line-height: normal; font-size: medium;}
.source-xml li {line-height: normal;}
/**
* GeSHi Dynamically Generated Stylesheet
* --------------------------------------
* Dynamically generated stylesheet for xml
* CSS class: source-xml, CSS id:
* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter)
*/
.source-xml .de1, .source-xml .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.source-xml {}
.source-xml .head {}
.source-xml .foot {}
.source-xml .imp {font-weight: bold; color: red;}
.source-xml .ln-xtra {color: #cc0; background-color: #ffc;}
.source-xml li {font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;}
.source-xml li.li2 {font-weight: bold;}
.source-xml .coMULTI {color: #808080; font-style: italic;}
.source-xml .es0 {color: #000099; font-weight: bold;}
.source-xml .br0 {color: #66cc66;}
.source-xml .st0 {color: #ff0000;}
.source-xml .nu0 {color: #cc66cc;}
.source-xml .sc0 {color: #00bbdd;}
.source-xml .sc1 {color: #ddbb00;}
.source-xml .sc2 {color: #339933;}
.source-xml .sc3 {color: #009900;}
.source-xml .re0 {color: #000066;}
.source-xml .re1 {font-weight: bold; color: black;}
.source-xml .re2 {font-weight: bold; color: black;}
/*]]>*/
</style>
<style type="text/css">/*<![CDATA[*/
@import "http://wiki.eclipse.org/index.php?title=MediaWiki:Geshi.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
/*]]>*/
</style><link rel="stylesheet" type="text/css" href="Declarative_Services.html" /> </head>
<body class="mediawiki ns-0 ltr page-SMILA_Documentation_Declarative_Services">
<div id="globalWrapper">
<div id="column-one">
<!-- Eclipse Additions for the Top Nav start here M. Ward-->
<div id="header">
<div id="header-graphic">
<img src="http://wiki.eclipse.org/skins/eclipsenova/eclipse.png" alt="Eclipse Wiki">
</div>
<!-- Pulled 101409 Mward -->
<div class="portlet" id="p-personal">
<div class="pBody">
<ul>
<li id="pt-login"><a href="http://wiki.eclipse.org/index.php?title=Special:Userlogin&amp;returnto=SMILA/Documentation/Declarative_Services">Log in</a></li>
</ul>
</div>
</div>
<div id="header-icons">
<div id="sites">
<ul id="sitesUL">
<li><a href="http://www.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/eclipseIcon.png" width="28" height="28" alt="Eclipse Foundation" title="Eclipse Foundation" /><div>Eclipse Foundation</div></a></li>
<li><a href="http://marketplace.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/marketplace.png" width="28" height="28" alt="Eclipse Marketplace" title="Eclipse Marketplace" /><div>Eclipse Marketplace</div></a></li>
<li><a href="https://bugs.eclipse.org/bugs"><img src="http://dev.eclipse.org/custom_icons/system-search-bw.png" width="28" height="28" alt="Bugzilla" title="Bugzilla" /><div>Bugzilla</div></a></li>
<li><a href="http://live.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/audio-input-microphone-bw.png" width="28" height="28" alt="Live" title="Live" /><div>Eclipse Live</div></a></li>
<li><a href="http://planeteclipse.org"><img src="http://dev.eclipse.org/large_icons/devices/audio-card.png" width="28" height="28" alt="PlanetEclipse" title="Planet" /><div>Planet Eclipse</div></a></li>
<li><a href="http://portal.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/preferences-system-network-proxy-bw.png" width="28" height="28" alt="Portal" title="Portal" /><div>My Foundation Portal</div></a></li>
</ul>
</div>
</div>
</div>
<!-- NEW HEADER STUFF HERE -->
<div id="header-menu">
<div id="header-nav">
<ul> <li><a class="first_one" href="http://wiki.eclipse.org/" target="_self">Home</a></li> <li><a href="http://www.eclipse.org/downloads/" target="_self">Downloads</a></li>
<li><a href="http://www.eclipse.org/users/" target="_self">Users</a></li>
<li><a href="http://www.eclipse.org/membership/" target="_self">Members</a></li>
<li><a href="http://wiki.eclipse.org/index.php/Development_Resources" target="_self">Committers</a></li>
<li><a href="http://www.eclipse.org/resources/" target="_self">Resources</a></li>
<li><a href="http://www.eclipse.org/projects/" target="_self">Projects</a></li>
<li><a href="http://www.eclipse.org/org/" target="_self">About Us</a></li>
</ul>
</div>
<div id="header-utils">
<!-- moved the search window here -->
<form action="http://wiki.eclipse.org/Special:Search" >
<input class="input" name="search" type="text" accesskey="f" value="" />
<input type='submit' onclick="this.submit();" name="go" id="searchGoButton" class="button" title="Go to a page with this exact name if one exists" value="Go" />&nbsp;
<input type='submit' onclick="this.submit();" name="fulltext" class="button" id="mw-searchButton" title="Search Eclipsepedia for this text" value="Search" />
</form>
</div>
</div>
<!-- Eclipse Additions for the Header stop here -->
<!-- Additions and mods for leftside nav Start here -->
<!--Started nav rip here-->
<!-- these are the nav controls main page, changes etc -->
<div id="novaContent" class="faux">
<div id="leftcol">
<ul id="leftnav">
<!-- these are the page controls, edit history etc -->
<li class="separator"><a class="separator">Navigation &#160;&#160;</li>
<li id="n-mainpage"><a href="http://wiki.eclipse.org/Main_Page">Main Page</a></li>
<li id="n-portal"><a href="http://wiki.eclipse.org/Eclipsepedia:Community_Portal">Community portal</a></li>
<li id="n-currentevents"><a href="http://wiki.eclipse.org/Eclipsepedia:Current_events">Current events</a></li>
<li id="n-recentchanges"><a href="http://wiki.eclipse.org/Special:Recentchanges">Recent changes</a></li>
<li id="n-randompage"><a href="http://wiki.eclipse.org/Special:Random">Random page</a></li>
<li id="n-help"><a href="http://wiki.eclipse.org/Help:Contents">Help</a></li>
<li class="separator"><a class="separator">Toolbox &#160;&#160;</a></li>
<li id="t-whatlinkshere"><a href="http://wiki.eclipse.org/Special:Whatlinkshere/SMILA/Documentation/Declarative_Services">What links here</a></li>
<li id="t-recentchangeslinked"><a href="http://wiki.eclipse.org/Special:Recentchangeslinked/SMILA/Documentation/Declarative_Services">Related changes</a></li>
<!-- This is the toolbox section -->
<li id="t-upload"><a href="http://wiki.eclipse.org/Special:Upload">Upload file</a></li>
<li id="t-specialpages"><a href="http://wiki.eclipse.org/Special:Specialpages">Special pages</a></li>
<li id="t-print"><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Declarative_Services&amp;printable=yes">Printable version</a></li> <li id="t-permalink"><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Declarative_Services&amp;oldid=286147">Permanent link</a></li> </ul>
</div>
<!-- Additions and mods for leftside nav End here -->
<div id="column-content">
<div id="content">
<a name="top" id="top"></a>
<div id="tabs">
<ul class="primary">
<li class="active"><a href="Declarative_Services.html"><span class="tab">Page</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=Talk:SMILA/Documentation/Declarative_Services&amp;action=edit"><span class="tab">Discussion</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Declarative_Services&amp;action=edit"><span class="tab">View source</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Declarative_Services&amp;action=history"><span class="tab">History</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=Special:Userlogin&amp;returnto=SMILA/Documentation/Declarative&#32;Services"><span class="tab">Edit</span></a></li>
</ul>
</div>
<script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
<h1 class="firstHeading">SMILA/Documentation/Declarative Services</h1>
<div id="bodyContent">
<h3 id="siteSub">From Eclipsepedia</h3>
<div id="contentSub"><span class="subpages">&lt; <a href="../../SMILA.html" title="SMILA">SMILA</a> | <a href="../Documentation.1.html" title="SMILA/Documentation">Documentation</a></span></div>
<div id="jump-to-nav">Jump to: <a href="Declarative_Services.html#column-one">navigation</a>, <a href="Declarative_Services.html#searchInput">search</a></div> <!-- start content -->
<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="Declarative_Services.html#Overview"><span class="tocnumber">1</span> <span class="toctext">Overview</span></a></li>
<li class="toclevel-1"><a href="Declarative_Services.html#Service_Component_Runtime"><span class="tocnumber">2</span> <span class="toctext">Service Component Runtime</span></a></li>
<li class="toclevel-1"><a href="Declarative_Services.html#Component-Class"><span class="tocnumber">3</span> <span class="toctext">Component-Class</span></a></li>
<li class="toclevel-1"><a href="Declarative_Services.html#Component-Description"><span class="tocnumber">4</span> <span class="toctext">Component-Description</span></a></li>
<li class="toclevel-1"><a href="Declarative_Services.html#Provide_services"><span class="tocnumber">5</span> <span class="toctext">Provide services</span></a></li>
<li class="toclevel-1"><a href="Declarative_Services.html#Use_Services"><span class="tocnumber">6</span> <span class="toctext">Use Services</span></a>
<ul>
<li class="toclevel-2"><a href="Declarative_Services.html#Event-Strategy"><span class="tocnumber">6.1</span> <span class="toctext">Event-Strategy</span></a>
<ul>
<li class="toclevel-3"><a href="Declarative_Services.html#Sample_Event-Strategy"><span class="tocnumber">6.1.1</span> <span class="toctext">Sample Event-Strategy</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="Declarative_Services.html#Lookup-Strategy"><span class="tocnumber">6.2</span> <span class="toctext">Lookup-Strategy</span></a>
<ul>
<li class="toclevel-3"><a href="Declarative_Services.html#Sample_Lookup-Strategy"><span class="tocnumber">6.2.1</span> <span class="toctext">Sample Lookup-Strategy</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-1"><a href="Declarative_Services.html#Cardinality_of_a_reference"><span class="tocnumber">7</span> <span class="toctext">Cardinality of a reference</span></a>
<ul>
<li class="toclevel-2"><a href="Declarative_Services.html#Optionality"><span class="tocnumber">7.1</span> <span class="toctext">Optionality</span></a></li>
<li class="toclevel-2"><a href="Declarative_Services.html#Multiplicity"><span class="tocnumber">7.2</span> <span class="toctext">Multiplicity</span></a>
<ul>
<li class="toclevel-3"><a href="Declarative_Services.html#Sample_with_0..1_cardinality"><span class="tocnumber">7.2.1</span> <span class="toctext">Sample with 0..1 cardinality</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-1"><a href="Declarative_Services.html#Policy_of_a_reference"><span class="tocnumber">8</span> <span class="toctext">Policy of a reference</span></a>
<ul>
<li class="toclevel-2"><a href="Declarative_Services.html#Static"><span class="tocnumber">8.1</span> <span class="toctext">Static</span></a></li>
<li class="toclevel-2"><a href="Declarative_Services.html#Dynamic"><span class="tocnumber">8.2</span> <span class="toctext">Dynamic</span></a>
<ul>
<li class="toclevel-3"><a href="Declarative_Services.html#Sample_with_policy.3Ddynamic"><span class="tocnumber">8.2.1</span> <span class="toctext">Sample with policy=dynamic</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-1"><a href="Declarative_Services.html#The_life_cycle_of_a_component"><span class="tocnumber">9</span> <span class="toctext">The life cycle of a component</span></a></li>
<li class="toclevel-1"><a href="Declarative_Services.html#Immediate_and_delayed_components"><span class="tocnumber">10</span> <span class="toctext">Immediate and delayed components</span></a>
<ul>
<li class="toclevel-2"><a href="Declarative_Services.html#Immediate_Components"><span class="tocnumber">10.1</span> <span class="toctext">Immediate Components</span></a>
<ul>
<li class="toclevel-3"><a href="Declarative_Services.html#Life_cycle_of_immediate_components"><span class="tocnumber">10.1.1</span> <span class="toctext">Life cycle of immediate components</span></a></li>
</ul>
</li>
<li class="toclevel-2"><a href="Declarative_Services.html#Delayed_Components"><span class="tocnumber">10.2</span> <span class="toctext">Delayed Components</span></a>
<ul>
<li class="toclevel-3"><a href="Declarative_Services.html#Life_cycle_of_delayed_components"><span class="tocnumber">10.2.1</span> <span class="toctext">Life cycle of delayed components</span></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
<a name="Overview"></a><h2> <span class="mw-headline"> Overview </span></h2>
<p>SMILA makes heavy usage of a OSGi feature named "Declarative Service" (DS). On this page we describe some practices that we found useful when working with Declarative Services.
</p><p>A DS component provides and requires services. These services will be described declarative. The so called service component runtime will only activate a service component, if all required services are available in the system. The services that are provided by a service component may be activated retarded, i.e. they are only then created, when a using bundle accesses these services.
A service component consists of an implementing class (component-class) and an xml-document (component-description).
</p>
<a name="Service_Component_Runtime"></a><h2> <span class="mw-headline"> Service Component Runtime </span></h2>
<p>The Service Component Runtime is responsible for the creation of Service Components and for the administration of their life cycles. It will be provided by the implementation of the Declarative-Service-Specification.
The Service Component Runtime checks with the installation of a Bundle whether this contains one or more component descriptions. Is this the case, the Service Component Runtime tries to solve the dependencies of a component to other services. The Runtime examines whether all required services are present in the system. If all required services are available, an instance of the components will be produced and activated. However if a necessary service is not available, then the instantiation and activation of the component are retarded so for a long time, till all required services are available up to a later time.
Components may be parameterised by Component Properties. These properties may be declared in the component description. Alternative the properties may be set by Component Factories at Runtime, too.
</p><p><b>The usage of Declarative Services offers a number of significant advantages:</b>
</p>
<ul><li> <b>Delayed activation of services:</b> Services will be retarded activated if they are provided by component. That means the provided service is registered at the service registry with the start of the implementing bundle. But the service instance will be first created and activated with the first access.
</li></ul>
<ul><li> <b> Resolving of service references:</b> References for required services are resolved by the Service Component Runtime. Only if all necessary services are available in the system, the component will be instantiated and activated. Thus the handling of potential dynamic of services will be dramatically simplified in the component-class.
</li></ul>
<p><br />
</p>
<a name="Component-Class"></a><h2> <span class="mw-headline"> Component-Class </span></h2>
<p>The component-class is a simple java class, that optional may define callback-methods. With these methods you have the ability to run several actions at the activation or deactivation of a service component. A component-class may define a method activate(ComponentContext). This method will be invoked by the Service Component Runtime, if the corresponding component instance is activated.
</p><p><b>Sample activate()-method:</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">protected</span> <span class="kw4">void</span> activate<span class="br0">&#40;</span>ComponentContext<span class="br0">&#41;</span></pre></div>
<p>The method deactivate(ComponentContext) will be invoked, if the corresponding component instance is deactivated.
</p><p><b>Sample deactivate()-method:</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">protected</span> <span class="kw4">void</span> deactivate<span class="br0">&#40;</span>ComponentContext<span class="br0">&#41;</span></pre></div>
<p>Keep in mind that the component class have not to implement a special interface. It is enough when both methods exist on the component class. Both methods will be assigned an object from type <b>org.osgi.service.component.ComponentContext</b> by a parameter. With the component context you may access properties of a component or you may query the bundle context of the defined bundle and some things more. See below:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">package</span> org.<span class="me1">osgi</span>.<span class="me1">service</span>.<span class="me1">component</span>;
&nbsp;
<span class="kw1">public</span> <span class="kw1">interface</span> ComponentContext <span class="br0">&#123;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw3">Dictionary</span> getProperties<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw1">public</span> <span class="kw3">Object</span> locateService<span class="br0">&#40;</span><span class="kw3">String</span> name<span class="br0">&#41;</span>;
<span class="kw1">public</span> <span class="kw3">Object</span> locateService<span class="br0">&#40;</span><span class="kw3">String</span> name, ServiceReference reference<span class="br0">&#41;</span>;
<span class="kw1">public</span> <span class="kw3">Object</span><span class="br0">&#91;</span><span class="br0">&#93;</span> locateServices<span class="br0">&#40;</span><span class="kw3">String</span> name<span class="br0">&#41;</span>;
<span class="kw1">public</span> BundleContext getBundleContext<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw1">public</span> Bundle getUsingBundle<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw1">public</span> ComponentInstance getComponentInstance<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw1">public</span> <span class="kw4">void</span> enableComponent<span class="br0">&#40;</span><span class="kw3">String</span> name<span class="br0">&#41;</span>;
<span class="kw1">public</span> <span class="kw4">void</span> disableComponent<span class="br0">&#40;</span><span class="kw3">String</span> name<span class="br0">&#41;</span>;
<span class="kw1">public</span> ServiceReference getServiceReference<span class="br0">&#40;</span><span class="br0">&#41;</span>;
&nbsp;
<span class="br0">&#125;</span></pre></div>
<a name="Component-Description"></a><h2> <span class="mw-headline"> Component-Description </span></h2>
<p>The component description describes a component, if necessary with dependencies to other services. This happens in form of an xml-document. Additional you may declare, if a component provides itself a service at over the service registry. The name of the xml file has to be defined as the manifest header Service-Component.
</p><p><b>Sample Service-Component manifest header:</b>
</p>
<pre>
Service-Component: OSGI-INF/component-description.xml
</pre>
<p>The root element of a component-description is the xml-element <i><b>component</b></i>. It offers the listed attributes:
</p>
<table border="1">
<tr>
<th>name</th><th>constraint</th><th>description
</th></tr>
<tr>
<td>name</td><td>required</td><td>The global explicit name of a component.
</td></tr>
<tr>
<td>enabled</td><td>optional</td><td>Defines, whether the component starts the bundle and whether the component is activated or not. <b>Default: true</b>
</td></tr>
<tr>
<td>factory </td><td>optional</td><td>When the described component is a factory component then this attribute has to include the name of the factory.
</td></tr>
<tr>
<td>immediate</td><td>optional</td><td>Defines, whether a component, that defines own services, should activated delayed or not.
</td></tr></table>
<p>The implementing class of a component is specified by the child element <i><b>implementation</b></i>. It has a single attribute <i><b>class</b></i>.
</p>
<table border="1">
<tr>
<th>name</th><th>constraint</th><th>description
</th></tr>
<tr>
<td>class</td><td>required</td><td>The full qualified name of the implementing java class.
</td></tr></table>
<p><b>Sample component description:</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;component</span> <span class="re0">name</span>=<span class="st0">&quot;simpleComponent&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;implementation</span> <span class="re0">class</span>=<span class="st0">&quot;org.eclipse.smila.simplecomponent.SimpleComponent&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/component<span class="re2">&gt;</span></span></span></pre></div>
<p><br />
</p>
<a name="Provide_services"></a><h2> <span class="mw-headline"> Provide services </span></h2>
<p>The instance of a component may be registered itself as an OSGI-service at the service registry. This also happens declarative with the xml-element <i><b>service</b></i> in the component description. This element has the attribute <i><b>serviceFactory</b></i>.
</p>
<table border="1">
<tr>
<th>name</th><th>constraint</th><th>description
</th></tr>
<tr>
<td>serviceFactory</td><td>optional</td><td>Defines, whether the service should be identical to all using bundles (true) or whether an instance of the component should be created for each using bundle by a ServiceFactory. <b>Default: false</b>
</td></tr></table>
<p>The specification of the service-interfaces takes place via the child element <i><b>provide</b></i>. This element has the attribute <i><b>interface</b></i>.
</p>
<table border="1">
<tr>
<th>name</th><th>constraint</th><th>description
</th></tr>
<tr>
<td>interface</td><td>required</td><td>The full qualified name of the class, under which the component instance should be announced at the service registry.
</td></tr></table>
<p><b>Sample component description:</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;component</span> <span class="re0">name</span>=<span class="st0">&quot;simpleComponent&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;implementation</span> <span class="re0">class</span>=<span class="st0">&quot;org.eclipse.smila.simplecomponent.SimpleComponent&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;service<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;provide</span> <span class="re0">interface</span>=<span class="st0">&quot;org.eclipse.smila.simplecomponent.SimpleService&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/service<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/component<span class="re2">&gt;</span></span></span></pre></div>
<a name="Use_Services"></a><h2> <span class="mw-headline"> Use Services </span></h2>
<p>Components may use services that were registered by other bundles or components at the service registry. The specification of service dependencies takes place via the xml-element <i><b>reference</b></i>. This element has the following attributes:
</p>
<table border="1">
<tr>
<th>name</th><th>constraint</th><th>description
</th></tr>
<tr>
<td>name</td><td>required</td><td>The local explicit name of the reference.
</td></tr>
<tr>
<td>interface</td><td>required</td><td>The full qualified name of the interface, under which the service is applied to the service registry.
</td></tr>
<tr>
<td>cardinality</td><td>optional</td><td>Defines, whether a reference is optional how many service may be bounded by this reference.
</td></tr>
<tr>
<td>policy</td><td>optional</td><td>Defines, how to interact with changes at the initial bounded services.
</td></tr>
<tr>
<td>target</td><td>optional</td><td>A filter that describes the referenced service more near.
</td></tr>
<tr>
<td>bind</td><td>optional</td><td>The name of the method, under which a service may be placed to the component.
</td></tr>
<tr>
<td>unbind</td><td>optional</td><td>The name of the method, under which a service may be deleted from the component.
</td></tr></table>
<p><b>In principal two different strategies are available for the specification of references to services:</b>
</p>
<a name="Event-Strategy"></a><h3> <span class="mw-headline"> Event-Strategy </span></h3>
<p>Whit the use of the Event-Strategy you have to implement a <i><b>bind</b></i>- and an <i><b>unbind</b></i>-Method for the referenced service in the component-class. You may choose the name of these methods, but the methods have to be <i>public</i> or <i>protected</i> and have to have the return value <i>void</i>. The type of the single parameter may be either a <i>ServiceReference</i> or the type of the service (normally the service interface). If the referenced service is available, it will be set with the <i><b>bind</b></i>-Method by the service component runtime at the component instance. If the referenced service is deleted from the system, the service component runtime will call up the <i><b>unbind</b></i>-Method.
</p>
<a name="Sample_Event-Strategy"></a><h4> <span class="mw-headline"> Sample Event-Strategy </span></h4>
<p><b>component-class</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">package</span> org.<span class="me1">eclipse</span>.<span class="me1">smila</span>.<span class="me1">simplecomponent</span>
&nbsp;
<span class="kw1">import</span> org.<span class="me1">osgi</span>.<span class="me1">service</span>.<span class="me1">component</span>.<span class="me1">ComponentContext</span>;
<span class="kw1">import</span> org.<span class="me1">eclipse</span>.<span class="me1">smila</span>.<span class="me1">service</span>.<span class="me1">SmilaService</span>;
&nbsp;
<span class="kw1">public</span> <span class="kw1">class</span> SimpleComponent <span class="kw1">implements</span> SimpleService <span class="br0">&#123;</span>
&nbsp;
<span class="kw1">private</span> SmilaService smilaService;
&nbsp;
<span class="co1">// bind-Method</span>
<span class="kw1">protected</span> <span class="kw4">void</span> setSmilaService<span class="br0">&#40;</span>SmilaService smilaService<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">this</span>.<span class="me1">smilaService</span> = smilaService;
<span class="br0">&#125;</span>
&nbsp;
<span class="co1">// unbind-Method</span>
<span class="kw1">protected</span> <span class="kw4">void</span> unsetSmilaService<span class="br0">&#40;</span>SmilaService smilaService<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">this</span>.<span class="me1">smilaService</span> = <span class="kw2">null</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<p><b>component-description</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;component</span> <span class="re0">name</span>=<span class="st0">&quot;simpleComponent&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;implementation</span> <span class="re0">class</span>=<span class="st0">&quot;org.eclipse.smila.simplecomponent.SimpleComponent&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;service<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;provide</span> <span class="re0">interface</span>=<span class="st0">&quot;org.eclipse.smila.simplecomponent.SimpleService&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/service<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;reference</span> <span class="re0">name</span>=<span class="st0">&quot;smilaService&quot;</span>
<span class="re0">interface</span>=<span class="st0">&quot;org.eclipse.smila.service.SmilaService&quot;</span>
<span class="re0">bind</span>=<span class="st0">&quot;setSmilaService&quot;</span>
<span class="re0">unbind</span>=<span class="st0">&quot;unsetSmilaService&quot;</span>
<span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/component<span class="re2">&gt;</span></span></span></pre></div>
<p><br />
</p>
<a name="Lookup-Strategy"></a><h3> <span class="mw-headline"> Lookup-Strategy </span></h3>
<p>With the use of the Lookup-Strategy the referenced service aren´t set directly to the component by the service component runtime, but it have to be polled over the component context via the method <i><b>locateService()</b></i>. The implementation of appropriate <i>bind</i>- and <i>unbind</i>-Methods is not necessary.
</p>
<a name="Sample_Lookup-Strategy"></a><h4> <span class="mw-headline"> Sample Lookup-Strategy </span></h4>
<p><b>component-class</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">package</span> org.<span class="me1">eclipse</span>.<span class="me1">smila</span>.<span class="me1">simplecomponent</span>;
&nbsp;
<span class="co1">// [...]</span>
&nbsp;
<span class="kw1">public</span> <span class="kw1">class</span> SimpleComponent <span class="kw1">implements</span> SimpleService <span class="br0">&#123;</span>
&nbsp;
<span class="kw1">private</span> ComponentContext componentContext;
&nbsp;
<span class="kw1">protected</span> <span class="kw4">void</span> activate<span class="br0">&#40;</span>ComponentContext context<span class="br0">&#41;</span> <span class="br0">&#123;</span>
componentContext = context;
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">protected</span> <span class="kw4">void</span> deactivate<span class="br0">&#40;</span>ComponentContext context<span class="br0">&#41;</span> <span class="br0">&#123;</span>
componentContext = <span class="kw2">null</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">private</span> SmilaService getSmilaService<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">this</span>.<span class="me1">componentContext</span>&nbsp;!= <span class="kw2">null</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">return</span> <span class="br0">&#40;</span>SmilaService<span class="br0">&#41;</span> <span class="kw1">this</span>.<span class="me1">componenContext</span>.<span class="me1">locateService</span><span class="br0">&#40;</span><span class="st0">&quot;smilaService&quot;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">return</span> <span class="kw2">null</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<p><b>component-description</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;component</span> <span class="re0">name</span>=<span class="st0">&quot;simpleComponent&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;implementation</span> <span class="re0">class</span>=<span class="st0">&quot;org.eclipse.smila.simplecomponent.SimpleComponent&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;service<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;provide</span> <span class="re0">interface</span>=<span class="st0">&quot;org.eclipse.smila.simplecomponent.SimpleService&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/service<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;reference</span> <span class="re0">name</span>=<span class="st0">&quot;smilaService&quot;</span>
<span class="re0">interface</span>=<span class="st0">&quot;org.eclipse.smila.service.SmilaService&quot;</span> <span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/component<span class="re2">&gt;</span></span></span></pre></div>
<a name="Cardinality_of_a_reference"></a><h2> <span class="mw-headline"> Cardinality of a reference </span></h2>
<p>The cardinality of a reference describes the following properties:
</p>
<a name="Optionality"></a><h3> <span class="mw-headline"> Optionality </span></h3>
<p>The optionality of a reference declares, whether the referenced service is compelling needed by the component or whether it may work without the referenced service. E.g. a component that references a logging service may work meaningful, when the logging service is not available. Only the output of the log message would not be possible in this case.
</p>
<a name="Multiplicity"></a><h3> <span class="mw-headline"> Multiplicity </span></h3>
<p>The multiplicity of a reference defines whether a component is interested in exactly one instance of the referenced service or whether it is able to deal with multi service instances.
</p><p>The cardinality of a reference is arranged by the attribute <i><b>cardinality</b></i> that is available at the element <i><b>reference</b></i>. The following values may be set:
</p>
<table border="1">
<tr>
<th>name</th><th>description
</th></tr>
<tr>
<td>0..1 - optional and unary</td><td>The referenced service is optional and only one instance of the referenced service may be assigned to the component.
</td></tr>
<tr>
<td>1..1 - mandatory and unary</td><td>The referenced service is mandatory and only one instance of the referenced service may be assigned to the component. That is the default attitude, if the cardinality-attribute is not set.
</td></tr>
<tr>
<td>0..n - optional and multiple</td><td>The referenced service is optional and all available instances of the referenced service are assigned to the component.
</td></tr>
<tr>
<td>1..n - mandatory and multiple</td><td>The referenced service is mandatory and all available instances of the referenced service are assigned to the component.
</td></tr></table>
<a name="Sample_with_0..1_cardinality"></a><h4> <span class="mw-headline"> Sample with 0..1 cardinality </span></h4>
<p><b>component-description</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;component</span> <span class="re0">name</span>=<span class="st0">&quot;simpleComponent&quot;</span><span class="re2">&gt;</span></span>
[...]
<span class="sc3"><span class="re1">&lt;reference</span> <span class="re0">name</span>=<span class="st0">&quot;smilaService&quot;</span>
<span class="re0">interface</span>=<span class="st0">&quot;org.eclipse.smila.service.SmilaService&quot;</span>
<span class="re0">bind</span>=<span class="st0">&quot;setSmilaService&quot;</span>
<span class="re0">unbind</span>=<span class="st0">&quot;unsetSmilaService&quot;</span>
<span class="re0">cardinality</span>=<span class="st0">&quot;0..1&quot;</span>
<span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/component<span class="re2">&gt;</span></span></span></pre></div>
<a name="Policy_of_a_reference"></a><h2> <span class="mw-headline"> Policy of a reference </span></h2>
<p>The service component runtime ensures that a service component will only be instanced and started if all required services for a component are available at the system. The referencing services will be bound to the component by activating. Now the OSGI service platform has the feature that services may be registered and unregistered in the system at runtime. E. g. a service that is bound to a component may be unregistered after activation from the service registry. After that all object references to the corresponding service object expire.
Therefore a component has to define how it should interact with changes at bound services. For it a component may specify the attribute <i><b>policy</b></i> of the element <i>reference</i>. This attribute may accept the following values:
</p>
<a name="Static"></a><h3> <span class="mw-headline"> Static </span></h3>
<p>With the use of the <i><b>static-policy</b></i> the services that are bound by activating of the component won´t be modified. If a bound service is deactivated by the service registry the referenced component will also be deactivated. If an alternative service that complies with the dependencies of the component is registered to the service registry then the component will directly be (re-)activated with the new bound service. <b>The <i>static-policy</i> is the default policy. It is used if the <i>policy-attribute</i> is not set</b>.
</p>
<a name="Dynamic"></a><h3> <span class="mw-headline"> Dynamic </span></h3>
<p>With the use the <i><b>dynamic-policy</b></i> a component won´t be deactivated, if a bound service is deregistered, while all service references may be further fulfilled. The implementation of the component must be able to react therefore to changes concerning the bound services. If a reference uses the <i>event-strategy</i> to access to service, then the component will be informed about changes of the bound services by the corresponding <i>bind</i>- and <i>unbind</i>-Methods.
</p>
<a name="Sample_with_policy.3Ddynamic"></a><h4> <span class="mw-headline"> Sample with policy=dynamic </span></h4>
<p><b>component-description</b>
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;component</span> <span class="re0">name</span>=<span class="st0">&quot;simpleComponent&quot;</span><span class="re2">&gt;</span></span>
[...]
<span class="sc3"><span class="re1">&lt;reference</span> <span class="re0">name</span>=<span class="st0">&quot;smilaService&quot;</span>
<span class="re0">interface</span>=<span class="st0">&quot;org.eclipse.smila.service.SmilaService&quot;</span>
<span class="re0">bind</span>=<span class="st0">&quot;setSmilaService&quot;</span>
<span class="re0">unbind</span>=<span class="st0">&quot;unsetSmilaService&quot;</span>
<span class="re0">cardinality</span>=<span class="st0">&quot;0..1&quot;</span>
<span class="re0">policy</span>=<span class="st0">&quot;dynamic&quot;</span>
<span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/component<span class="re2">&gt;</span></span></span></pre></div>
<a name="The_life_cycle_of_a_component"></a><h2> <span class="mw-headline"> The life cycle of a component </span></h2>
<p>General components may be activated, when they are in the condition <i><b>enabled</b></i>. Normally components will be set automatically to this condition by the service component runtime as soon as the defining bundle is started. If the defining bundle is stopped, the service component runtime sets the contained components into the condition <i><b>disabled</b></i>.
With the component-attribute <i><b>enabled</b></i> it is possible to specify that a component is not set into the condition <i><b>enabled</b></i> when starting the defining bundle. With the methods <i><b>ComponentContext.enableComponent(String name)</b></i> and <i><b>ComponentContext.disableComponent(String name)</b></i> components may set programmatically over their logical name into the condition <i><b>enabled</b></i> or <i><b>disabled</b></i>.
</p>
<a name="Immediate_and_delayed_components"></a><h2> <span class="mw-headline"> Immediate and delayed components </span></h2>
<p>The declarative service specification differentiates two different kinds of components:
</p>
<a name="Immediate_Components"></a><h3> <span class="mw-headline"> Immediate Components </span></h3>
<p>Immediate components are components that are activated directly, when all necessary references are fulfilled, i.e. the referencing services are available in the system.
</p>
<a name="Life_cycle_of_immediate_components"></a><h4> <span class="mw-headline"> Life cycle of immediate components </span></h4>
<p>Immediate component are activated, if all required services of a component are available in the system, i.e. all necessary references may be fulfilled. The possibly implemented method activate() of the component instance is called during the activation of a component. An active component will be deactivated, if the required services are not longer available, the component instance is set into the condition disabled via the method <i>ComponentContext.disableComponent()</i> or the defined bundle is stopped.
</p><p><br />
</p>
<a name="Delayed_Components"></a><h3> <span class="mw-headline"> Delayed Components </span></h3>
<p>Delayed components are components that provide one or more services. They are only then activated, if the services made available by the component are queried at the service registry.
</p>
<a name="Life_cycle_of_delayed_components"></a><h4> <span class="mw-headline"> Life cycle of delayed components </span></h4>
<p>Service components, that make services available, are delayed components by default. I.e. they will be only then activated, if a service made available by the component is queried by the service registry.
If a delayed component is set into the condition enabled, the service component runtime tries to solve the service dependencies that are defined by the component. If this is successful the service component runtime will register a proxy-object, which represents the service, to the service registry. Only if the service is queried by the service registry, the service component runtime will activate the service component and delegates the call to the real service. This happens for the user of the service completely transparency.
If a service reference sets the attribute <i>servicefactory="true"</i>, then a new instance of the component will be instantiated and activated for every querying bundle. Alternatively only one common component instance is available for all bundles.
</p>
<!--
NewPP limit report
Preprocessor node count: 61/1000000
Post-expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
#ifexist count: 0/100
-->
<!-- Saved in parser cache with key wikidb:pcache:idhash:15198-0!1!0!!en!2!edit=0 and timestamp 20120709163513 -->
<div class="printfooter">
Retrieved from "<a href="Declarative_Services.html">http://wiki.eclipse.org/SMILA/Documentation/Declarative_Services</a>"</div>
<div id="catlinks"><p class='catlinks'><a href="http://wiki.eclipse.org/Special:Categories" title="Special:Categories">Category</a>: <span dir='ltr'><a href="http://wiki.eclipse.org/Category:SMILA" title="Category:SMILA">SMILA</a></span></p></div> <!-- end content -->
<div class="visualClear"></div>
</div>
</div>
</div>
<!-- Yoink of toolbox for phoenix moved up -->
</div>
</div>
<div id="clearFooter"/>
<div id="footer" >
<ul id="footernav">
<li class="first"><a href="http://www.eclipse.org/">Home</a></li>
<li><a href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
<li><a href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
<li><a href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
<li><a href="http://www.eclipse.org/org/foundation/contact.php">Contact</a></li>
<li><a href="http://wiki.eclipse.org/Eclipsepedia:About" title="Eclipsepedia:About">About Eclipsepedia</a></li>
</ul>
<span id="copyright">Copyright &copy; 2012 The Eclipse Foundation. All Rights Reserved</span>
<p id="footercredit">This page was last modified 13:37, 24 January 2012 by <a href="http://wiki.eclipse.org/index.php?title=User:Juergen.schumacher.attensity.com&amp;action=edit" class="new" title="User:Juergen.schumacher.attensity.com">Juergen Schumacher</a>. Based on work by <a href="http://wiki.eclipse.org/User:Juergen.schumacher.empolis.com" title="User:Juergen.schumacher.empolis.com">Juergen Schumacher</a>.</p>
<p id="footerviews">This page has been accessed 3,332 times.</p>
</div>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-910670-4");
pageTracker._trackPageview();
</script>
<!-- <div class="visualClear"></div> -->
<script type="text/javascript">if (window.runOnloadHook) runOnloadHook();</script>
</div>
<!-- Served in 0.051 secs. --></body></html>