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