protected void addCapability(List<IProvidedCapability> caps, GenericDescription provideCapDesc, InstallableUnitDescription iu, int capNo) { // Convert the values to String, Version, List of String or Version Map<String, Object> capAttrs = provideCapDesc.getDeclaredAttributes().entrySet().stream().collect(toMap(Entry::getKey, e -> convertAttribute(e.getValue()))); // Resolve the namespace String capNs = provideCapDesc.getType(); // Resolve the mandatory p2 name // By convention OSGi capabilities have an attribute named like the capability namespace. // If this is not the case synthesize a unique name (e.g. "osgi.service" has an "objectClass" attribute instead). // TODO If present but not a String log a warning somehow that it is ignored? Or fail the publication? capAttrs.compute(capNs, (k, v) -> (v instanceof String) ? v : String.format("%s_%s-%s", iu.getId(), iu.getVersion(), capNo)); //$NON-NLS-1$ // Resolve the mandatory p2 version // By convention versioned OSGi capabilities have a "version" attribute containing the OSGi Version object // If this is not the case use an empty version (e.g. "osgi.ee" has a list of versions). // TODO If present but not a Version log a warning somehow that it is ignored? Or fail the publication? capAttrs.compute(IProvidedCapability.PROPERTY_VERSION, (k, v) -> (v instanceof Version) ? v : Version.emptyVersion); caps.add(MetadataFactory.createProvidedCapability(capNs, capAttrs)); }
private GenericDescription[] createGenericCapabilities(GenericDescription[] genericCapabilities) { if (genericCapabilities == null || genericCapabilities.length == 0) return null; GenericDescription[] result = new GenericDescription[genericCapabilities.length]; for (int i = 0; i < genericCapabilities.length; i++) { GenericDescriptionImpl cap = new GenericDescriptionImpl(); cap.setType(genericCapabilities[i].getType()); cap.setAttributes(genericCapabilities[i].getAttributes()); cap.setDirectives(genericCapabilities[i].getDeclaredDirectives()); result[i] = cap; } return result; }
private Map<String, List<GenericDescription>> getGenericsMap(State state, boolean resolved) { Map<String, List<GenericDescription>> result = new HashMap<String, List<GenericDescription>>(); BundleDescription[] bundles = state.getBundles(); for (int i = 0; i < bundles.length; i++) { if (resolved && !bundles[i].isResolved()) continue; // discard unresolved bundles GenericDescription[] generics = bundles[i].getGenericCapabilities(); for (int j = 0; j < generics.length; j++) { GenericDescription description = generics[j]; List<GenericDescription> genericList = result.get(description.getName()); if (genericList == null) { genericList = new ArrayList<GenericDescription>(1); result.put(description.getName(), genericList); } genericList.add(description); } } return result; }
public boolean isSatisfiedBy(BaseDescription supplier) { if (!(supplier instanceof GenericDescription)) return false; GenericDescription candidate = (GenericDescription) supplier; if (!getType().equals(candidate.getType())) return false; // Note that names and versions are only matched by including them in the filter return matchingFilter == null || matchingFilter.match(candidate.getAttributes()); }
boolean checkCapabilityPermission(GenericDescription capability) { if (!checkPermissions) return true; Bundle bundle = capability.getSupplier().getBundle(); return bundle == null ? false : bundle.hasPermission(new CapabilityPermission(capability.getType(), CapabilityPermission.PROVIDE)); } }
private void writeGenericDescription(GenericDescription description, DataOutputStream out) throws IOException { if (writePrefix(description, out)) return; writeBaseDescription(description, out); writeBundleDescription(description.getSupplier(), out, false); writeStringOrNull(description.getType() == GenericDescription.DEFAULT_TYPE ? null : description.getType(), out); Dictionary<String, Object> attrs = description.getAttributes(); Map<String, Object> mapAttrs = new HashMap<String, Object>(attrs.size()); for (Enumeration<String> keys = attrs.keys(); keys.hasMoreElements();) { String key = keys.nextElement(); mapAttrs.put(key, attrs.get(key)); } writeMap(out, mapAttrs); Map<String, String> directives = description.getDeclaredDirectives(); writeMap(out, directives); writeGenericDescription((GenericDescription) ((BaseDescriptionImpl) description).getFragmentDeclaration(), out); }
public List<BundleCapability> getDeclaredCapabilities(String namespace) { List<BundleCapability> result = new ArrayList<BundleCapability>(); if (host == null) { if (getSymbolicName() != null) { if (namespace == null || BundleRevision.BUNDLE_NAMESPACE.equals(namespace)) { result.add(BundleDescriptionImpl.this.getCapability()); } if (attachFragments() && (namespace == null || BundleRevision.HOST_NAMESPACE.equals(namespace))) { result.add(BundleDescriptionImpl.this.getCapability(BundleRevision.HOST_NAMESPACE)); } } } else { // may need to have a osgi.wiring.fragment capability } if (namespace == null || BundleRevision.PACKAGE_NAMESPACE.equals(namespace)) { ExportPackageDescription[] exports = getExportPackages(); for (ExportPackageDescription exportPkg : exports) result.add(exportPkg.getCapability()); } GenericDescription[] genericCapabilities = getGenericCapabilities(); for (GenericDescription capabilitiy : genericCapabilities) { if (namespace == null || namespace.equals(capabilitiy.getType())) result.add(capabilitiy.getCapability()); } return Collections.unmodifiableList(result); }
void removeGenerics(GenericCapability[] generics) { for (GenericCapability capability : generics) { VersionHashMap<GenericCapability> namespace = resolverGenerics.get(capability.getGenericDescription().getType()); if (namespace != null) namespace.remove(capability); } }
private void resetSystemCapabilities() { BundleDescription[] systemBundles = getBundles(Constants.SYSTEM_BUNDLE_SYMBOLICNAME); Long builtIn = new Long(1); for (BundleDescription systemBundle : systemBundles) { GenericDescription[] capabilities = systemBundle.getGenericCapabilities(); List<GenericDescription> newCapabilities = new ArrayList<GenericDescription>(capabilities.length); for (GenericDescription capability : capabilities) { if (builtIn.equals(capability.getDeclaredAttributes().get("equinox.builtin"))) //$NON-NLS-1$ newCapabilities.add(capability); // keep the built in ones. } // now add the externally defined ones addSystemCapabilities(newCapabilities); ((BundleDescriptionImpl) systemBundle).setGenericCapabilities(newCapabilities.toArray(new GenericDescription[newCapabilities.size()])); } }
GenericDescription[] genericDescs = result.getGenericCapabilities(); for (GenericDescription genericDesc : genericDescs) { if (IdentityNamespace.IDENTITY_NAMESPACE.equals(genericDesc.getType())) genericDesc.setUserObject(osgiIdentity);
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; }
GenericCapability(ResolverBundle resolverBundle, GenericDescription base) { super(base); this.resolverBundle = resolverBundle; String usesDirective = base.getDeclaredDirectives().get(Constants.USES_DIRECTIVE); uses = ManifestElement.getArrayFromList(usesDirective); String effectiveDirective = base.getDeclaredDirectives().get(Constants.EFFECTIVE_DIRECTIVE); effective = effectiveDirective == null || Constants.EFFECTIVE_RESOLVE.equals(effectiveDirective); }
GenericDescription supplier = ((GenericCapability) capability).getGenericDescription(); resolvedGenericRequires.add(supplier); StateWire genericWire = newStateWire(rb.getBundleDescription(), genericConstraint.getVersionConstraint(), supplier.getSupplier(), supplier); List<StateWire> genericWires = stateWires.get(genericConstraint.getNameSpace()); if (genericWires == null) {
private List<GenericDescription> createProvideCapability(Capability capability) { Map<String, Object> attributes = capability.getAttributes(); Map<String, String> directives = capability.getDirectives(); String declaration = capability.getNamespace() + toString(attributes, "=", false) + toString(directives, ":=", true); //$NON-NLS-1$//$NON-NLS-2$ List<GenericDescription> result = state.getFactory().createGenericDescriptions(declaration); for (GenericDescription genericDescription : result) { genericDescription.setUserObject(capability); } return result; }
private void writeGenericDescription(GenericDescription description, DataOutputStream out) throws IOException { if (writePrefix(description, out)) return; writeBaseDescription(description, out); writeBundleDescription(description.getSupplier(), out, false); writeStringOrNull(description.getType() == GenericDescription.DEFAULT_TYPE ? null : description.getType(), out); Dictionary<String, Object> attrs = description.getAttributes(); Map<String, Object> mapAttrs = new HashMap<>(attrs.size()); for (Enumeration<String> keys = attrs.keys(); keys.hasMoreElements();) { String key = keys.nextElement(); mapAttrs.put(key, attrs.get(key)); } writeMap(out, mapAttrs); Map<String, String> directives = description.getDeclaredDirectives(); writeMap(out, directives); writeGenericDescription((GenericDescription) ((BaseDescriptionImpl) description).getFragmentDeclaration(), out); }
public List<BundleCapability> getDeclaredCapabilities(String namespace) { List<BundleCapability> result = new ArrayList<BundleCapability>(); if (host == null) { if (getSymbolicName() != null) { if (namespace == null || BundleRevision.BUNDLE_NAMESPACE.equals(namespace)) { result.add(BundleDescriptionImpl.this.getCapability()); } if (attachFragments() && (namespace == null || BundleRevision.HOST_NAMESPACE.equals(namespace))) { result.add(BundleDescriptionImpl.this.getCapability(BundleRevision.HOST_NAMESPACE)); } } } else { // may need to have a osgi.wiring.fragment capability } if (namespace == null || BundleRevision.PACKAGE_NAMESPACE.equals(namespace)) { ExportPackageDescription[] exports = getExportPackages(); for (ExportPackageDescription exportPkg : exports) result.add(exportPkg.getCapability()); } GenericDescription[] genericCapabilities = getGenericCapabilities(); for (GenericDescription capabilitiy : genericCapabilities) { if (namespace == null || namespace.equals(capabilitiy.getType())) result.add(capabilitiy.getCapability()); } return Collections.unmodifiableList(result); }
public boolean isSatisfiedBy(BaseDescription supplier) { if (!(supplier instanceof GenericDescription)) return false; GenericDescription candidate = (GenericDescription) supplier; if (!getType().equals(candidate.getType())) return false; // Note that names and versions are only matched by including them in the filter return matchingFilter == null || matchingFilter.match(candidate.getAttributes()); }
boolean checkCapabilityPermission(GenericDescription capability) { if (!checkPermissions) return true; Bundle bundle = capability.getSupplier().getBundle(); return bundle == null ? false : bundle.hasPermission(new CapabilityPermission(capability.getType(), CapabilityPermission.PROVIDE)); } }
void removeGenerics(GenericCapability[] generics) { for (GenericCapability capability : generics) { VersionHashMap<GenericCapability> namespace = resolverGenerics.get(capability.getGenericDescription().getType()); if (namespace != null) namespace.remove(capability); } }
private void resetSystemCapabilities() { BundleDescription[] systemBundles = getBundles(Constants.SYSTEM_BUNDLE_SYMBOLICNAME); for (BundleDescription systemBundle : systemBundles) { GenericDescription[] capabilities = systemBundle.getGenericCapabilities(); List<GenericDescription> newCapabilities = new ArrayList<GenericDescription>(capabilities.length); for (GenericDescription capability : capabilities) { Object equinoxEEIndex = capability.getDeclaredAttributes().get(ExportPackageDescriptionImpl.EQUINOX_EE); if (equinoxEEIndex == null) newCapabilities.add(capability); // keep the built in ones. } // now add the externally defined ones addSystemCapabilities(newCapabilities); ((BundleDescriptionImpl) systemBundle).setGenericCapabilities(newCapabilities.toArray(new GenericDescription[newCapabilities.size()])); } }