@Override public Collection<Resource> getMandatoryResources() { List<Resource> resources = new ArrayList<>(); Requirement req = new RequirementImpl( null, IDENTITY_NAMESPACE, Collections.emptyMap(), Collections.emptyMap(), SimpleFilter.parse("(" + IDENTITY_NAMESPACE + "=root)")); Collection<Capability> identities = repository.findProviders(Collections.singleton(req)).get(req); for (Capability identity : identities) { resources.add(identity.getResource()); } return resources; }
public RequirementImpl(Resource resource, String path, Map<String, String> dirs, Map<String, Object> attrs, SimpleFilter sf) { super(resource, path, dirs, attrs); if (sf == null) { this.filter = getFilter(directives, attributes); } else { this.filter = sf; } // Find resolution import directives. this.optional = Constants.RESOLUTION_OPTIONAL.equals(directives.get(Constants.RESOLUTION_DIRECTIVE)); }
/** * Utility method to check whether a requirement is optional. This method works with any * object implementing the requirement interface. * * @param requirement A requirement * @return {@code true} if the requirement it optional, {@code false} otherwise. */ public static boolean isOptional(Requirement requirement) { if (requirement instanceof RequirementImpl) { return ((RequirementImpl) requirement).isOptional(); } return Constants.RESOLUTION_OPTIONAL.equals(requirement.getDirectives().get(Constants.RESOLUTION_DIRECTIVE)); }
/** * Changes feature identifier (<code>name[/version]</code>) into a requirement specification. * The OSGi manifest header for a feature will be: <code>osgi.identity;osgi.identity=feature-name;type=karaf.feature[;version=feature-version];filter:=filter-from-attrs</code>. * * @param feature The feature name. * @return The feature requirement. */ public static String toFeatureRequirement(String feature) { String[] parts = feature.split("/"); Map<String, Object> attrs = new StringArrayMap<>(parts.length > 1 ? 3 : 2); attrs.put(IDENTITY_NAMESPACE, parts[0]); attrs.put(CAPABILITY_TYPE_ATTRIBUTE, TYPE_FEATURE); if (parts.length > 1) { attrs.put(CAPABILITY_VERSION_ATTRIBUTE, new VersionRange(parts[1])); } Map<String, String> dirs = Collections.singletonMap( Constants.FILTER_DIRECTIVE, SimpleFilter.convert(attrs).toString()); return new RequirementImpl(null, IDENTITY_NAMESPACE, dirs, attrs).toString(); }
ResourceImpl cloneResource(Resource resource) { ResourceImpl res = new ResourceImpl(); for (Capability cap : resource.getCapabilities(null)) { res.addCapability(new CapabilityImpl(res, cap.getNamespace(), new StringArrayMap<>(cap.getDirectives()), new StringArrayMap<>(cap.getAttributes()))); } for (Requirement req : resource.getRequirements(null)) { SimpleFilter sf; if (req instanceof RequirementImpl) { sf = ((RequirementImpl) req).getFilter(); } else if (req.getDirectives().containsKey(REQUIREMENT_FILTER_DIRECTIVE)) { sf = SimpleFilter.parse(req.getDirectives().get(REQUIREMENT_FILTER_DIRECTIVE)); } else { sf = SimpleFilter.convert(req.getAttributes()); } res.addRequirement(new RequirementImpl(res, req.getNamespace(), new StringArrayMap<>(req.getDirectives()), new StringArrayMap<>(req.getAttributes()), sf)); } return res; }
private static RequirementImpl parseRequirement(XMLStreamReader reader, ResourceImpl resource) throws XMLStreamException { String[] namespace = new String[1]; Map<String, String> directives = new HashMap<>(); Map<String, Object> attributes = new HashMap<>(); parseClause(reader, namespace, directives, attributes); sanityCheckEndElement(reader, reader.getEventType(), REQUIREMENT); String filterStr = directives.get(Constants.FILTER_DIRECTIVE); SimpleFilter sf = (filterStr != null) ? SimpleFilter.parse(filterStr) : SimpleFilter.convert(attributes); return new RequirementImpl(resource, namespace[0], directives, attributes, sf); }
public RequirementImpl(Resource resource, String path, Map<String, String> dirs, Map<String, Object> attrs, SimpleFilter sf) { super(resource, path, dirs, attrs); if (sf == null) { this.filter = getFilter(directives, attributes); } else { this.filter = sf; } // Find resolution import directives. this.optional = Constants.RESOLUTION_OPTIONAL.equals(directives.get(Constants.RESOLUTION_DIRECTIVE)); }
/** * Utility method to check whether a requirement is optional. This method works with any * object implementing the requirement interface. * * @param requirement A requirement * @return {@code true} if the requirement it optional, {@code false} otherwise. */ public static boolean isOptional(Requirement requirement) { if (requirement instanceof RequirementImpl) { return ((RequirementImpl) requirement).isOptional(); } return Constants.RESOLUTION_OPTIONAL.equals(requirement.getDirectives().get(Constants.RESOLUTION_DIRECTIVE)); }
private static RequirementImpl parseRequirement(XMLStreamReader reader, ResourceImpl resource) throws XMLStreamException { String[] namespace = new String[1]; Map<String, String> directives = new HashMap<>(); Map<String, Object> attributes = new HashMap<>(); parseClause(reader, namespace, directives, attributes); sanityCheckEndElement(reader, reader.getEventType(), REQUIREMENT); String filterStr = directives.get(Constants.FILTER_DIRECTIVE); SimpleFilter sf = (filterStr != null) ? SimpleFilter.parse(filterStr) : SimpleFilter.convert(attributes); return new RequirementImpl(resource, namespace[0], directives, attributes, sf); }
public boolean matches(Capability cap) { return CapabilitySet.matches(cap, getFilter()); }
if (!RequirementImpl.isOptional(requirement))
reqList.add(new RequirementImpl( resource, ServiceNamespace.SERVICE_NAMESPACE,
/** * Utility method to obtain a SimpleFilter from a given requirement. * If the requirement contains a {@link Constants#FILTER_DIRECTIVE} directive, * it will be used, else, the filter will be derived from the attributes. * * @param requirement A requirement * @return a valid filter, never {@code null}. */ public static SimpleFilter getFilter(Requirement requirement) { if (requirement instanceof RequirementImpl) { return ((RequirementImpl) requirement).getFilter(); } return getFilter(requirement.getDirectives(), requirement.getAttributes()); }
public static RequirementImpl addIdentityRequirement(ResourceImpl resource, String name, String type, VersionRange range, boolean mandatory, boolean conditional) { Map<String, String> dirs = new StringArrayMap<>((mandatory ? 0 : 1) + (conditional ? 1 : 0)); Map<String, Object> attrs = new StringArrayMap<>((name != null ? 1 : 0) + (type != null ? 1 : 0) + (range != null ? 1 : 0)); if (!mandatory) { dirs.put(REQUIREMENT_RESOLUTION_DIRECTIVE, RESOLUTION_OPTIONAL); } if (conditional) { dirs.put(REQUIREMENT_CONDITIONAL_DIRECTIVE, CONDITIONAL_TRUE); } if (name != null) { attrs.put(IDENTITY_NAMESPACE, name); } if (type != null) { attrs.put(CAPABILITY_TYPE_ATTRIBUTE, type); } if (range != null) { attrs.put(CAPABILITY_VERSION_ATTRIBUTE, range); } RequirementImpl requirement = new RequirementImpl(resource, IDENTITY_NAMESPACE, dirs, attrs); resource.addRequirement(requirement); return requirement; }
public boolean matches(Capability cap) { return CapabilitySet.matches(cap, getFilter()); }
reqList.add(new RequirementImpl( resource, ServiceNamespace.SERVICE_NAMESPACE,
/** * Utility method to obtain a SimpleFilter from a given requirement. * If the requirement contains a {@link Constants#FILTER_DIRECTIVE} directive, * it will be used, else, the filter will be derived from the attributes. * * @param requirement A requirement * @return a valid filter, never {@code null}. */ public static SimpleFilter getFilter(Requirement requirement) { if (requirement instanceof RequirementImpl) { return ((RequirementImpl) requirement).getFilter(); } return getFilter(requirement.getDirectives(), requirement.getAttributes()); }
private static List<Requirement> convertRequireCapabilities( List<ParsedHeaderClause> clauses, Resource resource) throws BundleException { // Now convert generic header clauses into requirements. List<Requirement> reqList = new ArrayList<>(); for (ParsedHeaderClause clause : clauses) { try { String filterStr = clause.dirs.get(Constants.FILTER_DIRECTIVE); SimpleFilter sf = (filterStr != null) ? SimpleFilter.parse(filterStr) : SimpleFilter.convert(clause.attrs); for (String path : clause.paths) { // Create requirement and add to requirement list. reqList.add(new RequirementImpl( resource, path, clause.dirs, clause.attrs, sf)); } } catch (Exception ex) { throw new BundleException("Error creating requirement: " + ex, ex); } } return reqList; }
public static boolean matches(Capability capability, Requirement requirement) { return Objects.equals(capability.getNamespace(), requirement.getNamespace()) && matches(capability, RequirementImpl.getFilter(requirement)); }
reqList.add(new RequirementImpl(resource, BundleRevision.BUNDLE_NAMESPACE, newDirs, newAttrs));