Hello Clement and as always thanks for your detailed answer! It does seem a bit complicated to "require" an interceptor. Perhaps an easier way of doing this might be possible in the future. 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? 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. /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] > >

