package aQute.bnd.osgi.repository;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.osgi.resource.Capability;
import org.osgi.resource.Requirement;
import org.osgi.resource.Resource;
import aQute.bnd.osgi.resource.ResourceUtils;
import aQute.lib.collections.MultiMap;
public class ResourcesRepository extends BaseRepository {
final Set<Resource> resources = new LinkedHashSet<>();
public ResourcesRepository(Resource resource) {
add(resource);
}
public ResourcesRepository(Collection< ? extends Resource> resource) {
addAll(resource);
}
public ResourcesRepository() {}
@SuppressWarnings({
"unchecked", "rawtypes"
})
@Override
public Map<Requirement,Collection<Capability>> findProviders(Collection< ? extends Requirement> requirements) {
MultiMap<Requirement,Capability> result = new MultiMap<>();
for (Requirement requirement : requirements) {
List<Capability> capabilities = findProvider(requirement);
result.put(requirement, capabilities);
}
return (Map) result;
}
public List<Capability> findProvider(Requirement requirement) {
List<Capability> result = new ArrayList<Capability>();
String namespace = requirement.getNamespace();
for (Resource resource : resources) {
for (Capability capability : resource.getCapabilities(namespace)) {
if (ResourceUtils.matches(requirement, capability)) {
result.add(capability);
}
}
}
return result;
}
public void add(Resource resource) {
this.resources.add(resource);
}
public void addAll(Collection< ? extends Resource> resources) {
this.resources.addAll(resources);
}
protected void set(Collection< ? extends Resource> resources) {
this.resources.clear();
this.resources.addAll(resources);
}
public List<Resource> getResources() {
return new ArrayList<>(resources);
}
}