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

