The two main use cases for the quasi framework are installing bundles into a "side state" (and automatically installing missing dependencies from the Virgo repository) and analysing a dump produced by a resolution failure.
The quasi framework supports the following interfaces:
- QuasiFrameworkFactory with methods to create a quasi framework based on:
- a snapshot of the current OSGi framework state and the region digraph, or
- a directory containing dumps of the OSGi framework state and the region digraph.
- QuasiFramework with methods to:
- install a bundle into the quasi framework (as a quasi bundle, meaning it only exists in the quasi framework)
- inquire the quasi framework
- attempt to resolve the quasi bundles
- diagnose why a particular quasi bundle failed to resolve
- commit all the quasi bundles by installing corresponding bundles in the OSGi framework
- destroy the quasi framework by deleting any associated coregion (described below).
The dump analysis use case is completely offline in the sense that live state is not affected. In this case, the quasi framework contains a snapshot of the OSGi framework and region digraph that were dumped, e.g. on a resolution failure.
The installation use case is offline with respect to the OSGi framework state (unless and until the quasi framework state is committed to the OSGi framework) and is online with respect to the region digraph. In this case, the quasi framework contains a snapshot of the "live" OSGi framework and refers to the "live" region digraph. The live region digraph ius used because of the way the region digraph is implemented in terms of OSGi framework hooks with global effects. It was not possible to create a snapshot of the region digraph for use during resolution. Instead the quasi framework creates a temporary "coregion" to contain any quasi bundles installed into the quasi framework. Since the bundle ids of quasi bundles are not valid in the live OSGi framework, it is unlikely that the coregion could be abused even if some other part of the system noticed its existence and read its contents (i.e. the bundle ids in the coregion). The coregion is deleted when the quasi framework is cleaned up.