private boolean resolveRequire(BundleConstraint req, List<ResolverBundle> cycle) { if (DEBUG_REQUIRES) ResolverImpl.log("Trying to resolve: " + req.getBundle() + ", " + req.getVersionConstraint()); //$NON-NLS-1$ //$NON-NLS-2$ if (req.getSelectedSupplier() != null) { if (!cycle.contains(req.getBundle())) { cycle.add(req.getBundle()); if (DEBUG_CYCLES) ResolverImpl.log("require-bundle cycle: " + req.getBundle() + " -> " + req.getSelectedSupplier()); //$NON-NLS-1$ //$NON-NLS-2$ List<ResolverBundle> bundles = resolverBundles.get(req.getVersionConstraint().getName()); List<ResolverBundle> candidates = new ArrayList<ResolverBundle>(bundles); List<BundleCapability> capabilities = new ArrayList<BundleCapability>(candidates.size()); if (!req.isSatisfiedBy(bundle)) { iCandidates.remove(); } else { hook.filterMatches(req.getRequirement(), asCapabilities(new ArrayMap<BundleCapability, ResolverBundle>(capabilities, candidates))); req.addPossibleSupplier(bundle); if (req.getBundle() != bundle) { req.removePossibleSupplier(bundle); continue; // Bundle hasn't resolved if (req.getBundle() != bundle) { if (bundle.getState() == ResolverBundle.RESOLVING) if (!cycle.contains(req.getBundle())) {
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 resolveFragment(ResolverBundle fragment) { if (!fragment.isFragment()) return; if (fragment.getHost().getNumPossibleSuppliers() > 0) if (!developmentMode || state.getResolverErrors(fragment.getBundleDescription()).length == 0) setBundleResolved(fragment); }
private void rewireRequire(BundleConstraint req, List<ResolverBundle> visited) { if (req.getSelectedSupplier() != null) return; ResolverBundle matchingBundle = bundleMapping.get(req.getVersionConstraint().getSupplier()); req.addPossibleSupplier(matchingBundle); if (matchingBundle == null && !req.isOptional()) { System.err.println("Could not find matching bundle for " + req.getVersionConstraint()); //$NON-NLS-1$ // TODO log error!! } if (matchingBundle != null) { rewireBundle(matchingBundle, visited); } }
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 (!getBundleDescription().attachFragments() || (isResolved() && !getBundleDescription().dynamicFragments())) return; // host is restricting attachment if (fragment.getHost().getNumPossibleSuppliers() > 0 && !((HostSpecification) fragment.getHost().getVersionConstraint()).isMultiHost()) return; // fragment is restricting attachment return; fragments.add(fragment); fragment.getHost().addPossibleSupplier(this); for (int i = 0; i < newRequires.length; i++) if (!isRequired(newRequires[i].getName())) hostRequires.add(new BundleConstraint(this, newRequires[i])); fragmentRequires.put(fragment.bundleID, hostRequires);
private List<PackageRoots[]> isConsistentInternal(ResolverBundle requiringBundle, ResolverBundle matchingBundle, List<ResolverBundle> visited, boolean dynamicImport, List<PackageRoots[]> results) { // needed to prevent endless cycles if (visited.contains(matchingBundle)) return results; visited.add(matchingBundle); // check that the packages exported by the matching bundle are consistent ResolverExport[] matchingExports = matchingBundle.getExportPackages(); for (int i = 0; i < matchingExports.length; i++) { ResolverExport matchingExport = matchingExports[i]; if (matchingExports[i].getSubstitute() != null) matchingExport = (ResolverExport) matchingExports[i].getSubstitute(); results = isConsistentInternal(requiringBundle, matchingExport, dynamicImport, results); } // check that the packages from reexported bundles are consistent BundleConstraint[] supplierRequires = matchingBundle.getRequires(); for (int j = 0; j < supplierRequires.length; j++) { ResolverBundle reexported = (ResolverBundle) supplierRequires[j].getSelectedSupplier(); if (reexported == null || !((BundleSpecification) supplierRequires[j].getVersionConstraint()).isExported()) continue; results = isConsistentInternal(requiringBundle, reexported, visited, dynamicImport, results); } return results; }
List<ResolverBundle> hosts = resolverBundles.get(hostConstraint.getVersionConstraint().getName()); List<ResolverBundle> candidates = new ArrayList<ResolverBundle>(hosts); List<BundleCapability> hostCapabilities = new ArrayList<BundleCapability>(hosts.size()); if (!host.isResolvable() || !host.getBundleDescription().attachFragments() || !hostConstraint.isSatisfiedBy(host)) { iCandidates.remove(); } else { hook.filterMatches(hostConstraint.getRequirement(), asCapabilities(new ArrayMap<BundleCapability, ResolverBundle>(hostCapabilities, candidates))); state.addResolverError(bundle.getBundleDescription(), ResolverError.MISSING_FRAGMENT_HOST, bundle.getHost().getVersionConstraint().toString(), bundle.getHost().getVersionConstraint());
if (oldRequires[i].getVersionConstraint().getBundle() != detachedFragment.getBundleDescription()) continue; // the constraint is not from the detached fragment for (int j = 0; j < remainingFragRequires.length; j++) { if (oldRequires[i].getName().equals(remainingFragRequires[j].getName())) { oldRequires[i].setVersionConstraint(remainingFragRequires[j]); break;
if (!resolveRequire(requires[i], cycle)) { if (DEBUG || DEBUG_REQUIRES) ResolverImpl.log("** REQUIRE " + requires[i].getVersionConstraint().getName() + "[" + requires[i].getBundleDescription() + "] failed to resolve"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ state.addResolverError(requires[i].getVersionConstraint().getBundle(), ResolverError.MISSING_REQUIRE_BUNDLE, requires[i].getVersionConstraint().toString(), requires[i].getVersionConstraint()); if (requires[i].isFromFragment()) { if (!developmentMode) // only detach fragments when not in devmode bundle.detachFragment(bundleMapping.get(requires[i].getVersionConstraint().getBundle()), requires[i]); continue;
List<StateWire> requireWires = new ArrayList<StateWire>(requires.length); for (int i = 0; i < requires.length; i++) if (requires[i].getSelectedSupplier() != null) { BundleDescription supplier = (BundleDescription) requires[i].getSelectedSupplier().getBaseDescription(); bundlesWiredTo.add(supplier); StateWire requireWire = newStateWire(rb.getBundleDescription(), requires[i].getVersionConstraint(), supplier, supplier); requireWires.add(requireWire); VersionSupplier[] matchingBundles = rb.getHost().getPossibleSuppliers(); if (matchingBundles != null && matchingBundles.length > 0) { hostBundles = new BundleDescription[matchingBundles.length]; for (int i = 0; i < matchingBundles.length; i++) { hostBundles[i] = matchingBundles[i].getBundleDescription(); StateWire hostWire = newStateWire(rb.getBundleDescription(), rb.getHost().getVersionConstraint(), hostBundles[i], hostBundles[i]); hostWires.add(hostWire); if (hostBundles[i].isResolved()) {
private List<ResolverConstraint> addConflicts(ResolverBundle bundle, Set<String> packageConstraints, Set<String> bundleConstraints, Collection<GenericConstraint> multiRequirementWithMultiSuppliers, List<ResolverConstraint> conflicts) { BundleConstraint[] requires = bundle.getRequires(); for (int i = 0; i < requires.length; i++) { ResolverBundle selectedSupplier = (ResolverBundle) requires[i].getSelectedSupplier(); PackageRoots[][] conflict = selectedSupplier == null ? null : groupingChecker.isConsistent(bundle, selectedSupplier); if (conflict != null) {
} else { for (int i = 0; i < requireBundles.length; i++) { if (requireBundles[i].getSelectedSupplier() == null) { ResolverImpl.log(" (r) " + rb.getBundleDescription() + " -> NULL!!!"); //$NON-NLS-1$ //$NON-NLS-2$ } else { ResolverImpl.log(" (r) " + rb.getBundleDescription() + " -> " + requireBundles[i].getSelectedSupplier()); //$NON-NLS-1$ //$NON-NLS-2$ VersionSupplier[] hosts = hostSpec.getPossibleSuppliers(); if (hosts != null) for (int i = 0; i < hosts.length; i++) {
BundleConstraint[] requires = bundle.getRequires(); for (BundleConstraint require : requires) if (require.getNumPossibleSuppliers() > 1) multipleRequireSupplierList.add(require); ResolverImport[] imports = bundle.getImportPackages(); Map<String, List<List<ResolverConstraint>>> multipleRequireSupplierMaps = new HashMap<String, List<List<ResolverConstraint>>>(); for (BundleConstraint requireBundle : multipleRequireSupplierList) addMutipleSupplierConstraint(multipleRequireSupplierMaps, requireBundle, requireBundle.getName()); Map<String, List<List<ResolverConstraint>>> multipleGenericSupplierMaps = new HashMap<String, List<List<ResolverConstraint>>>(); for (GenericConstraint genericRequire : multipleGenericSupplierList)
public void detachFromHosts() { if (!isFragment()) { return; } VersionSupplier[] hosts = getHost().getPossibleSuppliers(); if (hosts == null) { return; } for (VersionSupplier possibleHost : hosts) { ((ResolverBundle) possibleHost).detachFragment(this, null); } }
void initialize(boolean useSelectedExports) { if (getBundleDescription().getHost() != null) { host = new BundleConstraint(this, getBundleDescription().getHost()); exports = new ResolverExport[0]; imports = new ResolverImport[0]; requires = new BundleConstraint[actualRequires.length]; for (int i = 0; i < requires.length; i++) requires[i] = new BundleConstraint(this, actualRequires[i]);
private void rewireRequire(BundleConstraint req, List<ResolverBundle> visited) { if (req.getSelectedSupplier() != null) return; ResolverBundle matchingBundle = bundleMapping.get(req.getVersionConstraint().getSupplier()); req.addPossibleSupplier(matchingBundle); if (matchingBundle == null && !req.isOptional()) { System.err.println("Could not find matching bundle for " + req.getVersionConstraint()); //$NON-NLS-1$ // TODO log error!! } if (matchingBundle != null) { rewireBundle(matchingBundle, visited); } }
if (!getBundleDescription().attachFragments() || (isResolved() && !getBundleDescription().dynamicFragments())) return; // host is restricting attachment if (fragment.getHost().getNumPossibleSuppliers() > 0 && !((HostSpecification) fragment.getHost().getVersionConstraint()).isMultiHost()) return; // fragment is restricting attachment return; fragments.add(fragment); fragment.getHost().addPossibleSupplier(this); for (int i = 0; i < newRequires.length; i++) if (!isRequired(newRequires[i].getName())) hostRequires.add(new BundleConstraint(this, newRequires[i])); fragmentRequires.put(fragment.bundleID, hostRequires);
private List<PackageRoots[]> isConsistentInternal(ResolverBundle requiringBundle, ResolverBundle matchingBundle, List<ResolverBundle> visited, boolean dynamicImport, List<PackageRoots[]> results) { // needed to prevent endless cycles if (visited.contains(matchingBundle)) return results; visited.add(matchingBundle); // check that the packages exported by the matching bundle are consistent ResolverExport[] matchingExports = matchingBundle.getExportPackages(); for (int i = 0; i < matchingExports.length; i++) { ResolverExport matchingExport = matchingExports[i]; if (matchingExports[i].getSubstitute() != null) matchingExport = (ResolverExport) matchingExports[i].getSubstitute(); results = isConsistentInternal(requiringBundle, matchingExport, dynamicImport, results); } // check that the packages from reexported bundles are consistent BundleConstraint[] supplierRequires = matchingBundle.getRequires(); for (int j = 0; j < supplierRequires.length; j++) { ResolverBundle reexported = (ResolverBundle) supplierRequires[j].getSelectedSupplier(); if (reexported == null || !((BundleSpecification) supplierRequires[j].getVersionConstraint()).isExported()) continue; results = isConsistentInternal(requiringBundle, reexported, visited, dynamicImport, results); } return results; }
do { timestamp = state.getTimeStamp(); List<ResolverBundle> hosts = resolverBundles.get(hostConstraint.getVersionConstraint().getName()); candidates = new ArrayList<ResolverBundle>(hosts); List<BundleCapability> hostCapabilities = new ArrayList<BundleCapability>(hosts.size()); if (!host.isResolvable() || !host.getBundleDescription().attachFragments() || !hostConstraint.isSatisfiedBy(host)) { iCandidates.remove(); } else { hook.filterMatches(hostConstraint.getRequirement(), asCapabilities(new ArrayMap<BundleCapability, ResolverBundle>(hostCapabilities, candidates))); } while (timestamp != state.getTimeStamp()); state.addResolverError(bundle.getBundleDescription(), ResolverError.MISSING_FRAGMENT_HOST, bundle.getHost().getVersionConstraint().toString(), bundle.getHost().getVersionConstraint());