package biz.aQute.resolve;
import static org.osgi.framework.Version.parseVersion;
import static org.osgi.framework.namespace.IdentityNamespace.CAPABILITY_VERSION_ATTRIBUTE;
import static org.osgi.framework.namespace.IdentityNamespace.IDENTITY_NAMESPACE;
import static org.osgi.resource.Namespace.REQUIREMENT_FILTER_DIRECTIVE;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import org.osgi.framework.Version;
import org.osgi.resource.Resource;
import org.osgi.resource.Wire;
import org.osgi.service.resolver.ResolutionException;
import aQute.bnd.deployer.repository.FixedIndexedRepo;
import aQute.bnd.osgi.Processor;
import aQute.lib.io.IO;
import junit.framework.TestCase;
import test.lib.MockRegistry;
public class ResolveProcessTest extends TestCase {
private final class ResourceComparator implements Comparator<Resource> {
@Override
public int compare(Resource o1, Resource o2) {
Map<String,Object> a1 = o1.getCapabilities(IDENTITY_NAMESPACE).get(0).getAttributes();
Map<String,Object> a2 = o2.getCapabilities(IDENTITY_NAMESPACE).get(0).getAttributes();
String n1 = (String) a1.get(IDENTITY_NAMESPACE);
String n2 = (String) a2.get(IDENTITY_NAMESPACE);
int diff = n1.compareTo(n2);
if (diff == 0) {
diff = ((Version) a1.get(CAPABILITY_VERSION_ATTRIBUTE))
.compareTo((Version) a2.get(CAPABILITY_VERSION_ATTRIBUTE));
}
return diff;
}
}
public void testResolveRequired() throws ResolutionException, MalformedURLException, URISyntaxException {
ResolveProcess process = new ResolveProcess();
ResolverLogger logger = new ResolverLogger();
MockRegistry registry = new MockRegistry();
registry.addPlugin(getIndex("testdata/repo7/index.xml"));
Processor model = new Processor();
model.setProperty("-runfw", "org.apache.felix.framework");
model.setProperty("-runrequires",
"osgi.extender;filter:='(&(osgi.extender=osgi.component)(version>=1.3)(!(version>=2)))'");
Map<Resource,List<Wire>> requiredResources = process.resolveRequired(model, null, registry,
new BndResolver(logger), Collections.<ResolutionCallback> emptyList(), logger);
Collection<Resource> optionalResources = process.getOptionalResources();
assertEquals(1, requiredResources.size());
assertEquals(3, optionalResources.size());
SortedSet<Resource> set = new TreeSet<Resource>(new ResourceComparator());
set.addAll(optionalResources);
Iterator<Resource> it = set.iterator();
checkOptionalResource(process, it.next(), "org.apache.felix.configadmin", parseVersion("1.8.8"),
"org.osgi.service.cm");
checkOptionalResource(process, it.next(), "org.apache.felix.log", parseVersion("1.0.1"),
"org.osgi.service.log");
checkOptionalResource(process, it.next(), "org.apache.felix.metatype", parseVersion("1.1.0"),
"org.osgi.service.metatype");
}
public void testBigNastyResolveRequired() throws ResolutionException, MalformedURLException, URISyntaxException {
ResolveProcess process = new ResolveProcess();
ResolverLogger logger = new ResolverLogger();
MockRegistry registry = new MockRegistry();
registry.addPlugin(getIndex("testdata/repo7/index.xml"));
registry.addPlugin(getIndex("testdata/repo7/index-aries.xml"));
registry.addPlugin(getIndex("testdata/repo7/index-gemini.xml"));
registry.addPlugin(getIndex("testdata/repo7/index-local.xml"));
Processor model = new Processor();
model.setProperty("-runfw", "org.apache.felix.framework");
model.setProperty("-runrequires", "osgi.extender;filter:='(osgi.extender=osgi.component)'");
Map<Resource,List<Wire>> requiredResources = process.resolveRequired(model, null, registry,
new BndResolver(logger), Collections.<ResolutionCallback> emptyList(), logger);
Collection<Resource> optionalResources = process.getOptionalResources();
assertEquals(1, requiredResources.size());
assertEquals(13, optionalResources.size());
SortedSet<Resource> set = new TreeSet<Resource>(new ResourceComparator());
set.addAll(optionalResources);
Iterator<Resource> it = set.iterator();
checkOptionalResource(process, it.next(), "org.apache.felix.configadmin", parseVersion("1.8.2"),
"org.osgi.service.cm");
checkOptionalResource(process, it.next(), "org.apache.felix.configadmin", parseVersion("1.8.8"),
"org.osgi.service.cm");
checkOptionalResource(process, it.next(), "org.apache.felix.gogo.command", parseVersion("0.12.0"),
"org.osgi.service.log");
checkOptionalResource(process, it.next(), "org.apache.felix.gogo.runtime", parseVersion("0.10.0"),
"org.apache.felix.service.command");
checkOptionalResource(process, it.next(), "org.apache.felix.log", parseVersion("1.0.1"),
"org.osgi.service.log");
checkOptionalResource(process, it.next(), "org.apache.felix.metatype", parseVersion("1.0.4"),
"org.osgi.service.metatype");
checkOptionalResource(process, it.next(), "org.apache.felix.metatype", parseVersion("1.1.0"),
"org.osgi.service.metatype");
checkOptionalResource(process, it.next(), "org.apache.felix.shell", parseVersion("1.4.2"),
"org.osgi.service.log", "org.apache.felix.shell");
checkOptionalResource(process, it.next(), "org.eclipse.osgi.services", parseVersion("3.1.200.v20070605"),
"org.osgi.service.cm", "org.osgi.service.log", "org.osgi.service.metatype");
checkOptionalResource(process, it.next(), "org.ops4j.pax.logging.pax-logging-api", parseVersion("1.4.0"),
"org.osgi.service.log");
checkOptionalResource(process, it.next(), "osgi.cmpn", parseVersion("4.3.1.201210102024"),
"org.osgi.service.cm", "org.osgi.service.log", "org.osgi.service.metatype");
checkOptionalResource(process, it.next(), "osgi.cmpn", parseVersion("5.0.0.201305092017"),
"org.osgi.service.cm", "org.osgi.service.log", "org.osgi.service.metatype");
checkOptionalResource(process, it.next(), "osgi.enterprise", parseVersion("4.2.0.201003190513"),
"org.osgi.service.cm", "org.osgi.service.log", "org.osgi.service.metatype");
}
protected FixedIndexedRepo getIndex(String location) throws MalformedURLException, URISyntaxException {
File index = IO.getFile(location);
FixedIndexedRepo fir = new FixedIndexedRepo();
fir.setLocations(index.toURI().toString());
return fir;
}
private void checkOptionalResource(ResolveProcess process, Resource resource, String bsn, Version version,
String packageName, String... morePackages) {
Collection<Wire> reasons;
Map<String,Object> idAttrs;
idAttrs = resource.getCapabilities(IDENTITY_NAMESPACE).get(0).getAttributes();
assertEquals(bsn, idAttrs.get(IDENTITY_NAMESPACE));
assertEquals(version, idAttrs.get(CAPABILITY_VERSION_ATTRIBUTE));
reasons = process.getOptionalReasons(resource);
assertEquals(1 + morePackages.length, reasons.size());
Iterator<Wire> iterator = reasons.iterator();
Wire wire = iterator.next();
assertEquals("org.apache.felix.scr",
wire.getRequirer().getCapabilities(IDENTITY_NAMESPACE).get(0).getAttributes().get(IDENTITY_NAMESPACE));
assertTrue(wire.getRequirement().toString(),
wire.getRequirement().getDirectives().get(REQUIREMENT_FILTER_DIRECTIVE).contains(packageName));
for (String pkg : morePackages) {
wire = iterator.next();
assertEquals("org.apache.felix.scr", wire.getRequirer()
.getCapabilities(IDENTITY_NAMESPACE)
.get(0)
.getAttributes()
.get(IDENTITY_NAMESPACE));
assertTrue(wire.getRequirement().toString(),
wire.getRequirement().getDirectives().get(REQUIREMENT_FILTER_DIRECTIVE).contains(pkg));
}
}
}