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