Search in sources :

Example 1 with BaseRepository

use of org.apache.felix.utils.repository.BaseRepository in project karaf by apache.

the class OfflineResolver method readRepository.

private static Repository readRepository(Object repository) throws BundleException {
    List<Resource> resources = new ArrayList<>();
    Collection<Map<String, List<String>>> metadatas;
    if (repository instanceof Map) {
        metadatas = ((Map<String, Map<String, List<String>>>) repository).values();
    } else {
        metadatas = (Collection<Map<String, List<String>>>) repository;
    }
    for (Map<String, List<String>> metadata : metadatas) {
        ResourceImpl res = new ResourceImpl();
        for (String cap : metadata.get("capabilities")) {
            res.addCapabilities(ResourceBuilder.parseCapability(res, cap));
        }
        if (metadata.containsKey("requirements")) {
            for (String req : metadata.get("requirements")) {
                res.addRequirements(ResourceBuilder.parseRequirement(res, req));
            }
        }
        resources.add(res);
    }
    return new BaseRepository(resources);
}
Also used : ResourceImpl(org.apache.felix.utils.resource.ResourceImpl) Resource(org.osgi.resource.Resource) ArrayList(java.util.ArrayList) BaseRepository(org.apache.felix.utils.repository.BaseRepository) ArrayList(java.util.ArrayList) List(java.util.List) Map(java.util.Map)

Example 2 with BaseRepository

use of org.apache.felix.utils.repository.BaseRepository in project karaf by apache.

the class RepositoryManager method getRepository.

public BaseRepository getRepository(String base, String uri) {
    BaseRepository repo;
    if (uri.startsWith("xml:")) {
        String u = URI.create(base).resolve(uri.substring("xml:".length())).toString();
        uri = "xml:" + u;
        repo = new XmlRepository(u, 0, false);
    } else if (uri.startsWith("json:")) {
        String u = URI.create(base).resolve(uri.substring("json:".length())).toString();
        uri = "json:" + u;
        repo = new JsonRepository(u, 0, false);
    } else {
        String u = URI.create(base).resolve(uri).toString();
        uri = "xml:" + u;
        repo = new XmlRepository(u, 0, false);
    }
    repositories.putIfAbsent(uri, repo);
    return repositories.get(uri);
}
Also used : XmlRepository(org.apache.karaf.features.internal.repository.XmlRepository) BaseRepository(org.apache.felix.utils.repository.BaseRepository) JsonRepository(org.apache.karaf.features.internal.repository.JsonRepository)

Example 3 with BaseRepository

use of org.apache.felix.utils.repository.BaseRepository in project karaf by apache.

the class Builder method repositoryOfOptionalResources.

/**
 * Optional resource URIs will be made available through OSGi {@link Repository}
 * @param manager
 * @param optionals
 * @return
 * @throws Exception
 */
private Repository repositoryOfOptionalResources(DownloadManager manager, Collection<String> optionals) throws Exception {
    final List<Resource> resources = new ArrayList<>();
    Downloader downloader = manager.createDownloader();
    for (String optional : optionals) {
        downloader.download(optional, provider -> {
            Resource resource = ResourceBuilder.build(provider.getUrl(), getHeaders(provider));
            synchronized (resources) {
                resources.add(resource);
            }
        });
    }
    downloader.await();
    return new BaseRepository(resources);
}
Also used : Resource(org.osgi.resource.Resource) ArrayList(java.util.ArrayList) BaseRepository(org.apache.felix.utils.repository.BaseRepository) Downloader(org.apache.karaf.features.internal.download.Downloader)

Example 4 with BaseRepository

use of org.apache.felix.utils.repository.BaseRepository in project karaf by apache.

the class Subsystem method downloadBundles.

/**
 * Downloads bundles for all the features in current and child subsystems. But also collects bundles
 * as {@link DependencyInfo}.
 *
 * @param manager The {@link DownloadManager} to use.
 * @param featureResolutionRange The feature resolution range to use.
 * @param serviceRequirements The {@link FeaturesService.ServiceRequirementsBehavior} behavior to use.
 * @param repos The {@link RepositoryManager} to use.
 * @param callback The {@link SubsystemResolverCallback} to use.
 */
@SuppressWarnings("InfiniteLoopStatement")
public void downloadBundles(DownloadManager manager, String featureResolutionRange, final FeaturesService.ServiceRequirementsBehavior serviceRequirements, RepositoryManager repos, SubsystemResolverCallback callback) throws Exception {
    for (Subsystem child : children) {
        child.downloadBundles(manager, featureResolutionRange, serviceRequirements, repos, callback);
    }
    // collect BundleInfos for given feature - both direct <feature>/<bundle>s and <feature>/<conditional>/<bundle>s
    final Map<BundleInfo, Conditional> infos = new HashMap<>();
    final Downloader downloader = manager.createDownloader();
    if (feature != null) {
        for (Conditional cond : feature.getConditional()) {
            if (!cond.isBlacklisted()) {
                for (final BundleInfo bi : cond.getBundles()) {
                    // bundles from conditional features will be added as non-mandatory requirements
                    infos.put(bi, cond);
                }
            }
        }
        for (BundleInfo bi : feature.getBundles()) {
            infos.put(bi, null);
        }
    }
    // infos.keySet().removeIf(Blacklisting::isBlacklisted);
    for (Iterator<BundleInfo> iterator = infos.keySet().iterator(); iterator.hasNext(); ) {
        BundleInfo bi = iterator.next();
        if (bi.isBlacklisted()) {
            iterator.remove();
            if (callback != null) {
                callback.bundleBlacklisted(bi);
            }
        }
    }
    // all downloaded bundles
    final Map<String, ResourceImpl> bundles = new ConcurrentHashMap<>();
    // resources for locations that were overriden in OSGi mode - to check whether the override should actually
    // take place, by checking resource's headers
    final Map<String, ResourceImpl> overrides = new ConcurrentHashMap<>();
    boolean removeServiceRequirements = serviceRequirementsBehavior(feature, serviceRequirements);
    // download collected BundleInfo locations
    for (Map.Entry<BundleInfo, Conditional> entry : infos.entrySet()) {
        final BundleInfo bi = entry.getKey();
        final String loc = bi.getLocation();
        downloader.download(loc, provider -> {
            // always download location (could be overriden)
            ResourceImpl resource = createResource(loc, getMetadata(provider), removeServiceRequirements);
            bundles.put(loc, resource);
            if (bi.isOverriden() == BundleInfo.BundleOverrideMode.OSGI) {
                // also download original from original bundle URI to check if we should override by comparing
                // symbolic name - requires MANIFEST.MF header access. If there should be no override, we'll get
                // back to original URI
                downloader.download(bi.getOriginalLocation(), provider2 -> {
                    ResourceImpl originalResource = createResource(bi.getOriginalLocation(), getMetadata(provider2), removeServiceRequirements);
                    bundles.put(bi.getOriginalLocation(), originalResource);
                    // an entry in overrides map means that given location was overriden
                    overrides.put(loc, originalResource);
                });
            }
        });
    }
    // download direct bundle: requirements - without consulting overrides
    for (Clause bundle : Parser.parseClauses(this.bundles.toArray(new String[this.bundles.size()]))) {
        final String loc = bundle.getName();
        downloader.download(loc, provider -> bundles.put(loc, createResource(loc, getMetadata(provider), removeServiceRequirements)));
    }
    // resolution process
    if (feature != null) {
        for (Library library : feature.getLibraries()) {
            if (library.isExport()) {
                final String loc = library.getLocation();
                downloader.download(loc, provider -> bundles.put(loc, createResource(loc, getMetadata(provider), removeServiceRequirements)));
            }
        }
    }
    downloader.await();
    // opposite to what we had before. Currently bundles are already overriden at model level, but
    // as we finally have access to headers, we can compare symbolic names and if override mode is OSGi, then
    // we can restore original resource if there should be no override.
    Overrides.override(bundles, overrides);
    if (feature != null) {
        // Add conditionals
        Map<Conditional, Resource> resConds = new HashMap<>();
        for (Conditional cond : feature.getConditional()) {
            if (cond.isBlacklisted()) {
                continue;
            }
            FeatureResource resCond = FeatureResource.build(feature, cond, featureResolutionRange, bundles);
            // feature's subsystem will optionally require conditional feature resource
            addIdentityRequirement(this, resCond, false);
            // but it's a mandatory requirement in other way
            addIdentityRequirement(resCond, this, true);
            installable.add(resCond);
            resConds.put(cond, resCond);
        }
        // Add features and make it require given subsystem that represents logical feature requirement
        FeatureResource resFeature = FeatureResource.build(feature, featureResolutionRange, bundles);
        addIdentityRequirement(resFeature, this);
        installable.add(resFeature);
        // Add dependencies
        for (Map.Entry<BundleInfo, Conditional> entry : infos.entrySet()) {
            final BundleInfo bi = entry.getKey();
            final String loc = bi.getLocation();
            final Conditional cond = entry.getValue();
            ResourceImpl res = bundles.get(loc);
            int sl = bi.getStartLevel() <= 0 ? feature.getStartLevel() : bi.getStartLevel();
            if (cond != null) {
                // bundle of conditional feature will have mandatory requirement on it
                addIdentityRequirement(res, resConds.get(cond), true);
            }
            boolean mandatory = !bi.isDependency() && cond == null;
            if (bi.isDependency()) {
                addDependency(res, mandatory, bi.isStart(), sl, bi.isBlacklisted());
            } else {
                doAddDependency(res, mandatory, bi.isStart(), sl, bi.isBlacklisted());
            }
        }
        for (Library library : feature.getLibraries()) {
            if (library.isExport()) {
                final String loc = library.getLocation();
                ResourceImpl res = bundles.get(loc);
                addDependency(res, false, false, 0, false);
            }
        }
        for (String uri : feature.getResourceRepositories()) {
            BaseRepository repo = repos.getRepository(feature.getRepositoryUrl(), uri);
            for (Resource resource : repo.getResources()) {
                ResourceImpl res = cloneResource(resource);
                addDependency(res, false, true, 0, false);
            }
        }
    }
    for (Clause bundle : Parser.parseClauses(this.bundles.toArray(new String[this.bundles.size()]))) {
        final String loc = bundle.getName();
        boolean dependency = Boolean.parseBoolean(bundle.getAttribute("dependency"));
        boolean start = bundle.getAttribute("start") == null || Boolean.parseBoolean(bundle.getAttribute("start"));
        boolean blacklisted = bundle.getAttribute("blacklisted") != null && Boolean.parseBoolean(bundle.getAttribute("blacklisted"));
        int startLevel = 0;
        try {
            startLevel = Integer.parseInt(bundle.getAttribute("start-level"));
        } catch (NumberFormatException e) {
        // Ignore
        }
        if (dependency) {
            addDependency(bundles.get(loc), false, start, startLevel, blacklisted);
        } else {
            doAddDependency(bundles.get(loc), true, start, startLevel, blacklisted);
            // non dependency bundle will be added as osgi.identity req on type=osgi.bundle
            addIdentityRequirement(this, bundles.get(loc));
        }
    }
    // Compute dependencies
    for (DependencyInfo info : dependencies.values()) {
        installable.add(info.resource);
        // bundle resource will have a requirement on its feature's subsystem too
        // when bundle is declared with dependency="true", it will have a requirement on its region's subsystem
        addIdentityRequirement(info.resource, this, info.mandatory);
    }
}
Also used : FeatureResource(org.apache.karaf.features.internal.resolver.FeatureResource) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) FeatureResource(org.apache.karaf.features.internal.resolver.FeatureResource) Resource(org.osgi.resource.Resource) BaseRepository(org.apache.felix.utils.repository.BaseRepository) Downloader(org.apache.karaf.features.internal.download.Downloader) Conditional(org.apache.karaf.features.Conditional) BundleInfo(org.apache.karaf.features.BundleInfo) ResourceImpl(org.apache.felix.utils.resource.ResourceImpl) Clause(org.apache.felix.utils.manifest.Clause) Library(org.apache.karaf.features.Library) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) StringArrayMap(org.apache.felix.utils.collections.StringArrayMap) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap)

Aggregations

BaseRepository (org.apache.felix.utils.repository.BaseRepository)4 Resource (org.osgi.resource.Resource)3 ArrayList (java.util.ArrayList)2 Map (java.util.Map)2 ResourceImpl (org.apache.felix.utils.resource.ResourceImpl)2 Downloader (org.apache.karaf.features.internal.download.Downloader)2 HashMap (java.util.HashMap)1 List (java.util.List)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 StringArrayMap (org.apache.felix.utils.collections.StringArrayMap)1 Clause (org.apache.felix.utils.manifest.Clause)1 BundleInfo (org.apache.karaf.features.BundleInfo)1 Conditional (org.apache.karaf.features.Conditional)1 Library (org.apache.karaf.features.Library)1 JsonRepository (org.apache.karaf.features.internal.repository.JsonRepository)1 XmlRepository (org.apache.karaf.features.internal.repository.XmlRepository)1 FeatureResource (org.apache.karaf.features.internal.resolver.FeatureResource)1