Hi,

Would you be able to send me your interceptor class ? Indeed, my tests work as 
expected.
Here is my code: https://gist.github.com/cescoffier/7859472

Regards,

Clement

On 6 déc. 2013, at 16:47, Bengt Rodehav <[email protected]> wrote:

> No rush - I was just curious.I think it's an interesting use case myself
> and allows me to dynamically build camel routes with a number of predefined
> "bricks/components". Very useful for us.
> 
> /Bengt
> 
> 
> 
> 
> 2013/12/6 Clement Escoffier <[email protected]>
> 
>> Not yet, was travelling (finally back to my office). Will check today or
>> tomorrow.
>> Actually, your use case make me think to a very interesting application
>> I’m working on. So, for sure you will get news soon.
>> 
>> Regards,
>> 
>> Clement
>> 
>> On 6 déc. 2013, at 15:25, Bengt Rodehav <[email protected]> wrote:
>> 
>>> Did you have any chance to check this Clement?
>>> 
>>> /Bengt
>>> 
>>> 
>>> 2013/12/3 Clement Escoffier <[email protected]>
>>> 
>>>> 
>>>> On 3 déc. 2013, at 19:23, Bengt Rodehav <[email protected]> wrote:
>>>> 
>>>>> Yes, I think I'm getting close now but it's been a bit more complicated
>>>>> than I expected. I learn a lot about iPojo though.
>>>>> 
>>>>> About triggering a re-compute...
>>>>> 
>>>>> In my case The set of accepted services will not change. But my propety
>>>>> "extenders" has changed so The services must still be recomputed. I
>> need
>>>> to
>>>>> force it.
>>>> 
>>>> Then calling mDependencyModel.invalidateSelectedServices() should make
>> it
>>>> work. I will check why it’s not called.
>>>> 
>>>> Regards,
>>>> 
>>>> Clement
>>>> 
>>>>> 
>>>>> /Bengt
>>>>> Den 3 dec 2013 17:32 skrev "Clement Escoffier" <
>>>> [email protected]
>>>>>> :
>>>>> 
>>>>>> Hi,
>>>>>> 
>>>>>> It looks you are making great progresses.
>>>>>> 
>>>>>> On 3 déc. 2013, at 17:13, Bengt Rodehav <[email protected]> wrote:
>>>>>> 
>>>>>>> Thanks Clement,
>>>>>>> 
>>>>>>> When I started using the bundle context retrieved using:
>>>>>>> 
>>>>>>> BundleContext bc = model.getComponentInstance().getContext();
>>>>>>> 
>>>>>>> then it started to work even without using the
>> "getWrappedReference()".
>>>>>> Not
>>>>>>> sure why but it does work.
>>>>>> 
>>>>>> Yes, the bundle context retrieved this way is an ‘iPOJO-aware’ bundle
>>>>>> context, aware of the transformation aspect.
>>>>>> 
>>>>>>> 
>>>>>>> I've now added a configuration listener in the open() method that I
>>>>>> remove
>>>>>>> in the close() method. The notifications seem to work as well.
>>>>>>> 
>>>>>>> In my  listener I try to trigger a recomputing of the service
>>>>>> dependencies
>>>>>>> (that I currently now do in the "getServiceReferences()" method as
>>>>>> follows:
>>>>>>> 
>>>>>>>     mDependencyModel.invalidateMatchingServices();
>>>>>>>     mDependencyModel.invalidateSelectedServices();
>>>>>>> 
>>>>>>> This seems to trigger a new call to accept() but no call to
>>>>>>> getServiceReferences(). How can I accomplish that?
>>>>>> 
>>>>>> First, I think that the first call would be enough. If the set of
>>>> accepted
>>>>>> services change, then the getServiceReferences should be called.
>>>>>> 
>>>>>> Clement
>>>>>> 
>>>>>>> 
>>>>>>> /Bengt
>>>>>>> 
>>>>>>> 
>>>>>>> 2013/12/3 Clement Escoffier <[email protected]>
>>>>>>> 
>>>>>>>> Hi,
>>>>>>>> 
>>>>>>>> The error is ‘expected’ as interceptors are dealing with transformed
>>>>>>>> service references and not (genuine) service references. Try to use
>>>>>>>> `transformed.getWrappedReference()` to retrieve the original
>>>> reference.
>>>>>>>> 
>>>>>>>> Regards,
>>>>>>>> 
>>>>>>>> Clement
>>>>>>>> 
>>>>>>>> On 3 déc. 2013, at 10:57, Bengt Rodehav <[email protected]> wrote:
>>>>>>>> 
>>>>>>>>> I've tried something like this:
>>>>>>>>> 
>>>>>>>>> BundleContext bundleContext =
>>>>>>>>> FrameworkUtil.getBundle(IRouteExtender.class).getBundleContext();
>>>>>>>>> 
>>>>>>>>> for (ServiceReference ref : theMatchingRefs) {
>>>>>>>>> IRouteExtender extender = (IRouteExtender)
>>>>>>>> bundleContext.getService(ref);
>>>>>>>>> // Causes exception
>>>>>>>>> System.out.println("Found extender with id: " +
>>>>>>>> extender.getExtenderId());
>>>>>>>>> }
>>>>>>>>> 
>>>>>>>>> But I get the following exception:
>>>>>>>>> 
>>>>>>>>> ERROR: Bundle se.digia.connect.services.generic.service [164]
>>>>>>>>> EventDispatcher: Error during dispatch.
>>>> (java.lang.ClassCastException:
>>>>>>>>> 
>>>> org.apache.felix.ipojo.dependency.impl.TransformedServiceReferenceImpl
>>>>>>>>> cannot be cast to
>>>>>>>>> 
>>>>>> 
>> org.apache.felix.framework.ServiceRegistrationImpl$ServiceReferenceImpl)
>>>>>>>>> java.lang.ClassCastException:
>>>>>>>>> 
>>>> org.apache.felix.ipojo.dependency.impl.TransformedServiceReferenceImpl
>>>>>>>>> cannot be cast to
>>>>>>>>> 
>>>> org.apache.felix.framework.ServiceRegistrationImpl$ServiceReferenceImpl
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.framework.ServiceRegistry.getService(ServiceRegistry.java:250)
>>>>>>>>>    at org.apache.felix.framework.Felix.getService(Felix.java:3420)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.framework.BundleContextImpl.getService(BundleContextImpl.java:468)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> se.digia.connect.service.generic.service.ExtenderInterceptor.__M_calculateExtenders(ExtenderInterceptor.java:104)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> se.digia.connect.service.generic.service.ExtenderInterceptor.calculateExtenders(ExtenderInterceptor.java)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> se.digia.connect.service.generic.service.ExtenderInterceptor.__M_getServiceReferences(ExtenderInterceptor.java:84)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> se.digia.connect.service.generic.service.ExtenderInterceptor.getServiceReferences(ExtenderInterceptor.java)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.dependency.interceptors.DefaultServiceRankingInterceptor.onServiceArrival(DefaultServiceRankingInterceptor.java:61)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.dependency.impl.ServiceReferenceManager.applyRankingOnArrival(ServiceReferenceManager.java:559)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.dependency.impl.ServiceReferenceManager.onNewMatchingService(ServiceReferenceManager.java:510)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.dependency.impl.ServiceReferenceManager.addedService(ServiceReferenceManager.java:496)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.util.Tracker$Tracked.trackAdding(Tracker.java:711)
>>>>>>>>>    at
>>>>>>>>> org.apache.felix.ipojo.util.Tracker$Tracked.track(Tracker.java:672)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.util.Tracker$Tracked.serviceChanged(Tracker.java:633)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.framework.util.EventDispatcher.invokeServiceListenerCallback(EventDispatcher.java:932)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.framework.util.EventDispatcher.fireEventImmediately(EventDispatcher.java:793)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.framework.util.EventDispatcher.fireServiceEvent(EventDispatcher.java:543)
>>>>>>>>>    at
>>>>>>>>> org.apache.felix.framework.Felix.fireServiceEvent(Felix.java:4260)
>>>>>>>>>    at
>>>>>>>> org.apache.felix.framework.Felix.registerService(Felix.java:3275)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.framework.BundleContextImpl.registerService(BundleContextImpl.java:346)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.IPojoContext.registerService(IPojoContext.java:395)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.handlers.providedservice.ProvidedService.registerService(ProvidedService.java:338)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler.__M_stateChanged(ProvidedServiceHandler.java:484)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler.stateChanged(ProvidedServiceHandler.java)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.InstanceManager.setState(InstanceManager.java:536)
>>>>>>>>>    at
>>>>>>>>> 
>>>> org.apache.felix.ipojo.InstanceManager.start(InstanceManager.java:418)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.ComponentFactory.createInstance(ComponentFactory.java:179)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:319)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.IPojoFactory.createComponentInstance(IPojoFactory.java:240)
>>>>>>>>>    at
>>>>>>>>> org.apache.felix.ipojo.IPojoFactory.updated(IPojoFactory.java:737)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.ConfigurationTracker.registerFactory(ConfigurationTracker.java:100)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.IPojoFactory.computeFactoryState(IPojoFactory.java:846)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.ComponentFactory.addedService(ComponentFactory.java:400)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.util.Tracker$Tracked.trackAdding(Tracker.java:711)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.util.Tracker$Tracked.trackInitialServices(Tracker.java:596)
>>>>>>>>>    at org.apache.felix.ipojo.util.Tracker.open(Tracker.java:210)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.ComponentFactory.starting(ComponentFactory.java:249)
>>>>>>>>>    at
>>>>>>>> org.apache.felix.ipojo.IPojoFactory.start(IPojoFactory.java:671)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.extender.internal.linker.ManagedType$ExtensionSupport$1.call(ManagedType.java:229)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.extender.internal.linker.ManagedType$ExtensionSupport$1.call(ManagedType.java:216)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> org.apache.felix.ipojo.extender.internal.queue.JobInfoCallable.call(JobInfoCallable.java:114)
>>>>>>>>>    at
>>>>>>>>> java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
>>>>>>>>>    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
>>>>>>>>>    at
>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
>>>>>>>>>    at java.lang.Thread.run(Thread.java:662)
>>>>>>>>> 
>>>>>>>>> Any ideas?
>>>>>>>>> 
>>>>>>>>> BTW, the exception is only logged in the console - not in any log
>>>>>> files.
>>>>>>>>> 
>>>>>>>>> /Bengt
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 
>>>>>>>>> 2013/12/3 Bengt Rodehav <[email protected]>
>>>>>>>>> 
>>>>>>>>>> I've now tested against trunk and I've come a lot further. Another
>>>>>>>>>> question for you...
>>>>>>>>>> 
>>>>>>>>>> I need access to my service object in the getServiceReferences()
>>>>>> method.
>>>>>>>>>> It is possible if I have the BundleContext. In the accept()
>> method I
>>>>>> get
>>>>>>>>>> the BundleContext passed as a parameter but not in the
>>>>>>>>>> getServiceReferences(). Why is that?
>>>>>>>>>> 
>>>>>>>>>> How can I access the service object from the ServiceReference in
>> the
>>>>>>>>>> getServiceReferences() method? Perhaps the signature of the
>>>>>>>>>> getServiceReferences() method should be changed to take a
>>>>>> BundleContext
>>>>>>>> as
>>>>>>>>>> well?
>>>>>>>>>> 
>>>>>>>>>> /Bengt
>>>>>>>>>> 
>>>>>>>>>> 
>>>>>>>>>> 2013/11/29 Bengt Rodehav <[email protected]>
>>>>>>>>>> 
>>>>>>>>>>> Thanks Clement. I'll check out trunk and see how far I'll get.
>>>>>>>>>>> 
>>>>>>>>>>> /Bengt
>>>>>>>>>>> 
>>>>>>>>>>> 
>>>>>>>>>>> 2013/11/29 Clement Escoffier <[email protected]>
>>>>>>>>>>> 
>>>>>>>>>>>> Hi,
>>>>>>>>>>>> On 29 nov. 2013, at 16:21, Bengt Rodehav <[email protected]>
>>>> wrote:
>>>>>>>>>>>> 
>>>>>>>>>>>>> Thanks Clement!
>>>>>>>>>>>>> 
>>>>>>>>>>>>> I compared our code it turns out I had a type: I had specified
>>>> the
>>>>>>>>>>>> handler
>>>>>>>>>>>>> to "org.apache.felix.ipojo.properties" instead of
>>>>>>>>>>>>> "org.apache.felix.ipojo:properties".. I had a period instead
>> of a
>>>>>>>>>>>> colon.
>>>>>>>>>>>>> That explains my NPE.
>>>>>>>>>>>> 
>>>>>>>>>>>> I probably did a mistake while explaining. The syntax is
>>>>>>>>>>>> namespace:handlername.
>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Now I can also retrieve the property. I can also call the
>>>>>> getValue()
>>>>>>>>>>>> method
>>>>>>>>>>>>> that returns the value in "toString" format. Can't get the
>>>>>>>>>>>> getObjectValue()
>>>>>>>>>>>>> to work though. Looking forward to the new getCurrentValue()
>>>>>> method.
>>>>>>>>>>>> 
>>>>>>>>>>>> Unfortunately the getObjectValue only work for immutable
>>>> properties.
>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> Is it just the org.apache.felix.ipojo artifact I need to check
>>>> out
>>>>>>>> and
>>>>>>>>>>>>> build on trunk?
>>>>>>>>>>>> 
>>>>>>>>>>>> The following version contains the new method:
>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> https://repository.apache.org/content/repositories/snapshots/org/apache/felix/org.apache.felix.ipojo/1.11.1-SNAPSHOT/org.apache.felix.ipojo-1.11.1-20131129.182110-3.jar
>>>>>>>>>>>> 
>>>>>>>>>>>> Clement
>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> /Bengt
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 
>>>>>>>>>>>>> 2013/11/29 Clement Escoffier <[email protected]>
>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> I’ve done some testing:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 1) I’m able to retrieve the properties
>>>>>>>>>>>>>> 2) I’m not able to retrieve the value
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Here is my accept method:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> @Override
>>>>>>>>>>>>>> public <S> TransformedServiceReference<S>
>> accept(DependencyModel
>>>>>>>>>>>>>> dependency, BundleContext context,
>>>> TransformedServiceReference<S>
>>>>>>>>>>>> ref) {
>>>>>>>>>>>>>>   ConfigurationHandlerDescription h =
>>>>>>>>>>>>>> (ConfigurationHandlerDescription)
>>>>>>>>>>>>>> dependency.getComponentInstance().getInstanceDescription()
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> .getHandlerDescription("org.apache.felix.ipojo:properties");
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>   if (h == null) {
>>>>>>>>>>>>>>       return null;
>>>>>>>>>>>>>>   }
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>   PropertyDescription description =
>>>>>>>>>>>> h.getPropertyByName(“extenders");
>>>>>>>>>>>>>>   if (description == null) {
>>>>>>>>>>>>>>       return null;
>>>>>>>>>>>>>>   }
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>   System.out.println(description.getValue() + " / " +
>>>>>>>>>>>>>> Arrays.toString(
>>>>>>>>>>>>>>           (String[]) description.getCurrentValue()));
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>   return ref;
>>>>>>>>>>>>>> }
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> I’ve added the getCurrentValue() to PropertyDescription to
>>>>>> retrieve
>>>>>>>>>>>> the
>>>>>>>>>>>>>> current property value (gonna commit this ASAP).
>>>>>>>>>>>>>> (full code here: https://gist.github.com/cescoffier/7705901)
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Clement
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> On 28 nov. 2013, at 15:06, Bengt Rodehav <[email protected]>
>>>>>> wrote:
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> Thanks!
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>> 2013/11/28 Clement Escoffier <[email protected]>
>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> On 28 nov. 2013, at 14:36, Bengt Rodehav <[email protected]
>>> 
>>>>>>>> wrote:
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> Hello Clement,
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> I changed to the following line:
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> PropertyDescription[] propDescs =
>>>>>>>>>>>>>>>>> configHandlerDescription.getProperties();
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> But I still get an NPE. Have you tried to call these
>> methods
>>>>>> from
>>>>>>>>>>>>>> within
>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>> interceptor?
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Not this method, but I did something pretty similar. Will
>>>>>>>>>>>> investigate to
>>>>>>>>>>>>>>>> see why you get an NPE.
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> Clement
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> /Bengt
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>> 2013/11/28 Clement Escoffier <[email protected]>
>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> On 28 nov. 2013, at 12:17, Bengt Rodehav <
>> [email protected]
>>>>> 
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> Hello again Clement!
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> I was away on business yesterday which is why I'm late
>>>>>>>> replying.
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> I've come a bit further now but still have problems
>>>> accessing
>>>>>>>> my
>>>>>>>>>>>>>>>>>>> component's "extenders" property. Here is what my code
>>>> looks
>>>>>>>> like
>>>>>>>>>>>>>> now:
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> *  public List<ServiceReference>
>>>>>>>>>>>> getServiceReferences(DependencyModel
>>>>>>>>>>>>>>>>>>> theDependencyModel,*
>>>>>>>>>>>>>>>>>>> *      List<ServiceReference> theMatching) {*
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> *    ComponentInstance instance =
>>>>>>>>>>>>>>>>>>> theDependencyModel.getComponentInstance();*
>>>>>>>>>>>>>>>>>>> *    InstanceDescription instanceDescription =
>>>>>>>>>>>>>>>>>>> instance.getInstanceDescription();*
>>>>>>>>>>>>>>>>>>> *    ComponentTypeDescription componentTypeDescription =
>>>>>>>>>>>>>>>>>>> instanceDescription.getComponentDescription();*
>>>>>>>>>>>>>>>>>>> *    String factoryName =
>>>>>>>>>>>>>>>>>>> componentTypeDescription.getFactory().getFactoryName();*
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> *    if (FACTORY_NAME.equals(factoryName)) {*
>>>>>>>>>>>>>>>>>>> *      System.out.println("Found a GenericService2");*
>>>>>>>>>>>>>>>>>>> *      ConfigurationHandlerDescription
>>>>>>>> configHandlerDescription =
>>>>>>>>>>>>>>>>>>> (ConfigurationHandlerDescription) instanceDescription*
>>>>>>>>>>>>>>>>>>> *
>>>>>>>>>>>>>>>> 
>> .getHandlerDescription("org.apache.felix.ipojo.properties");*
>>>>>>>>>>>>>>>>>>> *      int state = instanceDescription.getState();*
>>>>>>>>>>>>>>>>>>> *      System.out.println("State: " + state);*
>>>>>>>>>>>>>>>>>>> *      if(ComponentInstance.VALID ==
>>>>>>>>>>>> instanceDescription.getState())
>>>>>>>>>>>>>> {*
>>>>>>>>>>>>>>>>>>> *        PropertyDescription propDesc =
>>>>>>>>>>>>>>>>>>> configHandlerDescription.getPropertyByName("extenders");
>> //
>>>>>>>> NPE*
>>>>>>>>>>>>>>>>>>> *        if(propDesc != null) {*
>>>>>>>>>>>>>>>>>>> *          String extenders = propDesc.getValue();*
>>>>>>>>>>>>>>>>>>> *          System.out.println("Extenders: " +
>> extenders);*
>>>>>>>>>>>>>>>>>>> *        }*
>>>>>>>>>>>>>>>>>>> *        else {*
>>>>>>>>>>>>>>>>>>> *          System.out.println("Extenders is null");*
>>>>>>>>>>>>>>>>>>> *        }*
>>>>>>>>>>>>>>>>>>> *      }*
>>>>>>>>>>>>>>>>>>> *    }*
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> I check the factory name to determine if this is a
>>>> component
>>>>>>>>>>>> that I
>>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>> intercept. Presently I wait until the component is valid
>>>> but
>>>>>>>> I'm
>>>>>>>>>>>> not
>>>>>>>>>>>>>>>> sure
>>>>>>>>>>>>>>>>>>> if I can wait since my interceptor has to kick in before
>>>>>> that.
>>>>>>>>>>>>>>>> Presently
>>>>>>>>>>>>>>>>>> I
>>>>>>>>>>>>>>>>>>> get a null pointer exception when I try to retrieve my
>>>>>>>> property.
>>>>>>>>>>>> Do
>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>> have any idea why? It doesn't seem possible to retrieve
>>>>>>>>>>>> properties at
>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>> pont.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Did you try to inter ate over the set of properties and
>> see
>>>>>> what
>>>>>>>>>>>> are
>>>>>>>>>>>>>>>> they ?
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> I also noticed that the method
>>>> PropertyDescription.getValue()
>>>>>>>>>>>> always
>>>>>>>>>>>>>>>>>>> returns a String. In my case the underlying object is an
>>>>>> array
>>>>>>>> of
>>>>>>>>>>>>>>>> String
>>>>>>>>>>>>>>>>>>> (String[]). Is it possible to get the value in the
>> correct
>>>>>>>> type?
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Yes, there is a getObjectValue(BundleContext context)
>>>> method,
>>>>>>>> but
>>>>>>>>>>>> you
>>>>>>>>>>>>>>>> need
>>>>>>>>>>>>>>>>>> to give a bundle context object used if it needs to load
>>>>>>>> classes.
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> Clement
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> /Bengt
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>> 2013/11/27 Clement Escoffier <
>> [email protected]>
>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> On 26 nov. 2013, at 16:00, Bengt Rodehav <
>>>> [email protected]
>>>>>>> 
>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> I'm getting a bit closer regarding the interceptors.
>>>> Still
>>>>>>>> two
>>>>>>>>>>>>>>>> problems
>>>>>>>>>>>>>>>>>>>> for
>>>>>>>>>>>>>>>>>>>>> me:
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> a) I still don't understand how to get hold of my
>>>>>> intercepted
>>>>>>>>>>>>>>>> instance
>>>>>>>>>>>>>>>>>>>> from
>>>>>>>>>>>>>>>>>>>>> within my interceptor. I get a reference to a
>>>>>> DependencyModel
>>>>>>>>>>>> from
>>>>>>>>>>>>>>>>>> which
>>>>>>>>>>>>>>>>>>>> I
>>>>>>>>>>>>>>>>>>>>> can get a ComponentInstance. But how do I go from there
>>>> to
>>>>>> my
>>>>>>>>>>>>>>>>>> ComponentA
>>>>>>>>>>>>>>>>>>>>> class. I need to access the property "extenders" in
>> order
>>>>>> for
>>>>>>>>>>>> my
>>>>>>>>>>>>>>>>>>>>> interceptor to do its job.
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> It depends how how is managed the extender property,
>> let’s
>>>>>>>>>>>> imagine
>>>>>>>>>>>>>>>> it’s
>>>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>> @Property. In this case, from the Dependency Model, you
>>>> can
>>>>>>>>>>>> retrieve
>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> component instance. From the instance, you have access
>> to
>>>>>> the
>>>>>>>>>>>>>>>>>> introspection
>>>>>>>>>>>>>>>>>>>> layer (getInstanceDescription()), which let you analyze
>>>> the
>>>>>>>>>>>> iPOJO
>>>>>>>>>>>>>>>>>> container.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> To be a bit more clear, let’s see some code:
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> //First retrieve the configuration handler description
>>>> from
>>>>>>>> the
>>>>>>>>>>>>>>>> instance
>>>>>>>>>>>>>>>>>>>> container:
>>>>>>>>>>>>>>>>>>>> ConfigurationHandlerDescription description =
>>>>>>>>>>>>>>>>>>>> (ConfigurationHandlerDescription)
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>>>> 
>>>>>> 
>>>> 
>> model.getComponentInstance().getInstanceDescription().getHandlerDescription("org.apache.felix.ipojo.properties”);
>>>>>>>>>>>>>>>>>>>> // Find the extenders property
>>>>>>>>>>>>>>>>>>>> String extenders =
>>>>>>>>>>>>>>>>>> description.getPropertyByName("extenders").getValue();
>>>>>>>>>>>>>>>>>>>> // You have your value !
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> b) Also, when the property "extenders" is changed, I
>> need
>>>>>> to
>>>>>>>>>>>> force
>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>> interceptor to recalculate the dependencies. How can I
>>>>>>>>>>>> accomplish
>>>>>>>>>>>>>>>> that?
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> It also depends on how this reconfiguration happen.
>> Let’s
>>>>>> say
>>>>>>>>>>>> that
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> instance is reconfigured from the configuration admin or
>>>>>> iPOJO
>>>>>>>>>>>>>>>>>>>> reconfiguration abilities. In these case being notified
>> is
>>>>>>>> quite
>>>>>>>>>>>>>>>>>> simple, as
>>>>>>>>>>>>>>>>>>>> you can register a ConfigurationListener on the
>>>>>>>>>>>>>>>>>>>> ConfigurationHandlerDescription object:
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> description.addListener(new ConfigurationListener() {
>>>>>>>>>>>>>>>>>>>>    public void configurationChanged(ComponentInstance
>>>>>>>>>>>>>> instance,
>>>>>>>>>>>>>>>>>>>> Map<String, Object> configuration) {
>>>>>>>>>>>>>>>>>>>>        // The extender property may have been modified
>>>>>>>>>>>>>>>>>>>>    }
>>>>>>>>>>>>>>>>>>>> });
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> Don’t forget to unregister the listener when the
>>>> interceptor
>>>>>>>> is
>>>>>>>>>>>>>>>>>> unplugged
>>>>>>>>>>>>>>>>>>>> from the instance.
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> Getting deeper into iPojo than I've been before…
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>> It’s just the beginning…. (contributions are welcome if
>>>> you
>>>>>>>> see
>>>>>>>>>>>> some
>>>>>>>>>>>>>>>>>>>> dark(er) area)
>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> /Bengt
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>> 2013/11/26 Bengt Rodehav <[email protected]>
>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> Thanks Clement!
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 2013/11/26 Clement Escoffier <
>>>> [email protected]
>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> On 25 nov. 2013, at 20:19, Bengt Rodehav <
>>>>>>>> [email protected]>
>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Hello Clement and as always thanks for your detailed
>>>>>>>> answer!
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> You’re welcome.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> It does seem a bit complicated to "require" an
>>>>>>>> interceptor.
>>>>>>>>>>>>>>>> Perhaps
>>>>>>>>>>>>>>>>>> an
>>>>>>>>>>>>>>>>>>>>>>>> easier way of doing this might be possible in the
>>>>>> future.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> I think it would be a good addition. Thinking about
>> it.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Anyway, I'm not
>>>>>>>>>>>>>>>>>>>>>>>> exactly sure that I understood what you meant. Just
>> to
>>>>>>>>>>>> clarify:
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> My Component A (the component to be intercepted) has
>>>> the
>>>>>>>>>>>>>> following
>>>>>>>>>>>>>>>>>>>> code:
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> @Property(name = "extenders", mandatory = false)
>>>>>>>>>>>>>>>>>>>>>>>> private String[] mExtenderIds;
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> @Requires(optional = true, id = "extenders")
>>>>>>>>>>>>>>>>>>>>>>>> private IExtender[] mExtenders;
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Do you mean that I should put a filter on the
>>>> @Requires
>>>>>>>> with
>>>>>>>>>>>>>>>>>>>>>>> id="extenders"
>>>>>>>>>>>>>>>>>>>>>>>> (the intercepted = true) so that it can only be
>>>>>> satisfied
>>>>>>>>>>>> if my
>>>>>>>>>>>>>>>>>>>>>>> interceptor
>>>>>>>>>>>>>>>>>>>>>>>> has added that property?
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Exactly.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> But how do I then handle the situation where my
>>>>>> Component
>>>>>>>> A
>>>>>>>>>>>> does
>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>> require any extenders? In that case I was planning
>> on
>>>>>>>>>>>> setting
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>> dependency to optional to make my instance valid
>>>> without
>>>>>>>> any
>>>>>>>>>>>>>>>>>>>> extenders.
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Or, perhaps I could first set the @Requires to
>>>> mandatory
>>>>>>>>>>>> (with
>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> filter):
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> @Requires(optional = false, id = "extenders",
>>>>>>>>>>>>>>>>>>>>>>> filter="(intercepted=true)")
>>>>>>>>>>>>>>>>>>>>>>>> private IExtender[] mExtenders;
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> Then, if my interceptor sees that the instance does
>>>> not
>>>>>>>>>>>> require
>>>>>>>>>>>>>>>> any
>>>>>>>>>>>>>>>>>>>>>>>> extenders it can set the dependency to become
>>>> optional.
>>>>>>>> This
>>>>>>>>>>>>>> way I
>>>>>>>>>>>>>>>>>>>> both
>>>>>>>>>>>>>>>>>>>>>>>> require the interceptor (via the filter) and I
>> ensure
>>>>>> that
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>> only
>>>>>>>>>>>>>>>>>>>> way
>>>>>>>>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>> allow the instance to be valid without the
>> dependency
>>>> is
>>>>>>>> if
>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>> interceptor
>>>>>>>>>>>>>>>>>>>>>>>> has explicitly set the dependency to optional.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> That would work. You can change the optionality
>> status
>>>> of
>>>>>>>> the
>>>>>>>>>>>>>>>>>>>> dependency
>>>>>>>>>>>>>>>>>>>>>>> from the dependency model you get in the interceptor.
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>> Clement
>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> /Bengt
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 2013/11/25 Clement Escoffier <
>>>>>> [email protected]
>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> On 25 nov. 2013, at 11:04, Bengt Rodehav <
>>>>>>>>>>>> [email protected]>
>>>>>>>>>>>>>>>>>> wrote:
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> I've started to investigate using iPojo
>>>> interceptors.
>>>>>>>> I'm
>>>>>>>>>>>>>> using
>>>>>>>>>>>>>>>>>>>> iPojo
>>>>>>>>>>>>>>>>>>>>>>>>>> version 1.11.0. I want to accomplish the
>> following:
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Component A can be "extended" by specifying a list
>>>> of
>>>>>>>>>>>>>> (required)
>>>>>>>>>>>>>>>>>>>>>>>>>> "extenders" (actually their id's), like this:
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> @Property(name = "extenders", mandatory = false)
>>>>>>>>>>>>>>>>>>>>>>>>>> private String[] mExtenderIds;
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> @Requires(optional = true, id = "extenders")
>>>>>>>>>>>>>>>>>>>>>>>>>> private IExtender[] mExtenders;
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> The property is optional but if any extenderId's
>> are
>>>>>>>>>>>> listed
>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>> @Requires should require that IExtender's with the
>>>>>>>>>>>>>> corresponding
>>>>>>>>>>>>>>>>>>>>>>>>> extenderId
>>>>>>>>>>>>>>>>>>>>>>>>>> is started.
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> The IExtender interface contains the following
>>>> method:
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> public String getExtenderId();
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Thus, every extender has an extenderId and if that
>>>> id
>>>>>> is
>>>>>>>>>>>>>> listed
>>>>>>>>>>>>>>>>>> in a
>>>>>>>>>>>>>>>>>>>>>>>>>> components "extender" property then the
>>>> corresponding
>>>>>>>>>>>> service
>>>>>>>>>>>>>>>>>> should
>>>>>>>>>>>>>>>>>>>>>>> be
>>>>>>>>>>>>>>>>>>>>>>>>>> required, otherwise not.
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> My idea (actually Clement's idea from a previous
>>>>>>>>>>>> conversation
>>>>>>>>>>>>>> on
>>>>>>>>>>>>>>>>>>>> this
>>>>>>>>>>>>>>>>>>>>>>>>>> list). is to use a RankingInterceptor that returns
>>>> an
>>>>>>>>>>>> empty
>>>>>>>>>>>>>>>> array
>>>>>>>>>>>>>>>>>>>>>>> until
>>>>>>>>>>>>>>>>>>>>>>>>> all
>>>>>>>>>>>>>>>>>>>>>>>>>> required services are present.
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> I think this is doable but in order for my
>>>>>>>>>>>> RankingInterceptor
>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>> work, it
>>>>>>>>>>>>>>>>>>>>>>>>>> must have access to the component's "extenders"
>>>>>>>> property.
>>>>>>>>>>>> It
>>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>> then
>>>>>>>>>>>>>>>>>>>>>>>>> go
>>>>>>>>>>>>>>>>>>>>>>>>>> through all the services implementing the
>> IExtender
>>>>>>>>>>>> interface
>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>>>>>>> there
>>>>>>>>>>>>>>>>>>>>>>>>>> are extenders corresponding to the required
>>>>>> extenderId's
>>>>>>>>>>>> it
>>>>>>>>>>>>>>>> would
>>>>>>>>>>>>>>>>>>>>>>> return
>>>>>>>>>>>>>>>>>>>>>>>>>> all of those, otherwise it would return an empty
>>>> list.
>>>>>>>>>>>> Also,
>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>> list of
>>>>>>>>>>>>>>>>>>>>>>>>>> extenderId's was specified, then the service
>>>>>> dependency
>>>>>>>>>>>> is set
>>>>>>>>>>>>>>>> to
>>>>>>>>>>>>>>>>>>>>>>>>>> mandatory, otherwise to optional.
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> My problem is how to gain access to the
>>>> configuration
>>>>>>>>>>>> property
>>>>>>>>>>>>>>>>>> (the
>>>>>>>>>>>>>>>>>>>>>>>>>> "extenders" property) of my component from the
>>>>>>>>>>>> interceptor.
>>>>>>>>>>>>>> How
>>>>>>>>>>>>>>>>>> can
>>>>>>>>>>>>>>>>>>>> I
>>>>>>>>>>>>>>>>>>>>>>> do
>>>>>>>>>>>>>>>>>>>>>>>>>> this?
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> When the interceptor is hooked to a dependency, it
>>>>>>>>>>>> receives the
>>>>>>>>>>>>>>>>>>>>>>> dependency
>>>>>>>>>>>>>>>>>>>>>>>>> model object. From this object you can retrieve the
>>>>>>>>>>>> component
>>>>>>>>>>>>>>>>>>>> instance
>>>>>>>>>>>>>>>>>>>>>>> and
>>>>>>>>>>>>>>>>>>>>>>>>> get the introspection metadata.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> Another question I have is how to make sure that
>> the
>>>>>>>>>>>>>> interceptor
>>>>>>>>>>>>>>>>>> is
>>>>>>>>>>>>>>>>>>>>>>>>> active.
>>>>>>>>>>>>>>>>>>>>>>>>>> If the interceptor is not active then my component
>>>>>> could
>>>>>>>>>>>>>> become
>>>>>>>>>>>>>>>>>>>>>>>>> erroneously
>>>>>>>>>>>>>>>>>>>>>>>>>> valid. Would it be feasible to have a mandatory
>>>>>>>>>>>> dependency on
>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>>> interceptor?
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Unfortunately not, at least not easily. What you
>> can
>>>> do
>>>>>>>> is
>>>>>>>>>>>> a
>>>>>>>>>>>>>>>>>>>>>>> combination
>>>>>>>>>>>>>>>>>>>>>>>>> between a filter and two interceptors: the ranking
>>>>>>>>>>>> interceptors
>>>>>>>>>>>>>>>> as
>>>>>>>>>>>>>>>>>>>> you
>>>>>>>>>>>>>>>>>>>>>>> did,
>>>>>>>>>>>>>>>>>>>>>>>>> and a tracking interceptor. Let me explain:
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Let’s imagine your consumer with your service
>>>>>> dependency.
>>>>>>>>>>>> Add a
>>>>>>>>>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>>>>>>>>> that will be resolved only if your interceptor is
>>>>>> there,
>>>>>>>>>>>>>>>> something
>>>>>>>>>>>>>>>>>>>>>>> like:
>>>>>>>>>>>>>>>>>>>>>>>>> (intercepted=true).
>>>>>>>>>>>>>>>>>>>>>>>>> Your interceptor implement both tracking and
>> ranking
>>>>>>>>>>>>>>>> interceptors.
>>>>>>>>>>>>>>>>>>>> When
>>>>>>>>>>>>>>>>>>>>>>>>> the accept method is called on your interceptor, it
>>>>>> can
>>>>>>>>>>>>>>>>>> ‘transform’
>>>>>>>>>>>>>>>>>>>>>>> the
>>>>>>>>>>>>>>>>>>>>>>>>> original service reference to add the ‘intercepted’
>>>>>>>>>>>> property
>>>>>>>>>>>>>>>>>>>>>>>>> (ref.addProperty(“intercepted”, true);) This
>> modified
>>>>>>>>>>>> service
>>>>>>>>>>>>>>>>>>>> reference
>>>>>>>>>>>>>>>>>>>>>>>>> matches your filter. Then, do your ranking policy
>> are
>>>>>> we
>>>>>>>>>>>>>>>> discussed.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> This solution ensure that your dependency can only
>> be
>>>>>>>>>>>> resolved
>>>>>>>>>>>>>> if
>>>>>>>>>>>>>>>>>>>> your
>>>>>>>>>>>>>>>>>>>>>>>>> interceptor is there. Indeed without the
>> interceptor,
>>>>>> the
>>>>>>>>>>>>>> filter
>>>>>>>>>>>>>>>>>> does
>>>>>>>>>>>>>>>>>>>>>>> not
>>>>>>>>>>>>>>>>>>>>>>>>> match.
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Regards,
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>> Clement
>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>>>>>>>>>> /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]
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>>>>>> 
>>>>>>>>>>>> 
>>>>>> ---------------------------------------------------------------------
>>>>>>>>>>>>>>>> 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]
>>>>>> 
>>>>>> 
>>>> 
>>>> 
>>>> ---------------------------------------------------------------------
>>>> 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