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]

