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]

Reply via email to