[ 
https://issues.apache.org/jira/browse/FELIX-280?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Guillaume Nodet resolved FELIX-280.
-----------------------------------

       Resolution: Duplicate
    Fix Version/s: bundlerepository-1.6.0
         Assignee: Guillaume Nodet

Closing this issue as a duplicate 

> OBR should be able to confirm satisfaction of a filter, including 
> availability of local resources
> -------------------------------------------------------------------------------------------------
>
>                 Key: FELIX-280
>                 URL: https://issues.apache.org/jira/browse/FELIX-280
>             Project: Felix
>          Issue Type: Improvement
>          Components: Bundle Repository (OBR)
>    Affects Versions: felix-1.0.0
>         Environment: NA
>            Reporter: Steven E. Harris
>            Assignee: Guillaume Nodet
>             Fix For: bundlerepository-1.6.0
>
>
> This discussion started on the felix-dev list in the thread entitled
>   Should OBR RepositoryAdmin.discoverResources() include local repository?
>   http://www.mail-archive.com/[email protected]/msg00071.html
> The root problem involves considering the filter supplied to 
> RepositoryAdmin.discoverResources() as a goal, and wanting OBR to help in 
> achieving that goal, including the possibility that no additional steps are 
> required to satisfy the goal. That is, the current state of the local 
> repository may satisfy the goal, even though no remote repository can offer 
> anything. A client attempting to meet such a goal should still be able to 
> discern that its goal has been met.
> At present, the OBR workflow starts with a client calling 
> RepositoryAdmin.discoverResources(), locating Resources available in remote 
> repositories matching the supplied filter. These Resources are then fed into 
> a Resolver, which figures out what additional Resources may be needed to 
> satisfy the root Resources' requirements. Some of these Requirements may be 
> satisfied by resources already available locally, as represented in the local 
> repository.
> If a client seeks to ensure that, say, bundle "foo.bar" of version "1.0" is 
> available for use, he can supply a filter like
>   (&(symbolicname=foo.bar)(version=1.0))
> to RepositoryAdmin.discoverResources() and see which Resources can fulfil 
> this goal. However, if this bundle is not available in any remote 
> repositories, but is already available locally, OBR still signals failure, or 
> at least defeat. The client cannot tell that its goal is already fulfilled.
> My first suggestion was to have RepositoryAdmin.discoverResources() take the 
> local repository into account as a source for Resources. However, this isn't 
> quite what the problem demands.
> Really, we want a way to turn a filter into a set of Requirements to be added 
> to a Resolver. Alternately, we'd like to be able to feed a filter directly 
> into a Resolver to add match criteria, much like Resolver.add() allows one to 
> add a Resource as both a goal and a source of Requirements.
> We should be able to skip the RepositoryAdmin.discoverResources() step 
> entirely and instead call an overload of Resolver.add() that either takes a 
> Filter or a String representing a filter to be parsed.
> The current workflow oscillates somewhat strangely between identification of 
> matching Resources and adding more Resources to satisfy additional discovered 
> Requirements. Why even bother exposing the first set of Resources matched, 
> forcing the client to push them into the Resolver? As 
> RepositoryAdmin.discoverResources() is the only way that a client can cause a 
> Resource to be emitted (Resources not being constructible by a client), their 
> only path flows between RepositoryAdmin.discoverResources() and 
> Resolver.add(). We could just close that gap and allow Resolver to process a 
> filter internally, with full access to the local repository as well.
> With changes like these in place, my scenario involving a resource available 
> locally but not remotely would be accommodated: If, after adding my filter to 
> a Resolver, Resolver.resolve() returns true, I know my goal can be satisfied. 
> Calling Resolver.deploy() in that case would be a no-op, but should succeed 
> without error nonetheless.
> One problem I see implementing such a solution is the Filter class itself. 
> Filters as defined in OSGi are opaque and one-way: one can only ask if a 
> filter matches a Dictionary, not "ask" a filter what it demands. Hence, a 
> Filter can't be converted to a set of Requirement instances. It can only act 
> like a set of Requirements in its matching behavior.
> Note that the whole filter could be bypassed if we had some public 
> Requirement factory functions, such as:
>   public static Requirement requireBundle(String symbolicName);
>   public static Requirement requireBundle(String symbolicName, String 
> versionConstraint);
>   public static Requirement requirePackage(String packageName);
>   public static Requirement requirePackage(String packageName, String 
> versionConstraint);
> Then, add a method to Resolver:
>   add(Requirement req);
> I'd appreciate some discussion of the viability of these suggestions.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to