Hi Richard,
This confuses me (and maybe I just don't know enough).
So what you essentially say, is that after Framework.stop(), the system
bundle is essentially in the RESOLVED state just like after an initial
Framework.init() call ? Thus a call to init() after stop() processing
completed has no effect ?
This seems to be kind contradictory to the Framework.stop()
documentation, which includes:
> After being stopped, this Framework may be discarded, initialized or started.
Here is why I am asking: In Sling we do the following for an initial startup :
* Create Framework instance
* call Framework.init()
* install a bunch of bundles
* check whether one of the bundles is a framework extension bundle
* if so:
- call Framework.stop()
- call Framework.init() (once stop completed)
* otherwise:
- continue with next step
* start the framework with Framework.start()
The idea of calling stop()-init() is to make sure the system bundle can
have the newly installed system extension fragments attached.
>From your comment I would assume, this to not be possible and I would
have to create a new Framework instance for that ? Would not be a big
deal, but I would need to know ;-)
Regards
Felix
Am Mittwoch, den 09.02.2011, 22:51 +0000 schrieb Richard S. Hall
(JIRA):
> [
> https://issues.apache.org/jira/browse/FELIX-2822?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
> ]
>
> Richard S. Hall closed FELIX-2822.
> ----------------------------------
>
> Resolution: Fixed
>
> After thinking about it, I realize that the system bundle should be handled
> differently than other bundles when the framework is stopped. Normal bundles
> are unresolved and effectively discarded. The system bundle was being treated
> the same way, but this was causing a problem since the framework instance can
> be reused.
>
> To avoid this situation, since Felix extends BundleImpl, I just overrode
> BundleImpl.close() to do nothing. Thus, when the framework stops all bundles
> except the system bundle are thrown away. This means that once the framework
> is started, the system bundle continues to exist and stays in the RESOLVED
> state forever, even after the framework stops.
>
> This makes sense, because if you reuse the framework instance then the system
> bundle doesn't need to be resolved again since it configuration cannot change
> from one run to the next.
>
> > [Framework] System bundle module's state not reset when framework restarted
> > leading to NPE
> > ------------------------------------------------------------------------------------------
> >
> > Key: FELIX-2822
> > URL: https://issues.apache.org/jira/browse/FELIX-2822
> > Project: Felix
> > Issue Type: Bug
> > Components: Framework
> > Affects Versions: framework-3.0.8
> > Reporter: Richard S. Hall
> > Assignee: Richard S. Hall
> > Priority: Minor
> > Fix For: framework-3.2.0
> >
> >
> > Normally when a bundle is refreshed, we throw away its module and then
> > recreate it, so we are always starting with a fresh module. For the system
> > bundle, when we stop and restart the framework, the system bundle module is
> > reused. When the framework is restarted, the system bundle module state is
> > still resolved, so when we re-resolve it in Framework.init(), it doesn't
> > get empty wires injected into it since the resolver thinks it's resolved.
> > This leads to subsequent NPEs when the resolver tries to wire later modules
> > to the system bundle.
>