Search in sources :

Example 6 with Reason

use of org.apache.felix.bundlerepository.Reason in project aries by apache.

the class OBRAriesResolver method doResolve.

private Collection<ModelledResource> doResolve(Resolver obrResolver, String appName) throws ResolverException {
    log.debug(LOG_ENTRY, "doResolve");
    Collection<ModelledResource> toReturn = new ArrayList<ModelledResource>();
    if (obrResolver.resolve()) {
        List<Resource> requiredResources = retrieveRequiredResources(obrResolver);
        if (requiredResources == null) {
            log.debug("resolver.getRequiredResources() returned null");
        } else {
            for (Resource r : requiredResources) {
                Map<String, String> attribs = new HashMap<String, String>();
                attribs.put(Constants.VERSION_ATTRIBUTE, "[" + r.getVersion() + ',' + r.getVersion() + "]");
                ModelledResource modelledResourceForThisMatch = null;
                // list of packages available in the target runtime environment. If the resource has no symbolic name, we can ignore it
                if (r.getSymbolicName() != null) {
                    try {
                        modelledResourceForThisMatch = new ModelledBundleResource(r, modellingManager, modellingHelper);
                    } catch (InvalidAttributeException iax) {
                        ResolverException re = new ResolverException("Internal error occurred: " + iax);
                        log.debug(LOG_EXIT, "doResolve", re);
                        throw re;
                    }
                    toReturn.add(modelledResourceForThisMatch);
                }
            }
        }
        log.debug(LOG_EXIT, toReturn);
        return toReturn;
    } else {
        Reason[] reasons = obrResolver.getUnsatisfiedRequirements();
        // let's refine the list by removing the indirect unsatisfied bundles that are caused by unsatisfied packages or other bundles
        Map<String, Set<String>> refinedReqs = refineUnsatisfiedRequirements(obrResolver, reasons);
        StringBuffer reqList = new StringBuffer();
        Map<String, String> unsatisfiedRequirements = extractConsumableMessageInfo(refinedReqs);
        for (String reason : unsatisfiedRequirements.keySet()) {
            reqList.append('\n');
            reqList.append(reason);
        }
        ResolverException re = new ResolverException(MessageUtil.getMessage("RESOLVER_UNABLE_TO_RESOLVE", new Object[] { appName, reqList }));
        re.setUnsatisfiedRequirementsAndReasons(unsatisfiedRequirements);
        log.debug(LOG_EXIT, "doResolve", re);
        throw re;
    }
}
Also used : ResolverException(org.apache.aries.application.management.ResolverException) Set(java.util.Set) HashSet(java.util.HashSet) InvalidAttributeException(org.apache.aries.application.InvalidAttributeException) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) ModelledBundleResource(org.apache.aries.application.resolver.obr.ext.ModelledBundleResource) ModelledResource(org.apache.aries.application.modelling.ModelledResource) Resource(org.apache.felix.bundlerepository.Resource) Reason(org.apache.felix.bundlerepository.Reason) ModelledResource(org.apache.aries.application.modelling.ModelledResource) ModelledBundleResource(org.apache.aries.application.resolver.obr.ext.ModelledBundleResource)

Example 7 with Reason

use of org.apache.felix.bundlerepository.Reason in project aries by apache.

the class RepositoryGenerator method resolve.

public List<Resource> resolve(List<Resource> subsystemContent, List<Resource> subsystemResources) throws SubsystemException {
    generateOBR();
    if (LOGGER.isDebugEnabled()) {
        LOGGER.debug("Attempt to resolve subsystem content {} subsystem resource {}", subsystemContent.toString(), subsystemResources.toString());
    }
    Resolver obrResolver = this.repositoryAdmin.resolver();
    // add subsystem content to the resolver
    for (Resource res : subsystemContent) {
        // org.apache.felix.bundlerepository.Resource obrRes = findOBRResource(res);
        // obrResolver.add(obrRes);
        obrResolver.add(new OsgiResourceAdapter(res));
    }
    // add subsystem resource to the resolver
    for (Resource res : subsystemResources) {
        // org.apache.felix.bundlerepository.Resource obrRes = findOBRResource(res);
        // obrResolver.add(obrRes);
        obrResolver.add(new OsgiResourceAdapter(res));
    }
    // Question: do we need to create the repository.xml for the subsystem and add the repo to RepoAdmin?
    List<Resource> resources = new ArrayList<Resource>();
    if (obrResolver.resolve()) {
        for (org.apache.felix.bundlerepository.Resource res : obrResolver.getRequiredResources()) {
            // resources.add(toResource(res));
            resources.add(new FelixResourceAdapter(res));
        }
        // Question: should we handle optional resource differently?
        for (org.apache.felix.bundlerepository.Resource res : obrResolver.getOptionalResources()) {
            // resources.add(toResource(res));
            resources.add(new FelixResourceAdapter(res));
        }
    } else {
        // log the unsatisfied requirement
        Reason[] reasons = obrResolver.getUnsatisfiedRequirements();
        StringBuilder builder = new StringBuilder("Failed to resolve subsystem").append(System.getProperty("line.separator"));
        for (Reason reason : reasons) {
            LOGGER.warn("Unable to resolve subsystem content {} subsystem resource {} because of unsatisfied requirement {}", new Object[] { subsystemContent.toString(), subsystemResources.toString(), reason.getRequirement().getName() });
            builder.append("resource = ").append(reason.getResource().getSymbolicName()).append(", requirement = ").append(reason.getRequirement().getName()).append(System.getProperty("line.separator"));
        }
        throw new SubsystemException(builder.toString());
    }
    return resources;
}
Also used : Resolver(org.apache.felix.bundlerepository.Resolver) SubsystemException(org.osgi.service.subsystem.SubsystemException) Resource(org.osgi.resource.Resource) ArrayList(java.util.ArrayList) FelixResourceAdapter(org.apache.aries.subsystem.util.felix.FelixResourceAdapter) Reason(org.apache.felix.bundlerepository.Reason) OsgiResourceAdapter(org.apache.aries.subsystem.util.felix.OsgiResourceAdapter)

Example 8 with Reason

use of org.apache.felix.bundlerepository.Reason in project karaf by apache.

the class ResolveCommand method doExecute.

protected void doExecute(RepositoryAdmin admin) throws Exception {
    List<Repository> repositories = new ArrayList<>();
    repositories.add(admin.getSystemRepository());
    if (!noLocal) {
        repositories.add(admin.getLocalRepository());
    }
    if (!noRemote) {
        repositories.addAll(Arrays.asList(admin.listRepositories()));
    }
    Resolver resolver = admin.resolver(repositories.toArray(new Repository[repositories.size()]));
    for (Requirement requirement : parseRequirements(admin, requirements)) {
        resolver.add(requirement);
    }
    if (resolver.resolve(optional ? 0 : Resolver.NO_OPTIONAL_RESOURCES)) {
        Resource[] resources;
        resources = resolver.getRequiredResources();
        if ((resources != null) && (resources.length > 0)) {
            System.out.println("Required resource(s):");
            printUnderline(System.out, 21);
            for (Resource resource : resources) {
                System.out.println("   " + resource.getPresentationName() + " (" + resource.getVersion() + ")");
                if (why) {
                    Reason[] req = resolver.getReason(resource);
                    for (int reqIdx = 0; req != null && reqIdx < req.length; reqIdx++) {
                        if (!req[reqIdx].getRequirement().isOptional()) {
                            Resource r = req[reqIdx].getResource();
                            if (r != null) {
                                System.out.println("      - " + r.getPresentationName() + " / " + req[reqIdx].getRequirement().getName() + ":" + req[reqIdx].getRequirement().getFilter());
                            } else {
                                System.out.println("      - " + req[reqIdx].getRequirement().getName() + ":" + req[reqIdx].getRequirement().getFilter());
                            }
                        }
                    }
                }
            }
        }
        resources = resolver.getOptionalResources();
        if ((resources != null) && (resources.length > 0)) {
            System.out.println();
            System.out.println("Optional resource(s):");
            printUnderline(System.out, 21);
            for (Resource resource : resources) {
                System.out.println("   " + resource.getPresentationName() + " (" + resource.getVersion() + ")");
                if (why) {
                    Reason[] req = resolver.getReason(resource);
                    for (int reqIdx = 0; req != null && reqIdx < req.length; reqIdx++) {
                        if (!req[reqIdx].getRequirement().isOptional()) {
                            Resource r = req[reqIdx].getResource();
                            if (r != null) {
                                System.out.println("      - " + r.getPresentationName() + " / " + req[reqIdx].getRequirement().getName() + ":" + req[reqIdx].getRequirement().getFilter());
                            } else {
                                System.out.println("      - " + req[reqIdx].getRequirement().getName() + ":" + req[reqIdx].getRequirement().getFilter());
                            }
                        }
                    }
                }
            }
        }
        if (deploy || start) {
            try {
                System.out.print("\nDeploying...");
                resolver.deploy(start ? Resolver.START : 0);
                System.out.println("done.");
            } catch (IllegalStateException ex) {
                System.err.println(ex);
            }
        }
    } else {
        Reason[] reqs = resolver.getUnsatisfiedRequirements();
        if ((reqs != null) && (reqs.length > 0)) {
            System.out.println("Unsatisfied requirement(s):");
            printUnderline(System.out, 27);
            for (Reason req : reqs) {
                System.out.println("   " + req.getRequirement().getName() + ":" + req.getRequirement().getFilter());
                System.out.println("      " + req.getResource().getPresentationName());
            }
        } else {
            System.out.println("Could not resolve targets.");
        }
    }
}
Also used : Requirement(org.apache.felix.bundlerepository.Requirement) Repository(org.apache.felix.bundlerepository.Repository) Resolver(org.apache.felix.bundlerepository.Resolver) ArrayList(java.util.ArrayList) Resource(org.apache.felix.bundlerepository.Resource) Reason(org.apache.felix.bundlerepository.Reason)

Example 9 with Reason

use of org.apache.felix.bundlerepository.Reason in project felix by apache.

the class FelixBundleRepositoryRenderHelper method toJSON.

private final void toJSON(JSONWriter writer, Resource resource, Bundle[] bundles, boolean details) throws IOException {
    final String symbolicName = resource.getSymbolicName();
    final Version version = resource.getVersion();
    String installed = "";
    for (int i = 0; symbolicName != null && installed.length() == 0 && bundles != null && i < bundles.length; i++) {
        final Version ver = bundles[i].getVersion();
        if (symbolicName.equals(bundles[i].getSymbolicName())) {
            installed = ver.toString();
        }
    }
    writer.object();
    // $NON-NLS-1$
    writer.key("id");
    writer.value(resource.getId());
    // $NON-NLS-1$
    writer.key("presentationname");
    writer.value(resource.getPresentationName());
    // $NON-NLS-1$
    writer.key("symbolicname");
    writer.value(symbolicName);
    // $NON-NLS-1$
    writer.key("url");
    writer.value(resource.getURI());
    // $NON-NLS-1$
    writer.key("version");
    writer.value(version);
    // $NON-NLS-1$
    writer.key("categories");
    writer.value(resource.getCategories());
    // $NON-NLS-1$
    writer.key("installed");
    writer.value(installed);
    if (details) {
        Capability[] caps = resource.getCapabilities();
        if (caps != null) {
            // $NON-NLS-1$
            writer.key("capabilities");
            writer.array();
            for (int i = 0; i < caps.length; i++) {
                writer.object();
                // $NON-NLS-1$
                writer.key("name");
                writer.value(caps[i].getName());
                // $NON-NLS-1$
                writer.key("properties");
                toJSON(writer, caps[i].getProperties());
                writer.endObject();
            }
            writer.endArray();
        }
        Requirement[] reqs = resource.getRequirements();
        if (reqs != null) {
            // $NON-NLS-1$
            writer.key("requirements");
            writer.array();
            for (int i = 0; i < reqs.length; i++) {
                writer.object();
                // $NON-NLS-1$
                writer.key("name");
                writer.value(reqs[i].getName());
                // $NON-NLS-1$
                writer.key("filter");
                writer.value(reqs[i].getFilter());
                // $NON-NLS-1$
                writer.key("optional");
                writer.value(reqs[i].isOptional());
                writer.endObject();
            }
            writer.endArray();
        }
        final RepositoryAdmin admin = (RepositoryAdmin) getRepositoryAdmin();
        Resolver resolver = admin.resolver();
        resolver.add(resource);
        resolver.resolve(Resolver.NO_OPTIONAL_RESOURCES);
        Resource[] required = resolver.getRequiredResources();
        if (required != null) {
            // $NON-NLS-1$
            writer.key("required");
            writer.array();
            for (int i = 0; required != null && i < required.length; i++) {
                toJSON(writer, required[i], bundles, false);
            }
            writer.endArray();
        }
        Resource[] optional = resolver.getOptionalResources();
        if (optional != null) {
            // $NON-NLS-1$
            writer.key("optional");
            writer.array();
            for (int i = 0; optional != null && i < optional.length; i++) {
                toJSON(writer, optional[i], bundles, false);
            }
            writer.endArray();
        }
        Reason[] unsatisfied = resolver.getUnsatisfiedRequirements();
        if (unsatisfied != null) {
            // $NON-NLS-1$
            writer.key("unsatisfied");
            writer.array();
            for (int i = 0; unsatisfied != null && i < unsatisfied.length; i++) {
                writer.object();
                // $NON-NLS-1$
                writer.key("name");
                writer.value(unsatisfied[i].getRequirement().getName());
                // $NON-NLS-1$
                writer.key("filter");
                writer.value(unsatisfied[i].getRequirement().getFilter());
                // $NON-NLS-1$
                writer.key("optional");
                writer.value(unsatisfied[i].getRequirement().isOptional());
                writer.endObject();
            }
            writer.endArray();
        }
    }
    writer.endObject();
}
Also used : RepositoryAdmin(org.apache.felix.bundlerepository.RepositoryAdmin) Capability(org.apache.felix.bundlerepository.Capability) Resolver(org.apache.felix.bundlerepository.Resolver) Resource(org.apache.felix.bundlerepository.Resource) Reason(org.apache.felix.bundlerepository.Reason) Requirement(org.apache.felix.bundlerepository.Requirement) Version(org.osgi.framework.Version)

Example 10 with Reason

use of org.apache.felix.bundlerepository.Reason in project felix by apache.

the class OSGiRepositoryImplTest method testSystemBundleCapabilities.

public void testSystemBundleCapabilities() throws Exception {
    RepositoryAdminImpl repoAdmin = createRepositoryAdmin();
    Resolver resolver = repoAdmin.resolver();
    RequirementImpl req = new RequirementImpl("some.system.cap");
    req.setFilter("(sys.cap=something)");
    resolver.add(req);
    ResourceImpl res = new ResourceImpl();
    res.addRequire(req);
    resolver.add(res);
    assertTrue(resolver.resolve());
    // This should add the system bundle repo to the resolved set.
    org.apache.felix.bundlerepository.Resource sysBundleRes = repoAdmin.getSystemRepository().getResources()[0];
    Reason[] reason = resolver.getReason(sysBundleRes);
    assertTrue(reason.length >= 1);
    assertEquals(req, reason[0].getRequirement());
}
Also used : Resolver(org.apache.felix.bundlerepository.Resolver) Reason(org.apache.felix.bundlerepository.Reason)

Aggregations

Reason (org.apache.felix.bundlerepository.Reason)11 Resolver (org.apache.felix.bundlerepository.Resolver)7 Resource (org.apache.felix.bundlerepository.Resource)7 ArrayList (java.util.ArrayList)6 Requirement (org.apache.felix.bundlerepository.Requirement)4 HashMap (java.util.HashMap)3 HashSet (java.util.HashSet)3 Set (java.util.Set)3 ModelledResource (org.apache.aries.application.modelling.ModelledResource)3 ModelledBundleResource (org.apache.aries.application.resolver.obr.ext.ModelledBundleResource)3 Capability (org.apache.felix.bundlerepository.Capability)3 Map (java.util.Map)2 ResolverException (org.apache.aries.application.management.ResolverException)2 Version (org.osgi.framework.Version)2 List (java.util.List)1 ApplicationMetadata (org.apache.aries.application.ApplicationMetadata)1 Content (org.apache.aries.application.Content)1 InvalidAttributeException (org.apache.aries.application.InvalidAttributeException)1 BundleInfo (org.apache.aries.application.management.BundleInfo)1 ResolveConstraint (org.apache.aries.application.management.ResolveConstraint)1