You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@felix.apache.org by ri...@apache.org on 2011/11/18 22:48:46 UTC
svn commit: r1203866 - in
/felix/trunk/framework/src/main/java/org/apache/felix/framework:
resolver/Candidates.java util/manifestparser/ManifestParser.java
Author: rickhall
Date: Fri Nov 18 21:48:46 2011
New Revision: 1203866
URL: http://svn.apache.org/viewvc?rev=1203866&view=rev
Log:
When populating candidates, we need to check for a failed result
after recursing since cycles may cause the resolving revision to
fail in a deeper recursion. We weren't checking this previously,
which caused us to ignore failures in some cases. (FELIX-3178)
Modified:
felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/Candidates.java
felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/Candidates.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/Candidates.java?rev=1203866&r1=1203865&r2=1203866&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/Candidates.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/Candidates.java Fri Nov 18 21:48:46 2011
@@ -257,7 +257,7 @@ class Candidates
}
// If we have requirements remaining, then find candidates for them.
- while (remainingReqs.size() > 0)
+ while (!remainingReqs.isEmpty())
{
BundleRequirement req = remainingReqs.remove(0);
@@ -276,10 +276,16 @@ class Candidates
state.getCandidates((BundleRequirementImpl) req, true);
ResolveException rethrow = processCandidates(state, revision, candidates);
- // If there are no candidates for the current requirement
- // and it is not optional, then create, cache, and throw
- // a resolve exception.
- if (candidates.isEmpty() && !((BundleRequirementImpl) req).isOptional())
+ // First, due to cycles, makes sure we haven't already failed in
+ // a deeper recursion.
+ Object result = m_populateResultCache.get(revision);
+ if (result instanceof ResolveException)
+ {
+ throw (ResolveException) result;
+ }
+ // Next, if are no candidates remaining and the requirement is not
+ // not optional, then record and throw a resolve exception.
+ else if (candidates.isEmpty() && !((BundleRequirementImpl) req).isOptional())
{
String msg = "Unable to resolve " + revision
+ ": missing requirement " + req;
@@ -291,7 +297,7 @@ class Candidates
m_populateResultCache.put(revision, rethrow);
throw rethrow;
}
- // If we actually have candidates for the requirement, then
+ // Otherwise, if we actually have candidates for the requirement, then
// add them to the local candidate map.
else if (candidates.size() > 0)
{
@@ -455,9 +461,8 @@ class Candidates
// since we effectively chain exception messages for each level
// of recursion; thus, any avoided recursion results in fewer
// exceptions to chain when an error does occur.
- if (isFragment
- || ((candCap.getRevision().getWiring() == null)
- && !candCap.getRevision().equals(revision)))
+ if ((isFragment || (candCap.getRevision().getWiring() == null))
+ && !candCap.getRevision().equals(revision))
{
try
{
Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java?rev=1203866&r1=1203865&r2=1203866&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/util/manifestparser/ManifestParser.java Fri Nov 18 21:48:46 2011
@@ -229,11 +229,11 @@ public class ManifestParser
// Combine all requirements.
m_requirements = new ArrayList(
- importReqs.size() + rbReqs.size() + hostReqs.size()
+ hostReqs.size() + importReqs.size() + rbReqs.size()
+ requireReqs.size() + dynamicReqs.size());
+ m_requirements.addAll(hostReqs);
m_requirements.addAll(importReqs);
m_requirements.addAll(rbReqs);
- m_requirements.addAll(hostReqs);
m_requirements.addAll(requireReqs);
m_requirements.addAll(dynamicReqs);