Once again, I'm considering the problem of making sure that a particular bundle or package is available for use -- and downloading and installing the required bundles if not.
OBR should help take care of all this. The present Felix OBR implementation of the RepositoryAdmin.discoverResources() method does not construct a representation of the "local repository" -- the set of bundles already installed -- to include in its search. It defers creating a local repository until it's time to resolve Resources add to a Resolver. This creates another ambiguity. Say that I have bundle "foo.bar" installed, but it's not listed in any of the repository XML files I have fed into RepositoryAdmin.addRepository(). Next I create a filter: (symbolicname=foo.bar) and feed that into RepositoryAdmin.discoverResources(). It will return an empty set of Resources, as "foo.bar" is not in the provided repository set. Now I'm stuck: Is it not possible to acquire "foo.bar", or is it already available? I can't tell from OBR. I'd have to call PackageAdmin.getBundles( "foo.bar", null ) and see if it returns something other than the empty set. Then I'd have to check if any of the bundles that are present are actually resolved, and if not, work on trying to convert their unmet requirements to something OBR could help fulfill. Now, wouldn't this all be easier if RepositoryAdmin.discoverResources() considered the local repository as well? In the case above, it could return a lone Resource for "foo.bar", which could be fed into a Resolver to make sure it's properly resolved. The local resource already gets plucked from the Resolver's set of required resources, so deploy() would proceed just fine as currently implemented, ignoring the local resource that isn't eligible for updating. It would still be hard to tell whether something got installed or not, but at least the outcome would be meet the goal: The named bundle is known to be installed and available for use. Thoughts? -- Steven E. Harris
