Updates doc folders with new changelog files and update embedded documentation
Adds the ASM licence in the manipulator project
The maven-ipojo-plugin's architype targets the latest released version.
Adds a visibility test in the composite test suite.
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@703957 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/core/doc/service-requirement-handler.html b/ipojo/core/doc/service-requirement-handler.html
index 24c71fb..8d84dc7 100644
--- a/ipojo/core/doc/service-requirement-handler.html
+++ b/ipojo/core/doc/service-requirement-handler.html
@@ -2,31 +2,31 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<HTML>
-
+<!-- Mirrored Site: felix.apache.org. File: /site/service-requirement-handler.html. Date: Mon, 13 Oct 2008 06:53:05 GMT -->
<HEAD>
<TITLE>Apache Felix - Service Requirement Handler</TITLE>
- <LINK rel="stylesheet" href="http://felix.apache.org/site/media.data/site.css" type="text/css" media="all">
+ <LINK rel="stylesheet" href="media.data/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 border="0" alt="Apache Felix" src="http://felix.apache.org/site/media.data/logo.png"></A></DIV><DIV class="header"><A href="http://www.apache.org/"><IMG border="0" alt="Apache" src="http://felix.apache.org/site/media.data/apache.png"></A></DIV></DIV>
+ <DIV class="title"><DIV class="logo"><A href="index.html"><IMG border="0" alt="Apache Felix" src="media.data/logo.png"></A></DIV><DIV class="header"><A href="http://www.apache.org/"><IMG border="0" alt="Apache" src="media.data/apache.png"></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="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></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="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></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="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></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="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></SUP></A></SPAN>
+ <LI><A href="news.html" title="news">news</A></LI>
+ <LI><A href="license.html" title="license">license</A></LI>
+ <LI><SPAN class="nobr"><A href="downloads.html" title="Visit page outside Confluence" rel="nofollow">downloads<SUP><IMG class="rendericon" src="../../cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></SUP></A></SPAN></LI>
+ <LI><A href="documentation.html" title="documentation">documentation</A></LI>
+ <LI><A href="mailinglists.html" title="mailinglists">mailing lists</A></LI>
+ <LI><A href="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="../../cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></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="../../cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></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="../../cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></SUP></A></SPAN>
<!-- ApacheCon Ad -->
<IFRAME src="http://www.apache.org/ads/button.html" style="border-width:0; float: left" frameborder="0" scrolling="no" width="135" height="135"></IFRAME>
<P style="height: 100px">
<!-- ApacheCon Ad --></LI>
</UL>
- </DIV>
+ </DIV>
<DIV class="main">
<TABLE class="sectionMacro" border="0" cellpadding="5" cellspacing="0" width="100%"><TBODY><TR>
<TD class="confluenceTd" valign="top" width="80%">
@@ -45,6 +45,7 @@
<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>
@@ -63,8 +64,8 @@
<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>
+ <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>
@@ -143,6 +144,7 @@
<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"><component classname=<SPAN class="code-quote">"...HelloConsumer"</SPAN>></SPAN>
@@ -175,10 +177,13 @@
<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 < m_hellos.length; i++) { <SPAN class="code-object">System</SPAN>.out.println(m_hellos[i].getMessage());}
+ <SPAN class="code-keyword">for</SPAN>(<SPAN class="code-object">int</SPAN> I = 0; I < 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"><component classname=<SPAN class="code-quote">"...HelloConsumer"</SPAN>></SPAN>
@@ -186,10 +191,45 @@
...
<SPAN class="code-tag"></component></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%3Alist%2Cvector%2Ccollectionandset%5CNewinthe0.9.0SNAPSHOTversion%5C"></A>Aggregate Dependency with field injection: list, vector, collection and set [New in the 0.9.0-SNAPSHOT version]</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 < 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"><component classname=<SPAN class="code-quote">"...HelloConsumer"</SPAN>></SPAN>
+ <SPAN class="code-tag"><requires field=<SPAN class="code-quote">"m_hellos"</SPAN> interface=<SPAN class="code-quote">"o.a.f.i.Hello"</SPAN>/></SPAN>
+ ...
+<SPAN class="code-tag"></component></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 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 'interface' 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.<BR>
+<EM>Note:</EM> The 0.9.0-SNAPSHOT version has changed the 'interface' attribute in 'specification'. The attribute semantic don't change.</P>
+
+
<H4><A name="ServiceRequirementHandler-AggregateDependencywithmethodinvocation"></A>Aggregate Dependency with method invocation</H4>
<DIV class="code"><DIV class="codeContent">
@@ -198,7 +238,10 @@
<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 < m_hellos.size(); i++) { <SPAN class="code-object">System</SPAN>.out.println(m_hellos.get(i).getMessage());}
+ <SPAN class="code-keyword">for</SPAN>(<SPAN class="code-object">int</SPAN> I = 0; I < m_hellos.size(); i++) {
+ <SPAN class="code-object">System</SPAN>.out.println(m_hellos.get(i).
+ getMessage());
+ }
}
}
}</PRE>
@@ -222,7 +265,9 @@
<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()); }
+ <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>
@@ -232,7 +277,7 @@
...
<SPAN class="code-tag"></component></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>
+<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>
@@ -241,7 +286,11 @@
<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()); } }
+ <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>
@@ -266,7 +315,9 @@
<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 < m_hellos.length; i++) { <SPAN class="code-object">System</SPAN>.out.println(m_hellos[i].getMessage());}
+ <SPAN class="code-keyword">for</SPAN>(<SPAN class="code-object">int</SPAN> I = 0; I < m_hellos.length; i++) {
+ <SPAN class="code-object">System</SPAN>.out.println(m_hellos[i].getMessage());
+ }
}
}</PRE>
</DIV></DIV>
@@ -287,7 +338,9 @@
<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 < m_hellos.size(); i++) { <SPAN class="code-object">System</SPAN>.out.println(m_hellos.get(i).getMessage());}
+ <SPAN class="code-keyword">for</SPAN>(<SPAN class="code-object">int</SPAN> I = 0; I < m_hellos.size(); i++) {
+ <SPAN class="code-object">System</SPAN>.out.println(m_hellos.get(i).getMessage());
+ }
}
}</PRE>
</DIV></DIV>
@@ -312,11 +365,13 @@
...
<SPAN class="code-tag"></component></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>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"><SPAN class="code-tag"><component className=<SPAN class="code-quote">"org.apache.felix.ipojo.example.FilteredDependency"</SPAN> name=<SPAN class="code-quote">"FOO"</SPAN>></SPAN>
+<PRE class="code-xml"><component
+ className=<SPAN class="code-quote">"org.apache.felix.ipojo.example.FilteredDependency"</SPAN>
+ name=<SPAN class="code-quote">"FOO"</SPAN>>
<SPAN class="code-tag"><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>></SPAN>
<SPAN class="code-tag"><callback type=<SPAN class="code-quote">"bind"</SPAN> method=<SPAN class="code-quote">"bind"</SPAN>/></SPAN>
<SPAN class="code-tag"><callback type=<SPAN class="code-quote">"unbind"</SPAN> method=<SPAN class="code-quote">"unbind"</SPAN>/></SPAN>
@@ -339,6 +394,49 @@
</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%5CNewinthe0.9.0SNAPSHOTversion%5C"></A>Targeting a specific provider [New in the 0.9.0-SNAPSHOT version]</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"><component classname=<SPAN class="code-quote">"...HelloConsumer"</SPAN>></SPAN>
+<SPAN class="code-tag"><requires from=<SPAN class="code-quote">"MyHelloProvider"</SPAN>></SPAN>
+ <SPAN class="code-tag"><callback type=<SPAN class="code-quote">"bind"</SPAN> method=<SPAN class="code-quote">"bindHello"</SPAN>></SPAN>
+ <SPAN class="code-tag"><callback type=<SPAN class="code-quote">"unbind"</SPAN> method=<SPAN class="code-quote">"unbindHello"</SPAN>></SPAN>
+<SPAN class="code-tag"></requires></SPAN>
+...
+<SPAN class="code-tag"></component></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"><component
+ className=<SPAN class="code-quote">"org.apache.felix.ipojo.example.FilteredDependency"</SPAN>
+ name=<SPAN class="code-quote">"FOO"</SPAN>>
+ <SPAN class="code-tag"><requires field=<SPAN class="code-quote">"m_foo"</SPAN> id=<SPAN class="code-quote">"id1"</SPAN>></SPAN>
+ <SPAN class="code-tag"><callback type=<SPAN class="code-quote">"bind"</SPAN> method=<SPAN class="code-quote">"bind"</SPAN>/></SPAN>
+ <SPAN class="code-tag"><callback type=<SPAN class="code-quote">"unbind"</SPAN> method=<SPAN class="code-quote">"unbind"</SPAN>/></SPAN>
+ <SPAN class="code-tag"></requires></SPAN>
+<SPAN class="code-tag"></component></SPAN>
+
+<SPAN class="code-tag"><instance name=<SPAN class="code-quote">"FOO1"</SPAN> component=<SPAN class="code-quote">"FOO"</SPAN>/></SPAN>
+
+<SPAN class="code-tag"><instance name=<SPAN class="code-quote">"FOO2"</SPAN> component=<SPAN class="code-quote">"FOO"</SPAN>></SPAN>
+ <SPAN class="code-tag"><property name=<SPAN class="code-quote">"requires.from"</SPAN>></SPAN>
+ <SPAN class="code-tag"><property name=<SPAN class="code-quote">"id1"</SPAN> value=<SPAN class="code-quote">"myprovider"</SPAN>/></SPAN>
+ <SPAN class="code-tag"></property></SPAN>
+<SPAN class="code-tag"></instance></SPAN>
+
+<SPAN class="code-tag"><instance name=<SPAN class="code-quote">"FOO3"</SPAN> component=<SPAN class="code-quote">"FOO"</SPAN>></SPAN>
+ <SPAN class="code-tag"><property name=<SPAN class="code-quote">"requires.from"</SPAN>></SPAN>
+ <SPAN class="code-tag"><property name=<SPAN class="code-quote">"id1"</SPAN> value=<SPAN class="code-quote">"myotherprovider"</SPAN>/></SPAN>
+ <SPAN class="code-tag"></property></SPAN>
+<SPAN class="code-tag"></instance></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>
@@ -350,12 +448,14 @@
<P>A static binding is declared as following:</P>
+
<DIV class="code"><DIV class="codeContent">
<PRE class="code-xml"><SPAN class="code-tag"><component classname=<SPAN class="code-quote">"...HelloConsumer"</SPAN>></SPAN>
<SPAN class="code-tag"><requires field=<SPAN class="code-quote">"m_hellos"</SPAN> policy=<SPAN class="code-quote">"static"</SPAN>/></SPAN>
...
<SPAN class="code-tag"></component></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"><component classname=<SPAN class="code-quote">"...HelloConsumer"</SPAN>></SPAN>
@@ -366,7 +466,7 @@
<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"><component classname=<SPAN class="code-quote">"...HelloConsumer"</SPAN>></SPAN>
- <SPAN class="code-tag"><requires field=<SPAN class="code-quote">"m_hellos"</SPAN> policy=<SPAN class="code-quote">"dynamic-priority"</SPAN> comparator=<SPAN class="code-quote">"my.comparator"</SPAN>/></SPAN>
+ <SPAN class="code-tag"><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>/></SPAN>
...
<SPAN class="code-tag"></component></SPAN></PRE>
</DIV></DIV>
@@ -394,12 +494,14 @@
<SPAN class="code-tag"></component></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>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"><component classname=<SPAN class="code-quote">"...LogExample"</SPAN>></SPAN>
- <SPAN class="code-tag"><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>/></SPAN>
+ <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>/>
...
<SPAN class="code-tag"></component></SPAN></PRE>
</DIV></DIV>
@@ -422,73 +524,69 @@
<P><A name="ServiceRequirementHandler-discovery"></A></P>
<H2><A name="ServiceRequirementHandler-Noteonserviceinterfacediscovery"></A>Note on service interface discovery</H2>
-<P>The <EM>'interface'</EM> 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>
+<P>The <EM>'interface'</EM> (replaced by 'specification' during the 0.9.0-SNASPHOT version development) 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%">
-<FORM method="get" class="confluence-searchbox marginlessForm " action="http://felix.apache.org/confluence/dosearchsite.action">
- <INPUT type="hidden" name="searchQuery.spaceKey" value="FELIX">
- <INPUT type="text" name="searchQuery.queryString">
- <INPUT type="submit" value="Search">
-</FORM>
-<HR>
<H6><A name="ServiceRequirementHandler-Overview"></A><B>Overview</B></H6>
<UL>
- <LI><A href="http://felix.apache.org/site/apache-felix-ipojo-2.html" title="Apache Felix iPOJO-2">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 & Install </A></LI>
+ <LI><A href="apache-felix-ipojo.html" title="Apache Felix iPOJO">Home Page</A></LI>
+ <LI><A href="apache-felix-ipojo-feature-overview.html" title="Apache Felix iPOJO Feature Overview">iPOJO Feature Overview</A></LI>
+ <LI><A href="download.html" title="Download">Download & 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/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="ipojo-in-10-minutes.html" title="iPOJO in 10 minutes">iPOJO in 10 minutes</A></LI>
+ <LI><A href="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="ipojo-advanced-tutorial.html" title="iPOJO Advanced Tutorial">iPOJO Advanced 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</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-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>
+ <LI><A href="describing-components.html" title="Describing components">Describing components (handler list) </A></LI>
+ <LI><A href="how-to-use-ipojo-annotations.html" title="How to use iPOJO Annotations">How to use iPOJO Annotations</A></LI>
+ <LI><A href="using-xml-schemas.html" title="Using XML Schemas">Using XML Schemas</A></LI>
+ <LI><A href="ipojo-advanced-topics.html" title="iPOJO Advanced Topics">Advanced Topics</A></LI>
+ <LI><A href="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/ipojo-concepts-overview.html" title="iPOJO Concepts Overview">iPOJO concepts overview</A></LI>
+ <LI><A href="ipojo-eclipse-plug-in.html" title="iPOJO Eclipse Plug-in">iPOJO Eclipse Plug-in</A></LI>
+ <LI><A href="ipojo-ant-task.html" title="iPOJO Ant Task">iPOJO Ant Task</A></LI>
+ <LI><A href="ipojo-maven-plug-in.html" title="iPOJO Maven Plug-in">iPOJO Maven Plug-in</A></LI>
+ <LI><A href="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><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>API: <SPAN class="nobr"><A href="http://people.apache.org/~clement/ipojo/api/0.8/" title="Visit page outside Confluence" rel="nofollow">0.8<SUP><IMG class="rendericon" src="../../cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></SUP></A></SPAN></LI>
+ <LI><A href="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="how-to-use-ipojo-manipulation-metadata.html" title="How to use iPOJO Manipulation Metadata">How to use iPOJO Manipulation Metadata</A></LI>
</UL>
<H6><A name="ServiceRequirementHandler-Misc%26Contact"></A><B>Misc & 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><SPAN class="nobr"><A href="http://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=FELIX&title=Supported%20JVMs&linkCreation=true&fromPageId=82824" title="Create Page: Supported JVMs" class="createlink">Supported JVMs<SUP><IMG class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/plus.gif" height="7" width="7" align="absmiddle" alt="" border="0"></SUP></A></SPAN></LI>
- <LI><SPAN class="nobr"><A href="http://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=FELIX&title=Supported%20OSGi%20Implementations&linkCreation=true&fromPageId=82824" title="Create Page: Supported OSGi Implementations" class="createlink">Supported OSGi Implementations<SUP><IMG class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/plus.gif" height="7" width="7" align="absmiddle" alt="" border="0"></SUP></A></SPAN></LI>
- <LI><A href="http://felix.apache.org/site/future-ideas.html" title="Future Ideas">Future Ideas</A></LI>
- <LI><SPAN class="nobr"><A href="http://cwiki.apache.org/confluence/pages/createpage.action?spaceKey=FELIX&title=Contact&linkCreation=true&fromPageId=82824" title="Create Page: Contact" class="createlink">Contact<SUP><IMG class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/plus.gif" height="7" width="7" align="absmiddle" alt="" border="0"></SUP></A></SPAN></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 & Presentations">Article & Presentations</A></LI>
+ <LI><A href="apache-felix-ipojo-issuestracker.html" title="apache-felix-ipojo-issuestracker">Issues Tracker</A></LI>
+ <LI><A href="apache-felix-ipojo-supportedvms.html" title="apache-felix-ipojo-supportedVMs">Supported JVMs</A></LI>
+ <LI><A href="apache-felix-ipojo-supportedosgi.html" title="apache-felix-ipojo-supportedOSGi">Supported OSGi Implementations</A></LI>
+ <LI><A href="future-ideas.html" title="Future Ideas">Future Ideas</A></LI>
+ <LI><A href="contact.html" title="Contact">Contact</A></LI>
+ <LI><A href="related-works.html" title="Related Works">Related Works</A></LI>
+ <LI><A href="article-presentations.html" title="Article & Presentations">Article & Presentations</A></LI>
</UL>
<HR>
<DIV class="" align="center">
-<P><SPAN class="nobr"><A href="http://cwiki.apache.org/confluence/createrssfeed.action?types=blogpost&statuses=created&statuses=modified&spaces=FELIX&labelString=iPOJO&rssType=atom&maxResults=10&timeSpan=5&publicFeed=true&title=iPOJO%20Atom%20Feed" title="Stay tuned!" rel="nofollow"><IMG src="http://cwiki.apache.org/confluence/images/icons/feed-icon-32x32.png" align="absmiddle" border="0"><SUP><IMG class="rendericon" src="http://cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></SUP></A></SPAN></P></DIV></TD></TR></TBODY></TABLE>
+<P><SPAN class="nobr"><A href="http://cwiki.apache.org/confluence/createrssfeed.action?types=blogpost&statuses=created&statuses=modified&spaces=FELIX&labelString=iPOJO&rssType=atom&maxResults=10&timeSpan=5&publicFeed=true&title=iPOJO%20Atom%20Feed" title="Stay tuned!" rel="nofollow"><IMG src="../../cwiki.apache.org/confluence/images/icons/feed-icon-32x32.png" align="absmiddle" border="0"><SUP><IMG class="rendericon" src="../../cwiki.apache.org/confluence/images/icons/linkext7.gif" height="7" width="7" align="absmiddle" alt="" border="0"></SUP></A></SPAN></P></DIV></TD></TR></TBODY></TABLE>
</DIV>
</BODY>
-
+<!-- Mirrored Site: felix.apache.org. File: /site/service-requirement-handler.html. Date: Mon, 13 Oct 2008 06:53:05 GMT -->
</HTML>