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] >> >>

