I created the following JIRA:

https://issues.apache.org/jira/browse/FELIX-4432

/Bengt


2014-02-21 12:53 GMT+01:00 Clement Escoffier <[email protected]>:

> Hi,
>
> On 20 févr. 2014, at 13:22, Bengt Rodehav <[email protected]> wrote:
>
> > This is a follow up on another discussion I had with Clement on this
> > mailing list:
> >
> >
> http://apache-felix.18485.x6.nabble.com/Using-iPojo-interceptors-tt5006168.html#a5006276
> >
> > I'm now trying to get the interceptor solution into production.
> >
> > Remember that I have to invalidate my instances when their configuration
> is
> > changed. This is because I need to re-evalutate the dependencies for the
> > instance.
> >
> > Originally, I only called the invalidateSelectedServices() method on the
> > DependencyModel. This worked mostly but not when starting a fresh
> container
> > (I use Karaf and start it with "bin\karaf.bat clean"). My instance then
> > first becomes valid but then becomes invalid. I think this is because of
> > the ordering. The accept() method had not been called prior to
> > the getServiceReferences() method. The dependency is therefore not set to
> > "intercepted=true" which makes it invalid.
>
> the filter is updated by the interceptor. (just want to be sure I
> understand). In that case, if the interceptor arrives after the instance
> creation, the filter will be set when the interceptor arrives.
>
> >
> > Replacing the call to  invalidateSelectedServices() with a call to
> > invalidateMatchingServices() seems to do the trick. However, there is one
> > small glitch that I would like to fix.
> >
> > If I have a configuration that should not be valid (e g I specified an
> > extender id that is not present) the instance should never be valid. But,
> > when starting Karaf (both with "bin\karaf.bat" and "bin\karaf.bat
> clean"),
> > the instance becomes valid before it becomes invalid. It does end up in
> the
> > right state (invalid in this case) but for a short period of time it is
> > valid which will cause a lot of things to happen in my code that then
> must
> > be reversed when it becomes invalid.
> >
> > I logged the sequence of events and it seems that the accept() method is
> > called first. I will then set "intercepted=true". This immediately makes
> > the instance valid. Shortly thereafter getServiceReferences() is called.
> I
> > will then re-calculate the dependency requirements and when I later
> > invalidate the dependencies the instance will become valid.
> >
> > So, there is a short time frame where the instance is valid although it
> > shouldn't be. How can I fix that?
>
> This looks like a bug, as the dependency can be valid only if the set of
> selected services is not empty. From what you say, it looks like the
> dependency is valid because the set of matching services is not empty.
>
> >
> > From my point of view this is similar to a transaction. I do not want the
> > instance to become valid before I have done all my "intercepting" which
> is
> > after BOTH the accept() method AND the getServiceReferences() method have
> > been called.
>
> In theory, it is how it should work...
>
> >
> > BTW I also noted that the "dependencies" member in
> > the DefaultDependencyInterceptor class (I extend the
> > DefaultServiceRankingInterceptor class) seems to contain duplicates of my
> > dependency. The same DependencyModel instance occurs twice in the List.
> > Seems like a bug to me. Perhaps the List should be a Set?
>
> Definitely, could you open an issue ?
>
> Clement
>
> >
> > /Bengt
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to