diff options
Diffstat (limited to 'bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java')
-rw-r--r-- | bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java | 124 |
1 files changed, 87 insertions, 37 deletions
diff --git a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java index 2d80e5263..19eff3497 100644 --- a/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java +++ b/bundles/org.eclipse.osgi/resolver/src/org/eclipse/osgi/internal/module/ResolverImpl.java @@ -72,6 +72,7 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver private GroupingChecker groupingChecker; private Comparator selectionPolicy; private boolean developmentMode = false; + private volatile CompositeResolveHelperRegistry compositeHelpers; public ResolverImpl(BundleContext context, boolean checkPermissions) { this.permissionChecker = new PermissionChecker(context, checkPermissions, this); @@ -535,46 +536,76 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver resolveFragment(unresolved[i]); } checkUsesConstraints(bundles, platformProperties, rejectedSingletons); + checkComposites(bundles, platformProperties, rejectedSingletons); + } + + private void checkComposites(ResolverBundle[] bundles, Dictionary[] platformProperties, ArrayList rejectedSingletons) { + CompositeResolveHelperRegistry helpers = getCompositeHelpers(); + if (helpers == null) + return; + Set exclude = null; + for (int i = 0; i < bundles.length; i++) { + CompositeResolveHelper helper = helpers.getCompositeResolveHelper(bundles[i].getBundle()); + if (helper == null) + continue; + if (!bundles[i].isResolved()) + continue; + if (!helper.giveExports(getExportsWiredTo(bundles[i]))) { + state.addResolverError(bundles[i].getBundle(), ResolverError.DISABLED_BUNDLE, null, null); + bundles[i].setResolvable(false); + bundles[i].clearRefs(); + setBundleUnresolved(bundles[i], false, developmentMode); + if (exclude == null) + exclude = new HashSet(1); + exclude.add(bundles[i]); + } + } + reResolveBundles(exclude, bundles, platformProperties, rejectedSingletons); } private void checkUsesConstraints(ResolverBundle[] bundles, Dictionary[] platformProperties, ArrayList rejectedSingletons) { ArrayList conflictingConstraints = findBestCombination(bundles); + if (conflictingConstraints == null) + return; Set conflictedBundles = null; - if (conflictingConstraints != null) { - for (Iterator conflicts = conflictingConstraints.iterator(); conflicts.hasNext();) { - ResolverConstraint conflict = (ResolverConstraint) conflicts.next(); - if (conflict.isOptional()) { - conflict.clearPossibleSuppliers(); - continue; - } + for (Iterator conflicts = conflictingConstraints.iterator(); conflicts.hasNext();) { + ResolverConstraint conflict = (ResolverConstraint) conflicts.next(); + if (conflict.isOptional()) { + conflict.clearPossibleSuppliers(); + continue; + } + if (conflictedBundles == null) conflictedBundles = new HashSet(conflictingConstraints.size()); - ResolverBundle conflictedBundle; - if (conflict.isFromFragment()) - conflictedBundle = (ResolverBundle) bundleMapping.get(conflict.getVersionConstraint().getBundle()); - else - conflictedBundle = conflict.getBundle(); - if (conflictedBundle != null) { - if (DEBUG_USES) - System.out.println("Found conflicting constraint: " + conflict + " in bundle " + conflictedBundle); //$NON-NLS-1$//$NON-NLS-2$ - conflictedBundles.add(conflictedBundle); - int type = conflict instanceof ResolverImport ? ResolverError.IMPORT_PACKAGE_USES_CONFLICT : ResolverError.REQUIRE_BUNDLE_USES_CONFLICT; - state.addResolverError(conflictedBundle.getBundle(), type, conflict.getVersionConstraint().toString(), conflict.getVersionConstraint()); - conflictedBundle.setResolvable(false); - conflictedBundle.clearRefs(); - setBundleUnresolved(conflictedBundle, false, developmentMode); - } + ResolverBundle conflictedBundle; + if (conflict.isFromFragment()) + conflictedBundle = (ResolverBundle) bundleMapping.get(conflict.getVersionConstraint().getBundle()); + else + conflictedBundle = conflict.getBundle(); + if (conflictedBundle != null) { + if (DEBUG_USES) + System.out.println("Found conflicting constraint: " + conflict + " in bundle " + conflictedBundle); //$NON-NLS-1$//$NON-NLS-2$ + conflictedBundles.add(conflictedBundle); + int type = conflict instanceof ResolverImport ? ResolverError.IMPORT_PACKAGE_USES_CONFLICT : ResolverError.REQUIRE_BUNDLE_USES_CONFLICT; + state.addResolverError(conflictedBundle.getBundle(), type, conflict.getVersionConstraint().toString(), conflict.getVersionConstraint()); + conflictedBundle.setResolvable(false); + conflictedBundle.clearRefs(); + setBundleUnresolved(conflictedBundle, false, developmentMode); } - if (conflictedBundles != null && conflictedBundles.size() > 0) { - ArrayList remainingUnresolved = new ArrayList(); - for (int i = 0; i < bundles.length; i++) { - if (!conflictedBundles.contains(bundles[i])) { - setBundleUnresolved(bundles[i], false, developmentMode); - remainingUnresolved.add(bundles[i]); - } - } - resolveBundles0((ResolverBundle[]) remainingUnresolved.toArray(new ResolverBundle[remainingUnresolved.size()]), platformProperties, rejectedSingletons); + } + reResolveBundles(conflictedBundles, bundles, platformProperties, rejectedSingletons); + } + + private void reResolveBundles(Set exclude, ResolverBundle[] bundles, Dictionary[] platformProperties, ArrayList rejectedSingletons) { + if (exclude == null || exclude.size() == 0) + return; + ArrayList remainingUnresolved = new ArrayList(); + for (int i = 0; i < bundles.length; i++) { + if (!exclude.contains(bundles[i])) { + setBundleUnresolved(bundles[i], false, developmentMode); + remainingUnresolved.add(bundles[i]); } } + resolveBundles0((ResolverBundle[]) remainingUnresolved.toArray(new ResolverBundle[remainingUnresolved.size()]), platformProperties, rejectedSingletons); } private ArrayList findBestCombination(ResolverBundle[] bundles) { @@ -1434,12 +1465,7 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver ExportPackageDescription[] substitutedExportsArray = (ExportPackageDescription[]) substitutedExports.toArray(new ExportPackageDescription[substitutedExports.size()]); // Gather exports that have been wired to - ResolverImport[] imports = rb.getImportPackages(); - ArrayList exportsWiredTo = new ArrayList(imports.length); - for (int i = 0; i < imports.length; i++) - if (imports[i].getSelectedSupplier() != null) - exportsWiredTo.add(imports[i].getSelectedSupplier().getBaseDescription()); - ExportPackageDescription[] exportsWiredToArray = (ExportPackageDescription[]) exportsWiredTo.toArray(new ExportPackageDescription[exportsWiredTo.size()]); + ExportPackageDescription[] exportsWiredToArray = getExportsWiredTo(rb); // Gather bundles that have been wired to BundleConstraint[] requires = rb.getRequires(); @@ -1472,6 +1498,16 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver state.resolveBundle(rb.getBundle(), rb.isResolved(), hostBundles, selectedExportsArray, substitutedExportsArray, bundlesWiredToArray, exportsWiredToArray); } + private static ExportPackageDescription[] getExportsWiredTo(ResolverBundle rb) { + // Gather exports that have been wired to + ResolverImport[] imports = rb.getImportPackages(); + ArrayList exportsWiredTo = new ArrayList(imports.length); + for (int i = 0; i < imports.length; i++) + if (imports[i].getSelectedSupplier() != null) + exportsWiredTo.add(imports[i].getSelectedSupplier().getBaseDescription()); + return (ExportPackageDescription[]) exportsWiredTo.toArray(new ExportPackageDescription[exportsWiredTo.size()]); + } + // Resolve dynamic import public synchronized ExportPackageDescription resolveDynamicImport(BundleDescription importingBundle, String requestedPackage) { if (state == null) @@ -1616,6 +1652,12 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver if (!bundle.getBundle().isResolved() && !developmentMode) return; + CompositeResolveHelperRegistry currentLinks = compositeHelpers; + if (currentLinks != null) { + CompositeResolveHelper helper = currentLinks.getCompositeResolveHelper(bundle.getBundle()); + if (helper != null) + helper.giveExports(null); + } // if not removed then add to the list of unresolvedBundles, // passing false for devmode because we need all fragments detached setBundleUnresolved(bundle, removed, false); @@ -1739,4 +1781,12 @@ public class ResolverImpl implements org.eclipse.osgi.service.resolver.Resolver public Comparator getSelectionPolicy() { return selectionPolicy; } + + public void setCompositeResolveHelperRegistry(CompositeResolveHelperRegistry compositeHelpers) { + this.compositeHelpers = compositeHelpers; + } + + CompositeResolveHelperRegistry getCompositeHelpers() { + return compositeHelpers; + } } |