Wrong error message on a missing package
----------------------------------------

                 Key: FELIX-2459
                 URL: https://issues.apache.org/jira/browse/FELIX-2459
             Project: Felix
          Issue Type: Bug
          Components: Framework
    Affects Versions: framework-3.0.1
         Environment: It affects Felix 3.0.1 but this version is not listed as 
released version in this issue tracker (but it has been released !)
            Reporter: Florent BENOIT


  Hi,

Here is the case :

 I have one bundle with a missing import, I need to fix the bundle but Felix 
3.0.1 is not helping me with the errors that are thrown. (the missing package 
required to start my bundle is "org.apache.juli.logging") and this missing 
package is not reported as a missing package in 3.0.1 while it was reported 
with Felix 2.0.5


When testing this bundle with Felix 3.0.1, I get the following message :
org.osgi.framework.BundleException: Unresolved constraint in bundle xxx [89]: 
Unable to resolve 89.0: missing requirement [89.0] package; 
(&(package=org.apache.catalina.tribes.group.interceptors)(version>=7.0.0)) - 
[89.0] package; 
(&(package=org.apache.catalina.tribes.group.interceptors)(version>=7.0.0))
        at org.apache.felix.framework.Felix.resolveBundle(Felix.java:3421)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:1754)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:905)

This package (org.apache.catalina.tribes.group.interceptors) is present in my 
bundle archive. 
It tells me that a requirement is not available but I don't know which package 
is missing which is a big problem as it's quite difficult to fix an issue when 
there is a missing information


By switching back to Felix v2.0.5, I have the following error :
org.osgi.framework.BundleException: Unresolved constraint in bundle xxx [89]: 
package; (package=org.apache.juli.logging)
        at org.apache.felix.framework.Felix.resolveBundle(Felix.java:3299)
        at org.apache.felix.framework.Felix.startBundle(Felix.java:1657)
        at org.apache.felix.framework.BundleImpl.start(BundleImpl.java:905)

And now, we can see that the missing package is printed


By adding some breakpoint in Felix 3.0.1, I can see that the original error is 
raised in ResolverImpl class but then this error is ignored


Here is the code that is raising my expecting missing package :

            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;
            }
The exception which is built here is :
org.apache.felix.framework.resolver.ResolveException: Unable to resolve 89.0: 
missing requirement [89.0] package; (package=org.apache.juli.logging)

        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 437     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.resolve(Resolver$ResolverState, Module) line: 78   
        Felix$FelixResolver.resolve(Module) line: 4005  
        Felix.resolveBundle(BundleImpl) line: 3414      
        Felix.startBundle(BundleImpl, int) line: 1754   
        BundleImpl.start(int) line: 905 


But this issue is ignored at the line 422 by the following code :

                    try
                    {
                        populateCandidates(state, candCap.getModule(),
                            candidateMap, resultCache);
                    }
                    catch (ResolveException ex)  <--- silently catched
                    {
                        // Remove the candidate since we weren't able to
                        // populate its candidates.
                        itCandCap.remove();
                    }

        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 422     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.populateCandidates(Resolver$ResolverState, Module, Map, 
Map) line: 415     
        ResolverImpl.resolve(Resolver$ResolverState, Module) line: 78   
        Felix$FelixResolver.resolve(Module) line: 4005  
        Felix.resolveBundle(BundleImpl) line: 3414      
        Felix.startBundle(BundleImpl, int) line: 1754   
        BundleImpl.start(int) line: 905 


Then I get an error by Felix but not the original root cause which is a problem 
for me
I get at these lines :

ex = org.apache.felix.framework.resolver.ResolveException: Unable to resolve 
89.0: missing requirement [89.0] package; 
(&(package=org.apache.catalina.tribes.group.interceptors)(version>=7.0.0))

                            catch (ResolveException ex)
                            {
                                if ((ex.getRequirement() != null)
                                    && (ex.getRequirement() instanceof 
FragmentRequirement)
                                    && (rootModule !=
                                        ((FragmentRequirement) 
ex.getRequirement()).getFragment()))
                                {
                                    m_resolverState.detachFragment(
                                        newRootModule,
                                        ((FragmentRequirement) 
ex.getRequirement()).getFragment());
                                    repeat = true;
                                }
                                else
                                {
                                    throw ex;
                                }
                            }

        Felix$FelixResolver.resolve(Module) line: 4013  
        Felix.resolveBundle(BundleImpl) line: 3414      
        Felix.startBundle(BundleImpl, int) line: 1754   
        BundleImpl.start(int) line: 905 


and this is the error which is reported to me, but this can't help me as the 
true missing package has been lost.


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