Thanks for your reply Richard.

I am using a lifecycle controller already to make it possible to
enable/disable my services via a GUI. I'll see if I can use it for this
purpose.

I've also tried the following approach: Keep track of all possible services
that expose the interface I'm intererested in as follows:

  @Requires(optional = true)
  private IOrchestrationProcessor[] mProcessors;

In runtime, when my service is being activated (prior to creating the camel
route) I check to see if all required processors exist, if not I throw an
exception. Unfortunately I have no control of in what order the services
will be activated so its hard to ever get the camel route created this way.
A lot of the time a "required" services is activated a bit later.

/Bengt



2013/10/2 Richard S. Hall <[email protected]>

>
> On 10/2/13 08:42 , Bengt Rodehav wrote:
>
>> I'm creating a dynamic processing component using iPOJO and Camel. The
>> idea
>> is to dynamically specify (via config admin) a number of processor id's.
>> In
>> runtime I want to find the matching processors (the processors are Camel
>> processors published as OSGi services) with the correct id.
>>
>> E g if I specify a list of services to {A,B} (FileInstall recognizes this
>> as a list). I want to require those services in order for my iPojo
>> instance
>> to become valid. It was much harder than I thought.
>>
>> I've tried something like:
>>
>>    @Property(name = "processors", mandatory = false, value = "")
>>    public void setProcessors(String[] theProcessorIds) {
>>      mProcessorIds = theProcessorIds;
>>      updateProcessorFilter();
>>    }
>>
>>    @Requires
>>    private Processor[] mProcessors;
>>
>> The idea is that whenever the configuration property "processors" is
>> updated, I dynamically update the ldap filter on the dependency
>> mProcessors. I've used this approach before and it has worked when using a
>> single dependency (not an array).
>>
>> The problem is that I want to specifically require each specified
>> processor. In the example above, I require one processor with id=A AND one
>> processor with id=B. It's not enough with anyone of them since I want to
>> invoke them one after another.
>>
>> Can I use a filter for this? I've been thinking of something like this:
>>
>> (|(processorId=A)(processorId=**B))
>>
>> This would match both my processors but if one of them were missing my
>> instance would still become valid which I don't want.
>>
>
> I don't think there is anyway to do what you want. This is essentially an
> "N cardinality" requirement, where you want to say that you require
> specifically N of something. Such requirements had been discussed over the
> years for Service Binder, Declarative Services, etc., but we could never
> agree on their usefulness or how to do them, so we just left it as it is
> now (i.e., optional, at least one...).
>
> Other than adding some sort of threshold to service dependencies, I don't
> see this happening. You could potentially create an iPOJO lifecycle
> controller that would keep your component invalid until it matched the
> required number of services (if you can get this information in the
> handler)...or perhaps write/extend the service dependency handler.
>
> -> richard
>
>
>> /Bengt
>>
>>
>
> ------------------------------**------------------------------**---------
> To unsubscribe, e-mail: 
> users-unsubscribe@felix.**apache.org<[email protected]>
> For additional commands, e-mail: [email protected]
>
>

Reply via email to