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]

