You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Richard S. Hall (JIRA)" <ji...@apache.org> on 2010/07/01 17:53:49 UTC

[jira] Issue Comment Edited: (FELIX-2459) Wrong error message on a missing package

    [ https://issues.apache.org/jira/browse/FELIX-2459?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12884326#action_12884326 ] 

Richard S. Hall edited comment on FELIX-2459 at 7/1/10 11:51 AM:
-----------------------------------------------------------------

If you can get me some repeatable steps, I will try to look into improving the message, even if I have to download lots of bytes. :-)

Regarding your request to give more info, I understand it would be nice, but it is not likely to be done for a variety of reasons. First, like a compiler error, often early errors make later errors unmeaningful. Further, being exhaustive is difficult once any single link is broken, because you no know that you need to traverse the missing link and there could be more errors down there. Lastly, even if we could be exhaustive, you might be waiting years for the algorithm to finish telling you all of the potential errors. :-) The goal of the resolver is to hopefully be quick in most cases, which conflicts with providing thorough debugging information.

It does look like we are logging the exceptions though, so in the meantime try setting your framework log level to DEBUG to see if you get your desired exception logged. Otherwise, get me the steps to reproduce and I will try to look at your specific scenario.

      was (Author: rickhall):
    If you can get me some repeatable steps, I will try to look into improving the message, even if I have to download lots of bytes. :-)

Regarding your request to give more info, I understand it would be nice, but it is not likely to be done for a variety of reasons. First, like a compiler error, often early errors make letter errors unmeaningful. Further, being exhaustive is difficult once any single link is broken, because you no know that you need to traverse the missing link and there could be more errors down there. Lastly, even if we could be exhaustive, you might be waiting years for the algorithm to finish telling you all of the potential errors. :-) The goal of the resolver is to hopefully be quick in most cases, which conflicts with providing thorough debugging information.

It does look like we are logging the exceptions though, so in the meantime try setting your framework log level to DEBUG to see if you get your desired exception logged. Otherwise, get me the steps to reproduce and I will try to look at your specific scenario.
  
> 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
>            Reporter: Florent BENOIT
>             Fix For: framework-3.2.0
>
>
>   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.