private boolean resolveImport(ResolverImport imp, List<ResolverBundle> cycle) { if (DEBUG_IMPORTS) ResolverImpl.log("Trying to resolve: " + imp.getBundle() + ", " + imp.getName()); //$NON-NLS-1$ //$NON-NLS-2$ if (imp.getSelectedSupplier() != null) { if (!cycle.contains(imp.getBundle())) { cycle.add(imp.getBundle()); if (DEBUG_CYCLES) ResolverImpl.log("import-package cycle: " + imp.getBundle() + " -> " + imp.getSelectedSupplier() + " from " + imp.getSelectedSupplier().getBundleDescription()); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ ResolverExport[] substitutableExps = imp.getBundle().getExports(imp.getName()); List<ResolverExport> exports = resolverExports.get(imp.getName()); List<ResolverExport> candidates = new ArrayList<ResolverExport>(exports); List<BundleCapability> capabilities = new ArrayList<BundleCapability>(candidates.size()); if (!imp.isSatisfiedBy(export)) { iCandidates.remove(); } else { hook.filterMatches(imp.getRequirement(), asCapabilities(new ArrayMap<BundleCapability, ResolverExport>(capabilities, candidates))); if (imp.isDynamic() && originalState != ResolverBundle.RESOLVED) continue; // Must not attempt to resolve an exporter when dynamic if (imp.getSelectedSupplier() != null && ((ResolverExport) imp.getSelectedSupplier()).getExporter() == imp.getBundle()) break; // We wired to ourselves; nobody else matters imp.addPossibleSupplier(export); if (imp.getBundle() != export.getExporter()) { for (int j = 0; j < substitutableExps.length; j++) if (substitutableExps[j].getSubstitute() == null)
private ExportPackageDescription resolveDynamicImport(ResolverImport dynamicImport, String requestedPackage) { String importName = dynamicImport.getName(); dynamicImport.setName(requestedPackage); if (!requestedPackage.equals(dynamicImport.getName())) return null; groupingChecker.populateRoots(dynamicImport.getBundle()); while (dynamicImport.getSelectedSupplier() != null) { if (groupingChecker.isDynamicConsistent(dynamicImport.getBundle(), (ResolverExport) dynamicImport.getSelectedSupplier()) != null) { dynamicImport.selectNextSupplier(); // not consistent; try the next } else { ResolverImpl.log("Resolved dynamic import: " + dynamicImport.getBundle() + ":" + dynamicImport.getName() + " -> " + ((ResolverExport) dynamicImport.getSelectedSupplier()).getExporter() + ":" + requestedPackage); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ ResolverExport export = (ResolverExport) dynamicImport.getSelectedSupplier(); groupingChecker.populateRoots(dynamicImport.getBundle(), export); addStateWire(dynamicImport.getBundleDescription(), dynamicImport.getVersionConstraint(), supplier.getExporter(), supplier); return supplier; dynamicImport.clearPossibleSuppliers(); dynamicImport.clearPossibleSuppliers(); dynamicImport.setName(null);
private void rewireImport(ResolverImport imp, List<ResolverBundle> visited) { if (imp.isDynamic() || imp.getSelectedSupplier() != null) return; // Re-wire 'imp' ResolverExport matchingExport = null; ExportPackageDescription importSupplier = (ExportPackageDescription) imp.getVersionConstraint().getSupplier(); ResolverBundle exporter = importSupplier == null ? null : (ResolverBundle) bundleMapping.get(importSupplier.getExporter()); List<ResolverExport> matches = resolverExports.get(imp.getName()); for (ResolverExport export : matches) { if (export.getExporter() == exporter && importSupplier == export.getExportPackageDescription()) { matchingExport = export; break; } } imp.addPossibleSupplier(matchingExport); // If we still have a null wire and it's not optional, then we have an error if (imp.getSelectedSupplier() == null && !imp.isOptional()) { System.err.println("Could not find matching export for " + imp.getVersionConstraint()); //$NON-NLS-1$ // TODO log error!! } if (imp.getSelectedSupplier() != null) { rewireBundle(((ResolverExport) imp.getSelectedSupplier()).getExporter(), visited); } }
private static ExportPackageDescription[] getExportsWiredTo(ResolverBundle rb, Map<String, List<StateWire>> stateWires) { // Gather exports that have been wired to ResolverImport[] imports = rb.getImportPackages(); List<ExportPackageDescription> exportsWiredTo = new ArrayList<ExportPackageDescription>(imports.length); List<StateWire> importWires = new ArrayList<StateWire>(imports.length); for (int i = 0; i < imports.length; i++) if (imports[i].getSelectedSupplier() != null) { ExportPackageDescription supplier = (ExportPackageDescription) imports[i].getSelectedSupplier().getBaseDescription(); exportsWiredTo.add(supplier); StateWire wire = newStateWire(rb.getBundleDescription(), imports[i].getVersionConstraint(), supplier.getExporter(), supplier); importWires.add(wire); } if (stateWires != null && !importWires.isEmpty()) stateWires.put(BundleRevision.PACKAGE_NAMESPACE, importWires); return exportsWiredTo.toArray(new ExportPackageDescription[exportsWiredTo.size()]); }
if (imports[i].isDynamic() && imports[i].getSelectedSupplier() == null) { ResolverImpl.log(" (w) " + imports[i].getBundle() + ":" + imports[i].getName() + " -> DYNAMIC"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } else if (imports[i].isOptional() && imports[i].getSelectedSupplier() == null) { ResolverImpl.log(" (w) " + imports[i].getBundle() + ":" + imports[i].getName() + " -> OPTIONAL (could not be wired)"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } else if (imports[i].getSelectedSupplier() == null) { ResolverImpl.log(" (w) " + imports[i].getBundle() + ":" + imports[i].getName() + " -> NULL!!!"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } else { ResolverImpl.log(" (w) " + imports[i].getBundle() + ":" + imports[i].getName() + " -> " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ ((ResolverExport) imports[i].getSelectedSupplier()).getExporter() + ":" + imports[i].getSelectedSupplier().getName()); //$NON-NLS-1$
for (int j = 0; j < imports.length; j++) { while (imports[j].getSelectedSupplier() != null) { ResolverExport importSupplier = (ResolverExport) imports[j].getSelectedSupplier(); if (importSupplier.getSubstitute() != null) imports[j].selectNextSupplier(); else break; if (!imports[j].isDynamic() && !imports[j].isOptional() && imports[j].getSelectedSupplier() == null) { cycleBundle.setResolvable(false); state.addResolverError(imports[j].getVersionConstraint().getBundle(), ResolverError.MISSING_IMPORT_PACKAGE, imports[j].getVersionConstraint().toString(), imports[j].getVersionConstraint()); iCycle.remove(); continue cycleLoop;
for (int i = 0; i < imports.length; i++) { if (!imports[i].isDynamic() && !resolveImport(imports[i], cycle)) { if (DEBUG || DEBUG_IMPORTS) ResolverImpl.log("** IMPORT " + imports[i].getName() + "[" + imports[i].getBundleDescription() + "] failed to resolve"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ state.addResolverError(imports[i].getVersionConstraint().getBundle(), ResolverError.MISSING_IMPORT_PACKAGE, imports[i].getVersionConstraint().toString(), imports[i].getVersionConstraint()); if (imports[i].isFromFragment()) { if (!developmentMode) // only detach fragments when not in devmode bundle.detachFragment(bundleMapping.get(imports[i].getVersionConstraint().getBundle()), imports[i]); continue;
ResolverImport[] imports = bundle.getImportPackages(); for (ResolverImport importPkg : imports) { if (importPkg.getNumPossibleSuppliers() > 1) { Integer eeProfile = (Integer) ((ResolverExport) importPkg.getSelectedSupplier()).getExportPackageDescription().getDirective(ExportPackageDescriptionImpl.EQUINOX_EE); if (eeProfile.intValue() < 0) { VersionSupplier[] suppliers = importPkg.getPossibleSuppliers(); for (int suppliersIndex = 1; suppliersIndex < suppliers.length; suppliersIndex++) { Integer ee = (Integer) ((ResolverExport) suppliers[suppliersIndex]).getExportPackageDescription().getDirective(ExportPackageDescriptionImpl.EQUINOX_EE); addMutipleSupplierConstraint(multipleImportSupplierMaps, importPkg, importPkg.getName()); Map<String, List<List<ResolverConstraint>>> multipleRequireSupplierMaps = new HashMap<String, List<List<ResolverConstraint>>>(); for (BundleConstraint requireBundle : multipleRequireSupplierList)
if (oldImports[i].getVersionConstraint().getBundle() != detachedFragment.getBundleDescription()) continue; // the constraint is not from the detached fragment for (int j = 0; j < remainingFragImports.length; j++) { if (oldImports[i].getName().equals(remainingFragImports[j].getName())) { oldImports[i].setVersionConstraint(remainingFragImports[j]); break;
ResolverExport selectedSupplier = (ResolverExport) imports[i].getSelectedSupplier(); PackageRoots[][] conflict = selectedSupplier == null ? null : groupingChecker.isConsistent(bundle, selectedSupplier); if (conflict != null) {
private boolean resolveOptionalConstraints(ResolverBundle bundle) { BundleConstraint[] requires = bundle.getRequires(); List<ResolverBundle> cycle = new ArrayList<>(); boolean resolvedOptional = false; for (int i = 0; i < requires.length; i++) if (requires[i].isOptional() && requires[i].getSelectedSupplier() == null) { cycle.clear(); resolveRequire(requires[i], cycle); if (requires[i].getSelectedSupplier() != null) resolvedOptional = true; } ResolverImport[] imports = bundle.getImportPackages(); for (int i = 0; i < imports.length; i++) if (imports[i].isOptional() && imports[i].getSelectedSupplier() == null) { cycle.clear(); resolveImport(imports[i], cycle); if (imports[i].getSelectedSupplier() != null) resolvedOptional = true; } return resolvedOptional; }
if (!resolverImports[j].isDynamic()) continue; ResolverImport newImport = new ResolverImport(rb, addedDynamicImport); ExportPackageDescription supplier = resolveDynamicImport(newImport, requestedPackage); if (supplier != null)
ResolverImport getImport(String name) { ResolverImport[] allImports = getImportPackages(); for (int i = 0; i < allImports.length; i++) { if (allImports[i].getName().equals(name)) { return allImports[i]; } } return null; }
for (int i = actualImports.length - 1; i >= 0; i--) if (ImportPackageSpecification.RESOLUTION_OPTIONAL.equals(actualImports[i].getDirective(Constants.RESOLUTION_DIRECTIVE))) importList.add(new ResolverImport(this, actualImports[i])); else importList.add(0, new ResolverImport(this, actualImports[i])); imports = importList.toArray(new ResolverImport[importList.size()]);
void clearWires() { ResolverImport[] allImports = getImportPackages(); for (int i = 0; i < allImports.length; i++) allImports[i].clearPossibleSuppliers(); if (host != null) host.clearPossibleSuppliers(); BundleConstraint[] allRequires = getRequires(); for (int i = 0; i < allRequires.length; i++) allRequires[i].clearPossibleSuppliers(); GenericConstraint[] allGenericRequires = getGenericRequires(); for (int i = 0; i < allGenericRequires.length; i++) allGenericRequires[i].clearPossibleSuppliers(); ResolverExport[] allExports = getExportPackages(); for (int i = 0; i < allExports.length; i++) allExports[i].setSubstitute(null); }
private void rewireImport(ResolverImport imp, List<ResolverBundle> visited) { if (imp.isDynamic() || imp.getSelectedSupplier() != null) return; // Re-wire 'imp' ResolverExport matchingExport = null; ExportPackageDescription importSupplier = (ExportPackageDescription) imp.getVersionConstraint().getSupplier(); ResolverBundle exporter = importSupplier == null ? null : (ResolverBundle) bundleMapping.get(importSupplier.getExporter()); List<ResolverExport> matches = resolverExports.get(imp.getName()); for (ResolverExport export : matches) { if (export.getExporter() == exporter && importSupplier == export.getExportPackageDescription()) { matchingExport = export; break; } } imp.addPossibleSupplier(matchingExport); // If we still have a null wire and it's not optional, then we have an error if (imp.getSelectedSupplier() == null && !imp.isOptional()) { System.err.println("Could not find matching export for " + imp.getVersionConstraint()); //$NON-NLS-1$ // TODO log error!! } if (imp.getSelectedSupplier() != null) { rewireBundle(((ResolverExport) imp.getSelectedSupplier()).getExporter(), visited); } }
if (imports[i].isDynamic() && imports[i].getSelectedSupplier() == null) { ResolverImpl.log(" (w) " + imports[i].getBundle() + ":" + imports[i].getName() + " -> DYNAMIC"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } else if (imports[i].isOptional() && imports[i].getSelectedSupplier() == null) { ResolverImpl.log(" (w) " + imports[i].getBundle() + ":" + imports[i].getName() + " -> OPTIONAL (could not be wired)"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } else if (imports[i].getSelectedSupplier() == null) { ResolverImpl.log(" (w) " + imports[i].getBundle() + ":" + imports[i].getName() + " -> NULL!!!"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ } else { ResolverImpl.log(" (w) " + imports[i].getBundle() + ":" + imports[i].getName() + " -> " + //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ ((ResolverExport) imports[i].getSelectedSupplier()).getExporter() + ":" + imports[i].getSelectedSupplier().getName()); //$NON-NLS-1$
for (int j = 0; j < imports.length; j++) { while (imports[j].getSelectedSupplier() != null) { ResolverExport importSupplier = (ResolverExport) imports[j].getSelectedSupplier(); if (importSupplier.getSubstitute() != null) imports[j].selectNextSupplier(); else break; if (!imports[j].isDynamic() && !imports[j].isOptional() && imports[j].getSelectedSupplier() == null) { cycleBundle.setResolvable(false); state.addResolverError(imports[j].getVersionConstraint().getBundle(), ResolverError.MISSING_IMPORT_PACKAGE, imports[j].getVersionConstraint().toString(), imports[j].getVersionConstraint()); iCycle.remove(); continue cycleLoop;
for (int i = 0; i < imports.length; i++) { if (!imports[i].isDynamic() && !resolveImport(imports[i], cycle)) { if (DEBUG || DEBUG_IMPORTS) ResolverImpl.log("** IMPORT " + imports[i].getName() + "[" + imports[i].getBundleDescription() + "] failed to resolve"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ state.addResolverError(imports[i].getVersionConstraint().getBundle(), ResolverError.MISSING_IMPORT_PACKAGE, imports[i].getVersionConstraint().toString(), imports[i].getVersionConstraint()); if (imports[i].isFromFragment()) { if (!developmentMode) // only detach fragments when not in devmode bundle.detachFragment(bundleMapping.get(imports[i].getVersionConstraint().getBundle()), imports[i]); continue;
ResolverImport[] imports = bundle.getImportPackages(); for (ResolverImport importPkg : imports) { if (importPkg.getNumPossibleSuppliers() > 1) { Integer eeProfile = (Integer) ((ResolverExport) importPkg.getSelectedSupplier()).getExportPackageDescription().getDirective(ExportPackageDescriptionImpl.EQUINOX_EE); if (eeProfile.intValue() < 0) { VersionSupplier[] suppliers = importPkg.getPossibleSuppliers(); for (int suppliersIndex = 1; suppliersIndex < suppliers.length; suppliersIndex++) { Integer ee = (Integer) ((ResolverExport) suppliers[suppliersIndex]).getExportPackageDescription().getDirective(ExportPackageDescriptionImpl.EQUINOX_EE); addMutipleSupplierConstraint(multipleImportSupplierMaps, importPkg, importPkg.getName()); Map<String, List<List<ResolverConstraint>>> multipleRequireSupplierMaps = new HashMap<String, List<List<ResolverConstraint>>>(); for (BundleConstraint requireBundle : multipleRequireSupplierList)