diff --git a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverFactoryImpl.java b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverFactoryImpl.java index e97aba2c56..9b452d1651 100644 --- a/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverFactoryImpl.java +++ b/tycho-bundles/org.eclipse.tycho.p2.resolver.impl/src/main/java/org/eclipse/tycho/p2/resolver/P2ResolverFactoryImpl.java @@ -19,8 +19,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashSet; -import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -134,25 +132,26 @@ public Set calculateDependencyFragments(ResolutionData data, if (fragmentsList.isEmpty()) { return Collections.emptySet(); } - Set dependencyFragments = new HashSet<>(); - for (Iterator iterator = resolvedUnits.iterator(); iterator.hasNext() - && !fragmentsList.isEmpty();) { - IInstallableUnit resolvedUnit = iterator.next(); - addMatchingFragments(fragmentsList, dependencyFragments, resolvedUnit); - } - return dependencyFragments; - } - private static void addMatchingFragments(List> fragmentsList, - Set dependencyFragments, IInstallableUnit unitToMatch) { - Iterator> iterator = fragmentsList.iterator(); - while (iterator.hasNext()) { - Entry fragment = iterator.next(); - if (fragment.getValue().isMatch(unitToMatch)) { - dependencyFragments.add(fragment.getKey()); - iterator.remove(); - } - } + Map> availableIUsById = availableIUs.stream()// + .collect(Collectors.groupingBy(iu -> iu.getId())); + + return fragmentsList.stream()// + .filter(entry -> { + IRequiredCapability hostRequirement = entry.getValue(); + List potentialHosts = availableIUsById.get(entry.getValue().getName()); + if (potentialHosts == null) { // quick lookup by ID + return false; + } + for (IInstallableUnit potentialHost : potentialHosts) { + if (hostRequirement.isMatch(potentialHost)) { // precise match + return true; + } + } + return false; + })// + .map(entry -> entry.getKey())// + .collect(Collectors.toSet()); } private static Optional> findFragmentHostRequirement(