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

Marian Grigoras updated FELIX-3063:
-----------------------------------

    Attachment: bundlerepository_fixMandatoryAfterOptional.diff

patch

> Resolver skips mandatory resource if it previously resolved it as optional
> --------------------------------------------------------------------------
>
>                 Key: FELIX-3063
>                 URL: https://issues.apache.org/jira/browse/FELIX-3063
>             Project: Felix
>          Issue Type: Bug
>          Components: Bundle Repository (OBR)
>    Affects Versions: bundlerepository-1.6.6
>            Reporter: Marian Grigoras
>         Attachments: bundlerepository_fixMandatoryAfterOptional.diff
>
>
> Sample setup: A imports B and C (mandatory), B imports D optionally, C 
> imports D mandatory.
> Starting with resolving A, if the resolver happens to resolve B's dependency 
> first, it will mark D as a resolved *optional* dependency. Later, when 
> resolving C, it will skip the mandatory dependency on D, leaving the D 
> dependency as optional in the end.
> The problem seems the be in ResolverImpl:
> private boolean resolve(Resource resource, Resource[] locals, Resource[] 
> remotes, boolean optional)
> when checking for cycles:
> if (m_resolveSet.contains(resource) || m_requiredSet.contains(resource) || 
> m_optionalSet.contains(resource))
> {
>        return true;
> }
> This should check whether a resource previously resolved as optional has to 
> be solved now as non-optional. Something like:
> if (m_resolveSet.contains(resource) || m_requiredSet.contains(resource)) {
>       return true;
> } else if (m_optionalSet.contains(resource)) {
>       if (optional) {
>               // previously resolved as optional, optional now too --> 
> nothing to do
>               return true;
>       } else {
>               // previously resolved as optional, but now has to be resolved 
> as required --> resolve!
>               m_optionalSet.remove(resource);
>               // continue with resolving
>       }
> }

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to