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

Richard S. Hall closed FELIX-2533.
----------------------------------


Reported as fixed.

> Cause of unsatisfied requirements is lost sometimes when a bundles exports is 
> a candidate for its own imports
> -------------------------------------------------------------------------------------------------------------
>
>                 Key: FELIX-2533
>                 URL: https://issues.apache.org/jira/browse/FELIX-2533
>             Project: Felix
>          Issue Type: Bug
>          Components: Framework
>            Reporter: James Roper
>
> If a bundle imports its own exports, then if another import from that bundle 
> fails to resolve, it is possible that that error message will be lost, and 
> instead an error message saying that the import of its own export couldn't be 
> resolved is thrown.  The problem is in ResolverImpl, in the 
> populateCandidates method:
> {code:java}
>             // Get satisfying candidates and populate their candidates if 
> necessary.
>             Set<Capability> candidates = state.getCandidates(module, req, 
> true);
>             for (Iterator<Capability> itCandCap = candidates.iterator(); 
> itCandCap.hasNext(); )
>             {
>                 Capability candCap = itCandCap.next();
>                 if (!candCap.getModule().isResolved())
>                 {
>                     try
>                     {
>                         populateCandidates(state, candCap.getModule(),
>                             candidateMap, resultCache);
>                     }
>                     catch (ResolveException ex)
>                     {
>                         // Remove the candidate since we weren't able to
>                         // populate its candidates.
>                         itCandCap.remove();
>                     }
>                 }
>             }
>             // If there are no candidates for the current requirement
>             // and it is not optional, then create, cache, and throw
>             // a resolve exception.
>             if ((candidates.size() == 0) && !req.isOptional())
>             {
>                 ResolveException ex =
>                     new ResolveException("Unable to resolve " + module
>                         + ": missing requirement " + req, module, req);
>                 resultCache.put(module, ex);
>                 m_logger.log(Logger.LOG_DEBUG, "No viable candidates", ex);
>                 throw ex;
>             }
> {code}
> Let's say I have bundle A, with the following exports/imports:
> {noformat}
> Export-Package: com.foo
> Import-Package: com.foo,com.bar
> {noformat}
> If populateCandidates tries to find candidates for com.foo first, it will 
> find bundle A as a candidate.  Because its currently resolving bundle A, it 
> will recursively call populateCandidates to try and finish resolving bundle 
> A.  This next iteration will attempt to find candidates for com.bar, if this 
> fails, it will throw a ResolveException.  This will then get caught by the 
> first invocation of populateCandidates, which is currently trying to find 
> candidates for com.foo, and ignored.  The bundle A candidate for com.foo is 
> removed from the candidates, which then results in an exception being thrown, 
> saying bundle A can't find any requirements for com.foo, when the real reason 
> is that it couldn't find any requirements for com.bar.
> This results in developers banging their head against a wall wondering what 
> on earth they've done wrong for hours on end.

-- 
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