Hi, I did something pretty close to your implementation: https://gist.github.com/cescoffier/7914911
It works as expected, however the reconfiguration listener is called only when the instance is reconfigured (so setting the field from the code is not enough). Regards, Clement On 9 déc. 2013, at 08:19, Bengt Rodehav <[email protected]> wrote: > 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> >>> >>> >>> >>

