bndtools.tasks.BndBuilderCapReqLoader Maven / Gradle / Ivy
The newest version!
package bndtools.tasks;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.mapping;
import static java.util.stream.Collectors.toList;
import java.io.File;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import org.osgi.framework.namespace.PackageNamespace;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import aQute.bnd.exceptions.Exceptions;
import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Clazz;
import aQute.bnd.osgi.Jar;
import aQute.bnd.osgi.resource.ResourceBuilder;
import aQute.bnd.service.resource.SupportingResource;
import bndtools.model.resolution.RequirementWrapper;
public abstract class BndBuilderCapReqLoader implements CapReqLoader {
protected final File file;
private Map> loadCapabilities;
private Map> loadRequirements;
public BndBuilderCapReqLoader(File file) {
this.file = file;
}
@Override
public String getShortLabel() {
return file.getName();
}
@Override
public String getLongLabel() {
return file.getName() + " - " + file.getParentFile()
.getAbsolutePath();
}
protected abstract Builder getBuilder() throws Exception;
private void load() throws Exception {
if ((loadCapabilities != null) && (loadRequirements != null)) {
return;
}
Builder builder = getBuilder();
if (builder == null) {
loadCapabilities = Collections.emptyMap();
loadRequirements = Collections.emptyMap();
return;
}
Jar jar = builder.getJar();
if (jar == null) {
loadCapabilities = Collections.emptyMap();
loadRequirements = Collections.emptyMap();
return;
}
ResourceBuilder rb = new ResourceBuilder();
rb.addJar(jar);
SupportingResource sr = rb.build();
List capabilities = new ArrayList<>();
List requirements = new ArrayList<>();
for (Resource resource : sr.all()) {
capabilities.addAll(resource.getCapabilities(null));
requirements.addAll(resource.getRequirements(null));
}
loadRequirements = requirements.stream()
.collect(groupingBy(Requirement::getNamespace, mapping(this::toRequirementWrapper, toList())));
loadCapabilities = capabilities.stream()
.collect(groupingBy(Capability::getNamespace, toList()));
}
@Override
public Map> loadCapabilities() throws Exception {
load();
return loadCapabilities;
}
@Override
public Map> loadRequirements() throws Exception {
load();
return loadRequirements;
}
private RequirementWrapper toRequirementWrapper(Requirement req) {
RequirementWrapper rw = new RequirementWrapper(req);
if (req.getNamespace()
.equals(PackageNamespace.PACKAGE_NAMESPACE)) {
String pkgName = (String) req.getAttributes()
.get(PackageNamespace.PACKAGE_NAMESPACE);
try {
rw.requirers = findImportingClasses(pkgName);
} catch (Exception e) {
throw Exceptions.duck(e);
}
}
return rw;
}
private List findImportingClasses(String pkgName) throws Exception {
List classes = new LinkedList<>();
Collection importers = getBuilder().getClasses("", "IMPORTING", pkgName);
// Remove *this* package
for (Clazz clazz : importers) {
String fqn = clazz.getFQN();
int dot = fqn.lastIndexOf('.');
if (dot >= 0) {
String pkg = fqn.substring(0, dot);
if (!pkgName.equals(pkg))
classes.add(clazz);
}
}
return classes;
}
public File getFile() {
return file;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((file == null) ? 0 : file.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
BndBuilderCapReqLoader other = (BndBuilderCapReqLoader) obj;
return Objects.equals(file, other.file);
}
}
© 2015 - 2024 Weber Informatics LLC | Privacy Policy