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