Commit API test suite (composite)
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@765176 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/api/pom.xml b/ipojo/api/pom.xml
index 371b0df..e4c4d3c 100644
--- a/ipojo/api/pom.xml
+++ b/ipojo/api/pom.xml
@@ -84,6 +84,7 @@
<configLocation>http://felix.apache.org/ipojo/dev/checkstyle_ipojo.xml</configLocation>
</configuration>
</plugin>
+
</plugins>
</build>
<dependencies>
diff --git a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/CompositeComponentType.java b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/CompositeComponentType.java
index 911a2f2..7186f26 100644
--- a/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/CompositeComponentType.java
+++ b/ipojo/api/src/main/java/org/apache/felix/ipojo/api/composite/CompositeComponentType.java
@@ -99,7 +99,7 @@
*/
private void ensureValidity() {
if (m_context == null) {
- throw new IllegalStateException("The primitive component type has no bundle context");
+ throw new IllegalStateException("The composite component type has no bundle context");
}
}
@@ -223,6 +223,14 @@
InstantiatedService inst = (InstantiatedService) m_instantiated.get(i);
element.addElement(inst.getElement());
}
+ for (int i = 0; i < m_exported.size(); i++) {
+ ExportedService inst = (ExportedService) m_exported.get(i);
+ element.addElement(inst.getElement());
+ }
+ for (int i = 0; i < m_provided.size(); i++) {
+ ProvidedService inst = (ProvidedService) m_provided.get(i);
+ element.addElement(inst.getElement());
+ }
return element;
}
diff --git a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ExportedServiceTest.java b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ExportedServiceTest.java
new file mode 100644
index 0000000..ef665ed
--- /dev/null
+++ b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ExportedServiceTest.java
@@ -0,0 +1,119 @@
+package org.apache.felix.ipojo.api.composite;
+
+
+import junit.framework.TestCase;
+
+import org.apache.felix.ipojo.metadata.Element;
+
+public class ExportedServiceTest extends TestCase {
+
+
+
+//
+//<comp:composite name="composite.export.5" architecture="true">
+// <subservice action="import"
+// specification="org.apache.felix.ipojo.test.composite.service.BazService"
+// aggregate="true" optional="true" filter="(!(instance.name=export))"
+// scope="composite" />
+// <comp:provides action="export"
+// specification="org.apache.felix.ipojo.test.composite.service.BazService"
+// filter="(instance.name=foo1)" />
+//</comp:composite>
+
+// <comp:provides action="export"
+// specification="org.apache.felix.ipojo.test.composite.service.BazService" />
+ public void testSimple() {
+ ExportedService svc = new ExportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.BazService");
+
+ Element elem = svc.getElement();
+ String name = elem.getName();
+ String action = elem.getAttribute("action");
+ String spec = elem.getAttribute("specification");
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.BazService", spec);
+ }
+
+ public void testBad() {
+ ExportedService svc = new ExportedService()
+ //.setSpecification("org.apache.felix.ipojo.test.composite.service.BarService") NO SPEC
+ ;
+ try {
+ svc.getElement();
+ fail("Invalid element accepted");
+ } catch (IllegalStateException e) {
+ // OK
+ }
+ }
+
+
+// <comp:provides action="export"
+// specification="org.apache.felix.ipojo.test.composite.service.BazService"
+// aggregate="true" />
+ public void testAggregate() {
+ ExportedService svc = new ExportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.BazService")
+ .setAggregate(true);
+
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String agg = elem.getAttribute("aggregate");
+
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.BazService", spec);
+ assertEquals("aggregate", "true", agg);
+ }
+
+// <comp:provides action="export"
+// specification="org.apache.felix.ipojo.test.composite.service.BazService"
+// optional="true" />
+ public void testOptional() {
+ ExportedService svc = new ExportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.BazService")
+ .setOptional(true);
+
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String opt = elem.getAttribute("optional");
+
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.BazService", spec);
+ assertEquals("optional", "true", opt);
+ }
+// <comp:provides action="export"
+// specification="org.apache.felix.ipojo.test.composite.service.BazService"
+// aggregate="true" optional="true" />
+ public void testOptionalAndAggregate() {
+ ExportedService svc = new ExportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
+ .setOptional(true)
+ .setAggregate(true);
+
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String opt = elem.getAttribute("optional");
+ String agg = elem.getAttribute("aggregate");
+
+
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ assertEquals("optional", "true", opt);
+ assertEquals("aggregate", "true", agg);
+ }
+
+// <comp:provides action="export"
+// specification="org.apache.felix.ipojo.test.composite.service.BazService"
+// filter="(instance.name=foo1)" />
+ public void testFilter() {
+ ExportedService svc = new ExportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
+ .setFilter("(&(int=2)(long=40))");
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String filter = elem.getAttribute("filter");
+
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ assertEquals("filter", "(&(int=2)(long=40))", filter);
+ }
+
+}
diff --git a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ImportedServiceTest.java b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ImportedServiceTest.java
new file mode 100644
index 0000000..5cf580c
--- /dev/null
+++ b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/ImportedServiceTest.java
@@ -0,0 +1,143 @@
+package org.apache.felix.ipojo.api.composite;
+
+
+import junit.framework.TestCase;
+
+import org.apache.felix.ipojo.metadata.Element;
+
+public class ImportedServiceTest extends TestCase {
+
+// <comp:composite name="composite.requires.1" architecture="true">
+// <subservice action="import"
+// specification="org.apache.felix.ipojo.test.composite.service.FooService"
+// scope="composite" />
+//</comp:composite>
+ public void testSimple() {
+ ImportedService svc = new ImportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService");
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ }
+
+ public void testBad() {
+ ImportedService svc = new ImportedService()
+ //.setSpecification("org.apache.felix.ipojo.test.composite.service.BarService") NO SPEC
+ ;
+ try {
+ svc.getElement();
+ fail("Invalid element accepted");
+ } catch (IllegalStateException e) {
+ // OK
+ }
+ }
+
+ public void testScope() {
+ ImportedService svc = new ImportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
+ .setScope(ImportedService.COMPOSITE_SCOPE);
+
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String scope = elem.getAttribute("scope");
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ assertEquals("scope", "composite", scope);
+
+ }
+
+//
+//<comp:composite name="composite.requires.2" architecture="true">
+// <subservice action="import"
+// specification="org.apache.felix.ipojo.test.composite.service.FooService"
+// aggregate="true" scope="composite" />
+//</comp:composite>
+ public void testAggregate() {
+ ImportedService svc = new ImportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
+ .setScope(ImportedService.COMPOSITE_SCOPE)
+ .setAggregate(true);
+
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String scope = elem.getAttribute("scope");
+ String agg = elem.getAttribute("aggregate");
+
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ assertEquals("scope", "composite", scope);
+ assertEquals("aggregate", "true", agg);
+ }
+
+//
+//<comp:composite name="composite.requires.3" architecture="true">
+// <subservice action="import"
+// specification="org.apache.felix.ipojo.test.composite.service.FooService"
+// optional="true" scope="composite" />
+//</comp:composite>
+ public void testOptional() {
+ ImportedService svc = new ImportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
+ .setScope(ImportedService.COMPOSITE_SCOPE)
+ .setOptional(true);
+
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String scope = elem.getAttribute("scope");
+ String opt = elem.getAttribute("optional");
+
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ assertEquals("scope", "composite", scope);
+ assertEquals("optional", "true", opt);
+ }
+//
+//<comp:composite name="composite.requires.4" architecture="true">
+// <subservice action="import"
+// specification="org.apache.felix.ipojo.test.composite.service.FooService"
+// optional="true" aggregate="true" scope="comp:composite" />
+//</comp:composite>
+ public void testOptionalAndAggregate() {
+ ImportedService svc = new ImportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
+ .setScope(ImportedService.COMPOSITE_SCOPE)
+ .setOptional(true)
+ .setAggregate(true);
+
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String scope = elem.getAttribute("scope");
+ String opt = elem.getAttribute("optional");
+ String agg = elem.getAttribute("aggregate");
+
+
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ assertEquals("scope", "composite", scope);
+ assertEquals("optional", "true", opt);
+ assertEquals("aggregate", "true", agg);
+ }
+//
+//<comp:composite name="composite.requires.5" architecture="true">
+// <subservice action="import"
+// specification="org.apache.felix.ipojo.test.composite.service.FooService"
+// filter="(&(int=2)(long=40))" scope="composite" />
+//</comp:composite>
+ public void testFilter() {
+ ImportedService svc = new ImportedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
+ .setScope(ImportedService.COMPOSITE_SCOPE)
+ .setFilter("(&(int=2)(long=40))");
+
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String scope = elem.getAttribute("scope");
+ String filter = elem.getAttribute("filter");
+
+ assertEquals("spec", "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ assertEquals("scope", "composite", scope);
+ assertEquals("filter", "(&(int=2)(long=40))", filter);
+ }
+
+}
diff --git a/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstantiatedServiceTest.java b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstantiatedServiceTest.java
new file mode 100644
index 0000000..7aed767
--- /dev/null
+++ b/ipojo/api/src/test/java/org/apache/felix/ipojo/api/composite/InstantiatedServiceTest.java
@@ -0,0 +1,170 @@
+package org.apache.felix.ipojo.api.composite;
+
+
+import junit.framework.TestCase;
+
+import org.apache.felix.ipojo.metadata.Element;
+
+public class InstantiatedServiceTest extends TestCase {
+
+// <comp:composite name="composite.bar.1" architecture="true">
+// <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService"/>
+//</comp:composite>
+
+ public void testSimple() {
+ InstantiatedService svc = new InstantiatedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.BarService");
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String action = elem.getAttribute("action");
+
+ assertEquals("spec" , "org.apache.felix.ipojo.test.composite.service.BarService", spec);
+ assertEquals("action" , "instantiate", action);
+ }
+
+ public void testBad() {
+ InstantiatedService svc = new InstantiatedService()
+ //.setSpecification("org.apache.felix.ipojo.test.composite.service.BarService") NO SPEC
+ ;
+ try {
+ svc.getElement();
+ fail("Invalid element accepted");
+ } catch (IllegalStateException e) {
+ // OK
+ }
+ }
+
+
+
+
+//
+//<comp:composite name="composite.bar.2" architecture="true">
+// <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService" aggregate="true"/>
+//</comp:composite>
+
+ public void testAggregate() {
+ InstantiatedService svc = new InstantiatedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.BarService")
+ .setAggregate(true);
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String action = elem.getAttribute("action");
+ String agg = elem.getAttribute("aggregate");
+
+
+ assertEquals("spec" , "org.apache.felix.ipojo.test.composite.service.BarService", spec);
+ assertEquals("action" , "instantiate", action);
+ assertEquals("aggregate" , "true", agg);
+
+ }
+
+//
+//<comp:composite name="composite.bar.3" architecture="true">
+// <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.BarService" optional="true"/>
+//</comp:composite>
+ public void testOptional() {
+ InstantiatedService svc = new InstantiatedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.BarService")
+ .setOptional(true);
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String action = elem.getAttribute("action");
+ String agg = elem.getAttribute("aggregate");
+ String opt = elem.getAttribute("optional");
+
+ assertEquals("spec" , "org.apache.felix.ipojo.test.composite.service.BarService", spec);
+ assertEquals("action" , "instantiate", action);
+ assertNull("aggregate" , agg);
+ assertEquals("optional" , "true", opt);
+ }
+
+//
+//<comp:composite name="composite.bar.4" architecture="true">
+// <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.FooService" aggregate="true" optional="true"/>
+//</comp:composite>
+ public void testOptionalAndAggregate() {
+ InstantiatedService svc = new InstantiatedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
+ .setOptional(true)
+ .setAggregate(true);
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String action = elem.getAttribute("action");
+ String agg = elem.getAttribute("aggregate");
+ String opt = elem.getAttribute("optional");
+
+ assertEquals("spec" , "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ assertEquals("action" , "instantiate", action);
+ assertEquals("aggregate" , "true", agg);
+ assertEquals("optional" , "true", opt);
+ }
+
+//
+//<comp:composite name="composite.bar.5-accept" architecture="true">
+// <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.FooService">
+// <property name="boolean" value="true"/>
+// <property name="string" value="foo"/>
+// <property name="strAprop" value="{foo, bar, baz}"/>
+// <property name="int" value="5"/>
+// </subservice>
+//</comp:composite>
+ public void testWithConfiguration() {
+ InstantiatedService svc = new InstantiatedService()
+ .setSpecification("org.apache.felix.ipojo.test.composite.service.FooService")
+ .addProperty("boolean", "true")
+ .addProperty("string", "foo")
+ .addProperty("stringAprop", new String[] {"foo", "bar", "baz" })
+ .addProperty("int", "5");
+ Element elem = svc.getElement();
+ String spec = elem.getAttribute("specification");
+ String action = elem.getAttribute("action");
+ String agg = elem.getAttribute("aggregate");
+ String opt = elem.getAttribute("optional");
+
+ assertEquals("spec" , "org.apache.felix.ipojo.test.composite.service.FooService", spec);
+ assertEquals("action" , "instantiate", action);
+ assertNull("aggregate" , agg);
+ assertNull("optional" , opt);
+
+ Element[] props = elem.getElements("property");
+ assertEquals("Number of properties", 4, props.length);
+ String n0 = props[0].getAttribute("name");
+ String v0 = props[0].getAttribute("value");
+ assertEquals("n0" , "boolean", n0);
+ assertEquals("v0" , "true", v0);
+
+ String n1 = props[1].getAttribute("name");
+ String v1 = props[1].getAttribute("value");
+ assertEquals("n1" , "string", n1);
+ assertEquals("v1" , "foo", v1);
+
+ String n2 = props[2].getAttribute("name");
+ String v2 = props[2].getAttribute("value");
+ String t2 = props[2].getAttribute("type");
+ Element[] sub = props[2].getElements();
+ assertEquals("Number of sub-properties", 3, sub.length);
+ assertEquals("n2", "stringAprop", n2);
+ assertNull("v2", v2);
+ assertEquals("t2", "array", t2);
+
+ String n20 = sub[0].getAttribute("name");
+ String v20 = sub[0].getAttribute("value");
+ assertNull("n20" , n20);
+ assertEquals("v20" , "foo", v20);
+ String n21 = sub[1].getAttribute("name");
+ String v21 = sub[1].getAttribute("value");
+ assertNull("n21" , n21);
+ assertEquals("v21" , "bar", v21);
+ String n22 = sub[2].getAttribute("name");
+ String v22 = sub[2].getAttribute("value");
+ assertNull("n22" , n22);
+ assertEquals("v22" , "baz", v22);
+
+ String n3 = props[3].getAttribute("name");
+ String v3 = props[3].getAttribute("value");
+ assertEquals("n3" , "int", n3);
+ assertEquals("v3" , "5", v3);
+ }
+
+
+}
diff --git a/ipojo/tests/api/pom.xml b/ipojo/tests/api/pom.xml
new file mode 100644
index 0000000..6424e52
--- /dev/null
+++ b/ipojo/tests/api/pom.xml
@@ -0,0 +1,114 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>ipojo.tests</groupId>
+ <artifactId>org.apache.felix.ipojo.tests.api</artifactId>
+ <packaging>jar</packaging>
+ <version>1.3.0-SNAPSHOT</version>
+ <name>org.apache.felix.ipojo.tests.api</name>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ <!-- <plugin>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>maven-paxexam-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>generate-paxexam-config</id>
+ <goals>
+ <goal>generate-paxexam-config</goal>
+ </goals>
+ </execution>
+ </executions>
+ <configuration>
+ <settings>
+ <platform>felix</platform>
+ </settings>
+ </configuration>
+ </plugin> -->
+ </plugins>
+ </build>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.api</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.composite</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
+ <version>1.3.0-SNAPSHOT</version>
+ </dependency>
+
+
+ <!--
+ Pax Exam API:
+ -->
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam</artifactId>
+ <version>0.4.0</version>
+ </dependency>
+ <!--
+ During runtime Pax Exam will discover the OSGi container to use by
+ searching metadata available into classpath. Pax Exam comes with a
+ default container that uses [Pax Runner] for implementing the
+ container requirements:
+ -->
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-container-default
+ </artifactId>
+ <version>0.4.0</version>
+ </dependency>
+ <!--
+ If your test code is based on JUnit you will have to have the Junit
+ support artifact:
+ -->
+ <dependency>
+ <groupId>org.ops4j.pax.exam</groupId>
+ <artifactId>pax-exam-junit</artifactId>
+ <version>0.4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.5</version>
+ <type>jar</type>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+
+ <repositories>
+ <repository>
+ <id>ops4j.releases</id>
+ <name>OPS4J Release</name>
+ <url> http://repository.ops4j.org/maven2/</url>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+</project>
diff --git a/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/AppTest.java b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/AppTest.java
new file mode 100644
index 0000000..fc6e827
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/AppTest.java
@@ -0,0 +1,38 @@
+package org.apache.felix.ipojo.tests.api;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest
+ extends TestCase
+{
+ /**
+ * Create the test case
+ *
+ * @param testName name of the test case
+ */
+ public AppTest( String testName )
+ {
+ super( testName );
+ }
+
+ /**
+ * @return the suite of tests being tested
+ */
+ public static Test suite()
+ {
+ return new TestSuite( AppTest.class );
+ }
+
+ /**
+ * Rigourous Test :-)
+ */
+ public void testApp()
+ {
+ assertTrue( true );
+ }
+}
diff --git a/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/CompositeTest.java b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/CompositeTest.java
new file mode 100644
index 0000000..e9f1aa1
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/CompositeTest.java
@@ -0,0 +1,285 @@
+package org.apache.felix.ipojo.tests.api;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertThat;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.api.Dependency;
+import org.apache.felix.ipojo.api.PrimitiveComponentType;
+import org.apache.felix.ipojo.api.Service;
+import org.apache.felix.ipojo.api.composite.CompositeComponentType;
+import org.apache.felix.ipojo.api.composite.ExportedService;
+import org.apache.felix.ipojo.api.composite.ImportedService;
+import org.apache.felix.ipojo.api.composite.Instance;
+import org.apache.felix.ipojo.api.composite.InstantiatedService;
+import org.example.service.Foo;
+import org.example.service.impl.FooImpl;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Inject;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+
+
+@RunWith( JUnit4TestRunner.class )
+public class CompositeTest {
+
+ @Inject
+ private BundleContext context;
+
+ private OSGiHelper osgi;
+
+ private IPOJOHelper ipojo;
+
+ @Before
+ public void init() {
+ osgi = new OSGiHelper(context);
+ ipojo = new IPOJOHelper(context);
+ }
+
+ @After
+ public void stop() {
+ ipojo.dispose();
+ osgi.dispose();
+ }
+
+ @Configuration
+ public static Option[] configure() {
+ Option[] opt = options(
+ provision(
+ mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo").version("1.3.0-SNAPSHOT"),
+ mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.composite").version("1.3.0-SNAPSHOT"),
+ mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.api").version("1.3.0-SNAPSHOT")
+ )
+ );
+ return opt;
+ }
+
+ @Test
+ public void createACompositeWithcontainedInstance() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ // Define the component types
+ PrimitiveComponentType prov = createAProvider();
+ PrimitiveComponentType cons = createAConsumer();
+
+ CompositeComponentType type = new CompositeComponentType()
+ .setBundleContext(context)
+ .setComponentTypeName("comp1")
+ .addInstance(new Instance(prov.getFactory().getName()))
+ .addInstance(new Instance(cons.getFactory().getName()));
+
+ ComponentInstance ci = type.createInstance();
+
+ assertThat("ci is valid", ci.getState(), is(ComponentInstance.VALID));
+
+ // Stop cons
+ cons.stop();
+ assertThat("ci is invalid", ci.getState(), is(ComponentInstance.INVALID));
+
+ // Restart cons
+ cons.start();
+ assertThat("ci is valid - 2", ci.getState(), is(ComponentInstance.VALID));
+
+ }
+
+ @Test
+ public void createACompositeWithAnInstantiatedService() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ // Define the component types
+ PrimitiveComponentType prov = createAProvider();
+ prov.start();
+ PrimitiveComponentType cons = createAConsumer();
+
+ ServiceReference[] refs = osgi.getServiceReferences(Factory.class.getName(),
+ "(component.providedServiceSpecifications=" + Foo.class.getName() +")");
+ assertThat(refs.length, is(not(0)));
+
+ Factory factory = (Factory) osgi.getServiceObject(refs[0]);
+ System.out.println(factory.getComponentDescription().getDescription());
+
+ CompositeComponentType type = new CompositeComponentType()
+ .setBundleContext(context)
+ .setComponentTypeName("comp2")
+ .addSubService(new InstantiatedService().setSpecification(Foo.class.getName()))
+ .addInstance(new Instance(cons.getFactory().getName()));
+
+ ComponentInstance ci = type.createInstance();
+
+ System.out.println(ci.getInstanceDescription().getDescription());
+
+ assertThat("ci is valid", ci.getState(), is(ComponentInstance.VALID));
+
+ // Stop prov
+ prov.stop();
+ assertThat("ci is invalid", ci.getState(), is(ComponentInstance.INVALID));
+
+ // Restart prov
+ prov.start();
+ assertThat("ci is valid - 2", ci.getState(), is(ComponentInstance.VALID));
+
+ }
+
+ @Test
+ public void createACompositeWithAnOptionalInstantiatedService() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ // Define the component types
+ PrimitiveComponentType prov = createAProvider();
+ prov.start();
+
+ CompositeComponentType type = new CompositeComponentType()
+ .setBundleContext(context)
+ .setComponentTypeName("comp3")
+ .addSubService(new InstantiatedService().setSpecification(Foo.class.getName()).setOptional(true));
+
+ ComponentInstance ci = type.createInstance();
+
+ System.out.println(ci.getInstanceDescription().getDescription());
+
+ assertThat("ci is valid", ci.getState(), is(ComponentInstance.VALID));
+
+ // Stop prov
+ prov.stop();
+ assertThat("ci is valid - 1", ci.getState(), is(ComponentInstance.VALID));
+
+ // Restart prov
+ prov.start();
+ assertThat("ci is valid - 2", ci.getState(), is(ComponentInstance.VALID));
+
+ }
+
+ @Test
+ public void createACompositeWithAnImportedService() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ // Define the component types
+ PrimitiveComponentType prov = createAProvider();
+ prov.createInstance();
+ PrimitiveComponentType cons = createAConsumer();
+
+ ServiceReference[] refs = osgi.getServiceReferences(Factory.class.getName(),
+ "(component.providedServiceSpecifications=" + Foo.class.getName() +")");
+ assertThat(refs.length, is(not(0)));
+
+ CompositeComponentType type = new CompositeComponentType()
+ .setBundleContext(context)
+ .setComponentTypeName("comp2")
+ .addSubService(new ImportedService().setSpecification(Foo.class.getName()))
+ .addInstance(new Instance(cons.getFactory().getName()));
+
+ ComponentInstance ci = type.createInstance();
+
+ System.out.println(ci.getInstanceDescription().getDescription());
+
+ assertThat("ci is valid", ci.getState(), is(ComponentInstance.VALID));
+
+ // Stop prov
+ prov.stop();
+ assertThat("ci is invalid", ci.getState(), is(ComponentInstance.INVALID));
+
+ // Restart prov
+ prov.start();
+ prov.createInstance();
+ assertThat("ci is valid - 2", ci.getState(), is(ComponentInstance.VALID));
+
+ }
+
+ @Test
+ public void createACompositeWithAnOptionalImportedService() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ // Define the component types
+ PrimitiveComponentType prov = createAProvider();
+ prov.createInstance();
+
+ CompositeComponentType type = new CompositeComponentType()
+ .setBundleContext(context)
+ .setComponentTypeName("comp3")
+ .addSubService(new ImportedService().setSpecification(Foo.class.getName()).setOptional(true));
+
+ ComponentInstance ci = type.createInstance();
+
+ System.out.println(ci.getInstanceDescription().getDescription());
+
+ assertThat("ci is valid", ci.getState(), is(ComponentInstance.VALID));
+
+ // Stop prov
+ prov.stop();
+ assertThat("ci is valid - 1", ci.getState(), is(ComponentInstance.VALID));
+
+ // Restart prov
+ prov.start();
+ prov.createInstance();
+ assertThat("ci is valid - 2", ci.getState(), is(ComponentInstance.VALID));
+
+ }
+
+ @Test
+ public void createACompositeWithExportingAService() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ // Define the component types
+ PrimitiveComponentType prov = createAProvider();
+ prov.start();
+ PrimitiveComponentType cons = createAConsumer();
+ ComponentInstance c = cons.createInstance();
+
+ CompositeComponentType type = new CompositeComponentType()
+ .setBundleContext(context)
+ .setComponentTypeName("compExport")
+ .addSubService(new InstantiatedService().setSpecification(Foo.class.getName()))
+ .addService(new ExportedService().setSpecification(Foo.class.getName()));
+
+ ComponentInstance ci = type.createInstance();
+
+ System.out.println(ci.getInstanceDescription().getDescription());
+
+ assertThat("ci is valid", ci.getState(), is(ComponentInstance.VALID));
+ assertThat("c is valid", c.getState(), is(ComponentInstance.VALID));
+
+
+ // Stop prov
+ prov.stop();
+ assertThat("ci is invalid", ci.getState(), is(ComponentInstance.INVALID));
+ assertThat("c is invalid", c.getState(), is(ComponentInstance.INVALID));
+
+
+ // Restart prov
+ prov.start();
+ assertThat("ci is valid - 2", ci.getState(), is(ComponentInstance.VALID));
+ assertThat("c is valid - 2", c.getState(), is(ComponentInstance.VALID));
+
+
+ }
+
+ private PrimitiveComponentType createAProvider() {
+ return new PrimitiveComponentType()
+ .setBundleContext(context)
+ .setClassName(FooImpl.class.getName())
+ .setPublic(true)
+ .addService(new Service()); // Provide the FooService
+ }
+
+ private PrimitiveComponentType createAConsumer() {
+ return new PrimitiveComponentType()
+ .setBundleContext(context)
+ .setClassName(org.example.service.impl.MyComponentImpl.class.getName())
+ .addDependency(new Dependency().setField("myFoo"))
+ .setValidateMethod("start");
+ }
+
+ private PrimitiveComponentType createAnOptionalConsumer() {
+ return new PrimitiveComponentType()
+ .setBundleContext(context)
+ .setClassName(org.example.service.impl.MyComponentImpl.class.getName())
+ .addDependency(new Dependency().setField("myFoo").setOptional(true))
+ .setValidateMethod("start");
+ }
+
+
+
+}
diff --git a/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/IPOJOHelper.java b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/IPOJOHelper.java
new file mode 100644
index 0000000..8943cbe
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/IPOJOHelper.java
@@ -0,0 +1,730 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.felix.ipojo.tests.api;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.Handler;
+import org.apache.felix.ipojo.HandlerFactory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+/**
+ * iPOJO Helper.
+ * This helper helps getting {@link Factory}, and managing
+ * {@link ComponentInstance}.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class IPOJOHelper {
+
+ /**
+ * The bundle context.
+ */
+ private BundleContext m_context;
+
+
+ /**
+ * List of instances.
+ */
+ private List<ComponentInstance> m_instances;
+
+ /**
+ * Creates a IPOJOHelper.
+ * @param tc the OSGi Test Case
+ */
+ public IPOJOHelper(BundleContext context) {
+ m_context = context;
+ m_instances = new ArrayList<ComponentInstance>();
+ }
+
+ /**
+ * Disposes created instances.
+ * @see org.apache.felix.ipojo.junit4osgi.Helper#dispose()
+ */
+ public void dispose() {
+ for (int i = 0; i < m_instances.size(); i++) {
+ ((ComponentInstance) m_instances.get(i)).dispose();
+ }
+ m_instances.clear();
+ }
+
+ /**
+ * Gets a created instance from the instance name.
+ * @param name the instance name.
+ * @return the created {@link ComponentInstance} or <code>null</code>
+ * if the instance was not created during the session.
+ */
+ public ComponentInstance getInstanceByName(String name) {
+ for (int i = 0; i < m_instances.size(); i++) {
+ if (((ComponentInstance) m_instances.get(i)).getInstanceName()
+ .equals(name)) {
+ return (ComponentInstance) m_instances.get(i);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Creates a new component instance with the given name (and empty
+ * configuration), from the factory specified in the given bundle.
+ *
+ * @param bundle the bundle from which the component factory is defined.
+ * @param factoryName the name of the component factory, defined in the
+ * specified bundle.
+ * @param instanceName the name of the component instance to create.
+ * @return the newly created component instance.
+ */
+ public static ComponentInstance createComponentInstance(Bundle bundle,
+ String factoryName, String instanceName) {
+
+ // Create the instance configuration
+ Properties configuration = new Properties();
+ configuration.put("instance.name", instanceName);
+
+ return createComponentInstance(bundle, factoryName, configuration);
+ }
+
+ /**
+ * Creates a new component instance with the given configuration, from the
+ * factory specified in the given bundle.
+ *
+ * @param bundle the bundle from which the component factory is defined.
+ * @param factoryName the name of the component factory, defined in the
+ * specified bundle.
+ * @param configuration the configuration of the component instance to
+ * create.
+ * @return the newly created component instance.
+ */
+ public static ComponentInstance createComponentInstance(Bundle bundle,
+ String factoryName, Dictionary configuration) {
+
+ // Retrieve the component factory.
+ Factory fact = getFactory(bundle, factoryName);
+
+ if (fact == null) {
+ // Factory not found...
+ throw new IllegalArgumentException(
+ "Cannot find the component factory (" + factoryName
+ + ") in the specified bundle ("
+ + bundle.getSymbolicName() + ").");
+ }
+
+ try {
+ return fact.createComponentInstance(configuration);
+ } catch (Exception e) {
+ throw new IllegalArgumentException(
+ "Cannot create the component instance with the given configuration:"
+ + e.getMessage());
+ }
+ }
+
+ /**
+ * Creates a new component instance with the given name and configuration,
+ * from the factory specified in the given bundle.
+ *
+ * @param bundle the bundle from which the component factory is defined.
+ * @param factoryName the name of the component factory, defined in the
+ * specified bundle.
+ * @param instanceName the name of the component instance to create.
+ * @param configuration the configuration of the instance to create.
+ * @return the newly created component instance.
+ */
+ public static ComponentInstance createComponentInstance(Bundle bundle,
+ String factoryName, String instanceName, Dictionary configuration) {
+
+ // Add the instance name to the configuration
+ configuration.put("instance.name", instanceName);
+
+ return createComponentInstance(bundle, factoryName, configuration);
+ }
+
+ /**
+ * Creates a new component instance with the given name (and an empty
+ * configuration), from the factory specified in the given service context.
+ *
+ * @param serviceContext the service context in which the component factory
+ * service is registered.
+ * @param factoryName the name of the component factory, defined in the
+ * specified service context.
+ * @param instanceName the name of the component instance to create.
+ * @return the newly created component instance.
+ */
+ public static ComponentInstance createComponentInstance(
+ ServiceContext serviceContext, String factoryName,
+ String instanceName) {
+
+ // Create the instance configuration
+ Properties configuration = new Properties();
+ configuration.put("instance.name", instanceName);
+
+ return createComponentInstance(serviceContext, factoryName,
+ configuration);
+ }
+
+ /**
+ * Creates a new component instance with the given name and configuration,
+ * from the factory specified in the given service context.
+ *
+ * @param serviceContext the service context in which the component factory
+ * service is registered.
+ * @param factoryName the name of the component factory, defined in the
+ * specified service context.
+ * @param configuration the configuration of the instance to create.
+ * @return the newly created component instance.
+ */
+ public static ComponentInstance createComponentInstance(
+ ServiceContext serviceContext, String factoryName,
+ Dictionary configuration) {
+
+ // Retrieve the component factory.
+ Factory fact = getFactory(serviceContext, factoryName);
+
+ if (fact == null) {
+ // Factory not found...
+ throw new IllegalArgumentException(
+ "Cannot find the component factory (" + factoryName
+ + ") in the specified service context.");
+ }
+
+ try {
+ return fact.createComponentInstance(configuration);
+ } catch (Exception e) {
+ throw new IllegalArgumentException(
+ "Cannot create the component instance with the given configuration: "
+ + e.getMessage());
+ }
+ }
+
+ /**
+ * Creates a new component instance with the given name and configuration,
+ * from the factory specified in the given service context.
+ *
+ * @param serviceContext the service context in which the component factory
+ * service is registered.
+ * @param factoryName the name of the component factory, defined in the
+ * specified service context.
+ * @param instanceName the name of the component instance to create.
+ * @param configuration the configuration of the instance to create.
+ * @return the newly created component instance.
+ */
+ public static ComponentInstance createComponentInstance(
+ ServiceContext serviceContext, String factoryName,
+ String instanceName, Dictionary configuration) {
+
+ // Add the instance name to the configuration
+ configuration.put("instance.name", instanceName);
+
+ return createComponentInstance(serviceContext, factoryName,
+ configuration);
+ }
+
+ /**
+ * Creates a new component instance with the given name (and empty
+ * configuration), from the factory specified in the local bundle.
+ *
+ * @param factoryName the name of the component factory, defined in the
+ * local bundle.
+ * @param instanceName the name of the component instance to create.
+ * @return the newly created component instance.
+ */
+ public ComponentInstance createComponentInstance(String factoryName,
+ String instanceName) {
+ ComponentInstance ci = createComponentInstance(m_context.getBundle(),
+ factoryName, instanceName);
+ m_instances.add(ci);
+ return ci;
+ }
+
+ /**
+ * Creates a new component instance with the given configuration, from the
+ * factory specified in the local bundle.
+ *
+ * @param factoryName the name of the component factory, in the local
+ * bundle.
+ * @param configuration the configuration of the component instance to
+ * create.
+ * @return the newly created component instance.
+ */
+ public ComponentInstance createComponentInstance(String factoryName,
+ Dictionary configuration) {
+ ComponentInstance ci = createComponentInstance(m_context.getBundle(),
+ factoryName, configuration);
+ m_instances.add(ci);
+ return ci;
+ }
+
+ /**
+ * Creates a new component instance with no configuration, from the factory
+ * specified in the local bundle.
+ *
+ * @param factoryName the name of the component factory, in the local
+ * bundle.
+ * @return the newly created component instance.
+ */
+ public ComponentInstance createComponentInstance(String factoryName) {
+ ComponentInstance ci = createComponentInstance(m_context.getBundle(),
+ factoryName, (Dictionary) null);
+ m_instances.add(ci);
+ return ci;
+ }
+
+ /**
+ * Creates a new component instance with the given name and configuration,
+ * from the factory specified in the given bundle.
+ *
+ * @param factoryName the name of the component factory, defined in the
+ * specified bundle.
+ * @param instanceName the name of the component instance to create.
+ * @param configuration the configuration of the instance to create.
+ * @return the newly created component instance.
+ */
+ public ComponentInstance createComponentInstance(String factoryName,
+ String instanceName, Dictionary configuration) {
+ ComponentInstance ci = createComponentInstance(m_context.getBundle(),
+ factoryName, instanceName, configuration);
+ m_instances.add(ci);
+ return ci;
+ }
+
+ /**
+ * Returns the component factory with the given name in the local bundle.
+ *
+ * @param factoryName the name of the factory to retrieve.
+ * @return the component factory with the given name in the local bundle, or
+ * {@code null} if not found.
+ */
+ public Factory getFactory(String factoryName) {
+ return getFactory(m_context.getBundle(), factoryName);
+ }
+
+ /**
+ * Returns the handler factory with the given name in the local bundle.
+ *
+ * @param factoryName the name of the handler factory to retrieve.
+ * @return the handler factory with the given name in the local bundle, or
+ * {@code null} if not found.
+ */
+ public HandlerFactory getHandlerFactory(String factoryName) {
+ return getHandlerFactory(m_context.getBundle(), factoryName);
+ }
+
+ /**
+ * Returns the metadata description of the component defined in this bundle.
+ *
+ * @param component the name of the locally defined component.
+ * @return the metadata description of the component with the given name,
+ * defined in this given bundle, or {@code null} if not found.
+ */
+ public Element getMetadata(String component) {
+ return getMetadata(m_context.getBundle(), component);
+ }
+
+ /**
+ * Returns the component factory with the given name in the given bundle.
+ *
+ * @param bundle the bundle from which the component factory is defined.
+ * @param factoryName the name of the defined factory.
+ * @return the component factory with the given name in the given bundle, or
+ * {@code null} if not found.
+ */
+ public static Factory getFactory(Bundle bundle, String factoryName) {
+ ServiceReference[] refs;
+ try {
+ // Retrieves the component factories services in the bundle.
+ refs = bundle.getBundleContext().getServiceReferences(
+ Factory.class.getName(),
+ "(factory.name=" + factoryName + ")");
+ if (refs != null) {
+ return (Factory) bundle.getBundleContext().getService(refs[0]);
+ }
+
+ // Factory not found...
+ return null;
+
+ } catch (InvalidSyntaxException e) {
+ throw new IllegalArgumentException(
+ "Cannot get the component factory services: "
+ + e.getMessage());
+ }
+ }
+
+ /**
+ * Returns the component factory with the given name, registered in the
+ * given service context.
+ *
+ * @param serviceContext the service context in which the factory service is
+ * defined.
+ * @param factoryName the name of the factory.
+ * @return the component factory with the given name, registered in the
+ * given service context.
+ */
+ public static Factory getFactory(ServiceContext serviceContext,
+ String factoryName) {
+ ServiceReference[] refs;
+ try {
+ // Retrieves the component factories services in the service
+ // context.
+ refs = serviceContext.getServiceReferences(Factory.class.getName(),
+ "(factory.name=" + factoryName + ")");
+ if (refs != null) {
+ return (Factory) serviceContext.getService(refs[0]);
+ }
+ return null;
+
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Cannot get the factory " + factoryName + " : "
+ + e.getMessage());
+ return null;
+ }
+ }
+
+ /**
+ * Returns the handler factory with the given name in the given bundle.
+ *
+ * @param bundle the bundle from which the handler factory is defined.
+ * @param factoryName the name of the handler factory to retrieve.
+ * @return the handler factory with the given name in the given bundle, or
+ * {@code null} if not found.
+ */
+ public static HandlerFactory getHandlerFactory(Bundle bundle,
+ String factoryName) {
+ ServiceReference[] refs;
+ try {
+ // Retrieves the handler factories services in the bundle.
+ refs = bundle.getBundleContext().getServiceReferences(
+ HandlerFactory.class.getName(),
+ "(" + Handler.HANDLER_NAME_PROPERTY + "=" + factoryName
+ + ")");
+ if (refs != null) {
+ return (HandlerFactory) bundle.getBundleContext().getService(
+ refs[0]);
+ }
+
+ // Factory not found...
+ return null;
+ } catch (InvalidSyntaxException e) {
+ throw new IllegalArgumentException(
+ "Cannot get the handler factory services: "
+ + e.getMessage());
+ }
+ }
+
+ /**
+ * Returns the metadata description of the component with the given name,
+ * defined in the given bundle.
+ *
+ * @param bundle the bundle from which the component is defined.
+ * @param component the name of the defined component.
+ * @return the metadata description of the component with the given name,
+ * defined in the given bundle, or {@code null} if not found.
+ */
+ public static Element getMetadata(Bundle bundle, String component) {
+
+ // Retrieves the component description from the bundle's manifest.
+ String elem = (String) bundle.getHeaders().get("iPOJO-Components");
+ if (elem == null) {
+ throw new IllegalArgumentException(
+ "Cannot find iPOJO-Components descriptor in the specified bundle ("
+ + bundle.getSymbolicName()
+ + "). Not an iPOJO bundle.");
+ }
+
+ // Parses the retrieved description and find the component with the
+ // given name.
+ try {
+ Element element = ManifestMetadataParser.parseHeaderMetadata(elem);
+ Element[] childs = element.getElements("component");
+ for (int i = 0; i < childs.length; i++) {
+ String name = childs[i].getAttribute("name");
+ String clazz = childs[i].getAttribute("classname");
+ if (name != null && name.equalsIgnoreCase(component)) {
+ return childs[i];
+ }
+ if (clazz.equalsIgnoreCase(component)) {
+ return childs[i];
+ }
+ }
+
+ // Component not found...
+ return null;
+
+ } catch (ParseException e) {
+ throw new IllegalStateException(
+ "Cannot parse the components from specified bundle ("
+ + bundle.getSymbolicName() + "): " + e.getMessage());
+ }
+ }
+
+ /**
+ * Returns the service object of a service registered in the specified
+ * service context, offering the specified interface and matching the given
+ * filter.
+ *
+ * @param serviceContext the service context in which the service is
+ * searched.
+ * @param itf the interface provided by the searched service.
+ * @param filter an additional filter (can be {@code null}).
+ * @return the service object provided by the specified bundle, offering the
+ * specified interface and matching the given filter.
+ */
+ public static Object getServiceObject(ServiceContext serviceContext,
+ String itf, String filter) {
+ ServiceReference ref = getServiceReference(serviceContext, itf, filter);
+ if (ref != null) {
+ return serviceContext.getService(ref);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Returns the service objects of the services registered in the specified
+ * service context, offering the specified interface and matching the given
+ * filter.
+ *
+ * @param serviceContext the service context in which services are searched.
+ * @param itf the interface provided by the searched services.
+ * @param filter an additional filter (can be {@code null}).
+ * @return the service objects provided by the specified bundle, offering
+ * the specified interface and matching the given filter.
+ */
+ public static Object[] getServiceObjects(ServiceContext serviceContext,
+ String itf, String filter) {
+ ServiceReference[] refs = getServiceReferences(serviceContext, itf,
+ filter);
+ if (refs != null) {
+ Object[] list = new Object[refs.length];
+ for (int i = 0; i < refs.length; i++) {
+ list[i] = serviceContext.getService(refs[i]);
+ }
+ return list;
+ } else {
+ return new Object[0];
+ }
+ }
+
+ /**
+ * Returns the service reference of a service registered in the specified
+ * service context, offering the specified interface and matching the given
+ * filter.
+ *
+ * @param serviceContext the service context in which services are searched.
+ * @param itf the interface provided by the searched service.
+ * @param filter an additional filter (can be {@code null}).
+ * @return a service reference registered in the specified service context,
+ * offering the specified interface and matching the given filter.
+ * If no service is found, {@code null} is returned.
+ */
+ public static ServiceReference getServiceReference(
+ ServiceContext serviceContext, String itf, String filter) {
+ ServiceReference[] refs = getServiceReferences(serviceContext, itf,
+ filter);
+ if (refs.length != 0) {
+ return refs[0];
+ } else {
+ // No service found
+ return null;
+ }
+ }
+
+ /**
+ * Returns the service reference of the service registered in the specified
+ * service context, offering the specified interface and having the given
+ * persistent ID.
+ *
+ * @param serviceContext the service context in which services are searched.
+ * @param itf the interface provided by the searched service.
+ * @param pid the persistent ID of the searched service.
+ * @return a service registered in the specified service context, offering
+ * the specified interface and having the given persistent ID.
+ */
+ public static ServiceReference getServiceReferenceByPID(
+ ServiceContext serviceContext, String itf, String pid) {
+ String filter = "(" + "service.pid" + "=" + pid + ")";
+ ServiceReference[] refs = getServiceReferences(serviceContext, itf,
+ filter);
+ if (refs == null) {
+ return null;
+ } else if (refs.length == 1) {
+ return refs[0];
+ } else {
+ throw new IllegalStateException(
+ "A service lookup by PID returned several providers ("
+ + refs.length + ")" + " for " + itf + " with pid="
+ + pid);
+ }
+ }
+
+ /**
+ * Returns the service reference of all the services registered in the
+ * specified service context, offering the specified interface and matching
+ * the given filter.
+ *
+ * @param serviceContext the service context in which services are searched.
+ * @param itf the interface provided by the searched services.
+ * @param filter an additional filter (can be {@code null}).
+ * @return all the service references registered in the specified service
+ * context, offering the specified interface and matching the given
+ * filter. If no service matches, an empty array is returned.
+ */
+ public static ServiceReference[] getServiceReferences(
+ ServiceContext serviceContext, String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ // Get all the service references
+ refs = serviceContext.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ throw new IllegalArgumentException(
+ "Cannot get service references: " + e.getMessage());
+ }
+ if (refs == null) {
+ return new ServiceReference[0];
+ } else {
+ return refs;
+ }
+ }
+
+ /**
+ * Returns the service reference of a service registered in the specified
+ * service context, offering the specified interface and having the given
+ * name.
+ *
+ * @param serviceContext the service context in which services are searched.
+ * @param itf the interface provided by the searched service.
+ * @param name the name of the searched service.
+ * @return a service registered in the specified service context, offering
+ * the specified interface and having the given name.
+ */
+ public static ServiceReference getServiceReferenceByName(
+ ServiceContext serviceContext, String itf, String name) {
+ String filter = null;
+ if (itf.equals(Factory.class.getName())
+ || itf.equals(ManagedServiceFactory.class.getName())) {
+ filter = "(" + "factory.name" + "=" + name + ")";
+ } else if (itf.equals(Architecture.class.getName())) {
+ filter = "(" + "architecture.instance" + "=" + name + ")";
+ } else {
+ filter = "(" + "instance.name" + "=" + name + ")";
+ }
+ return getServiceReference(serviceContext, itf, filter);
+ }
+
+ /**
+ * Checks the availability of a service inside the given service context.
+ * @param sc the service context
+ * @param itf the service interface to found
+ * @return <code>true</code> if the service is available in the service
+ * context, <code>false</code> otherwise.
+ */
+ public static boolean isServiceAvailable(ServiceContext sc, String itf) {
+ ServiceReference ref = getServiceReference(sc, itf, null);
+ return ref != null;
+ }
+
+ /**
+ * Checks the availability of a service inside the given service context.
+ * @param sc the service context
+ * @param itf the service interface to found
+ * @param name the service provider name
+ * @return <code>true</code> if the service is available in the service
+ * context, <code>false</code> otherwise.
+ */
+ public static boolean isServiceAvailableByName(ServiceContext sc,
+ String itf, String name) {
+ ServiceReference ref = getServiceReferenceByName(sc, itf, name);
+ return ref != null;
+ }
+
+ /**
+ * Checks the availability of a service inside the given service context.
+ * @param sc the service context
+ * @param itf the service interface to found
+ * @param pid the pid of the service
+ * @return <code>true</code> if the service is available in the service
+ * context, <code>false</code> otherwise.
+ */
+ public static boolean isServiceAvailableByPID(ServiceContext sc,
+ String itf, String pid) {
+ ServiceReference ref = getServiceReferenceByPID(sc, itf, pid);
+ return ref != null;
+ }
+
+ /**
+ * Returns the service reference of a service provided by the specified
+ * bundle, offering the specified interface and having the given name.
+ *
+ * @param bundle the bundle from which the service is searched.
+ * @param itf the interface provided by the searched service.
+ * @param name the name of the searched service.
+ * @return a service provided by the specified bundle, offering the
+ * specified interface and having the given name.
+ */
+ public static ServiceReference getServiceReferenceByName(Bundle bundle,
+ String itf, String name) {
+ String filter = null;
+ if (itf.equals(Factory.class.getName())
+ || itf.equals(ManagedServiceFactory.class.getName())) {
+ filter = "(" + "factory.name" + "=" + name + ")";
+ } else if (itf.equals(Architecture.class.getName())) {
+ filter = "(" + "architecture.instance" + "=" + name + ")";
+ } else {
+ filter = "(" + "instance.name" + "=" + name + ")";
+ }
+ return OSGiHelper.getServiceReference(bundle, itf, filter);
+ }
+
+ /**
+ * Returns the service reference of a service provided by the local bundle,
+ * offering the specified interface and having the given name.
+ *
+ * @param itf the interface provided by the searched service.
+ * @param name the name of the searched service.
+ * @return a service provided by the specified bundle, offering the
+ * specified interface and having the given name.
+ */
+ public ServiceReference getServiceReferenceByName(String itf, String name) {
+ return getServiceReferenceByName(m_context.getBundle(), itf, name);
+ }
+
+ /**
+ * Checks if the service is available.
+ * @param itf the service interface
+ * @param name the service provider name
+ * @return <code>true</code> if the service is available, <code>false</code>
+ * otherwise.
+ */
+ public boolean isServiceAvailableByName(String itf, String name) {
+ ServiceReference ref = getServiceReferenceByName(itf, name);
+ return ref != null;
+ }
+
+}
diff --git a/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/OSGiHelper.java b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/OSGiHelper.java
new file mode 100644
index 0000000..7d6e9ad
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/OSGiHelper.java
@@ -0,0 +1,456 @@
+package org.apache.felix.ipojo.tests.api;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.packageadmin.PackageAdmin;
+
+import static org.junit.Assert.fail;
+
+
+public class OSGiHelper {
+
+ /**
+ * The bundle context.
+ */
+ private BundleContext context;
+
+ /**
+ * List of get references.
+ */
+ private List<ServiceReference> m_references = new ArrayList<ServiceReference>();
+
+ public OSGiHelper(BundleContext context) {
+ this.context = context;
+ }
+
+ public void dispose() {
+ // Unget services
+ for (int i = 0; i < m_references.size(); i++) {
+ context.ungetService((ServiceReference) m_references.get(i));
+ }
+ m_references.clear();
+ }
+
+ /**
+ * Gets the Bundle Context.
+ * @return the bundle context.
+ */
+ public BundleContext getContext() {
+ return context;
+ }
+
+ /**
+ * Returns the service object of a service provided by the specified bundle,
+ * offering the specified interface and matching the given filter.
+ *
+ * @param bundle the bundle from which the service is searched.
+ * @param itf the interface provided by the searched service.
+ * @param filter an additional filter (can be {@code null}).
+ * @return the service object provided by the specified bundle, offering the
+ * specified interface and matching the given filter.
+ */
+ public static Object getServiceObject(Bundle bundle, String itf,
+ String filter) {
+ ServiceReference ref = getServiceReference(bundle, itf, filter);
+ if (ref != null) {
+ return bundle.getBundleContext().getService(ref);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Returns the service objects of the services provided by the specified
+ * bundle, offering the specified interface and matching the given filter.
+ *
+ * @param bundle the bundle from which services are searched.
+ * @param itf the interface provided by the searched services.
+ * @param filter an additional filter (can be {@code null}).
+ * @return the service objects provided by the specified bundle, offering
+ * the specified interface and matching the given filter.
+ */
+ public static Object[] getServiceObjects(Bundle bundle, String itf,
+ String filter) {
+ ServiceReference[] refs = getServiceReferences(bundle, itf, filter);
+ if (refs != null) {
+ Object[] list = new Object[refs.length];
+ for (int i = 0; i < refs.length; i++) {
+ list[i] = bundle.getBundleContext().getService(refs[i]);
+ }
+ return list;
+ } else {
+ return new Object[0];
+ }
+ }
+
+ /**
+ * Returns the service reference of a service provided by the specified
+ * bundle, offering the specified interface and matching the given filter.
+ *
+ * @param bundle the bundle from which the service is searched.
+ * @param itf the interface provided by the searched service.
+ * @param filter an additional filter (can be {@code null}).
+ * @return a service reference provided by the specified bundle, offering
+ * the specified interface and matching the given filter. If no
+ * service is found, {@code null} is returned.
+ */
+ public static ServiceReference getServiceReference(Bundle bundle,
+ String itf, String filter) {
+ ServiceReference[] refs = getServiceReferences(bundle, itf, filter);
+ if (refs.length != 0) {
+ return refs[0];
+ } else {
+ // No service found
+ return null;
+ }
+ }
+
+ /**
+ * Checks if the service is available.
+ * @param itf the service interface
+ * @return <code>true</code> if the service is available, <code>false</code>
+ * otherwise.
+ */
+ public boolean isServiceAvailable(String itf) {
+ ServiceReference ref = getServiceReference(itf, null);
+ return ref != null;
+ }
+
+ /**
+ * Checks if the service is available.
+ * @param itf the service interface
+ * @param pid the service pid
+ * @return <code>true</code> if the service is available, <code>false</code>
+ * otherwise.
+ */
+ public boolean isServiceAvailableByPID(String itf, String pid) {
+ ServiceReference ref = getServiceReferenceByPID(itf, pid);
+ return ref != null;
+ }
+
+ /**
+ * Returns the service reference of the service provided by the specified
+ * bundle, offering the specified interface and having the given persistent
+ * ID.
+ *
+ * @param bundle the bundle from which the service is searched.
+ * @param itf the interface provided by the searched service.
+ * @param pid the persistent ID of the searched service.
+ * @return a service provided by the specified bundle, offering the
+ * specified interface and having the given persistent ID.
+ */
+ public static ServiceReference getServiceReferenceByPID(Bundle bundle,
+ String itf, String pid) {
+ String filter = "(" + "service.pid" + "=" + pid + ")";
+ ServiceReference[] refs = getServiceReferences(bundle, itf, filter);
+ if (refs == null) {
+ return null;
+ } else if (refs.length == 1) {
+ return refs[0];
+ } else {
+ throw new IllegalStateException(
+ "A service lookup by PID returned several providers ("
+ + refs.length + ")" + " for " + itf + " with pid="
+ + pid);
+ }
+ }
+
+ /**
+ * Returns the service reference of all the services provided in the
+ * specified bundle, offering the specified interface and matching the given
+ * filter.
+ *
+ * @param bundle the bundle from which services are searched.
+ * @param itf the interface provided by the searched services.
+ * @param filter an additional filter (can be {@code null}).
+ * @return all the service references provided in the specified bundle,
+ * offering the specified interface and matching the given filter.
+ * If no service matches, an empty array is returned.
+ */
+ public static ServiceReference[] getServiceReferences(Bundle bundle,
+ String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ // Get all the service references
+ refs = bundle.getBundleContext().getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ throw new IllegalArgumentException(
+ "Cannot get service references: " + e.getMessage());
+ }
+ if (refs == null) {
+ return new ServiceReference[0];
+ } else {
+ return refs;
+ }
+ }
+
+ /**
+ * Returns the service object of a service provided by the local bundle,
+ * offering the specified interface and matching the given filter.
+ *
+ * @param itf the interface provided by the searched service.
+ * @param filter an additional filter (can be {@code null}).
+ * @return the service object provided by the local bundle, offering the
+ * specified interface and matching the given filter.
+ */
+ public Object getServiceObject(String itf, String filter) {
+ ServiceReference ref = getServiceReference(itf, filter);
+ if (ref != null) {
+ m_references.add(ref);
+ return context.getService(ref);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Returns the service object associated with this service reference.
+ *
+ * @param ref service reference
+ * @return the service object.
+ */
+ public Object getServiceObject(ServiceReference ref) {
+ if (ref != null) {
+ m_references.add(ref);
+ return context.getService(ref);
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Returns the service objects of the services provided by the local bundle,
+ * offering the specified interface and matching the given filter.
+ *
+ * @param itf the interface provided by the searched services.
+ * @param filter an additional filter (can be {@code null}).
+ * @return the service objects provided by the local bundle, offering the
+ * specified interface and matching the given filter.
+ */
+ public Object[] getServiceObjects(String itf, String filter) {
+ ServiceReference[] refs = getServiceReferences(itf, filter);
+ if (refs != null) {
+ Object[] list = new Object[refs.length];
+ for (int i = 0; i < refs.length; i++) {
+ m_references.add(refs[i]);
+ list[i] = context.getService(refs[i]);
+ }
+ return list;
+ } else {
+ return new Object[0];
+ }
+ }
+
+ /**
+ * Returns the service reference of a service provided by the local bundle,
+ * offering the specified interface and matching the given filter.
+ *
+ * @param itf the interface provided by the searched service.
+ * @param filter an additional filter (can be {@code null}).
+ * @return a service reference provided by the local bundle, offering the
+ * specified interface and matching the given filter. If no service
+ * is found, {@code null} is returned.
+ */
+ public ServiceReference getServiceReference(String itf, String filter) {
+ return getServiceReference(context.getBundle(), itf, filter);
+ }
+
+ /**
+ * Returns the service reference of a service provided offering the
+ * specified interface.
+ *
+ * @param itf the interface provided by the searched service.
+ * @return a service reference provided by the local bundle, offering the
+ * specified interface and matching the given filter. If no service
+ * is found, {@code null} is returned.
+ */
+ public ServiceReference getServiceReference(String itf) {
+ return getServiceReference(context.getBundle(), itf, null);
+ }
+
+ /**
+ * Returns the service reference of the service provided by the local
+ * bundle, offering the specified interface and having the given persistent
+ * ID.
+ *
+ * @param itf the interface provided by the searched service.
+ * @param pid the persistent ID of the searched service.
+ * @return a service provided by the local bundle, offering the specified
+ * interface and having the given persistent ID.
+ */
+ public ServiceReference getServiceReferenceByPID(String itf, String pid) {
+ return getServiceReferenceByPID(context.getBundle(), itf, pid);
+ }
+
+ /**
+ * Returns the service reference of all the services provided in the local
+ * bundle, offering the specified interface and matching the given filter.
+ *
+ * @param itf the interface provided by the searched services.
+ * @param filter an additional filter (can be {@code null}).
+ * @return all the service references provided in the local bundle, offering
+ * the specified interface and matching the given filter. If no
+ * service matches, an empty array is returned.
+ */
+ public ServiceReference[] getServiceReferences(String itf, String filter) {
+ return getServiceReferences(context.getBundle(), itf, filter);
+ }
+
+ /**
+ * Gets the package admin exposed by the framework.
+ * Fails if the package admin is not available.
+ * @return the package admin service.
+ */
+ public PackageAdmin getPackageAdmin() {
+ PackageAdmin pa = (PackageAdmin) getServiceObject(PackageAdmin.class.getName(), null);
+ if (pa == null) {
+ fail("No package admin available");
+ }
+ return pa;
+ }
+
+ /**
+ * Refresh the packages.
+ * Fails if the package admin service is not available.
+ */
+ public void refresh() {
+ getPackageAdmin().refreshPackages(null);
+ }
+
+ /**
+ * Waits for a service. Fails on timeout.
+ * If timeout is set to 0, it sets the timeout to 10s.
+ * @param itf the service interface
+ * @param filter the filter
+ * @param timeout the timeout
+ */
+ public void waitForService(String itf, String filter, long timeout) {
+ if (timeout == 0) {
+ timeout = 10000; // Default 10 secondes.
+ }
+ ServiceReference[] refs = getServiceReferences(itf, filter);
+ long begin = System.currentTimeMillis();
+ if (refs.length != 0) {
+ return;
+ } else {
+ while(refs.length == 0) {
+ try {
+ Thread.sleep(5);
+ } catch (InterruptedException e) {
+ // Interrupted
+ }
+ long now = System.currentTimeMillis();
+
+ if ((now - begin) > timeout) {
+ fail("Timeout ... no services matching with the request after " + timeout + "ms");
+ }
+ refs = getServiceReferences(itf, filter);
+ }
+ }
+ }
+
+
+ /**
+ * Installs a bundle.
+ * Fails if the bundle cannot be installed.
+ * Be aware that you have to uninstall the bundle yourself.
+ * @param url bundle url
+ * @return the installed bundle
+ */
+ public Bundle installBundle(String url) {
+ try {
+ return context.installBundle(url);
+ } catch (BundleException e) {
+ fail("Cannot install the bundle " + url + " : " + e.getMessage());
+ }
+ return null; // Can not happen
+ }
+
+ /**
+ * Installs a bundle.
+ * Fails if the bundle cannot be installed.
+ * Be aware that you have to uninstall the bundle yourself.
+ * @param url bundle url
+ * @param stream input stream containing the bundle
+ * @return the installed bundle
+ */
+ public Bundle installBundle(String url, InputStream stream) {
+ try {
+ return context.installBundle(url, stream);
+ } catch (BundleException e) {
+ fail("Cannot install the bundle " + url + " : " + e.getMessage());
+ }
+ return null; // Can not happen
+ }
+
+ /**
+ * Installs and starts a bundle.
+ * Fails if the bundle cannot be installed or an error occurs
+ * during startup. Be aware that you have to uninstall the bundle
+ * yourself.
+ * @param url the bundle url
+ * @return the Bundle object.
+ */
+ public Bundle installAndStart(String url) {
+ Bundle bundle = installBundle(url);
+ try {
+ bundle.start();
+ } catch (BundleException e) {
+ fail("Cannot start the bundle " + url + " : " + e.getMessage());
+ }
+ return bundle;
+ }
+
+ /**
+ * Installs and starts a bundle.
+ * Fails if the bundle cannot be installed or an error occurs
+ * during startup. Be aware that you have to uninstall the bundle
+ * yourself.
+ * @param url the bundle url
+ * @param stream input stream containing the bundle
+ * @return the Bundle object.
+ */
+ public Bundle installAndStart(String url, InputStream stream) {
+ Bundle bundle = installBundle(url, stream);
+ try {
+ bundle.start();
+ } catch (BundleException e) {
+ fail("Cannot start the bundle " + url + " : " + e.getMessage());
+ }
+ return bundle;
+ }
+
+ /**
+ * Get the bundle by its id.
+ * @param bundleId the bundle id.
+ * @return the bundle with the given id.
+ */
+ public Bundle getBundle(long bundleId) {
+ return context.getBundle(bundleId);
+ }
+
+ /**
+ * Gets a bundle by its symbolic name.
+ * Fails if no bundle matches.
+ * @param name the symbolic name of the bundle
+ * @return the bundle object.
+ */
+ public Bundle getBundle(String name) {
+ Bundle[] bundles = context.getBundles();
+ for (int i = 0; i < bundles.length; i++) {
+ if (name.equals(bundles[i].getSymbolicName())) {
+ return bundles[i];
+ }
+ }
+ fail("No bundles with the given symbolic name " + name);
+ return null; // should not happen
+ }
+
+}
diff --git a/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/PrimitiveComponentTest.java b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/PrimitiveComponentTest.java
new file mode 100644
index 0000000..66b9789
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/PrimitiveComponentTest.java
@@ -0,0 +1,176 @@
+package org.apache.felix.ipojo.tests.api;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
+
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.api.Dependency;
+import org.apache.felix.ipojo.api.PrimitiveComponentType;
+import org.apache.felix.ipojo.api.Service;
+import org.apache.felix.ipojo.api.SingletonComponentType;
+import org.example.service.Foo;
+import org.example.service.impl.FooImpl;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Inject;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+
+
+@RunWith( JUnit4TestRunner.class )
+public class PrimitiveComponentTest {
+
+ @Inject
+ private BundleContext context;
+
+ private OSGiHelper osgi;
+
+ private IPOJOHelper ipojo;
+
+ @Before
+ public void init() {
+ osgi = new OSGiHelper(context);
+ ipojo = new IPOJOHelper(context);
+ }
+
+ @After
+ public void stop() {
+ ipojo.dispose();
+ osgi.dispose();
+ }
+
+ @Configuration
+ public static Option[] configure() {
+ Option[] opt = options(
+ provision(
+ mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo").version("1.3.0-SNAPSHOT"),
+ mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.api").version("1.3.0-SNAPSHOT")
+ )
+ );
+ return opt;
+ }
+
+ @Test
+ public void createAServiceProvider()
+ {
+ assertThat( context, is( notNullValue() ) );
+ ComponentInstance ci = null;
+
+ try {
+ PrimitiveComponentType type = createAProvider();
+ ci = type.createInstance();
+ assertThat("Ci is valid", ci.getState(), is(ComponentInstance.VALID));
+ ServiceReference ref = ipojo.getServiceReferenceByName(Foo.class.getName(), ci.getInstanceName());
+ assertThat( ref, is( notNullValue() ) );
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void killTheFactory()
+ {
+ assertThat( context, is( notNullValue() ) );
+ ComponentInstance ci = null;
+
+ try {
+ PrimitiveComponentType type = createAProvider();
+ ci = type.createInstance();
+ assertThat("Ci is valid", ci.getState(), is(ComponentInstance.VALID));
+ ServiceReference ref = ipojo.getServiceReferenceByName(Foo.class.getName(), ci.getInstanceName());
+ assertThat( ref, is( notNullValue() ) );
+ type.stop();
+ assertThat("Ci is disposed", ci.getState(), is(ComponentInstance.DISPOSED));
+ ref = ipojo.getServiceReferenceByName(Foo.class.getName(), ci.getInstanceName());
+ assertThat( ref, is( nullValue() ) );
+
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void createAServiceCons()
+ {
+ assertThat( context, is( notNullValue() ) );
+ ComponentInstance ci = null;
+
+ try {
+ PrimitiveComponentType type = createAConsumer();
+ ci = type.createInstance();
+ assertThat("Ci is invalid", ci.getState(), is(ComponentInstance.INVALID));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void createBoth() throws Exception {
+ ComponentInstance cons = createAConsumer().createInstance();
+ // cons is invalid
+ assertThat("cons is invalid", cons.getState(), is(ComponentInstance.INVALID));
+
+ ComponentInstance prov = createAProvider().createInstance();
+ assertThat("prov is valid", prov.getState(), is(ComponentInstance.VALID));
+ assertThat("cons is valid", cons.getState(), is(ComponentInstance.VALID));
+
+ }
+
+ @Test
+ public void createTwoCons() throws Exception {
+ ComponentInstance cons1 = createAConsumer().createInstance();
+ // cons is invalid
+ assertThat("cons is invalid", cons1.getState(), is(ComponentInstance.INVALID));
+
+ ComponentInstance prov = createAProvider().createInstance();
+ assertThat("prov is valid", prov.getState(), is(ComponentInstance.VALID));
+ assertThat("cons is valid", cons1.getState(), is(ComponentInstance.VALID));
+
+ ComponentInstance cons2 = createAnOptionalConsumer().createInstance();
+
+ assertThat("cons2 is valid", cons2.getState(), is(ComponentInstance.VALID));
+
+ prov.stop();
+ assertThat("cons is invalid", cons1.getState(), is(ComponentInstance.INVALID));
+ assertThat("cons2 is valid", cons2.getState(), is(ComponentInstance.VALID));
+ }
+
+ private PrimitiveComponentType createAProvider() {
+ return new PrimitiveComponentType()
+ .setBundleContext(context)
+ .setClassName(FooImpl.class.getName())
+ .addService(new Service()); // Provide the FooService
+ }
+
+ private PrimitiveComponentType createAConsumer() {
+ return new SingletonComponentType()
+ .setBundleContext(context)
+ .setClassName(org.example.service.impl.MyComponentImpl.class.getName())
+ .addDependency(new Dependency().setField("myFoo"))
+ .setValidateMethod("start");
+ }
+
+ private PrimitiveComponentType createAnOptionalConsumer() {
+ return new SingletonComponentType()
+ .setBundleContext(context)
+ .setClassName(org.example.service.impl.MyComponentImpl.class.getName())
+ .addDependency(new Dependency().setField("myFoo").setOptional(true))
+ .setValidateMethod("start");
+ }
+
+
+
+}
diff --git a/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/SingletonComponentTest.java b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/SingletonComponentTest.java
new file mode 100644
index 0000000..7eb54c8
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/apache/felix/ipojo/tests/api/SingletonComponentTest.java
@@ -0,0 +1,197 @@
+package org.apache.felix.ipojo.tests.api;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.notNullValue;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.fail;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.CoreOptions.options;
+import static org.ops4j.pax.exam.CoreOptions.provision;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.api.Dependency;
+import org.apache.felix.ipojo.api.PrimitiveComponentType;
+import org.apache.felix.ipojo.api.Service;
+import org.apache.felix.ipojo.api.SingletonComponentType;
+import org.example.service.Foo;
+import org.example.service.impl.FooImpl;
+import org.example.service.impl.MyComponentImpl;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Inject;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.Configuration;
+import org.ops4j.pax.exam.junit.JUnit4TestRunner;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+
+
+@RunWith( JUnit4TestRunner.class )
+public class SingletonComponentTest {
+
+ @Inject
+ private BundleContext context;
+
+ private OSGiHelper osgi;
+
+ private IPOJOHelper ipojo;
+
+ @Before
+ public void init() {
+ osgi = new OSGiHelper(context);
+ ipojo = new IPOJOHelper(context);
+ }
+
+ @After
+ public void stop() {
+ ipojo.dispose();
+ osgi.dispose();
+ }
+
+ @Configuration
+ public static Option[] configure() {
+ Option[] opt = options(
+ provision(
+ mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo").version("1.3.0-SNAPSHOT"),
+ mavenBundle().groupId("org.apache.felix").artifactId("org.apache.felix.ipojo.api").version("1.3.0-SNAPSHOT")
+ )
+ );
+ return opt;
+ }
+
+ @Test
+ public void createAServiceProvider()
+ {
+ assertThat( context, is( notNullValue() ) );
+ ComponentInstance ci = null;
+
+ try {
+ SingletonComponentType type = createAProvider();
+ ci = type.create();
+ assertThat("Ci is valid", ci.getState(), is(ComponentInstance.VALID));
+ ServiceReference ref = ipojo.getServiceReferenceByName(Foo.class.getName(), ci.getInstanceName());
+ assertThat( ref, is( notNullValue() ) );
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void killTheFactory()
+ {
+ assertThat( context, is( notNullValue() ) );
+ ComponentInstance ci = null;
+
+ try {
+ SingletonComponentType type = createAProvider();
+ ci = type.create();
+ assertThat("Ci is valid", ci.getState(), is(ComponentInstance.VALID));
+ ServiceReference ref = ipojo.getServiceReferenceByName(Foo.class.getName(), ci.getInstanceName());
+ assertThat( ref, is( notNullValue() ) );
+ type.stop();
+ assertThat("Ci is disposed", ci.getState(), is(ComponentInstance.DISPOSED));
+ ref = ipojo.getServiceReferenceByName(Foo.class.getName(), ci.getInstanceName());
+ assertThat( ref, is( nullValue() ) );
+
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void createAServiceCons()
+ {
+ assertThat( context, is( notNullValue() ) );
+ ComponentInstance ci = null;
+
+ try {
+ SingletonComponentType type = createAConsumer();
+ ci = type.create();
+ assertThat("Ci is invalid", ci.getState(), is(ComponentInstance.INVALID));
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ @Test
+ public void createBoth() throws Exception {
+ ComponentInstance cons = createAConsumer().create();
+ // cons is invalid
+ assertThat("cons is invalid", cons.getState(), is(ComponentInstance.INVALID));
+
+ ComponentInstance prov = createAProvider().create();
+ assertThat("prov is valid", prov.getState(), is(ComponentInstance.VALID));
+ assertThat("cons is valid", cons.getState(), is(ComponentInstance.VALID));
+
+ }
+
+ @Test
+ public void createTwoCons() throws Exception {
+ ComponentInstance cons1 = createAConsumer().create();
+ // cons is invalid
+ assertThat("cons is invalid", cons1.getState(), is(ComponentInstance.INVALID));
+
+ ComponentInstance prov = createAProvider().create();
+ assertThat("prov is valid", prov.getState(), is(ComponentInstance.VALID));
+ assertThat("cons is valid", cons1.getState(), is(ComponentInstance.VALID));
+
+ ComponentInstance cons2 = createAnOptionalConsumer().create();
+
+ assertThat("cons2 is valid", cons2.getState(), is(ComponentInstance.VALID));
+
+ prov.stop();
+ assertThat("cons is invalid", cons1.getState(), is(ComponentInstance.INVALID));
+ assertThat("cons2 is valid", cons2.getState(), is(ComponentInstance.VALID));
+ }
+
+ @Test
+ @Ignore
+ public void setObject() throws Exception {
+ ComponentInstance cons = createAConsumer().setObject(new MyComponentImpl(5)).create();
+ // cons is invalid
+ assertThat("cons is invalid", cons.getState(), is(ComponentInstance.INVALID));
+
+ ComponentInstance prov = createAProvider().create();
+ assertThat("prov is valid", prov.getState(), is(ComponentInstance.VALID));
+ assertThat("cons is valid", cons.getState(), is(ComponentInstance.VALID));
+
+ }
+
+ private SingletonComponentType createAProvider() {
+ PrimitiveComponentType type = new SingletonComponentType()
+ .setBundleContext(context)
+ .setClassName(FooImpl.class.getName())
+ .addService(new Service()); // Provide the FooService
+
+ return (SingletonComponentType) type;
+ }
+
+ private SingletonComponentType createAConsumer() {
+ PrimitiveComponentType type = new SingletonComponentType()
+ .setBundleContext(context)
+ .setClassName(org.example.service.impl.MyComponentImpl.class.getName())
+ .addDependency(new Dependency().setField("myFoo"))
+ .setValidateMethod("start");
+
+ return (SingletonComponentType) type;
+ }
+
+ private SingletonComponentType createAnOptionalConsumer() {
+ PrimitiveComponentType type = new SingletonComponentType()
+ .setBundleContext(context)
+ .setClassName(org.example.service.impl.MyComponentImpl.class.getName())
+ .addDependency(new Dependency().setField("myFoo").setOptional(true))
+ .setValidateMethod("start");
+
+ return (SingletonComponentType) type;
+
+ }
+
+
+
+}
diff --git a/ipojo/tests/api/src/test/java/org/example/service/BarService.java b/ipojo/tests/api/src/test/java/org/example/service/BarService.java
new file mode 100644
index 0000000..c00a51d
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/example/service/BarService.java
@@ -0,0 +1,8 @@
+package org.example.service;
+
+public interface BarService {
+
+ public void doSomethingWithBar();
+
+
+}
diff --git a/ipojo/tests/api/src/test/java/org/example/service/Foo.java b/ipojo/tests/api/src/test/java/org/example/service/Foo.java
new file mode 100644
index 0000000..ea18955
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/example/service/Foo.java
@@ -0,0 +1,8 @@
+package org.example.service;
+
+public interface Foo {
+
+
+ public void doSomething();
+
+}
diff --git a/ipojo/tests/api/src/test/java/org/example/service/MyService.java b/ipojo/tests/api/src/test/java/org/example/service/MyService.java
new file mode 100644
index 0000000..abf4884
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/example/service/MyService.java
@@ -0,0 +1,5 @@
+package org.example.service;
+
+public interface MyService {
+ double compute(double value);
+}
diff --git a/ipojo/tests/api/src/test/java/org/example/service/impl/FooImpl.java b/ipojo/tests/api/src/test/java/org/example/service/impl/FooImpl.java
new file mode 100644
index 0000000..69b2c62
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/example/service/impl/FooImpl.java
@@ -0,0 +1,25 @@
+package org.example.service.impl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.example.service.Foo;
+
+public class FooImpl implements Foo {
+
+ // private List<String> m_list = new ArrayList<String>();
+
+ public void doSomething() {
+ // Do something...
+ System.out.println("Hello World !");
+ }
+
+ public FooImpl(String s) {
+ _setIM(s);
+ }
+
+ public void _setIM(String s) {
+
+ }
+
+}
diff --git a/ipojo/tests/api/src/test/java/org/example/service/impl/MyComponentImpl.java b/ipojo/tests/api/src/test/java/org/example/service/impl/MyComponentImpl.java
new file mode 100644
index 0000000..2bb6ab2
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/example/service/impl/MyComponentImpl.java
@@ -0,0 +1,26 @@
+package org.example.service.impl;
+
+import org.example.service.Foo;
+
+public class MyComponentImpl {
+
+ private Foo myFoo;
+
+ private int anInt;
+
+ public MyComponentImpl() {
+ anInt = 2;
+ }
+
+ public MyComponentImpl(int i) {
+ anInt = i;
+ }
+
+ public void start() {
+ myFoo.doSomething();
+ if (anInt > 0) {
+ System.out.println("Set int to " + anInt);
+ }
+ }
+
+}
diff --git a/ipojo/tests/api/src/test/java/org/example/service/impl/MyServiceImpl.java b/ipojo/tests/api/src/test/java/org/example/service/impl/MyServiceImpl.java
new file mode 100644
index 0000000..efe4c0b
--- /dev/null
+++ b/ipojo/tests/api/src/test/java/org/example/service/impl/MyServiceImpl.java
@@ -0,0 +1,9 @@
+package org.example.service.impl;
+
+import org.example.service.MyService;
+
+public class MyServiceImpl implements MyService {
+ public double compute(double value) {
+ return Math.exp(value * Math.cosh(value));
+ }
+}
diff --git a/ipojo/tests/composite/import-export/src/main/resources/metadata.xml b/ipojo/tests/composite/import-export/src/main/resources/metadata.xml
index 3d6cb0e..ced65b9 100644
--- a/ipojo/tests/composite/import-export/src/main/resources/metadata.xml
+++ b/ipojo/tests/composite/import-export/src/main/resources/metadata.xml
@@ -8,38 +8,38 @@
<comp:composite name="composite.requires.1" architecture="true">
<subservice action="import"
specification="org.apache.felix.ipojo.test.composite.service.FooService"
- scope="comp:composite" />
+ scope="composite" />
</comp:composite>
<comp:composite name="composite.requires.2" architecture="true">
<subservice action="import"
specification="org.apache.felix.ipojo.test.composite.service.FooService"
- aggregate="true" scope="comp:composite" />
+ aggregate="true" scope="composite" />
</comp:composite>
<comp:composite name="composite.requires.3" architecture="true">
<subservice action="import"
specification="org.apache.felix.ipojo.test.composite.service.FooService"
- optional="true" scope="comp:composite" />
+ optional="true" scope="composite" />
</comp:composite>
<comp:composite name="composite.requires.4" architecture="true">
<subservice action="import"
specification="org.apache.felix.ipojo.test.composite.service.FooService"
- optional="true" aggregate="true" scope="comp:composite" />
+ optional="true" aggregate="true" scope="composite" />
</comp:composite>
<comp:composite name="composite.requires.5" architecture="true">
<subservice action="import"
specification="org.apache.felix.ipojo.test.composite.service.FooService"
- filter="(&(int=2)(long=40))" scope="comp:composite" />
+ filter="(&(int=2)(long=40))" scope="composite" />
</comp:composite>
<comp:composite name="composite.export.1" architecture="true">
<subservice action="import"
specification="org.apache.felix.ipojo.test.composite.service.BazService"
aggregate="true" optional="true" filter="(!(instance.name=export))"
- scope="comp:composite" />
+ scope="composite" />
<comp:provides action="export"
specification="org.apache.felix.ipojo.test.composite.service.BazService" />
</comp:composite>
@@ -47,7 +47,7 @@
<comp:composite name="composite.export.2" architecture="true">
<subservice action="import"
specification="org.apache.felix.ipojo.test.composite.service.BazService"
- scope="comp:composite" aggregate="true" optional="true"
+ scope="composite" aggregate="true" optional="true"
filter="(!(instance.name=export))" />
<comp:provides action="export"
specification="org.apache.felix.ipojo.test.composite.service.BazService"
@@ -57,7 +57,7 @@
<comp:composite name="composite.export.3" architecture="true">
<subservice action="import"
specification="org.apache.felix.ipojo.test.composite.service.BazService"
- scope="comp:composite" aggregate="true" optional="true"
+ scope="composite" aggregate="true" optional="true"
filter="(!(instance.name=export))" />
<comp:provides action="export"
specification="org.apache.felix.ipojo.test.composite.service.BazService"
diff --git a/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/component/strategies/DummyCreationStrategy.java b/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/component/strategies/DummyCreationStrategy.java
index d0b7660..5bc3838 100644
--- a/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/component/strategies/DummyCreationStrategy.java
+++ b/ipojo/tests/core/service-providing-strategies/src/main/java/org/apache/felix/ipojo/test/scenarios/component/strategies/DummyCreationStrategy.java
@@ -57,7 +57,7 @@
throw new UnsupportedOperationException("This service requires an advanced creation policy. "
+ "Before calling the service, call the getService(ComponentInstance) method to get "
- + "the service object. " + arg1.getName()); // TODO DEBUG
+ + "the service object. " + arg1.getName());
}
/**
diff --git a/ipojo/tests/pom.xml b/ipojo/tests/pom.xml
index 8573de0..0354f23 100644
--- a/ipojo/tests/pom.xml
+++ b/ipojo/tests/pom.xml
@@ -49,6 +49,7 @@
<module>handler/whiteboard</module>
<module>handler/eventadmin</module>
<module>core/configadmin</module>
+ <module>api</module>
</modules>
<profiles>