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]
>
>

Reply via email to