Search in sources :

Example 1 with RequirementImpl

use of org.apache.felix.utils.resource.RequirementImpl in project karaf by apache.

the class OfflineResolver method resolve.

public static void resolve(String resolutionFile) throws Exception {
    Map<String, Object> resolution;
    try (BufferedReader reader = Files.newBufferedReader(Paths.get(resolutionFile), StandardCharsets.UTF_8)) {
        resolution = (Map<String, Object>) JsonReader.read(reader);
    }
    final Repository globalRepository;
    if (resolution.containsKey("globalRepository")) {
        globalRepository = readRepository(resolution.get("globalRepository"));
    } else {
        globalRepository = null;
    }
    final Repository repository = readRepository(resolution.get("repository"));
    Resolver resolver = new ResolverImpl(new Logger(Logger.LOG_ERROR));
    Map<Resource, List<Wire>> wiring = resolver.resolve(new ResolveContext() {

        private final CandidateComparator candidateComparator = new CandidateComparator(r -> 0);

        @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;
        }

        @Override
        public List<Capability> findProviders(Requirement requirement) {
            List<Capability> caps = new ArrayList<>();
            Map<Requirement, Collection<Capability>> resMap = repository.findProviders(Collections.singleton(requirement));
            Collection<Capability> res = resMap != null ? resMap.get(requirement) : null;
            if (res != null && !res.isEmpty()) {
                caps.addAll(res);
            } else if (globalRepository != null) {
                // Only bring in external resources for non optional requirements
                if (!RESOLUTION_OPTIONAL.equals(requirement.getDirectives().get(RESOLUTION_DIRECTIVE))) {
                    resMap = globalRepository.findProviders(Collections.singleton(requirement));
                    res = resMap != null ? resMap.get(requirement) : null;
                    if (res != null && !res.isEmpty()) {
                        caps.addAll(res);
                    }
                }
            }
            // Sort caps
            caps.sort(candidateComparator);
            return caps;
        }

        @Override
        public int insertHostedCapability(List<Capability> capabilities, HostedCapability hostedCapability) {
            int idx = Collections.binarySearch(capabilities, hostedCapability, candidateComparator);
            if (idx < 0) {
                idx = Math.abs(idx + 1);
            }
            capabilities.add(idx, hostedCapability);
            return idx;
        }

        @Override
        public boolean isEffective(Requirement requirement) {
            return true;
        }

        @Override
        public Map<Resource, Wiring> getWirings() {
            return Collections.emptyMap();
        }
    });
}
Also used : ResolveContext(org.osgi.service.resolver.ResolveContext) RequirementImpl(org.apache.felix.utils.resource.RequirementImpl) Resolver(org.osgi.service.resolver.Resolver) HostedCapability(org.osgi.service.resolver.HostedCapability) Capability(org.osgi.resource.Capability) Resource(org.osgi.resource.Resource) ResolverImpl(org.apache.felix.resolver.ResolverImpl) Logger(org.apache.felix.resolver.Logger) HostedCapability(org.osgi.service.resolver.HostedCapability) Requirement(org.osgi.resource.Requirement) Repository(org.osgi.service.repository.Repository) BaseRepository(org.apache.felix.utils.repository.BaseRepository) BufferedReader(java.io.BufferedReader) Collection(java.util.Collection) ArrayList(java.util.ArrayList) List(java.util.List) Map(java.util.Map)

Example 2 with RequirementImpl

use of org.apache.felix.utils.resource.RequirementImpl in project karaf by apache.

the class ResourceUtils method toFeatureRequirement.

/**
 * 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();
}
Also used : RequirementImpl(org.apache.felix.utils.resource.RequirementImpl) StringArrayMap(org.apache.felix.utils.collections.StringArrayMap) VersionRange(org.apache.felix.utils.version.VersionRange)

Example 3 with RequirementImpl

use of org.apache.felix.utils.resource.RequirementImpl in project karaf by apache.

the class ResourceUtils method addIdentityRequirement.

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;
}
Also used : RequirementImpl(org.apache.felix.utils.resource.RequirementImpl) StringArrayMap(org.apache.felix.utils.collections.StringArrayMap)

Example 4 with RequirementImpl

use of org.apache.felix.utils.resource.RequirementImpl in project karaf by apache.

the class ResourceUtils method addIdentityRequirement.

public static void addIdentityRequirement(ResourceImpl resource, Resource required, boolean mandatory) {
    for (Capability cap : required.getCapabilities(null)) {
        if (cap.getNamespace().equals(IDENTITY_NAMESPACE)) {
            Map<String, Object> attributes = cap.getAttributes();
            Map<String, String> dirs = new StringArrayMap<>(1);
            dirs.put(REQUIREMENT_RESOLUTION_DIRECTIVE, mandatory ? RESOLUTION_MANDATORY : RESOLUTION_OPTIONAL);
            Version version = (Version) attributes.get(CAPABILITY_VERSION_ATTRIBUTE);
            Map<String, Object> attrs = new StringArrayMap<>(version != null ? 3 : 2);
            attrs.put(IDENTITY_NAMESPACE, attributes.get(IDENTITY_NAMESPACE));
            attrs.put(CAPABILITY_TYPE_ATTRIBUTE, attributes.get(CAPABILITY_TYPE_ATTRIBUTE));
            if (version != null) {
                attrs.put(CAPABILITY_VERSION_ATTRIBUTE, new VersionRange(version, true));
            }
            resource.addRequirement(new RequirementImpl(resource, IDENTITY_NAMESPACE, dirs, attrs));
        }
    }
}
Also used : RequirementImpl(org.apache.felix.utils.resource.RequirementImpl) Capability(org.osgi.resource.Capability) StringArrayMap(org.apache.felix.utils.collections.StringArrayMap) Version(org.osgi.framework.Version) VersionRange(org.apache.felix.utils.version.VersionRange)

Example 5 with RequirementImpl

use of org.apache.felix.utils.resource.RequirementImpl in project karaf by apache.

the class Subsystem method cloneResource.

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;
}
Also used : ResourceUtils.addIdentityRequirement(org.apache.karaf.features.internal.resolver.ResourceUtils.addIdentityRequirement) ResourceUtils.toFeatureRequirement(org.apache.karaf.features.internal.resolver.ResourceUtils.toFeatureRequirement) Requirement(org.osgi.resource.Requirement) ResourceImpl(org.apache.felix.utils.resource.ResourceImpl) CapabilityImpl(org.apache.felix.utils.resource.CapabilityImpl) RequirementImpl(org.apache.felix.utils.resource.RequirementImpl) Capability(org.osgi.resource.Capability) StringArrayMap(org.apache.felix.utils.collections.StringArrayMap) SimpleFilter(org.apache.felix.utils.resource.SimpleFilter)

Aggregations

RequirementImpl (org.apache.felix.utils.resource.RequirementImpl)6 StringArrayMap (org.apache.felix.utils.collections.StringArrayMap)4 Capability (org.osgi.resource.Capability)4 Requirement (org.osgi.resource.Requirement)3 ArrayList (java.util.ArrayList)2 VersionRange (org.apache.felix.utils.version.VersionRange)2 BufferedReader (java.io.BufferedReader)1 Collection (java.util.Collection)1 List (java.util.List)1 Map (java.util.Map)1 Logger (org.apache.felix.resolver.Logger)1 ResolverImpl (org.apache.felix.resolver.ResolverImpl)1 BaseRepository (org.apache.felix.utils.repository.BaseRepository)1 CapabilityImpl (org.apache.felix.utils.resource.CapabilityImpl)1 ResourceImpl (org.apache.felix.utils.resource.ResourceImpl)1 SimpleFilter (org.apache.felix.utils.resource.SimpleFilter)1 ResourceUtils.addIdentityRequirement (org.apache.karaf.features.internal.resolver.ResourceUtils.addIdentityRequirement)1 ResourceUtils.toFeatureRequirement (org.apache.karaf.features.internal.resolver.ResourceUtils.toFeatureRequirement)1 Version (org.osgi.framework.Version)1 Resource (org.osgi.resource.Resource)1