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/07/30 17:49:55 UTC

svn commit: r1152490 - /felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java

Author: rickhall
Date: Sat Jul 30 15:49:54 2011
New Revision: 1152490

URL: http://svn.apache.org/viewvc?rev=1152490&view=rev
Log:
Need to check for require-bundle cycles when merging require-bundle candidates
into a bundle revision's package space. (FELIX-3062)

Modified:
    felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java

Modified: felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java
URL: http://svn.apache.org/viewvc/felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java?rev=1152490&r1=1152489&r2=1152490&view=diff
==============================================================================
--- felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java (original)
+++ felix/trunk/framework/src/main/java/org/apache/felix/framework/resolver/ResolverImpl.java Sat Jul 30 15:49:54 2011
@@ -717,12 +717,13 @@ public class ResolverImpl implements Res
         Packages revisionPkgs = revisionPkgMap.get(revision);
 
         // Second, add all imported packages to the target revision's package space.
+        Set<BundleRevision> cycles = new HashSet<BundleRevision>();
         for (int i = 0; i < reqs.size(); i++)
         {
             BundleRequirement req = reqs.get(i);
             BundleCapability cap = caps.get(i);
             calculateExportedPackages(cap.getRevision(), allCandidates, revisionPkgMap);
-            mergeCandidatePackages(revision, req, cap, revisionPkgMap, allCandidates);
+            mergeCandidatePackages(revision, req, cap, revisionPkgMap, allCandidates, cycles);
         }
 
         // Third, have all candidates to calculate their package spaces.
@@ -811,8 +812,14 @@ public class ResolverImpl implements Res
     private void mergeCandidatePackages(
         BundleRevision current, BundleRequirement currentReq, BundleCapability candCap,
         Map<BundleRevision, Packages> revisionPkgMap,
-        Candidates allCandidates)
+        Candidates allCandidates, Set<BundleRevision> cycles)
     {
+        if (cycles.contains(current))
+        {
+            return;
+        }
+        cycles.add(current);
+
         if (candCap.getNamespace().equals(BundleRevision.PACKAGE_NAMESPACE))
         {
             mergeCandidatePackage(
@@ -860,11 +867,14 @@ public class ResolverImpl implements Res
                             currentReq,
                             allCandidates.getCandidates(req).iterator().next(),
                             revisionPkgMap,
-                            allCandidates);
+                            allCandidates,
+                            cycles);
                     }
                 }
             }
         }
+
+        cycles.remove(current);
     }
 
     private void mergeCandidatePackage(