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]

