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]

Reply via email to