package test.component_extra;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.jar.Attributes;
import org.osgi.service.cm.ConfigurationAdmin;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.osgi.service.component.annotations.ReferenceCardinality;
import org.osgi.service.event.EventAdmin;
import org.osgi.service.log.LogService;
import org.osgi.service.metatype.MetaTypeService;
import aQute.bnd.header.Attrs;
import aQute.bnd.header.Parameters;
import aQute.bnd.osgi.Builder;
import aQute.bnd.osgi.Constants;
import aQute.bnd.osgi.Jar;
import aQute.bnd.test.BndTestCase;
/*
* Placed in a new package to avoid breaking lots of existing tests with the additional packages
* we need to import.
*/
public class DSAnnotationExtrasTest extends BndTestCase {
@Component(configurationPid = "x" // force DS 1.3
)
public static class DS13reference_cardinalities {
@Reference
void setLogService(LogService log) {};
@Reference(cardinality = ReferenceCardinality.OPTIONAL)
void setEventAdmin(EventAdmin ea) {};
@Reference(cardinality = ReferenceCardinality.MULTIPLE)
void setConfigAdmin(ConfigurationAdmin cm) {};
@Reference(cardinality = ReferenceCardinality.AT_LEAST_ONE)
void setMetatype(MetaTypeService metatype) {};
}
public void testRequireCapabilityCardinality() throws Exception {
Builder b = new Builder();
b.setProperty(Constants.DSANNOTATIONS, DS13reference_cardinalities.class.getName());
b.setProperty("Private-Package", DS13reference_cardinalities.class.getPackage().getName());
b.addClasspath(new File("bin"));
Jar jar = b.build();
assertOk(b);
Attributes attrs = jar.getManifest().getMainAttributes();
Parameters requires = new Parameters(attrs.getValue(Constants.REQUIRE_CAPABILITY));
List<Attrs> serviceRequires = getAll(requires, "osgi.service");
assertEquals(4, serviceRequires.size());
checkServiceRequirements(serviceRequires, LogService.class, false, false);
checkServiceRequirements(serviceRequires, EventAdmin.class, true, false);
checkServiceRequirements(serviceRequires, ConfigurationAdmin.class, true, true);
checkServiceRequirements(serviceRequires, MetaTypeService.class, false, true);
}
private void checkServiceRequirements(List<Attrs> serviceReqs, Class< ? > clazz, boolean optional,
boolean multiple) {
String filter = String.format("(objectClass=%s)", clazz.getName());
boolean found = false;
for (Attrs serviceReq : serviceReqs) {
if (filter.equals(serviceReq.get("filter:"))) {
assertEquals("missing effective:=active on " + clazz.getName(), "active", serviceReq.get("effective:"));
if (optional)
assertEquals("missing resolution:=optional on " + clazz.getName(), "optional",
serviceReq.get("resolution:"));
if (multiple)
assertEquals("missing cardinality:=multiple on " + clazz.getName(), "multiple",
serviceReq.get("cardinality:"));
found = true;
}
}
assertTrue("objectClass not found: " + clazz.getName(), found);
}
private static List<Attrs> getAll(Parameters p, String key) {
List<Attrs> l = new ArrayList<Attrs>();
for (; p.containsKey(key); key += aQute.bnd.osgi.Constants.DUPLICATE_MARKER) {
l.add(p.get(key));
}
return l;
}
}