Hi,


On 28 nov. 2012, at 15:33, Bengt Rodehav <[email protected]> wrote:

> Thanks again - it worked fine.
> 

Great !

> Do you think this a bad idea (The "May lead to fun cases" got me a little
> worried)?
> 
> What I'm doing is making my filter dynamic. In this case a configuration
> property is used to wire my service against the appropriate service
> providers. The service providers expose a list of "qualifiers" (as service
> properties) that they support. The service consumer specifies a "qualifier"
> that is required. By dynamically setting the filter I can change the
> service consumers service requirements dynamically in runtime.
> 

There is a couple of things that can happen:
- if you touch the dependency in the same thread as the filter update, the 
provider set won't change for the current thread (others will be updated)
- if you change the filter and the instance becomes invalid, you will have 
issues if you try to access (untouched) dependency within the same thread. 

I would advise to set the dependency optional to avoid the last issue. 

Regards,

Clement


> /Bengt
> 
> 
> 2012/11/28 Clement Escoffier <[email protected]>
> 
>> Hi,
>> 
>> Are you trying to modify your own filter ? May lead to fun cases :-)
>> 
>> In that case:
>> 
>> InstanceManager me = (InstanceManager) ((Pojo)
>> this).getComponentInstance();
>> 
>> 
>> Explanations:
>> - each iPOJO instance is implementing a org.apache.felix.ipojo.Pojo
>> interface
>> - so implements the getComponentInstance method returning a
>> ComponentInstance
>> - you cast the ComponentInstance to InstanceManager and you're back on
>> track
>> 
>> Regards,
>> 
>> Clement
>> 
>> 
>> On 28 nov. 2012, at 14:19, Bengt Rodehav <[email protected]> wrote:
>> 
>>> Sorry for bothering you again....
>>> 
>>> I use iPOJO annotations like this:
>>> 
>>> *  @Component(name = "componentName", propagation = true, immediate =
>> true)*
>>> *  @Provides*
>>> *  public class MyClass  {*
>>> 
>>> 
>>> I tried the following cast:
>>> 
>>> *    InstanceManager im = (InstanceManager) this;*
>>> 
>>> where "this" is an instance of MyClass. The cast doesn't  work since
>>> MyClass is not a sub class of InstanceManager. How do I get hold of a
>>> component instance?
>>> 
>>> /Bengt
>>> 
>>> 
>>> 
>>> 
>>> 2012/11/28 Bengt Rodehav <[email protected]>
>>> 
>>>> Thanks a lot, will try this approach.
>>>> 
>>>> /Bengt
>>>> 
>>>> 
>>>> 2012/11/28 Clement Escoffier <[email protected]>
>>>> 
>>>>> Hi,
>>>>> 
>>>>> The DependencyModel is the parent class of all the iPOJO's service
>>>>> dependencies.  So, the easiest way is to access to your service
>> dependency:
>>>>> 
>>>>> InstanceManager im = (InstanceManager) componentInstance;
>>>>> DependencyHandler handler =
>>>>> im.getHandler("org.apache.felix.ipojo:requires");
>>>>> Dependencies[] deps = handler.getDependencies();
>>>>> // Lookup your dependency from deps (by id, by specification…)
>>>>> dep.setFilter(filter);
>>>>> 
>>>>> Regards,
>>>>> 
>>>>> Clement
>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> On 28 nov. 2012, at 13:09, Bengt Rodehav <[email protected]> wrote:
>>>>> 
>>>>>> Thanks for you reply Clement,
>>>>>> 
>>>>>> So, the following should work (in principal)?
>>>>>> 
>>>>>> *  @Property(name = "myProperty" mandatory = true)*
>>>>>> *  public void setMyPropertey(String theProperty) {*
>>>>>> *    // Calculate new filter based on myProperty*
>>>>>> *    String filter = ....*
>>>>>> *
>>>>>> *
>>>>>> *    // How do I get an instance of "DependencyModel"?*
>>>>>> *    DependencyModel.setFilter(filter);*
>>>>>> *  }*
>>>>>> 
>>>>>> I've never used the DependencyModel class before. How do I gain access
>>>>> to
>>>>>> the correct instance? What maven artifact do I need for this?
>>>>>> 
>>>>>> /Bengt
>>>>>> 
>>>>>> 
>>>>>> 2012/11/28 Clement Escoffier <[email protected]>
>>>>>> 
>>>>>>> Hi,
>>>>>>> 
>>>>>>> Using the iPOJO API you can use 'setFilter' to update the LDAP filter
>>>>> of a
>>>>>>> dependency (DependencyModel.setFilter). When changed the set of bound
>>>>>>> services is recomputed. Be aware that it may lead to an invalidation
>>>>> of the
>>>>>>> instance if no providers match the new filter.
>>>>>>> 
>>>>>>> What we did in the past is to develop a handler receiving the new
>>>>>>> properties, computing the new filter and applying it to the targeted
>>>>>>> dependency.
>>>>>>> 
>>>>>>> Regards,
>>>>>>> 
>>>>>>> Clement
>>>>>>> 
>>>>>>> On 27 nov. 2012, at 11:41, Bengt Rodehav <[email protected]> wrote:
>>>>>>> 
>>>>>>>> I'm using the latest iPOJO version. I'm trying to use configuration
>>>>>>>> properties (via config admin) to make my service wiring dynamic.
>>>>>>>> 
>>>>>>>> I have handler services that expose service properties (that tells
>> the
>>>>>>>> world what they can handle). The consumer of these services uses
>>>>> @Require
>>>>>>>> with an LDAP filter to specify what needs to be handled and thus
>> limit
>>>>>>> what
>>>>>>>> handlers can be used.
>>>>>>>> 
>>>>>>>> But, I want the LDAP filter to be dynamic so that I can wire up
>>>>> service
>>>>>>>> providers with service consumers by configuration properties on the
>>>>>>>> consumers and providers.
>>>>>>>> 
>>>>>>>> I've tried to buld the LDAP filter dynamically (using a configurable
>>>>>>>> property) but I get the compilation error:
>>>>>>>> 
>>>>>>>> *  The value for annotation attribute Requires.filter must be a
>>>>> constant
>>>>>>>> expression*
>>>>>>>> 
>>>>>>>> I was hoping that if I changed a configuration property, iPOJO would
>>>>>>>> refresh its list of provider services to match the changed LDAP
>>>>> filter.
>>>>>>>> 
>>>>>>>> How can I accomplish what I want? Is there a best practice?
>>>>>>>> 
>>>>>>>> /Bengt
>>>>>>> 
>>>>>>> 
>>>>>>> ---------------------------------------------------------------------
>>>>>>> To unsubscribe, e-mail: [email protected]
>>>>>>> For additional commands, e-mail: [email protected]
>>>>>>> 
>>>>>>> 
>>>>> 
>>>>> 
>>>>> ---------------------------------------------------------------------
>>>>> To unsubscribe, e-mail: [email protected]
>>>>> For additional commands, e-mail: [email protected]
>>>>> 
>>>>> 
>>>> 
>> 
>> 
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: [email protected]
>> For additional commands, e-mail: [email protected]
>> 
>> 


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

Reply via email to