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;
}
}
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;
}
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.");
}
}
}
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();
}
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());
}
Aggregations