You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by cl...@apache.org on 2009/01/15 16:35:22 UTC

svn commit: r734735 [8/12] - in /felix/trunk/ipojo: annotations/doc/ annotations/doc/how-to-use-ipojo-annotations_files/ annotations/doc/how-to-use-ipojo-annotations_files/button_data/ annotations/doc/media.data/ ant/doc/ ant/doc/ipojo-ant-task_files/ ...

Added: felix/trunk/ipojo/core/doc/service-requirement-handler.html
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/doc/service-requirement-handler.html?rev=734735&view=auto
==============================================================================
--- felix/trunk/ipojo/core/doc/service-requirement-handler.html (added)
+++ felix/trunk/ipojo/core/doc/service-requirement-handler.html Thu Jan 15 07:35:17 2009
@@ -0,0 +1,774 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html><head>
+
+
+  
+    <title>Apache Felix - Service Requirement Handler</title>
+    <link rel="stylesheet" href="service-requirement-handler_files/site.css" type="text/css" media="all">
+    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+  </head><body>
+    <div class="title"><div class="logo"><a href="http://felix.apache.org/site/index.html"><img alt="Apache Felix" src="service-requirement-handler_files/logo.png" border="0"></a></div><div class="header"><a href="http://www.apache.org/"><img alt="Apache" src="service-requirement-handler_files/apache.png" border="0"></a></div></div>
+    <div class="menu">
+<ul>
+	<li><a href="http://felix.apache.org/site/news.html" title="news">news</a></li>
+	<li><a href="http://felix.apache.org/site/license.html" title="license">license</a></li>
+	<li><span class="nobr"><a href="http://felix.apache.org/site/downloads.cgi" title="Visit page outside Confluence" rel="nofollow">downloads<sup><img class="rendericon" src="service-requirement-handler_files/linkext7.gif" alt="" align="absmiddle" border="0" width="7" height="7"></sup></a></span></li>
+	<li><a href="http://felix.apache.org/site/documentation.html" title="documentation">documentation</a></li>
+	<li><a href="http://felix.apache.org/site/mailinglists.html" title="mailinglists">mailing lists</a></li>
+	<li><a href="http://felix.apache.org/site/contributing.html" title="Contributing">contributing</a></li>
+	<li><span class="nobr"><a href="http://www.apache.org/" title="Visit page outside Confluence" rel="nofollow">asf<sup><img class="rendericon" src="service-requirement-handler_files/linkext7.gif" alt="" align="absmiddle" border="0" width="7" height="7"></sup></a></span></li>
+	<li><span class="nobr"><a href="http://www.apache.org/foundation/sponsorship.html" title="Visit page outside Confluence" rel="nofollow">sponsorship<sup><img class="rendericon" src="service-requirement-handler_files/linkext7.gif" alt="" align="absmiddle" border="0" width="7" height="7"></sup></a></span></li>
+	<li><span class="nobr"><a href="http://www.apache.org/foundation/thanks.html" title="Visit page outside Confluence" rel="nofollow">sponsors<sup><img class="rendericon" src="service-requirement-handler_files/linkext7.gif" alt="" align="absmiddle" border="0" width="7" height="7"></sup></a></span>
+<!-- ApacheCon Ad -->
+<iframe src="service-requirement-handler_files/button.html" style="border-width: 0pt; float: left;" scrolling="no" width="135" frameborder="0" height="135"></iframe>
+<p style="height: 100px;">
+<!-- ApacheCon Ad -->
+</p></li></ul> </div>
+    <div class="main">
+<table class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><tbody><tr>
+<td class="confluenceTd" valign="top" width="80%">
+<h1><a name="ServiceRequirementHandler-ServiceDependencyManagement"></a>Service Dependency Management</h1>
+
+<p>The dependency handler manages <em>OSGi service</em> <em>dependencies/requirements</em>.
+It allows a component to consume service without managing service
+discovery, tracking and binding. The handler manages all this
+interaction and injects required service in the component.</p>
+
+<h2><a name="ServiceRequirementHandler-ServiceRequirement"></a>Service Requirement</h2>
+
+
+<h3><a name="ServiceRequirementHandler-What'saservicerequirement?"></a>What's a service requirement?</h3>
+
+<p>A requirement represents a required service. Therefore, it manages
+the service lookup and the service binding. When an instance requires a
+service, the handler injects directly a service object inside a field,
+or invokes a method when a consistent service appears (or disappears).
+Service requirements can be:</p>
+<ul>
+	<li>Simple / Aggregate : the component can require      one or several service providers</li>
+	<li>Mandatory / Optional : a component can declare an      optional dependency</li>
+	<li>Filtered : a component can filter available      providers</li>
+	<li>Dynamic / Static / Dynamic-Priority : the      component can specify the binding policy</li>
+	<li>Specific : the dependency targets a specific service provider</li>
+</ul>
+
+
+<h3><a name="ServiceRequirementHandler-Dynamism&amp;InstanceLifecycle"></a>Dynamism &amp; Instance Lifecycle</h3>
+
+<p>In OSGi™, services can appear and disappear dynamically. This
+implies dependencies can target a provider which can appear or
+disappear dynamically.&nbsp; So, dependencies need to manage this
+dynamism by tracking every time available services. At any moment, a
+dependency can be unresolved (i.e. no more provider can fulfill the
+requirement).&nbsp; In the case of a mandatory requirement, the
+instance becomes invalid (an invalid instance is no more accessible
+externally, for example provided service are unpublished). If a
+service, resolving the unfilled dependency appears, the instance
+becomes valid. In consequence, dependencies affect directly the
+instance state, and must manage correctly OSGi dynamism to allow a
+complete unloading when a service goes away. As soon a mandatory
+dependency cannot be fulfilled, the instance is invalidated.</p>
+
+<p>By default, dependencies are managed dynamically (as previously
+explained). However, iPOJO supports two other types of binding
+policies:&nbsp;</p>
+<ul>
+	<li>Static : if a bound service disappears, the      instance is invalidated and cannot be revalidated (binding broken)</li>
+	<li>Dynamic-Priority: at each injection, the <em>best</em> provider is injected, or the providers array is sorted according to the OSGi Ranking policy.</li>
+</ul>
+
+
+<h2><a name="ServiceRequirementHandler-ServiceRequirementInjectionMechanisms"></a>Service Requirement Injection Mechanisms</h2>
+
+<p>The handler manages two types of injections:</p>
+<ul>
+	<li>Field injection: a field contains the service object. As soon
+as the field is used, a consistent service object is injected. This
+injection type fully hides the dynamism</li>
+	<li>Method invocation:
+when a service appears, or disappears a method in the component is
+invoked. For each dependency, bind and unbind methods are invoke to
+notify the component of the event.</li>
+</ul>
+
+
+<p>Moreover, the two injections type can be merged. A component can declare a requirement containing both a field and 'binding'.</p>
+
+<h3><a name="ServiceRequirementHandler-Fieldinjection"></a>Field injection</h3>
+
+<p>Imagine a Hello service with one method 'getMessage' returning a
+"Hello Message". The following component implementation can use this
+service by attaching this service to a field and by using the field:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+    <span class="code-keyword">private</span> Hello m_hello;
+    <span class="code-keyword">public</span> doSomething() {
+        <span class="code-object">System</span>.out.println(m_hello.getMesage());
+    }
+}</pre>
+</div></div>
+<p>For this component, metadata could be:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+    <span class="code-tag">&lt;requires field=<span class="code-quote">"m_hello"</span>/&gt;</span>
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>The metadata contains a 'requires' element (representing the service
+dependency). This element has a field attribute. This attribute is the
+name of the field representing the service dependency in the
+implementation class. The implementation uses the field as a normal
+field without managing service interactions.</p>
+
+<h3><a name="ServiceRequirementHandler-Methodinvocation"></a>Method invocation</h3>
+
+<p>The second injection mechanism uses methods in the implementation
+class. By this way, the dynamics can be managed directly by the
+developer. Each dependency can declare two methods:</p>
+<ul>
+	<li>A bind method called when a service appears</li>
+	<li>An unbind method called when a service disappears</li>
+</ul>
+
+
+<p>Moreover, callbacks can be in the component super class (in this
+case methods must be public). These methods can have one of these four
+signatures:</p>
+<ul>
+	<li>Without any argument: the method is just a      notification (method())</li>
+	<li>With the service object : the object is the      implicated service object (method(Service svc))</li>
+	<li>With an OSGi service reference: the service      reference appearing or disappearing (method(ServiceReference ref))</li>
+	<li>With the service object and the OSGi service      reference (method(Service svc, ServiceReference ref))</li>
+	<li>With the service object and the service properties inside a Map (method(Service svc, Map properties)) <b>[New in the 1.1.0-SNAPSHOT version]</b></li>
+	<li>With the service object and the service properties inside a Dictionary (method(Service svc, Dictionary properties)) <b>[New in the 1.1.0-SNAPSHOT version]</b></li>
+</ul>
+
+
+<p>The following component implementation shows an example of implementation using this mechanism:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+  <span class="code-keyword">private</span> Hello m_hello;
+
+  <span class="code-keyword">public</span> void bindHello(Hello h) { m_hello = h; }
+  <span class="code-keyword">public</span> void unbindHello() { m_hello = <span class="code-keyword">null</span>; }
+  <span class="code-keyword">public</span> doSomething() { <span class="code-object">System</span>.out.println(m_hello.getMesage()); }
+}</pre>
+</div></div>
+<p>For this component, metadata could be:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+<span class="code-tag">&lt;requires&gt;</span>
+    <span class="code-tag">&lt;callback type=<span class="code-quote">"bind"</span> method=<span class="code-quote">"bindHello"</span>&gt;</span>
+    <span class="code-tag">&lt;callback type=<span class="code-quote">"unbind"</span> method=<span class="code-quote">"unbindHello"</span>&gt;</span>
+<span class="code-tag">&lt;/requires&gt;</span>
+...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>Note, that the bind the unbind method can be have different
+signatures. By using this mechanism, you need to be sure to manage the
+dynamism correctly.<br>
+(<a href="#ServiceRequirementHandler-discovery" title="discovery on Service Requirement Handler">See note on type discovery</a>)</p>
+
+<h3><a name="ServiceRequirementHandler-FieldinjectionsandMethodinvocations"></a>Field injections and Method invocations</h3>
+
+<p>The two mechanisms can be used together. In this case, the field
+receives the value before the bind method invocation. So, if the field
+is use in the method, the returned value will be up to date. The
+following component implementation uses this mechanism:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+     <span class="code-keyword">private</span> Hello m_hello; <span class="code-comment">// Injected Field
+</span>
+     <span class="code-keyword">public</span> void bindHello() { <span class="code-object">System</span>.out.println(<span class="code-quote">"Hello appears"</span>); }
+     <span class="code-keyword">public</span> void unbindHello() { <span class="code-object">System</span>.out.println(<span class="code-quote">"Hello disapears"</span>); }
+     <span class="code-keyword">public</span> doSomething() { <span class="code-object">System</span>.out.println(m_hello.getMesage()); }
+}</pre>
+</div></div>
+
+<p>For this component, metadata could be:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+    <span class="code-tag">&lt;requires  field=<span class="code-quote">"m_hello"</span>&gt;</span>
+        <span class="code-tag">&lt;callback type=<span class="code-quote">"bind"</span> method=<span class="code-quote">"bindHello"</span>&gt;</span>
+        <span class="code-tag">&lt;callback type=<span class="code-quote">"unbind"</span> method=<span class="code-quote">"unbindHello"</span>&gt;</span>
+    <span class="code-tag">&lt;/requires&gt;</span>
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+
+<h3><a name="ServiceRequirementHandler-Injectionmechanisms&amp;lazyobjectcreation"></a>Injection mechanisms &amp; lazy object creation</h3>
+
+<p>IPOJO creates objects only when required. When needed, iPOJO invokes
+the constructor of the implementation class. The implementation class
+can use field requirement because values are already injected. However,
+method dependencies are called just after the constructor. If the
+service already presents, the invocation of the methods are delayed
+just after the constructor invocation.</p>
+
+<h2><a name="ServiceRequirementHandler-SomeExamples"></a>Some Examples</h2>
+
+
+<h3><a name="ServiceRequirementHandler-SimpleRequirement"></a>Simple Requirement</h3>
+
+<p>By default, a requirement is mandatory, non-filtered and simple
+(non-aggregate). The two previous examples illustrate this kind of
+dependency. When services goes away and appears, the service
+substitution is hidden. Fields attached to simple requirement point
+always a consistent service object. For a simple dependency, the bind
+method is called once time when the service appears or just after the
+POJO constructor invocation is the service is available. When the
+service disappears the unbind method is called. The bind method is
+re-invoked as soon as another service provider is available. This
+invocation occurs immediately if another service provider if available.
+In this case, the instance is not invalidated.</p>
+
+<h3><a name="ServiceRequirementHandler-AggregateRequirement"></a>Aggregate Requirement</h3>
+
+<p>When a component requires several providers of the same service, it declares an aggregate dependency.</p>
+
+<h4><a name="ServiceRequirementHandler-AggregateDependencywithfieldinjection"></a>Aggregate Dependency with field injection</h4>
+
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+     <span class="code-keyword">private</span> Hello m_hellos[];
+     <span class="code-keyword">public</span> doSomething() {
+             <span class="code-keyword">for</span>(<span class="code-object">int</span> I = 0; I &lt; m_hellos.length; i++) { 
+                 <span class="code-object">System</span>.out.println(m_hellos[i].getMessage());
+             }
+       }
+}</pre>
+</div></div>
+
+<p>For this component, metadata could be:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+    <span class="code-tag">&lt;requires field=<span class="code-quote">"m_hellos"</span>/&gt;</span>
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+
+<p>To declare an aggregate field for field requirement, you only need
+to declare an array (instead of a scalar type). IPOJO will create and
+inject the service object array. iPOJO discover that the dependency is
+aggregate during the bytecode introspection.</p>
+
+<p><em>Note:</em> The synchronization is managed by iPOJO. As soon as
+you are 'touching' a dependency in a method, iPOJO ensure that you will
+keep these objects until the end of the method. Nested methods will
+share the same service object set.</p>
+
+<h4><a name="ServiceRequirementHandler-AggregateDependencywithfieldinjection:list,vector,collectionandset"></a>Aggregate Dependency with field injection: list, vector, collection and set</h4>
+<p>It is also possible to inject service objects inside fields of the type:</p>
+<ul>
+	<li>list</li>
+	<li>vector</li>
+	<li>collection</li>
+	<li>set</li>
+</ul>
+
+
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+     <span class="code-keyword">private</span> List m_hellos;
+     <span class="code-keyword">public</span> doSomething() {
+             <span class="code-keyword">for</span>(<span class="code-object">int</span> I = 0; I &lt; m_hellos.size(); i++) { 
+                 <span class="code-object">System</span>.out.println(((Hello) m_hellos.get(i)).
+                 getMessage());
+             }
+       }
+}</pre>
+</div></div>
+<p>For this component, metadata could be:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+    <span class="code-tag">&lt;requires field=<span class="code-quote">"m_hellos"</span> specification=<span class="code-quote">"o.a.f.i.Hello"</span>/&gt;</span>
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>In this case, just use the supported type that you want. iPOJO will
+automatically understand that it is an aggregate dependency, and will
+create the collection object containing service objects.<br>
+<em>Note:</em> The service specification (i.e. interface) cannot be
+discovered when using these types as the bytecode does not provide
+enough information. So, you have to indicate the required service
+interface (with the 'specification' attribute) in the requirement
+description.<br>
+<em>Note:</em> As in the previous case, the synchronization is managed
+by iPOJO. As soon as you are 'touching' a dependency in a method, iPOJO
+ensure that you will keep these objects until the end of the method.
+Nested methods will share the same service object set.</p>
+
+
+<h4><a name="ServiceRequirementHandler-AggregateDependencywithmethodinvocation"></a>Aggregate Dependency with method invocation</h4>
+
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+      <span class="code-keyword">private</span> List m_hellos= <span class="code-keyword">new</span> ArrayList();
+      <span class="code-keyword">private</span> void bindHello(Hello h) { m_hellos.add(h); }
+      <span class="code-keyword">private</span> void unbindHello(Hello h) { m_hellos.remove(h); }
+      <span class="code-keyword">public</span> <span class="code-keyword">synchronized</span> doSomething() {
+                  <span class="code-keyword">for</span>(<span class="code-object">int</span> I = 0; I &lt; m_hellos.size(); i++) { 
+                    <span class="code-object">System</span>.out.println(m_hellos.get(i).
+                    getMessage());
+                  }
+                }
+        }
+}</pre>
+</div></div>
+<p>This requirement is configured as following:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;requires  aggregate=<span class="code-quote">"true"</span>&gt;</span>
+    <span class="code-tag">&lt;callback type=<span class="code-quote">"bind"</span> method=<span class="code-quote">"bindHello"</span>&gt;</span>
+    <span class="code-tag">&lt;callback type=<span class="code-quote">"unbind"</span> method=<span class="code-quote">"unbindHello"</span>&gt;</span>
+<span class="code-tag">&lt;/requires&gt;</span></pre>
+</div></div>
+<p>In this case, iPOJO cannot detect if the dependency is aggregate or not. So, you need to add the '<em>aggregate</em>' attribute. The bindHello and unbindHello will be called each time a Hello service appears or disappears.<br>
+<em>Note:</em> To avoid the list modification during the loop, you need
+synchronized the block. Indeed, as the field is not an iPOJO
+requirement, iPOJO will not manage the synchronization.</p>
+
+<h3><a name="ServiceRequirementHandler-OptionalRequirement(nonaggregate)"></a>Optional Requirement (non-aggregate)</h3>
+
+<p>An optional requirement does not invalidate the instance despite no
+providers are available. Moreover, it is possible to inject a default
+service implementation when no <em>real</em> providers are available.</p>
+
+<h4><a name="ServiceRequirementHandler-OptionalRequirementwithfieldinjection"></a>Optional Requirement with field injection</h4>
+
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+         <span class="code-keyword">private</span> Hello m_hello;
+         <span class="code-keyword">public</span> doSomething() {  
+            <span class="code-object">System</span>.out.println(m_hello.getMesage());  
+         }
+}</pre>
+</div></div>
+<p>For this component, metadata could be:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+    <span class="code-tag">&lt;requires field=<span class="code-quote">"m_hello"</span> optional=<span class="code-quote">"true"</span>/&gt;</span>
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>To declare an optional requirement, you need to add the <em>'optional'</em> attribute. To avoid null pointer exception, iPOJO injects a <em>Nullable</em> object in the field when no service provider is available. The <em>nullable</em>
+object implements the service interface, but does nothing. Moreover, it
+is possible to set a default-implementation for the service. A
+default-implementation is a class implementing the service but used
+only when no others service providers are available. The
+default-implementation object will be injected instead of the <em>Nullable</em> objet. For further information <a href="#ServiceRequirementHandler-nullable" title="nullable on Service Requirement Handler">refer to the note about nullable object</a>.</p>
+
+<h4><a name="ServiceRequirementHandler-OptionalDependencywithmethodinvocation"></a>Optional Dependency with method invocation</h4>
+
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+     <span class="code-keyword">private</span> Hello m_hello;
+     <span class="code-keyword">public</span> void bindHello(Hello h) { m_hello = h; }
+     <span class="code-keyword">public</span> void unbindHello() { m_hello = <span class="code-keyword">null</span>; }
+     <span class="code-keyword">public</span> doSomething() { 
+          <span class="code-keyword">if</span>(m_hello != <span class="code-keyword">null</span>) { 
+              <span class="code-object">System</span>.out.println(m_hello.getMesage()); 
+          }
+    }
+}</pre>
+</div></div>
+<p>For this component, metadata should be:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+<span class="code-tag">&lt;requires optional=<span class="code-quote">"true"</span>&gt;</span>
+    <span class="code-tag">&lt;callback type=<span class="code-quote">"bind"</span> method=<span class="code-quote">"bindHello"</span>&gt;</span>
+    <span class="code-tag">&lt;callback type=<span class="code-quote">"unbind"</span> method=<span class="code-quote">"unbindHello"</span>&gt;</span>
+<span class="code-tag">&lt;/requires&gt;</span>
+...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>As for field requirement, the dependency metadata needs to contain
+the optional attribute. IPOJO invokes the method only when a 'real'
+service is available, so you need to test if m_hello is null before to
+use it.</p>
+
+<h3><a name="ServiceRequirementHandler-Aggregate&amp;OptionalRequirement"></a>Aggregate &amp; Optional Requirement</h3>
+
+<p>A dependency can be both aggregate and optional.</p>
+
+<h4><a name="ServiceRequirementHandler-Aggregate&amp;OptionalDependencywithfieldinjection"></a>Aggregate &amp; Optional Dependency with field injection</h4>
+
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+     <span class="code-keyword">private</span> Hello m_hellos[];
+     <span class="code-keyword">public</span> doSomething() {
+           <span class="code-keyword">for</span>(<span class="code-object">int</span> I = 0; I &lt; m_hellos.length; i++) { 
+             <span class="code-object">System</span>.out.println(m_hellos[i].getMessage());
+           }
+     }
+}</pre>
+</div></div>
+<p>For this component, metadata could be:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+<span class="code-tag">&lt;requires field=<span class="code-quote">"m_hellos"</span> optional=<span class="code-quote">"true"</span>/&gt;</span>
+...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>To declare an optional &amp; aggregate field requirement you need to
+write the optional attribute in the dependency metadata and to point on
+a field array. If no service available, iPOJO injects an empty array.</p>
+
+<h4><a name="ServiceRequirementHandler-Aggregate&amp;OptionalRequirementwithmethodinvocation"></a>Aggregate &amp; Optional Requirement with method invocation</h4>
+
+<div class="code"><div class="codeContent">
+<pre class="code-java"><span class="code-keyword">public</span> class HelloConsumer {
+     <span class="code-keyword">private</span> List m_hellos&lt;Hello&gt; = <span class="code-keyword">new</span> ArrayList&lt;Hello&gt;();
+     <span class="code-keyword">private</span> void bindHello(Hello h) { m_hellos.add(h); }
+     <span class="code-keyword">private</span> void unbindHello(Hello h) { m_hellos.remove(h); }
+     <span class="code-keyword">public</span> <span class="code-keyword">synchronized</span> doSomething() {
+               <span class="code-keyword">for</span>(<span class="code-object">int</span> I = 0; I &lt; m_hellos.size(); i++) { 
+                  <span class="code-object">System</span>.out.println(m_hellos.get(i).getMessage());
+               }
+     }
+}</pre>
+</div></div>
+<p>For this component, metadata could be:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;requires aggregate=<span class="code-quote">"true"</span> optional=<span class="code-quote">"true"</span>&gt;</span>
+     <span class="code-tag">&lt;callback type=<span class="code-quote">"bind"</span> method=<span class="code-quote">"bindHello"</span>&gt;</span>
+     <span class="code-tag">&lt;callback type=<span class="code-quote">"unbind"</span> method=<span class="code-quote">"unbindHello"</span>&gt;</span>
+<span class="code-tag">&lt;/requires&gt;</span></pre>
+</div></div>
+<p>In this case, you need to add the _'aggregate'_attribute and the
+_'optional'_attribute. The bindHello and unbindHello will be called
+each time a Hello service appears or disappears. These bind / unbind
+methods are not called when binding / unbinding a Nullable object (when
+both field and method are used).</p>
+
+<h3><a name="ServiceRequirementHandler-FilteredRequirement"></a>Filtered Requirement</h3>
+
+<p>A filtered dependency applies an LDAP filter on service provider.
+IPOJO reuses OSGi LDAP filter ability. The following metadata
+illustrates how to use filters:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+<span class="code-tag">&lt;requires filter=<span class="code-quote">"(language=fr)"</span>&gt;</span>
+     <span class="code-tag">&lt;callback type=<span class="code-quote">"bind"</span> method=<span class="code-quote">"bindHello"</span>&gt;</span>
+     <span class="code-tag">&lt;callback type=<span class="code-quote">"unbind"</span> method=<span class="code-quote">"unbindHello"</span>&gt;</span>
+<span class="code-tag">&lt;/requires&gt;</span>
+...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>To add a filter, just add a 'filter' attribute in your dependency
+containing the LDAP filter. iPOJO will select only provider matching
+with this filter.</p>
+
+<p>Moreover, filters can be customized instance by instance. It is
+possible to specialize / change / add the filter of a component in the
+instance description. It is useful when you want to create different
+instances of the same component, with different filter. To do it, you
+have to identify your dependency with an 'id' attribute. Then, you can
+adapt the filter of the dependency in the instance description by using
+the property "requires.filters". In this property you can specify each
+dependency identified by its id and the new value of the filter.</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml">&lt;component 
+   className=<span class="code-quote">"org.apache.felix.ipojo.example.FilteredDependency"</span> 
+   name=<span class="code-quote">"FOO"</span>&gt;
+	<span class="code-tag">&lt;requires field=<span class="code-quote">"m_foo"</span> fiter=<span class="code-quote">"(foo.property=FOO)"</span> id=<span class="code-quote">"id1"</span>&gt;</span>
+		<span class="code-tag">&lt;callback type=<span class="code-quote">"bind"</span> method=<span class="code-quote">"bind"</span>/&gt;</span>
+		<span class="code-tag">&lt;callback type=<span class="code-quote">"unbind"</span> method=<span class="code-quote">"unbind"</span>/&gt;</span>
+	<span class="code-tag">&lt;/requires&gt;</span>
+<span class="code-tag">&lt;/component&gt;</span>
+
+<span class="code-tag">&lt;instance name=<span class="code-quote">"FOO1"</span> component=<span class="code-quote">"FOO"</span>/&gt;</span>
+
+<span class="code-tag">&lt;instance name=<span class="code-quote">"FOO2"</span> component=<span class="code-quote">"FOO"</span>&gt;</span>
+
+	<span class="code-tag">&lt;property name=<span class="code-quote">"requires.filters"</span>&gt;</span>
+		<span class="code-tag">&lt;property name=<span class="code-quote">"id1"</span> value=<span class="code-quote">"(foo.property=BAR)"</span>/&gt;</span>
+	<span class="code-tag">&lt;/property&gt;</span>
+<span class="code-tag">&lt;/instance&gt;</span>
+
+<span class="code-tag">&lt;instance name=<span class="code-quote">"FOO3"</span> component=<span class="code-quote">"FOO"</span>&gt;</span>
+	<span class="code-tag">&lt;property name=<span class="code-quote">"requires.filters"</span>&gt;</span>
+		<span class="code-tag">&lt;property name=<span class="code-quote">"id1"</span> value=<span class="code-quote">"(foo.property=BAZ)"</span>/&gt;</span>
+	<span class="code-tag">&lt;/property&gt;</span>
+<span class="code-tag">&lt;/instance&gt;</span></pre>
+</div></div>
+<p>The FOO component type declares a service dependency with the 'id1'
+id. This dependency has no filter by default. The first instance is
+just an instance of the FOO component type and does not modify the
+dependency. The second one adds a filter to the declared dependency to
+target providers with foo.property = BAR. The last one adds another
+filter to the declared dependency. By using instance filter
+customization, it is possible to create complex applications where you
+avoid binding problems by filtering dependencies instance by instance.</p>
+
+<h3><a name="ServiceRequirementHandler-Targetingaspecificprovider"></a>Targeting a specific provider</h3>
+<p>A service dependency can choose a specific provider. To achieve
+this, add a 'from' attribute in your requirement description such as in:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+<span class="code-tag">&lt;requires from=<span class="code-quote">"MyHelloProvider"</span>&gt;</span>
+     <span class="code-tag">&lt;callback type=<span class="code-quote">"bind"</span> method=<span class="code-quote">"bindHello"</span>&gt;</span>
+     <span class="code-tag">&lt;callback type=<span class="code-quote">"unbind"</span> method=<span class="code-quote">"unbindHello"</span>&gt;</span>
+<span class="code-tag">&lt;/requires&gt;</span>
+...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>iPOJO maps the from attribute to a specific filter :
+'|(instance.name=MyHelloProvider)(service.pid=MyHelloProvider)'. Then
+the dependency can only be fulfilled by a service matching this filter.</p>
+
+<p>Moreover, from attributes can be customized instance by instance. It
+is possible to specialize / change / add a 'from' attribute of a
+component in the instance configuration. It is useful when you want to
+create different instances of the same component, with different 'from'
+clauses. To do it, you have to identify your dependency with an 'id'
+attribute. Then, you can adapt the 'from' of the dependency in the
+instance configuration by using the property "requires.from". In this
+property you can specify each dependency identified by its id and the
+'from' value.</p>
+
+<div class="code"><div class="codeContent">
+<pre class="code-xml">&lt;component 
+   className=<span class="code-quote">"org.apache.felix.ipojo.example.FilteredDependency"</span>
+   name=<span class="code-quote">"FOO"</span>&gt;
+	<span class="code-tag">&lt;requires field=<span class="code-quote">"m_foo"</span> id=<span class="code-quote">"id1"</span>&gt;</span>
+		<span class="code-tag">&lt;callback type=<span class="code-quote">"bind"</span> method=<span class="code-quote">"bind"</span>/&gt;</span>
+		<span class="code-tag">&lt;callback type=<span class="code-quote">"unbind"</span> method=<span class="code-quote">"unbind"</span>/&gt;</span>
+	<span class="code-tag">&lt;/requires&gt;</span>
+<span class="code-tag">&lt;/component&gt;</span>
+
+<span class="code-tag">&lt;instance name=<span class="code-quote">"FOO1"</span> component=<span class="code-quote">"FOO"</span>/&gt;</span>
+
+<span class="code-tag">&lt;instance name=<span class="code-quote">"FOO2"</span> component=<span class="code-quote">"FOO"</span>&gt;</span>
+	<span class="code-tag">&lt;property name=<span class="code-quote">"requires.from"</span>&gt;</span>
+		<span class="code-tag">&lt;property name=<span class="code-quote">"id1"</span> value=<span class="code-quote">"myprovider"</span>/&gt;</span>
+	<span class="code-tag">&lt;/property&gt;</span>
+<span class="code-tag">&lt;/instance&gt;</span>
+
+<span class="code-tag">&lt;instance name=<span class="code-quote">"FOO3"</span> component=<span class="code-quote">"FOO"</span>&gt;</span>
+	<span class="code-tag">&lt;property name=<span class="code-quote">"requires.from"</span>&gt;</span>
+		<span class="code-tag">&lt;property name=<span class="code-quote">"id1"</span> value=<span class="code-quote">"myotherprovider"</span>/&gt;</span>
+	<span class="code-tag">&lt;/property&gt;</span>
+<span class="code-tag">&lt;/instance&gt;</span></pre>
+</div></div>
+
+<p>The FOO component type declares a service dependency with the 'id1'
+id. This dependency has no 'from' attribute by default. The first
+instance is just an instance of the FOO component type and does not
+modify the dependency. The second one adds a 'from' attribute to the
+declared dependency to target the 'myprovider' provider. The last one
+adds another 'from' clause to the declared dependency.</p>
+
+
+<h2><a name="ServiceRequirementHandler-BindingPolicies"></a>Binding Policies</h2>
+
+<p>Three binding policies are supported inside iPOJO.</p>
+<ul>
+	<li>Dynamic policy (default): the binding are managed
+dynamically. At each injection, the same provider is injected if the
+provider is always available. Else a new one is chosen. For aggregate
+dependency, the array order does not change; new providers are placed
+at the end of the array.</li>
+	<li>Static policy: the binding is
+static. So, once bound a provider cannot disappear. If it disappears,
+the instance is invalidated and cannot be revalidated without stopping
+and restarting the instance.</li>
+	<li>Dynamic-priority policy: the
+binding is managed dynamically but the injected provider is selected by
+using a ranking policy. Two injections can return two different
+providers, is a new provider is 'better' than the previous one, despite
+the first one is always available. For aggregate dependency, the array
+is sorted.</li>
+</ul>
+
+
+
+<p>A static binding is declared as following:</p>
+
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+    <span class="code-tag">&lt;requires field=<span class="code-quote">"m_hellos"</span> policy=<span class="code-quote">"static"</span>/&gt;</span>
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+
+<p>A dynamic-priority binding is declared as following:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+    <span class="code-tag">&lt;requires field=<span class="code-quote">"m_hellos"</span> policy=<span class="code-quote">"dynamic-priority"</span>/&gt;</span>
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>By default, the dynamic-priority policy uses the OSGi service
+ranking policy. However, it is possible to customize the policy by
+adding the '<em>comparator</em>' attribute. This attribute indicates
+the class name of a class implementing the java.util.Comparator
+interface. IPOJO will create an instance of your comparator and use it
+to sort service references (so your customized comparator needs to be
+able to sort OSGi Service Reference).</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...HelloConsumer"</span>&gt;</span>
+    <span class="code-tag">&lt;requires field=<span class="code-quote">"m_hellos"</span> policy=<span class="code-quote">"dynamic-priority"</span> comparator=<span class="code-quote">"my.great.Comparator"</span>/&gt;</span>
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+
+<p><a name="ServiceRequirementHandler-nullable"></a></p>
+<h2><a name="ServiceRequirementHandler-Noteaboutnullableobject&amp;defaultimplementation"></a>Note about nullable object &amp; default-implementation</h2>
+
+<p>The instance implementation can use an optional dependency without
+any checking. Indeed, when an instance declares an optional dependency
+using field injection, iPOJO create on the fly a Nullable class
+implementing the service specification but doing nothing (mock object).
+Therefore, iPOJO cannot return a service to the instance, for an
+optional dependency, it returns a nullable object.</p>
+
+<p>A nullable object returns:</p>
+<ul>
+	<li>Null when the method returns an object</li>
+	<li>0 when the method returns an int, log, byte, short, char, float or a double</li>
+	<li>False when the method return a boolean</li>
+</ul>
+
+
+<p>You can check if the returned object is a nullable object with the test: <em>"myservice instanceof Nullable"</em>.</p>
+
+<p>You can disable the Nullable pattern too (activated by default). In this case, iPOJO will inject <em>null</em> instead of a <em>Nullable</em> object. So, you can just test if your field is equals to <em>null</em>
+to check if the service is available. To disable the Nullable pattern,
+you need to add the 'nullable="false"' attribute in your service
+dependency description as follows:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...LogExample"</span>&gt;</span>
+    <span class="code-tag">&lt;requires field=<span class="code-quote">"m_log"</span> optional=<span class="code-quote">"true"</span> nullable=<span class="code-quote">"false"</span>/&gt;</span>
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+
+<p>However, you can also indicate a <em>default-implementation</em> for
+your optional service. In this case, if no providers are found, iPOJO
+creates an instance of the default-implementation and injects it. The
+default-implementation attribute describes the class name of your
+implementation. The given class <b>MUST</b> implement the required service interface.</p>
+
+<p>For example, the following component uses a default implementation for a Log Service dependency:</p>
+<div class="code"><div class="codeContent">
+<pre class="code-xml"><span class="code-tag">&lt;component classname=<span class="code-quote">"...LogExample"</span>&gt;</span>
+    &lt;requires field=<span class="code-quote">"m_log"</span> optional=<span class="code-quote">"true"</span> 
+    default-implementation=
+       <span class="code-quote">"org.apache.felix.ipojo.example.default.MyLogService"</span>/&gt;
+    ...
+<span class="code-tag">&lt;/component&gt;</span></pre>
+</div></div>
+<p>If the log service is not available, iPOJO creates an object of the
+'org.apache.felix.ipojo.example.default.MyLogService' class. This
+object is injected instead of a Nullable object. For instance, the
+default implementation can print messages on the System.err stream. The
+nullable object does no display anything.</p>
+
+
+<p><a name="ServiceRequirementHandler-callbacks"></a></p>
+<h2><a name="ServiceRequirementHandler-NoteaboutCallbacks"></a>Note about Callbacks</h2>
+<p>Dependency manages two type of callback: bind and unbind. A callback
+with a type "bind" is called each type that a service provider arrives
+and the binding is necessary. According to the cardinality of the
+dependency it means:</p>
+<ul>
+	<li>Simple dependency : at the firs binding and at      each rebinding to another service provider</li>
+	<li>Aggregate dependencies: each time that a service      provider arrives</li>
+</ul>
+
+
+<p>An unbind callback is called each time that a <b>used</b> service
+provider goes away. For a simple dependency this method is called each
+time that the used service provider goes away. For a multiple
+dependency this method is called each time that a service provider goes
+away.</p>
+
+<p>The method can receive in argument the service object or the service
+reference (in order to obtain service properties). The bind methods are
+delayed since a POJO object is created.</p>
+
+<p><a name="ServiceRequirementHandler-discovery"></a></p>
+<h2><a name="ServiceRequirementHandler-Noteonserviceinterfacediscovery"></a>Note on service interface discovery</h2>
+
+<p>The <tt>specification</tt> attribute is generally optional except
+when iPOJO cannot discover the type of the service. iPOJO cannot infer
+the type when the dependency has no field and callbacks do not receive
+the service object in parameter. In this case, you need to declare the
+service interface.</p>
+</td>
+<td class="confluenceTd" valign="top" width="20%">
+<h6><a name="ServiceRequirementHandler-Overview"></a><b>Overview</b></h6>
+<ul>
+	<li><a href="http://felix.apache.org/site/apache-felix-ipojo.html" title="Apache Felix iPOJO">Home Page</a></li>
+	<li><a href="http://felix.apache.org/site/apache-felix-ipojo-feature-overview.html" title="Apache Felix iPOJO Feature Overview">iPOJO Feature Overview</a></li>
+	<li><a href="http://felix.apache.org/site/download.html" title="Download">Download &amp; Install </a></li>
+</ul>
+
+
+<h6><a name="ServiceRequirementHandler-GettingStarted"></a><b>Getting Started</b></h6>
+<ul>
+	<li><a href="http://felix.apache.org/site/ipojo-in-10-minutes.html" title="iPOJO in 10 minutes">iPOJO in 10 minutes</a></li>
+	<li><a href="http://felix.apache.org/site/how-to-use-ipojo-annotations.html" title="How to use iPOJO Annotations">How to use iPOJO Annotations</a></li>
+	<li><a href="http://felix.apache.org/site/ipojo-hello-word-maven-based-tutorial.html" title="iPOJO Hello Word (Maven-Based) tutorial">iPOJO Hello Word (Maven-Based) tutorial</a></li>
+	<li><a href="http://felix.apache.org/site/ipojo-advanced-tutorial.html" title="iPOJO Advanced Tutorial">iPOJO Advanced Tutorial</a></li>
+	<li><a href="http://felix.apache.org/site/ipojo-composition-tutorial.html" title="iPOJO Composition Tutorial">iPOJO Composition Tutorial</a></li>
+</ul>
+
+
+<h6><a name="ServiceRequirementHandler-UserGuide"></a><b>User Guide</b></h6>
+<ul>
+	<li><a href="http://felix.apache.org/site/describing-components.html" title="Describing components">Describing components (handler list) </a></li>
+	<li><a href="http://felix.apache.org/site/using-xml-schemas.html" title="Using XML Schemas">Using XML Schemas</a></li>
+	<li><a href="http://felix.apache.org/site/apache-felix-ipojo-testing-components.html" title="apache-felix-ipojo-testing-components">Testing components</a></li>
+	<li><a href="http://felix.apache.org/site/ipojo-advanced-topics.html" title="iPOJO Advanced Topics">Advanced Topics</a></li>
+	<li><a href="http://felix.apache.org/site/ipojo-faq.html" title="iPOJO FAQ">FAQ</a></li>
+</ul>
+
+
+<h6><a name="ServiceRequirementHandler-Tools"></a><b>Tools</b></h6>
+<ul>
+	<li><a href="http://felix.apache.org/site/ipojo-eclipse-plug-in.html" title="iPOJO Eclipse Plug-in">iPOJO Eclipse Plug-in</a></li>
+	<li><a href="http://felix.apache.org/site/ipojo-ant-task.html" title="iPOJO Ant Task">iPOJO Ant Task</a></li>
+	<li><a href="http://felix.apache.org/site/ipojo-maven-plug-in.html" title="iPOJO Maven Plug-in">iPOJO Maven Plug-in</a></li>
+	<li><a href="http://felix.apache.org/site/apache-felix-ipojo-junit4osgi.html" title="apache-felix-ipojo-junit4osgi">Junit4OSGi</a></li>
+	<li><a href="http://felix.apache.org/site/ipojo-concepts-overview.html" title="iPOJO Concepts Overview">iPOJO concepts overview</a></li>
+</ul>
+
+
+<h6><a name="ServiceRequirementHandler-DeveloperGuide"></a><b>Developer Guide</b></h6>
+<ul>
+	<li>API: <span class="nobr"><a href="http://people.apache.org/%7Eclement/ipojo/api/1.0/" title="Visit page outside Confluence" rel="nofollow">1.0<sup><img class="rendericon" src="service-requirement-handler_files/linkext7.gif" alt="" align="absmiddle" border="0" width="7" height="7"></sup></a></span></li>
+	<li><a href="http://felix.apache.org/site/how-to-write-your-own-handler.html" title="How to write your own handler">How to write your own handler</a></li>
+	<li><a href="http://felix.apache.org/site/how-to-use-ipojo-manipulation-metadata.html" title="How to use iPOJO Manipulation Metadata">How to use iPOJO Manipulation Metadata</a></li>
+	<li><a href="http://felix.apache.org/site/dive-into-the-ipojo-manipulation-depths.html" title="Dive into the iPOJO Manipulation depths">Dive into the iPOJO Manipulation depths</a></li>
+</ul>
+
+
+<h6><a name="ServiceRequirementHandler-Misc&amp;Contact"></a><b>Misc &amp; Contact</b></h6>
+<ul>
+	<li><a href="http://felix.apache.org/site/apache-felix-ipojo-issuestracker.html" title="apache-felix-ipojo-issuestracker">Issues Tracker</a></li>
+	<li><a href="http://felix.apache.org/site/apache-felix-ipojo-supportedvms.html" title="apache-felix-ipojo-supportedVMs">Supported JVMs</a></li>
+	<li><a href="http://felix.apache.org/site/apache-felix-ipojo-supportedosgi.html" title="apache-felix-ipojo-supportedOSGi">Supported OSGi Implementations</a></li>
+	<li><span class="nobr"><a href="http://ipojo-dark-side.blogspot.com/" title="Visit page outside Confluence" rel="nofollow">iPOJO's Dark Side Blog<sup><img class="rendericon" src="service-requirement-handler_files/linkext7.gif" alt="" align="absmiddle" border="0" width="7" height="7"></sup></a></span></li>
+	<li><a href="http://felix.apache.org/site/future-ideas.html" title="Future Ideas">Future Ideas</a></li>
+	<li><a href="http://felix.apache.org/site/contact.html" title="Contact">Contact</a></li>
+	<li><a href="http://felix.apache.org/site/related-works.html" title="Related Works">Related Works</a></li>
+	<li><a href="http://felix.apache.org/site/article-presentations.html" title="Article &amp; Presentations">Article &amp; Presentations</a></li>
+</ul>
+
+
+<hr>
+<div class="" align="center">
+<p><span class="nobr"><a href="http://cwiki.apache.org/confluence/createrssfeed.action?types=blogpost&amp;statuses=created&amp;statuses=modified&amp;spaces=FELIX&amp;labelString=iPOJO&amp;rssType=atom&amp;maxResults=10&amp;timeSpan=5&amp;publicFeed=true&amp;title=iPOJO%20Atom%20Feed" title="Stay tuned!" rel="nofollow"><img src="service-requirement-handler_files/feed-icon-32x32.png" align="absmiddle" border="0"><sup><img class="rendericon" src="service-requirement-handler_files/linkext7.gif" alt="" align="absmiddle" border="0" width="7" height="7"></sup></a></span></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 src="service-requirement-handler_files/ga.js" type="text/javascript"></script>
+<script type="text/javascript">
+var pageTracker = _gat._getTracker("UA-1518442-4");
+pageTracker._trackPageview();
+</script>
+</td></tr></tbody></table>
+    </div>
+  </body></html>
\ No newline at end of file

Propchange: felix/trunk/ipojo/core/doc/service-requirement-handler.html
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: felix/trunk/ipojo/core/doc/service-requirement-handler_files/apache.png
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/doc/service-requirement-handler_files/apache.png?rev=734735&view=auto
==============================================================================
Binary file - no diff available.

Propchange: felix/trunk/ipojo/core/doc/service-requirement-handler_files/apache.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: felix/trunk/ipojo/core/doc/service-requirement-handler_files/button.html
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/doc/service-requirement-handler_files/button.html?rev=734735&view=auto
==============================================================================
--- felix/trunk/ipojo/core/doc/service-requirement-handler_files/button.html (added)
+++ felix/trunk/ipojo/core/doc/service-requirement-handler_files/button.html Thu Jan 15 07:35:17 2009
@@ -0,0 +1,5 @@
+<html><head>
+<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><!-- ads start -->
+</head><body><a href="http://eu.apachecon.com/c/aceu2009/" target="_blank"><img src="button_data/2009-europe-125x125.png" title="ApacheCon Europe 2009" border="0" width="125" height="125"></a>
+<!-- ads end -->
+</body></html>
\ No newline at end of file

Propchange: felix/trunk/ipojo/core/doc/service-requirement-handler_files/button.html
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: felix/trunk/ipojo/core/doc/service-requirement-handler_files/button_data/2009-europe-125x125.png
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/doc/service-requirement-handler_files/button_data/2009-europe-125x125.png?rev=734735&view=auto
==============================================================================
Binary file - no diff available.

Propchange: felix/trunk/ipojo/core/doc/service-requirement-handler_files/button_data/2009-europe-125x125.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: felix/trunk/ipojo/core/doc/service-requirement-handler_files/feed-icon-32x32.png
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/doc/service-requirement-handler_files/feed-icon-32x32.png?rev=734735&view=auto
==============================================================================
Binary file - no diff available.

Propchange: felix/trunk/ipojo/core/doc/service-requirement-handler_files/feed-icon-32x32.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: felix/trunk/ipojo/core/doc/service-requirement-handler_files/ga.js
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/doc/service-requirement-handler_files/ga.js?rev=734735&view=auto
==============================================================================
--- felix/trunk/ipojo/core/doc/service-requirement-handler_files/ga.js (added)
+++ felix/trunk/ipojo/core/doc/service-requirement-handler_files/ga.js Thu Jan 15 07:35:17 2009
@@ -0,0 +1,41 @@
+var _gat=new Object({c:"length",lb:"4.3",m:"cookie",b:undefined,cb:function(d,a){this.zb=d;this.Nb=a},r:"__utma=",W:"__utmb=",ma:"__utmc=",Ta:"__utmk=",na:"__utmv=",oa:"__utmx=",Sa:"GASO=",X:"__utmz=",lc:"http://www.google-analytics.com/__utm.gif",mc:"https://ssl.google-analytics.com/__utm.gif",Wa:"utmcid=",Ya:"utmcsr=",$a:"utmgclid=",Ua:"utmccn=",Xa:"utmcmd=",Za:"utmctr=",Va:"utmcct=",Hb:false,_gasoDomain:undefined,_gasoCPath:undefined,e:window,a:document,k:navigator,t:function(d){var a=1,c=0,h,
+o;if(!_gat.q(d)){a=0;for(h=d[_gat.c]-1;h>=0;h--){o=d.charCodeAt(h);a=(a<<6&268435455)+o+(o<<14);c=a&266338304;a=c!=0?a^c>>21:a}}return a},C:function(d,a,c){var h=_gat,o="-",k,l,s=h.q;if(!s(d)&&!s(a)&&!s(c)){k=h.w(d,a);if(k>-1){l=d.indexOf(c,k);if(l<0)l=d[h.c];o=h.F(d,k+h.w(a,"=")+1,l)}}return o},Ea:function(d){var a=false,c=0,h,o;if(!_gat.q(d)){a=true;for(h=0;h<d[_gat.c];h++){o=d.charAt(h);c+="."==o?1:0;a=a&&c<=1&&(0==h&&"-"==o||_gat.P(".0123456789",o))}}return a},d:function(d,a){var c=encodeURIComponent;
+return c instanceof Function?(a?encodeURI(d):c(d)):escape(d)},J:function(d,a){var c=decodeURIComponent,h;d=d.split("+").join(" ");if(c instanceof Function)try{h=a?decodeURI(d):c(d)}catch(o){h=unescape(d)}else h=unescape(d);return h},Db:function(d){return d&&d.hash?_gat.F(d.href,_gat.w(d.href,"#")):""},q:function(d){return _gat.b==d||"-"==d||""==d},Lb:function(d){return d[_gat.c]>0&&_gat.P(" \n\r\t",d)},P:function(d,a){return _gat.w(d,a)>-1},h:function(d,a){d[d[_gat.c]]=a},T:function(d){return d.toLowerCase()},
+z:function(d,a){return d.split(a)},w:function(d,a){return d.indexOf(a)},F:function(d,a,c){c=_gat.b==c?d[_gat.c]:c;return d.substring(a,c)},uc:function(){var d=_gat.b,a=window;if(a&&a.gaGlobal&&a.gaGlobal.hid)d=a.gaGlobal.hid;else{d=Math.round(Math.random()*2147483647);a.gaGlobal=a.gaGlobal?a.gaGlobal:{};a.gaGlobal.hid=d}return d},wa:function(){return Math.round(Math.random()*2147483647)},Gc:function(){return(_gat.wa()^_gat.vc())*2147483647},vc:function(){var d=_gat.k,a=_gat.a,c=_gat.e,h=a[_gat.m]?
+a[_gat.m]:"",o=c.history[_gat.c],k,l,s=[d.appName,d.version,d.language?d.language:d.browserLanguage,d.platform,d.userAgent,d.javaEnabled()?1:0].join("");if(c.screen)s+=c.screen.width+"x"+c.screen.height+c.screen.colorDepth;else if(c.java){l=java.awt.Toolkit.getDefaultToolkit().getScreenSize();s+=l.screen.width+"x"+l.screen.height}s+=h;s+=a.referrer?a.referrer:"";k=s[_gat.c];while(o>0)s+=o--^k++;return _gat.t(s)}});_gat.hc=function(){var d=this,a=_gat.cb;function c(h,o){return new a(h,o)}d.db="utm_campaign";d.eb="utm_content";d.fb="utm_id";d.gb="utm_medium";d.hb="utm_nooverride";d.ib="utm_source";d.jb="utm_term";d.kb="gclid";d.pa=0;d.I=0;d.wb="15768000";d.Tb="1800";d.ea=[];d.ga=[];d.Ic="cse";d.Gb="q";d.ab="google";d.fa=[c(d.ab,d.Gb),c("yahoo","p"),c("msn","q"),c("aol","query"),c("aol","encquery"),c("lycos","query"),c("ask","q"),c("altavista","q"),c("netscape","query"),c("cnn","query"),c("looksmart","qt"),c("about",
+"terms"),c("mamma","query"),c("alltheweb","q"),c("gigablast","q"),c("voila","rdata"),c("virgilio","qs"),c("live","q"),c("baidu","wd"),c("alice","qs"),c("yandex","text"),c("najdi","q"),c("aol","q"),c("club-internet","query"),c("mama","query"),c("seznam","q"),c("search","q"),c("wp","szukaj"),c("onet","qt"),c("netsprint","q"),c("google.interia","q"),c("szukacz","q"),c("yam","k"),c("pchome","q"),c("kvasir","searchExpr"),c("sesam","q"),c("ozu","q"),c("terra","query"),c("nostrum","query"),c("mynet","q"),
+c("ekolay","q"),c("search.ilse","search_for")];d.B=undefined;d.Kb=false;d.p="/";d.ha=100;d.Da="/__utm.gif";d.ta=1;d.ua=1;d.G="|";d.sa=1;d.qa=1;d.pb=1;d.g="auto";d.D=1;d.Ga=1000;d.Yc=10;d.nc=10;d.Zc=0.2};_gat.Y=function(d,a){var c,h,o,k,l,s,q,f=this,n=_gat,w=n.q,x=n.c,g,z=a;f.a=d;function B(i){var b=i instanceof Array?i.join("."):"";return w(b)?"-":b}function A(i,b){var e=[],j;if(!w(i)){e=n.z(i,".");if(b)for(j=0;j<e[x];j++)if(!n.Ea(e[j]))e[j]="-"}return e}function p(){return u(63072000000)}function u(i){var b=new Date,e=new Date(b.getTime()+i);return"expires="+e.toGMTString()+"; "}function m(i,b){f.a[n.m]=i+"; path="+z.p+"; "+b+f.Cc()}function r(i,b,e){var j=f.V,t,v;for(t=0;t<j[x];t++){v=j[t][0];
+v+=w(b)?b:b+j[t][4];j[t][2](n.C(i,v,e))}}f.Jb=function(){return n.b==g||g==f.t()};f.Ba=function(){return l?l:"-"};f.Wb=function(i){l=i};f.Ma=function(i){g=n.Ea(i)?i*1:"-"};f.Aa=function(){return B(s)};f.Na=function(i){s=A(i)};f.Hc=function(){return g?g:"-"};f.Cc=function(){return w(z.g)?"":"domain="+z.g+";"};f.ya=function(){return B(c)};f.Ub=function(i){c=A(i,1)};f.K=function(){return B(h)};f.La=function(i){h=A(i,1)};f.za=function(){return B(o)};f.Vb=function(i){o=A(i,1)};f.Ca=function(){return B(k)};
+f.Xb=function(i){k=A(i);for(var b=0;b<k[x];b++)if(b<4&&!n.Ea(k[b]))k[b]="-"};f.Dc=function(){return q};f.Uc=function(i){q=i};f.pc=function(){c=[];h=[];o=[];k=[];l=n.b;s=[];g=n.b};f.t=function(){var i="",b;for(b=0;b<f.V[x];b++)i+=f.V[b][1]();return n.t(i)};f.Ha=function(i){var b=f.a[n.m],e=false;if(b){r(b,i,";");f.Ma(f.t());e=true}return e};f.Rc=function(i){r(i,"","&");f.Ma(n.C(i,n.Ta,"&"))};f.Wc=function(){var i=f.V,b=[],e;for(e=0;e<i[x];e++)n.h(b,i[e][0]+i[e][1]());n.h(b,n.Ta+f.t());return b.join("&")};
+f.bd=function(i,b){var e=f.V,j=z.p,t;f.Ha(i);z.p=b;for(t=0;t<e[x];t++)if(!w(e[t][1]()))e[t][3]();z.p=j};f.dc=function(){m(n.r+f.ya(),p())};f.Pa=function(){m(n.W+f.K(),u(z.Tb*1000))};f.ec=function(){m(n.ma+f.za(),"")};f.Ra=function(){m(n.X+f.Ca(),u(z.wb*1000))};f.fc=function(){m(n.oa+f.Ba(),p())};f.Qa=function(){m(n.na+f.Aa(),p())};f.cd=function(){m(n.Sa+f.Dc(),"")};f.V=[[n.r,f.ya,f.Ub,f.dc,"."],[n.W,f.K,f.La,f.Pa,""],[n.ma,f.za,f.Vb,f.ec,""],[n.oa,f.Ba,f.Wb,f.fc,""],[n.X,f.Ca,f.Xb,f.Ra,"."],[n.na,
+f.Aa,f.Na,f.Qa,"."]]};_gat.jc=function(d){var a=this,c=_gat,h=d,o,k=function(l){var s=(new Date).getTime(),q;q=(s-l[3])*(h.Zc/1000);if(q>=1){l[2]=Math.min(Math.floor(l[2]*1+q),h.nc);l[3]=s}return l};a.O=function(l,s,q,f,n,w,x){var g,z=h.D,B=q.location;if(!o)o=new c.Y(q,h);o.Ha(f);g=c.z(o.K(),".");if(g[1]<500||n){if(w)g=k(g);if(n||!w||g[2]>=1){if(!n&&w)g[2]=g[2]*1-1;g[1]=g[1]*1+1;l="?utmwv="+_gat.lb+"&utmn="+c.wa()+(c.q(B.hostname)?"":"&utmhn="+c.d(B.hostname))+(h.ha==100?"":"&utmsp="+c.d(h.ha))+l;if(0==z||2==z){var A=
+new Image(1,1);A.src=h.Da+l;var p=2==z?function(){}:x||function(){};A.onload=p}if(1==z||2==z){var u=new Image(1,1);u.src=("https:"==B.protocol?c.mc:c.lc)+l+"&utmac="+s+"&utmcc="+a.wc(q,f);u.onload=x||function(){}}}}o.La(g.join("."));o.Pa()};a.wc=function(l,s){var q=[],f=[c.r,c.X,c.na,c.oa],n,w=l[c.m],x;for(n=0;n<f[c.c];n++){x=c.C(w,f[n]+s,";");if(!c.q(x))c.h(q,f[n]+x+";")}return c.d(q.join("+"))}};_gat.i=function(){this.la=[]};_gat.i.bb=function(d,a,c,h,o,k){var l=this;l.cc=d;l.Oa=a;l.L=c;l.sb=h;l.Pb=o;l.Qb=k};_gat.i.bb.prototype.S=function(){var d=this,a=_gat.d;return"&"+["utmt=item","utmtid="+a(d.cc),"utmipc="+a(d.Oa),"utmipn="+a(d.L),"utmiva="+a(d.sb),"utmipr="+a(d.Pb),"utmiqt="+a(d.Qb)].join("&")};_gat.i.$=function(d,a,c,h,o,k,l,s){var q=this;q.v=d;q.ob=a;q.bc=c;q.ac=h;q.Yb=o;q.ub=k;q.$b=l;q.xb=s;q.ca=[]};_gat.i.$.prototype.mb=function(d,a,c,h,o){var k=this,l=k.Eb(d),s=k.v,q=_gat;if(q.b==
+l)q.h(k.ca,new q.i.bb(s,d,a,c,h,o));else{l.cc=s;l.Oa=d;l.L=a;l.sb=c;l.Pb=h;l.Qb=o}};_gat.i.$.prototype.Eb=function(d){var a,c=this.ca,h;for(h=0;h<c[_gat.c];h++)a=d==c[h].Oa?c[h]:a;return a};_gat.i.$.prototype.S=function(){var d=this,a=_gat.d;return"&"+["utmt=tran","utmtid="+a(d.v),"utmtst="+a(d.ob),"utmtto="+a(d.bc),"utmttx="+a(d.ac),"utmtsp="+a(d.Yb),"utmtci="+a(d.ub),"utmtrg="+a(d.$b),"utmtco="+a(d.xb)].join("&")};_gat.i.prototype.nb=function(d,a,c,h,o,k,l,s){var q=this,f=_gat,n=q.xa(d);if(f.b==
+n){n=new f.i.$(d,a,c,h,o,k,l,s);f.h(q.la,n)}else{n.ob=a;n.bc=c;n.ac=h;n.Yb=o;n.ub=k;n.$b=l;n.xb=s}return n};_gat.i.prototype.xa=function(d){var a,c=this.la,h;for(h=0;h<c[_gat.c];h++)a=d==c[h].v?c[h]:a;return a};_gat.gc=function(d){var a=this,c="-",h=_gat,o=d;a.Ja=screen;a.qb=!self.screen&&self.java?java.awt.Toolkit.getDefaultToolkit():h.b;a.a=document;a.e=window;a.k=navigator;a.Ka=c;a.Sb=c;a.tb=c;a.Ob=c;a.Mb=1;a.Bb=c;function k(){var l,s,q,f,n="ShockwaveFlash",w="$version",x=a.k?a.k.plugins:h.b;if(x&&x[h.c]>0)for(l=0;l<x[h.c]&&!q;l++){s=x[l];if(h.P(s.name,"Shockwave Flash"))q=h.z(s.description,"Shockwave Flash ")[1]}else{n=n+"."+n;try{f=new ActiveXObject(n+".7");q=f.GetVariable(w)}catch(g){}if(!q)try{f=
+new ActiveXObject(n+".6");q="WIN 6,0,21,0";f.AllowScriptAccess="always";q=f.GetVariable(w)}catch(z){}if(!q)try{f=new ActiveXObject(n);q=f.GetVariable(w)}catch(z){}if(q){q=h.z(h.z(q," ")[1],",");q=q[0]+"."+q[1]+" r"+q[2]}}return q?q:c}a.xc=function(){var l;if(self.screen){a.Ka=a.Ja.width+"x"+a.Ja.height;a.Sb=a.Ja.colorDepth+"-bit"}else if(a.qb)try{l=a.qb.getScreenSize();a.Ka=l.width+"x"+l.height}catch(s){}a.Ob=h.T(a.k&&a.k.language?a.k.language:(a.k&&a.k.browserLanguage?a.k.browserLanguage:c));a.Mb=
+a.k&&a.k.javaEnabled()?1:0;a.Bb=o?k():c;a.tb=h.d(a.a.characterSet?a.a.characterSet:(a.a.charset?a.a.charset:c))};a.Xc=function(){return"&"+["utmcs="+h.d(a.tb),"utmsr="+a.Ka,"utmsc="+a.Sb,"utmul="+a.Ob,"utmje="+a.Mb,"utmfl="+h.d(a.Bb)].join("&")}};_gat.n=function(d,a,c,h,o){var k=this,l=_gat,s=l.q,q=l.b,f=l.P,n=l.C,w=l.T,x=l.z,g=l.c;k.a=a;k.f=d;k.Rb=c;k.ja=h;k.o=o;function z(p){return s(p)||"0"==p||!f(p,"://")}function B(p){var u="";p=w(x(p,"://")[1]);if(f(p,"/")){p=x(p,"/")[1];if(f(p,"?"))u=x(p,"?")[0]}return u}function A(p){var u="";u=w(x(p,"://")[1]);if(f(u,"/"))u=x(u,"/")[0];return u}k.Fc=function(p){var u=k.Fb(),m=k.o;return new l.n.s(n(p,m.fb+"=","&"),n(p,m.ib+"=","&"),n(p,m.kb+"=","&"),k.ba(p,m.db,"(not set)"),k.ba(p,m.gb,"(not set)"),
+k.ba(p,m.jb,u&&!s(u.R)?l.J(u.R):q),k.ba(p,m.eb,q))};k.Ib=function(p){var u=A(p),m=B(p);if(f(u,k.o.ab)){p=x(p,"?").join("&");if(f(p,"&"+k.o.Gb+"="))if(m==k.o.Ic)return true}return false};k.Fb=function(){var p,u,m=k.Rb,r,i,b=k.o.fa;if(z(m)||k.Ib(m))return;p=A(m);for(r=0;r<b[g];r++){i=b[r];if(f(p,w(i.zb))){m=x(m,"?").join("&");if(f(m,"&"+i.Nb+"=")){u=x(m,"&"+i.Nb+"=")[1];if(f(u,"&"))u=x(u,"&")[0];return new l.n.s(q,i.zb,q,"(organic)","organic",u,q)}}}};k.ba=function(p,u,m){var r=n(p,u+"=","&"),i=!s(r)?
+l.J(r):(!s(m)?m:"-");return i};k.Nc=function(p){var u=k.o.ea,m=false,r,i;if(p&&"organic"==p.da){r=w(l.J(p.R));for(i=0;i<u[g];i++)m=m||w(u[i])==r}return m};k.Ec=function(){var p="",u="",m=k.Rb;if(z(m)||k.Ib(m))return;p=w(x(m,"://")[1]);if(f(p,"/")){u=l.F(p,l.w(p,"/"));if(f(u,"?"))u=x(u,"?")[0];p=x(p,"/")[0]}if(0==l.w(p,"www."))p=l.F(p,4);return new l.n.s(q,p,q,"(referral)","referral",q,u)};k.sc=function(p){var u="";if(k.o.pa){u=l.Db(p);u=""!=u?u+"&":u}u+=p.search;return u};k.zc=function(){return new l.n.s(q,
+"(direct)",q,"(direct)","(none)",q,q)};k.Oc=function(p){var u=false,m,r,i=k.o.ga;if(p&&"referral"==p.da){m=w(l.d(p.ia));for(r=0;r<i[g];r++)u=u||f(m,w(i[r]))}return u};k.U=function(p){return q!=p&&p.Fa()};k.yc=function(p,u){var m="",r="-",i,b,e=0,j,t,v=k.f;if(!p)return"";t=k.a[l.m]?k.a[l.m]:"";m=k.sc(k.a.location);if(k.o.I&&p.Jb()){r=p.Ca();if(!s(r)&&!f(r,";")){p.Ra();return""}}r=n(t,l.X+v+".",";");i=k.Fc(m);if(k.U(i)){b=n(m,k.o.hb+"=","&");if("1"==b&&!s(r))return""}if(!k.U(i)){i=k.Fb();if(!s(r)&&
+k.Nc(i))return""}if(!k.U(i)&&u){i=k.Ec();if(!s(r)&&k.Oc(i))return""}if(!k.U(i))if(s(r)&&u)i=k.zc();if(!k.U(i))return"";if(!s(r)){var y=x(r,"."),E=new l.n.s;E.Cb(y.slice(4).join("."));j=w(E.ka())==w(i.ka());e=y[3]*1}if(!j||u){var F=n(t,l.r+v+".",";"),I=F.lastIndexOf("."),G=I>9?l.F(F,I+1)*1:0;e++;G=0==G?1:G;p.Xb([v,k.ja,G,e,i.ka()].join("."));p.Ra();return"&utmcn=1"}else return"&utmcr=1"}};_gat.n.s=function(d,a,c,h,o,k,l){var s=this;s.v=d;s.ia=a;s.ra=c;s.L=h;s.da=o;s.R=k;s.vb=l};_gat.n.s.prototype.ka=
+function(){var d=this,a=_gat,c=[],h=[[a.Wa,d.v],[a.Ya,d.ia],[a.$a,d.ra],[a.Ua,d.L],[a.Xa,d.da],[a.Za,d.R],[a.Va,d.vb]],o,k;if(d.Fa())for(o=0;o<h[a.c];o++)if(!a.q(h[o][1])){k=h[o][1].split("+").join("%20");k=k.split(" ").join("%20");a.h(c,h[o][0]+k)}return c.join("|")};_gat.n.s.prototype.Fa=function(){var d=this,a=_gat.q;return!(a(d.v)&&a(d.ia)&&a(d.ra))};_gat.n.s.prototype.Cb=function(d){var a=this,c=_gat,h=function(o){return c.J(c.C(d,o,"|"))};a.v=h(c.Wa);a.ia=h(c.Ya);a.ra=h(c.$a);a.L=h(c.Ua);a.da=
+h(c.Xa);a.R=h(c.Za);a.vb=h(c.Va)};_gat.Z=function(){var d=this,a=_gat,c={},h="k",o="v",k=[h,o],l="(",s=")",q="*",f="!",n="'",w={};w[n]="'0";w[s]="'1";w[q]="'2";w[f]="'3";var x=1;function g(m,r,i,b){if(a.b==c[m])c[m]={};if(a.b==c[m][r])c[m][r]=[];c[m][r][i]=b}function z(m,r,i){return a.b!=c[m]&&a.b!=c[m][r]?c[m][r][i]:a.b}function B(m,r){if(a.b!=c[m]&&a.b!=c[m][r]){c[m][r]=a.b;var i=true,b;for(b=0;b<k[a.c];b++)if(a.b!=c[m][k[b]]){i=false;break}if(i)c[m]=a.b}}function A(m){var r="",i=false,b,e;for(b=0;b<k[a.c];b++){e=m[k[b]];if(a.b!=
+e){if(i)r+=k[b];r+=p(e);i=false}else i=true}return r}function p(m){var r=[],i,b;for(b=0;b<m[a.c];b++)if(a.b!=m[b]){i="";if(b!=x&&a.b==m[b-1]){i+=b.toString();i+=f}i+=u(m[b]);a.h(r,i)}return l+r.join(q)+s}function u(m){var r="",i,b,e;for(i=0;i<m[a.c];i++){b=m.charAt(i);e=w[b];r+=a.b!=e?e:b}return r}d.Kc=function(m){return a.b!=c[m]};d.N=function(){var m=[],r;for(r in c)if(a.b!=c[r])a.h(m,r.toString()+A(c[r]));return m.join("")};d.Sc=function(m){if(m==a.b)return d.N();var r=[m.N()],i;for(i in c)if(a.b!=
+c[i]&&!m.Kc(i))a.h(r,i.toString()+A(c[i]));return r.join("")};d._setKey=function(m,r,i){if(typeof i!="string")return false;g(m,h,r,i);return true};d._setValue=function(m,r,i){if(typeof i!="number"&&(a.b==Number||!(i instanceof Number)))return false;if(Math.round(i)!=i||i==NaN||i==Infinity)return false;g(m,o,r,i.toString());return true};d._getKey=function(m,r){return z(m,h,r)};d._getValue=function(m,r){return z(m,o,r)};d._clearKey=function(m){B(m,h)};d._clearValue=function(m){B(m,o)}};_gat.ic=function(d,a){var c=this;c.jd=a;c.Pc=d;c._trackEvent=function(h,o,k){return a._trackEvent(c.Pc,h,o,k)}};_gat.kc=function(d){var a=this,c=_gat,h=c.b,o=c.q,k=c.w,l=c.F,s=c.C,q=c.P,f=c.z,n="location",w=c.c,x=h,g=new c.hc,z=false;a.a=document;a.e=window;a.ja=Math.round((new Date).getTime()/1000);a.H=d;a.yb=a.a.referrer;a.va=h;a.j=h;a.A=h;a.M=false;a.aa=h;a.rb="";a.l=h;a.Ab=h;a.f=h;a.u=h;function B(){if("auto"==g.g){var b=a.a.domain;if("www."==l(b,0,4))b=l(b,4);g.g=b}g.g=c.T(g.g)}function A()
 {var b=g.g,e=k(b,"www.google.")*k(b,".google.")*k(b,"google.");return e||"/"!=g.p||k(b,"google.org")>-1}function p(b,
+e,j){if(o(b)||o(e)||o(j))return"-";var t=s(b,c.r+a.f+".",e),v;if(!o(t)){v=f(t,".");v[5]=v[5]?v[5]*1+1:1;v[3]=v[4];v[4]=j;t=v.join(".")}return t}function u(){return"file:"!=a.a[n].protocol&&A()}function m(b){if(!b||""==b)return"";while(c.Lb(b.charAt(0)))b=l(b,1);while(c.Lb(b.charAt(b[w]-1)))b=l(b,0,b[w]-1);return b}function r(b,e,j){if(!o(b())){e(c.J(b()));if(!q(b(),";"))j()}}function i(b){var e,j=""!=b&&a.a[n].host!=b;if(j)for(e=0;e<g.B[w];e++)j=j&&k(c.T(b),c.T(g.B[e]))==-1;return j}a.Bc=function(){if(!g.g||
+""==g.g||"none"==g.g){g.g="";return 1}B();return g.pb?c.t(g.g):1};a.tc=function(b,e){if(o(b))b="-";else{e+=g.p&&"/"!=g.p?g.p:"";var j=k(b,e);b=j>=0&&j<=8?"0":("["==b.charAt(0)&&"]"==b.charAt(b[w]-1)?"-":b)}return b};a.Ia=function(b){var e="",j=a.a;e+=a.aa?a.aa.Xc():"";e+=g.qa?a.rb:"";e+=g.ta&&!o(j.title)?"&utmdt="+c.d(j.title):"";e+="&utmhid="+c.uc()+"&utmr="+a.va+"&utmp="+a.Tc(b);return e};a.Tc=function(b){var e=a.a[n];b=h!=b&&""!=b?c.d(b,true):c.d(e.pathname+unescape(e.search),true);return b};a.$c=
+function(b){if(a.Q()){var e="";if(a.l!=h&&a.l.N().length>0)e+="&utme="+c.d(a.l.N());e+=a.Ia(b);x.O(e,a.H,a.a,a.f)}};a.qc=function(){var b=new c.Y(a.a,g);return b.Ha(a.f)?b.Wc():h};a._getLinkerUrl=function(b,e){var j=f(b,"#"),t=b,v=a.qc();if(v)if(e&&1>=j[w])t+="#"+v;else if(!e||1>=j[w])if(1>=j[w])t+=(q(b,"?")?"&":"?")+v;else t=j[0]+(q(b,"?")?"&":"?")+v+"#"+j[1];return t};a.Zb=function(){var b;if(a.A&&a.A[w]>=10&&!q(a.A,"=")){a.u.Uc(a.A);a.u.cd();c._gasoDomain=g.g;c._gasoCPath=g.p;b=a.a.createElement("script");
+b.type="text/javascript";b.id="_gasojs";b.src="https://www.google.com/analytics/reporting/overlay_js?gaso="+a.A+"&"+c.wa();a.a.getElementsByTagName("head")[0].appendChild(b)}};a.Jc=function(){var b=a.a[c.m],e=a.ja,j=a.u,t=a.f+"",v=a.e,y=v?v.gaGlobal:h,E,F=q(b,c.r+t+"."),I=q(b,c.W+t),G=q(b,c.ma+t),C,D=[],H="",K=false,J;b=o(b)?"":b;if(g.I){E=c.Db(a.a[n]);if(g.pa&&!o(E))H=E+"&";H+=a.a[n].search;if(!o(H)&&q(H,c.r)){j.Rc(H);if(!j.Jb())j.pc();C=j.ya()}r(j.Ba,j.Wb,j.fc);r(j.Aa,j.Na,j.Qa)}if(!o(C))if(o(j.K())||
+o(j.za())){C=p(H,"&",e);a.M=true}else{D=f(j.K(),".");t=D[0]}else if(F)if(!I||!G){C=p(b,";",e);a.M=true}else{C=s(b,c.r+t+".",";");D=f(s(b,c.W+t,";"),".")}else{C=[t,c.Gc(),e,e,e,1].join(".");a.M=true;K=true}C=f(C,".");if(v&&y&&y.dh==t){C[4]=y.sid?y.sid:C[4];if(K){C[3]=y.sid?y.sid:C[4];if(y.vid){J=f(y.vid,".");C[1]=J[0];C[2]=J[1]}}}j.Ub(C.join("."));D[0]=t;D[1]=D[1]?D[1]:0;D[2]=undefined!=D[2]?D[2]:g.Yc;D[3]=D[3]?D[3]:C[4];j.La(D.join("."));j.Vb(t);if(!o(j.Hc()))j.Ma(j.t());j.dc();j.Pa();j.ec()};a.Lc=
+function(){x=new c.jc(g)};a._initData=function(){var b;if(!z){a.Lc();a.f=a.Bc();a.u=new c.Y(a.a,g)}if(u())a.Jc();if(!z){if(u()){a.va=a.tc(a.Ac(),a.a.domain);if(g.sa){a.aa=new c.gc(g.ua);a.aa.xc()}if(g.qa){b=new c.n(a.f,a.a,a.va,a.ja,g);a.rb=b.yc(a.u,a.M)}}a.l=new c.Z;a.Ab=new c.Z;z=true}if(!c.Hb)a.Mc()};a._visitCode=function(){a._initData();var b=s(a.a[c.m],c.r+a.f+".",";"),e=f(b,".");return e[w]<4?"":e[1]};a._cookiePathCopy=function(b){a._initData();if(a.u)a.u.bd(a.f,b)};a.Mc=function(){var b=a.a[n].hash,
+e;e=b&&""!=b&&0==k(b,"#gaso=")?s(b,"gaso=","&"):s(a.a[c.m],c.Sa,";");if(e[w]>=10){a.A=e;if(a.e.addEventListener)a.e.addEventListener("load",a.Zb,false);else a.e.attachEvent("onload",a.Zb)}c.Hb=true};a.Q=function(){return a._visitCode()%10000<g.ha*100};a.Vc=function(){var b,e,j=a.a.links;if(!g.Kb){var t=a.a.domain;if("www."==l(t,0,4))t=l(t,4);g.B.push("."+t)}for(b=0;b<j[w]&&(g.Ga==-1||b<g.Ga);b++){e=j[b];if(i(e.host))if(!e.gatcOnclick){e.gatcOnclick=e.onclick?e.onclick:a.Qc;e.onclick=function(v){var y=
+!this.target||this.target=="_self"||this.target=="_top"||this.target=="_parent";y=y&&!a.oc(v);a.ad(v,this,y);return y?false:(this.gatcOnclick?this.gatcOnclick(v):true)}}}};a.Qc=function(){};a._trackPageview=function(b){if(u()){a._initData();if(g.B)a.Vc();a.$c(b);a.M=false}};a._trackTrans=function(){var b=a.f,e=[],j,t,v,y;a._initData();if(a.j&&a.Q()){for(j=0;j<a.j.la[w];j++){t=a.j.la[j];c.h(e,t.S());for(v=0;v<t.ca[w];v++)c.h(e,t.ca[v].S())}for(y=0;y<e[w];y++)x.O(e[y],a.H,a.a,b,true)}};a._setTrans=
+function(){var b=a.a,e,j,t,v,y=b.getElementById?b.getElementById("utmtrans"):(b.utmform&&b.utmform.utmtrans?b.utmform.utmtrans:h);a._initData();if(y&&y.value){a.j=new c.i;v=f(y.value,"UTM:");g.G=!g.G||""==g.G?"|":g.G;for(e=0;e<v[w];e++){v[e]=m(v[e]);j=f(v[e],g.G);for(t=0;t<j[w];t++)j[t]=m(j[t]);if("T"==j[0])a._addTrans(j[1],j[2],j[3],j[4],j[5],j[6],j[7],j[8]);else if("I"==j[0])a._addItem(j[1],j[2],j[3],j[4],j[5],j[6])}}};a._addTrans=function(b,e,j,t,v,y,E,F){a.j=a.j?a.j:new c.i;return a.j.nb(b,e,
+j,t,v,y,E,F)};a._addItem=function(b,e,j,t,v,y){var E;a.j=a.j?a.j:new c.i;E=a.j.xa(b);if(!E)E=a._addTrans(b,"","","","","","","");E.mb(e,j,t,v,y)};a._setVar=function(b){if(b&&""!=b&&A()){a._initData();var e=new c.Y(a.a,g),j=a.f;e.Na(j+"."+c.d(b));e.Qa();if(a.Q())x.O("&utmt=var",a.H,a.a,a.f)}};a._link=function(b,e){if(g.I&&b){a._initData();a.a[n].href=a._getLinkerUrl(b,e)}};a._linkByPost=function(b,e){if(g.I&&b&&b.action){a._initData();b.action=a._getLinkerUrl(b.action,e)}};a._setXKey=function(b,e,
+j){a.l._setKey(b,e,j)};a._setXValue=function(b,e,j){a.l._setValue(b,e,j)};a._getXKey=function(b,e){return a.l._getKey(b,e)};a._getXValue=function(b,e){return a.l.getValue(b,e)};a._clearXKey=function(b){a.l._clearKey(b)};a._clearXValue=function(b){a.l._clearValue(b)};a._createXObj=function(){a._initData();return new c.Z};a._sendXEvent=function(b){var e="";a._initData();if(a.Q()){e+="&utmt=event&utme="+c.d(a.l.Sc(b))+a.Ia();x.O(e,a.H,a.a,a.f,false,true)}};a._createEventTracker=function(b){a._initData();
+return new c.ic(b,a)};a._trackEvent=function(b,e,j,t){var v=true,y=a.Ab;if(h!=b&&h!=e&&""!=b&&""!=e){y._clearKey(5);y._clearValue(5);v=y._setKey(5,1,b)?v:false;v=y._setKey(5,2,e)?v:false;v=h==j||y._setKey(5,3,j)?v:false;v=h==t||y._setValue(5,1,t)?v:false;if(v)a._sendXEvent(y)}else v=false;return v};a.ad=function(b,e,j){a._initData();if(a.Q()){var t=new c.Z;t._setKey(6,1,e.href);var v=j?function(){a.rc(b,e)}:undefined;x.O("&utmt=event&utme="+c.d(t.N())+a.Ia(),a.H,a.a,a.f,false,true,v)}};a.rc=function(b,
+e){if(!b)b=a.e.event;var j=true;if(e.gatcOnclick)j=e.gatcOnclick(b);if(j||typeof j=="undefined")if(!e.target||e.target=="_self")a.e.location=e.href;else if(e.target=="_top")a.e.top.document.location=e.href;else if(e.target=="_parent")a.e.parent.document.location=e.href};a.oc=function(b){if(!b)b=a.e.event;var e=b.shiftKey||b.ctrlKey||b.altKey;if(!e)if(b.modifiers&&a.e.Event)e=b.modifiers&a.e.Event.CONTROL_MASK||b.modifiers&a.e.Event.SHIFT_MASK||b.modifiers&a.e.Event.ALT_MASK;return e};a._setDomainName=
+function(b){g.g=b};a.dd=function(){return g.g};a._addOrganic=function(b,e){c.h(g.fa,new c.cb(b,e))};a._clearOrganic=function(){g.fa=[]};a.hd=function(){return g.fa};a._addIgnoredOrganic=function(b){c.h(g.ea,b)};a._clearIgnoredOrganic=function(){g.ea=[]};a.ed=function(){return g.ea};a._addIgnoredRef=function(b){c.h(g.ga,b)};a._clearIgnoredRef=function(){g.ga=[]};a.fd=function(){return g.ga};a._setAllowHash=function(b){g.pb=b?1:0};a._setCampaignTrack=function(b){g.qa=b?1:0};a._setClientInfo=function(b){g.sa=
+b?1:0};a._getClientInfo=function(){return g.sa};a._setCookiePath=function(b){g.p=b};a._setTransactionDelim=function(b){g.G=b};a._setCookieTimeout=function(b){g.wb=b};a._setDetectFlash=function(b){g.ua=b?1:0};a._getDetectFlash=function(){return g.ua};a._setDetectTitle=function(b){g.ta=b?1:0};a._getDetectTitle=function(){return g.ta};a._setLocalGifPath=function(b){g.Da=b};a._getLocalGifPath=function(){return g.Da};a._setLocalServerMode=function(){g.D=0};a._setRemoteServerMode=function(){g.D=1};a._setLocalRemoteServerMode=
+function(){g.D=2};a.gd=function(){return g.D};a._getServiceMode=function(){return g.D};a._setSampleRate=function(b){g.ha=b};a._setSessionTimeout=function(b){g.Tb=b};a._setAllowLinker=function(b){g.I=b?1:0};a._setAllowAnchor=function(b){g.pa=b?1:0};a._setCampNameKey=function(b){g.db=b};a._setCampContentKey=function(b){g.eb=b};a._setCampIdKey=function(b){g.fb=b};a._setCampMediumKey=function(b){g.gb=b};a._setCampNOKey=function(b){g.hb=b};a._setCampSourceKey=function(b){g.ib=b};a._setCampTermKey=function(b){g.jb=
+b};a._setCampCIdKey=function(b){g.kb=b};a._getAccount=function(){return a.H};a._getVersion=function(){return _gat.lb};a.kd=function(b){g.B=[];if(b)g.B=b};a.md=function(b){g.Kb=b};a.ld=function(b){g.Ga=b};a._setReferrerOverride=function(b){a.yb=b};a.Ac=function(){return a.yb}};_gat._getTracker=function(d){var a=new _gat.kc(d);return a};

Propchange: felix/trunk/ipojo/core/doc/service-requirement-handler_files/ga.js
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Added: felix/trunk/ipojo/core/doc/service-requirement-handler_files/linkext7.gif
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/doc/service-requirement-handler_files/linkext7.gif?rev=734735&view=auto
==============================================================================
Binary file - no diff available.

Propchange: felix/trunk/ipojo/core/doc/service-requirement-handler_files/linkext7.gif
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: felix/trunk/ipojo/core/doc/service-requirement-handler_files/logo.png
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/doc/service-requirement-handler_files/logo.png?rev=734735&view=auto
==============================================================================
Binary file - no diff available.

Propchange: felix/trunk/ipojo/core/doc/service-requirement-handler_files/logo.png
------------------------------------------------------------------------------
    svn:mime-type = application/octet-stream

Added: felix/trunk/ipojo/core/doc/service-requirement-handler_files/site.css
URL: http://svn.apache.org/viewvc/felix/trunk/ipojo/core/doc/service-requirement-handler_files/site.css?rev=734735&view=auto
==============================================================================
--- felix/trunk/ipojo/core/doc/service-requirement-handler_files/site.css (added)
+++ felix/trunk/ipojo/core/doc/service-requirement-handler_files/site.css Thu Jan 15 07:35:17 2009
@@ -0,0 +1,25 @@
+/* @override http://felix.apache.org/site/media.data/site.css */
+
+body { background-color: #ffffff; color: #3b3b3b; font-family: Tahoma, Arial, sans-serif; font-size: 10pt; line-height: 140% }
+h1, h2, h3, h4, h5, h6 { font-weight: normal; color: #000000; line-height: 100%; margin-top: 0px}
+h1 { font-size: 200% }
+h2 { font-size: 175% }
+h3 { font-size: 150% }
+h4 { font-size: 140% }
+h5 { font-size: 130% }
+h6 { font-size: 120% }
+a { color: #1980af }
+a:visited { color: #1980af }
+a:hover { color: #1faae9 }
+.title { position: absolute; left: 1px; right: 1px; top:25px; height: 81px; background: url(http://felix.apache.org/site/media.data/gradient.png) repeat-x; background-position: bottom; }
+.logo { position: absolute; width: 15em; height: 81px; text-align: center; }
+.header { text-align: right; margin-right: 20pt; margin-top: 30pt;}
+.menu { border-top: 10px solid #f9bb00; position: absolute; top: 107px; left: 1px; width: 15em; bottom: 0px; padding: 0px; background-color: #fcfcfc }
+.menu ul { background-color: #fdf5d9; list-style: none; padding-left: 4em; margin-top: 0px; padding-top: 2em; padding-bottom: 2em; margin-left: 0px; color: #4a4a43}
+.menu a { text-decoration: none; color: #4a4a43 }
+.main { position: absolute; border-top: 10px solid #cde0ea; top: 107px; left: 15em; right: 1px; margin-left: 2px; padding-right: 4em; padding-left: 1em; padding-top: 1em;}
+.code { background-color: #eeeeee; border: solid 1px black; padding: 0.5em }
+.code-keyword { color: #880000 }
+.code-quote { color: #008800 }
+.code-object { color: #0000dd }
+.code-java { margin: 0em }
\ No newline at end of file

Propchange: felix/trunk/ipojo/core/doc/service-requirement-handler_files/site.css
------------------------------------------------------------------------------
    svn:mime-type = text/plain