Hi,

It looks like what you are trying to achieve can simply be made using a regular 
@Requires injection (or with the @Bind/@Unbind annotations, if you want to be 
notified when an algorithm arrives or leaves).

Your Algorithm class is the service specification. You concrete class should be 
a component registering the Algorithm service:

@Component
@Provides
@Instantiate
public ConcreteClass implements Algorithm {
   //...
}

Notice that because it’s a component, the concrete class constructor must be 
either without parameter or use @Property to inject values.

Finally, your ‘extender’ is just:

@Component(immediate=true
@Provides
@Instantiate
public Host {

    @Requires
     Algorithm[] algorithms;

}

To answer your initial question, the extender is looking for bundle’s manifest 
entry, which does not seem adequate in your context. 

Regards,

Clement


On 5 juin 2014, at 18:34, Luis Neto <[email protected]> wrote:

> Hi all, sorry if this question is to naive but i am struggling to
> understand how
> iPOJO indentifies the extender matching bundles.
> 
> I have a super class and a concrete class that i want to perform some
> logic, first i have
> thought that iPOJO automatically by declaring the property:
> 
>> <provides specifications="Algorithm"/>
>> 
> on the concrete class.
> 
> Then i've done some more reading and i have seen the PAX-WEB example and i
> tried to declare
> the property <Algorithm> in the concrete class bundle manifest header.
> 
> So my question is how to declare the property so the extender service can
> identify the bundle?
> 
> I've declared and implemented my extender service as follows:
> 
> 
>    <component
>>        classname="com.MyExtender"
>>        name = "MyExtender" public="false">
>>        <extender:extender
>>            extension="Algorithm" onArrival="onBundleArrival"
>> onDeparture="onBundleDeparture" />
>>        <callback transition="invalidate" method="stop" />
>>        <callback transition="validate" method="start" />
>>    </component>
>>    <instance
>>        name="algorithm.extender"
>>        component="MyExtender">
>>    </instance>
>> 
> 
> The superclass:
> 
> public abstract class Algorithm{
>> 
>> String name;
>> String version;
>> 
>> public Algorithm(String name, String version){
>>    this.name = name;
>>    this.version = version;
>> }
>> 
>> public String getName(){
>>    return name;
>> }
>> ...
>> 
>> abstract public void computeSomething(Map<a,b> data);
>> 
> 
> And concrete subclasses as follows:
> 
> public class ConcreteAlgorithm extends Algorithm{
>> 
>> Map<a,b> data;
>> 
>> public ConcreteAlgorithm(String name, Map<a,b> data){
>>    super(name);
>>    data = data;
>> }
>> 
>> public void computeSomething(Map<a,b> data){
>>    //compute data
>> }
> 
> 
> Best regards,
> Luis


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to