Going back to the mailing list again. Just didn't want to send our java code on a public list.
/Bengt 2013/12/9 Bengt Rodehav <[email protected]> > OK - I hadn't noticed that the parent classes kept a list... > > In my case, however, I only want to intercept certain instances (the ones > with the factory name equals to "connect.generic2". In the open method I > check the factory name and then store my houskeeping information in a map > with the dependency model as a key. In my callbacks I can then check > whether the dependency model is in the map or not. If it is, then my logic > should kick in otherwise not. > > /Bengt > > > 2013/12/9 Clement Escoffier <[email protected]> > >> Hi, >> >> >> On 9 déc. 2013, at 08:02, Bengt Rodehav <[email protected]> wrote: >> >> Here is my inteceptor Clement. It's a bit polluted with logging since >> I've been trying to find out what the problem is. Also, I wasn't sure >> whether it was OK to add add the property "intercepted" more than once. >> Therefore I now hold all the intercepted instances in a Map to be able to >> store some housekeeping stuff. Not sure what would be the best practice >> here. >> >> >> Thanks, >> Just had a very quick look. >> >> In my case I've just extended DefaultDependencyInterceptor avoiding >> maintaining my own list. You should be able to add ‘intercepted’ several >> times as it’s backed in a map, so the previous value is overridden. >> >> Will have a closer look Today, >> >> Regards, >> >> Clement >> >> >> I deploy this in Karaf 2.3.3. >> >> /Benke >> >> >> 2013/12/9 Bengt Rodehav <[email protected]> >> >>> I'll send the java code to your personal email Clement, >>> >>> /Bengt >>> >>> >>> 2013/12/8 Clement Escoffier <[email protected]> >>> >>>> 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] >>>> >> >>>> >> >>>> >>>> >>> >> <ExtenderInterceptor.java> >> >> >> >

