public void bundleAdded(BundleDescription bundle) { if (!initialized) return; if (bundleMapping.get(bundle) != null) return; // this description already exists in the resolver ResolverBundle rb = new ResolverBundle(bundle, this); bundleMapping.put(bundle, rb); unresolvedBundles.add(rb); resolverExports.put(rb.getExportPackages()); resolverBundles.put(rb.getName(), rb); addGenerics(rb.getGenericCapabilities()); }
private void checkFragmentConstraints(ResolverBundle bundle) { // get all currently attached fragments and ensure that any constraints // they have do not conflict with the constraints resolved to by the host ResolverBundle[] fragments = bundle.getFragments(); for (int i = 0; i < fragments.length; i++) { BundleDescription fragment = fragments[i].getBundleDescription(); if (bundle.constraintsConflict(fragment, fragment.getImportPackages(), fragment.getRequiredBundles(), fragment.getGenericRequires()) && !developmentMode) // found some conflicts; detach the fragment bundle.detachFragment(fragments[i], null); } }
private void setBundleUnresolved(ResolverBundle bundle, boolean removed, boolean keepFragsAttached) { if (bundle.getState() == ResolverBundle.UNRESOLVED && !developmentMode) // in this case there is nothing more to do return; // Note that when in dev mode we only want to force the fragment detach if asked to; // this would be done only when forcing a dependency chain to unresolve from unresolveBundle method if (removed || !keepFragsAttached) { // Force the initialization of the bundle, its exports and its capabilities. This is needed to force proper attachment of fragments. resolverExports.remove(bundle.getExportPackages()); removeGenerics(bundle.getGenericCapabilities()); bundle.detachAllFragments(); bundle.detachFromHosts(); bundle.initialize(false); if (!removed) { // add back the available exports/capabilities resolverExports.put(bundle.getExportPackages()); addGenerics(bundle.getGenericCapabilities()); } } // TODO unresolvedBundles should be a set; for now only need to do a contains check in devMode. if (!removed && (!developmentMode || !unresolvedBundles.contains(bundle))) unresolvedBundles.add(bundle); bundle.setState(ResolverBundle.UNRESOLVED); }
public void detachFromHosts() { if (!isFragment()) { return; } VersionSupplier[] hosts = getHost().getPossibleSuppliers(); if (hosts == null) { return; } for (VersionSupplier possibleHost : hosts) { ((ResolverBundle) possibleHost).detachFragment(this, null); } }
ResolverExport[] getExportPackages() { if (isFragment() || fragments == null || fragments.size() == 0) return exports; List<ResolverExport> result = getAll(exports, fragmentExports); return result.toArray(new ResolverExport[result.size()]); }
void attachFragment(ResolverBundle fragment, boolean dynamicAttach) { if (isFragment()) return; // cannot attach to fragments; 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 ImportPackageSpecification[] newImports = fragment.getBundleDescription().getImportPackages(); BundleSpecification[] newRequires = fragment.getBundleDescription().getRequiredBundles(); ExportPackageDescription[] newExports = fragment.getBundleDescription().getExportPackages(); GenericDescription[] newGenericCapabilities = fragment.getBundleDescription().getGenericCapabilities(); GenericSpecification[] newGenericRequires = fragment.getBundleDescription().getGenericRequires(); if (dynamicAttach && constraintsConflict(fragment.getBundleDescription(), newImports, newRequires, newGenericRequires)) return; // do not allow fragments with conflicting constraints if (isResolved() && newExports.length > 0) fragment.setNewFragmentExports(true); if (isResolved() && newGenericCapabilities.length > 0) fragment.setNewFragmentCapabilities(true); initFragments(); String bsn = existingFragment.getName(); if (bsn != null && bsn.equals(fragment.getName())) return; return; fragments.add(fragment); fragment.getHost().addPossibleSupplier(this);
private boolean resolveBundle(ResolverBundle bundle, List<ResolverBundle> cycle) { if (bundle.isFragment()) return false; if (!bundle.isResolvable()) { if (DEBUG) ResolverImpl.log(" - " + bundle + " is unresolvable"); //$NON-NLS-1$ //$NON-NLS-2$ return false; switch (bundle.getState()) { case ResolverBundle.RESOLVED : bundle.clearWires(); setBundleResolving(bundle); break; GenericConstraint[] genericRequires = bundle.getGenericRequires(); for (int i = 0; i < genericRequires.length; i++) { if (!resolveGenericReq(genericRequires[i], cycle)) { if (genericRequires[i].isFromFragment()) { if (!developmentMode) // only detach fragments when not in devmode bundle.detachFragment(bundleMapping.get(genericRequires[i].getVersionConstraint().getBundle()), null); continue; BundleConstraint[] requires = bundle.getRequires(); for (int i = 0; i < requires.length; i++) { if (!resolveRequire(requires[i], cycle)) { bundle.detachFragment(bundleMapping.get(requires[i].getVersionConstraint().getBundle()), requires[i]); continue;
private void attachFragment0(ResolverBundle bundle) { if (!bundle.isFragment() || !bundle.isResolvable()) return; BundleConstraint hostConstraint = bundle.getHost(); List<ResolverBundle> hosts = resolverBundles.get(hostConstraint.getVersionConstraint().getName()); List<ResolverBundle> candidates = new ArrayList<ResolverBundle>(hosts); if (!host.isResolvable() || !host.getBundleDescription().attachFragments() || !hostConstraint.isSatisfiedBy(host)) { iCandidates.remove(); } else { List<BundleCapability> h = host.getBundleDescription().getDeclaredCapabilities(BundleRevision.HOST_NAMESPACE); host.attachFragment(bundle, true); state.addResolverError(bundle.getBundleDescription(), ResolverError.MISSING_FRAGMENT_HOST, bundle.getHost().getVersionConstraint().toString(), bundle.getHost().getVersionConstraint());
cycleLoop: for (Iterator<ResolverBundle> iCycle = cycle.iterator(); iCycle.hasNext();) { ResolverBundle cycleBundle = iCycle.next(); if (!cycleBundle.isResolvable()) { ResolverImport[] imports = cycleBundle.getImportPackages(); for (int j = 0; j < imports.length; j++) { cycleBundle.setResolvable(false); state.addResolverError(imports[j].getVersionConstraint().getBundle(), ResolverError.MISSING_IMPORT_PACKAGE, imports[j].getVersionConstraint().toString(), imports[j].getVersionConstraint()); iCycle.remove(); cycleBundle.clearWires();
private boolean resolveOSGiEE(ResolverBundle bundle) { GenericConstraint[] requirements = bundle.getGenericRequires(); for (GenericConstraint requirement : requirements) { if (!(StateImpl.OSGI_EE_NAMESPACE.equals(requirement.getNameSpace()) || requirement.isEffective())) continue; { if (!resolveGenericReq(requirement, new ArrayList<ResolverBundle>(0))) { if (DEBUG || DEBUG_GENERICS) ResolverImpl.log("** GENERICS " + requirement.getVersionConstraint().getName() + "[" + requirement.getBundleDescription() + "] failed to resolve"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ state.addResolverError(requirement.getVersionConstraint().getBundle(), ResolverError.MISSING_GENERIC_CAPABILITY, requirement.getVersionConstraint().toString(), requirement.getVersionConstraint()); if (!developmentMode) { // fail fast; otherwise we want to attempt to resolver other constraints in dev mode return false; } } else { VersionSupplier supplier = requirement.getSelectedSupplier(); Integer ee = supplier == null ? null : (Integer) ((GenericDescription) supplier.getBaseDescription()).getAttributes().get(ExportPackageDescriptionImpl.EQUINOX_EE); if (ee != null && ((BundleDescriptionImpl) bundle.getBaseDescription()).getEquinoxEE() < 0) ((BundleDescriptionImpl) bundle.getBundleDescription()).setEquinoxEE(ee); } } } return true; }
BundleDescription[] hosts = ((HostSpecification) fragment.getHost().getVersionConstraint()).getHosts(); for (int i = 0; i < hosts.length; i++) { ResolverBundle host = bundleMapping.get(hosts[i]); if (host != null) host.attachFragment(fragment, false);
private boolean hasUnresolvedConstraint(ResolverConstraint reason, ResolverBundle detachedFragment, ResolverBundle remainingFragment, ResolverImport[] oldImports, BundleConstraint[] oldRequires, List<ResolverImport> additionalImports, List<BundleConstraint> additionalRequires) { ImportPackageSpecification[] remainingFragImports = remainingFragment.getBundleDescription().getImportPackages(); BundleSpecification[] remainingFragRequires = remainingFragment.getBundleDescription().getRequiredBundles(); VersionConstraint[] constraints; if (reason instanceof ResolverImport) for (int i = 0; i < constraints.length; i++) if (reason.getName().equals(constraints[i].getName())) { detachFragment(remainingFragment, reason); return true; 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 (oldRequires[i].getVersionConstraint().getBundle() != detachedFragment.getBundleDescription()) continue; // the constraint is not from the detached fragment for (int j = 0; j < remainingFragRequires.length; j++) {
private boolean equivalentExports(ResolverExport existingExport, ExportPackageDescription newDescription) { ExportPackageDescription existingDescription = existingExport.getExportPackageDescription(); if (!existingDescription.getName().equals(newDescription.getName())) return false; if (!existingDescription.getVersion().equals(newDescription.getVersion())) return false; if (!equivalentMaps(existingDescription.getAttributes(), newDescription.getAttributes(), true)) return false; if (!equivalentMaps(existingDescription.getDirectives(), newDescription.getDirectives(), true)) return false; return true; }
void detachAllFragments() { if (fragments == null) return; ResolverBundle[] allFragments = fragments.toArray(new ResolverBundle[fragments.size()]); for (int i = 0; i < allFragments.length; i++) detachFragment(allFragments[i], null); fragments = null; }
public BundleDescription getBundleDescription() { return (BundleDescription) getBaseDescription(); }
void attachFragment(ResolverBundle fragment, boolean dynamicAttach) { if (isFragment()) return; // cannot attach to fragments; 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 ImportPackageSpecification[] newImports = fragment.getBundleDescription().getImportPackages(); BundleSpecification[] newRequires = fragment.getBundleDescription().getRequiredBundles(); ExportPackageDescription[] newExports = fragment.getBundleDescription().getExportPackages(); GenericDescription[] newGenericCapabilities = fragment.getBundleDescription().getGenericCapabilities(); GenericSpecification[] newGenericRequires = fragment.getBundleDescription().getGenericRequires(); if (dynamicAttach && constraintsConflict(fragment.getBundleDescription(), newImports, newRequires, newGenericRequires)) return; // do not allow fragments with conflicting constraints if (isResolved() && newExports.length > 0) fragment.setNewFragmentExports(true); initFragments(); String bsn = existingFragment.getName(); if (bsn != null && bsn.equals(fragment.getName())) return; return; fragments.add(fragment); fragment.getHost().addPossibleSupplier(this); if (!isImported(newImports[i].getName()))
private boolean resolveBundle(ResolverBundle bundle, List<ResolverBundle> cycle) { if (bundle.isFragment()) return false; if (!bundle.isResolvable()) { if (DEBUG) ResolverImpl.log(" - " + bundle + " is unresolvable"); //$NON-NLS-1$ //$NON-NLS-2$ return false; switch (bundle.getState()) { case ResolverBundle.RESOLVED : bundle.clearWires(); setBundleResolving(bundle); break; GenericConstraint[] genericRequires = bundle.getGenericRequires(); for (int i = 0; i < genericRequires.length; i++) { if (genericRequires[i].isEffective()) { if (genericRequires[i].isFromFragment()) { if (!developmentMode) // only detach fragments when not in devmode bundle.detachFragment(bundleMapping.get(genericRequires[i].getVersionConstraint().getBundle()), null); continue; VersionSupplier supplier = genericRequires[i].getSelectedSupplier(); Integer ee = supplier == null ? null : (Integer) ((GenericDescription) supplier.getBaseDescription()).getAttributes().get(ExportPackageDescriptionImpl.EQUINOX_EE); if (ee != null && ((BundleDescriptionImpl) bundle.getBaseDescription()).getEquinoxEE() < 0) ((BundleDescriptionImpl) bundle.getBundleDescription()).setEquinoxEE(ee); BundleConstraint[] requires = bundle.getRequires();
private void attachFragment0(ResolverBundle bundle) { if (!bundle.isFragment() || !bundle.isResolvable()) return; bundle.clearWires(); if (!resolveOSGiEE(bundle)) return; BundleConstraint hostConstraint = bundle.getHost(); long timestamp; List<ResolverBundle> candidates; if (!host.isResolvable() || !host.getBundleDescription().attachFragments() || !hostConstraint.isSatisfiedBy(host)) { iCandidates.remove(); } else { List<BundleCapability> h = host.getBundleDescription().getDeclaredCapabilities(BundleRevision.HOST_NAMESPACE); host.attachFragment(bundle, true); state.addResolverError(bundle.getBundleDescription(), ResolverError.MISSING_FRAGMENT_HOST, bundle.getHost().getVersionConstraint().toString(), bundle.getHost().getVersionConstraint());
ResolverExport[] getExportPackages() { if (isFragment() || fragments == null || fragments.size() == 0) return exports; List<ResolverExport> result = getAll(exports, fragmentExports); return result.toArray(new ResolverExport[result.size()]); }
cycleLoop: for (Iterator<ResolverBundle> iCycle = cycle.iterator(); iCycle.hasNext();) { ResolverBundle cycleBundle = iCycle.next(); if (!cycleBundle.isResolvable()) { ResolverImport[] imports = cycleBundle.getImportPackages(); for (int j = 0; j < imports.length; j++) { cycleBundle.setResolvable(false); state.addResolverError(imports[j].getVersionConstraint().getBundle(), ResolverError.MISSING_IMPORT_PACKAGE, imports[j].getVersionConstraint().toString(), imports[j].getVersionConstraint()); iCycle.remove(); cycleBundle.clearWires();