felix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Marian Grigoras (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (FELIX-3063) Resolver skips mandatory resource if it previously resolved it as optional
Date Sun, 31 Jul 2011 14:24:09 GMT

     [ 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

        

Mime
View raw message