Commit the new iPOJO version (0.7.6).
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@642265 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/annotations/pom.xml b/ipojo/annotations/pom.xml
index 9a62990..e2b5446 100644
--- a/ipojo/annotations/pom.xml
+++ b/ipojo/annotations/pom.xml
@@ -19,16 +19,15 @@
<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/xsd/maven-4.0.0.xsd">
<parent>
- <groupId>org.apache.felix</groupId>
- <artifactId>felix</artifactId>
- <version>1.0.2</version>
- <relativePath>../../pom/pom.xml</relativePath>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>org.apache.felix.ipojo.annotations</artifactId>
<packaging>bundle</packaging>
- <version>0.7.5-SNAPSHOT</version>
- <name>iPOJO Annotations</name>
+ <name>Apache Felix iPOJO Annotations</name>
<build>
<plugins>
<plugin>
@@ -38,9 +37,9 @@
<source>1.5</source>
<target>1.5</target>
</configuration>
- </plugin>
+ </plugin>
<plugin>
- <groupId>org.apache.felix</groupId>
+ <groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>1.4.0</version>
<extensions>true</extensions>
@@ -55,4 +54,15 @@
</plugin>
</plugins>
</build>
+ <reporting>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-checkstyle-plugin</artifactId>
+ <configuration>
+ <configLocation>http://people.apache.org/~clement/styles/checkstyle_ipojo.xml</configLocation>
+ </configuration>
+ </plugin>
+ </plugins>
+ </reporting>
</project>
\ No newline at end of file
diff --git a/ipojo/ant/pom.xml b/ipojo/ant/pom.xml
index 5ee1876..aae1663 100644
--- a/ipojo/ant/pom.xml
+++ b/ipojo/ant/pom.xml
@@ -1,74 +1,90 @@
-<!--
- 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.
--->
-<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/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.apache.felix</groupId>
- <artifactId>felix</artifactId>
- <version>1.0.2</version>
- <relativePath>../../pom/pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>org.apache.felix.ipojo.ant</artifactId>
- <packaging>bundle</packaging>
- <version>0.7.5-SNAPSHOT</version>
- <name>Apache Felix iPOJO Ant Task</name>
- <dependencies>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.ipojo.metadata</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>xerces</groupId>
- <artifactId>xercesImpl</artifactId>
- <version>2.4.0</version>
- </dependency>
- <dependency>
- <groupId>ant</groupId>
- <artifactId>ant</artifactId>
- <version>1.6.5</version>
- </dependency>
- </dependencies>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <version>1.4.0</version>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-Name>iPOJO Ant Task</Bundle-Name>
- <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
- <Bundle-Description> iPOJO Ant Task </Bundle-Description>
- <Private-Package>org.apache.felix.ipojo.metadata, org.apache.felix.ipojo.manipulator, org.apache.felix.ipojo.xml.parser, org.apache.felix.ipojo.manipulation*, org.objectweb.asm;-split-package:=merge-first, org.objectweb.asm.commons;-split-package:=merge-first, org.apache.xerces.parsers, org.apache.xerces.xni*, org.apache.xerces.impl*, org.apache.xerces.util.*</Private-Package>
- <Export-Package>org.apache.felix.ipojo.task</Export-Package>
- </instructions>
- </configuration>
- </plugin>
- </plugins>
- </build>
+<!--
+ 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.
+-->
+<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/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>org.apache.felix.ipojo.ant</artifactId>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO Ant Task</name>
+ <dependencies>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>xerces</groupId>
+ <artifactId>xercesImpl</artifactId>
+ <version>2.4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>ant</groupId>
+ <artifactId>ant</artifactId>
+ <version>1.6.5</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>iPOJO Ant Task</Bundle-Name>
+ <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
+ <Bundle-Description>
+ iPOJO Ant Task
+ </Bundle-Description>
+ <Private-Package>
+ org.apache.felix.ipojo.metadata,
+ org.apache.felix.ipojo.manipulator,
+ org.apache.felix.ipojo.xml.parser,
+ org.apache.felix.ipojo.manipulation*,
+ org.objectweb.asm.util;-split-package:=merge-first,
+ org.objectweb.asm;-split-package:=merge-first,
+ org.objectweb.asm.commons;-split-package:=merge-first,
+ org.apache.xerces.parsers,
+ org.apache.xerces.xni*,
+ org.apache.xerces.impl*,
+ org.apache.xerces.util.*
+ </Private-Package>
+ <Export-Package>
+ org.apache.felix.ipojo.task
+ </Export-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
</project>
\ No newline at end of file
diff --git a/ipojo/ant/src/main/java/org/apache/felix/ipojo/task/IPojoTask.java b/ipojo/ant/src/main/java/org/apache/felix/ipojo/task/IPojoTask.java
index 242b44a..f210976 100644
--- a/ipojo/ant/src/main/java/org/apache/felix/ipojo/task/IPojoTask.java
+++ b/ipojo/ant/src/main/java/org/apache/felix/ipojo/task/IPojoTask.java
@@ -25,30 +25,21 @@
import org.apache.tools.ant.Task;
/**
-* iPOJO Ant Task.
-* This Ant taks manipulate an input bundle.
-* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
-*/
+ * iPOJO Ant Task. This Ant task manipulates an input bundle.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
public class IPojoTask extends Task {
- /**
- * Metadata file.
- */
+ /** Metadata file. */
private File m_metadata;
- /**
- * Input bundle.
- */
+ /** Input bundle. */
private File m_input;
- /**
- * Output bundle.
- */
+ /** Output bundle. */
private File m_output;
- /**
- * Flag describing if we need to ignore annotation of not.
- */
+ /** Flag describing if we need to ignore annotation of not. */
private boolean m_ignoreAnnotations = false;
/**
@@ -96,7 +87,7 @@
throw new BuildException("The input bundle " + m_input.getAbsolutePath() + " does not exist");
}
- System.out.println("Input Bundle File : " + m_input.getAbsolutePath());
+ log("Input Bundle File : " + m_input.getAbsolutePath());
// Get metadata file
if (m_metadata == null) {
@@ -104,25 +95,25 @@
if (!m_metadata.exists()) {
// Verify if annotations are ignored
if (m_ignoreAnnotations) {
- System.out.println("No metadata file found - ignore annotations");
+ log("No metadata file found & ignore annotations : nothing to do");
return;
} else {
- System.out.println("No metadata file found - try to use only annotations");
+ log("No metadata file found - try to use only annotations");
m_metadata = null;
}
} else {
- System.out.println("Metadata File : " + m_metadata.getAbsolutePath());
+ log("Metadata File : " + m_metadata.getAbsolutePath());
}
} else {
- // Metadata file is specified, check existency
+ // Metadata file is specified, check existence
if (!m_metadata.exists()) {
throw new BuildException("No metadata file found - the file " + m_metadata.getAbsolutePath() + " does not exist");
} else {
- System.out.println("Metadata File : " + m_metadata.getAbsolutePath());
+ log("Metadata File : " + m_metadata.getAbsolutePath());
}
}
- System.out.println("Start bundle manipulation");
+ log("Start bundle manipulation");
if (m_output == null) {
m_output = new File("./_out.jar");
@@ -139,7 +130,7 @@
}
pojo.pojoization(m_input, m_output, m_metadata);
for (int i = 0; i < pojo.getWarnings().size(); i++) {
- System.out.println((String) pojo.getWarnings().get(i));
+ log((String) pojo.getWarnings().get(i));
}
if (pojo.getErrors().size() > 0) { throw new BuildException((String) pojo.getErrors().get(0)); }
@@ -152,8 +143,8 @@
out = m_output.getAbsolutePath();
}
- System.out.println("Bundle manipulation - SUCCESS");
- System.out.println("Output File : " + out);
+ log("Bundle manipulation - SUCCESS");
+ log("Output File : " + out);
}
diff --git a/ipojo/arch/pom.xml b/ipojo/arch/pom.xml
index f2505e9..bd4b56b 100644
--- a/ipojo/arch/pom.xml
+++ b/ipojo/arch/pom.xml
@@ -1,80 +1,85 @@
<!--
- 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.
+ 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.
-->
<project>
- <parent>
- <groupId>org.apache.felix</groupId>
- <artifactId>felix</artifactId>
- <version>1.0.2</version>
- <relativePath>../../pom/pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <packaging>bundle</packaging>
- <name>Apache Felix iPOJO Arch Command</name>
- <version>0.7.5-SNAPSHOT</version>
- <artifactId>org.apache.felix.ipojo.arch</artifactId>
- <dependencies>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.ipojo</artifactId>
- <version>${pom.version}</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.ipojo.metadata</artifactId>
- <version>${pom.version}</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.shell</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <version>1.4.0</version>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-Name>iPOJO Arch Command</Bundle-Name>
- <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
- <Private-Package>org.apache.felix.ipojo.arch</Private-Package>
- </instructions>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-ipojo-plugin</artifactId>
- <version>${pom.version}</version>
- <executions>
- <execution>
- <goals>
- <goal>ipojo-bundle</goal>
- </goals>
- <configuration>
- <ignoreAnnotations>true</ignoreAnnotations>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO Arch Command</name>
+ <artifactId>org.apache.felix.ipojo.arch</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.shell</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>
+ iPOJO Arch Felix Command
+ </Bundle-Name>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ org.apache.felix.ipojo.arch
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
</project>
diff --git a/ipojo/arch/src/main/java/org/apache/felix/ipojo/arch/ArchCommandImpl.java b/ipojo/arch/src/main/java/org/apache/felix/ipojo/arch/ArchCommandImpl.java
index d26522f..26b528d 100644
--- a/ipojo/arch/src/main/java/org/apache/felix/ipojo/arch/ArchCommandImpl.java
+++ b/ipojo/arch/src/main/java/org/apache/felix/ipojo/arch/ArchCommandImpl.java
@@ -19,7 +19,10 @@
package org.apache.felix.ipojo.arch;
import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.util.List;
+import org.apache.felix.ipojo.IPojoFactory;
import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.Factory;
import org.apache.felix.ipojo.HandlerFactory;
@@ -29,25 +32,17 @@
/**
* Implementation of the arch command printing the actual architecture.
- *
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class ArchCommandImpl implements Command {
- /**
- * List of arch service.
- */
+ /** List of arch services. */
private Architecture[] m_archs;
- /**
- * Factory services.
- */
+ /** Factory services. */
private Factory[] m_factories;
-
- /**
- * Handler Factories.
- */
+ /** Handler Factories. */
private Factory[] m_handlers;
/**
@@ -60,7 +55,7 @@
}
/**
- * Get help message.
+ * Gets help message.
* @return the command usage.
* @see org.apache.felix.shell.Command#getUsage()
*/
@@ -69,7 +64,7 @@
}
/**
- * Get a small description.
+ * Gets a small description.
* @return get a description.
* @see org.apache.felix.shell.Command#getShortDescription()
*/
@@ -78,7 +73,7 @@
}
/**
- * Execute the arch command.
+ * Executes the arch command.
* @param line : command line
* @param out : the default output stream
* @param err : the error output stream
@@ -113,15 +108,41 @@
printHandlers(out);
return;
}
+
+ if (line2.startsWith("-stats")) {
+ printStats(out);
+ return;
+ }
err.println(getUsage());
}
/**
- * Print instance list.
- *
- * @param out :
- * default print stream
+ * Prints the statistics.
+ * @param out the out
+ */
+ private void printStats(PrintStream out) {
+ try {
+ Field field = IPojoFactory.class.getDeclaredField("m_instancesName");
+ field.setAccessible(true); // The field is not accessible.
+ List names = (List) field.get(null);
+ out.println("Number of living instances : " + names.size());
+ out.println("Created instances : " + names);
+ } catch (SecurityException e) {
+ out.println("Cannot compute stats : " + e.getMessage());
+ } catch (IllegalArgumentException e) {
+ out.println("Cannot compute stats : " + e.getMessage());
+ } catch (IllegalAccessException e) {
+ out.println("Cannot compute stats : " + e.getMessage());
+ } catch (NoSuchFieldException e) {
+ out.println("Cannot compute stats : " + e.getMessage());
+ }
+
+ }
+
+ /**
+ * Prints instance list.
+ * @param out : default print stream
*/
private void printInstances(PrintStream out) {
for (int i = 0; i < m_archs.length; i++) {
@@ -139,7 +160,7 @@
}
/**
- * Print instance description.
+ * Prints instance description.
* @param name : instance name
* @param out : default print stream
* @param err : error print stream (if the instance is not found)
@@ -156,7 +177,7 @@
}
/**
- * Print Factory information.
+ * Prints factories.
* @param out : output stream
*/
private void printFactories(PrintStream out) {
@@ -170,7 +191,7 @@
}
/**
- * Print factory description.
+ * Prints factory description.
* @param name : factory name
* @param out : default print stream
* @param err : error print stream (if the factory is not found)
@@ -186,7 +207,7 @@
}
/**
- * Print the list of available handlers (and validity).
+ * Prints the list of available handlers (and validity).
* @param out : default print stream
*/
private void printHandlers(PrintStream out) {
diff --git a/ipojo/arch/src/main/resources/metadata.xml b/ipojo/arch/src/main/resources/metadata.xml
index f605ec4..d49d553 100644
--- a/ipojo/arch/src/main/resources/metadata.xml
+++ b/ipojo/arch/src/main/resources/metadata.xml
@@ -1,10 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<iPOJO>
- <Component className="org.apache.felix.ipojo.arch.ArchCommandImpl" factory="false">
- <Provides/>
- <Requires field="m_archs" optional="true"/>
- <Requires field="m_factories" optional="true" filter="(!(handler.name=*))"/>
- <Requires field="m_handlers" optional="true" filter="(handler.name=*)"/>
+ <Component className="org.apache.felix.ipojo.arch.ArchCommandImpl"
+ factory="false">
+ <Provides />
+ <Requires field="m_archs" optional="true" />
+ <Requires field="m_factories" optional="true"
+ filter="(!(handler.name=*))" />
+ <Requires field="m_handlers" optional="true"
+ filter="(handler.name=*)" />
</Component>
- <instance component="org.apache.felix.ipojo.arch.ArchCommandImpl" name="ArchCommand"/>
+ <instance component="org.apache.felix.ipojo.arch.ArchCommandImpl"
+ name="ArchCommand" />
</iPOJO>
\ No newline at end of file
diff --git a/ipojo/composite/pom.xml b/ipojo/composite/pom.xml
new file mode 100644
index 0000000..222dc6d
--- /dev/null
+++ b/ipojo/composite/pom.xml
@@ -0,0 +1,120 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO Composite</name>
+ <artifactId>org.apache.felix.ipojo.composite</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>iPOJO Composite</Bundle-Name>
+ <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
+ <Bundle-Description>
+ iPOJO Composititon Framework
+ </Bundle-Description>
+ <Import-Package>
+ org.apache.felix.ipojo,
+ org.apache.felix.ipojo.architecture,
+ org.apache.felix.ipojo.context,
+ org.apache.felix.ipojo.metadata,
+ org.apache.felix.ipojo.parser,
+ org.apache.felix.ipojo.util,
+ org.osgi.framework
+ </Import-Package>
+ <Private-Package>
+ org.apache.felix.ipojo.manipulation,
+ org.apache.felix.ipojo.composite.architecture,
+ org.apache.felix.ipojo.composite.service*,
+ org.apache.felix.ipojo.composite.instance,
+ org.apache.felix.ipojo.composite.util,
+ !org.objectweb.asm.xml*,
+ org.objectweb.asm*;-split-package:=merge-first
+ </Private-Package>
+ <Export-Package>
+ org.apache.felix.ipojo.composite;
+ version="0.7.6"
+ </Export-Package>
+ <IPOJO-Extension>
+ composite:org.apache.felix.ipojo.composite.CompositeFactory
+ </IPOJO-Extension>
+ <_donotcopy>
+ (CVS|.svn|.+.bak|~.+|metadata.xml)
+ </_donotcopy>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <metadata>metadata.xml</metadata>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeFactory.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeFactory.java
new file mode 100644
index 0000000..9c980a1
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeFactory.java
@@ -0,0 +1,178 @@
+/*
+ * 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.composite;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.Handler;
+import org.apache.felix.ipojo.HandlerManager;
+import org.apache.felix.ipojo.IPojoContext;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.util.Logger;
+import org.apache.felix.ipojo.util.Tracker;
+import org.apache.felix.ipojo.util.TrackerCustomizer;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.InvalidSyntaxException;
+
+/**
+ * The component factory manages component instance objects. This management
+ * consist in creating and managing component instance build with the component
+ * factory. This class could export Factory and ManagedServiceFactory services.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class CompositeFactory extends ComponentFactory implements TrackerCustomizer {
+
+ /**
+ * Tracker used to track required handler factories.
+ */
+ protected Tracker m_tracker;
+
+ /**
+ * Create a composite factory.
+ * @param context : bundle context
+ * @param metadata : metadata of the component to create
+ * @throws ConfigurationException occurs when the element describing the factory is malformed.
+ */
+ public CompositeFactory(BundleContext context, Element metadata) throws ConfigurationException {
+ super(context, metadata);
+ }
+
+ /**
+ * Check if the metadata are well formed.
+ * @param metadata : metadata
+ * @throws ConfigurationException occurs when the element describing the factory is malformed.
+ * @see org.apache.felix.ipojo.ComponentFactory#check(org.apache.felix.ipojo.metadata.Element)
+ */
+ public void check(Element metadata) throws ConfigurationException {
+ String name = metadata.getAttribute("name");
+ if (name == null) {
+ throw new ConfigurationException("A composite needs a name : " + metadata);
+ }
+ }
+
+ public String getClassName() { return "composite"; }
+
+
+ /**
+ * Compute required handlers.
+ * @return the list of required handler.
+ */
+ public List getRequiredHandlerList() {
+ List list = new ArrayList();
+ Element[] elems = m_componentMetadata.getElements();
+ for (int i = 0; i < elems.length; i++) {
+ Element current = elems[i];
+ RequiredHandler req = new RequiredHandler(current.getName(), current.getNameSpace());
+ if (! list.contains(req)) { list.add(req); }
+ }
+
+ // Add architecture if architecture != 'false'
+ String arch = m_componentMetadata.getAttribute("architecture");
+ if (arch == null || arch.equalsIgnoreCase("true")) {
+ RequiredHandler req = new RequiredHandler("architecture", null);
+ if (! list.contains(req)) { list.add(req); }
+ }
+
+ return list;
+ }
+
+ /**
+ * Stop all the instance managers.
+ */
+ public synchronized void stopping() {
+ if (m_tracker != null) {
+ m_tracker.close();
+ }
+ m_tracker = null;
+ }
+
+ /**
+ * Start all the instance managers.
+ */
+ public synchronized void starting() {
+ if (m_requiredHandlers.size() != 0) {
+ try {
+ String filter = "(&(" + Constants.OBJECTCLASS + "=" + Factory.class.getName() + ")"
+ + "(" + Handler.HANDLER_TYPE_PROPERTY + "=" + CompositeHandler.HANDLER_TYPE + ")"
+ + "(factory.state=1)"
+ + ")";
+ m_tracker = new Tracker(m_context, m_context.createFilter(filter), this);
+ m_tracker.open();
+ } catch (InvalidSyntaxException e) {
+ m_logger.log(Logger.ERROR, "A factory filter is not valid: " + e.getMessage());
+ stop();
+ return;
+ }
+ }
+ }
+
+ /**
+ * Create an instance from the current factory.
+ * @param configuration : instance configuration
+ * @param context : bundle context to inject in the instance manager
+ * @param handlers : array of handler object to attached on the instance
+ * @return the created instance
+ * @throws ConfigurationException either the instance configuration or the instance starting has failed
+ * @see org.apache.felix.ipojo.ComponentFactory#createInstance(java.util.Dictionary, org.apache.felix.ipojo.IPojoContext, org.apache.felix.ipojo.HandlerManager[])
+ */
+ public ComponentInstance createInstance(Dictionary configuration, IPojoContext context, HandlerManager[] handlers) throws ConfigurationException {
+ CompositeManager inst = new CompositeManager(this, context, handlers);
+ inst.configure(m_componentMetadata, configuration);
+ inst.start();
+ return inst;
+ }
+
+ /**
+ * Reconfigure an existing instance.
+ * @param properties : the new configuration to push.
+ * @throws UnacceptableConfiguration : occurs if the new configuration is
+ * not consistent with the component type.
+ * @throws MissingHandlerException : occurs when an handler is unavailable when creating the instance.
+ * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
+ */
+ public synchronized void reconfigure(Dictionary properties) throws UnacceptableConfiguration, MissingHandlerException {
+ if (properties == null || properties.get("name") == null) {
+ throw new UnacceptableConfiguration("The configuration does not contains the \"name\" property");
+ }
+ String name = (String) properties.get("name");
+
+ ComponentInstance instance = (CompositeManager) m_componentInstances.get(name);
+
+ if (instance == null) {
+ return; // The instance does not exist.
+ }
+
+ instance.reconfigure(properties); // re-configure the component
+ }
+
+ public String getFactoryName() {
+ return m_componentMetadata.getAttribute("name");
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/CompositeHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeHandler.java
similarity index 75%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/CompositeHandler.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeHandler.java
index bf243e9..4194fed 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/CompositeHandler.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeHandler.java
@@ -1,66 +1,83 @@
-/*
- * 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;
-
-
-/**
- * Composite Handler Abstract Class. An composite handler need implements these
- * method to be notified of lifecycle change...
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public abstract class CompositeHandler extends Handler {
-
- /**
- * Composite Handler type.
- */
- public static final String HANDLER_TYPE = "composite";
-
- /**
- * Reference on the composite manager.
- */
- private CompositeManager m_manager;
-
- /**
- * Set the manager.
- * This method me be called only once time.
- * @param cm : the composite manager.
- */
- protected final void attach(ComponentInstance cm) {
- m_manager = (CompositeManager) cm;
- setLogger(m_manager.getFactory().getLogger());
- }
-
- public final CompositeManager getCompositeManager() {
- return m_manager;
- }
-
- /**
- * Get a plugged handler of the same container.
- * This method must be call only in the start method (or after).
- * In the configure method, this method can not return a consistent
- * result as all handlers are not plugged.
- * @param name : name of the handler to find (class name).
- * @return the composite handler object or null if the handler is not found.
- */
- public final Handler getHandler(String name) {
- return m_manager.getCompositeHandler(name);
- }
-
-}
+/*
+ * 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.composite;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.Handler;
+import org.apache.felix.ipojo.util.Logger;
+
+
+/**
+ * Composite Handler Abstract Class. An composite handler need implements these
+ * method to be notified of lifecycle change...
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public abstract class CompositeHandler extends Handler {
+
+ /**
+ * Composite Handler type.
+ */
+ public static final String HANDLER_TYPE = "composite";
+
+ /**
+ * Reference on the composite manager.
+ */
+ private CompositeManager m_manager;
+
+ /**
+ * Composite Factory.
+ */
+ private CompositeFactory m_factory;
+
+ /**
+ * Set the manager.
+ * This method me be called only once time.
+ * @param instance : the composite manager.
+ */
+ protected final void attach(ComponentInstance instance) {
+ m_manager = (CompositeManager) instance;
+ }
+
+ public final void setFactory(Factory factory) {
+ m_factory = (CompositeFactory) factory;
+ }
+
+ public final Logger getLogger() {
+ return m_factory.getLogger();
+ }
+
+ public final CompositeManager getCompositeManager() {
+ return m_manager;
+ }
+
+ /**
+ * Get a plugged handler of the same container.
+ * This method must be call only in the start method (or after).
+ * In the configure method, this method can not return a consistent
+ * result as all handlers are not plugged.
+ * @param name : name of the handler to find (class name).
+ * @return the composite handler object or null if the handler is not found.
+ */
+ public final Handler getHandler(String name) {
+ return m_manager.getCompositeHandler(name);
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/CompositeManager.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeManager.java
similarity index 81%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/CompositeManager.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeManager.java
index 69eb78f..00537ea 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/CompositeManager.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeManager.java
@@ -1,435 +1,442 @@
-/*
- * 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;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.List;
-
-import org.apache.felix.ipojo.architecture.Architecture;
-import org.apache.felix.ipojo.architecture.InstanceDescription;
-import org.apache.felix.ipojo.composite.CompositeServiceContext;
-import org.apache.felix.ipojo.metadata.Element;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-
-/**
- * iPOJO Composite manager. The composite manager class manages one instance of
- * a component type which is a composition. It manages component lifecycle, and
- * handlers...
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class CompositeManager implements ComponentInstance, InstanceStateListener {
-
- /**
- * The context of the component.
- */
- private BundleContext m_context;
-
- /**
- * Parent factory (ComponentFactory).
- */
- private ComponentFactory m_factory;
-
- /**
- * Composite Handler list.
- */
- private HandlerManager[] m_handlers = new HandlerManager[0];
-
- /**
- * Instance State Listener List.
- */
- private List m_instanceListeners = new ArrayList();
-
- /**
- * Internal service context of the composition.
- */
- private CompositeServiceContext m_internalContext;
-
- /**
- * Name of the component instance.
- */
- private String m_name;
-
- /**
- * Component state (STOPPED at the beginning).
- */
- private int m_state = STOPPED;
-
- /**
- * Construct a new Component Manager.
- * @param factory : the factory managing the instance manager
- * @param bc : the bundle context to give to the instance
- * @param handlers : the handlers to plug
- */
- public CompositeManager(ComponentFactory factory, BundleContext bc, HandlerManager[] handlers) {
- m_factory = factory;
- m_context = bc;
- // Initialize the service context.
- m_internalContext = new CompositeServiceContext(m_context, this);
- m_handlers = handlers;
- }
-
- /**
- * Plug the given handler to the current container.
- * @param h : the handler to plug.
- */
- public synchronized void addCompositeHandler(HandlerManager h) {
- if (m_handlers.length > 0) {
- HandlerManager[] newInstances = new HandlerManager[m_handlers.length + 1];
- System.arraycopy(m_handlers, 0, newInstances, 0, m_handlers.length);
- newInstances[m_handlers.length] = h;
- m_handlers = newInstances;
- } else {
- m_handlers = new HandlerManager[] { h };
- }
- }
-
- /**
- * Add an instance to the created instance list.
- * @param listener : the instance state listener to add.
- * @see org.apache.felix.ipojo.ComponentInstance#addInstanceStateListener(org.apache.felix.ipojo.InstanceStateListener)
- */
- public void addInstanceStateListener(InstanceStateListener listener) {
- synchronized (m_instanceListeners) {
- m_instanceListeners.add(listener);
- }
- }
-
- /**
- * Configure the instance manager. Stop the existing handler, clear the
- * handler list, change the metadata, recreate the handler
- *
- * @param cm : the component type metadata
- * @param configuration : the configuration of the instance
- * @throws ConfigurationException : occurs when the component type are incorrect.
- */
- public void configure(Element cm, Dictionary configuration) throws ConfigurationException {
- // Add the name
- m_name = (String) configuration.get("name");
-
- // Create the standard handlers and add these handlers to the list
- for (int i = 0; i < m_handlers.length; i++) {
- m_handlers[i].init(this, cm, configuration);
- }
- }
-
- /**
- * Dispose the instance.
- * @see org.apache.felix.ipojo.ComponentInstance#dispose()
- */
- public void dispose() {
- if (m_state > STOPPED) { stop(); }
-
- for (int i = 0; i < m_instanceListeners.size(); i++) {
- ((InstanceStateListener) m_instanceListeners.get(i)).stateChanged(this, DISPOSED);
- }
-
- m_factory.disposed(this);
-
- // Cleaning
- m_state = DISPOSED;
- for (int i = m_handlers.length - 1; i > -1; i--) {
- m_handlers[i].dispose();
- }
- m_handlers = new HandlerManager[0];
- m_instanceListeners.clear();
- }
-
- /**
- * Return a specified handler.
- * @param name : class name of the handler to find
- * @return : the handler, or null if not found
- */
- public CompositeHandler getCompositeHandler(String name) {
- for (int i = 0; i < m_handlers.length; i++) {
- HandlerFactory fact = (HandlerFactory) m_handlers[i].getFactory();
- if (fact.getHandlerName().equals(name) || fact.getComponentClassName().equals(name)) {
- return (CompositeHandler) m_handlers[i].getHandler();
- }
- }
- return null;
- }
-
- /**
- * Get the bundle context used by this instance.
- * @return the parent context of the instance.
- * @see org.apache.felix.ipojo.ComponentInstance#getContext()
- */
- public BundleContext getContext() {
- return m_context;
- }
-
- /**
- * Get the factory which create this instance.
- * @return the factory of the component
- * @see org.apache.felix.ipojo.ComponentInstance#getFactory()
- */
- public ComponentFactory getFactory() {
- return m_factory;
- }
-
- /**
- * Get the global bundle context.
- * @return the global bundle context.
- */
- public BundleContext getGlobalContext() {
- IPojoContext c = (IPojoContext) m_context;
- return c.getGlobalContext();
- }
-
- /**
- * Return the instance description of this instance.
- * @return the instance description.
- * @see org.apache.felix.ipojo.ComponentInstance#getInstanceDescription()
- */
- public InstanceDescription getInstanceDescription() {
- InstanceDescription instanceDescription = new InstanceDescription(m_name, m_state, getContext().getBundle().getBundleId(), m_factory.getComponentDescription());
- CompositeHandler[] handlers = getRegistredCompositeHandlers();
- for (int i = 0; i < handlers.length; i++) {
- instanceDescription.addHandler(handlers[i].getDescription());
- }
-
- // Get instances description of internal instance
- ServiceReference[] refs;
- try {
- refs = m_internalContext.getServiceReferences(Architecture.class.getName(), null);
- if (refs != null) {
- for (int i = 0; i < refs.length; i++) {
- Architecture arch = (Architecture) m_internalContext.getService(refs[i]);
- instanceDescription.addInstance(arch.getInstanceDescription());
- m_internalContext.ungetService(refs[i]);
- }
- }
- } catch (InvalidSyntaxException e) {
- e.printStackTrace(); // Should not happen
- }
- return instanceDescription;
- }
-
- /**
- * Get the instance name.
- * @return the instance name
- * @see org.apache.felix.ipojo.ComponentInstance#getInstanceName()
- */
- public String getInstanceName() {
- return m_name;
- }
-
- /**
- * Get the parent service context.
- * @return the parent service context.
- */
- public ServiceContext getParentServiceContext() {
- IPojoContext c = (IPojoContext) m_context;
- return c.getServiceContext();
- }
-
- /**
- * REturn the list of handlers plugged on this instance.
- * @return the list of the registered handlers.
- */
- public CompositeHandler[] getRegistredCompositeHandlers() {
- CompositeHandler[] h = new CompositeHandler[m_handlers.length];
- for (int i = 0; i < m_handlers.length; i++) {
- h[i] = (CompositeHandler) m_handlers[i].getHandler();
- }
- return h;
- }
-
- /**
- * Get the internal service context of this instance.
- * @return the internal service context.
- */
- public ServiceContext getServiceContext() {
- return m_internalContext;
- }
-
- /**
- * Get the actual state of the instance.
- * @return the actual state of the instance
- * @see org.apache.felix.ipojo.ComponentInstance#getState()
- */
- public int getState() {
- return m_state;
- }
-
- /**
- * Check if the instance is started.
- * @return true if the instance is started.
- * @see org.apache.felix.ipojo.ComponentInstance#isStarted()
- */
- public boolean isStarted() {
- return m_state > STOPPED;
- }
-
- /**
- * Reconfigure the current instance.
- * @param configuration : the new instance configuration.
- * @see org.apache.felix.ipojo.ComponentInstance#reconfigure(java.util.Dictionary)
- */
- public void reconfigure(Dictionary configuration) {
- for (int i = 0; i < m_handlers.length; i++) {
- m_handlers[i].reconfigure(configuration);
- }
- }
-
- /**
- * Remove an instance state listener.
- * @param listener : the listener to remove
- * @see org.apache.felix.ipojo.ComponentInstance#removeInstanceStateListener(org.apache.felix.ipojo.InstanceStateListener)
- */
- public void removeInstanceStateListener(InstanceStateListener listener) {
- synchronized (m_instanceListeners) {
- m_instanceListeners.remove(listener);
- }
- }
-
- /**
- * Set the state of the component.
- * if the state changed call the stateChanged(int) method on the handlers.
- * @param state : new state
- */
- public void setState(int state) {
- if (m_state != state) {
- if (state > m_state) {
- // The state increases (Stopped = > IV, IV => V) => invoke handlers from the higher priority to the lower
- m_state = state;
- for (int i = 0; i < m_handlers.length; i++) {
- m_handlers[i].getHandler().stateChanged(state);
- }
- } else {
- // The state decreases (V => IV, IV = > Stopped, Stopped => Disposed)
- m_state = state;
- for (int i = m_handlers.length - 1; i > -1; i--) {
- m_handlers[i].getHandler().stateChanged(state);
- }
- }
-
- for (int i = 0; i < m_instanceListeners.size(); i++) {
- ((InstanceStateListener) m_instanceListeners.get(i)).stateChanged(this, state);
- }
- }
- }
-
- /**
- * Start the instance manager.
- */
- public synchronized void start() {
- if (m_state > STOPPED) {
- return;
- } // Instance already started
-
-
- // The new state of the component is UNRESOLVED
- m_state = INVALID;
-
- m_internalContext.start(); // Turn on the factory tracking
-
- for (int i = 0; i < m_handlers.length; i++) {
- m_handlers[i].start();
- m_handlers[i].addInstanceStateListener(this);
- }
-
- for (int i = 0; i < m_handlers.length; i++) {
- if (m_handlers[i].getState() != VALID) {
- setState(INVALID);
- return;
- }
- }
- setState(VALID);
-
- }
-
- /**
- * State Change listener callback.
- * This method is notified at each time a plugged handler becomes invalid.
- * @param instance : changing instance
- * @param newState : new state
- * @see org.apache.felix.ipojo.InstanceStateListener#stateChanged(org.apache.felix.ipojo.ComponentInstance, int)
- */
- public synchronized void stateChanged(ComponentInstance instance, int newState) {
- if (m_state <= STOPPED) { return; }
-
- // Update the component state if necessary
- if (newState == INVALID && m_state == VALID) {
- // Need to update the state to UNRESOLVED
- setState(INVALID);
- return;
- }
- if (newState == VALID && m_state == INVALID) {
- // An handler becomes valid => check if all handlers are valid
- boolean isValid = true;
- for (int i = 0; i < m_handlers.length; i++) {
- isValid = isValid && m_handlers[i].getState() == VALID;
- }
-
- if (isValid) { setState(VALID); }
- }
- if (newState == DISPOSED) {
- kill();
- }
- }
-
- /**
- * Stop the instance manager.
- */
- public synchronized void stop() {
- if (m_state <= STOPPED) {
- return;
- } // Instance already stopped
-
- setState(INVALID);
- // Stop all the handlers
- for (int i = m_handlers.length - 1; i > -1; i--) {
- m_handlers[i].removeInstanceStateListener(this);
- m_handlers[i].stop();
- }
-
- m_internalContext.stop(); // Turn off the factory tracking
- m_state = STOPPED;
-
- for (int i = 0; i < m_instanceListeners.size(); i++) {
- ((InstanceStateListener) m_instanceListeners.get(i)).stateChanged(this, STOPPED);
- }
- }
-
- /**
- * Kill the current instance.
- * Only the factory of this instance can call this method.
- */
- protected synchronized void kill() {
- if (m_state > STOPPED) { stop(); }
-
- for (int i = 0; i < m_instanceListeners.size(); i++) {
- ((InstanceStateListener) m_instanceListeners.get(i)).stateChanged(this, DISPOSED);
- }
-
- // Cleaning
- m_state = DISPOSED;
-
- for (int i = m_handlers.length - 1; i > -1; i--) {
- m_handlers[i].dispose();
- }
- m_handlers = new HandlerManager[0];
- m_instanceListeners.clear();
- }
-}
+/*
+ * 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.composite;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.HandlerFactory;
+import org.apache.felix.ipojo.HandlerManager;
+import org.apache.felix.ipojo.IPojoContext;
+import org.apache.felix.ipojo.InstanceStateListener;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.metadata.Element;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * iPOJO Composite manager. The composite manager class manages one instance of
+ * a component type which is a composition. It manages component lifecycle, and
+ * handlers...
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class CompositeManager implements ComponentInstance, InstanceStateListener {
+
+ /**
+ * The context of the component.
+ */
+ private BundleContext m_context;
+
+ /**
+ * Parent factory (ComponentFactory).
+ */
+ private CompositeFactory m_factory;
+
+ /**
+ * Composite Handler list.
+ */
+ private HandlerManager[] m_handlers = new HandlerManager[0];
+
+ /**
+ * Instance State Listener List.
+ */
+ private List m_listeners = new ArrayList();
+
+ /**
+ * Internal service context of the composition.
+ */
+ private CompositeServiceContext m_internalContext;
+
+ /**
+ * Name of the component instance.
+ */
+ private String m_name;
+
+ /**
+ * Component state (STOPPED at the beginning).
+ */
+ private int m_state = STOPPED;
+
+ /**
+ * Construct a new Component Manager.
+ * @param factory : the factory managing the instance manager
+ * @param context : the bundle context to give to the instance
+ * @param handlers : the handlers to plug
+ */
+ public CompositeManager(CompositeFactory factory, BundleContext context, HandlerManager[] handlers) {
+ m_factory = factory;
+ m_context = context;
+ // Initialize the service context.
+ m_internalContext = new CompositeServiceContext(m_context, this);
+ m_handlers = handlers;
+ }
+
+ /**
+ * Plug the given handler to the current container.
+ * @param handler : the handler to plug.
+ */
+ public synchronized void addCompositeHandler(HandlerManager handler) {
+ if (m_handlers.length > 0) {
+ HandlerManager[] newInstances = new HandlerManager[m_handlers.length + 1];
+ System.arraycopy(m_handlers, 0, newInstances, 0, m_handlers.length);
+ newInstances[m_handlers.length] = handler;
+ m_handlers = newInstances;
+ } else {
+ m_handlers = new HandlerManager[] { handler };
+ }
+ }
+
+ /**
+ * Add an instance to the created instance list.
+ * @param listener : the instance state listener to add.
+ * @see org.apache.felix.ipojo.ComponentInstance#addInstanceStateListener(org.apache.felix.ipojo.InstanceStateListener)
+ */
+ public void addInstanceStateListener(InstanceStateListener listener) {
+ synchronized (m_listeners) {
+ m_listeners.add(listener);
+ }
+ }
+
+ /**
+ * Configure the instance manager. Stop the existing handler, clear the
+ * handler list, change the metadata, recreate the handler
+ *
+ * @param metadata : the component type metadata
+ * @param configuration : the configuration of the instance
+ * @throws ConfigurationException : occurs when the component type are incorrect.
+ */
+ public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
+ // Add the name
+ m_name = (String) configuration.get("name");
+
+ // Create the standard handlers and add these handlers to the list
+ for (int i = 0; i < m_handlers.length; i++) {
+ m_handlers[i].init(this, metadata, configuration);
+ }
+ }
+
+ /**
+ * Dispose the instance.
+ * @see org.apache.felix.ipojo.ComponentInstance#dispose()
+ */
+ public void dispose() {
+ if (m_state > STOPPED) { stop(); }
+
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((InstanceStateListener) m_listeners.get(i)).stateChanged(this, DISPOSED);
+ }
+
+ m_factory.disposed(this);
+
+ // Cleaning
+ m_state = DISPOSED;
+ for (int i = m_handlers.length - 1; i > -1; i--) {
+ m_handlers[i].dispose();
+ }
+ m_handlers = new HandlerManager[0];
+ m_listeners.clear();
+ }
+
+ /**
+ * Return a specified handler.
+ * @param name : class name of the handler to find
+ * @return : the handler, or null if not found
+ */
+ public CompositeHandler getCompositeHandler(String name) {
+ for (int i = 0; i < m_handlers.length; i++) {
+ HandlerFactory fact = (HandlerFactory) m_handlers[i].getFactory();
+ if (fact.getHandlerName().equals(name) || fact.getComponentDescription().getClassName().equals(name)) {
+ return (CompositeHandler) m_handlers[i].getHandler();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Get the bundle context used by this instance.
+ * @return the parent context of the instance.
+ * @see org.apache.felix.ipojo.ComponentInstance#getContext()
+ */
+ public BundleContext getContext() {
+ return m_context;
+ }
+
+ /**
+ * Get the factory which create this instance.
+ * @return the factory of the component
+ * @see org.apache.felix.ipojo.ComponentInstance#getFactory()
+ */
+ public ComponentFactory getFactory() {
+ return m_factory;
+ }
+
+ /**
+ * Get the global bundle context.
+ * @return the global bundle context.
+ */
+ public BundleContext getGlobalContext() {
+ IPojoContext context = (IPojoContext) m_context;
+ return context.getGlobalContext();
+ }
+
+ /**
+ * Return the instance description of this instance.
+ * @return the instance description.
+ * @see org.apache.felix.ipojo.ComponentInstance#getInstanceDescription()
+ */
+ public InstanceDescription getInstanceDescription() {
+ InstanceDescription desc = new InstanceDescription(m_name, m_state, getContext().getBundle().getBundleId(), m_factory.getComponentDescription());
+ CompositeHandler[] handlers = getRegistredCompositeHandlers();
+ for (int i = 0; i < handlers.length; i++) {
+ desc.addHandler(handlers[i].getDescription());
+ }
+
+ // Get instances description of internal instance
+ ServiceReference[] refs;
+ try {
+ refs = m_internalContext.getServiceReferences(Architecture.class.getName(), null);
+ if (refs != null) {
+ for (int i = 0; i < refs.length; i++) {
+ Architecture arch = (Architecture) m_internalContext.getService(refs[i]);
+ desc.addInstance(arch.getInstanceDescription());
+ m_internalContext.ungetService(refs[i]);
+ }
+ }
+ } catch (InvalidSyntaxException e) {
+ // Cannot happen
+ }
+ return desc;
+ }
+
+ /**
+ * Get the instance name.
+ * @return the instance name
+ * @see org.apache.felix.ipojo.ComponentInstance#getInstanceName()
+ */
+ public String getInstanceName() {
+ return m_name;
+ }
+
+ /**
+ * Get the parent service context.
+ * @return the parent service context.
+ */
+ public ServiceContext getParentServiceContext() {
+ IPojoContext context = (IPojoContext) m_context;
+ return context.getServiceContext();
+ }
+
+ /**
+ * REturn the list of handlers plugged on this instance.
+ * @return the list of the registered handlers.
+ */
+ public CompositeHandler[] getRegistredCompositeHandlers() {
+ CompositeHandler[] handler = new CompositeHandler[m_handlers.length];
+ for (int i = 0; i < m_handlers.length; i++) {
+ handler[i] = (CompositeHandler) m_handlers[i].getHandler();
+ }
+ return handler;
+ }
+
+ /**
+ * Get the internal service context of this instance.
+ * @return the internal service context.
+ */
+ public ServiceContext getServiceContext() {
+ return m_internalContext;
+ }
+
+ /**
+ * Get the actual state of the instance.
+ * @return the actual state of the instance
+ * @see org.apache.felix.ipojo.ComponentInstance#getState()
+ */
+ public int getState() {
+ return m_state;
+ }
+
+ /**
+ * Check if the instance is started.
+ * @return true if the instance is started.
+ * @see org.apache.felix.ipojo.ComponentInstance#isStarted()
+ */
+ public boolean isStarted() {
+ return m_state > STOPPED;
+ }
+
+ /**
+ * Reconfigure the current instance.
+ * @param configuration : the new instance configuration.
+ * @see org.apache.felix.ipojo.ComponentInstance#reconfigure(java.util.Dictionary)
+ */
+ public void reconfigure(Dictionary configuration) {
+ for (int i = 0; i < m_handlers.length; i++) {
+ m_handlers[i].reconfigure(configuration);
+ }
+ }
+
+ /**
+ * Remove an instance state listener.
+ * @param listener : the listener to remove
+ * @see org.apache.felix.ipojo.ComponentInstance#removeInstanceStateListener(org.apache.felix.ipojo.InstanceStateListener)
+ */
+ public void removeInstanceStateListener(InstanceStateListener listener) {
+ synchronized (m_listeners) {
+ m_listeners.remove(listener);
+ }
+ }
+
+ /**
+ * Set the state of the component.
+ * if the state changed call the stateChanged(int) method on the handlers.
+ * @param state : new state
+ */
+ public void setState(int state) {
+ if (m_state != state) {
+ if (state > m_state) {
+ // The state increases (Stopped = > IV, IV => V) => invoke handlers from the higher priority to the lower
+ m_state = state;
+ for (int i = 0; i < m_handlers.length; i++) {
+ m_handlers[i].getHandler().stateChanged(state);
+ }
+ } else {
+ // The state decreases (V => IV, IV = > Stopped, Stopped => Disposed)
+ m_state = state;
+ for (int i = m_handlers.length - 1; i > -1; i--) {
+ m_handlers[i].getHandler().stateChanged(state);
+ }
+ }
+
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((InstanceStateListener) m_listeners.get(i)).stateChanged(this, state);
+ }
+ }
+ }
+
+ /**
+ * Start the instance manager.
+ */
+ public synchronized void start() {
+ if (m_state > STOPPED) {
+ return;
+ } // Instance already started
+
+
+ // The new state of the component is UNRESOLVED
+ m_state = INVALID;
+
+ m_internalContext.start(); // Turn on the factory tracking
+
+ for (int i = 0; i < m_handlers.length; i++) {
+ m_handlers[i].start();
+ m_handlers[i].addInstanceStateListener(this);
+ }
+
+ for (int i = 0; i < m_handlers.length; i++) {
+ if (m_handlers[i].getState() != VALID) {
+ setState(INVALID);
+ return;
+ }
+ }
+ setState(VALID);
+
+ }
+
+ /**
+ * State Change listener callback.
+ * This method is notified at each time a plugged handler becomes invalid.
+ * @param instance : changing instance
+ * @param newState : new state
+ * @see org.apache.felix.ipojo.InstanceStateListener#stateChanged(org.apache.felix.ipojo.ComponentInstance, int)
+ */
+ public synchronized void stateChanged(ComponentInstance instance, int newState) {
+ if (m_state <= STOPPED) { return; }
+
+ // Update the component state if necessary
+ if (newState == INVALID && m_state == VALID) {
+ // Need to update the state to UNRESOLVED
+ setState(INVALID);
+ return;
+ }
+ if (newState == VALID && m_state == INVALID) {
+ // An handler becomes valid => check if all handlers are valid
+ boolean isValid = true;
+ for (int i = 0; i < m_handlers.length; i++) {
+ isValid = isValid && m_handlers[i].getState() == VALID;
+ }
+
+ if (isValid) { setState(VALID); }
+ }
+ if (newState == DISPOSED) {
+ kill();
+ }
+ }
+
+ /**
+ * Stop the instance manager.
+ */
+ public synchronized void stop() {
+ if (m_state <= STOPPED) {
+ return;
+ } // Instance already stopped
+
+ setState(INVALID);
+ // Stop all the handlers
+ for (int i = m_handlers.length - 1; i > -1; i--) {
+ m_handlers[i].removeInstanceStateListener(this);
+ m_handlers[i].stop();
+ }
+
+ m_internalContext.stop(); // Turn off the factory tracking
+ m_state = STOPPED;
+
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((InstanceStateListener) m_listeners.get(i)).stateChanged(this, STOPPED);
+ }
+ }
+
+ /**
+ * Kill the current instance.
+ * Only the factory of this instance can call this method.
+ */
+ protected synchronized void kill() {
+ if (m_state > STOPPED) { stop(); }
+
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((InstanceStateListener) m_listeners.get(i)).stateChanged(this, DISPOSED);
+ }
+
+ // Cleaning
+ m_state = DISPOSED;
+
+ for (int i = m_handlers.length - 1; i > -1; i--) {
+ m_handlers[i].dispose();
+ }
+ m_handlers = new HandlerManager[0];
+ m_listeners.clear();
+ }
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java
similarity index 95%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java
index d3449d6..1b0ebfc 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/CompositeServiceContext.java
@@ -1,488 +1,482 @@
-/*
- * 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.composite;
-
-import java.io.File;
-import java.io.InputStream;
-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.IPojoContext;
-import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.util.Tracker;
-import org.apache.felix.ipojo.util.TrackerCustomizer;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.BundleException;
-import org.osgi.framework.BundleListener;
-import org.osgi.framework.Filter;
-import org.osgi.framework.FrameworkListener;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-
-/**
- * CompositeServiceContext Class. This class provides an implementation of the
- * service context for composite.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class CompositeServiceContext implements ServiceContext, TrackerCustomizer {
-
- /**
- * Structure storing the reference, the factory and the registration.
- */
- private class Record {
- /**
- * Reference of the represented factory from the external context.
- */
- private ServiceReference m_ref;
- /**
- * Registration of the factory in the internal context.
- */
- private ServiceRegistration m_reg;
- /**
- * Represented Factory.
- */
- private FactoryProxy m_fact;
- }
-
- /**
- * List of imported factories.
- */
- private List m_factories = new ArrayList();
-
- /**
- * External context.
- */
- private BundleContext m_parent;
-
- /**
- * Internal service registry.
- */
- private ServiceRegistry m_registry;
-
- /**
- * Component Instance who creates this registry.
- */
- private ComponentInstance m_instance;
-
- /**
- * Global service context.
- */
- private BundleContext m_global;
-
- /**
- * Tracker tracking Factories to import.
- */
- private Tracker m_tracker;
-
- /**
- * Constructor. This constructor instantiate a service registry with the
- * given bundle context.
- *
- * @param bc : the bundle context
- */
- public CompositeServiceContext(BundleContext bc) {
- m_registry = new ServiceRegistry(bc);
- m_parent = bc;
- if (m_parent instanceof IPojoContext) {
- m_global = ((IPojoContext) m_parent).getGlobalContext();
- } else {
- m_global = m_parent; // the parent context is the global context
- }
- }
-
- /**
- * Constructor.
- *
- * @param bc : the bundle context
- * @param ci : the component instance owning this context
- */
- public CompositeServiceContext(BundleContext bc, ComponentInstance ci) {
- this(bc);
- m_instance = ci;
- }
-
- /**
- * Add a service listener.
- * @param arg0 : The service listener to add
- * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener)
- */
- public void addServiceListener(ServiceListener arg0) {
- m_registry.addServiceListener(arg0);
- }
-
- /**
- * Add a filtered service listener.
- * @param arg0 : the service listener object to add
- * @param arg1 : the LDAP filter for this listener
- * @throws InvalidSyntaxException : occurs if the LDAP filter is malformed
- * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener,
- * java.lang.String)
- */
- public void addServiceListener(ServiceListener arg0, String arg1) throws InvalidSyntaxException {
- m_registry.addServiceListener(arg0, arg1);
- }
-
- /**
- * Get all service references.
- * @param arg0 : The required service interface.
- * @param arg1 : LDAP filter
- * @return the list of all service reference matching with the query
- * @throws InvalidSyntaxException : occurs when the given filter is malformed
- * @see org.apache.felix.ipojo.ServiceContext#getAllServiceReferences(java.lang.String,
- * java.lang.String)
- */
- public ServiceReference[] getAllServiceReferences(String arg0, String arg1) throws InvalidSyntaxException {
- return m_registry.getAllServiceReferences(arg0, arg1);
- }
-
- /**
- * Get a service object for the given service reference.
- * @param arg0 : the service reference
- * @return the service object or null if the reference is no more valid or if the object is not accessible
- * @see org.apache.felix.ipojo.ServiceContext#getService(org.osgi.framework.ServiceReference)
- */
- public Object getService(ServiceReference arg0) {
- return m_registry.getService(m_instance, arg0);
- }
-
-
- /**
- * Get a service reference for the required interface.
- * @param arg0 : the required interface name
- * @return the service reference or null if no available provider
- * @see org.apache.felix.ipojo.ServiceContext#getServiceReference(java.lang.String)
- */
- public ServiceReference getServiceReference(String arg0) {
- return m_registry.getServiceReference(arg0);
- }
-
- /**
- * Get all accessible service reference for the given query.
- * @param clazz : required interface
- * @param filter : LDAP filter
- * @return the list (array) of service reference matching with the query.
- * @throws InvalidSyntaxException : occurs when the LDAP filter is malformed
- * @see org.apache.felix.ipojo.ServiceContext#getServiceReferences(java.lang.String, java.lang.String)
- */
- public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
- return m_registry.getServiceReferences(clazz, filter);
- }
-
-
- /**
- * Register a service inside the composite context.
- * @param arg0 : list of interfaces to register.
- * @param arg1 : service object
- * @param arg2 : properties list
- * @return the service registration
- * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)
- */
- public ServiceRegistration registerService(String[] arg0, Object arg1, Dictionary arg2) {
- return m_registry.registerService(m_instance, arg0, arg1, arg2);
- }
-
- /**
- * Register a service inside the composite context.
- * @param arg0 : interface to register.
- * @param arg1 : service object
- * @param arg2 : properties list
- * @return the service registration
- * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String, java.lang.Object, java.util.Dictionary)
- */
- public ServiceRegistration registerService(String arg0, Object arg1, Dictionary arg2) {
- return m_registry.registerService(m_instance, arg0, arg1, arg2);
- }
-
- /**
- * Remove a service listener.
- * @param arg0 : the service listener to remove
- * @see org.apache.felix.ipojo.ServiceContext#removeServiceListener(org.osgi.framework.ServiceListener)
- */
- public void removeServiceListener(ServiceListener arg0) {
- m_registry.removeServiceListener(arg0);
- }
-
- /**
- * Unget a service.
- * @param arg0 the service reference to unget
- * @return true
- * @see org.apache.felix.ipojo.ServiceContext#ungetService(org.osgi.framework.ServiceReference)
- */
- public boolean ungetService(ServiceReference arg0) {
- return m_registry.ungetService(m_instance, arg0);
- }
-
- /**
- * Import a factory form the parent to the internal registry.
- *
- * @param ref : the reference of the factory to import.
- */
- private void importFactory(ServiceReference ref) {
- Record rec = new Record();
- m_factories.add(rec);
- Dictionary dict = new Properties();
- for (int j = 0; j < ref.getPropertyKeys().length; j++) {
- dict.put(ref.getPropertyKeys()[j], ref.getProperty(ref.getPropertyKeys()[j]));
- }
- rec.m_fact = new FactoryProxy((Factory) m_tracker.getService(ref), this);
- rec.m_reg = registerService(Factory.class.getName(), rec.m_fact, dict);
- rec.m_ref = ref;
- }
-
- /**
- * Remove a factory of the available factory list.
- *
- * @param ref : the reference on the factory to remove.
- */
- private void removeFactory(ServiceReference ref) {
- for (int i = 0; i < m_factories.size(); i++) {
- Record rec = (Record) m_factories.get(i);
- if (rec.m_ref == ref) {
- if (rec.m_reg != null) {
- rec.m_reg.unregister();
- rec.m_fact = null;
- }
- m_tracker.ungetService(rec.m_ref);
- m_factories.remove(rec);
- return;
- }
- }
- }
-
- /**
- * Start the registry management.
- */
- public void start() {
- m_tracker = new Tracker(m_global, Factory.class.getName(), this);
- m_tracker.open();
- }
-
- /**
- * Stop the registry management.
- */
- public synchronized void stop() {
- m_tracker.close();
- m_registry.reset();
- for (int i = 0; i < m_factories.size(); i++) {
- Record rec = (Record) m_factories.get(i);
- removeFactory(rec.m_ref);
- }
- m_tracker = null;
- }
-
- /**
- * Check if the factory list contain the given reference.
- *
- * @param ref : the reference to find.
- * @return true if the list contains the given reference.
- */
- private boolean containsRef(ServiceReference ref) {
- for (int i = 0; i < m_factories.size(); i++) {
- Record rec = (Record) m_factories.get(i);
- if (rec.m_ref == ref) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Add a bundle listener.
- * Delegate on the global bundle context.
- * @param arg0 : bundle listener to add
- * @see org.osgi.framework.BundleContext#addBundleListener(org.osgi.framework.BundleListener)
- */
- public void addBundleListener(BundleListener arg0) {
- m_global.addBundleListener(arg0);
- }
-
- /**
- * Add a framework listener.
- * Delegate on the global bundle context.
- * @param arg0 : framework listener to add.
- * @see org.osgi.framework.BundleContext#addFrameworkListener(org.osgi.framework.FrameworkListener)
- */
- public void addFrameworkListener(FrameworkListener arg0) {
- m_global.addFrameworkListener(arg0);
- }
-
- /**
- * Create a LDAP filter.
- * @param arg0 : String-form of the filter
- * @return the created filter object
- * @throws InvalidSyntaxException : if the given argument is not a valid against the LDAP grammar.
- * @see org.osgi.framework.BundleContext#createFilter(java.lang.String)
- */
- public Filter createFilter(String arg0) throws InvalidSyntaxException {
- return m_global.createFilter(arg0);
- }
-
- /**
- * Get the current bundle.
- * @return the current bundle
- * @see org.osgi.framework.BundleContext#getBundle()
- */
- public Bundle getBundle() {
- return m_global.getBundle();
- }
-
- /**
- * Get the bundle object with the given id.
- * @param id : bundle id
- * @return the bundle object
- * @see org.osgi.framework.BundleContext#getBundle(long)
- */
- public Bundle getBundle(long id) {
- return m_global.getBundle(id);
- }
-
- /**
- * Get installed bundles.
- * @return the list of installed bundles
- * @see org.osgi.framework.BundleContext#getBundles()
- */
- public Bundle[] getBundles() {
- return m_global.getBundles();
- }
-
-
- /**
- * Get a data file.
- * @param filename : File name.
- * @return the File object
- * @see org.osgi.framework.BundleContext#getDataFile(java.lang.String)
- */
- public File getDataFile(String filename) {
- return m_global.getDataFile(filename);
- }
-
- /**
- * Get a property value.
- * @param key : key of the asked property
- * @return the property value (object) or null if no property are associated with the given key
- * @see org.osgi.framework.BundleContext#getProperty(java.lang.String)
- */
- public String getProperty(String key) {
- return m_global.getProperty(key);
- }
-
- /**
- * Install a bundle.
- * @param location : URL of the bundle to install
- * @return the installed bundle
- * @throws BundleException : if the bundle cannot be installed correctly
- * @see org.osgi.framework.BundleContext#installBundle(java.lang.String)
- */
- public Bundle installBundle(String location) throws BundleException {
- return m_global.installBundle(location);
- }
-
- /**
- * Install a bundle.
- * @param location : URL of the bundle to install
- * @param input :
- * @return the installed bundle
- * @throws BundleException : if the bundle cannot be installed correctly
- * @see org.osgi.framework.BundleContext#installBundle(java.lang.String, java.io.InputStream)
- */
- public Bundle installBundle(String location, InputStream input) throws BundleException {
- return m_global.installBundle(location, input);
- }
-
- /**
- * Remove a bundle listener.
- * @param listener : the listener to remove
- * @see org.osgi.framework.BundleContext#removeBundleListener(org.osgi.framework.BundleListener)
- */
- public void removeBundleListener(BundleListener listener) {
- m_global.removeBundleListener(listener);
- }
-
- /**
- * Remove a framework listener.
- * @param listener : the listener to remove
- * @see org.osgi.framework.BundleContext#removeFrameworkListener(org.osgi.framework.FrameworkListener)
- */
- public void removeFrameworkListener(FrameworkListener listener) {
- m_global.removeFrameworkListener(listener);
- }
-
- /**
- * A new factory is detected.
- * @param reference : service reference
- * @return true if not already imported.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
- */
- public boolean addingService(ServiceReference reference) {
- if (!containsRef(reference)) {
- return true;
- }
- return false;
- }
-
- /**
- * A matching reference has been added. The import factory can now be imported.
- * @param reference : the added reference.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
- */
- public void addedService(ServiceReference reference) {
- importFactory(reference);
- }
-
- /**
- * An imported factory is modified.
- * @param reference : modified reference
- * @param service : factory object.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void modifiedService(ServiceReference reference, Object service) {
- for (int i = 0; i < m_factories.size(); i++) {
- Record rec = (Record) m_factories.get(i);
- if (rec.m_ref == reference) {
- Dictionary dict = new Properties();
- for (int j = 0; j < reference.getPropertyKeys().length; j++) {
- dict.put(reference.getPropertyKeys()[j], reference.getProperty(reference.getPropertyKeys()[j]));
- }
- rec.m_reg.setProperties(dict);
- return;
- }
- }
- }
-
- /**
- * An imported factory disappears.
- * @param reference : reference
- * @param service : factory object.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void removedService(ServiceReference reference, Object service) {
- if (containsRef(reference)) {
- removeFactory(reference);
- }
-
- }
-}
+/*
+ * 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.composite;
+
+import java.io.File;
+import java.io.InputStream;
+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.IPojoContext;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.context.ServiceRegistry;
+import org.apache.felix.ipojo.util.Tracker;
+import org.apache.felix.ipojo.util.TrackerCustomizer;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.BundleListener;
+import org.osgi.framework.Filter;
+import org.osgi.framework.FrameworkListener;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * CompositeServiceContext Class. This class provides an implementation of the
+ * service context for composite.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class CompositeServiceContext implements ServiceContext, TrackerCustomizer {
+
+ /**
+ * Structure storing the reference, the factory and the registration.
+ */
+ private class Record {
+ /**
+ * Reference of the represented factory from the external context.
+ */
+ private ServiceReference m_ref;
+ /**
+ * Registration of the factory in the internal context.
+ */
+ private ServiceRegistration m_reg;
+ /**
+ * Represented Factory.
+ */
+ private FactoryProxy m_fact;
+ }
+
+ /**
+ * List of imported factories.
+ */
+ private List m_factories = new ArrayList();
+ /**
+ * Internal service registry.
+ */
+ private ServiceRegistry m_registry;
+
+ /**
+ * Component Instance who creates this registry.
+ */
+ private ComponentInstance m_instance;
+
+ /**
+ * Global service context.
+ */
+ private BundleContext m_global;
+
+ /**
+ * Tracker tracking Factories to import.
+ */
+ private Tracker m_tracker;
+
+ /**
+ * Constructor. This constructor instantiate a service registry with the
+ * given bundle context.
+ *
+ * @param context : the bundle context
+ */
+ public CompositeServiceContext(BundleContext context) {
+ m_registry = new ServiceRegistry(context);
+ if (context instanceof IPojoContext) {
+ m_global = ((IPojoContext) context).getGlobalContext();
+ } else {
+ m_global = context; // the parent context is the global context
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param context : the bundle context
+ * @param instance : the component instance owning this context
+ */
+ public CompositeServiceContext(BundleContext context, ComponentInstance instance) {
+ this(context);
+ m_instance = instance;
+ }
+
+ /**
+ * Add a service listener.
+ * @param arg0 : The service listener to add
+ * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener)
+ */
+ public void addServiceListener(ServiceListener arg0) {
+ m_registry.addServiceListener(arg0);
+ }
+
+ /**
+ * Add a filtered service listener.
+ * @param arg0 : the service listener object to add
+ * @param arg1 : the LDAP filter for this listener
+ * @throws InvalidSyntaxException : occurs if the LDAP filter is malformed
+ * @see org.apache.felix.ipojo.ServiceContext#addServiceListener(org.osgi.framework.ServiceListener,
+ * java.lang.String)
+ */
+ public void addServiceListener(ServiceListener arg0, String arg1) throws InvalidSyntaxException {
+ m_registry.addServiceListener(arg0, arg1);
+ }
+
+ /**
+ * Get all service references.
+ * @param arg0 : The required service interface.
+ * @param arg1 : LDAP filter
+ * @return the list of all service reference matching with the query
+ * @throws InvalidSyntaxException : occurs when the given filter is malformed
+ * @see org.apache.felix.ipojo.ServiceContext#getAllServiceReferences(java.lang.String,
+ * java.lang.String)
+ */
+ public ServiceReference[] getAllServiceReferences(String arg0, String arg1) throws InvalidSyntaxException {
+ return m_registry.getAllServiceReferences(arg0, arg1);
+ }
+
+ /**
+ * Get a service object for the given service reference.
+ * @param arg0 : the service reference
+ * @return the service object or null if the reference is no more valid or if the object is not accessible
+ * @see org.apache.felix.ipojo.ServiceContext#getService(org.osgi.framework.ServiceReference)
+ */
+ public Object getService(ServiceReference arg0) {
+ return m_registry.getService(m_instance, arg0);
+ }
+
+
+ /**
+ * Get a service reference for the required interface.
+ * @param arg0 : the required interface name
+ * @return the service reference or null if no available provider
+ * @see org.apache.felix.ipojo.ServiceContext#getServiceReference(java.lang.String)
+ */
+ public ServiceReference getServiceReference(String arg0) {
+ return m_registry.getServiceReference(arg0);
+ }
+
+ /**
+ * Get all accessible service reference for the given query.
+ * @param clazz : required interface
+ * @param filter : LDAP filter
+ * @return the list (array) of service reference matching with the query.
+ * @throws InvalidSyntaxException : occurs when the LDAP filter is malformed
+ * @see org.apache.felix.ipojo.ServiceContext#getServiceReferences(java.lang.String, java.lang.String)
+ */
+ public ServiceReference[] getServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+ return m_registry.getServiceReferences(clazz, filter);
+ }
+
+
+ /**
+ * Register a service inside the composite context.
+ * @param arg0 : list of interfaces to register.
+ * @param arg1 : service object
+ * @param arg2 : properties list
+ * @return the service registration
+ * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String[], java.lang.Object, java.util.Dictionary)
+ */
+ public ServiceRegistration registerService(String[] arg0, Object arg1, Dictionary arg2) {
+ return m_registry.registerService(m_instance, arg0, arg1, arg2);
+ }
+
+ /**
+ * Register a service inside the composite context.
+ * @param arg0 : interface to register.
+ * @param arg1 : service object
+ * @param arg2 : properties list
+ * @return the service registration
+ * @see org.apache.felix.ipojo.ServiceContext#registerService(java.lang.String, java.lang.Object, java.util.Dictionary)
+ */
+ public ServiceRegistration registerService(String arg0, Object arg1, Dictionary arg2) {
+ return m_registry.registerService(m_instance, arg0, arg1, arg2);
+ }
+
+ /**
+ * Remove a service listener.
+ * @param arg0 : the service listener to remove
+ * @see org.apache.felix.ipojo.ServiceContext#removeServiceListener(org.osgi.framework.ServiceListener)
+ */
+ public void removeServiceListener(ServiceListener arg0) {
+ m_registry.removeServiceListener(arg0);
+ }
+
+ /**
+ * Unget a service.
+ * @param arg0 the service reference to unget
+ * @return true
+ * @see org.apache.felix.ipojo.ServiceContext#ungetService(org.osgi.framework.ServiceReference)
+ */
+ public boolean ungetService(ServiceReference arg0) {
+ return m_registry.ungetService(m_instance, arg0);
+ }
+
+ /**
+ * Import a factory form the parent to the internal registry.
+ *
+ * @param ref : the reference of the factory to import.
+ */
+ private void importFactory(ServiceReference ref) {
+ Record rec = new Record();
+ m_factories.add(rec);
+ Dictionary dict = new Properties();
+ for (int j = 0; j < ref.getPropertyKeys().length; j++) {
+ dict.put(ref.getPropertyKeys()[j], ref.getProperty(ref.getPropertyKeys()[j]));
+ }
+ rec.m_fact = new FactoryProxy((Factory) m_tracker.getService(ref), this);
+ rec.m_reg = registerService(Factory.class.getName(), rec.m_fact, dict);
+ rec.m_ref = ref;
+ }
+
+ /**
+ * Remove a factory of the available factory list.
+ *
+ * @param ref : the reference on the factory to remove.
+ */
+ private void removeFactory(ServiceReference ref) {
+ for (int i = 0; i < m_factories.size(); i++) {
+ Record rec = (Record) m_factories.get(i);
+ if (rec.m_ref == ref) {
+ if (rec.m_reg != null) {
+ rec.m_reg.unregister();
+ rec.m_fact = null;
+ }
+ m_tracker.ungetService(rec.m_ref);
+ m_factories.remove(rec);
+ return;
+ }
+ }
+ }
+
+ /**
+ * Start the registry management.
+ */
+ public void start() {
+ m_tracker = new Tracker(m_global, Factory.class.getName(), this);
+ m_tracker.open();
+ }
+
+ /**
+ * Stop the registry management.
+ */
+ public synchronized void stop() {
+ m_tracker.close();
+ m_registry.reset();
+ for (int i = 0; i < m_factories.size(); i++) {
+ Record rec = (Record) m_factories.get(i);
+ removeFactory(rec.m_ref);
+ }
+ m_tracker = null;
+ }
+
+ /**
+ * Check if the factory list contain the given reference.
+ *
+ * @param ref : the reference to find.
+ * @return true if the list contains the given reference.
+ */
+ private boolean containsRef(ServiceReference ref) {
+ for (int i = 0; i < m_factories.size(); i++) {
+ Record rec = (Record) m_factories.get(i);
+ if (rec.m_ref == ref) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Add a bundle listener.
+ * Delegate on the global bundle context.
+ * @param arg0 : bundle listener to add
+ * @see org.osgi.framework.BundleContext#addBundleListener(org.osgi.framework.BundleListener)
+ */
+ public void addBundleListener(BundleListener arg0) {
+ m_global.addBundleListener(arg0);
+ }
+
+ /**
+ * Add a framework listener.
+ * Delegate on the global bundle context.
+ * @param arg0 : framework listener to add.
+ * @see org.osgi.framework.BundleContext#addFrameworkListener(org.osgi.framework.FrameworkListener)
+ */
+ public void addFrameworkListener(FrameworkListener arg0) {
+ m_global.addFrameworkListener(arg0);
+ }
+
+ /**
+ * Create a LDAP filter.
+ * @param arg0 : String-form of the filter
+ * @return the created filter object
+ * @throws InvalidSyntaxException : if the given argument is not a valid against the LDAP grammar.
+ * @see org.osgi.framework.BundleContext#createFilter(java.lang.String)
+ */
+ public Filter createFilter(String arg0) throws InvalidSyntaxException {
+ return m_global.createFilter(arg0);
+ }
+
+ /**
+ * Get the current bundle.
+ * @return the current bundle
+ * @see org.osgi.framework.BundleContext#getBundle()
+ */
+ public Bundle getBundle() {
+ return m_global.getBundle();
+ }
+
+ /**
+ * Get the bundle object with the given id.
+ * @param bundleId : bundle id
+ * @return the bundle object
+ * @see org.osgi.framework.BundleContext#getBundle(long)
+ */
+ public Bundle getBundle(long bundleId) {
+ return m_global.getBundle(bundleId);
+ }
+
+ /**
+ * Get installed bundles.
+ * @return the list of installed bundles
+ * @see org.osgi.framework.BundleContext#getBundles()
+ */
+ public Bundle[] getBundles() {
+ return m_global.getBundles();
+ }
+
+
+ /**
+ * Get a data file.
+ * @param filename : File name.
+ * @return the File object
+ * @see org.osgi.framework.BundleContext#getDataFile(java.lang.String)
+ */
+ public File getDataFile(String filename) {
+ return m_global.getDataFile(filename);
+ }
+
+ /**
+ * Get a property value.
+ * @param key : key of the asked property
+ * @return the property value (object) or null if no property are associated with the given key
+ * @see org.osgi.framework.BundleContext#getProperty(java.lang.String)
+ */
+ public String getProperty(String key) {
+ return m_global.getProperty(key);
+ }
+
+ /**
+ * Install a bundle.
+ * @param location : URL of the bundle to install
+ * @return the installed bundle
+ * @throws BundleException : if the bundle cannot be installed correctly
+ * @see org.osgi.framework.BundleContext#installBundle(java.lang.String)
+ */
+ public Bundle installBundle(String location) throws BundleException {
+ return m_global.installBundle(location);
+ }
+
+ /**
+ * Install a bundle.
+ * @param location : URL of the bundle to install
+ * @param input :
+ * @return the installed bundle
+ * @throws BundleException : if the bundle cannot be installed correctly
+ * @see org.osgi.framework.BundleContext#installBundle(java.lang.String, java.io.InputStream)
+ */
+ public Bundle installBundle(String location, InputStream input) throws BundleException {
+ return m_global.installBundle(location, input);
+ }
+
+ /**
+ * Remove a bundle listener.
+ * @param listener : the listener to remove
+ * @see org.osgi.framework.BundleContext#removeBundleListener(org.osgi.framework.BundleListener)
+ */
+ public void removeBundleListener(BundleListener listener) {
+ m_global.removeBundleListener(listener);
+ }
+
+ /**
+ * Remove a framework listener.
+ * @param listener : the listener to remove
+ * @see org.osgi.framework.BundleContext#removeFrameworkListener(org.osgi.framework.FrameworkListener)
+ */
+ public void removeFrameworkListener(FrameworkListener listener) {
+ m_global.removeFrameworkListener(listener);
+ }
+
+ /**
+ * A new factory is detected.
+ * @param reference : service reference
+ * @return true if not already imported.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
+ */
+ public boolean addingService(ServiceReference reference) {
+ if (!containsRef(reference)) {
+ return true;
+ }
+ return false;
+ }
+
+ /**
+ * A matching reference has been added. The import factory can now be imported.
+ * @param reference : the added reference.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
+ */
+ public void addedService(ServiceReference reference) {
+ importFactory(reference);
+ }
+
+ /**
+ * An imported factory is modified.
+ * @param reference : modified reference
+ * @param service : factory object.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void modifiedService(ServiceReference reference, Object service) {
+ for (int i = 0; i < m_factories.size(); i++) {
+ Record rec = (Record) m_factories.get(i);
+ if (rec.m_ref == reference) {
+ Dictionary dict = new Properties();
+ for (int j = 0; j < reference.getPropertyKeys().length; j++) {
+ dict.put(reference.getPropertyKeys()[j], reference.getProperty(reference.getPropertyKeys()[j]));
+ }
+ rec.m_reg.setProperties(dict);
+ return;
+ }
+ }
+ }
+
+ /**
+ * An imported factory disappears.
+ * @param reference : reference
+ * @param service : factory object.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void removedService(ServiceReference reference, Object service) {
+ if (containsRef(reference)) {
+ removeFactory(reference);
+ }
+
+ }
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java
similarity index 84%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java
index 73a61e7..a2a67ba 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/FactoryProxy.java
@@ -1,177 +1,173 @@
-/*
- * 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.composite;
-
-import java.util.Dictionary;
-import java.util.List;
-
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.Factory;
-import org.apache.felix.ipojo.FactoryStateListener;
-import org.apache.felix.ipojo.MissingHandlerException;
-import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.UnacceptableConfiguration;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
-import org.apache.felix.ipojo.metadata.Element;
-import org.osgi.framework.BundleContext;
-
-/**
- * Bridge representing a Factory inside a composition.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class FactoryProxy implements Factory {
-
- /**
- * Delegated factory.
- */
- private Factory m_delegate;
-
- /**
- * Destination context.
- */
- private ServiceContext m_context;
-
- /**
- * Constructor.
- * @param fact : the targeted factory.
- * @param s : the service context to target.
- */
- public FactoryProxy(Factory fact, ServiceContext s) {
- m_delegate = fact;
- m_context = s;
- }
-
- /**
- * Create an instance manager (i.e. component type instance).
- * @param configuration : the configuration properties for this component.
- * @return the created instance manager.
- * @throws UnacceptableConfiguration : when a given configuration is not valid.
- * @throws MissingHandlerException : occurs when the creation failed due to a missing handler (the factory should be invalid)
- * @throws ConfigurationException : occurs when the creation failed due to a configuration issue
- * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
- */
- public ComponentInstance createComponentInstance(Dictionary configuration) throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
- return m_delegate.createComponentInstance(configuration, m_context);
- }
-
- /**
- * Create an instance manager (i.e. component type instance). This has these
- * service interaction in the scope given in argument.
- * @param configuration : the configuration properties for this component.
- * @param serviceContext : the service context of the component.
- * @return the created instance manager.
- * @throws UnacceptableConfiguration : when the given configuration is not valid.
- * @throws MissingHandlerException : when at least one handler is missing.
- * @throws ConfigurationException : when an issue occurs during the oconfiguration of the instance.
- * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary,
- * org.apache.felix.ipojo.ServiceContext)
- */
- public ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
- return m_delegate.createComponentInstance(configuration, serviceContext);
- }
-
- /**
- * Get the component type information containing provided service,
- * configuration properties ...
- * @return the component type information.
- * @see org.apache.felix.ipojo.Factory#getDescription()
- */
- public Element getDescription() {
- return m_delegate.getDescription();
- }
-
- /**
- * Return the factory name.
- * @return the name of the factory.
- * @see org.apache.felix.ipojo.Factory#getName()
- */
- public String getName() {
- return m_delegate.getName();
- }
-
- /**
- * Check if the given configuration is acceptable as a configuration of a
- * component instance.
- * @param conf : the configuration to test
- * @return true if the configuration is acceptable
- * @see org.apache.felix.ipojo.Factory#isAcceptable(java.util.Dictionary)
- */
- public boolean isAcceptable(Dictionary conf) {
- return m_delegate.isAcceptable(conf);
- }
-
- /**
- * Reconfigure an instance already created. This configuration need to have
- * the name property to identify the instance.
- * @param conf : the configuration to reconfigure the instance.
- * @throws UnacceptableConfiguration : if the given configuration is not
- * consistent for the targeted instance.
- * @throws MissingHandlerException : when at least one handler is missing
- * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
- */
- public void reconfigure(Dictionary conf) throws UnacceptableConfiguration, MissingHandlerException {
- m_delegate.reconfigure(conf);
- }
-
- /**
- * Add a factory listener.
- * @param l : the listener to add.
- * @see org.apache.felix.ipojo.Factory#addFactoryStateListener(org.apache.felix.ipojo.FactoryStateListener)
- */
- public void addFactoryStateListener(FactoryStateListener l) {
- m_delegate.addFactoryStateListener(l);
-
- }
-
- public List getMissingHandlers() {
- return m_delegate.getMissingHandlers();
- }
-
- public List getRequiredHandlers() {
- return m_delegate.getRequiredHandlers();
- }
-
- /**
- * Remove a service listener.
- * @param l : the listener to remove
- * @see org.apache.felix.ipojo.Factory#removeFactoryStateListener(org.apache.felix.ipojo.FactoryStateListener)
- */
- public void removeFactoryStateListener(FactoryStateListener l) {
- m_delegate.removeFactoryStateListener(l);
-
- }
-
- public ComponentDescription getComponentDescription() {
- return m_delegate.getComponentDescription();
- }
-
- public String getClassName() {
- return m_delegate.getClassName();
- }
-
- public int getState() {
- return m_delegate.getState();
- }
-
- public BundleContext getBundleContext() {
- return m_delegate.getBundleContext();
- }
-
-}
+/*
+ * 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.composite;
+
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.FactoryStateListener;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.metadata.Element;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Bridge representing a Factory inside a composition.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class FactoryProxy implements Factory {
+
+ /**
+ * Delegated factory.
+ */
+ private Factory m_delegate;
+
+ /**
+ * Destination context.
+ */
+ private ServiceContext m_context;
+
+ /**
+ * Constructor.
+ * @param fact : the targeted factory.
+ * @param svcContext : the service context to target.
+ */
+ public FactoryProxy(Factory fact, ServiceContext svcContext) {
+ m_delegate = fact;
+ m_context = svcContext;
+ }
+
+ /**
+ * Create an instance manager (i.e. component type instance).
+ * @param configuration : the configuration properties for this component.
+ * @return the created instance manager.
+ * @throws UnacceptableConfiguration : when a given configuration is not valid.
+ * @throws MissingHandlerException : occurs when the creation failed due to a missing handler (the factory should be invalid)
+ * @throws ConfigurationException : occurs when the creation failed due to a configuration issue
+ * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
+ */
+ public ComponentInstance createComponentInstance(Dictionary configuration) throws UnacceptableConfiguration, MissingHandlerException,
+ ConfigurationException {
+ return m_delegate.createComponentInstance(configuration, m_context);
+ }
+
+ /**
+ * Create an instance manager (i.e. component type instance). This has these service interaction in the scope given in argument.
+ * @param configuration : the configuration properties for this component.
+ * @param serviceContext : the service context of the component.
+ * @return the created instance manager.
+ * @throws UnacceptableConfiguration : when the given configuration is not valid.
+ * @throws MissingHandlerException : when at least one handler is missing.
+ * @throws ConfigurationException : when an issue occurs during the oconfiguration of the instance.
+ * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary, org.apache.felix.ipojo.ServiceContext)
+ */
+ public ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration,
+ MissingHandlerException, ConfigurationException {
+ return m_delegate.createComponentInstance(configuration, serviceContext);
+ }
+
+ /**
+ * Get the component type information containing provided service, configuration properties ...
+ * @return the component type information.
+ * @see org.apache.felix.ipojo.Factory#getDescription()
+ */
+ public Element getDescription() {
+ return m_delegate.getDescription();
+ }
+
+ /**
+ * Return the factory name.
+ * @return the name of the factory.
+ * @see org.apache.felix.ipojo.Factory#getName()
+ */
+ public String getName() {
+ return m_delegate.getName();
+ }
+
+ /**
+ * Check if the given configuration is acceptable as a configuration of a component instance.
+ * @param conf : the configuration to test
+ * @return true if the configuration is acceptable
+ * @see org.apache.felix.ipojo.Factory#isAcceptable(java.util.Dictionary)
+ */
+ public boolean isAcceptable(Dictionary conf) {
+ return m_delegate.isAcceptable(conf);
+ }
+
+ /**
+ * Reconfigure an instance already created. This configuration need to have the name property to identify the instance.
+ * @param conf : the configuration to reconfigure the instance.
+ * @throws UnacceptableConfiguration : if the given configuration is not consistent for the targeted instance.
+ * @throws MissingHandlerException : when at least one handler is missing
+ * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
+ */
+ public void reconfigure(Dictionary conf) throws UnacceptableConfiguration, MissingHandlerException {
+ m_delegate.reconfigure(conf);
+ }
+
+ /**
+ * Add a factory listener.
+ * @param listener : the listener to add.
+ * @see org.apache.felix.ipojo.Factory#addFactoryStateListener(org.apache.felix.ipojo.FactoryStateListener)
+ */
+ public void addFactoryStateListener(FactoryStateListener listener) {
+ m_delegate.addFactoryStateListener(listener);
+
+ }
+
+ public List getMissingHandlers() {
+ return m_delegate.getMissingHandlers();
+ }
+
+ public List getRequiredHandlers() {
+ return m_delegate.getRequiredHandlers();
+ }
+
+ /**
+ * Remove a service listener.
+ * @param listener : the listener to remove
+ * @see org.apache.felix.ipojo.Factory#removeFactoryStateListener(org.apache.felix.ipojo.FactoryStateListener)
+ */
+ public void removeFactoryStateListener(FactoryStateListener listener) {
+ m_delegate.removeFactoryStateListener(listener);
+
+ }
+
+ public ComponentTypeDescription getComponentDescription() {
+ return m_delegate.getComponentDescription();
+ }
+
+ public String getClassName() {
+ return m_delegate.getClassName();
+ }
+
+ public int getState() {
+ return m_delegate.getState();
+ }
+
+ public BundleContext getBundleContext() {
+ return m_delegate.getBundleContext();
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java
similarity index 91%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java
index ff9ab36..e5554b1 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/architecture/ArchitectureHandler.java
@@ -1,76 +1,77 @@
-/*
- * 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.composite.architecture;
-
-import java.util.Dictionary;
-
-import org.apache.felix.ipojo.CompositeHandler;
-import org.apache.felix.ipojo.architecture.Architecture;
-import org.apache.felix.ipojo.architecture.InstanceDescription;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.util.Logger;
-
-/**
- * Composite Architecture Handler.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ArchitectureHandler extends CompositeHandler implements Architecture {
-
- /**
- * Name of the component.
- */
- private String m_name;
-
- /**
- * Configure the handler.
- *
- * @param metadata : the metadata of the component
- * @param configuration : the instance configuration
- * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager,
- * org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
- */
- public void configure(Element metadata, Dictionary configuration) {
- m_name = (String) configuration.get("name");
- }
-
- /**
- * Stop the handler.
- * @see org.apache.felix.ipojo.Handler#stop()
- */
- public void stop() { }
-
- /**
- * Start the handler.
- * @see org.apache.felix.ipojo.Handler#start()
- */
- public void start() {
- log(Logger.INFO, "Start composite architecture handler with " + m_name + " name");
- }
-
- /**
- * Get the instance description.
- * @return the instance description
- * @see org.apache.felix.ipojo.architecture.Architecture#getDescription()
- */
- public InstanceDescription getInstanceDescription() {
- return getCompositeManager().getInstanceDescription();
- }
-
-}
+/*
+ * 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.composite.architecture;
+
+import java.util.Dictionary;
+
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.composite.CompositeHandler;
+import org.apache.felix.ipojo.metadata.Element;
+
+/**
+ * Composite Architecture Handler.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ArchitectureHandler extends CompositeHandler implements Architecture {
+
+ /**
+ * Name of the component.
+ */
+ private String m_name;
+
+ /**
+ * Configure the handler.
+ *
+ * @param metadata : the metadata of the component
+ * @param configuration : the instance configuration
+ * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager,
+ * org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+ */
+ public void configure(Element metadata, Dictionary configuration) {
+ m_name = (String) configuration.get("name");
+ }
+
+ /**
+ * Stop the handler.
+ * @see org.apache.felix.ipojo.Handler#stop()
+ */
+ public void stop() {
+ // Nothing to do.
+ }
+
+ /**
+ * Start the handler.
+ * @see org.apache.felix.ipojo.Handler#start()
+ */
+ public void start() {
+ info("Start composite architecture handler with " + m_name + " name");
+ }
+
+ /**
+ * Get the instance description.
+ * @return the instance description
+ * @see org.apache.felix.ipojo.architecture.Architecture#getDescription()
+ */
+ public InstanceDescription getInstanceDescription() {
+ return getCompositeManager().getInstanceDescription();
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
similarity index 81%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
index b4f82b9..3443073 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandler.java
@@ -1,406 +1,402 @@
-/*
- * 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.composite.instance;
-
-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.CompositeHandler;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.Factory;
-import org.apache.felix.ipojo.InstanceManager;
-import org.apache.felix.ipojo.InstanceStateListener;
-import org.apache.felix.ipojo.MissingHandlerException;
-import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.UnacceptableConfiguration;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.parser.ParseException;
-import org.apache.felix.ipojo.util.Logger;
-
-/**
- * Composite Instance Handler.
- * This handler allows creating an instance inside a composite.
- * This instance is determine by its type and a configuration.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class InstanceHandler extends CompositeHandler implements InstanceStateListener {
-
- /**
- * Internal context.
- */
- private ServiceContext m_scope;
-
- /**
- * Is the handler valid ?
- * (Lifecycle controller)
- */
- private boolean m_isValid = false;
-
- /**
- * Available factories.
- */
- private Factory[] m_factories;
-
-
- /**
- * This structure aims to manage a configuration. It stores all necessary
- * information to create an instance and to track the factory.
- */
- class ManagedConfiguration {
- /**
- * Configuration of the instance to create.
- */
- private Dictionary m_configuration;
-
- /**
- * Factory name.
- */
- private String m_factoryName;
-
- /**
- * Created instance.
- */
- private ComponentInstance m_instance;
-
- /**
- * Desired Factory (can be the classname).
- */
- private String m_desiredFactory;
-
- /**
- * Constructor.
- *
- * @param conf : the configuration to create.
- */
- ManagedConfiguration(Dictionary conf) {
- m_configuration = conf;
- m_desiredFactory = (String) conf.get("component");
- }
-
- /**
- * Return the managed configuration.
- * @return the configuration.
- */
- Dictionary getConfiguration() {
- return m_configuration;
- }
-
- /**
- * Return the used factory name.
- * @return the factory name
- */
- String getFactory() {
- return m_factoryName;
- }
-
- String getNeededFactoryName() {
- return m_desiredFactory;
- }
-
- /**
- * Return the created instance.
- * @return the instance (or null if no instance are created).
- */
- ComponentInstance getInstance() {
- return m_instance;
- }
-
- /**
- * Set the factory name.
- *
- * @param name : the factory name.
- */
- void setFactory(String name) {
- m_factoryName = name;
- }
-
- /**
- * Set the instance object.
- *
- * @param instance : the instance
- */
- void setInstance(ComponentInstance instance) {
- m_instance = instance;
- }
- }
-
- /**
- * Configurations to create and maintains.
- */
- private ManagedConfiguration[] m_configurations = new ManagedConfiguration[0];
-
- /**
- * Create an instance using the given factory and the given configuration.
- *
- * @param fact : the factory name to used.
- * @param config : the configuration.
- */
- private void createInstance(Factory fact, ManagedConfiguration config) {
- Dictionary conf = config.getConfiguration();
- try {
- config.setInstance(fact.createComponentInstance(conf, m_scope));
- config.setFactory(fact.getName());
- config.getInstance().addInstanceStateListener(this);
- } catch (UnacceptableConfiguration e) {
- log(Logger.ERROR, "A factory is available for the configuration but the configuration is not acceptable", e);
- } catch (MissingHandlerException e) {
- log(Logger.ERROR, "The instance creation has failed, at least one handler is missing", e);
- } catch (ConfigurationException e) {
- log(Logger.ERROR, "The instance creation has failed, an error during the configuration has occured", e);
- }
- }
-
- /**
- * A new valid factory appears.
- * @param f : factory.
- */
- public void bindFactory(Factory f) {
- boolean implicated = false;
- String factName = f.getName();
- String className = f.getComponentDescription().getClassName();
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() == null && (m_configurations[i].getNeededFactoryName().equals(factName) || m_configurations[i].getNeededFactoryName().equals(className))) {
- createInstance(f, m_configurations[i]);
- implicated = true;
- }
- }
- if (implicated && ! m_isValid) {
- checkValidity();
- }
- }
-
- /**
- * An existing factory disappears or becomes invalid.
- * @param f : factory
- */
- public void unbindFactory(Factory f) {
- boolean implicated = false;
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() != null && m_configurations[i].getFactory().equals(f.getName())) {
- m_configurations[i].setInstance(null);
- m_configurations[i].setFactory(null);
- implicated = true;
- }
- }
- if (implicated && m_isValid) {
- checkValidity();
- }
- }
-
- /**
- * Stop all created instances.
- */
- public synchronized void stop() {
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() != null) {
- m_configurations[i].getInstance().removeInstanceStateListener(this);
- if (m_configurations[i].getInstance().getState() != ComponentInstance.DISPOSED) {
- m_configurations[i].getInstance().dispose();
- }
- }
- m_configurations[i].setInstance(null);
- m_configurations[i].setFactory(null);
- }
- m_configurations = new ManagedConfiguration[0];
- }
-
- /**
- * Configure method.
- * @param metadata : component type metadata.
- * @param configuration : instance configuration.
- * @throws ConfigurationException : occurs an instance cannot be parsed correctly.
- * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
- */
- public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
- m_scope = getCompositeManager().getServiceContext();
- Element[] instances = metadata.getElements("instance");
- m_configurations = new ManagedConfiguration[instances.length];
- for (int i = 0; i < instances.length; i++) {
- Dictionary conf = null;
- try {
- conf = parseInstance(instances[i]);
- } catch (ParseException e) {
- log(Logger.ERROR, "An instance cannot be parsed correctly", e);
- throw new ConfigurationException("An instance cannot be parsed correctly : " + e.getMessage());
- }
- m_configurations[i] = new ManagedConfiguration(conf);
- }
- }
-
- /**
- * Parse an Element to get a dictionary.
- * @param instance : the Element describing an instance.
- * @return : the resulting dictionary
- * @throws ParseException : occurs when a configuration cannot be parse correctly.
- */
- private Dictionary parseInstance(Element instance) throws ParseException {
- Dictionary dict = new Properties();
- String name = instance.getAttribute("name");
- if (name != null) {
- dict.put("name", name);
- }
-
- String comp = instance.getAttribute("component");
- if (comp == null) {
- throw new ParseException("An instance does not have the 'component' attribute");
- } else {
- dict.put("component", comp);
- }
-
- for (int i = 0; i < instance.getElements("property").length; i++) {
- parseProperty(instance.getElements("property")[i], dict);
- }
-
- return dict;
- }
-
- /**
- * Parse a property.
- * @param prop : the current element to parse
- * @param dict : the dictionary to populate
- * @throws ParseException : occurs if the property cannot be parsed correctly
- */
- private void parseProperty(Element prop, Dictionary dict) throws ParseException {
- // Check that the property has a name
- String name = prop.getAttribute("name");
- String value = prop.getAttribute("value");
- if (name == null) { throw new ParseException("A property does not have the 'name' attribute"); }
- // Final case : the property element has a 'value' attribute
- if (value != null) {
- dict.put(name, value);
- } else {
- // Recursive case
- // Check if there is 'property' element
- Element[] subProps = prop.getElements("property");
- if (subProps.length == 0) { throw new ParseException("A complex property must have at least one 'property' sub-element"); }
- Dictionary dict2 = new Properties();
- for (int i = 0; i < subProps.length; i++) {
- parseProperty(subProps[i], dict2);
- dict.put(prop.getAttribute("name"), dict2);
- }
- }
- }
-
- /**
- * Start method.
- * @see org.apache.felix.ipojo.CompositeHandler#start()
- */
- public void start() {
- for (int j = 0; j < m_factories.length; j++) {
- String factName = m_factories[j].getName();
- String className = m_factories[j].getClassName();
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() == null && (m_configurations[i].getNeededFactoryName().equals(factName) || m_configurations[i].getNeededFactoryName().equals(className))) {
- createInstance(m_factories[j], m_configurations[i]);
- }
- }
- }
-
- checkValidity();
- }
-
- /**
- * Check handler validity.
- * The method update the m_validity field.
- * @return the new validity.
- */
- private boolean checkValidity() {
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() == null || m_configurations[i].getInstance().getState() != ComponentInstance.VALID) {
- m_isValid = false;
- return false;
- }
- }
- m_isValid = true;
- return true;
- }
-
- /**
- * Instance state listener.
- * This method listens when managed instance states change.
- * @param instance : instance
- * @param newState : the now state of the given instance
- * @see org.apache.felix.ipojo.InstanceStateListener#stateChanged(org.apache.felix.ipojo.ComponentInstance, int)
- */
- public void stateChanged(ComponentInstance instance, int newState) {
- switch (newState) {
- case ComponentInstance.DISPOSED:
- case ComponentInstance.STOPPED:
- break; // Should not happen
- case ComponentInstance.VALID:
- if (!m_isValid) {
- checkValidity();
- }
- break;
- case ComponentInstance.INVALID:
- if (m_isValid) {
- checkValidity();
- }
- break;
- default:
- break;
-
- }
- }
-
- /**
- * Method returning an instance object of the given component type.
- * This method must be called only on 'primitive' type.
- * @param type : type.
- * @return an instance object or null if not found.
- */
- public Object getObjectFromInstance(String type) {
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() != null && type.equals(m_configurations[i].getFactory()) && m_configurations[i].getInstance().getState() == ComponentInstance.VALID) {
- return ((InstanceManager) m_configurations[i].getInstance()).getPojoObject();
- }
- }
- return null;
- }
-
- /**
- * Return the handler description, i.e. the state of created instances.
- * @return the handler description.
- * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
- */
- public HandlerDescription getDescription() {
- List l = new ArrayList();
- for (int i = 0; i < m_configurations.length; i++) {
- l.add(m_configurations[i]);
- }
- return new InstanceHandlerDescription(this, l);
- }
-
- /**
- * Get the list of used component type.
- * @return the list containing the used component type
- */
- public List getUsedType() {
- List result = new ArrayList();
- for (int i = 0; i < m_configurations.length; i++) {
- result.add(m_configurations[i].getConfiguration().get("component"));
- }
- return result;
- }
-
-}
+/*
+ * 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.composite.instance;
+
+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.ConfigurationException;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.InstanceStateListener;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.composite.CompositeHandler;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ParseException;
+
+/**
+ * Composite Instance Handler.
+ * This handler allows creating an instance inside a composite.
+ * This instance is determine by its type and a configuration.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class InstanceHandler extends CompositeHandler implements InstanceStateListener {
+
+ /**
+ * Internal context.
+ */
+ private ServiceContext m_scope;
+
+ /**
+ * Available factories.
+ */
+ private Factory[] m_factories;
+
+
+ /**
+ * This structure aims to manage a configuration. It stores all necessary
+ * information to create an instance and to track the factory.
+ */
+ class ManagedConfiguration {
+ /**
+ * Configuration of the instance to create.
+ */
+ private Dictionary m_configuration;
+
+ /**
+ * Factory name.
+ */
+ private String m_factoryName;
+
+ /**
+ * Created instance.
+ */
+ private ComponentInstance m_instance;
+
+ /**
+ * Desired Factory (can be the classname).
+ */
+ private String m_desiredFactory;
+
+ /**
+ * Constructor.
+ *
+ * @param conf : the configuration to create.
+ */
+ ManagedConfiguration(Dictionary conf) {
+ m_configuration = conf;
+ m_desiredFactory = (String) conf.get("component");
+ }
+
+ /**
+ * Return the managed configuration.
+ * @return the configuration.
+ */
+ protected Dictionary getConfiguration() {
+ return m_configuration;
+ }
+
+ /**
+ * Return the used factory name.
+ * @return the factory name
+ */
+ protected String getFactory() {
+ return m_factoryName;
+ }
+
+ protected String getNeededFactoryName() {
+ return m_desiredFactory;
+ }
+
+ /**
+ * Return the created instance.
+ * @return the instance (or null if no instance are created).
+ */
+ protected ComponentInstance getInstance() {
+ return m_instance;
+ }
+
+ /**
+ * Set the factory name.
+ *
+ * @param name : the factory name.
+ */
+ protected void setFactory(String name) {
+ m_factoryName = name;
+ }
+
+ /**
+ * Set the instance object.
+ *
+ * @param instance : the instance
+ */
+ protected void setInstance(ComponentInstance instance) {
+ m_instance = instance;
+ }
+ }
+
+ /**
+ * Configurations to create and maintains.
+ */
+ private ManagedConfiguration[] m_configurations = new ManagedConfiguration[0];
+
+ /**
+ * Create an instance using the given factory and the given configuration.
+ *
+ * @param fact : the factory name to used.
+ * @param config : the configuration.
+ */
+ private void createInstance(Factory fact, ManagedConfiguration config) {
+ Dictionary conf = config.getConfiguration();
+ try {
+ config.setInstance(fact.createComponentInstance(conf, m_scope));
+ config.setFactory(fact.getName());
+ config.getInstance().addInstanceStateListener(this);
+ } catch (UnacceptableConfiguration e) {
+ error("A factory is available for the configuration but the configuration is not acceptable", e);
+ } catch (MissingHandlerException e) {
+ error("The instance creation has failed, at least one handler is missing", e);
+ } catch (ConfigurationException e) {
+ error("The instance creation has failed, an error during the configuration has occured", e);
+ }
+ }
+
+ /**
+ * A new valid factory appears.
+ * @param factory : factory.
+ */
+ public void bindFactory(Factory factory) {
+ boolean implicated = false;
+ String factName = factory.getName();
+ String className = factory.getComponentDescription().getClassName();
+ for (int i = 0; i < m_configurations.length; i++) {
+ if (m_configurations[i].getInstance() == null && (m_configurations[i].getNeededFactoryName().equals(factName) || m_configurations[i].getNeededFactoryName().equals(className))) {
+ createInstance(factory, m_configurations[i]);
+ implicated = true;
+ }
+ }
+ if (implicated && ! getValidity()) {
+ checkValidity();
+ }
+ }
+
+ /**
+ * An existing factory disappears or becomes invalid.
+ * @param factory : factory
+ */
+ public void unbindFactory(Factory factory) {
+ boolean implicated = false;
+ for (int i = 0; i < m_configurations.length; i++) {
+ if (m_configurations[i].getInstance() != null && m_configurations[i].getFactory().equals(factory.getName())) {
+ m_configurations[i].setInstance(null);
+ m_configurations[i].setFactory(null);
+ implicated = true;
+ }
+ }
+ if (implicated && getValidity()) {
+ checkValidity();
+ }
+ }
+
+ /**
+ * Stop all created instances.
+ */
+ public synchronized void stop() {
+ for (int i = 0; i < m_configurations.length; i++) {
+ if (m_configurations[i].getInstance() != null) {
+ m_configurations[i].getInstance().removeInstanceStateListener(this);
+ if (m_configurations[i].getInstance().getState() != ComponentInstance.DISPOSED) {
+ m_configurations[i].getInstance().dispose();
+ }
+ }
+ m_configurations[i].setInstance(null);
+ m_configurations[i].setFactory(null);
+ }
+ m_configurations = new ManagedConfiguration[0];
+ }
+
+ /**
+ * Configure method.
+ * @param metadata : component type metadata.
+ * @param configuration : instance configuration.
+ * @throws ConfigurationException : occurs an instance cannot be parsed correctly.
+ * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+ */
+ public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
+ m_scope = getCompositeManager().getServiceContext();
+ Element[] instances = metadata.getElements("instance");
+ m_configurations = new ManagedConfiguration[instances.length];
+ for (int i = 0; i < instances.length; i++) {
+ Dictionary conf = null;
+ try {
+ conf = parseInstance(instances[i]);
+ } catch (ParseException e) {
+ error("An instance cannot be parsed correctly", e);
+ throw new ConfigurationException("An instance cannot be parsed correctly : " + e.getMessage());
+ }
+ m_configurations[i] = new ManagedConfiguration(conf);
+ }
+ }
+
+ /**
+ * Parse an Element to get a dictionary.
+ * @param instance : the Element describing an instance.
+ * @return : the resulting dictionary
+ * @throws ParseException : occurs when a configuration cannot be parse correctly.
+ */
+ public static Dictionary parseInstance(Element instance) throws ParseException {
+ Dictionary dict = new Properties();
+ String name = instance.getAttribute("name");
+ if (name != null) {
+ dict.put("name", name);
+ }
+
+ String comp = instance.getAttribute("component");
+ if (comp == null) {
+ throw new ParseException("An instance does not have the 'component' attribute");
+ } else {
+ dict.put("component", comp);
+ }
+
+ Element[] props = instance.getElements("property");
+ for (int i = 0; props != null && i < props.length; i++) {
+ parseProperty(props[i], dict);
+ }
+
+ return dict;
+ }
+
+ /**
+ * Parse a property.
+ * @param prop : the current element to parse
+ * @param dict : the dictionary to populate
+ * @throws ParseException : occurs if the property cannot be parsed correctly
+ */
+ public static void parseProperty(Element prop, Dictionary dict) throws ParseException {
+ // Check that the property has a name
+ String name = prop.getAttribute("name");
+ String value = prop.getAttribute("value");
+ if (name == null) { throw new ParseException("A property does not have the 'name' attribute"); }
+ // Final case : the property element has a 'value' attribute
+ if (value == null) {
+ // Recursive case
+ // Check if there is 'property' element
+ Element[] subProps = prop.getElements("property");
+ if (subProps == null) { throw new ParseException("A complex property must have at least one 'property' sub-element"); }
+ Dictionary dict2 = new Properties();
+ for (int i = 0; i < subProps.length; i++) {
+ parseProperty(subProps[i], dict2);
+ dict.put(prop.getAttribute("name"), dict2);
+ }
+ } else {
+ dict.put(name, value);
+ }
+ }
+
+ /**
+ * Start method.
+ * @see org.apache.felix.ipojo.CompositeHandler#start()
+ */
+ public void start() {
+ for (int j = 0; j < m_factories.length; j++) {
+ String factName = m_factories[j].getName();
+ String className = m_factories[j].getClassName();
+ for (int i = 0; i < m_configurations.length; i++) {
+ if (m_configurations[i].getInstance() == null && (m_configurations[i].getNeededFactoryName().equals(factName) || m_configurations[i].getNeededFactoryName().equals(className))) {
+ createInstance(m_factories[j], m_configurations[i]);
+ }
+ }
+ }
+ checkValidity();
+ }
+
+ /**
+ * Check handler validity.
+ * The method update the validaity of the handler.
+ */
+ private void checkValidity() {
+ for (int i = 0; i < m_configurations.length; i++) {
+ if (m_configurations[i].getInstance() == null || m_configurations[i].getInstance().getState() != ComponentInstance.VALID) {
+ setValidity(false);
+ return;
+ }
+ }
+ setValidity(true);
+ }
+
+ /**
+ * Instance state listener.
+ * This method listens when managed instance states change.
+ * @param instance : instance
+ * @param newState : the now state of the given instance
+ * @see org.apache.felix.ipojo.InstanceStateListener#stateChanged(org.apache.felix.ipojo.ComponentInstance, int)
+ */
+ public void stateChanged(ComponentInstance instance, int newState) {
+ switch (newState) {
+ case ComponentInstance.DISPOSED:
+ case ComponentInstance.STOPPED:
+ break; // Should not happen
+ case ComponentInstance.VALID:
+ if (!getValidity()) {
+ checkValidity();
+ }
+ break;
+ case ComponentInstance.INVALID:
+ if (getValidity()) {
+ checkValidity();
+ }
+ break;
+ default:
+ break;
+
+ }
+ }
+
+ /**
+ * Method returning an instance object of the given component type.
+ * This method must be called only on 'primitive' type.
+ * @param type : type.
+ * @return an instance object or null if not found.
+ */
+ public Object getObjectFromInstance(String type) {
+ for (int i = 0; i < m_configurations.length; i++) {
+ if (m_configurations[i].getInstance() != null && type.equals(m_configurations[i].getFactory())) {
+ if (m_configurations[i].getInstance().getState() == ComponentInstance.VALID) {
+ return ((InstanceManager) m_configurations[i].getInstance()).getPojoObject();
+ } else {
+ error("An object cannot be get from the instance of the type " + type + ": invalid instance" + m_configurations[i].getInstance().getInstanceDescription().getDescription());
+ return null;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Return the handler description, i.e. the state of created instances.
+ * @return the handler description.
+ * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
+ */
+ public HandlerDescription getDescription() {
+ List list = new ArrayList();
+ for (int i = 0; i < m_configurations.length; i++) {
+ list.add(m_configurations[i]);
+ }
+ return new InstanceHandlerDescription(this, list);
+ }
+
+ /**
+ * Get the list of used component type.
+ * @return the list containing the used component type
+ */
+ public List getUsedType() {
+ List result = new ArrayList();
+ for (int i = 0; i < m_configurations.length; i++) {
+ result.add(m_configurations[i].getConfiguration().get("component"));
+ }
+ return result;
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java
similarity index 93%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java
index 844e3e6..2be1122 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/instance/InstanceHandlerDescription.java
@@ -1,90 +1,90 @@
-/*
- * 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.composite.instance;
-
-import java.util.List;
-
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.CompositeHandler;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.composite.instance.InstanceHandler.ManagedConfiguration;
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-
-/**
- * Description of the Instance Handler.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class InstanceHandlerDescription extends HandlerDescription {
-
- /**
- * List of managed instances.
- */
- private List m_instances;
-
- /**
- * Constructor.
- *
- * @param h : handler
- * @param insts : list of component instances
- */
- public InstanceHandlerDescription(CompositeHandler h, List insts) {
- super(h);
- m_instances = insts;
- }
-
- /**
- * Build handler description.
- * @return the handler description
- * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
- */
- public Element getHandlerInfo() {
- Element instances = super.getHandlerInfo();
- for (int i = 0; i < m_instances.size(); i++) {
- ManagedConfiguration inst = (ManagedConfiguration) m_instances.get(i);
- Element instance = new Element("Instance", "");
- if (inst.getInstance() != null) {
- instance.addAttribute(new Attribute("Factory", inst.getFactory()));
- instance.addAttribute(new Attribute("Name", inst.getInstance().getInstanceName()));
- String state = null;
- switch(inst.getInstance().getState()) {
- case ComponentInstance.DISPOSED :
- state = "disposed"; break;
- case ComponentInstance.STOPPED :
- state = "stopped"; break;
- case ComponentInstance.VALID :
- state = "valid"; break;
- case ComponentInstance.INVALID :
- state = "invalid"; break;
- default :
- break;
- }
- instance.addAttribute(new Attribute("State", state));
- instance.addElement(inst.getInstance().getInstanceDescription().getDescription());
- } else {
- instance.addAttribute(new Attribute("Factory", inst.getConfiguration().get("component").toString()));
- instance.addAttribute(new Attribute("State", "Not Available"));
- }
- instances.addElement(instance);
- }
- return instances;
- }
-
-}
+/*
+ * 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.composite.instance;
+
+import java.util.List;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.composite.CompositeHandler;
+import org.apache.felix.ipojo.composite.instance.InstanceHandler.ManagedConfiguration;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+
+/**
+ * Description of the Instance Handler.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class InstanceHandlerDescription extends HandlerDescription {
+
+ /**
+ * List of managed instances.
+ */
+ private List m_instances;
+
+ /**
+ * Constructor.
+ *
+ * @param handler : handler
+ * @param insts : list of component instances
+ */
+ public InstanceHandlerDescription(CompositeHandler handler, List insts) {
+ super(handler);
+ m_instances = insts;
+ }
+
+ /**
+ * Build handler description.
+ * @return the handler description
+ * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+ */
+ public Element getHandlerInfo() {
+ Element instances = super.getHandlerInfo();
+ for (int i = 0; i < m_instances.size(); i++) {
+ ManagedConfiguration inst = (ManagedConfiguration) m_instances.get(i);
+ Element instance = new Element("Instance", "");
+ if (inst.getInstance() == null) {
+ instance.addAttribute(new Attribute("Factory", inst.getConfiguration().get("component").toString()));
+ instance.addAttribute(new Attribute("State", "Not Available"));
+ } else {
+ instance.addAttribute(new Attribute("Factory", inst.getFactory()));
+ instance.addAttribute(new Attribute("Name", inst.getInstance().getInstanceName()));
+ String state = null;
+ switch(inst.getInstance().getState()) {
+ case ComponentInstance.DISPOSED :
+ state = "disposed"; break;
+ case ComponentInstance.STOPPED :
+ state = "stopped"; break;
+ case ComponentInstance.VALID :
+ state = "valid"; break;
+ case ComponentInstance.INVALID :
+ state = "invalid"; break;
+ default :
+ break;
+ }
+ instance.addAttribute(new Attribute("State", state));
+ instance.addElement(inst.getInstance().getInstanceDescription().getDescription());
+ }
+ instances.addElement(instance);
+ }
+ return instances;
+ }
+
+}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java
new file mode 100644
index 0000000..76f912c
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceDependencyHandler.java
@@ -0,0 +1,371 @@
+/*
+ * 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.composite.service.instantiator;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.PolicyServiceContext;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.composite.CompositeHandler;
+import org.apache.felix.ipojo.composite.instance.InstanceHandler;
+import org.apache.felix.ipojo.composite.util.SourceManager;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ParseException;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.apache.felix.ipojo.util.DependencyStateListener;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+
+/**
+ * Service Instantiator Class. This handler allows to instantiate service
+ * instance inside the composition.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ServiceDependencyHandler extends CompositeHandler implements DependencyStateListener {
+
+ /**
+ * List of instances to manage.
+ */
+ private List/* <SvcInstance> */m_instances = new ArrayList();
+
+ /**
+ * List of importers.
+ */
+ private List/* <ServiceImporter> */ m_importers = new ArrayList();
+
+ /**
+ * Flag indicating if the handler has already finished the start method.
+ */
+ private boolean m_isStarted;
+
+ /**
+ * Source Managers.
+ */
+ private List m_sources;
+
+
+ /**
+ * Create a Service instance object form the given Element.
+ * This method parse the given element and configure the service instance object.
+ * @param service : the Element describing the service instance
+ * @throws ConfigurationException : the service instance cannot be created correctly
+ */
+ private void createServiceInstance(Element service) throws ConfigurationException {
+ String spec = service.getAttribute("specification");
+ if (spec == null) {
+ throw new ConfigurationException("Malformed service : the specification attribute is mandatory");
+ }
+ String filter = "(&(!(factory.name=" + getCompositeManager().getFactory().getComponentDescription().getName() + "))(factory.state=1))"; // Cannot reinstantiate yourself
+ String givenFilter = service.getAttribute("filter");
+ if (givenFilter != null) {
+ filter = "(&" + filter + givenFilter + ")"; //NOPMD
+ }
+
+ Filter fil;
+ try {
+ fil = getCompositeManager().getGlobalContext().createFilter(filter);
+ } catch (InvalidSyntaxException e) {
+ throw new ConfigurationException("Malformed filter " + filter + " : " + e.getMessage());
+ }
+
+ Properties prop = new Properties();
+ Element[] props = service.getElements("property");
+ for (int k = 0; props != null && k < props.length; k++) {
+ try {
+ InstanceHandler.parseProperty(props[k], prop);
+ } catch (ParseException e) {
+ throw new ConfigurationException("An instance configuration is invalid : " + e.getMessage());
+ }
+ }
+
+ String aggregate = service.getAttribute("aggregate");
+ boolean agg = aggregate != null && aggregate.equalsIgnoreCase("true");
+
+ String optional = service.getAttribute("optional");
+ boolean opt = optional != null && optional.equalsIgnoreCase("true");
+
+ int policy = DependencyModel.getPolicy(service);
+
+ Comparator cmp = DependencyModel.getComparator(service, getCompositeManager().getGlobalContext());
+
+ SvcInstance inst = new SvcInstance(this, spec, prop, agg, opt, fil, cmp, policy);
+ m_instances.add(inst);
+
+ String sources = service.getAttribute("context-source");
+ if (sources != null) {
+ SourceManager source = new SourceManager(sources, filter, inst, getCompositeManager());
+ if (m_sources == null) {
+ m_sources = new ArrayList(1);
+ }
+ m_sources.add(source);
+ }
+ }
+
+ /**
+ * Create a Service importer object from the given Element.
+ * This method parse the given element and configure the service importer object.
+ * @param imp : Element describing the import
+ * @param confFilter : instance filter customization
+ * @throws ConfigurationException : the service importer cannot be created correctly
+ */
+ private void createServiceImport(Element imp, Dictionary confFilter) throws ConfigurationException {
+ boolean optional = false;
+ boolean aggregate = false;
+ String specification = imp.getAttribute("specification");
+
+ if (specification == null) {
+ // Malformed import
+ error("Malformed imports : the specification attribute is mandatory");
+ throw new ConfigurationException("Malformed imports : the specification attribute is mandatory");
+ } else {
+ String opt = imp.getAttribute("optional");
+ optional = opt != null && opt.equalsIgnoreCase("true");
+
+ String agg = imp.getAttribute("aggregate");
+ aggregate = agg != null && agg.equalsIgnoreCase("true");
+
+ String original = "(&(objectClass=" + specification + ")(!(instance.name=" + getCompositeManager().getInstanceName() + ")))"; // Cannot import yourself
+ String filter = original;
+ String givenFilter = imp.getAttribute("filter");
+ if (givenFilter != null) {
+ filter = "(&" + filter + givenFilter + ")"; //NOPMD
+ }
+
+ String identitity = imp.getAttribute("id");
+
+ String scope = imp.getAttribute("scope");
+ BundleContext context = getCompositeManager().getGlobalContext(); // Get the default bundle context.
+ if (scope != null) {
+ if (scope.equalsIgnoreCase("global")) {
+ context = new PolicyServiceContext(getCompositeManager().getGlobalContext(), getCompositeManager().getParentServiceContext(), PolicyServiceContext.GLOBAL);
+ } else if (scope.equalsIgnoreCase("composite")) {
+ context = new PolicyServiceContext(getCompositeManager().getGlobalContext(), getCompositeManager().getParentServiceContext(), PolicyServiceContext.LOCAL);
+ } else if (scope.equalsIgnoreCase("composite+global")) {
+ context = new PolicyServiceContext(getCompositeManager().getGlobalContext(), getCompositeManager().getParentServiceContext(), PolicyServiceContext.LOCAL_AND_GLOBAL);
+ }
+ }
+
+ // Configure instance filter if available
+ if (confFilter != null && identitity != null && confFilter.get(identitity) != null) {
+ filter = "(&" + original + (String) confFilter.get(identitity) + ")";
+ }
+
+ Filter fil = null;
+ if (filter != null) {
+ try {
+ fil = getCompositeManager().getGlobalContext().createFilter(filter);
+ } catch (InvalidSyntaxException e) {
+ throw new ConfigurationException("A required filter " + filter + " is malformed : " + e.getMessage());
+ }
+ }
+
+ Comparator cmp = DependencyModel.getComparator(imp, getCompositeManager().getGlobalContext());
+ Class spec = DependencyModel.loadSpecification(specification, getCompositeManager().getGlobalContext());
+ int policy = DependencyModel.getPolicy(imp);
+
+ ServiceImporter importer = new ServiceImporter(spec, fil, aggregate, optional, cmp, policy, context, identitity, this);
+ m_importers.add(importer);
+
+ String sources = imp.getAttribute("context-source");
+ if (sources != null) {
+ SourceManager source = new SourceManager(sources, filter, importer, getCompositeManager());
+ if (m_sources == null) {
+ m_sources = new ArrayList(1);
+ }
+ m_sources.add(source);
+ }
+
+ }
+ }
+
+ /**
+ * Configure the handler.
+ * @param metadata : the metadata of the component
+ * @param conf : the instance configuration
+ * @throws ConfigurationException : the specification attribute is missing
+ * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+ */
+ public void configure(Element metadata, Dictionary conf) throws ConfigurationException {
+ Element[] services = metadata.getElements("subservice");
+ // Get instance filters
+ Dictionary confFilter = null;
+ if (conf.get("requires.filters") != null) {
+ confFilter = (Dictionary) conf.get("requires.filters");
+ }
+
+ for (int i = 0; i < services.length; i++) {
+ String action = services[i].getAttribute("action");
+ if (action == null) {
+ throw new ConfigurationException("The action attribute must be set to 'instantiate' or 'import'");
+ } else if ("instantiate".equalsIgnoreCase(action)) {
+ createServiceInstance(services[i]);
+ } else if ("import".equalsIgnoreCase(action)) {
+ createServiceImport(services[i], confFilter);
+ } else {
+ throw new ConfigurationException("Unknown action : " + action);
+ }
+
+
+
+ }
+ }
+
+ /**
+ * Start the service instantiator handler.
+ * Start all created service instance.
+ * @see org.apache.felix.ipojo.CompositeHandler#start()
+ */
+ public void start() {
+ for (int i = 0; m_sources != null && i < m_sources.size(); i++) {
+ SourceManager source = (SourceManager) m_sources.get(i);
+ source.start();
+ }
+
+ for (int i = 0; i < m_importers.size(); i++) {
+ ServiceImporter imp = (ServiceImporter) m_importers.get(i);
+ imp.start();
+ }
+
+ for (int i = 0; i < m_instances.size(); i++) {
+ SvcInstance inst = (SvcInstance) m_instances.get(i);
+ inst.start();
+ }
+
+ isHandlerValid();
+ m_isStarted = true;
+ }
+
+ /**
+ * Check the handler validity.
+ * @see org.apache.felix.ipojo.CompositeHandler#isValid()
+ */
+ private void isHandlerValid() {
+ for (int i = 0; i < m_importers.size(); i++) {
+ ServiceImporter imp = (ServiceImporter) m_importers.get(i);
+ if (imp.getState() != DependencyModel.RESOLVED) {
+ setValidity(false);
+ return;
+ }
+ }
+
+ for (int i = 0; i < m_instances.size(); i++) {
+ SvcInstance inst = (SvcInstance) m_instances.get(i);
+ if (inst.getState() != DependencyModel.RESOLVED) {
+ setValidity(false);
+ return;
+ }
+ }
+
+ setValidity(true);
+ }
+
+ /**
+ * Handler stop method.
+ * Stop all created service instance.
+ * @see org.apache.felix.ipojo.CompositeHandler#stop()
+ */
+ public void stop() {
+ for (int i = 0; m_sources != null && i < m_sources.size(); i++) {
+ SourceManager source = (SourceManager) m_sources.get(i);
+ source.stop();
+ }
+
+ for (int i = 0; i < m_instances.size(); i++) {
+ SvcInstance inst = (SvcInstance) m_instances.get(i);
+ inst.stop();
+ }
+
+ for (int i = 0; i < m_importers.size(); i++) {
+ ServiceImporter imp = (ServiceImporter) m_importers.get(i);
+ imp.stop();
+ }
+
+ m_isStarted = false;
+ }
+
+ /**
+ * State change callback.
+ * This method is used to freeze the set of used provider if the static binding policy is used.
+ * @param newState : the new state of the underlying instance
+ * @see org.apache.felix.ipojo.Handler#stateChanged(int)
+ */
+ public void stateChanged(int newState) {
+ // If we are becoming valid and started, check if we need to freeze importers.
+ if (m_isStarted && newState == ComponentInstance.VALID) {
+ for (int i = 0; i < m_importers.size(); i++) {
+ ServiceImporter imp = (ServiceImporter) m_importers.get(i);
+ if (imp.getBindingPolicy() == DependencyModel.STATIC_BINDING_POLICY) {
+ imp.freeze();
+ }
+ }
+
+ for (int i = 0; i < m_instances.size(); i++) {
+ SvcInstance imp = (SvcInstance) m_instances.get(i);
+ if (imp.getBindingPolicy() == DependencyModel.STATIC_BINDING_POLICY) {
+ imp.freeze();
+ }
+ }
+ }
+ }
+
+ /**
+ * An service instance becomes valid.
+ * @param dep : dependency becoming valid.
+ */
+ public void validate(DependencyModel dep) {
+ if (!getValidity()) {
+ isHandlerValid();
+ }
+ }
+
+ /**
+ * A service instance becomes invalid.
+ * @param dep : dependency becoming valid.
+ */
+ public void invalidate(DependencyModel dep) {
+ if (getValidity()) {
+ isHandlerValid();
+ }
+ }
+
+ /**
+ * Get the service instantiator handler description.
+ * @return the description
+ * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
+ */
+ public HandlerDescription getDescription() {
+ return new ServiceInstantiatorDescription(this, m_instances, m_importers);
+ }
+
+ public List getInstances() {
+ return m_instances;
+ }
+
+ public List getRequirements() {
+ return m_importers;
+ }
+}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceImporter.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceImporter.java
new file mode 100644
index 0000000..019ebb0
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceImporter.java
@@ -0,0 +1,319 @@
+/*
+ * 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.composite.service.instantiator;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.PolicyServiceContext;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * Import a service form the parent to the internal service registry.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ServiceImporter extends DependencyModel {
+
+ /**
+ * Reference on the handler.
+ */
+ private ServiceDependencyHandler m_handler;
+
+ private final class Record {
+ /**
+ * External Reference.
+ */
+ private ServiceReference m_ref;
+
+ /**
+ * Internal Registration.
+ */
+ private ServiceRegistration m_reg;
+
+ /**
+ * Exposed Object.
+ */
+ private Object m_svcObject;
+
+ /**
+ * Constructor.
+ * @param ref : service reference.
+ */
+ protected Record(ServiceReference ref) {
+ m_ref = ref;
+ }
+
+ /**
+ * Register the current import.
+ */
+ private void register() {
+ if (m_reg != null) {
+ m_reg.unregister();
+ }
+ m_svcObject = getService(m_ref);
+ m_reg = m_handler.getCompositeManager().getServiceContext().registerService(getSpecification().getName(), m_svcObject, getProps(m_ref));
+ }
+
+ /**
+ * Update the current import.
+ */
+ private void update() {
+ if (m_reg != null) {
+ m_reg.setProperties(getProps(m_ref));
+ }
+ }
+
+ /**
+ * Unregister and release the current import.
+ */
+ private void dispose() {
+ if (m_reg != null) {
+ m_reg.unregister();
+ m_svcObject = null;
+ m_reg = null;
+ }
+ m_ref = null;
+ }
+
+ /**
+ * Test object equality.
+ * @param object : object to confront against the current object.
+ * @return true if the two objects are equals (same service reference).
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object object) {
+ if (object instanceof Record) {
+ Record rec = (Record) object;
+ return rec.m_ref == m_ref;
+ }
+ return false;
+ }
+
+ /**
+ * Hash code method.
+ * @return the hash code by calling the parent method.
+ */
+ public int hashCode() {
+ return super.hashCode();
+ }
+ }
+
+ /**
+ * List of managed records.
+ */
+ private List/*<Record>*/m_records = new ArrayList()/* <Record> */;
+
+ /**
+ * Requirement Id.
+ */
+ private String m_id;
+
+ /**
+ * Is this requirement attached to a service-level requirement.
+ */
+ private boolean m_specLevelReq;
+
+ /**
+ * Is the set of used provider frozen ?
+ */
+ private boolean m_isFrozen;
+
+ /**
+ * Constructor.
+ *
+ * @param specification : targeted specification
+ * @param filter : LDAP filter
+ * @param multiple : should the importer imports several services ?
+ * @param optional : is the import optional ?
+ * @param cmp : comparator to use for the tracking
+ * @param policy : resolving policy
+ * @param context : bundle context to use for the tracking (can be a servie context)
+ * @param identitity : requirement id (may be null)
+ * @param handler : handler
+ */
+ public ServiceImporter(Class specification, Filter filter, boolean multiple, boolean optional, Comparator cmp, int policy, BundleContext context, String identitity
+ , ServiceDependencyHandler handler) {
+ super(specification, multiple, optional, filter, cmp, policy, context, handler);
+
+ this.m_handler = handler;
+
+ if (m_id == null) {
+ m_id = super.getSpecification().getName();
+ } else {
+ m_id = identitity;
+ }
+
+ }
+
+ /**
+ * Get the properties for the exposed service from the given reference.
+ *
+ * @param ref : the reference.
+ * @return the property dictionary
+ */
+ private static Dictionary getProps(ServiceReference ref) {
+ Properties prop = new Properties();
+ String[] keys = ref.getPropertyKeys();
+ for (int i = 0; i < keys.length; i++) {
+ prop.put(keys[i], ref.getProperty(keys[i]));
+ }
+ return prop;
+ }
+
+ /**
+ * Freeze the set of used provider.
+ * This method allow to fix the set of provider when the static binding policy is used.
+ */
+ public void freeze() {
+ m_isFrozen = true;
+ }
+
+ public boolean isFrozen() {
+ return m_isFrozen;
+ }
+
+ /**
+ * Stop the management of the import.
+ */
+ public void stop() {
+
+ super.stop();
+
+ for (int i = 0; i < m_records.size(); i++) {
+ Record rec = (Record) m_records.get(i);
+ rec.dispose();
+ }
+
+ m_records.clear();
+
+ }
+
+ /**
+ * Get the record list using the given reference.
+ *
+ * @param ref : the reference
+ * @return the list containing all record using the given reference
+ */
+ private List/* <Record> */getRecordsByRef(ServiceReference ref) {
+ List list = new ArrayList();
+ for (int i = 0; i < m_records.size(); i++) {
+ Record rec = (Record) m_records.get(i);
+ if (rec.m_ref == ref) {
+ list.add(rec);
+ }
+ }
+ return list;
+ }
+
+ /**
+ * Build the list of imported service provider.
+ * @return the list of all imported services.
+ */
+ public List getProviders() {
+ List list = new ArrayList();
+ for (int i = 0; i < m_records.size(); i++) {
+ list.add((((Record) m_records.get(i)).m_ref).getProperty("instance.name"));
+ }
+ return list;
+ }
+
+ /**
+ * Set that this dependency is a service level dependency.
+ * This forces the scoping policy to be STRICT.
+ * @param b
+ */
+ public void setServiceLevelDependency() {
+ m_specLevelReq = true;
+ PolicyServiceContext context = new PolicyServiceContext(m_handler.getCompositeManager().getGlobalContext(), m_handler.getCompositeManager().getParentServiceContext(), PolicyServiceContext.LOCAL);
+ setBundleContext(context);
+ }
+
+ public String getId() {
+ return m_id;
+ }
+
+ public boolean isServiceLevelRequirement() {
+ return m_specLevelReq;
+ }
+
+ /**
+ * On Dependency Reconfiguration notification method.
+ * @param departs : leaving service references.
+ * @param arrivals : new injected service references.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onDependencyReconfiguration(org.osgi.framework.ServiceReference[], org.osgi.framework.ServiceReference[])
+ */
+ public void onDependencyReconfiguration(ServiceReference[] departs, ServiceReference[] arrivals) {
+ for (int i = 0; departs != null && i < departs.length; i++) {
+ onServiceDeparture(departs[i]);
+ }
+
+ for (int i = 0; arrivals != null && i < arrivals.length; i++) {
+ onServiceArrival(arrivals[i]);
+ }
+ }
+
+ /**
+ * A new service is injected by the tracker.
+ * This method create a 'Record' and register it.
+ * @param ref : new service reference.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onServiceArrival(org.osgi.framework.ServiceReference)
+ */
+ public void onServiceArrival(ServiceReference ref) {
+ Record rec = new Record(ref);
+ m_records.add(rec);
+ // Always register the reference, as the method is call only when needed.
+ rec.register();
+ }
+
+ /**
+ * A used service disappears.
+ * This method find the implicated 'Record', dispose it and remove it from the list.
+ * @param ref : leaving service reference.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onServiceDeparture(org.osgi.framework.ServiceReference)
+ */
+ public void onServiceDeparture(ServiceReference ref) {
+ List list = getRecordsByRef(ref);
+ for (int i = 0; i < list.size(); i++) { // Stop the implied record
+ Record rec = (Record) list.get(i);
+ rec.dispose();
+ }
+ m_records.removeAll(list);
+ }
+
+ /**
+ * A used service is modified.
+ * @param ref : modified service reference.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onServiceModification(org.osgi.framework.ServiceReference)
+ */
+ public void onServiceModification(ServiceReference ref) {
+ List list = getRecordsByRef(ref);
+ for (int i = 0; i < list.size(); i++) { // Stop the implied record
+ Record rec = (Record) list.get(i);
+ rec.update();
+ }
+ }
+
+}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java
new file mode 100644
index 0000000..2125153
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java
@@ -0,0 +1,117 @@
+/*
+ * 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.composite.service.instantiator;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.composite.CompositeHandler;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Description of the Service Creator Handler.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ServiceInstantiatorDescription extends HandlerDescription {
+
+ /**
+ * List of managed service instances.
+ */
+ private List m_instances;
+
+ /**
+ * List of exports.
+ */
+ private List m_imports;
+
+ /**
+ * Constructor.
+ *
+ * @param handler : composite handler
+ * @param insts : list of service instances
+ * @param imps : list of service importers
+ */
+ public ServiceInstantiatorDescription(CompositeHandler handler, List insts, List imps) {
+ super(handler);
+ m_instances = insts;
+ m_imports = imps;
+ }
+
+ /**
+ * Build service instantiator handler description.
+ * @return the handler description
+ * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+ */
+ public Element getHandlerInfo() {
+ Element services = super.getHandlerInfo();
+ for (int i = 0; i < m_imports.size(); i++) {
+ ServiceImporter imp = (ServiceImporter) m_imports.get(i);
+ Element impo = new Element("Requires", "");
+ impo.addAttribute(new Attribute("Specification", imp.getSpecification().getName()));
+ if (imp.getFilter() != null) {
+ impo.addAttribute(new Attribute("Filter", imp.getFilter()));
+ }
+ if (imp.getState() == DependencyModel.RESOLVED) {
+ impo.addAttribute(new Attribute("State", "resolved"));
+ for (int j = 0; j < imp.getProviders().size(); j++) {
+ Element prov = new Element("Provider", "");
+ prov.addAttribute(new Attribute("name", (String) imp.getProviders().get(j)));
+ impo.addElement(prov);
+ }
+ } else {
+ impo.addAttribute(new Attribute("State", "unresolved"));
+ }
+ services.addElement(impo);
+ }
+
+ for (int i = 0; i < m_instances.size(); i++) {
+ SvcInstance inst = (SvcInstance) m_instances.get(i);
+ Element service = new Element("Service", "");
+ service.addAttribute(new Attribute("Specification", inst.getServiceSpecification()));
+ String state = "unresolved";
+ if (inst.getState() == DependencyModel.RESOLVED) {
+ state = "resolved";
+ }
+ service.addAttribute(new Attribute("State", state));
+ Map map = inst.getMatchingFactories();
+ Set keys = map.keySet();
+ Iterator iterator = keys.iterator();
+ while (iterator.hasNext()) {
+ ServiceReference ref = (ServiceReference) iterator.next();
+ Object object = map.get(ref);
+ if (object != null) {
+ Element fact = new Element("Factory", "");
+ fact.addAttribute(new Attribute("Name", ((ComponentInstance) object).getFactory().getName()));
+ service.addElement(fact);
+ }
+ }
+ services.addElement(service);
+ }
+ return services;
+ }
+
+}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
new file mode 100644
index 0000000..94c0a09
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
@@ -0,0 +1,267 @@
+/*
+ * 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.composite.service.instantiator;
+
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+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.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.PropertyDescription;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Manage a service instantiation. This service create component instance providing the required service specification.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class SvcInstance extends DependencyModel {
+
+ /**
+ * Configuration to push to the instance.
+ */
+ private Dictionary m_configuration;
+
+ /**
+ * Handler creating the service instance.
+ */
+ private ServiceDependencyHandler m_handler;
+
+ /**
+ * Map of matching factories Service Reference => instance or null (null if the service reference is not actually used).
+ */
+ private Map /* <ServiceReference, Instance> */m_factories = new HashMap();
+
+ /**
+ * Required specification.
+ */
+ private String m_specification;
+
+ /**
+ * Is the service provider frozen ? (Is used for static biding policy)
+ */
+ private boolean m_isFrozen;
+
+ /**
+ * Constructor.
+ * @param handler : the handler.
+ * @param spec : required specification.
+ * @param conf : instance configuration.
+ * @param isAgg : is the service instance an aggregate service ?
+ * @param isOpt : is the service instance optional ?
+ * @param filt : LDAP filter
+ * @param cmp : comparator to use for the tracking
+ * @param policy : binding policy
+ * @throws ConfigurationException : an attribute cannot be parsed correctly, or is incorrect.
+ */
+ public SvcInstance(ServiceDependencyHandler handler, String spec, Dictionary conf, boolean isAgg, boolean isOpt, Filter filt, Comparator cmp, int policy) throws ConfigurationException {
+ super(Factory.class, isAgg, isOpt, filt, cmp, policy, null, handler);
+
+ m_specification = spec;
+
+ m_handler = handler;
+ setBundleContext(m_handler.getCompositeManager().getServiceContext());
+
+ m_configuration = conf;
+ }
+
+ /**
+ * Stop the service instance.
+ */
+ public void stop() {
+ super.stop();
+
+ Set keys = m_factories.keySet();
+ Iterator iterator = keys.iterator();
+ while (iterator.hasNext()) {
+ ServiceReference ref = (ServiceReference) iterator.next();
+ Object object = m_factories.get(ref);
+ if (object != null) {
+ ((ComponentInstance) object).dispose();
+ }
+ }
+
+ m_factories.clear();
+
+ }
+
+ public boolean isFrozen() {
+ return m_isFrozen;
+ }
+
+ /**
+ * Freeze the set of used provider.
+ * This method is when the static binding policy is applied.
+ */
+ public void freeze() {
+ m_isFrozen = true;
+ }
+
+ /**
+ * Create an instance for the given reference. The instance is not added inside the map.
+ * @param factory : the factory from which we need to create the instance.
+ * @return the created component instance.
+ * @throws ConfigurationException : the instance cannot be configured correctly.
+ * @throws MissingHandlerException : the factory is invalid.
+ * @throws UnacceptableConfiguration : the given configuration is invalid for the given factory.
+ */
+ private ComponentInstance createInstance(Factory factory) throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ // Recreate the configuration to avoid sharing.
+ Properties props = new Properties();
+ Enumeration keys = m_configuration.keys();
+ while (keys.hasMoreElements()) {
+ String key = (String) keys.nextElement();
+ props.put(key, m_configuration.get(key));
+ }
+ ComponentInstance instance = null;
+ instance = factory.createComponentInstance(props);
+ return instance;
+ }
+
+ /**
+ * Does the service instance match with the given factory ?
+ * @param fact : the factory to test.
+ * @return true if the factory match, false otherwise.
+ */
+ public boolean match(ServiceReference fact) {
+ // Check if the factory can provide the specification
+ ComponentTypeDescription desc = (ComponentTypeDescription) fact.getProperty("component.description");
+ if (desc == null) {
+ return false; // No component type description.
+ }
+
+ String[] provides = desc.getprovidedServiceSpecification();
+ for (int i = 0; provides != null && i < provides.length; i++) {
+ if (provides[i].equals(m_specification)) {
+ // Check that the factory needs every properties contained in
+ // the configuration
+ PropertyDescription[] props = desc.getProperties();
+ Properties conf = new Properties();
+ Enumeration keys = m_configuration.keys();
+ while (keys.hasMoreElements()) {
+ String key = (String) keys.nextElement();
+ if (!containsProperty(key, props)) { return false; }
+ conf.put(key, m_configuration.get(key));
+ }
+
+ Factory factory = (Factory) getService(fact);
+ return factory.isAcceptable(conf);
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Does the factory support the given property ? This method check if the property is contained in the given property description array.
+ * @param name : name of the property
+ * @param props : list of property description
+ * @return true if the factory support this property
+ */
+ private boolean containsProperty(String name, org.apache.felix.ipojo.architecture.PropertyDescription[] props) {
+ for (int i = 0; props != null && i < props.length; i++) {
+ if (props[i].getName().equalsIgnoreCase(name)) { return true; }
+ }
+ if (name.equalsIgnoreCase("name")) { return true; } // Skip the name property
+ return false;
+ }
+
+ /**
+ * Get the required specification.
+ * @return the required specification.
+ */
+ public String getServiceSpecification() {
+ return m_specification;
+ }
+
+ /**
+ * Get the map of used references [reference, component instance].
+ * @return the map of used references.
+ */
+ protected Map getMatchingFactories() {
+ return m_factories;
+ }
+
+ /**
+ * On Dependency Reconfiguration notification method.
+ * @param departs : leaving service references.
+ * @param arrivals : new injected service references.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onDependencyReconfiguration(org.osgi.framework.ServiceReference[], org.osgi.framework.ServiceReference[])
+ */
+ public void onDependencyReconfiguration(ServiceReference[] departs, ServiceReference[] arrivals) {
+ for (int i = 0; departs != null && i < departs.length; i++) {
+ onServiceDeparture(departs[i]);
+ }
+
+ for (int i = 0; arrivals != null && i < arrivals.length; i++) {
+ onServiceArrival(arrivals[i]);
+ }
+ }
+
+ /**
+ * A new service is injected.
+ * This method create the sub-service instance in the composite.
+ * @param ref : service reference.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onServiceArrival(org.osgi.framework.ServiceReference)
+ */
+ public void onServiceArrival(ServiceReference ref) {
+ // The given factory matches.
+ try {
+ Factory fact = (Factory) getService(ref);
+ ComponentInstance instance = createInstance(fact);
+ m_factories.put(ref, instance);
+ } catch (UnacceptableConfiguration e) {
+ m_handler.error("A matching factory refuse the actual configuration : " + e.getMessage());
+ m_handler.getCompositeManager().stop();
+ } catch (MissingHandlerException e) {
+ m_handler.error("A matching factory is no more valid : " + e.getMessage());
+ m_handler.getCompositeManager().stop();
+ } catch (ConfigurationException e) {
+ m_handler.error("A matching configuration is refuse by the instance : " + e.getMessage());
+ m_handler.getCompositeManager().stop();
+ }
+
+ }
+
+
+ /**
+ * A used service is leaving.
+ * This method dispose the created instance.
+ * @param ref : leaving service reference.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onServiceDeparture(org.osgi.framework.ServiceReference)
+ */
+ public void onServiceDeparture(ServiceReference ref) {
+ // Remove the reference is contained
+ Object instance = m_factories.remove(ref);
+ if (instance != null) {
+ ((ComponentInstance) instance).dispose();
+ }
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionException.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionException.java
similarity index 82%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionException.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionException.java
index 4202643..9423d3c 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionException.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionException.java
@@ -1,55 +1,41 @@
-/*
- * 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.composite.service.provides;
-
-/**
- * Exception occurs when a composition error occurs.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class CompositionException extends Exception {
-
- /**
- * serialVersionUID.
- */
- private static final long serialVersionUID = -3063353267573738105L;
-
- /**
- * Message.
- */
- private String m_message;
-
- /**
- * Constructor.
- * @param message : a message.
- */
- public CompositionException(String message) {
- m_message = message;
- }
-
- /**
- * Get the exception message.
- * @return the message.
- * @see java.lang.Throwable#getMessage()
- */
- public String getMessage() {
- return m_message;
- }
-
-}
+/*
+ * 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.composite.service.provides;
+
+/**
+ * Exception occurs when a composition error occurs.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class CompositionException extends Exception {
+ //TODO consider removing this class to use configuration exception.
+ /**
+ * serialVersionUID.
+ */
+ private static final long serialVersionUID = -3063353267573738105L;
+
+ /**
+ * Constructor.
+ * @param message : a message.
+ */
+ public CompositionException(String message) {
+ super(message);
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionMetadata.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionMetadata.java
similarity index 78%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionMetadata.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionMetadata.java
index da54207..8ccf749 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionMetadata.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/CompositionMetadata.java
@@ -1,363 +1,359 @@
-/*
- * 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.composite.service.provides;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.felix.ipojo.Factory;
-import org.apache.felix.ipojo.manipulation.Manipulator;
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.util.Logger;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Check and build a composition, i.e. a POJO containing the composition.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class CompositionMetadata {
-
- /**
- * Implemented composition.
- */
- private SpecificationMetadata m_specification;
-
- /**
- * Name of the composition.
- */
- private String m_name;
-
- /**
- * Bundle Context.
- */
- private BundleContext m_context;
-
- /**
- * Manipulation Metadata.
- */
- private Element m_manipulationMetadata;
-
- /**
- * Reference on the handler.
- */
- private ProvidedServiceHandler m_handler;
-
- /**
- * List of Mappings.
- */
- private List m_mappings = new ArrayList();
-
- /**
- * Constructor.
- * @param bc : bundle context
- * @param description : 'provides' element
- * @param psh : parent handler
- * @param name : name of the composition.
- */
- public CompositionMetadata(BundleContext bc, Element description, ProvidedServiceHandler psh, String name) {
- m_context = bc;
- m_handler = psh;
- // Get the composition name
- m_name = description.getAttribute("specification") + name;
-
- // Get implemented service specification
- String spec = description.getAttribute("specification");
- m_specification = new SpecificationMetadata(spec, m_context, false, false, m_handler);
-
- Element[] mappings = description.getElements("delegation");
- for (int i = 0; i < mappings.length; i++) {
- String methodName = mappings[i].getAttribute("method");
- MethodMetadata method = m_specification.getMethodByName(methodName);
- if (method == null) {
- m_handler.log(Logger.ERROR, "The method " + methodName + " does not exist in the specicifation " + spec);
- return;
- }
-
- if (mappings[i].getAttribute("policy").equalsIgnoreCase("All")) {
- method.setAllPolicy();
- }
- }
- }
-
- protected BundleContext getBundleContext() {
- return m_context;
- }
-
- public String getName() {
- return m_name;
- }
-
- public SpecificationMetadata getSpecificationMetadata() {
- return m_specification;
- }
-
- /**
- * Build Available Mappings.
- * @throws CompositionException : a factory is not available, the composition cannot be checked.
- */
- private void buildAvailableMappingList() throws CompositionException {
- int index = 0;
-
- for (int i = 0; i < m_handler.getInstanceType().size(); i++) {
- String type = (String) m_handler.getInstanceType().get(i);
- try {
- ServiceReference[] refs = m_context.getServiceReferences(Factory.class.getName(), "(factory.name=" + type + ")");
- if (refs == null) {
- m_handler.log(Logger.ERROR, "The factory " + type + " is not available, cannot check the composition");
- throw new CompositionException("The factory " + type + " needs to be available to check the composition");
- } else {
- String className = (String) refs[0].getProperty("component.class");
- Class impl = m_context.getBundle().loadClass(className);
- SpecificationMetadata spec = new SpecificationMetadata(impl, type, m_handler);
- FieldMetadata field = new FieldMetadata(spec);
- field.setName("_field" + index);
- Mapping map = new Mapping(spec, field);
- m_mappings.add(map);
- index++;
- }
- } catch (InvalidSyntaxException e) {
- m_handler.log(Logger.ERROR, "A LDAP filter is not valid : " + e.getMessage());
- } catch (ClassNotFoundException e) {
- m_handler.log(Logger.ERROR, "The implementation class of a component cannot be loaded : " + e.getMessage());
- }
- }
-
- for (int i = 0; i < m_handler.getSpecifications().size(); i++) {
- SpecificationMetadata spec = (SpecificationMetadata) m_handler.getSpecifications().get(i);
- FieldMetadata field = new FieldMetadata(spec);
- field.setName("_field" + index);
- if (spec.isOptional()) {
- field.setOptional(true);
- }
- if (spec.isAggregate()) {
- field.setAggregate(true);
- }
- Mapping map = new Mapping(spec, field);
- m_mappings.add(map);
- index++;
- }
- }
-
-
- /**
- * Build the delegation mapping.
- * @throws CompositionException : occurs when the mapping cannot be inferred correctly
- */
- protected void buildMapping() throws CompositionException {
- buildAvailableMappingList();
-
- // Dependency closure is OK, now look for method delegation
- Map/* <MethodMetadata, Mapping> */availableSvcMethods = new HashMap();
- Map/* <MethodMetadata, Mapping> */availableInstMethods = new HashMap();
-
- for (int i = 0; i < m_mappings.size(); i++) {
- Mapping map = (Mapping) m_mappings.get(i);
- SpecificationMetadata spec = map.getSpecification();
- for (int j = 0; j < spec.getMethods().size(); j++) {
- MethodMetadata method = (MethodMetadata) spec.getMethods().get(j);
- if (spec.isInterface()) {
- availableSvcMethods.put(method, map);
- } else {
- availableInstMethods.put(method, map);
- }
- }
- }
-
- // For each needed method, search if available and store the mapping
- for (int j = 0; j < m_specification.getMethods().size(); j++) {
- MethodMetadata method = (MethodMetadata) m_specification.getMethods().get(j);
- Set keys = availableInstMethods.keySet(); // Look first in methods contained in the glue code.
- Iterator it = keys.iterator();
- boolean found = false;
- while (it.hasNext() & !found) {
- MethodMetadata met = (MethodMetadata) it.next();
- if (met.equals(method)) {
- found = true;
- FieldMetadata field = ((Mapping) availableInstMethods.get(met)).getField();
- field.setUseful(true);
- method.setDelegation(field);
- }
- }
- if (!found) { // If not found looks inside method contained in services.
- keys = availableSvcMethods.keySet(); // Look first in methods contained in the glue code
- it = keys.iterator();
- while (!found && it.hasNext()) {
- MethodMetadata met = (MethodMetadata) it.next();
- if (met.equals(method)) {
- found = true;
- FieldMetadata field = ((Mapping) availableSvcMethods.get(met)).getField();
- field.setUseful(true);
- method.setDelegation(field);
- // Test optional
- if (field.isOptional() && !method.throwsUnsupportedOperationException()) {
- m_handler.log(Logger.WARNING, "The method " + method.getMethod().getName() + " could not be provided correctly : the specification " + field.getSpecification().getName() + " is optional");
- }
- }
- }
- }
- if (!found) {
- throw new CompositionException("Inconsistent composition - the method " + method.getMethod() + " could not be delegated");
- }
- }
- }
-
- /**
- * Build a service implementation.
- * @return the byte[] of the POJO.
- */
- protected byte[] buildPOJO() {
- Class clazz = null;
- try {
- clazz = getBundleContext().getBundle().loadClass(m_specification.getName());
- } catch (ClassNotFoundException e1) {
- //TODO
- e1.printStackTrace();
- }
- byte[] pojo = POJOWriter.dump(clazz, m_name, getFieldList(), getMethodList());
- Manipulator m = new Manipulator();
- try {
- byte[] ff = m.manipulate(pojo);
- m_manipulationMetadata = m.getManipulationMetadata();
- return ff;
- } catch (IOException e) {
- e.printStackTrace();
- }
- return null;
- }
-
- /**
- * Build service implementation metadata.
- * @param in : name of the future instance (used to avoid cycle)
- * @return Component Type metadata.
- */
- protected Element buildMetadata(String in) {
- Element elem = new Element("component", "");
- Attribute className = new Attribute("className", m_name);
- Attribute factory = new Attribute("factory", "false");
- elem.addAttribute(className);
- elem.addAttribute(factory);
-
- // Add architecture for debug
- elem.addAttribute(new Attribute("architecture", "true"));
-
- // Provides
- Element provides = new Element("provides", "");
- provides.addAttribute(new Attribute("specification", m_specification.getName()));
- elem.addElement(provides);
-
- // Dependencies
- List fields = getFieldList();
- for (int i = 0; i < fields.size(); i++) {
- FieldMetadata field = (FieldMetadata) fields.get(i);
- if (field.isUseful() && field.getSpecification().isInterface()) {
- Element dep = new Element("requires", "");
- dep.addAttribute(new Attribute("field", field.getName()));
- dep.addAttribute(new Attribute("scope", "composite"));
- if (field.getSpecification().isOptional()) {
- dep.addAttribute(new Attribute("optional", "true"));
- }
- dep.addAttribute(new Attribute("filter", "(!(instance.name=" + in + "))"));
- elem.addElement(dep);
- }
- }
-
- Element properties = new Element("properties", "");
- for (int i = 0; i < fields.size(); i++) {
- FieldMetadata field = (FieldMetadata) fields.get(i);
- if (field.isUseful() && ! field.getSpecification().isInterface()) {
- Element prop = new Element("Property", "");
- prop.addAttribute(new Attribute("field", field.getName()));
- properties.addElement(prop);
- }
- }
- if (properties.getElements().length != 0) {
- elem.addElement(properties);
- }
-
- // Insert information to metadata
- elem.addElement(m_manipulationMetadata);
-
- return elem;
- }
-
- /**
- * Get the field list to use for the delegation.
- * @return the field list.
- */
- public List getFieldList() {
- List list = new ArrayList();
- for (int i = 0; i < m_mappings.size(); i++) {
- Mapping map = (Mapping) m_mappings.get(i);
- list.add(map.getField());
- }
- return list;
- }
-
- /**
- * Get the method list contained in the implemented specification.
- * @return the List of implemented method.
- */
- private List getMethodList() {
- return m_specification.getMethods();
- }
-
- /**
- * Store links between Field and pointed Specification.
- */
- private class Mapping {
-
- /**
- * Specification.
- */
- private SpecificationMetadata m_spec;
-
- /**
- * Field.
- */
- private FieldMetadata m_field;
-
- /**
- * Constructor.
- * @param spec : specification metadata.
- * @param field : the field.
- */
- public Mapping(SpecificationMetadata spec, FieldMetadata field) {
- m_spec = spec;
- m_field = field;
- }
-
- public SpecificationMetadata getSpecification() {
- return m_spec;
- }
-
- public FieldMetadata getField() {
- return m_field;
- }
-
- }
-
-}
+/*
+ * 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.composite.service.provides;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.manipulation.Manipulator;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Check and build a composition, i.e. a POJO containing the composition.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class CompositionMetadata {
+
+ /**
+ * Implemented composition.
+ */
+ private SpecificationMetadata m_specification;
+
+ /**
+ * Name of the composition.
+ */
+ private String m_name;
+
+ /**
+ * Bundle Context.
+ */
+ private BundleContext m_context;
+
+ /**
+ * Manipulation Metadata.
+ */
+ private Element m_manipulation;
+
+ /**
+ * Reference on the handler.
+ */
+ private ProvidedServiceHandler m_handler;
+
+ /**
+ * List of Mappings.
+ */
+ private List m_mappings = new ArrayList();
+
+ /**
+ * Constructor.
+ * @param context : bundle context
+ * @param description : 'provides' element
+ * @param psh : parent handler
+ * @param name : name of the composition.
+ */
+ public CompositionMetadata(BundleContext context, Element description, ProvidedServiceHandler psh, String name) {
+ m_context = context;
+ m_handler = psh;
+ // Get the composition name
+ m_name = description.getAttribute("specification") + name;
+
+ // Get implemented service specification
+ String spec = description.getAttribute("specification");
+ m_specification = new SpecificationMetadata(spec, m_context, false, false, m_handler);
+
+ Element[] mappings = description.getElements("delegation");
+ for (int i = 0; mappings != null && i < mappings.length; i++) {
+ String methodName = mappings[i].getAttribute("method");
+ MethodMetadata method = m_specification.getMethodByName(methodName);
+ if (method == null) {
+ m_handler.error("The method " + methodName + " does not exist in the specicifation " + spec);
+ return;
+ }
+
+ if (mappings[i].getAttribute("policy").equalsIgnoreCase("All")) {
+ method.setAllPolicy();
+ }
+ }
+ }
+
+ protected BundleContext getBundleContext() {
+ return m_context;
+ }
+
+ public String getName() {
+ return m_name;
+ }
+
+ public SpecificationMetadata getSpecificationMetadata() {
+ return m_specification;
+ }
+
+ /**
+ * Build Available Mappings.
+ * @throws CompositionException : a factory is not available, the composition cannot be checked.
+ */
+ private void buildAvailableMappingList() throws CompositionException {
+ int index = 0;
+
+ for (int i = 0; i < m_handler.getInstanceType().size(); i++) {
+ String type = (String) m_handler.getInstanceType().get(i);
+ try {
+ ServiceReference[] refs = m_context.getServiceReferences(Factory.class.getName(), "(factory.name=" + type + ")");
+ if (refs == null) {
+ m_handler.error("The factory " + type + " is not available, cannot check the composition");
+ throw new CompositionException("The factory " + type + " needs to be available to check the composition");
+ } else {
+ String className = (String) refs[0].getProperty("component.class");
+ Class impl = m_context.getBundle().loadClass(className);
+ SpecificationMetadata spec = new SpecificationMetadata(impl, type, m_handler);
+ FieldMetadata field = new FieldMetadata(spec);
+ field.setName("_field" + index);
+ Mapping map = new Mapping(spec, field);
+ m_mappings.add(map);
+ index++;
+ }
+ } catch (InvalidSyntaxException e) {
+ m_handler.error("A LDAP filter is not valid : " + e.getMessage());
+ } catch (ClassNotFoundException e) {
+ m_handler.error("The implementation class of a component cannot be loaded : " + e.getMessage());
+ }
+ }
+
+ for (int i = 0; i < m_handler.getSpecifications().size(); i++) {
+ SpecificationMetadata spec = (SpecificationMetadata) m_handler.getSpecifications().get(i);
+ FieldMetadata field = new FieldMetadata(spec);
+ field.setName("_field" + index);
+ if (spec.isOptional()) {
+ field.setOptional(true);
+ }
+ if (spec.isAggregate()) {
+ field.setAggregate(true);
+ }
+ Mapping map = new Mapping(spec, field);
+ m_mappings.add(map);
+ index++;
+ }
+ }
+
+ /**
+ * Build the delegation mapping.
+ * @throws CompositionException : occurs when the mapping cannot be inferred correctly
+ */
+ protected void buildMapping() throws CompositionException {
+ buildAvailableMappingList();
+
+ // Dependency closure is OK, now look for method delegation
+ Map/* <MethodMetadata, Mapping> */svcMethods = new HashMap();
+ Map/* <MethodMetadata, Mapping> */instMethods = new HashMap();
+
+ for (int i = 0; i < m_mappings.size(); i++) {
+ Mapping map = (Mapping) m_mappings.get(i);
+ SpecificationMetadata spec = map.getSpecification();
+ for (int j = 0; j < spec.getMethods().size(); j++) {
+ MethodMetadata method = (MethodMetadata) spec.getMethods().get(j);
+ if (spec.isInterface()) {
+ svcMethods.put(method, map);
+ } else {
+ instMethods.put(method, map);
+ }
+ }
+ }
+
+ // For each needed method, search if available and store the mapping
+ for (int j = 0; j < m_specification.getMethods().size(); j++) {
+ MethodMetadata method = (MethodMetadata) m_specification.getMethods().get(j);
+ Set keys = instMethods.keySet(); // Look first in methods contained in the glue code.
+ Iterator iterator = keys.iterator();
+ boolean found = false;
+ while (iterator.hasNext() & !found) {
+ MethodMetadata met = (MethodMetadata) iterator.next();
+ if (met.equals(method)) {
+ found = true;
+ FieldMetadata field = ((Mapping) instMethods.get(met)).getField();
+ field.setUseful(true);
+ method.setDelegation(field);
+ }
+ }
+ if (!found) { // If not found looks inside method contained in services.
+ keys = svcMethods.keySet(); // Look first in methods contained in the glue code
+ iterator = keys.iterator();
+ while (!found && iterator.hasNext()) {
+ MethodMetadata met = (MethodMetadata) iterator.next();
+ if (met.equals(method)) {
+ found = true;
+ FieldMetadata field = ((Mapping) svcMethods.get(met)).getField();
+ field.setUseful(true);
+ method.setDelegation(field);
+ // Test optional
+ if (field.isOptional() && !method.throwsUnsupportedOperationException()) {
+ m_handler.warn("The method " + method.getMethod().getName() + " could not be provided correctly : the specification " + field.getSpecification().getName() + " is optional");
+ }
+ }
+ }
+ }
+ if (!found) { throw new CompositionException("Inconsistent composition - the method " + method.getMethod() + " could not be delegated"); }
+ }
+ }
+
+ /**
+ * Build a service implementation.
+ * @return the byte[] of the POJO.
+ */
+ protected byte[] buildPOJO() {
+ Class clazz = null;
+ try {
+ clazz = getBundleContext().getBundle().loadClass(m_specification.getName());
+ } catch (ClassNotFoundException e1) {
+ // The class has already be loaded.
+ return null;
+ }
+ byte[] pojo = POJOWriter.dump(clazz, m_name, getFieldList(), getMethodList());
+ Manipulator manipulator = new Manipulator();
+ try {
+ byte[] newclazz = manipulator.manipulate(pojo);
+ m_manipulation = manipulator.getManipulationMetadata();
+ return newclazz;
+ } catch (IOException e) {
+ m_handler.error("An error occurs during the composite implementation creation : " + e.getMessage(), e);
+ }
+ return null;
+ }
+
+ /**
+ * Build service implementation metadata.
+ * @param name : name of the future instance (used to avoid cycle)
+ * @return Component Type metadata.
+ */
+ protected Element buildMetadata(String name) {
+ Element elem = new Element("component", "");
+ Attribute className = new Attribute("className", m_name);
+ Attribute factory = new Attribute("factory", "false");
+ elem.addAttribute(className);
+ elem.addAttribute(factory);
+
+ // Add architecture for debug
+ elem.addAttribute(new Attribute("architecture", "true"));
+
+ // Provides
+ Element provides = new Element("provides", "");
+ provides.addAttribute(new Attribute("specification", m_specification.getName()));
+ elem.addElement(provides);
+
+ // Dependencies
+ List fields = getFieldList();
+ for (int i = 0; i < fields.size(); i++) {
+ FieldMetadata field = (FieldMetadata) fields.get(i);
+ if (field.isUseful() && field.getSpecification().isInterface()) {
+ Element dep = new Element("requires", "");
+ dep.addAttribute(new Attribute("field", field.getName()));
+ dep.addAttribute(new Attribute("scope", "composite"));
+ if (field.getSpecification().isOptional()) {
+ dep.addAttribute(new Attribute("optional", "true"));
+ }
+ dep.addAttribute(new Attribute("filter", "(!(instance.name=" + name + "))"));
+ elem.addElement(dep);
+ }
+ }
+
+ Element properties = new Element("properties", "");
+ for (int i = 0; i < fields.size(); i++) {
+ FieldMetadata field = (FieldMetadata) fields.get(i);
+ if (field.isUseful() && !field.getSpecification().isInterface()) {
+ Element prop = new Element("Property", "");
+ prop.addAttribute(new Attribute("field", field.getName()));
+ properties.addElement(prop);
+ }
+ }
+ if (properties.getElements().length != 0) {
+ elem.addElement(properties);
+ }
+
+ // Insert information to metadata
+ elem.addElement(m_manipulation);
+
+ return elem;
+ }
+
+ /**
+ * Get the field list to use for the delegation.
+ * @return the field list.
+ */
+ public List getFieldList() {
+ List list = new ArrayList();
+ for (int i = 0; i < m_mappings.size(); i++) {
+ Mapping map = (Mapping) m_mappings.get(i);
+ list.add(map.getField());
+ }
+ return list;
+ }
+
+ /**
+ * Get the method list contained in the implemented specification.
+ * @return the List of implemented method.
+ */
+ private List getMethodList() {
+ return m_specification.getMethods();
+ }
+
+ /**
+ * Store links between Field and pointed Specification.
+ */
+ private class Mapping {
+
+ /**
+ * Specification.
+ */
+ private SpecificationMetadata m_spec;
+
+ /**
+ * Field.
+ */
+ private FieldMetadata m_field;
+
+ /**
+ * Constructor.
+ * @param spec : specification metadata.
+ * @param field : the field.
+ */
+ public Mapping(SpecificationMetadata spec, FieldMetadata field) {
+ m_spec = spec;
+ m_field = field;
+ }
+
+ public SpecificationMetadata getSpecification() {
+ return m_spec;
+ }
+
+ public FieldMetadata getField() {
+ return m_field;
+ }
+
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/FieldMetadata.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/FieldMetadata.java
similarity index 99%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/FieldMetadata.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/FieldMetadata.java
index 2839858..4df41a8 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/FieldMetadata.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/FieldMetadata.java
@@ -1,105 +1,105 @@
-/*
- * 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.composite.service.provides;
-
-/**
- * Field used inside a composition.
- * This class contains all information useful for the generation.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class FieldMetadata {
-
- /**
- * Name of the field.
- */
- private String m_name;
-
- /**
- * Is the field an array?
- */
- private boolean m_isAggregate = false;
-
- /**
- * Interface of the field.
- */
- private SpecificationMetadata m_specification;
-
- /**
- * Is the field useful in this composition.
- */
- private boolean m_isUseful;
-
- /**
- * Is the dependency for this field optional.
- */
- private boolean m_isOptional = false;
-
- /**
- * Constructor.
- * @param specification : interface of the field.
- */
- public FieldMetadata(SpecificationMetadata specification) {
- super();
- this.m_specification = specification;
- if (m_specification.isAggregate()) {
- m_isAggregate = true;
- }
- }
-
- public boolean isAggregate() {
- return m_isAggregate;
- }
-
- public void setAggregate(boolean aggregate) {
- m_isAggregate = aggregate;
- }
-
- public String getName() {
- return m_name;
- }
-
- public void setName(String name) {
- this.m_name = name;
- }
-
- public SpecificationMetadata getSpecification() {
- return m_specification;
- }
-
- public void setSpecification(SpecificationMetadata specification) {
- this.m_specification = specification;
- }
-
- public boolean isUseful() {
- return m_isUseful;
- }
-
- public void setUseful(boolean useful) {
- m_isUseful = useful;
- }
-
- public boolean isOptional() {
- return m_isOptional;
- }
-
- public void setOptional(boolean opt) {
- m_isOptional = opt;
- }
-
-}
+/*
+ * 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.composite.service.provides;
+
+/**
+ * Field used inside a composition.
+ * This class contains all information useful for the generation.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class FieldMetadata {
+
+ /**
+ * Name of the field.
+ */
+ private String m_name;
+
+ /**
+ * Is the field an array?
+ */
+ private boolean m_isAggregate = false;
+
+ /**
+ * Interface of the field.
+ */
+ private SpecificationMetadata m_specification;
+
+ /**
+ * Is the field useful in this composition.
+ */
+ private boolean m_isUseful;
+
+ /**
+ * Is the dependency for this field optional.
+ */
+ private boolean m_isOptional = false;
+
+ /**
+ * Constructor.
+ * @param specification : interface of the field.
+ */
+ public FieldMetadata(SpecificationMetadata specification) {
+ super();
+ this.m_specification = specification;
+ if (m_specification.isAggregate()) {
+ m_isAggregate = true;
+ }
+ }
+
+ public boolean isAggregate() {
+ return m_isAggregate;
+ }
+
+ public void setAggregate(boolean aggregate) {
+ m_isAggregate = aggregate;
+ }
+
+ public String getName() {
+ return m_name;
+ }
+
+ public void setName(String name) {
+ this.m_name = name;
+ }
+
+ public SpecificationMetadata getSpecification() {
+ return m_specification;
+ }
+
+ public void setSpecification(SpecificationMetadata specification) {
+ this.m_specification = specification;
+ }
+
+ public boolean isUseful() {
+ return m_isUseful;
+ }
+
+ public void setUseful(boolean useful) {
+ m_isUseful = useful;
+ }
+
+ public boolean isOptional() {
+ return m_isOptional;
+ }
+
+ public void setOptional(boolean opt) {
+ m_isOptional = opt;
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/MethodMetadata.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/MethodMetadata.java
similarity index 65%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/MethodMetadata.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/MethodMetadata.java
index 5e209ae..510514e 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/MethodMetadata.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/MethodMetadata.java
@@ -1,127 +1,138 @@
-/*
- * 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.composite.service.provides;
-
-import java.lang.reflect.Method;
-
-/**
- * Information on Method for the composition.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class MethodMetadata {
-
- /**
- * ONE POLICY.
- */
- public static final int ONE_POLICY = 1;
-
- /**
- * ALL POLICY.
- */
- public static final int ALL_POLICY = 2;
-
- /**
- * Method Object.
- */
- private Method m_method;
-
- /**
- * Delegation field.
- */
- private FieldMetadata m_delegation;
-
- /**
- * Delegation policy (default = ONE).
- */
- private int m_policy = ONE_POLICY;
-
- /**
- * Constructor.
- * @param method : method object.
- */
- public MethodMetadata(Method method) {
- m_method = method;
- }
-
- public Method getMethod() {
- return m_method;
- }
-
- public void setDelegation(FieldMetadata dm) {
- m_delegation = dm;
- }
-
- public FieldMetadata getDelegation() {
- return m_delegation;
- }
-
- /**
- * Check if two method metadata are equals.
- * @param mm : the method metadata to compare with the current method metadata.
- * @return true if the two method are equals
- */
- public boolean equals(MethodMetadata mm) {
- Method met = mm.getMethod();
- return equals(met);
- }
-
- /**
- * Equals method for Method object.
- * @param met : the method object to compare.
- * @return true if the given method signature is equals to the current method metadata.
- */
- public boolean equals(Method met) {
- if (! met.getName().equals(m_method.getName()) || met.getParameterTypes().length != m_method.getParameterTypes().length) {
- return false;
- }
-
- for (int i = 0; i < m_method.getParameterTypes().length; i++) {
- if (!m_method.getParameterTypes()[i].getName().equals(met.getParameterTypes()[i].getName())) {
- return false;
- }
- }
-
- return true;
- }
-
- public int getPolicy() {
- return m_policy;
- }
-
- /**
- * Activate the all policy for this method.
- */
- public void setAllPolicy() {
- m_policy = ALL_POLICY;
- }
-
- /**
- * Check if the method can throw UnsupportedOperationException.
- * @return true if the method has declared the UnsupportedOperationException.
- */
- boolean throwsUnsupportedOperationException() {
- for (int i = 0; i < m_method.getExceptionTypes().length; i++) {
- if (m_method.getExceptionTypes()[i].getName().equals(UnsupportedOperationException.class.getName())) {
- return true;
- }
- }
- return false;
- }
-
-}
+/*
+ * 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.composite.service.provides;
+
+import java.lang.reflect.Method;
+
+/**
+ * Information on Method for the composition.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class MethodMetadata {
+
+ /**
+ * ONE POLICY.
+ */
+ public static final int ONE_POLICY = 1;
+
+ /**
+ * ALL POLICY.
+ */
+ public static final int ALL_POLICY = 2;
+
+ /**
+ * Method Object.
+ */
+ private Method m_method;
+
+ /**
+ * Delegation field.
+ */
+ private FieldMetadata m_delegation;
+
+ /**
+ * Delegation policy (default = ONE).
+ */
+ private int m_policy = ONE_POLICY;
+
+ /**
+ * Constructor.
+ * @param method : method object.
+ */
+ public MethodMetadata(Method method) {
+ m_method = method;
+ }
+
+ public Method getMethod() {
+ return m_method;
+ }
+
+ public void setDelegation(FieldMetadata field) {
+ m_delegation = field;
+ }
+
+ public FieldMetadata getDelegation() {
+ return m_delegation;
+ }
+
+ /**
+ * Equals method.
+ * This method check if two MethodMetadata are equals or if the current MemethodMetadata is equals with a Method object.
+ * @param object : object.
+ * @return true if the current object and the given object are equals.
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object object) {
+ if (object instanceof MethodMetadata) {
+ Method met = ((MethodMetadata) object).getMethod();
+ return equals(met);
+ }
+
+ if (object instanceof Method) {
+ Method met = (Method) object;
+ if (! met.getName().equals(m_method.getName()) || met.getParameterTypes().length != m_method.getParameterTypes().length) {
+ return false;
+ }
+
+ for (int i = 0; i < m_method.getParameterTypes().length; i++) {
+ if (!m_method.getParameterTypes()[i].getName().equals(met.getParameterTypes()[i].getName())) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Hash code method.
+ * @return the parent hash code.
+ * @see java.lang.Object#hashCode()
+ */
+ public int hashCode() {
+ return super.hashCode();
+ }
+
+ public int getPolicy() {
+ return m_policy;
+ }
+
+ /**
+ * Activate the all policy for this method.
+ */
+ public void setAllPolicy() {
+ m_policy = ALL_POLICY;
+ }
+
+ /**
+ * Check if the method can throw UnsupportedOperationException.
+ * @return true if the method has declared the UnsupportedOperationException.
+ */
+ protected boolean throwsUnsupportedOperationException() {
+ for (int i = 0; i < m_method.getExceptionTypes().length; i++) {
+ if (m_method.getExceptionTypes()[i].getName().equals(UnsupportedOperationException.class.getName())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/POJOWriter.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/POJOWriter.java
similarity index 98%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/POJOWriter.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/POJOWriter.java
index b8fcab7..91ed8cc 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/POJOWriter.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/POJOWriter.java
@@ -33,6 +33,11 @@
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class POJOWriter implements Opcodes {
+
+ //TODO : consider using getOpCode
+ //TODO : fix bug on double-space
+ //TODO : use a logger
+ //TODO : merge this class with another class only static method.
/**
* Create a class.
@@ -168,6 +173,7 @@
writeReturn(Type.getReturnType(desc), mv);
} else { // All policy
if (Type.getReturnType(desc).getSort() != Type.VOID) {
+ //TODO use logger.
System.err.println("All policy cannot be used on method which does not return void");
}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedService.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedService.java
new file mode 100644
index 0000000..f76aea1
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedService.java
@@ -0,0 +1,235 @@
+/*
+ * 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.composite.service.provides;
+
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.composite.CompositeManager;
+import org.apache.felix.ipojo.composite.instance.InstanceHandler;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.apache.felix.ipojo.util.DependencyStateListener;
+import org.apache.felix.ipojo.util.Logger;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+
+/**
+ * Composite Provided Service.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ProvidedService implements DependencyStateListener {
+
+ /**
+ * Composite Manager.
+ */
+ private CompositeManager m_manager;
+
+ /**
+ * Composition Model.
+ */
+ private CompositionMetadata m_composition;
+
+ /**
+ * Internal context.
+ */
+ private ServiceContext m_scope;
+
+ /**
+ * External context.
+ */
+ private BundleContext m_context;
+
+ /**
+ * Created Factory.
+ */
+ private ComponentFactory m_factory;
+
+ /**
+ * Created Instance.
+ */
+ private ComponentInstance m_instance;
+
+ /**
+ * Exporter.
+ */
+ private ServiceExporter m_exports;
+
+ /**
+ * Created instance name.
+ */
+ private String m_instanceName;
+
+ /**
+ * Constructor.
+ * The delegation mapping is infers in this method.
+ * @param handler : the handler.
+ * @param element : 'provides' element.
+ * @param name : name of this provided service.
+ */
+ public ProvidedService(ProvidedServiceHandler handler, Element element, String name) {
+ m_manager = handler.getCompositeManager();
+ m_scope = m_manager.getServiceContext();
+ m_context = m_manager.getContext();
+ m_composition = new CompositionMetadata(m_manager.getContext(), element, handler, name);
+ }
+
+ /**
+ * Start method.
+ * Build service implementation type, factory and instance.
+ * @throws CompositionException if a consistent mapping cannot be discovered.
+ */
+ public void start() throws CompositionException {
+ m_composition.buildMapping();
+
+ m_instanceName = m_composition.getSpecificationMetadata().getName() + "Provider-Gen";
+ byte[] clazz = m_composition.buildPOJO();
+ Element metadata = m_composition.buildMetadata(m_instanceName);
+
+ // Create the factory
+ try {
+ m_factory = new ComponentFactory(m_context, clazz, metadata);
+ } catch (ConfigurationException e) {
+ // Should not happen.
+ }
+ m_factory.start();
+
+ try {
+ Class spec = DependencyModel.loadSpecification(m_composition.getSpecificationMetadata().getName(), m_context);
+ Filter filter = m_context.createFilter("(instance.name=" + m_instanceName + ")");
+ // Create the exports
+ m_exports = new ServiceExporter(spec, filter, false, false, null, DependencyModel.DYNAMIC_BINDING_POLICY, m_scope, m_context, this, m_manager);
+ } catch (InvalidSyntaxException e) {
+ throw new CompositionException("A provided service filter is invalid : " + e.getMessage());
+ } catch (ConfigurationException e) {
+ throw new CompositionException("The class " + m_composition.getSpecificationMetadata().getName() + " cannot be loaded : " + e.getMessage());
+ }
+ }
+
+ /**
+ * Stop the provided service.
+ * Kill the exporter, the instance and the factory.
+ */
+ public void stop() {
+ if (m_exports != null) {
+ m_exports.stop();
+ m_exports = null;
+ }
+ if (m_instance != null) {
+ m_instance.dispose();
+ m_instance = null;
+ }
+ if (m_factory != null) {
+ m_factory.stop();
+ m_factory = null;
+ }
+ }
+
+ protected CompositeManager getManager() {
+ return m_manager;
+ }
+
+ /**
+ * The exporter becomes valid.
+ * @param exporter : the exporter
+ */
+ public void validate(DependencyModel exporter) {
+ // Nothing to do.
+ }
+
+ /**
+ * The exporter becomes invalid.
+ * @param exporter : the exporter
+ */
+ public void invalidate(DependencyModel exporter) {
+ // Nothing to do.
+ }
+
+ /**
+ * Get an object from the given type.
+ * @param type : type
+ * @return an object from an instance of this type or null
+ */
+ private Object getObjectByType(String type) {
+ InstanceHandler handler = (InstanceHandler) m_manager.getCompositeHandler("org.apache.felix.ipojo.composite.instance.InstanceHandler");
+ Object pojo = handler.getObjectFromInstance(type);
+ if (pojo == null) {
+ m_manager.getFactory().getLogger().log(Logger.ERROR, "An instance object cannot be found for the type : " + type);
+ }
+ return pojo;
+ }
+
+ public String getSpecification() {
+ return m_composition.getSpecificationMetadata().getName();
+ }
+
+ /**
+ * Unregister the exposed service.
+ */
+ public void unregister() {
+ m_exports.stop();
+ }
+
+ /**
+ * Register the exposed service.
+ */
+ public void register() {
+ Properties props = new Properties();
+ props.put("name", m_instanceName);
+ List fields = m_composition.getFieldList();
+ for (int i = 0; i < fields.size(); i++) {
+ FieldMetadata field = (FieldMetadata) fields.get(i);
+ if (field.isUseful() && !field.getSpecification().isInterface()) {
+ String type = field.getSpecification().getComponentType();
+ Object pojo = getObjectByType(type);
+ props.put(field.getName(), pojo);
+ }
+ }
+
+ if (m_instance == null) {
+ // Else we have to create the instance
+ try {
+ m_instance = m_factory.createComponentInstance(props, m_manager.getServiceContext());
+ } catch (UnacceptableConfiguration e) {
+ throw new IllegalStateException("Cannot create the service implementation : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ throw new IllegalStateException("Cannot create the service implementation : " + e.getMessage());
+ } catch (ConfigurationException e) {
+ throw new IllegalStateException("Cannot create the service implementation : " + e.getMessage());
+ }
+ } else {
+ // We have to reconfigure the instance in order to inject up to date glue component instance.
+ m_instance.reconfigure(props);
+ }
+
+ m_exports.start();
+ }
+
+ public boolean isRegistered() {
+ return m_exports.getState() == DependencyModel.RESOLVED;
+ }
+
+}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java
new file mode 100644
index 0000000..fcbec3c
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java
@@ -0,0 +1,496 @@
+/*
+ * 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.composite.service.provides;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.HandlerFactory;
+import org.apache.felix.ipojo.HandlerManager;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.PolicyServiceContext;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.composite.CompositeHandler;
+import org.apache.felix.ipojo.composite.instance.InstanceHandler;
+import org.apache.felix.ipojo.composite.service.instantiator.ServiceDependencyHandler;
+import org.apache.felix.ipojo.composite.service.instantiator.ServiceImporter;
+import org.apache.felix.ipojo.composite.service.instantiator.SvcInstance;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.apache.felix.ipojo.util.DependencyStateListener;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Composite Provided Service Handler.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ProvidedServiceHandler extends CompositeHandler implements DependencyStateListener {
+
+ /**
+ * External context.
+ */
+ private BundleContext m_context;
+
+ /**
+ * List of "available" services in the internal context.
+ */
+ private List m_services = new ArrayList();
+
+ /**
+ * List of exporters.
+ */
+ private List m_exporters = new ArrayList();
+
+ /**
+ * List of managed services.
+ */
+ private List m_managedServices = new ArrayList();
+
+ /**
+ * List of component type.
+ */
+ private List m_types;
+
+ /**
+ * Initialize the component type.
+ * @param desc : component type description to populate.
+ * @param metadata : component type metadata.
+ * @throws ConfigurationException : metadata are incorrect.
+ * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentTypeDescription, org.apache.felix.ipojo.metadata.Element)
+ */
+ public void initializeComponentFactory(ComponentTypeDescription desc, Element metadata) throws ConfigurationException {
+ Element[] provides = metadata.getElements("provides");
+ for (int i = 0; i < provides.length; i++) {
+ String action = provides[i].getAttribute("action");
+ if (action == null) {
+ throw new ConfigurationException("Invalid composition service providing : no specified action");
+ } else if (action.equalsIgnoreCase("implement")) {
+ String spec = provides[i].getAttribute("specification");
+ if (spec == null) {
+ throw new ConfigurationException("Malformed provides : the specification attribute is mandatory");
+ } else {
+ desc.addProvidedServiceSpecification(spec);
+ }
+ } else if (action.equalsIgnoreCase("export")) {
+ String spec = provides[i].getAttribute("specification");
+ if (spec == null) {
+ throw new ConfigurationException("Malformed exports - Missing the specification attribute");
+ } else {
+ desc.addProvidedServiceSpecification(spec);
+ }
+ } else {
+ throw new ConfigurationException("Invalid composition service providing : unknown action " + action);
+ }
+ }
+ }
+
+ /**
+ * Configure the handler.
+ * @param metadata : the metadata of the component
+ * @param configuration : the instance configuration
+ * @throws ConfigurationException : the exporter cannot be created
+ * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+ */
+ public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
+ m_context = getCompositeManager().getContext();
+
+ Element[] provides = metadata.getElements("provides", "");
+ for (int i = 0; i < provides.length; i++) {
+ String action = provides[i].getAttribute("action");
+ if (action.equalsIgnoreCase("implement")) {
+ ProvidedService svc = new ProvidedService(this, provides[i], Integer.toString(i));
+ m_managedServices.add(svc);
+ } else if (action.equalsIgnoreCase("export")) {
+ boolean optional = false;
+ boolean aggregate = false;
+ String specification = provides[i].getAttribute("specification");
+
+ String filter = "(objectClass=" + specification + ")";
+
+ String opt = provides[i].getAttribute("optional");
+ optional = opt != null && opt.equalsIgnoreCase("true");
+
+ String agg = provides[i].getAttribute("aggregate");
+ aggregate = agg != null && agg.equalsIgnoreCase("true");
+
+ String givenFilter = provides[i].getAttribute("filter");
+ if (givenFilter != null) {
+ filter = "(&" + filter + givenFilter + ")"; //NOPMD
+ }
+
+ Filter fil = null;
+ try {
+ fil = m_context.createFilter(filter);
+ } catch (InvalidSyntaxException e) {
+ throw new ConfigurationException("An exporter filter is invalid " + filter + " : " + e.getMessage());
+ }
+
+ Comparator cmp = DependencyModel.getComparator(provides[i], m_context);
+ int policy = DependencyModel.getPolicy(provides[i]);
+ Class spec = DependencyModel.loadSpecification(specification, m_context);
+
+ ServiceExporter imp = new ServiceExporter(spec, fil, aggregate, optional, cmp, policy, getCompositeManager().getServiceContext(), m_context, this, getCompositeManager());
+ m_exporters.add(imp);
+ } // Others case cannot happen. The test was already made during the factory initialization.
+ }
+
+ }
+
+ /**
+ * Start method.
+ * Start all managed provided service.
+ * @see org.apache.felix.ipojo.CompositeHandler#start()
+ */
+ public void start() {
+ // Compute imports and instances
+ computeAvailableServices();
+ computeAvailableTypes();
+
+ for (int i = 0; i < m_managedServices.size(); i++) {
+ ProvidedService svc = (ProvidedService) m_managedServices.get(i);
+ try {
+ checkServiceSpecification(svc);
+ svc.start();
+ } catch (CompositionException e) {
+ error("Cannot start the provided service handler", e);
+ setValidity(false);
+ return;
+ }
+ }
+
+ for (int i = 0; i < m_exporters.size(); i++) {
+ ServiceExporter exp = (ServiceExporter) m_exporters.get(i);
+ exp.start();
+ }
+
+ isHandlerValid();
+ }
+
+ /**
+ * Stop method.
+ * Stop all managed provided service.
+ * @see org.apache.felix.ipojo.CompositeHandler#stop()
+ */
+ public void stop() {
+ for (int i = 0; i < m_managedServices.size(); i++) {
+ ProvidedService svc = (ProvidedService) m_managedServices.get(i);
+ svc.stop();
+ }
+
+ for (int i = 0; i < m_exporters.size(); i++) {
+ ServiceExporter exp = (ServiceExporter) m_exporters.get(i);
+ exp.stop();
+ }
+ }
+
+ /**
+ * Check the handler validity.
+ * @see org.apache.felix.ipojo.CompositeHandler#isValid()
+ */
+ private void isHandlerValid() {
+ for (int i = 0; i < m_exporters.size(); i++) {
+ ServiceExporter exp = (ServiceExporter) m_exporters.get(i);
+ if (exp.getState() != DependencyModel.RESOLVED) {
+ setValidity(false);
+ return;
+ }
+ }
+
+ setValidity(true);
+ }
+
+ /**
+ * Handler state changed.
+ * @param state : the new instance state.
+ * @see org.apache.felix.ipojo.CompositeHandler#stateChanged(int)
+ */
+ public void stateChanged(int state) {
+ if (state == ComponentInstance.INVALID) {
+ for (int i = 0; i < m_managedServices.size(); i++) {
+ ProvidedService svc = (ProvidedService) m_managedServices.get(i);
+ svc.unregister();
+ }
+ return;
+ }
+
+ // If the new state is VALID => register all the services
+ if (state == ComponentInstance.VALID) {
+ for (int i = 0; i < m_managedServices.size(); i++) {
+ ProvidedService svc = (ProvidedService) m_managedServices.get(i);
+ svc.register();
+ }
+ return;
+ }
+ }
+
+ /**
+ * Notify the handler that an exporter becomes invalid.
+ *
+ * @param exporter : the implicated exporter.
+ */
+ public void invalidate(DependencyModel exporter) {
+ // An export is no more valid
+ if (getValidity()) {
+ setValidity(false);
+ }
+
+ }
+
+ /**
+ * Notify the handler that an exporter becomes valid.
+ *
+ * @param exporter : the implicated exporter.
+ */
+ public void validate(DependencyModel exporter) {
+ // An import becomes valid
+ if (!getValidity()) {
+ isHandlerValid();
+ }
+ }
+
+ /**
+ * Build the list of available specification.
+ * @return the list of available specification.
+ */
+ protected List getSpecifications() {
+ return m_services;
+ }
+
+ /**
+ * Build the list of available specifications.
+ */
+ private void computeAvailableServices() {
+ // Get instantiated services :
+ ServiceDependencyHandler handler = (ServiceDependencyHandler) getHandler(HandlerFactory.IPOJO_NAMESPACE + ":subservice");
+
+ for (int i = 0; handler != null && i < handler.getInstances().size(); i++) {
+ SvcInstance svc = (SvcInstance) handler.getInstances().get(i);
+ String itf = svc.getServiceSpecification();
+ boolean agg = svc.isAggregate();
+ boolean opt = svc.isOptional();
+
+ SpecificationMetadata specMeta = new SpecificationMetadata(itf, m_context, agg, opt, this);
+ m_services.add(specMeta);
+ }
+
+ for (int i = 0; handler != null && i < handler.getRequirements().size(); i++) {
+ ServiceImporter imp = (ServiceImporter) handler.getRequirements().get(i);
+ String itf = imp.getSpecification().getName();
+ boolean agg = imp.isAggregate();
+ boolean opt = imp.isOptional();
+
+ SpecificationMetadata specMeta = new SpecificationMetadata(itf, m_context, agg, opt, this);
+ m_services.add(specMeta);
+ }
+ }
+
+ /**
+ * Check composite requirement against service specification requirement is available.
+ * @param svc : the provided service to check
+ * @throws CompositionException : occurs if the specification field of the service specification cannot be analyzed correctly.
+ */
+ private void checkServiceSpecification(ProvidedService svc) throws CompositionException {
+ try {
+ Class spec = m_context.getBundle().loadClass(svc.getSpecification());
+ Field specField = spec.getField("specification");
+ Object object = specField.get(null);
+ if (object instanceof String) {
+ Element specification = ManifestMetadataParser.parse((String) object);
+ Element[] reqs = specification.getElements("requires");
+ for (int j = 0; reqs != null && j < reqs.length; j++) {
+ ServiceImporter imp = getAttachedRequirement(reqs[j]);
+ if (imp != null) {
+ // Fix service-level dependency flag
+ imp.setServiceLevelDependency();
+ }
+ checkRequirement(imp, reqs[j]);
+ }
+ } else {
+ error("[" + getCompositeManager().getInstanceName() + "] The specification field of the service specification " + svc.getSpecification() + " need to be a String");
+ throw new CompositionException("Service Specification checking failed : The specification field of the service specification " + svc.getSpecification() + " need to be a String");
+ }
+ } catch (NoSuchFieldException e) {
+ return; // No specification field
+ } catch (ClassNotFoundException e) {
+ error("[" + getCompositeManager().getInstanceName() + "] The service specification " + svc.getSpecification() + " cannot be load");
+ throw new CompositionException("The service specification " + svc.getSpecification() + " cannot be load : " + e.getMessage());
+ } catch (IllegalArgumentException e) {
+ error("[" + getCompositeManager().getInstanceName() + "] The field 'specification' of the service specification " + svc.getSpecification() + " is not accessible : " + e.getMessage());
+ throw new CompositionException("The field 'specification' of the service specification " + svc.getSpecification() + " is not accessible : " + e.getMessage());
+ } catch (IllegalAccessException e) {
+ error("[" + getCompositeManager().getInstanceName() + "] The field 'specification' of the service specification " + svc.getSpecification() + " is not accessible : " + e.getMessage());
+ throw new CompositionException("The field 'specification' of the service specification " + svc.getSpecification() + " is not accessible : " + e.getMessage());
+ } catch (ParseException e) {
+ error("[" + getCompositeManager().getInstanceName() + "] The field 'specification' of the service specification " + svc.getSpecification() + " does not contain a valid String : " + e.getMessage());
+ throw new CompositionException("The field 'specification' of the service specification " + svc.getSpecification() + " does not contain a valid String : " + e.getMessage());
+ }
+ }
+
+ /**
+ * Look for the implementation (i.e. composite) requirement for the given service-level requirement metadata.
+ * @param element : the service-level requirement metadata
+ * @return the ServiceImporter object, null if not found or if the DependencyHandler is not plugged to the instance
+ */
+ private ServiceImporter getAttachedRequirement(Element element) {
+ ServiceDependencyHandler handler = (ServiceDependencyHandler) getHandler(HandlerFactory.IPOJO_NAMESPACE + ":subservice");
+ if (handler == null) { return null; }
+
+ String identity = element.getAttribute("id");
+ if (identity != null) {
+ // Look for dependency Id
+ for (int i = 0; i < handler.getRequirements().size(); i++) {
+ ServiceImporter imp = (ServiceImporter) handler.getRequirements().get(i);
+ if (imp.getId().equals(identity)) { return imp; }
+ }
+ }
+
+ // If not found or no id, look for a dependency with the same specification
+ String requirement = element.getAttribute("specification");
+ for (int i = 0; i < handler.getRequirements().size(); i++) {
+ ServiceImporter imp = (ServiceImporter) handler.getRequirements().get(i);
+ if (imp.getId().equals(requirement) || imp.getSpecification().getName().equals(requirement)) { return imp; }
+ }
+ return null;
+ }
+
+ /**
+ * Check the correctness of the composite requirement against the service level dependency.
+ * @param imp : requirement to check
+ * @param elem : service-level dependency metadata
+ * @throws CompositionException : occurs if the requirement does not match with service-level specification requirement
+ */
+ private void checkRequirement(ServiceImporter imp, Element elem) throws CompositionException {
+ String optional = elem.getAttribute("optional");
+ boolean opt = optional != null && optional.equalsIgnoreCase("true");
+
+ String aggregate = elem.getAttribute("aggregate");
+ boolean agg = aggregate != null && aggregate.equalsIgnoreCase("true");
+
+ if (imp == null) {
+ // Add the missing requirement
+ ServiceDependencyHandler handler = (ServiceDependencyHandler) getHandler(HandlerFactory.IPOJO_NAMESPACE + ":subservice");
+ if (handler == null) {
+ // Look for the ServiceDependencyHandler factory
+ HandlerManager handlerManager = null;
+ try {
+ ServiceReference[] refs = m_context.getServiceReferences(Factory.class.getName(), "(&(handler.name=subservice)(handler.namespace=" + HandlerFactory.IPOJO_NAMESPACE + ")(handler.type=composite))");
+ Factory factory = (Factory) m_context.getService(refs[0]);
+ handlerManager = (HandlerManager) factory.createComponentInstance(null, getCompositeManager().getServiceContext());
+ } catch (InvalidSyntaxException e) {
+ // Should not happen
+ } catch (UnacceptableConfiguration e) {
+ // Should not happen
+ } catch (MissingHandlerException e) {
+ // Should not happen
+ } catch (ConfigurationException e) {
+ // Should not happen
+ }
+
+ // Add the required handler
+ try {
+ handlerManager.init(getCompositeManager(), new Element("composite", ""), new Properties());
+ } catch (ConfigurationException e) {
+ error("Internal error : cannot configure the Import Handler : " + e.getMessage());
+ throw new CompositionException("Internal error : cannot configure the Import Handler : " + e.getMessage());
+ }
+ handler = (ServiceDependencyHandler) handlerManager.getHandler();
+ getCompositeManager().addCompositeHandler(handlerManager);
+ }
+
+ String spec = elem.getAttribute("specification");
+ String filter = "(&(objectClass=" + spec + ")(!(instance.name=" + getCompositeManager().getInstanceName() + ")))"; // Cannot import yourself
+ String givenFilter = elem.getAttribute("filter");
+ if (givenFilter != null) {
+ filter = "(&" + filter + givenFilter + ")"; //NOPMD
+ }
+
+ BundleContext context = new PolicyServiceContext(getCompositeManager().getGlobalContext(), getCompositeManager().getParentServiceContext(), PolicyServiceContext.GLOBAL);
+
+ Filter fil = null;
+ try {
+ fil = getCompositeManager().getGlobalContext().createFilter(filter);
+ } catch (InvalidSyntaxException e) {
+ throw new CompositionException("A required filter " + filter + " is malformed : " + e.getMessage());
+ }
+
+ Class specToImport = null;
+ try {
+ specToImport = getCompositeManager().getGlobalContext().getBundle().loadClass(spec);
+ } catch (ClassNotFoundException e) {
+ throw new CompositionException("A required specification cannot be loaded : " + spec);
+ }
+
+ ServiceImporter importer = new ServiceImporter(specToImport, fil, agg, opt, null, DependencyModel.DYNAMIC_BINDING_POLICY, context, null, handler);
+
+ handler.getRequirements().add(importer);
+ SpecificationMetadata specMeta = new SpecificationMetadata(spec, m_context, agg, opt, this);
+ m_services.add(specMeta); // Update the available types
+ return;
+ }
+
+ if (imp.isAggregate() && !agg) {
+ error("[" + getCompositeManager().getInstanceName() + "] The requirement " + elem.getAttribute("specification") + " is aggregate in the implementation and is declared as a simple service-level requirement");
+ throw new CompositionException("The requirement " + elem.getAttribute("specification") + " is aggregate in the implementation and is declared as a simple service-level requirement");
+ }
+
+ String filter = elem.getAttribute("filter");
+ if (filter != null) {
+ String filter2 = imp.getFilter();
+ if (filter2 == null || !filter2.equalsIgnoreCase(filter)) {
+ error("[" + getCompositeManager().getInstanceName() + "] The specification requirement " + elem.getAttribute("specification") + " as not the same filter as declared in the service-level requirement");
+ throw new CompositionException("The specification requirement " + elem.getAttribute("specification") + " as not the same filter as declared in the service-level requirement");
+ }
+ }
+ }
+
+ public HandlerDescription getDescription() {
+ return new ProvidedServiceHandlerDescription(this, m_managedServices, m_exporters);
+ }
+
+ /**
+ * Build available instance types.
+ */
+ private void computeAvailableTypes() {
+ InstanceHandler handler = (InstanceHandler) getHandler(HandlerFactory.IPOJO_NAMESPACE + ":instance");
+ if (handler == null) {
+ m_types = new ArrayList();
+ } else {
+ m_types = handler.getUsedType();
+ }
+ }
+
+ public List getInstanceType() {
+ return m_types;
+ }
+
+}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandlerDescription.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandlerDescription.java
new file mode 100644
index 0000000..5c22246
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandlerDescription.java
@@ -0,0 +1,96 @@
+/*
+ * 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.composite.service.provides;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.composite.CompositeHandler;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.util.DependencyModel;
+
+/**
+ * Provided Service Handler Description for composite.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ProvidedServiceHandlerDescription extends HandlerDescription {
+
+ /**
+ * Provided Service Description list.
+ */
+ private List m_services = new ArrayList();
+
+ /**
+ * List of exports.
+ */
+ private List m_exports;
+
+ /**
+ * Constructor.
+ *
+ * @param handler : composite handler.
+ * @param services : The list of Provided Service.
+ * @param exporters : list of managed exports
+ */
+ public ProvidedServiceHandlerDescription(CompositeHandler handler, List services, List exporters) {
+ super(handler);
+ m_services = services;
+ m_exports = exporters;
+ }
+
+ /**
+ * Get the handler description.
+ * @return the provided service handler description
+ * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+ */
+ public Element getHandlerInfo() {
+ Element services = super.getHandlerInfo();
+ for (int i = 0; i < m_services.size(); i++) {
+ ProvidedService svc = (ProvidedService) m_services.get(i);
+ Element service = new Element("service", "");
+ String state = "unregistered";
+ if (svc.isRegistered()) {
+ state = "registered";
+ }
+ String spec = "[" + svc.getSpecification() + "]";
+ service.addAttribute(new Attribute("Specification", spec));
+ service.addAttribute(new Attribute("State", state));
+ services.addElement(service);
+ }
+
+ for (int i = 0; i < m_exports.size(); i++) {
+ ServiceExporter exp = (ServiceExporter) m_exports.get(i);
+ Element expo = new Element("Exports", "");
+ expo.addAttribute(new Attribute("Specification", exp.getSpecification().getName()));
+ expo.addAttribute(new Attribute("Filter", exp.getFilter()));
+ if (exp.getState() == DependencyModel.RESOLVED) {
+ expo.addAttribute(new Attribute("State", "resolved"));
+ } else {
+ expo.addAttribute(new Attribute("State", "unresolved"));
+ }
+ services.addElement(expo);
+ }
+
+ return services;
+ }
+
+}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ServiceExporter.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ServiceExporter.java
new file mode 100644
index 0000000..38a790f
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/ServiceExporter.java
@@ -0,0 +1,163 @@
+/*
+ * 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.composite.service.provides;
+
+import java.util.Comparator;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.composite.CompositeManager;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.apache.felix.ipojo.util.DependencyStateListener;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * Export an service from the scope to the parent context.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ServiceExporter extends DependencyModel {
+
+ /**
+ * Destination context.
+ */
+ private BundleContext m_destination;
+
+ /**
+ * Composite Manager.
+ */
+ private CompositeManager m_manager;
+
+ /**
+ * Map of service reference - service registration storing exported services.
+ */
+ private Map/*<ServiceReference, ServiceRegistration>*/m_registrations = new HashMap();
+
+ /**
+ * Constructor.
+ *
+ * @param specification : exported service specification.
+ * @param filter : LDAP filter
+ * @param multiple : is the export an aggregate export?
+ * @param optional : is the export optional?
+ * @param cmp : comparator to use in the dependency
+ * @param policy : binding policy.
+ * @param from : internal service context
+ * @param dest : parent bundle context
+ * @param listener : dependency lifecycle listener to notify when the dependency state change.
+ * @param manager : composite manager
+ */
+ public ServiceExporter(Class specification, Filter filter, boolean multiple, boolean optional, Comparator cmp, int policy, ServiceContext from, BundleContext dest, DependencyStateListener listener, CompositeManager manager) {
+ super(specification, multiple, optional, filter, cmp, policy, from, listener);
+
+ m_destination = dest;
+
+ m_manager = manager;
+
+ }
+
+ /**
+ * Transform service reference property in a dictionary.
+ * instance.name and factory.name are injected too.
+ * @param ref : the service reference.
+ * @return the dictionary containing all property of the given service reference.
+ */
+ private Dictionary getProps(ServiceReference ref) {
+ Properties prop = new Properties();
+ String[] keys = ref.getPropertyKeys();
+ for (int i = 0; i < keys.length; i++) {
+ prop.put(keys[i], ref.getProperty(keys[i]));
+ }
+
+ prop.put("instance.name", m_manager.getInstanceName());
+ prop.put("factory.name", m_manager.getFactory().getName());
+
+ return prop;
+ }
+
+ /**
+ * Stop an exporter.
+ * Remove the service listener
+ * Unregister all exported services.
+ */
+ public void stop() {
+ super.stop();
+ Set refs = m_registrations.keySet();
+ Iterator iterator = refs.iterator();
+ while (iterator.hasNext()) {
+ ServiceReference ref = (ServiceReference) iterator.next();
+ ServiceRegistration reg = (ServiceRegistration) m_registrations.get(ref);
+ reg.unregister();
+ }
+ m_registrations.clear();
+ }
+
+ /**
+ * A service has been injected. Register it.
+ * @param reference : the new reference.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
+ */
+ public void onServiceArrival(ServiceReference reference) {
+ Object svc = getService(reference);
+ ServiceRegistration reg = m_destination.registerService(getSpecification().getName(), svc, getProps(reference));
+ m_registrations.put(reference, reg);
+ }
+
+ /**
+ * An exported service was modified.
+ * @param reference : modified reference
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void onServiceModification(ServiceReference reference) {
+ ServiceRegistration reg = (ServiceRegistration) m_registrations.get(reference);
+ if (reg != null) {
+ reg.setProperties(getProps(reference));
+ }
+ }
+
+ /**
+ * An exported service disappears.
+ * @param reference : service reference
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void onServiceDeparture(ServiceReference reference) {
+ ServiceRegistration reg = (ServiceRegistration) m_registrations.get(reference);
+ if (reg != null) {
+ reg.unregister();
+ }
+ m_registrations.remove(reference);
+ }
+
+ /**
+ * On Dependency Reconfiguration notification method.
+ * @param departs : leaving service references.
+ * @param arrivals : new injected service references.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onDependencyReconfiguration(org.osgi.framework.ServiceReference[], org.osgi.framework.ServiceReference[])
+ */
+ public void onDependencyReconfiguration(ServiceReference[] departs, ServiceReference[] arrivals) {
+ throw new UnsupportedOperationException("Dynamic dependency reconfiguration is not supported by service exporter");
+ }
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/SpecificationMetadata.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/SpecificationMetadata.java
similarity index 85%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/SpecificationMetadata.java
rename to ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/SpecificationMetadata.java
index 6ccf87b..392de87 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/SpecificationMetadata.java
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/service/provides/SpecificationMetadata.java
@@ -1,161 +1,158 @@
-/*
- * 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.composite.service.provides;
-
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.ipojo.util.Logger;
-import org.osgi.framework.BundleContext;
-
-/**
- * Represent a service specification.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class SpecificationMetadata {
-
- /**
- * Name of the specification, i.e. name of the interface.
- */
- private String m_name;
-
- /**
- * List of the method contained in the specification.
- */
- private List/* <MethodMetadata> */m_methods = new ArrayList/* <MethodMetadata> */();
-
- /**
- * Is the specification an aggregate?
- */
- private boolean m_isAggregate;
-
- /**
- * Is the specification optional?
- */
- private boolean m_isOptional = false;
-
- /**
- * Is the specification an interface?
- */
- private boolean m_isInterface = true;
-
- /**
- * Component Type.
- */
- private String m_componentType = null;
-
- /**
- * Reference on the handler.
- */
- private ProvidedServiceHandler m_handler;
-
- /**
- * Constructor.
- * @param name : specification name.
- * @param bc : bundle context.
- * @param isAggregate : is the specification aggregate.
- * @param isOptional : is the specification optional.
- * @param psd : the handler.
- */
- public SpecificationMetadata(String name, BundleContext bc, boolean isAggregate, boolean isOptional, ProvidedServiceHandler psd) {
- m_name = name;
- m_handler = psd;
-
- // Populate methods :
- try {
- Class clazz = bc.getBundle().loadClass(name);
- Method[] methods = clazz.getMethods();
- for (int i = 0; i < methods.length; i++) {
- MethodMetadata method = new MethodMetadata(methods[i]);
- m_methods.add(method);
- }
- } catch (ClassNotFoundException e) {
- m_handler.log(Logger.ERROR, "Cannot open " + name + " : " + e.getMessage());
- return;
- }
-
- m_isAggregate = isAggregate;
- m_isOptional = isOptional;
- }
-
- /**
- * Constructor.
- * @param c : class
- * @param type : component type
- * @param psd : the parent handler
- */
- public SpecificationMetadata(Class c, String type, ProvidedServiceHandler psd) {
- m_handler = psd;
- m_isAggregate = false;
- m_isOptional = false;
- m_componentType = type;
- m_name = c.getName();
- Method[] methods = c.getMethods();
- for (int i = 0; i < methods.length; i++) {
- MethodMetadata method = new MethodMetadata(methods[i]);
- m_methods.add(method);
- }
- m_isInterface = false;
- }
-
- public String getName() {
- return m_name;
- }
-
- public List/* <MethodMetadata> */getMethods() {
- return m_methods;
- }
-
- /**
- * Get a method by its name.
- * @param name : method name
- * @return the method metadata contained in the current specification with the given name. Null if the method is not found.
- */
- public MethodMetadata getMethodByName(String name) {
- for (int i = 0; i < m_methods.size(); i++) {
- MethodMetadata met = (MethodMetadata) m_methods.get(i);
- if (met.getMethod().getName().equals(name)) {
- return met;
- }
- }
- return null;
- }
-
- public boolean isAggregate() {
- return m_isAggregate;
- }
-
- public boolean isOptional() {
- return m_isOptional;
- }
-
- public boolean isInterface() {
- return m_isInterface;
- }
-
- public void setIsOptional(boolean optional) {
- m_isOptional = optional;
- }
-
- public String getComponentType() {
- return m_componentType;
- }
-
-}
+/*
+ * 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.composite.service.provides;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.osgi.framework.BundleContext;
+
+/**
+ * Represent a service specification.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class SpecificationMetadata {
+
+ /**
+ * Name of the specification, i.e. name of the interface.
+ */
+ private String m_name;
+
+ /**
+ * List of the method contained in the specification.
+ */
+ private List/* <MethodMetadata> */m_methods = new ArrayList/* <MethodMetadata> */();
+
+ /**
+ * Is the specification an aggregate?
+ */
+ private boolean m_isAggregate;
+
+ /**
+ * Is the specification optional?
+ */
+ private boolean m_isOptional = false;
+
+ /**
+ * Is the specification an interface?
+ */
+ private boolean m_isInterface = true;
+
+ /**
+ * Component Type.
+ */
+ private String m_componentType = null;
+
+ /**
+ * Reference on the handler.
+ */
+ private ProvidedServiceHandler m_handler;
+
+ /**
+ * Constructor.
+ * @param name : specification name.
+ * @param context : bundle context.
+ * @param isAggregate : is the specification aggregate.
+ * @param isOptional : is the specification optional.
+ * @param psd : the handler.
+ */
+ public SpecificationMetadata(String name, BundleContext context, boolean isAggregate, boolean isOptional, ProvidedServiceHandler psd) {
+ m_name = name;
+ m_handler = psd;
+
+ // Populate methods :
+ try {
+ Class clazz = context.getBundle().loadClass(name);
+ Method[] methods = clazz.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ MethodMetadata method = new MethodMetadata(methods[i]);
+ m_methods.add(method);
+ }
+ } catch (ClassNotFoundException e) {
+ m_handler.error("Cannot open " + name + " : " + e.getMessage());
+ return;
+ }
+
+ m_isAggregate = isAggregate;
+ m_isOptional = isOptional;
+ }
+
+ /**
+ * Constructor.
+ * @param clazz : class
+ * @param type : component type
+ * @param psd : the parent handler
+ */
+ public SpecificationMetadata(Class clazz, String type, ProvidedServiceHandler psd) {
+ m_handler = psd;
+ m_isAggregate = false;
+ m_isOptional = false;
+ m_componentType = type;
+ m_name = clazz.getName();
+ Method[] methods = clazz.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ MethodMetadata method = new MethodMetadata(methods[i]);
+ m_methods.add(method);
+ }
+ m_isInterface = false;
+ }
+
+ public String getName() {
+ return m_name;
+ }
+
+ public List/* <MethodMetadata> */getMethods() {
+ return m_methods;
+ }
+
+ /**
+ * Get a method by its name.
+ * @param name : method name
+ * @return the method metadata contained in the current specification with the given name. Null if the method is not found.
+ */
+ public MethodMetadata getMethodByName(String name) {
+ for (int i = 0; i < m_methods.size(); i++) {
+ MethodMetadata met = (MethodMetadata) m_methods.get(i);
+ if (met.getMethod().getName().equals(name)) { return met; }
+ }
+ return null;
+ }
+
+ public boolean isAggregate() {
+ return m_isAggregate;
+ }
+
+ public boolean isOptional() {
+ return m_isOptional;
+ }
+
+ public boolean isInterface() {
+ return m_isInterface;
+ }
+
+ public void setIsOptional(boolean optional) {
+ m_isOptional = optional;
+ }
+
+ public String getComponentType() {
+ return m_componentType;
+ }
+
+}
diff --git a/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/util/SourceManager.java b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/util/SourceManager.java
new file mode 100644
index 0000000..d7f227a
--- /dev/null
+++ b/ipojo/composite/src/main/java/org/apache/felix/ipojo/composite/util/SourceManager.java
@@ -0,0 +1,376 @@
+/*
+ * 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.composite.util;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.ContextListener;
+import org.apache.felix.ipojo.ContextSource;
+import org.apache.felix.ipojo.composite.CompositeManager;
+import org.apache.felix.ipojo.parser.ParseUtils;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.apache.felix.ipojo.util.Tracker;
+import org.apache.felix.ipojo.util.TrackerCustomizer;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * This class manages context-source management.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class SourceManager implements ContextListener {
+
+ /**
+ * Source Name service property.
+ */
+ public static final String SOURCE_NAME = "source.name";
+
+ /**
+ * Managed dependency.
+ */
+ private DependencyModel m_dependency;
+
+ /**
+ * List of monitored context sources.
+ */
+ private List/* <ContextSource> */m_sources = new ArrayList(1);
+
+ /**
+ * PRoperties contained in the original filter.
+ */
+ private String[] m_properties;
+
+ /**
+ * Original filter (containing variables).
+ */
+ private String m_filter;
+
+ /**
+ * Bundle context.
+ */
+ private BundleContext m_context;
+
+ /**
+ * Service Tracker List.
+ */
+ private List/*<SourceTracker>*/m_trackers = new ArrayList(1);
+
+ /**
+ * Constructor.
+ * @param sources : context-source attribute from the dependency metadata
+ * @param depfilter : original dependency filter
+ * @param dependency : dependency object
+ * @param manager : composite manager
+ * @throws ConfigurationException : the sources are incorrect.
+ */
+ public SourceManager(String sources, String depfilter, DependencyModel dependency, CompositeManager manager) throws ConfigurationException {
+ m_filter = depfilter;
+ m_properties = getProperties(depfilter);
+ m_dependency = dependency;
+ m_context = manager.getGlobalContext();
+ if (manager.getParentServiceContext() == null) {
+ // The parent is the global context
+ parseSources(sources, manager.getGlobalContext(), manager.getGlobalContext(), manager.getServiceContext());
+ } else {
+ parseSources(sources, manager.getGlobalContext(), manager.getParentServiceContext(), manager.getServiceContext());
+ }
+ }
+
+ /**
+ * Start the context management.
+ */
+ public void start() {
+ for (int i = 0; i < m_trackers.size(); i++) {
+ ((SourceTracker) m_trackers.get(i)).open();
+ }
+ computeFilter();
+ }
+
+ /**
+ * Stop the context management.
+ */
+ public void stop() {
+ for (int i = 0; i < m_trackers.size(); i++) {
+ ((SourceTracker) m_trackers.get(i)).close();
+ }
+ setFilter(m_filter);
+ m_sources.clear();
+ }
+
+ /**
+ * Get the state of this source manager.
+ * @return the state of this source manager.
+ */
+ public int getState() {
+ if (m_sources.isEmpty()) {
+ return DependencyModel.UNRESOLVED;
+ } else {
+ return DependencyModel.RESOLVED;
+ }
+ }
+
+ /**
+ * Set the filter of the managed dependency.
+ * @param filter : the new filter to apply
+ */
+ private void setFilter(String filter) {
+ if (!filter.equals(m_dependency.getFilter())) {
+ // Reconfigure
+ try {
+ m_dependency.setFilter(m_context.createFilter(filter));
+ } catch (InvalidSyntaxException e) {
+ throw new IllegalStateException("A context filter is invalid : " + filter);
+ }
+ }
+ }
+
+ /**
+ * Compute the new filter.
+ */
+ private void computeFilter() {
+ String fil = m_filter;
+ synchronized (this) {
+ for (int i = 0; i < m_sources.size(); i++) {
+ Dictionary props = ((ContextSource) m_sources.get(i)).getContext();
+ fil = substitute(fil, props); //NOPMD
+ }
+ }
+ if (!fil.equals(m_dependency.getFilter())) {
+ setFilter(fil);
+ }
+ }
+
+ /**
+ * This method substitute ${var} substring by values stored in a map.
+ * @param str : string with variables
+ * @param values : dictionary containing the variable name and the value.
+ * @return resulted string
+ */
+ public static String substitute(String str, Dictionary values) {
+ int len = str.length();
+ StringBuffer buffer = new StringBuffer(len);
+
+ int prev = 0;
+ int start = str.indexOf("${");
+ int end = str.indexOf('}', start);
+ while (start != -1 && end != -1) {
+ String key = str.substring(start + 2, end);
+ Object value = values.get(key);
+ if (value == null) {
+ buffer.append(str.substring(prev, end + 1));
+ } else {
+ buffer.append(str.substring(prev, start));
+ buffer.append(value);
+ }
+ prev = end + 1;
+ if (prev >= str.length()) {
+ break;
+ }
+
+ start = str.indexOf("${", prev);
+ if (start != -1) {
+ end = str.indexOf('}', start);
+ }
+ }
+
+ buffer.append(str.substring(prev));
+
+ return buffer.toString();
+ }
+
+ /**
+ * Compute the properties (${name}) from the given filter.
+ * @param str : string form of the filter.
+ * @return the list of found properties.
+ */
+ public static String[] getProperties(String str) {
+ List list = new ArrayList();
+ int prev = 0;
+ int start = str.indexOf("${");
+ int end = str.indexOf('}', start);
+ while (start != -1 && end != -1) {
+ String key = str.substring(start + 2, end);
+ list.add(key);
+ prev = end + 1;
+ if (prev >= str.length()) {
+ break;
+ }
+
+ start = str.indexOf("${", prev);
+ if (start != -1) {
+ end = str.indexOf('}', start);
+ }
+ }
+
+ return (String[]) list.toArray(new String[list.size()]);
+ }
+
+ /**
+ * A context source has modified a monitored property.
+ * @param source : source
+ * @param property : modified property
+ * @param value : new value.
+ * @see org.apache.felix.ipojo.ContextListener#update(org.apache.felix.ipojo.ContextSource, java.lang.String, java.lang.Object)
+ */
+ public synchronized void update(ContextSource source, String property, Object value) {
+ computeFilter();
+ }
+
+ /**
+ * Parse the context-source attribute in order to create source tracker object.
+ * @param sourceAtt : context-source attribute.
+ * @param global : global bundle context.
+ * @param parent : parent bundle context.
+ * @param local : local bundle context.
+ * @throws ConfigurationException : the context-source attribute is invalid.
+ */
+ private void parseSources(String sourceAtt, BundleContext global, BundleContext parent, BundleContext local) throws ConfigurationException {
+ String[] sources = ParseUtils.split(sourceAtt, ",");
+ for (int i = 0; i < sources.length; i++) {
+ String[] srcs = ParseUtils.split(sources[i], ":");
+ if (srcs.length == 1) {
+ // No prefix use local. //TODO choose default case.
+ SourceTracker tracker = new SourceTracker(srcs[0], local);
+ m_trackers.add(tracker);
+ } else if (srcs.length == 2) {
+ // According to prefix add the source in the good list.
+ if (srcs[0].equalsIgnoreCase("parent")) {
+ SourceTracker tracker = new SourceTracker(srcs[1], parent);
+ m_trackers.add(tracker);
+ } else if (srcs[0].equalsIgnoreCase("local")) {
+ SourceTracker tracker = new SourceTracker(srcs[1], local);
+ m_trackers.add(tracker);
+ } else if (srcs[0].equalsIgnoreCase("global")) {
+ SourceTracker tracker = new SourceTracker(srcs[1], global);
+ m_trackers.add(tracker);
+ } else {
+ throw new ConfigurationException("Unknowns context scope : " + srcs[0]);
+ }
+ } else {
+ throw new ConfigurationException("Malformed context source : " + sources[i]);
+ }
+ }
+ }
+
+ /**
+ * A context source appears.
+ * @param source : new context source.
+ */
+ private void addContextSource(ContextSource source) {
+ m_sources.add(source);
+ computeFilter();
+ source.registerContextListener(this, m_properties);
+ }
+
+ /**
+ * A context source disappears.
+ * @param source : leaving context source.
+ */
+ private void removeContextSource(ContextSource source) {
+ m_sources.remove(source);
+ computeFilter();
+ }
+
+ private class SourceTracker implements TrackerCustomizer {
+
+ /**
+ * Service tracker.
+ */
+ private Tracker m_tracker;
+
+ /**
+ * Constructor.
+ * @param name : name of the required context-source.
+ * @param countext : bundle context to use.
+ * @throws ConfigurationException : the context-source name is invalid.
+ */
+ public SourceTracker(String name, BundleContext countext) throws ConfigurationException {
+ String fil = "(&(" + Constants.OBJECTCLASS + "=" + ContextSource.class.getName() + ")(" + SOURCE_NAME + "=" + name + "))";
+ try {
+ Filter filter = countext.createFilter(fil);
+ m_tracker = new Tracker(countext, filter, this);
+ } catch (InvalidSyntaxException e) {
+ throw new ConfigurationException("A Context source filter is invalid " + fil + " : " + e.getMessage());
+ }
+ }
+
+ /**
+ * Open the tracker.
+ */
+ public void open() {
+ m_tracker.open();
+ }
+
+ /**
+ * Close the tracker.
+ */
+ public void close() {
+ m_tracker.close();
+ }
+
+ /**
+ * A new context-source was added.
+ * This method inject the context-source object in the source manager.
+ * @param reference : service reference.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
+ */
+ public void addedService(ServiceReference reference) {
+ addContextSource((ContextSource) m_tracker.getService(reference));
+ }
+
+ /**
+ * A new context-source is adding in the tracker..
+ * @param reference : service reference
+ * @return true.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
+ */
+ public boolean addingService(ServiceReference reference) {
+ return true;
+ }
+
+ /**
+ * A used context-source is modified.
+ * @param reference : service reference.
+ * @param service : service object.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void modifiedService(ServiceReference reference, Object service) {
+ // Nothing to do.
+ }
+
+ /**
+ * A used context-source disappears.
+ * This method notify the Source Manager in order to manage this departure.
+ * @param reference : service reference.
+ * @param service : service object.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void removedService(ServiceReference reference, Object service) {
+ removeContextSource((ContextSource) service);
+ }
+
+ }
+
+}
diff --git a/ipojo/composite/src/main/resources/metadata.xml b/ipojo/composite/src/main/resources/metadata.xml
new file mode 100644
index 0000000..cb71d71
--- /dev/null
+++ b/ipojo/composite/src/main/resources/metadata.xml
@@ -0,0 +1,27 @@
+<ipojo>
+ <!-- Composite Handler -->
+ <handler
+ classname="org.apache.felix.ipojo.composite.instance.InstanceHandler"
+ name="instance" type="composite" architecture="false" level="1">
+ <requires filter="(factory.state=1)" field="m_factories"
+ optional="true">
+ <callback type="bind" method="bindFactory" />
+ <callback type="unbind" method="unbindFactory" />
+ </requires>
+ </handler>
+ <handler
+ classname="org.apache.felix.ipojo.composite.service.instantiator.ServiceDependencyHandler"
+ name="subservice" type="composite" architecture="false">
+ </handler>
+ <handler
+ classname="org.apache.felix.ipojo.composite.service.provides.ProvidedServiceHandler"
+ name="provides" type="composite" architecture="false" level="3">
+ </handler>
+ <handler
+ classname="org.apache.felix.ipojo.composite.architecture.ArchitectureHandler"
+ name="architecture" type="composite" architecture="false">
+ <provides>
+ <property field="m_name" name="instance.name" value="" />
+ </provides>
+ </handler>
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/core/pom.xml b/ipojo/core/pom.xml
index 813548b..c7ef593 100644
--- a/ipojo/core/pom.xml
+++ b/ipojo/core/pom.xml
@@ -1,118 +1,125 @@
<!--
- 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.
+ 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.
-->
<project>
- <parent>
- <groupId>org.apache.felix</groupId>
- <artifactId>felix</artifactId>
- <version>1.0.2</version>
- <relativePath>../../pom/pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <packaging>bundle</packaging>
- <name>Apache Felix iPOJO</name>
- <artifactId>org.apache.felix.ipojo</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- <dependencies>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.osgi.core</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.osgi.compendium</artifactId>
- <version>1.0.0</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.ipojo.metadata</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <version>1.4.0</version>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-Name>iPOJO</Bundle-Name>
- <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
- <Bundle-Description> iPOJO </Bundle-Description>
- <Bundle-Activator>org.apache.felix.ipojo.Extender</Bundle-Activator>
- <Import-Package>
- org.osgi.framework,
- org.osgi.service.cm,
- org.osgi.service.log,
- !org.objectweb.asm*
- </Import-Package>
- <Private-Package>
- org.apache.felix.ipojo.manipulation,
- org.apache.felix.ipojo.composite.architecture,
- org.apache.felix.ipojo.composite.service*,
- org.apache.felix.ipojo.composite.instance,
- org.apache.felix.ipojo.handlers.architecture,
- org.apache.felix.ipojo.handlers.configuration,
- org.apache.felix.ipojo.handlers.dependency.nullable,
- org.apache.felix.ipojo.handlers.lifecycle.callback,
- org.apache.felix.ipojo.handlers.lifecycle.controller,
- org.objectweb.asm*;-split-package:=merge-first
- </Private-Package>
- <Export-Package>
- org.apache.felix.ipojo; version="0.7.5",
- org.apache.felix.ipojo.metadata; version="0.7.5",
- org.apache.felix.ipojo.architecture; version="0.7.5",
- org.apache.felix.ipojo.parser; version="0.7.5",
- org.apache.felix.ipojo.util; version="0.7.5",
- org.apache.felix.ipojo.handlers.dependency; version="0.7.5",
- org.apache.felix.ipojo.handlers.providedservice; version="0.7.5",
- org.apache.felix.ipojo.composite; version="0.7.5",
- org.osgi.service.cm,
- org.osgi.service.log
- </Export-Package>
- <_donotcopy>(CVS|.svn|.+.bak|~.+|metadata.xml)</_donotcopy>
- </instructions>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-ipojo-plugin</artifactId>
- <version>${pom.version}</version>
- <executions>
- <execution>
- <goals>
- <goal>ipojo-bundle</goal>
- </goals>
- <configuration>
- <metadata>metadata.xml</metadata>
- <ignoreAnnotations>true</ignoreAnnotations>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO</name>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>iPOJO</Bundle-Name>
+ <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
+ <Bundle-Description>
+ iPOJO Core Framework
+ </Bundle-Description>
+ <Bundle-Activator>
+ org.apache.felix.ipojo.Extender
+ </Bundle-Activator>
+ <IPOJO-Extension>
+ component:org.apache.felix.ipojo.ComponentFactory,
+ handler:org.apache.felix.ipojo.HandlerFactory
+ </IPOJO-Extension>
+ <Import-Package>
+ org.osgi.framework, org.osgi.service.cm,
+ org.osgi.service.log
+ </Import-Package>
+ <Private-Package>
+ org.apache.felix.ipojo.handlers.architecture,
+ org.apache.felix.ipojo.handlers.configuration,
+ org.apache.felix.ipojo.handlers.lifecycle.callback,
+ org.apache.felix.ipojo.handlers.lifecycle.controller
+ </Private-Package>
+ <Export-Package>
+ org.apache.felix.ipojo; version="0.7.6",
+ org.apache.felix.ipojo.metadata;
+ version="0.7.6",
+ org.apache.felix.ipojo.architecture;
+ version="0.7.6",
+ org.apache.felix.ipojo.parser;
+ version="0.7.6",
+ org.apache.felix.ipojo.util;
+ version="0.7.6",
+ org.apache.felix.ipojo.handlers.dependency;
+ version="0.7.6",
+ org.apache.felix.ipojo.handlers.providedservice;
+ version="0.7.6",
+ org.apache.felix.ipojo.context;
+ version="0.7.6", org.osgi.service.cm,
+ org.osgi.service.log
+ </Export-Package>
+ <_donotcopy>
+ (CVS|.svn|.+.bak|~.+|metadata.xml)
+ </_donotcopy>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <metadata>metadata.xml</metadata>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
</project>
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
index d5ff230..1c62ecf 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/ComponentFactory.java
@@ -21,27 +21,22 @@
import java.net.URL;
import java.security.ProtectionDomain;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.Dictionary;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Properties;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.PojoMetadata;
import org.apache.felix.ipojo.util.Logger;
import org.apache.felix.ipojo.util.Tracker;
import org.apache.felix.ipojo.util.TrackerCustomizer;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-import org.osgi.service.cm.ConfigurationException;
-import org.osgi.service.cm.ManagedServiceFactory;
/**
* The component factory manages component instance objects. This management
@@ -50,379 +45,114 @@
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public class ComponentFactory implements Factory, ManagedServiceFactory, TrackerCustomizer {
-
- /**
- * List of the managed instance name. This list is shared by all factories.
- */
- protected static List m_instancesName = new ArrayList();
-
- /**
- * Component-Type description exposed by the factory service.
- */
- protected ComponentDescription m_componentDesc;
-
- /**
- * List of the managed instance managers. The key of this map is the
- * name (i.e. instance names) of the created instance
- */
- protected Map m_componentInstances = new HashMap();
-
- /**
- * Component Type provided by this factory.
- */
- protected Element m_componentMetadata;
-
- /**
- * The bundle context reference.
- */
- protected BundleContext m_context = null;
-
- /**
- * Factory Name. Could be the component class name if the
- * factory name is not set.
- */
- protected String m_factoryName;
-
- /**
- * List of required handler.
- */
- protected List m_handlerIdentifiers = new ArrayList();
-
- /**
- * List of listeners.
- */
- protected List m_listeners = new ArrayList(5);
-
- /**
- * Logger for the factory (and all component instance).
- */
- protected Logger m_logger;
-
- /**
- * Factory state.
- */
- protected int m_state = Factory.INVALID;
+public class ComponentFactory extends IPojoFactory implements TrackerCustomizer {
/**
* Tracker used to track required handler factories.
*/
protected Tracker m_tracker;
-
- /**
- * Is the factory public (expose as a service).
- */
- protected boolean m_isPublic;
/**
* Class loader to delegate loading.
*/
private FactoryClassloader m_classLoader = null;
-
+
/**
* Component Implementation class.
*/
private byte[] m_clazz = null;
-
+
/**
* Component Implementation Class Name.
*/
- private String m_componentClassName = null;
-
+ private String m_classname = null;
+
/**
- * Index used to generate instance name if not set.
+ * Manipulation Metadata of the internal POJO.
*/
- private long m_index = 0;
-
- /**
- * Service Registration of this factory (Factory & ManagedServiceFactory).
- */
- private ServiceRegistration m_sr;
-
+ private PojoMetadata m_manipulation = null;
+
/**
* Create a instance manager factory. The class is given in parameter. The
* component type is not a composite.
- * @param bc : bundle context
+ * @param context : bundle context
* @param clazz : the component class
- * @param cm : metadata of the component
+ * @param element : metadata of the component
+ * @throws ConfigurationException occurs when the element describing the factory is malformed.
*/
- public ComponentFactory(BundleContext bc, byte[] clazz, Element cm) {
- this(bc, cm);
+ public ComponentFactory(BundleContext context, byte[] clazz, Element element) throws ConfigurationException {
+ this(context, element);
m_clazz = clazz;
}
-
- /**
- * Create a instance manager factory.
- * @param bc : bundle context
- * @param cm : metadata of the component to create
- */
- public ComponentFactory(BundleContext bc, Element cm) {
- m_context = bc;
- m_componentMetadata = cm;
-
- if (! check(cm)) {
- return;
- }
-
- computeFactoryName();
- m_logger = new Logger(m_context, m_factoryName, Logger.WARNING);
-
- String fac = cm.getAttribute("factory");
- m_isPublic = fac == null || ! fac.equalsIgnoreCase("false");
-
- computeRequiredHandlers();
-
- }
-
- /**
- * Add a factory listener.
- * @param l : the factory listener to add
- * @see org.apache.felix.ipojo.Factory#addFactoryStateListener(org.apache.felix.ipojo.FactoryStateListener)
- */
- public void addFactoryStateListener(FactoryStateListener l) {
- synchronized (m_listeners) {
- m_listeners.add(l);
- }
- // TODO do we need to notify the actual state of the factory to the new listener ?
- }
/**
- * A new handler factory is detected.
- * Test if the factory can be used or not.
- * @param reference : the new service reference.
- * @return true if the given factory reference match with a required handler.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
+ * Create a instance manager factory.
+ * @param context : bundle context
+ * @param element : metadata of the component to create
+ * @throws ConfigurationException occurs when the element describing the factory is malformed.
*/
- public boolean addingService(ServiceReference reference) {
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- if (hi.m_reference == null && match(hi, reference)) {
- int oldP = hi.m_level;
- hi.setReference(reference);
- // If the priority has changed, sort the list.
- if (oldP != hi.m_level) {
- Collections.sort(m_handlerIdentifiers);
- }
- return true;
- }
- }
- return false;
+ public ComponentFactory(BundleContext context, Element element) throws ConfigurationException {
+ super(context, element);
+ check(element); // NOPMD. This invocation is normal.
}
-
- /**
- * A matching service has been added to the tracker, we can no compute the factory state.
- * @param reference : added reference.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
- */
- public void addedService(ServiceReference reference) {
- if (m_state == INVALID) {
- try {
- computeFactoryState();
- } catch (org.apache.felix.ipojo.ConfigurationException e) {
- m_logger.log(Logger.ERROR, "The component type metadata are not correct : " + e.getMessage());
- stop();
- }
- }
+
+ public ComponentTypeDescription getComponentTypeDescription() {
+ return new PrimitiveTypeDescription(this);
}
/**
* Check method : allow a factory to check if given element are correct.
* A component factory metadata are correct if they contain the 'classname' attribute.
- * @param cm : the metadata
- * @return true if the metadata are correct
+ * @param element : the metadata
+ * @throws ConfigurationException occurs when the element describing the factory is malformed.
*/
- public boolean check(Element cm) {
- m_componentClassName = cm.getAttribute("className");
- if (m_componentClassName == null) {
- System.err.println("A component needs a class name : " + cm);
- return false;
- } else {
- return true;
- }
+ public void check(Element element) throws ConfigurationException {
+ m_classname = element.getAttribute("className");
+ if (m_classname == null) { throw new ConfigurationException("A component needs a class name : " + element); }
+ }
+
+ public String getClassName() {
+ return m_classname;
}
/**
- * Create an instance. The given configuration needs to contain the 'name'
- * property.
- * @param configuration : configuration of the created instance.
- * @return the created component instance.
- * @throws UnacceptableConfiguration : occurs if the given configuration is
- * not consistent with the component type of this factory.
- * @throws MissingHandlerException : occurs if an handler is unavailable when the instance is created.
- * @throws org.apache.felix.ipojo.ConfigurationException : occurs when the instance or type configuration are not correct.
- * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
+ * Create a primitive instance.
+ * @param config : instance configuration
+ * @param context : service context.
+ * @param handlers : handler to use
+ * @return the created instance
+ * @throws org.apache.felix.ipojo.ConfigurationException : if the configuration process failed.
+ * @see org.apache.felix.ipojo.IPojoFactory#createInstance(java.util.Dictionary, org.apache.felix.ipojo.IPojoContext, org.apache.felix.ipojo.HandlerManager[])
*/
- public ComponentInstance createComponentInstance(Dictionary configuration) throws UnacceptableConfiguration, MissingHandlerException, org.apache.felix.ipojo.ConfigurationException {
- return createComponentInstance(configuration, null);
- }
-
- /**
- * Create an instance. The given configuration needs to contain the 'name'
- * property.
- * @param configuration : configuration of the created instance.
- * @param serviceContext : the service context to push for this instance.
- * @return the created component instance.
- * @throws UnacceptableConfiguration : occurs if the given configuration is
- * not consistent with the component type of this factory.
- * @throws MissingHandlerException : occurs when an handler is unavailable when creating the instance.
- * @throws org.apache.felix.ipojo.ConfigurationException : when the instance configuration failed.
- * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
- */
- public synchronized ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration, MissingHandlerException, org.apache.felix.ipojo.ConfigurationException {
- if (configuration == null) {
- configuration = new Properties();
- }
-
+ public ComponentInstance createInstance(Dictionary config, IPojoContext context, HandlerManager[] handlers) throws org.apache.felix.ipojo.ConfigurationException {
+ InstanceManager instance = new InstanceManager(this, context, handlers);
+ instance.configure(m_componentMetadata, config);
try {
- checkAcceptability(configuration);
- } catch (UnacceptableConfiguration e) {
- m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
- throw new UnacceptableConfiguration("The configuration " + configuration + " is not acceptable for " + m_factoryName + ": " + e.getMessage());
+ instance.start();
+ return instance;
+ } catch (IllegalStateException e) {
+ // An exception occurs during the start method.
+ m_logger.log(Logger.ERROR, e.getMessage(), e);
+ throw new ConfigurationException(e.getMessage());
}
-
- String n = null;
- if (configuration.get("name") != null) {
- n = (String) configuration.get("name");
- if (m_instancesName.contains(n)) {
- throw new UnacceptableConfiguration("Name already used : " + n);
- }
- } else {
- n = generateName();
- configuration.put("name", n);
- }
- m_instancesName.add(n);
-
- BundleContext context = null;
- if (serviceContext == null) {
- context = new IPojoContext(m_context);
- } else {
- context = new IPojoContext(m_context, serviceContext);
- }
-
- List handlers = new ArrayList();
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- handlers.add(getHandlerInstance(hi, serviceContext));
- }
-
- InstanceManager instance = new InstanceManager(this, context, (HandlerManager[]) handlers.toArray(new HandlerManager[m_handlerIdentifiers.size()]));
- try {
- instance.configure(m_componentMetadata, configuration);
- } catch (org.apache.felix.ipojo.ConfigurationException e) {
- throw new org.apache.felix.ipojo.ConfigurationException(e.getMessage(), m_factoryName);
- }
-
- m_componentInstances.put(n, instance);
- instance.start();
-
- return instance;
}
/**
* Define a class.
* @param name : qualified name of the class
- * @param b : byte array of the class
+ * @param clazz : byte array of the class
* @param domain : protection domain of the class
* @return the defined class object
*/
- public Class defineClass(String name, byte[] b, ProtectionDomain domain) {
+ public Class defineClass(String name, byte[] clazz, ProtectionDomain domain) {
if (m_classLoader == null) {
m_classLoader = new FactoryClassloader();
}
- return m_classLoader.defineClass(name, b, domain);
- }
-
- /**
- * Delete an instance.
- * @param in : name of the instance to delete
- * @see org.osgi.service.cm.ManagedServiceFactory#deleted(java.lang.String)
- */
- public synchronized void deleted(String in) {
- m_instancesName.remove(in);
- final ComponentInstance cm = (ComponentInstance) m_componentInstances.remove(in);
- if (cm == null) {
- return; // do nothing, the component does not exist !
- } else {
- cm.dispose();
- }
+ return m_classLoader.defineClass(name, clazz, domain);
}
/**
- * Get the component type description.
- * @return the component type description object. Null if not already computed.
- */
- public ComponentDescription getComponentDescription() {
- return m_componentDesc;
- }
-
- /**
- * Get the component type description attached to this factory.
- * @return : the component type description
- * @see org.apache.felix.ipojo.Factory#getDescription()
- */
- public Element getDescription() {
- if (m_componentDesc == null) { return new Element("No description available for " + m_factoryName, ""); }
- return m_componentDesc.getDescription();
- }
-
- /**
- * Get the logger used by instances of he current factory.
- * @return the factory logger.
- */
- public Logger getLogger() {
- return m_logger;
- }
-
- /**
- * Get the list of missing handlers.
- * @return the list of missing handlers (namespace:name)
- * @see org.apache.felix.ipojo.Factory#getMissingHandlers()
- */
- public List getMissingHandlers() {
- List l = new ArrayList();
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- if (hi.m_reference == null) {
- l.add(hi.getFullName());
- }
- }
- return l;
- }
-
- /**
- * Get the name of this factory.
- *
- * @return the name of this factory
- * @see org.apache.felix.ipojo.Factory#getName()
- */
- public String getName() {
- return m_factoryName;
- }
-
- /**
- * Get the list of required handlers.
- * @return the list of required handlers (namespace:name)
- * @see org.apache.felix.ipojo.Factory#getRequiredHandlers()
- */
- public List getRequiredHandlers() {
- List l = new ArrayList();
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- l.add(hi.getFullName());
- }
- return l;
- }
-
- public String getClassName() {
- return m_componentClassName;
- }
-
- public int getState() {
- return m_state;
- }
-
- /**
* Return the URL of a resource.
* @param resName : resource name
* @return the URL of the resource
@@ -432,24 +162,6 @@
}
/**
- * Check if the given configuration is acceptable as a component instance
- * configuration. This method checks that if all the configurable properties
- * have a value.
- * @param conf : the configuration to check
- * @return true when the configuration seems to be acceptable
- */
- public boolean isAcceptable(Dictionary conf) {
- try {
- checkAcceptability(conf);
- } catch (UnacceptableConfiguration e) {
- return false;
- } catch (MissingHandlerException e) {
- return false;
- }
- return true;
- }
-
- /**
* Load a class.
* @param className : name of the class to load
* @return the resulting Class object
@@ -457,22 +169,144 @@
* @throws ClassNotFoundException : happen when the class is not found
*/
public Class loadClass(String className) throws ClassNotFoundException {
- if (m_clazz != null && className.equals(m_componentClassName)) {
+ if (m_clazz != null && className.equals(m_classname)) {
// Used the factory classloader to load the component implementation
// class
if (m_classLoader == null) {
m_classLoader = new FactoryClassloader();
}
- try {
- return m_classLoader.defineClass(m_componentClassName, m_clazz, null);
- } catch (Exception e) {
- throw new ClassNotFoundException("[Bundle " + m_context.getBundle().getBundleId() + "] Cannot define the class : " + className, e);
- }
+ return m_classLoader.defineClass(m_classname, m_clazz, null);
}
return m_context.getBundle().loadClass(className);
}
/**
+ * Start the factory.
+ */
+ public synchronized void starting() {
+ if (m_requiredHandlers.size() != 0) {
+ try {
+ String filter = "(&(" + Handler.HANDLER_TYPE_PROPERTY + "=" + PrimitiveHandler.HANDLER_TYPE + ")" + "(factory.state=1)" + ")";
+ m_tracker = new Tracker(m_context, m_context.createFilter(filter), this);
+ m_tracker.open();
+ } catch (InvalidSyntaxException e) {
+ m_logger.log(Logger.ERROR, "A factory filter is not valid: " + e.getMessage());
+ stop();
+ }
+ }
+ }
+
+ /**
+ * Stop all the instance managers.
+ */
+ public synchronized void stopping() {
+ m_tracker.close();
+ m_tracker = null;
+ m_classLoader = null;
+ m_clazz = null;
+ }
+
+ /**
+ * Compute the factory name.
+ * @return the factory name.
+ */
+ public String getFactoryName() {
+ String name = m_componentMetadata.getAttribute("name");
+ if (name == null) { // No factory name, try with factory attribute
+ name = m_componentMetadata.getAttribute("factory");
+ if (name == null || name.equalsIgnoreCase("true") || name.equalsIgnoreCase("false")) { // Avoid boolean case
+ name = m_componentMetadata.getAttribute("className");
+ }
+ }
+ return name;
+ }
+
+ /**
+ * Compute required handlers.
+ * @return the required handler list.
+ */
+ public List getRequiredHandlerList() {
+ List list = new ArrayList();
+ Element[] elems = m_componentMetadata.getElements();
+ for (int i = 0; i < elems.length; i++) {
+ Element current = elems[i];
+ if (!"manipulation".equals(current.getName())) {
+ RequiredHandler req = new RequiredHandler(current.getName(), current.getNameSpace());
+ if (!list.contains(req)) {
+ list.add(req);
+ }
+ }
+ }
+
+ // Add architecture if architecture != 'false'
+ String arch = m_componentMetadata.getAttribute("architecture");
+ if (arch == null || arch.equalsIgnoreCase("true")) {
+ list.add(new RequiredHandler("architecture", null));
+ }
+
+ // Add lifecycle callback if immediate = true
+ RequiredHandler reqCallback = new RequiredHandler("callback", null);
+ String imm = m_componentMetadata.getAttribute("immediate");
+ if (!list.contains(reqCallback) && imm != null && imm.equalsIgnoreCase("true")) {
+ list.add(reqCallback);
+ }
+
+ return list;
+ }
+
+ /**
+ * A new handler factory is detected.
+ * Test if the factory can be used or not.
+ * @param reference : the new service reference.
+ * @return true if the given factory reference match with a required handler.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
+ */
+ public boolean addingService(ServiceReference reference) {
+ for (int i = 0; i < m_requiredHandlers.size(); i++) {
+ RequiredHandler req = (RequiredHandler) m_requiredHandlers.get(i);
+ if (req.getReference() == null && match(req, reference)) {
+ int oldP = req.getLevel();
+ req.setReference(reference);
+ // If the priority has changed, sort the list.
+ if (oldP != req.getLevel()) {
+ Collections.sort(m_requiredHandlers);
+ }
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * A matching service has been added to the tracker, we can no compute the factory state.
+ * @param reference : added reference.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
+ */
+ public void addedService(ServiceReference reference) {
+ if (m_state == INVALID) {
+ computeFactoryState();
+ }
+ }
+
+ /**
+ * A used factory disappears.
+ * @param reference : service reference.
+ * @param service : factory object.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void removedService(ServiceReference reference, Object service) {
+ // Look for the implied reference and invalid the handler identifier
+ for (int i = 0; i < m_requiredHandlers.size(); i++) {
+ RequiredHandler req = (RequiredHandler) m_requiredHandlers.get(i);
+ if (reference.equals(req.getReference())) {
+ req.unRef(); // This method will unget the service.
+ computeFactoryState();
+ return; // The factory can be used only once.
+ }
+ }
+ }
+
+ /**
* A used handler factory is modified.
* @param reference : the service reference
* @param service : the Factory object (if already get)
@@ -483,561 +317,15 @@
}
/**
- * Reconfigure an existing instance.
- * @param properties : the new configuration to push.
- * @throws UnacceptableConfiguration : occurs if the new configuration is
- * not consistent with the component type.
- * @throws MissingHandlerException : occurs if the current factory is not valid.
- * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
+ * Returns manipulation metadata of this component type.
+ * The returned object is computed at the first call and then is cached.
+ * @return manipulation metadata of this component type.
*/
- public synchronized void reconfigure(Dictionary properties) throws UnacceptableConfiguration, MissingHandlerException {
- if (properties == null || properties.get("name") == null) {
- throw new UnacceptableConfiguration("The configuration does not contains the \"name\" property");
+ public PojoMetadata getPojoMetadata() {
+ if (m_manipulation == null) {
+ m_manipulation = new PojoMetadata(m_componentMetadata);
}
- final String name = (String) properties.get("name");
- InstanceManager cm = (InstanceManager) m_componentInstances.get(name);
-
- if (cm == null) {
- return; // The instance does not exist.
- } else {
- checkAcceptability(properties); // Test if the configuration is acceptable
- cm.reconfigure(properties); // re-configure the component
- }
- }
-
- /**
- * A used factory disappears.
- * @param reference : service reference.
- * @param service : factory object.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void removedService(ServiceReference reference, Object service) {
- // Look for the implied reference and invalid the handler identifier
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- if (reference.equals(hi.getReference())) {
- hi.unRef(); // This method will unget the service.
- try {
- computeFactoryState();
- } catch (org.apache.felix.ipojo.ConfigurationException e) {
- m_logger.log(Logger.ERROR, "The component type metadata are not correct : " + e.getMessage());
- stop();
- }
- return; // The factory can be used only once.
- }
- }
- }
-
- /**
- * Remove a factory listener.
- * @param l : the factory listener to remove
- * @see org.apache.felix.ipojo.Factory#removeFactoryStateListener(org.apache.felix.ipojo.FactoryStateListener)
- */
- public void removeFactoryStateListener(FactoryStateListener l) {
- synchronized (m_listeners) {
- m_listeners.remove(l);
- }
- }
-
- /**
- * Start the factory.
- */
- public synchronized void start() {
- if (m_componentDesc != null) { // Already started.
- return;
- }
-
- if (m_handlerIdentifiers.size() != 0) {
- try {
- String filter = "(&(" + Constants.OBJECTCLASS + "=" + Factory.class.getName() + ")"
- + "(" + Handler.HANDLER_TYPE_PROPERTY + "=" + PrimitiveHandler.HANDLER_TYPE + ")"
- + "(factory.state=1)"
- + ")";
- m_tracker = new Tracker(m_context, m_context.createFilter(filter), this);
- m_tracker.open();
- } catch (InvalidSyntaxException e) {
- m_logger.log(Logger.ERROR, "A factory filter is not valid: " + e.getMessage());
- stop();
- return;
- }
- }
-
- try {
- computeFactoryState();
- } catch (org.apache.felix.ipojo.ConfigurationException e) {
- m_logger.log(Logger.ERROR, "The component type metadata are not correct : " + e.getMessage());
- stop();
- return;
- }
-
- if (m_isPublic) {
- // Exposition of the factory service
- m_sr = m_context.registerService(new String[] { Factory.class.getName(), ManagedServiceFactory.class.getName() }, this, getProperties());
- }
- }
-
- /**
- * Stop all the instance managers.
- */
- public synchronized void stop() {
- if (m_sr != null) {
- m_sr.unregister();
- m_sr = null;
- }
-
- if (m_tracker != null) {
- m_tracker.close();
- }
-
- final Collection col = m_componentInstances.values();
- final Iterator it = col.iterator();
- while (it.hasNext()) {
- InstanceManager ci = (InstanceManager) it.next();
- if (ci.getState() != ComponentInstance.DISPOSED) {
- ci.kill();
- }
- m_instancesName.remove(ci.getInstanceName());
- }
-
- m_componentInstances.clear();
-
- // Release each handler
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- ((HandlerIdentifier) m_handlerIdentifiers.get(i)).unRef();
- }
-
- m_tracker = null;
- m_componentDesc = null;
- m_classLoader = null;
- m_clazz = null;
- m_state = INVALID;
- }
-
- /**
- * Create of update an instance.
- * @param in : name of the instance
- * @param properties : configuration of the instance
- * @throws ConfigurationException : if the configuration is not consistent
- * for this component type
- * @see org.osgi.service.cm.ManagedServiceFactory#updated(java.lang.String,
- * java.util.Dictionary)
- */
- public synchronized void updated(String in, Dictionary properties) throws ConfigurationException {
- final InstanceManager cm = (InstanceManager) m_componentInstances.get(in);
- if (cm == null) {
- try {
- properties.put("name", in); // Add the name in the configuration
- createComponentInstance(properties);
- } catch (UnacceptableConfiguration e) {
- m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
- throw new ConfigurationException(properties.toString(), e.getMessage());
- } catch (MissingHandlerException e) {
- m_logger.log(Logger.ERROR, "Handler not available : " + e.getMessage());
- throw new ConfigurationException(properties.toString(), e.getMessage());
- } catch (org.apache.felix.ipojo.ConfigurationException e) {
- m_logger.log(Logger.ERROR, "The Component Type metadata are not correct : " + e.getMessage());
- throw new ConfigurationException(properties.toString(), e.getMessage());
- }
- } else {
- try {
- properties.put("name", in); // Add the name in the configuration
- reconfigure(properties); // re-configure the component
- } catch (UnacceptableConfiguration e) {
- m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
- throw new ConfigurationException(properties.toString(), e.getMessage());
- } catch (MissingHandlerException e) {
- m_logger.log(Logger.ERROR, "The facotry is not valid, at least one handler is missing : " + e.getMessage());
- throw new ConfigurationException(properties.toString(), e.getMessage());
- }
- }
- }
-
- /**
- * Test is a configuration is acceptable for the factory.
- * @param conf : the configuration to test.
- * @throws UnacceptableConfiguration : the configuration is not acceptable.
- * @throws MissingHandlerException : the factory is not valid.
- */
- protected void checkAcceptability(Dictionary conf) throws UnacceptableConfiguration, MissingHandlerException {
- if (m_state == Factory.INVALID) {
- throw new MissingHandlerException(getMissingHandlers());
- }
-
- List props = m_componentDesc.getRequiredProperties();
- for (int i = 0; i < props.size(); i++) {
- // Failed if the props has no default value and the configuration does not push a value
- if (conf.get(props.get(i)) == null) {
- throw new UnacceptableConfiguration("The configuration does not contains the \"" + props.get(i) + "\" property");
- }
- }
- }
-
- /**
- * Compute the component type description.
- * The factory must be valid when calling this method.
- * @throws org.apache.felix.ipojo.ConfigurationException if one handler has rejected the configuration.
- */
- protected void computeDescription() throws org.apache.felix.ipojo.ConfigurationException {
- m_componentDesc = new ComponentDescription(this);
-
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- HandlerManager hm = getHandlerInstance(hi, null);
- Handler ch = hm.getHandler();
- try {
- ch.setLogger(getLogger());
- ch.initializeComponentFactory(m_componentDesc, m_componentMetadata);
- ((Pojo) ch).getComponentInstance().dispose();
- } catch (org.apache.felix.ipojo.ConfigurationException e) {
- ((Pojo) ch).getComponentInstance().dispose();
- throw new org.apache.felix.ipojo.ConfigurationException(e.getMessage(), m_factoryName);
- }
- }
- }
-
- /**
- * Compute the factory name.
- */
- protected void computeFactoryName() {
- m_factoryName = m_componentMetadata.getAttribute("name");
- if (m_factoryName == null) { // No factory name, try with factory attribute
- m_factoryName = m_componentMetadata.getAttribute("factory");
- if (m_factoryName == null || m_factoryName.equalsIgnoreCase("true") || m_factoryName.equalsIgnoreCase("false")) { // Avoid boolean case
- m_factoryName = m_componentMetadata.getAttribute("className");
- }
- }
- }
-
- /**
- * Compute factory state.
- * @throws org.apache.felix.ipojo.ConfigurationException : occurs when the component type cannot be initialize.
- */
- protected void computeFactoryState() throws org.apache.felix.ipojo.ConfigurationException {
- boolean isValid = true;
- for (int i = 0; isValid && i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- isValid = hi.m_reference != null;
- }
-
- if (isValid) {
- if (m_state == INVALID) {
-
- if (m_componentDesc == null) {
- computeDescription();
- }
-
- m_state = VALID;
- if (m_sr != null) {
- m_sr.setProperties(getProperties());
- }
- for (int i = 0; i < m_listeners.size(); i++) {
- ((FactoryStateListener) m_listeners.get(i)).stateChanged(this, VALID);
- }
- return;
- }
- } else {
- if (m_state == VALID) {
- m_state = INVALID;
-
- // Notify listeners.
- for (int i = 0; i < m_listeners.size(); i++) {
- ((FactoryStateListener) m_listeners.get(i)).stateChanged(this, INVALID);
- }
-
- // Dispose created instances.
- final Collection col = m_componentInstances.values();
- final Iterator it = col.iterator();
- while (it.hasNext()) {
- InstanceManager ci = (InstanceManager) it.next();
- if (ci.getState() != ComponentInstance.DISPOSED) {
- ci.kill();
- }
- m_instancesName.remove(ci.m_name);
- }
-
- m_componentInstances.clear();
-
- // Update service properties TODO : really useful ?
- if (m_sr != null) {
- m_sr.setProperties(getProperties());
- }
-
- return;
- }
- }
- }
-
- /**
- * Compute required handlers.
- */
- protected void computeRequiredHandlers() {
- Element[] elems = m_componentMetadata.getElements();
- for (int i = 0; i < elems.length; i++) {
- Element current = elems[i];
- if (current.getName().equals("manipulation")) { continue; }
- HandlerIdentifier hi = new HandlerIdentifier(current.getName(), current.getNameSpace());
- if (! m_handlerIdentifiers.contains(hi)) { m_handlerIdentifiers.add(hi); }
- }
-
- // Add architecture if architecture != 'false'
- HandlerIdentifier hi = new HandlerIdentifier("architecture", null);
- String arch = m_componentMetadata.getAttribute("architecture");
- if (arch == null || arch.equalsIgnoreCase("true")) {
- m_handlerIdentifiers.add(hi);
- }
-
- // Add lifecycle callback if immediate = true
- HandlerIdentifier hi2 = new HandlerIdentifier("callback", null);
- String imm = m_componentMetadata.getAttribute("immediate");
- if (! m_handlerIdentifiers.contains(hi2) && imm != null && imm.equalsIgnoreCase("true")) {
- m_handlerIdentifiers.add(hi2);
- }
- }
-
- /**
- * Callback called by instance when disposed.
- * @param ci : the destroyed instance
- */
- protected void disposed(ComponentInstance ci) {
- String name = ci.getInstanceName();
- m_instancesName.remove(name);
- m_componentInstances.remove(name);
- }
-
- /**
- * Generate an instance name.
- * @return an non already used name
- */
- protected synchronized String generateName() {
- String name = m_factoryName + "-" + m_index;
- while (m_instancesName.contains(name)) {
- m_index = m_index + 1;
- name = m_factoryName + "-" + m_index;
- }
- return name;
- }
-
- /**
- * Return the bundle context.
- * @return the Bundle Context.
- */
- public BundleContext getBundleContext() {
- return m_context;
- }
-
- /**
- * Get the implementation class of the component type.
- *
- * @return the name of the component-type implementation class.
- */
- protected String getComponentClassName() {
- return m_componentClassName;
- }
-
- /**
- * Compute factory properties.
- * @return the properties.
- */
- protected Properties getProperties() {
- final Properties props = new Properties();
-
- props.put("component.class", m_componentClassName);
-
- props.put("factory.name", m_factoryName);
- props.put(Constants.SERVICE_PID, m_factoryName); // Service PID is required for the integration in the configuration admin.
-
- if (m_componentDesc != null) {
- props.put("component.providedServiceSpecifications", m_componentDesc.getprovidedServiceSpecification());
- props.put("component.properties", m_componentDesc.getProperties());
- props.put("component.description", m_componentDesc);
- }
-
- // Add factory state
- props.put("factory.state", "" + m_state);
-
- return props;
- }
-
- /**
- * Check if the given handler identifier and the service reference can match.
- * @param hi : the handler identifier.
- * @param ref : the service reference.
- * @return true if the service reference can fulfill the handler requirement
- */
- protected boolean match(HandlerIdentifier hi, ServiceReference ref) {
- String name = (String) ref.getProperty(Handler.HANDLER_NAME_PROPERTY);
- String ns = (String) ref.getProperty(Handler.HANDLER_NAMESPACE_PROPERTY);
- if (IPojoConfiguration.IPOJO_NAMESPACE.equals(ns)) {
- return name.equals(hi.m_name) && hi.m_namespace == null;
- }
- return name.equals(hi.m_name) && ns.equals(hi.m_namespace);
- }
-
- /**
- * Return an handler object.
- * @param hi : handler to create.
- * @param sc : service context in which create the handler (instance context).
- * @return the Handler object.
- */
- private HandlerManager getHandlerInstance(HandlerIdentifier hi, ServiceContext sc) {
- try {
- return (HandlerManager) hi.getFactory().createComponentInstance(null, sc);
- } catch (MissingHandlerException e) {
- m_logger.log(Logger.ERROR, "The creation of the handler " + hi.getFullName() + " has failed: " + e.getMessage());
- stop();
- return null;
- } catch (UnacceptableConfiguration e) {
- m_logger.log(Logger.ERROR, "The creation of the handler " + hi.getFullName() + " has failed (UnacceptableConfiguration): " + e.getMessage());
- stop();
- return null;
- } catch (org.apache.felix.ipojo.ConfigurationException e) {
- m_logger.log(Logger.ERROR, "The configuration of the handler " + hi.getFullName() + " has failed (ConfigurationException): " + e.getMessage());
- stop();
- return null;
- }
- }
-
- /**
- * Structure storing required handlers.
- */
- class HandlerIdentifier implements Comparable {
- /**
- * Factory to create this handler.
- */
- private HandlerFactory m_factory;
-
- /**
- * Handler name.
- */
- private String m_name;
-
- /**
- * Handler start level.
- */
- private int m_level = Integer.MAX_VALUE;
-
- /**
- * Handler namespace.
- */
- private String m_namespace;
-
- /**
- * Service Reference of the handler factory.
- */
- private ServiceReference m_reference;
-
- /**
- * Constructor.
- * @param n : handler name.
- * @param ns : handler namespace.
- */
- public HandlerIdentifier(String n, String ns) {
- m_name = n;
- m_namespace = ns;
- }
-
- /**
- * Equals method.
- * Two handlers are equals if they have same name and namespace or they share the same service reference.
- * @param o : object to compare to the current object.
- * @return : true if the two compared object are equals
- * @see java.lang.Object#equals(java.lang.Object)
- */
- public boolean equals(Object o) {
- if (m_namespace == null) {
- return ((HandlerIdentifier) o).m_name.equalsIgnoreCase(m_name) && ((HandlerIdentifier) o).m_namespace == null;
- } else {
- return ((HandlerIdentifier) o).m_name.equalsIgnoreCase(m_name) && m_namespace.equalsIgnoreCase(((HandlerIdentifier) o).m_namespace);
- }
- }
-
- /**
- * Get the factory object used for this handler.
- * The object is get when used for the first time.
- * @return the factory object.
- */
- public HandlerFactory getFactory() {
- if (m_reference == null) {
- return null;
- }
- if (m_factory == null) {
- m_factory = (HandlerFactory) m_tracker.getService(getReference());
- }
- return m_factory;
- }
-
- /**
- * Get the handler full name (namespace:name).
- * @return the handler full name
- */
- public String getFullName() {
- if (m_namespace == null) {
- return IPojoConfiguration.IPOJO_NAMESPACE + ":" + m_name;
- } else {
- return m_namespace + ":" + m_name;
- }
- }
-
- public String getName() {
- return m_name;
- }
-
- public String getNamespace() {
- return m_namespace;
- }
-
- public ServiceReference getReference() {
- return m_reference;
- }
-
- public int getLevel() {
- return m_level;
- }
-
- /**
- * Release the reference of the used factory.
- */
- public void unRef() {
- if (m_reference != null) {
- m_tracker.ungetService(m_reference);
- m_factory = null;
- m_reference = null;
- }
- }
-
- /**
- * Set the service reference.
- * If the new service reference is null, it unget the used factory (if already get).
- * @param ref : new service reference.
- */
- public void setReference(ServiceReference ref) {
- m_reference = ref;
- Integer p = (Integer) m_reference.getProperty(Handler.HANDLER_LEVEL_PROPERTY);
- if (p != null) {
- m_level = p.intValue();
- }
- }
-
- /**
- * Start level Comparison.
- * This method is used to sort the handler array.
- * @param o : object on which compare.
- * @return -1, 0, +1 according to the comparison of their start level.
- * @see java.lang.Comparable#compareTo(java.lang.Object)
- */
- public int compareTo(Object o) {
- if (o instanceof HandlerIdentifier) {
- HandlerIdentifier hi = (HandlerIdentifier) o;
- if (this.m_level == hi.m_level) {
- return 0;
- } else if (this.m_level < hi.m_level) {
- return -1;
- } else {
- return +1;
- }
- }
- return 0;
- }
+ return m_manipulation;
}
/**
@@ -1048,22 +336,20 @@
/**
* Map of defined classes [Name, Class Object].
*/
- private Map m_definedClasses = new HashMap();
+ private final Map m_definedClasses = new HashMap();
/**
* The defineClass method.
* @param name : name of the class
- * @param b : the byte array of the class
+ * @param clazz : the byte array of the class
* @param domain : the protection domain
* @return : the defined class.
*/
- public Class defineClass(String name, byte[] b, ProtectionDomain domain) {
- if (m_definedClasses.containsKey(name)) {
- return (Class) m_definedClasses.get(name);
- }
- final Class c = super.defineClass(name, b, 0, b.length, domain);
- m_definedClasses.put(name, c);
- return c;
+ public Class defineClass(String name, byte[] clazz, ProtectionDomain domain) {
+ if (m_definedClasses.containsKey(name)) { return (Class) m_definedClasses.get(name); }
+ Class clas = super.defineClass(name, clazz, 0, clazz.length, domain);
+ m_definedClasses.put(name, clas);
+ return clas;
}
/**
@@ -1084,8 +370,44 @@
* @return : the loaded class
* @throws ClassNotFoundException : the class to load is not found
*/
- protected Class loadClass(final String name, final boolean resolve) throws ClassNotFoundException {
+ protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException {
return m_context.getBundle().loadClass(name);
}
}
+
+ private final class PrimitiveTypeDescription extends ComponentTypeDescription {
+
+ /**
+ * Constructor.
+ * @param factory : the represented factory.
+ */
+ public PrimitiveTypeDescription(Factory factory) {
+ super(factory);
+ }
+
+ /**
+ * Compute the properties to publish :
+ * component.class contains the pojo class name.
+ * @return the dictionary of properties to publish
+ * @see org.apache.felix.ipojo.architecture.ComponentTypeDescription#getPropertiesToPublish()
+ */
+ public Dictionary getPropertiesToPublish() {
+ Dictionary dict = super.getPropertiesToPublish();
+ if (m_classname != null) {
+ dict.put("component.class", m_classname);
+ }
+ return dict;
+ }
+
+ /**
+ * Add the "implementation-class" attribute to the type description.
+ * @return the component type description.
+ * @see org.apache.felix.ipojo.architecture.ComponentTypeDescription#getDescription()
+ */
+ public Element getDescription() {
+ Element elem = super.getDescription();
+ elem.addAttribute(new Attribute("Implementation-Class", m_classname));
+ return elem;
+ }
+ }
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/CompositeFactory.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/CompositeFactory.java
deleted file mode 100644
index a87015e..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/CompositeFactory.java
+++ /dev/null
@@ -1,410 +0,0 @@
-/*
- * 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;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Dictionary;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.felix.ipojo.architecture.ComponentDescription;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.util.Logger;
-import org.apache.felix.ipojo.util.Tracker;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-
-/**
- * The component factory manages component instance objects. This management
- * consist in creating and managing component instance build with the component
- * factory. This class could export Factory and ManagedServiceFactory services.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class CompositeFactory extends ComponentFactory implements Factory {
-
- /**
- * Service Registration of this factory (Factory & ManagedServiceFactory).
- */
- private ServiceRegistration m_sr;
-
- /**
- * Create a composite factory.
- * @param bc : bundle context
- * @param cm : metadata of the component to create
- */
- public CompositeFactory(BundleContext bc, Element cm) {
- super(bc, cm);
- }
-
- /**
- * Check if the metadata are well formed.
- * @param cm : metadata
- * @return true if the metadata are correct.
- * @see org.apache.felix.ipojo.ComponentFactory#check(org.apache.felix.ipojo.metadata.Element)
- */
- public boolean check(Element cm) {
- m_factoryName = cm.getAttribute("name");
- if (m_factoryName == null) {
- System.err.println("A composite needs a name");
- return false;
- } else {
- return true;
- }
- }
-
- /**
- * Check if the given handler identifier can be fulfilled by the given service reference.
- * @param hi : handler identifier.
- * @param ref : service reference.
- * @return true if the service reference can fulfill the given handler identifier
- * @see org.apache.felix.ipojo.ComponentFactory#match(org.apache.felix.ipojo.ComponentFactory.HandlerIdentifier, org.osgi.framework.ServiceReference)
- */
- public boolean match(HandlerIdentifier hi, ServiceReference ref) {
- String name = (String) ref.getProperty(Handler.HANDLER_NAME_PROPERTY);
- String ns = (String) ref.getProperty(Handler.HANDLER_NAMESPACE_PROPERTY);
- String type = (String) ref.getProperty(Handler.HANDLER_TYPE_PROPERTY);
-
- if ("composite".equals(type)) {
- if (IPojoConfiguration.IPOJO_NAMESPACE.equals(ns)) {
- return name.equals(hi.getName()) && hi.getNamespace() == null;
- }
- return name.equals(hi.getName()) && ns.equals(hi.getNamespace());
- } else {
- return false;
- }
- }
-
-
- /**
- * Compute required handlers.
- */
- protected void computeRequiredHandlers() {
- Element[] elems = m_componentMetadata.getElements();
- for (int i = 0; i < elems.length; i++) {
- Element current = elems[i];
- HandlerIdentifier hi = new HandlerIdentifier(current.getName(), current.getNameSpace());
- if (! m_handlerIdentifiers.contains(hi)) { m_handlerIdentifiers.add(hi); }
- }
-
- // Add architecture if architecture != 'false'
- String arch = m_componentMetadata.getAttribute("architecture");
- if (arch == null || arch.equalsIgnoreCase("true")) {
- HandlerIdentifier hi = new HandlerIdentifier("architecture", null);
- if (! m_handlerIdentifiers.contains(hi)) { m_handlerIdentifiers.add(hi); }
- }
- }
-
- /**
- * Stop all the instance managers.
- */
- public synchronized void stop() {
- if (m_tracker != null) {
- m_tracker.close();
- }
-
- final Collection col = m_componentInstances.values();
- final Iterator it = col.iterator();
- while (it.hasNext()) {
- CompositeManager ci = (CompositeManager) it.next();
- if (ci.getState() != ComponentInstance.DISPOSED) {
- ci.kill();
- }
- m_instancesName.remove(ci.getInstanceName());
- }
-
- m_componentInstances.clear();
- if (m_sr != null) {
- m_sr.unregister();
- m_sr = null;
- }
- m_tracker = null;
- m_componentDesc = null;
- m_state = INVALID;
- }
-
- /**
- * Start all the instance managers.
- */
- public synchronized void start() {
- if (m_componentDesc != null) { // Already started.
- return;
- }
- if (m_handlerIdentifiers.size() != 0) {
- try {
- String filter = "(&(" + Constants.OBJECTCLASS + "=" + Factory.class.getName() + ")"
- + "(" + Handler.HANDLER_TYPE_PROPERTY + "=" + CompositeHandler.HANDLER_TYPE + ")"
- + "(factory.state=1)"
- + ")";
- m_tracker = new Tracker(m_context, m_context.createFilter(filter), this);
- m_tracker.open();
- } catch (InvalidSyntaxException e) {
- m_logger.log(Logger.ERROR, "A factory filter is not valid: " + e.getMessage());
- stop();
- return;
- }
- }
-
- try {
- computeFactoryState();
- } catch (ConfigurationException e) {
- m_logger.log(Logger.ERROR, "The component type metadata are not correct : " + e.getMessage());
- stop();
- return;
- }
-
- // Check if the factory should be exposed
- if (m_isPublic) {
- // Exposition of the factory service
- m_sr = m_context.registerService(new String[] { Factory.class.getName() }, this, getProperties());
- }
- }
-
-
- /**
- * Compute factory service properties.
- * @return the factory service properties
- * @see org.apache.felix.ipojo.ComponentFactory#getProperties()
- */
- protected Properties getProperties() {
- final Properties props = new Properties();
-
- if (m_componentDesc != null) {
- props.put("component.providedServiceSpecifications", m_componentDesc.getprovidedServiceSpecification());
- props.put("component.properties", m_componentDesc.getProperties());
- props.put("component.description", m_componentDesc);
- }
-
- // Add factory state
- props.put("factory.state", "" + m_state);
-
- props.put("factory.name", m_factoryName);
-
- return props;
- }
-
- public String getClassName() {
- return "composite";
- }
-
-
- /**
- * Create an instance. The given configuration needs to contain the 'name'
- * property.
- * @param configuration : configuration of the created instance.
- * @return the created component instance.
- * @throws UnacceptableConfiguration : occurs if the given configuration is
- * not consistent with the component type of this factory.
- * @throws MissingHandlerException : occurs if an handler is unavailable when the instance is created.
- * @throws ConfigurationException : occurs if an error occurs during the instance configuration.
- * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
- */
- public synchronized ComponentInstance createComponentInstance(Dictionary configuration) throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
- return createComponentInstance(configuration, null);
- }
-
- /**
- * Create an instance. The given configuration needs to contain the 'name'
- * property.
- * @param configuration : configuration of the created instance.
- * @param serviceContext : the service context to push for this instance.
- * @return the created component instance.
- * @throws UnacceptableConfiguration : occurs if the given configuration is
- * not consistent with the component type of this factory.
- * @throws MissingHandlerException : occurs when an handler is unavailable when creating the instance.
- * @throws ConfigurationException : occurs when the instance configuration failed.
- * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
- */
- public synchronized ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
- if (configuration == null) {
- configuration = new Properties();
- }
-
- try {
- checkAcceptability(configuration);
- } catch (UnacceptableConfiguration e) {
- m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
- throw new UnacceptableConfiguration("The configuration " + configuration + " is not acceptable for " + m_factoryName + ": " + e.getMessage());
- }
-
-
- String in = null;
- if (configuration.get("name") != null) {
- in = (String) configuration.get("name");
- } else {
- in = generateName();
- configuration.put("name", in);
- }
-
- if (m_instancesName.contains(in)) {
- throw new UnacceptableConfiguration("Name already used : " + in + "(" + m_instancesName + ")");
- } else {
- m_instancesName.add(in);
- }
-
- BundleContext context = null;
- if (serviceContext == null) {
- context = new IPojoContext(m_context);
- } else {
- context = new IPojoContext(m_context, serviceContext);
- }
- ComponentInstance instance = null;
- List handlers = new ArrayList();
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- handlers.add(getHandlerInstance(hi, serviceContext));
- }
-
- final CompositeManager inst = new CompositeManager(this, context, (HandlerManager[]) handlers.toArray(new HandlerManager[0]));
- inst.configure(m_componentMetadata, configuration);
- instance = inst;
-
- m_componentInstances.put(in, instance);
- instance.start();
- return instance;
- }
-
- /**
- * Reconfigure an existing instance.
- * @param properties : the new configuration to push.
- * @throws UnacceptableConfiguration : occurs if the new configuration is
- * not consistent with the component type.
- * @throws MissingHandlerException : occurs when an handler is unavailable when creating the instance.
- * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
- */
- public synchronized void reconfigure(Dictionary properties) throws UnacceptableConfiguration, MissingHandlerException {
- if (properties == null || properties.get("name") == null) {
- throw new UnacceptableConfiguration("The configuration does not contains the \"name\" property");
- }
- final String name = (String) properties.get("name");
-
- ComponentInstance cm = (CompositeManager) m_componentInstances.get(name);
-
- if (cm == null) {
- return; // The instance does not exist.
- }
-
- cm.reconfigure(properties); // re-configure the component
- }
-
- /**
- * Compute factory state.
- * @throws ConfigurationException : occurs if the component type cannot be initialized correctly.
- */
- protected void computeFactoryState() throws ConfigurationException {
- boolean isValid = true;
- for (int i = 0; isValid && i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- isValid = hi.getReference() != null;
- }
-
- if (isValid && m_componentDesc == null) {
- computeDescription();
- }
-
- if (isValid && m_state == INVALID) {
- m_state = VALID;
- if (m_sr != null) {
- m_sr.setProperties(getProperties());
- }
- for (int i = 0; i < m_listeners.size(); i++) {
- ((FactoryStateListener) m_listeners.get(i)).stateChanged(this, VALID);
- }
- return;
- }
-
- if (!isValid && m_state == VALID) {
- m_state = INVALID;
-
- final Collection col = m_componentInstances.values();
- final Iterator it = col.iterator();
- while (it.hasNext()) {
- CompositeManager ci = (CompositeManager) it.next();
- ci.kill();
- m_instancesName.remove(ci.getInstanceName());
- }
-
- m_componentInstances.clear();
-
- if (m_sr != null) {
- m_sr.setProperties(getProperties());
- }
-
- for (int i = 0; i < m_listeners.size(); i++) {
- ((FactoryStateListener) m_listeners.get(i)).stateChanged(this, INVALID);
- }
- return;
- }
-
- }
-
- /**
- * Compute component type description.
- * @throws ConfigurationException : if one handler has rejected the configuration.
- * @see org.apache.felix.ipojo.ComponentFactory#computeDescription()
- */
- public void computeDescription() throws ConfigurationException {
- List l = new ArrayList();
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- l.add(hi.getFullName());
- }
-
- m_componentDesc = new ComponentDescription(this);
-
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- HandlerManager hm = getHandlerInstance(hi, null);
- hm.getHandler();
- Handler ch = hm.getHandler();
- ch.initializeComponentFactory(m_componentDesc, m_componentMetadata);
- ((Pojo) ch).getComponentInstance().dispose();
- }
- }
-
- /**
- * Get a composite handler object for the given handler identifier.
- * @param handler : the handler identifier.
- * @param sc : the service context in which creating the handler.
- * @return the composite handler object or null if not found.
- */
- private HandlerManager getHandlerInstance(HandlerIdentifier handler, ServiceContext sc) {
- Factory factory = (Factory) m_context.getService(handler.getReference());
- try {
- return (HandlerManager) factory.createComponentInstance(null, sc);
- } catch (MissingHandlerException e) {
- m_logger.log(Logger.ERROR, "The creation of the composite handler " + handler.getFullName() + " has failed: " + e.getMessage());
- stop();
- return null;
- } catch (UnacceptableConfiguration e) {
- m_logger.log(Logger.ERROR, "The creation of the composite handler " + handler.getFullName() + " has failed (UnacceptableConfiguration): " + e.getMessage());
- stop();
- return null;
- } catch (ConfigurationException e) {
- m_logger.log(Logger.ERROR, "The creation of the composite handler " + handler.getFullName() + " has failed (ConfigurationException): " + e.getMessage());
- stop();
- return null;
- }
- }
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/ConfigurationException.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/ConfigurationException.java
index 90c9ba4..cde3140 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/ConfigurationException.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/ConfigurationException.java
@@ -29,11 +29,6 @@
* Serialization Id.
*/
private static final long serialVersionUID = 1L;
-
- /**
- * Message.
- */
- private String m_message;
/**
* Component Type on which the error occurs.
@@ -46,8 +41,8 @@
* @param typ : component type
*/
ConfigurationException(String mes, String typ) {
+ super(mes);
m_type = typ;
- m_message = mes;
}
/**
@@ -55,7 +50,7 @@
* @param mes : message
*/
public ConfigurationException(String mes) {
- m_message = mes;
+ super(mes);
}
/**
@@ -64,10 +59,10 @@
* @see java.lang.Throwable#getMessage()
*/
public String getMessage() {
- if (m_type != null) {
- return "The configuration is not correct for the type " + m_type + " : " + m_message;
+ if (m_type == null) {
+ return super.getMessage();
} else {
- return m_message;
+ return "The configuration is not correct for the type " + m_type + " : " + super.getMessage();
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/ContextListener.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/ContextListener.java
new file mode 100644
index 0000000..d592c5c
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/ContextListener.java
@@ -0,0 +1,36 @@
+/*
+ * 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;
+
+
+/**
+ * Context Source Listener.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public interface ContextListener {
+
+ /**
+ * A monitored value has been modified.
+ * @param source : context source containing the property
+ * @param property : modified property name
+ * @param value : new value of the property
+ */
+ void update(ContextSource source, String property, Object value);
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/ContextSource.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/ContextSource.java
new file mode 100644
index 0000000..e55f163
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/ContextSource.java
@@ -0,0 +1,57 @@
+/*
+ * 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;
+
+import java.util.Dictionary;
+
+
+/**
+ * Context Source service interface.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public interface ContextSource {
+
+ /**
+ * Get the current value of the given property.
+ * @param property : property name
+ * @return the property value, null if unknown
+ */
+ Object getProperty(String property);
+
+ /**
+ * Get the whole context.
+ * @return the dictionary [Property, Value]
+ */
+ Dictionary getContext();
+
+ /**
+ * Register a context listener on the given set of properties.
+ * The listener will be notified of every change made on these properties.
+ * @param listener : the context listener to register.
+ * @param properties : property set monitored by the listener.
+ */
+ void registerContextListener(ContextListener listener, String[] properties);
+
+ /**
+ * Unregister the given context listener.
+ * @param listener : the listener to unregister.
+ */
+ void unregisterContextListener(ContextListener listener);
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/Extender.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/Extender.java
index aeb4c0f..fd9ab38 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/Extender.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/Extender.java
@@ -19,20 +19,27 @@
package org.apache.felix.ipojo;
import java.io.IOException;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Hashtable;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.parser.ManifestMetadataParser;
import org.apache.felix.ipojo.parser.ParseException;
+import org.apache.felix.ipojo.parser.ParseUtils;
+import org.apache.felix.ipojo.util.Logger;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleActivator;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleEvent;
-import org.osgi.framework.ServiceReference;
import org.osgi.framework.SynchronousBundleListener;
-import org.osgi.service.log.LogService;
/**
* iPOJO Extender.
@@ -42,39 +49,52 @@
public class Extender implements SynchronousBundleListener, BundleActivator {
/**
- * iPOJO Manifest header.
+ * iPOJO Component Type and Instance declaration header.
*/
private static final String IPOJO_HEADER = "iPOJO-Components";
-
+
+ /**
+ * iPOJO Extension declaration header.
+ */
+ private static final String IPOJO_EXTENSION = "IPOJO-Extension";
+
+ /**
+ * iPOJO Extender logger.
+ */
+ private Logger m_logger;
+
/**
* iPOJO Bundle Context.
*/
private BundleContext m_context;
-
+
/**
- * Dictionary of [BundleId, Factory List].
+ * Declared instance manager.
*/
- private Dictionary m_components;
-
+ private InstanceCreator m_creator;
+
/**
- * Dictionary of [BundleId, Instance Creator].
+ * iPOJO Bundle.
*/
- private Dictionary m_creators;
-
+ private Bundle m_bundle;
+
/**
- * iPOJO Bundle Id.
+ * List of factory types.
*/
- private long m_bundleId;
-
+ private List m_factoryTypes = new ArrayList();
+
+ /**
+ * List of unbound types.
+ */
+ private final List m_unboundTypes = new ArrayList();
+
/**
* Bundle Listener Notification.
* @param event : the bundle event.
* @see org.osgi.framework.BundleListener#bundleChanged(org.osgi.framework.BundleEvent)
*/
public synchronized void bundleChanged(BundleEvent event) {
- if (event.getBundle().getBundleId() == m_bundleId) {
- return;
- }
+ if (event.getBundle() == m_bundle) { return; }
switch (event.getType()) {
case BundleEvent.STARTED:
@@ -83,7 +103,7 @@
case BundleEvent.STOPPING:
closeManagementFor(event.getBundle());
break;
- default:
+ default:
break;
}
@@ -94,42 +114,109 @@
* @param bundle : the bundle.
*/
private void closeManagementFor(Bundle bundle) {
- ComponentFactory[] cfs = (ComponentFactory[]) m_components.get(bundle);
- InstanceCreator creator = (InstanceCreator) m_creators.get(bundle);
- if (cfs == null && creator == null) { return; }
- for (int i = 0; cfs != null && i < cfs.length; i++) {
- ComponentFactory factory = cfs[i];
- factory.stop();
+ List toRemove = new ArrayList();
+ for (int k = 0; k < m_factoryTypes.size(); k++) {
+ ManagedAbstractFactoryType mft = (ManagedAbstractFactoryType) m_factoryTypes.get(k);
+
+ // Delete instances declared in the leaving bundle.
+ m_creator.removeInstancesFromBundle(bundle.getBundleId());
+
+ // Look for component type created from this bundle.
+ if (mft.m_created != null) {
+ List cfs = (List) mft.m_created.remove(bundle);
+ for (int i = 0; cfs != null && i < cfs.size(); i++) {
+ IPojoFactory factory = (IPojoFactory) cfs.get(i);
+ m_creator.removeFactory(factory);
+ factory.stop();
+ }
+ }
+
+ // If the leaving bundle has declared mft : destroy all created factories.
+ if (mft.m_bundle == bundle) {
+ if (mft.m_created != null) {
+ Iterator iterator = mft.m_created.keySet().iterator();
+ while (iterator.hasNext()) {
+ Bundle key = (Bundle) iterator.next();
+ List list = (List) mft.m_created.get(key);
+ for (int i = 0; i < list.size(); i++) {
+ IPojoFactory factory = (IPojoFactory) list.get(i);
+ factory.stop();
+ m_unboundTypes.add(new UnboundComponentType(mft.m_type, factory.m_componentMetadata, factory.getBundleContext()
+ .getBundle()));
+ }
+ }
+ }
+ toRemove.add(mft);
+ }
}
- if (creator != null) { creator.stop(); }
-
- m_components.remove(bundle);
- m_creators.remove(bundle);
-
+
+ for (int i = 0; i < toRemove.size(); i++) {
+ ManagedAbstractFactoryType mft = (ManagedAbstractFactoryType) toRemove.get(i);
+ m_logger.log(Logger.WARNING, "The factory type available: " + mft.m_type + " is no more available");
+ mft.m_bundle = null;
+ mft.m_clazz = null;
+ mft.m_created = null;
+ mft.m_type = null;
+ m_factoryTypes.remove(mft);
+ }
}
/**
- * Check if the given bundle is an iPOJO bundle, and begin the iPOJO management is true.
+ * Check if the given bundle is an iPOJO bundle, and begin the iPOJO management is true.
* @param bundle : the bundle to check.
*/
private void startManagementFor(Bundle bundle) {
- // Check bundle
Dictionary dict = bundle.getHeaders();
+ // Check for abstract factory type
+ String typeHeader = (String) dict.get(IPOJO_EXTENSION);
+ if (typeHeader != null) {
+ parseAbstractFactoryType(bundle, typeHeader);
+ }
+
+ // Check bundle
String header = (String) dict.get(IPOJO_HEADER);
- if (header == null) {
- return;
- } else {
+ if (header != null) {
try {
parse(bundle, header);
} catch (IOException e) {
- err("An exception occurs during the parsing of the bundle " + bundle.getBundleId(), e);
+ m_logger.log(Logger.ERROR, "An exception occurs during the parsing of the bundle " + bundle.getBundleId(), e);
} catch (ParseException e) {
- err("A parse exception occurs during the parsing of the bundle " + bundle.getBundleId(), e);
+ m_logger.log(Logger.ERROR, "A parse exception occurs during the parsing of the bundle " + bundle.getBundleId(), e);
}
}
-
}
-
+
+ /**
+ * Parse an IPOJO-Extension manifest header.
+ * @param bundle : bundle containing the header.
+ * @param header : header to parse.
+ */
+ private void parseAbstractFactoryType(Bundle bundle, String header) {
+ String[] arr = ParseUtils.split(header, ",");
+ for (int i = 0; arr != null && i < arr.length; i++) {
+ String[] arr2 = ParseUtils.split(arr[i], ":");
+ String type = arr2[0];
+ Class clazz;
+ try {
+ clazz = bundle.loadClass(arr2[1]);
+ } catch (ClassNotFoundException e) {
+ m_logger.log(Logger.ERROR, "Cannot load the extension " + type, e);
+ return;
+ }
+ ManagedAbstractFactoryType mft = new ManagedAbstractFactoryType(clazz, type, bundle);
+ m_factoryTypes.add(mft);
+ m_logger.log(Logger.WARNING, "New factory type available: " + type);
+
+ for (int j = m_unboundTypes.size() - 1; j >= 0; j--) {
+ UnboundComponentType unbound = (UnboundComponentType) m_unboundTypes.get(j);
+ if (unbound.m_type.equals(type)) {
+ createAbstractFactory(unbound.m_bundle, unbound.m_description);
+ m_unboundTypes.remove(unbound);
+ }
+ }
+ }
+ }
+
/**
* Parse the internal metadata (from the manifest (in the iPOJO-Components property)).
* @param bundle : the owner bundle.
@@ -140,35 +227,40 @@
private void parse(Bundle bundle, String components) throws IOException, ParseException {
ManifestMetadataParser parser = new ManifestMetadataParser();
parser.parseHeader(components);
-
- Element[] componentsMetadata = parser.getComponentsMetadata(); // Get the component type declaration
- for (int i = 0; i < componentsMetadata.length; i++) { addComponentFactory(bundle, componentsMetadata[i]); }
-
- start(bundle, parser.getInstances());
+
+ Element[] metadata = parser.getComponentsMetadata(); // Get the component type declaration
+ for (int i = 0; i < metadata.length; i++) {
+ createAbstractFactory(bundle, metadata[i]);
+ }
+
+ Dictionary[] instances = parser.getInstances();
+ for (int i = 0; instances != null && i < instances.length; i++) {
+ m_creator.addInstance(instances[i], bundle.getBundleId());
+ }
}
/**
* iPOJO Starting method.
- * @param bc : iPOJO bundle context.
- * @throws Exception : the start method failed.
+ * @param context : iPOJO bundle context.
* @see org.osgi.framework.BundleActivator#start(org.osgi.framework.BundleContext)
*/
- public void start(BundleContext bc) throws Exception {
- m_context = bc;
- m_bundleId = bc.getBundle().getBundleId();
- m_components = new Hashtable();
- m_creators = new Hashtable();
+ public void start(BundleContext context) {
+ m_context = context;
+ m_bundle = context.getBundle();
+ m_creator = new InstanceCreator(context);
+
+ m_logger = new Logger(m_context, "IPOJO Extender");
// Begin by initializing core handlers
- startManagementFor(bc.getBundle());
+ startManagementFor(m_bundle);
synchronized (this) {
// listen to any changes in bundles.
m_context.addBundleListener(this);
// compute already started bundles.
- for (int i = 0; i < bc.getBundles().length; i++) {
- if (bc.getBundles()[i].getState() == Bundle.ACTIVE) {
- startManagementFor(bc.getBundles()[i]);
+ for (int i = 0; i < context.getBundles().length; i++) {
+ if (context.getBundles()[i].getState() == Bundle.ACTIVE) {
+ startManagementFor(context.getBundles()[i]);
}
}
}
@@ -176,96 +268,238 @@
/**
* Stop the iPOJO Management.
- * @param bc : bundle context.
- * @throws Exception : the stop method failed.
+ * @param context : bundle context.
* @see org.osgi.framework.BundleActivator#stop(org.osgi.framework.BundleContext)
*/
- public void stop(BundleContext bc) throws Exception {
+ public void stop(BundleContext context) {
m_context.removeBundleListener(this);
- Enumeration e = m_components.keys();
- while (e.hasMoreElements()) {
- ComponentFactory[] cfs = (ComponentFactory[]) m_components.get(e.nextElement());
- for (int i = 0; i < cfs.length; i++) {
- cfs[i].stop();
+
+ for (int k = 0; k < m_factoryTypes.size(); k++) {
+ ManagedAbstractFactoryType mft = (ManagedAbstractFactoryType) m_factoryTypes.get(k);
+
+ if (mft.m_created != null) {
+ Iterator iterator = mft.m_created.keySet().iterator();
+ while (iterator.hasNext()) {
+ Bundle key = (Bundle) iterator.next();
+ List list = (List) mft.m_created.get(key);
+ for (int i = 0; i < list.size(); i++) {
+ IPojoFactory factory = (IPojoFactory) list.get(i);
+ m_creator.removeFactory(factory);
+ factory.dispose();
+ }
+ }
}
}
- m_components = null;
- Enumeration e2 = m_creators.keys();
- while (e2.hasMoreElements()) {
- InstanceCreator creator = (InstanceCreator) m_creators.remove(e2.nextElement());
- creator.stop();
- }
- m_creators = null;
+
+ m_factoryTypes = null;
+ m_creator = null;
}
-
+
/**
* Add a component factory to the factory list.
- * @param cm : the new component metadata.
+ * @param metadata : the new component metadata.
* @param bundle : the bundle.
*/
- private void addComponentFactory(Bundle bundle, Element cm) {
- ComponentFactory factory = null;
- if (cm.getName().equalsIgnoreCase("component")) {
- factory = new ComponentFactory(bundle.getBundleContext(), cm);
- } else if (cm.getName().equalsIgnoreCase("composite")) {
- factory = new CompositeFactory(bundle.getBundleContext(), cm);
- } else if (cm.getName().equalsIgnoreCase("handler")) {
- factory = new HandlerFactory(bundle.getBundleContext(), cm);
- } else {
- err("Not recognized element type : " + cm.getName(), null);
- }
-
- ComponentFactory[] cfs = (ComponentFactory[]) m_components.get(bundle);
-
- // If the factory array is not empty add the new factory at the end
- if (cfs != null && cfs.length != 0) {
- ComponentFactory[] newFactory = new ComponentFactory[cfs.length + 1];
- System.arraycopy(cfs, 0, newFactory, 0, cfs.length);
- newFactory[cfs.length] = factory;
- cfs = newFactory;
- m_components.put(bundle, cfs);
- } else {
- m_components.put(bundle, new ComponentFactory[] {factory}); // Else create an array of size one with the new Factory
- }
- }
-
- /**
- * Start the management of factories and create instances.
- * @param bundle : the bundle.
- * @param confs : the instances to create.
- */
- private void start(Bundle bundle, Dictionary[] confs) {
- ComponentFactory[] cfs = (ComponentFactory[]) m_components.get(bundle);
-
- // Start the factories
- if (cfs != null) {
- for (int j = 0; j < cfs.length; j++) {
- cfs[j].start();
+ private void createAbstractFactory(Bundle bundle, Element metadata) {
+ ManagedAbstractFactoryType factoryType = null;
+ // First, look for factory-type (component, handler, composite ...)
+ for (int i = 0; i < m_factoryTypes.size(); i++) {
+ ManagedAbstractFactoryType type = (ManagedAbstractFactoryType) m_factoryTypes.get(i);
+ if (type.m_type.equals(metadata.getName())) {
+ factoryType = type;
+ break;
}
}
- // Create the instance creator if needed.
- if (confs.length > 0) {
- m_creators.put(bundle, new InstanceCreator(bundle.getBundleContext(), confs, cfs));
+ // If not found, return. It will wait for a new component type factory.
+ if (factoryType == null) {
+ m_logger.log(Logger.WARNING, "Type of component not yet recognized : " + metadata.getName());
+ m_unboundTypes.add(new UnboundComponentType(metadata.getName(), metadata, bundle));
+ return;
+ }
+
+ // Once found, we invoke the AbstractFactory constructor to create the component factory.
+ Class clazz = factoryType.m_clazz;
+ try {
+ // Look for the constructor, and invoke it.
+ Constructor cst = clazz.getConstructor(new Class[] { BundleContext.class, Element.class });
+ IPojoFactory factory = (IPojoFactory) cst.newInstance(new Object[] { getBundleContext(bundle), metadata });
+
+ // Add the created factory in the m_createdFactories map.
+ if (factoryType.m_created == null) {
+ factoryType.m_created = new HashMap();
+ List list = new ArrayList();
+ list.add(factory);
+ factoryType.m_created.put(bundle, list);
+ } else {
+ List list = (List) factoryType.m_created.get(bundle);
+ if (list == null) {
+ list = new ArrayList();
+ list.add(factory);
+ factoryType.m_created.put(bundle, list);
+ } else {
+ list.add(factory);
+ }
+ }
+
+ // Start the created factory.
+ factory.start();
+ // Then add the factory to the instance creator.
+ m_creator.addFactory(factory);
+
+ } catch (SecurityException e) {
+ m_logger.log(Logger.ERROR, "Cannot instantiate an abstract factory from " + clazz.getName(), e);
+ } catch (NoSuchMethodException e) {
+ m_logger.log(Logger.ERROR, "Cannot instantiate an abstract factory from " + clazz.getName() + ": the given class constructor cannot be found");
+ } catch (IllegalArgumentException e) {
+ m_logger.log(Logger.ERROR, "Cannot instantiate an abstract factory from " + clazz.getName(), e);
+ } catch (InstantiationException e) {
+ m_logger.log(Logger.ERROR, "Cannot instantiate an abstract factory from " + clazz.getName(), e);
+ } catch (IllegalAccessException e) {
+ m_logger.log(Logger.ERROR, "Cannot instantiate an abstract factory from " + clazz.getName(), e);
+ } catch (InvocationTargetException e) {
+ m_logger.log(Logger.ERROR, "Cannot instantiate an abstract factory from " + clazz.getName(), e.getTargetException());
}
}
-
+
/**
- * Log an error message in a log service (if available) and display the message in the console.
- * @param message : the message to log
- * @param t : an attached error (can be null)
+ * Structure storing an iPOJO extension.
*/
- private void err(String message, Throwable t) {
- ServiceReference ref = m_context.getServiceReference(LogService.class.getName());
- if (ref != null) {
- LogService log = (LogService) m_context.getService(ref);
- log.log(LogService.LOG_ERROR, message, t);
- m_context.ungetService(ref);
- }
- if (t != null) {
- System.err.println("[iPOJO-Core] " + message + " : " + t.getMessage());
- } else {
- System.err.println("[iPOJO-Core] " + message);
+ private final class ManagedAbstractFactoryType {
+ /**
+ * TYpe (i.e.) name of the extension.
+ */
+ String m_type;
+
+ /**
+ * Abstract Factory class.
+ */
+ Class m_clazz;
+
+ /**
+ * Bundle object containing the declaration of the extension.
+ */
+ Bundle m_bundle;
+
+ /**
+ * Factories created by this extension.
+ */
+ private Map m_created;
+
+ /**
+ * Constructor.
+ * @param factory : abstract factory class.
+ * @param type : name of the extension.
+ * @param bundle : bundle declaring the extension.
+ */
+ protected ManagedAbstractFactoryType(Class factory, String type, Bundle bundle) {
+ m_bundle = bundle;
+ m_clazz = factory;
+ m_type = type;
}
}
+
+ /**
+ * Structure storing unbound component type declaration.
+ * Unbound means that there is no extension able to manage it.
+ */
+ private final class UnboundComponentType {
+ /**
+ * Component type description.
+ */
+ private final Element m_description;
+
+ /**
+ * Bundle declaring this type.
+ */
+ private final Bundle m_bundle;
+
+ /**
+ * Required extension name.
+ */
+ private final String m_type;
+
+ /**
+ * Constructor.
+ * @param description : description of the component type.
+ * @param bundle : bundle declaring this type.
+ * @param type : required extension name.
+ */
+ protected UnboundComponentType(String type, Element description, Bundle bundle) {
+ m_type = type;
+ m_description = description;
+ m_bundle = bundle;
+ }
+ }
+
+ /**
+ * Compute the bundle context from the bundle class by introspection.
+ * @param bundle : bundle.
+ * @return the bundle context object or null if not found.
+ */
+ public BundleContext getBundleContext(Bundle bundle) {
+ if (bundle == null) { return null; }
+
+ // getBundleContext (OSGi 4.1)
+ Method meth = null;
+ try {
+ meth = bundle.getClass().getMethod("getBundleContext", new Class[0]);
+ } catch (SecurityException e) {
+ // Nothing do to, will try the Equinox method
+ } catch (NoSuchMethodException e) {
+ // Nothing do to, will try the Equinox method
+ }
+
+ // try Equinox getContext if not found.
+ if (meth == null) {
+ try {
+ meth = bundle.getClass().getMethod("getContext", new Class[0]);
+ } catch (SecurityException e) {
+ // Nothing do to, will try field inspection
+ } catch (NoSuchMethodException e) {
+ // Nothing do to, will try field inspection
+ }
+ }
+
+ if (meth != null) {
+ if (! meth.isAccessible()) {
+ // If not accessible, try to set the accessibility.
+ meth.setAccessible(true);
+ }
+ try {
+ return (BundleContext) meth.invoke(bundle, new Object[0]);
+ } catch (IllegalArgumentException e) {
+ m_logger.log(Logger.ERROR, "Cannot get the BundleContext by invoking " + meth.getName(), e);
+ return null;
+ } catch (IllegalAccessException e) {
+ m_logger.log(Logger.ERROR, "Cannot get the BundleContext by invoking " + meth.getName(), e);
+ return null;
+ } catch (InvocationTargetException e) {
+ m_logger.log(Logger.ERROR, "Cannot get the BundleContext by invoking " + meth.getName(), e.getTargetException());
+ return null;
+ }
+ }
+
+ // Else : Field inspection (KF and Prosyst)
+ Field[] fields = bundle.getClass().getDeclaredFields();
+ for (int i = 0; i < fields.length; i++) {
+ if (BundleContext.class.isAssignableFrom(fields[i].getType())) {
+ if (!fields[i].isAccessible()) {
+ fields[i].setAccessible(true);
+ }
+ try {
+ return (BundleContext) fields[i].get(bundle);
+ } catch (IllegalArgumentException e) {
+ m_logger.log(Logger.ERROR, "Cannot get the BundleContext by invoking " + meth.getName(), e);
+ return null;
+ } catch (IllegalAccessException e) {
+ m_logger.log(Logger.ERROR, "Cannot get the BundleContext by invoking " + meth.getName(), e);
+ return null;
+ }
+ }
+ }
+ m_logger.log(Logger.ERROR, "Cannot find the BundleContext for " + bundle.getSymbolicName(), null);
+ return null;
+ }
+
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/Factory.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/Factory.java
index bcc2d55..a8bff35 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/Factory.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/Factory.java
@@ -21,7 +21,7 @@
import java.util.Dictionary;
import java.util.List;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.metadata.Element;
import org.osgi.framework.BundleContext;
@@ -72,7 +72,7 @@
* Get the component type description.
* @return the component type description object
*/
- ComponentDescription getComponentDescription();
+ ComponentTypeDescription getComponentDescription();
/**
* Check if the given configuration is acceptable as a configuration of a component instance.
@@ -97,15 +97,15 @@
/**
* Add a factory state listener on the current factory.
- * @param l : the listener to add
+ * @param listener : the listener to add
*/
- void addFactoryStateListener(FactoryStateListener l);
+ void addFactoryStateListener(FactoryStateListener listener);
/**
* Remove the given factory state listener from the listener list.
- * @param l : the listener to remove
+ * @param listener : the listener to remove
*/
- void removeFactoryStateListener(FactoryStateListener l);
+ void removeFactoryStateListener(FactoryStateListener listener);
/**
* Get the list of missing handlers.
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/FieldInterceptor.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/FieldInterceptor.java
new file mode 100644
index 0000000..d8d4823
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/FieldInterceptor.java
@@ -0,0 +1,47 @@
+/*
+ * 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;
+
+/**
+* Field interceptor.
+* A class implementing this interface is able to be notified of field accesses.
+* The listener need to be register on the instance manager.
+*
+* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+*/
+public interface FieldInterceptor {
+
+ /**
+ * This method is called when a PUTFIELD operation is detected.
+ * @param pojo : the pojo object setting the value
+ * @param fieldName : the field name
+ * @param value : the value passed to the field
+ */
+ void onSet(Object pojo, String fieldName, Object value);
+
+ /**
+ * This method is called when a GETFIELD operation is detected.
+ * @param pojo : the pojo object getting the value
+ * @param fieldName : the field name
+ * @param value : the value passed to the field (by the previous call)
+ * @return : the managed value of the field
+ */
+ Object onGet(Object pojo, String fieldName, Object value);
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/Handler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/Handler.java
index 48cb786..42107af 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/Handler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/Handler.java
@@ -20,7 +20,7 @@
import java.util.Dictionary;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.architecture.HandlerDescription;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.util.Logger;
@@ -31,17 +31,17 @@
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public abstract class Handler {
-
+
/**
* Handler namespace property.
*/
public static final String HANDLER_NAMESPACE_PROPERTY = "handler.namespace";
-
+
/**
* Handler name property.
*/
public static final String HANDLER_NAME_PROPERTY = "handler.name";
-
+
/**
* Handler type property.
*/
@@ -51,39 +51,73 @@
* Handler priority.
*/
public static final String HANDLER_LEVEL_PROPERTY = "handler.level";
-
+
/**
- * Handler logger.
+ * Handler validity.
*/
- private Logger m_logger;
-
+ protected boolean m_isValid = true;
+
/**
- * Set the logger use by this handler.
- * @param logger : the logger object to use.
+ * HandlerManager managing the current handler.
*/
- final void setLogger(Logger logger) {
- m_logger = logger;
- }
-
+ protected HandlerManager m_instance;
+
/**
- * Log method.
- * @param level : message level (Logger class constant)
+ * Set the factory attached to this handler object.
+ * This method must be override to depend on each component factory type.
+ * @param factory : the factory.
+ */
+ public abstract void setFactory(Factory factory);
+
+ /**
+ * Get the logger to use in the handler.
+ * This method must be override to depend on each component factory type logging policy.
+ * @return the logger.
+ */
+ public abstract Logger getLogger();
+
+ /**
+ * Log method (warning).
* @param message : message to log
*/
- public final void log(int level, String message) {
- m_logger.log(level, message);
+ public final void warn(String message) {
+ getLogger().log(Logger.WARNING, message);
}
-
+
/**
- * Log method.
- * @param level : message level (Logger class constant)
+ * Log method (error).
* @param message : message to log
- * @param ex : exception to attach to the message
*/
- public final void log(int level, String message, Throwable ex) {
- m_logger.log(level, message, ex);
+ public final void error(String message) {
+ getLogger().log(Logger.ERROR, message);
}
-
+
+ /**
+ * Log method (info).
+ * @param message : message to log
+ */
+ public final void info(String message) {
+ getLogger().log(Logger.INFO, message);
+ }
+
+ /**
+ * Log method (warning).
+ * @param message : message to log
+ * @param exception : exception to attach to the message
+ */
+ public final void warn(String message, Throwable exception) {
+ getLogger().log(Logger.WARNING, message, exception);
+ }
+
+ /**
+ * Log method (error).
+ * @param message : message to log
+ * @param exception : exception to attach to the message
+ */
+ public final void error(String message, Throwable exception) {
+ getLogger().log(Logger.ERROR, message, exception);
+ }
+
/**
* Get a plugged handler of the same container.
* This method must be call only in the start method (or after).
@@ -93,41 +127,65 @@
* @return the handler object or null if the handler is not found.
*/
public abstract Handler getHandler(String name);
-
+
/**
* Attach the current handler object to the given component instance.
* An attached handler becomes a part of the instance container.
- * @param ci : the component instance on which the current handler will be attached.
+ * @param instance : the component instance on which the current handler will be attached.
*/
- protected abstract void attach(ComponentInstance ci);
-
+ protected abstract void attach(ComponentInstance instance);
+
/**
* Check if the current handler is valid.
+ * This check test the handlers validity.
* This method must not be override.
* @return true if the handler is valid.
*/
public final boolean isValid() {
return ((Pojo) this).getComponentInstance().getState() == ComponentInstance.VALID;
}
-
-
+
+ /**
+ * Set the validity of the current handler.
+ * @param isValid : if true the handler becomes valid, else it becomes invalid.
+ */
+ public final void setValidity(boolean isValid) {
+ if (m_isValid != isValid) {
+ m_isValid = isValid;
+ HandlerManager instance = getHandlerManager();
+ if (isValid) {
+ instance.stateChanged(instance, ComponentInstance.VALID);
+ } else {
+ instance.stateChanged(instance, ComponentInstance.INVALID);
+ }
+ }
+ }
+
+ public final boolean getValidity() {
+ return m_isValid;
+ }
+
/**
* Get the component instance of the current handler.
* @return : the component instance.
*/
- public final ComponentInstance getInstance() {
- return ((Pojo) this).getComponentInstance();
+ public final HandlerManager getHandlerManager() {
+ if (m_instance != null) { return m_instance; }
+ m_instance = (HandlerManager) ((Pojo) this).getComponentInstance();
+ return m_instance;
}
-
+
/**
* Initialize component factory.
* This method aims to gather component factory properties. Each handler wanting to contribute need to override this
* method and add properties to the given component description.
- * @param cd : component description.
+ * @param typeDesc : component description.
* @param metadata : component type metadata.
* @throws ConfigurationException : if the metadata are not correct (early detection).
*/
- public void initializeComponentFactory(ComponentDescription cd, Element metadata) throws ConfigurationException { }
+ public void initializeComponentFactory(ComponentTypeDescription typeDesc, Element metadata) throws ConfigurationException {
+ // The default implementation does nothing.
+ }
/**
* Configure the handler.
@@ -151,7 +209,9 @@
* This method is called when the component state changed.
* @param state : the new state
*/
- public void stateChanged(int state) { }
+ public void stateChanged(int state) {
+ // The default implementation does nothing.
+ }
/**
* Return the current handler description.
@@ -166,5 +226,7 @@
* The instance is reconfiguring.
* @param configuration : New instance configuration.
*/
- public void reconfigure(Dictionary configuration) { }
+ public void reconfigure(Dictionary configuration) {
+ // The default implementation does nothing.
+ }
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/HandlerFactory.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/HandlerFactory.java
index 04bc706..08bff14 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/HandlerFactory.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/HandlerFactory.java
@@ -18,20 +18,12 @@
*/
package org.apache.felix.ipojo;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.Dictionary;
-import java.util.Iterator;
-import java.util.List;
import java.util.Properties;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.util.Logger;
-import org.apache.felix.ipojo.util.Tracker;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceRegistration;
/**
* The component factory manages component instance objects. This management
@@ -43,20 +35,20 @@
public class HandlerFactory extends ComponentFactory implements Factory {
/**
- * Service Registration of this factory (Factory & ManagedServiceFactory).
+ * iPOJO Default Namespace.
*/
- private ServiceRegistration m_sr;
-
+ public static final String IPOJO_NAMESPACE = "org.apache.felix.ipojo";
+
/**
* Handler type (composite|primitive).
* Default: handler.
*/
private String m_type = "primitive";
-
+
/**
* Default iPOJO Namespace.
*/
- private String m_namespace = IPojoConfiguration.IPOJO_NAMESPACE;
+ private String m_namespace = IPOJO_NAMESPACE;
/**
* Get the handler start level.
@@ -67,114 +59,67 @@
/**
* Create a composite factory.
- * @param bc : bundle context
- * @param cm : metadata of the component to create
+ * @param context : bundle context
+ * @param metadata : metadata of the component to create
+ * @throws ConfigurationException occurs when the element describing the factory is malformed.
*/
- public HandlerFactory(BundleContext bc, Element cm) {
- super(bc, cm);
-
+ public HandlerFactory(BundleContext context, Element metadata) throws ConfigurationException {
+ super(context, metadata);
+
// Get the name
- m_factoryName = cm.getAttribute("name").toLowerCase();
- if (m_factoryName == null) {
- System.err.println("An Handler needs a name");
- return;
- }
-
+ m_factoryName = metadata.getAttribute("name");
+ if (m_factoryName == null) { throw new ConfigurationException("An Handler needs a name"); }
+
// Get the type
- String t = cm.getAttribute("type");
- if (t != null) {
- m_type = t;
+ String type = metadata.getAttribute("type");
+ if (type != null) {
+ m_type = type;
}
-
- String l = cm.getAttribute("level");
- if (l != null) {
- m_level = new Integer(l).intValue();
+
+ String level = metadata.getAttribute("level");
+ if (level != null) {
+ m_level = new Integer(level).intValue();
}
-
+
// Get the namespace
- String ns = cm.getAttribute("namespace");
- if (ns != null) {
- m_namespace = ns.toLowerCase();
- }
+ String namespace = metadata.getAttribute("namespace");
+ if (namespace != null) {
+ m_namespace = namespace.toLowerCase();
+ }
}
-
+
public String getNamespace() {
return m_namespace;
}
-
+
public String getHandlerName() {
return m_namespace + ":" + getName();
}
-
+
public String getType() {
return m_type;
}
-
+
public int getStartLevel() {
return m_level;
}
- /**
- * Start all the instance managers.
- */
- public synchronized void start() {
- if (m_sr != null) { // Already started.
- return;
- }
-
- if (m_handlerIdentifiers.size() != 0) {
- try {
- String filter = "(&(" + Handler.HANDLER_TYPE_PROPERTY + "=" + PrimitiveHandler.HANDLER_TYPE + ")"
- + "(factory.state=1)"
- + ")";
- m_tracker = new Tracker(m_context, m_context.createFilter(filter), this);
- m_tracker.open();
- } catch (InvalidSyntaxException e) {
- m_logger.log(Logger.ERROR, "A factory filter is not valid: " + e.getMessage());
- stop();
- return;
- }
- }
-
- try {
- computeFactoryState();
- } catch (ConfigurationException e) {
- m_logger.log(Logger.ERROR, "Cannot initilize the factory " + e.getMessage());
- stop();
- return;
- }
-
- // Exposition of the factory service (always public for handlers)
- m_sr = m_context.registerService(new String[] { Factory.class.getName()}, this, getProperties());
+ public ComponentTypeDescription getComponentTypeDescription() {
+ return new HandlerTypeDescription(this);
}
-
+
/**
* Stop the factory.
* This method does not disposed created instances.
* These instances will be disposed by the instance managers.
*/
- public synchronized void stop() {
- if (m_sr != null) {
- m_sr.unregister();
- m_sr = null;
- }
-
+ public synchronized void stopping() {
if (m_tracker != null) {
m_tracker.close();
m_tracker = null;
}
-
- // Release each handler
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- ((HandlerIdentifier) m_handlerIdentifiers.get(i)).unRef();
- }
-
- m_handlerIdentifiers.clear();
- m_listeners.clear();
- m_state = INVALID;
}
-
-
+
/**
* Compute factory service properties.
* This method add three mandatory handler factory properties (name, namespace and type)
@@ -183,164 +128,53 @@
*/
protected Properties getProperties() {
Properties props = new Properties();
-
- // Add factory state
- props.put("factory.state", "" + m_state);
- props.put(Handler.HANDLER_NAME_PROPERTY, m_factoryName);
- props.put(Handler.HANDLER_NAMESPACE_PROPERTY, m_namespace);
- props.put(Handler.HANDLER_TYPE_PROPERTY, m_type);
- if (m_level != Integer.MAX_VALUE) {
- props.put(Handler.HANDLER_LEVEL_PROPERTY, new Integer(m_level));
- }
-
return props;
}
-
- /**
- * Compute handler factory state.
- * @throws ConfigurationException : occurs when an handler cannot be initialized.
- */
- protected void computeFactoryState() throws ConfigurationException {
- boolean isValid = true;
- for (int i = 0; isValid && i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- isValid = hi.getReference() != null;
- }
-
- if (isValid) {
- if (m_state == INVALID) {
- m_state = VALID;
-
- if (m_sr == null) {
- m_componentDesc = new ComponentDescription(this);
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- HandlerManager hm = getHandlerInstance(hi, null);
- hm.getHandler();
- Handler ch = hm.getHandler();
- ch.setLogger(getLogger());
- ch.initializeComponentFactory(m_componentDesc, m_componentMetadata);
- ((Pojo) ch).getComponentInstance().dispose();
- }
- }
-
- if (m_sr != null) {
- m_sr.setProperties(getProperties());
- }
- for (int i = 0; i < m_listeners.size(); i++) {
- ((FactoryStateListener) m_listeners.get(i)).stateChanged(this, VALID);
- }
- return;
- }
- } else {
- if (m_state == VALID) {
- m_state = INVALID;
-
- // Notify listeners.
- for (int i = 0; i < m_listeners.size(); i++) {
- ((FactoryStateListener) m_listeners.get(i)).stateChanged(this, INVALID);
- }
- // Dispose created instances.
- final Collection col = m_componentInstances.values();
- final Iterator it = col.iterator();
- while (it.hasNext()) {
- InstanceManager ci = (InstanceManager) it.next();
- if (ci.getState() != ComponentInstance.DISPOSED) {
- ci.kill();
- }
- m_instancesName.remove(ci.m_name);
- }
-
- m_componentInstances.clear();
-
- if (m_sr != null) {
- m_sr.setProperties(getProperties());
- }
-
- return;
- }
- }
- }
-
/**
* Create an instance. The given configuration needs to contain the 'name'
* property.
* @param configuration : configuration of the created instance.
- * @param serviceContext : the service context to push for this instance.
+ * @param context : the service context to push for this instance.
+ * @param handlers : handler array to used.
* @return the created component instance.
- * @throws UnacceptableConfiguration : occurs if the given configuration is
* not consistent with the component type of this factory.
- * @throws MissingHandlerException : occurs when an handler is unavailable when creating the instance.
* @throws org.apache.felix.ipojo.ConfigurationException : when the instance configuration failed.
* @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
*/
- public synchronized ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration, MissingHandlerException, org.apache.felix.ipojo.ConfigurationException {
- if (m_state == Factory.INVALID) {
- throw new MissingHandlerException(getMissingHandlers());
- }
-
- if (configuration == null) {
- configuration = new Properties();
- }
-
- String in = null;
- if (configuration.get("name") != null) {
- in = (String) configuration.get("name");
- } else {
- in = generateName();
- configuration.put("name", in);
- }
-
- if (m_instancesName.contains(in)) {
- throw new UnacceptableConfiguration("Name already used : " + in);
- } else {
- m_instancesName.add(in);
- }
-
- BundleContext context = null;
- if (serviceContext == null) {
- context = new IPojoContext(m_context);
- } else {
- context = new IPojoContext(m_context, serviceContext);
- }
- List handlers = new ArrayList();
- for (int i = 0; i < m_handlerIdentifiers.size(); i++) {
- HandlerIdentifier hi = (HandlerIdentifier) m_handlerIdentifiers.get(i);
- handlers.add(getHandlerInstance(hi, serviceContext));
- }
-
- HandlerManager instance = new HandlerManager(this, context, (HandlerManager[]) handlers.toArray(new HandlerManager[handlers.size()]));
+ public ComponentInstance createInstance(Dictionary configuration, IPojoContext context, HandlerManager[] handlers) throws ConfigurationException {
+ HandlerManager instance = new HandlerManager(this, context, handlers);
instance.configure(m_componentMetadata, configuration);
-
- m_componentInstances.put(in, instance);
-
-
return instance;
}
-
- /**
- * Return an handler object.
- * @param hi : handler to create.
- * @param sc : service context in which create the handler (instance context).
- * @return the Handler object.
- */
- private HandlerManager getHandlerInstance(HandlerIdentifier hi, ServiceContext sc) {
- try {
- return (HandlerManager) hi.getFactory().createComponentInstance(null, sc);
- } catch (MissingHandlerException e) {
- m_logger.log(Logger.ERROR, "The creation of the handler " + hi.getFullName() + " has failed: " + e.getMessage());
- stop();
- return null;
- } catch (UnacceptableConfiguration e) {
- m_logger.log(Logger.ERROR, "The creation of the handler " + hi.getFullName() + " has failed (UnacceptableConfiguration): " + e.getMessage());
- stop();
- return null;
- } catch (org.apache.felix.ipojo.ConfigurationException e) {
- m_logger.log(Logger.ERROR, "The configuration of the handler " + hi.getFullName() + " has failed (ConfigurationException): " + e.getMessage());
- stop();
- return null;
+
+ private class HandlerTypeDescription extends ComponentTypeDescription {
+
+ /**
+ * Constructor.
+ * @param factory : factory.
+ */
+ public HandlerTypeDescription(Factory factory) {
+ super(factory);
+ }
+
+ /**
+ * Add properties to publish :
+ * handler.name, handler.namespace, handler.type and handler.level if the level is not Integer.MAX.
+ * @return return the dictionary to publish.
+ * @see org.apache.felix.ipojo.architecture.ComponentTypeDescription#getPropertiesToPublish()
+ */
+ public Dictionary getPropertiesToPublish() {
+ Dictionary props = super.getPropertiesToPublish();
+
+ props.put(Handler.HANDLER_NAME_PROPERTY, m_factoryName);
+ props.put(Handler.HANDLER_NAMESPACE_PROPERTY, m_namespace);
+ props.put(Handler.HANDLER_TYPE_PROPERTY, m_type);
+ if (m_level != Integer.MAX_VALUE) {
+ props.put(Handler.HANDLER_LEVEL_PROPERTY, new Integer(m_level));
+ }
+ return props;
}
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/HandlerManager.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/HandlerManager.java
index 7754ef5..e2f4003 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/HandlerManager.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/HandlerManager.java
@@ -24,12 +24,12 @@
import org.osgi.framework.BundleContext;
/**
-* The handler manager manages an handler instance.
-*
-* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
-*/
+ * The handler manager manages an handler instance.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
public class HandlerManager extends InstanceManager {
-
+
/**
* Handler object (contained).
*/
@@ -38,13 +38,13 @@
/**
* Constructor.
* @param factory : handler factory
- * @param bc : bundle context
+ * @param context : bundle context
* @param handlers : handler array
*/
- public HandlerManager(ComponentFactory factory, BundleContext bc, HandlerManager[] handlers) {
- super(factory, bc, handlers);
+ public HandlerManager(ComponentFactory factory, BundleContext context, HandlerManager[] handlers) {
+ super(factory, context, handlers);
}
-
+
/**
* Get the contained handler object.
* If not already created it creates the object.
@@ -56,73 +56,68 @@
}
return m_handler;
}
-
+
/**
* Create and initialize the handler object.
- * @param ci : component instance on which the handler will be attached.
- * @param cm : component metadata.
+ * @param instance : component instance on which the handler will be attached.
+ * @param metadata : component metadata.
* @param configuration : instance configuration.
* @throws ConfigurationException if the handler configuration failed.
*/
- public void init(ComponentInstance ci, Element cm, Dictionary configuration) throws ConfigurationException {
+ public void init(ComponentInstance instance, Element metadata, Dictionary configuration) throws ConfigurationException {
createHandlerObject();
- m_handler.attach(ci);
- m_handler.configure(cm, configuration);
+ m_handler.setFactory(instance.getFactory());
+ m_handler.attach(instance);
+ m_handler.configure(metadata, configuration);
}
-
+
/**
* Create the handler object.
* This method does nothing if the object is already created.
*/
private void createHandlerObject() {
if (m_handler != null) { return; }
- Handler h = (Handler) createPojoObject();
- if (h instanceof PrimitiveHandler) {
- m_handler = (PrimitiveHandler) h;
- } else {
- m_handler = (CompositeHandler) h;
- }
+ m_handler = (Handler) createPojoObject();
}
-
+
/**
* Start the instance manager.
*/
public synchronized void start() {
- if (m_state != STOPPED) {
- return;
- } // Instance already started
+ if (m_state != STOPPED) { return; } // Instance already started
for (int i = 0; i < m_handlers.length; i++) {
m_handlers[i].addInstanceStateListener(this);
m_handlers[i].start();
}
-
+
m_handler.start(); // Call the handler start method.
-
+
for (int i = 0; i < m_handlers.length; i++) {
- if (! m_handlers[i].getHandler().isValid()) {
+ if (!m_handlers[i].getHandler().isValid()) {
setState(INVALID);
return;
}
}
- setState(VALID);
+ if (m_handler.getValidity()) {
+ setState(VALID);
+ } else {
+ setState(INVALID);
+ }
}
-
+
/**
* Stop the instance manager.
*/
public synchronized void stop() {
- if (m_state == STOPPED) {
- return;
- } // Instance already stopped
-
+ if (m_state == STOPPED) { return; } // Instance already stopped
setState(INVALID);
-
+
if (m_handler != null) {
m_handler.stop();
}
-
+
// Stop all the handlers
for (int i = m_handlers.length - 1; i > -1; i--) {
m_handlers[i].removeInstanceStateListener(this);
@@ -130,13 +125,13 @@
}
m_state = STOPPED;
- if (m_instanceListeners != null) {
- for (int i = 0; i < m_instanceListeners.size(); i++) {
- ((InstanceStateListener) m_instanceListeners.get(i)).stateChanged(this, STOPPED);
+ if (m_listeners != null) {
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((InstanceStateListener) m_listeners.get(i)).stateChanged(this, STOPPED);
}
}
}
-
+
/**
* Dispose the instance.
* @see org.apache.felix.ipojo.ComponentInstance#dispose()
@@ -145,7 +140,7 @@
super.dispose();
m_handler = null;
}
-
+
/**
* Kill the current instance.
* Only the factory of this instance can call this method.
@@ -155,4 +150,31 @@
m_handler = null;
}
+ /**
+ * State Change listener callback.
+ * This method is notified at each time a plugged handler becomes invalid.
+ * @param instance : changing instance
+ * @param newState : new state
+ * @see org.apache.felix.ipojo.InstanceStateListener#stateChanged(org.apache.felix.ipojo.ComponentInstance, int)
+ */
+ public synchronized void stateChanged(ComponentInstance instance, int newState) {
+ if (m_state <= STOPPED) { return; }
+
+ // Update the component state if necessary
+ if (newState == INVALID && m_state == VALID) {
+ // Need to update the state to UNRESOLVED
+ setState(INVALID);
+ return;
+ }
+ if (newState == VALID && m_state == INVALID) {
+ // An handler becomes valid => check if all handlers are valid
+ if (!m_handler.getValidity()) { return; }
+ for (int i = 0; i < m_handlers.length; i++) {
+ if (m_handlers[i].getState() != VALID) { return; }
+ }
+ setState(VALID);
+ return;
+ }
+ }
+
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoConfiguration.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoConfiguration.java
deleted file mode 100644
index 78d3434..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoConfiguration.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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;
-
-import org.apache.felix.ipojo.composite.instance.InstanceHandler;
-import org.apache.felix.ipojo.composite.service.importer.ImportHandler;
-import org.apache.felix.ipojo.composite.service.instantiator.ServiceInstantiatorHandler;
-import org.apache.felix.ipojo.handlers.architecture.ArchitectureHandler;
-import org.apache.felix.ipojo.handlers.configuration.ConfigurationHandler;
-import org.apache.felix.ipojo.handlers.dependency.DependencyHandler;
-import org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler;
-import org.apache.felix.ipojo.handlers.lifecycle.controller.ControllerHandler;
-import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler;
-import org.apache.felix.ipojo.util.Logger;
-
-/**
- * iPOJO Configuration : Default Log Level - Available (core) handlers.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class IPojoConfiguration {
-
- /**
- * iPOJO logger log level.
- */
- public static final int LOG_LEVEL = Logger.WARNING;
-
-
- /**
- * iPOJO Default Namespace.
- */
- public static final String IPOJO_NAMESPACE = "org.apache.felix.ipojo";
-
- /**
- * Available handlers in the iPOJO bundle.
- */
- public static final Class[] INTERNAL_HANDLERS = new Class[] {
- DependencyHandler.class,
- ProvidedServiceHandler.class,
- ConfigurationHandler.class,
- LifecycleCallbackHandler.class,
- ControllerHandler.class,
- ArchitectureHandler.class
- };
-
- /**
- * Available composite handlers in the iPOJO bundle.
- */
- public static final Class[] INTERNAL_COMPOSITE_HANDLERS = new Class[] {
- ServiceInstantiatorHandler.class,
- ImportHandler.class,
- InstanceHandler.class,
- org.apache.felix.ipojo.composite.service.provides.ProvidedServiceHandler.class,
- org.apache.felix.ipojo.composite.architecture.ArchitectureHandler.class
- };
-
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoContext.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoContext.java
index a1e2e53..09bfcdf 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoContext.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoContext.java
@@ -54,25 +54,24 @@
/**
* Constructor. Used when the service context = the bundle context
*
- * @param bc : bundle context
+ * @param context : bundle context
*/
- public IPojoContext(BundleContext bc) {
- m_bundleContext = bc;
+ public IPojoContext(BundleContext context) {
+ m_bundleContext = context;
}
/**
* Constructor. Used when the service context and the bundle context are
* different
*
- * @param bc : bundle context
- * @param sc : service context
+ * @param bundleContext : bundle context
+ * @param serviceContext : service context
*/
- public IPojoContext(BundleContext bc, ServiceContext sc) {
- m_bundleContext = bc;
- m_serviceContext = sc;
+ public IPojoContext(BundleContext bundleContext, ServiceContext serviceContext) {
+ m_bundleContext = bundleContext;
+ m_serviceContext = serviceContext;
}
-
/**
* Add a bundle listener.
* @param listener : the listener to add
@@ -119,7 +118,6 @@
}
}
-
/**
* Create a Filter object.
* @param filter : the string form of the LDAP filter to create
@@ -158,12 +156,12 @@
/**
* Get the bundle object with the given id.
- * @param id : bundle id
+ * @param bundleId : bundle id
* @return the bundle object
* @see org.osgi.framework.BundleContext#getBundle(long)
*/
- public Bundle getBundle(long id) {
- return m_bundleContext.getBundle(id);
+ public Bundle getBundle(long bundleId) {
+ return m_bundleContext.getBundle(bundleId);
}
/**
@@ -175,7 +173,6 @@
return m_bundleContext.getBundles();
}
-
/**
* Get a data file.
* @param filename : File name.
@@ -340,7 +337,7 @@
return m_serviceContext.ungetService(reference);
}
}
-
+
/**
* Get the global context, i.e. the bundle context of the factory.
* @return the global bundle context.
@@ -348,15 +345,12 @@
public BundleContext getGlobalContext() {
return m_bundleContext;
}
-
+
/**
* Get the service context, i.e. the composite context.
* @return the service context.
*/
public ServiceContext getServiceContext() {
- if (m_serviceContext == null) {
- return this;
- }
return m_serviceContext;
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoFactory.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoFactory.java
new file mode 100644
index 0000000..44ae438
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/IPojoFactory.java
@@ -0,0 +1,829 @@
+/*
+ * 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;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.PropertyDescription;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.util.Logger;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+/**
+ * This class abstracts iPOJO factories.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public abstract class IPojoFactory implements Factory, ManagedServiceFactory {
+
+ /**
+ * List of the managed instance name. This list is shared by all factories.
+ */
+ protected static List m_instancesName = new ArrayList();
+
+ /**
+ * Component-Type description exposed by the factory service.
+ */
+ protected ComponentTypeDescription m_componentDesc;
+
+ /**
+ * List of the managed instance managers. The key of this map is the name (i.e. instance names) of the created instance
+ */
+ protected Map m_componentInstances = new HashMap();
+
+ /**
+ * Component Type provided by this factory.
+ */
+ protected Element m_componentMetadata;
+
+ /**
+ * The bundle context reference.
+ */
+ protected BundleContext m_context = null;
+
+ /**
+ * Factory Name. Could be the component class name if the factory name is not set.
+ */
+ protected String m_factoryName;
+
+ /**
+ * List of required handler.
+ */
+ protected List m_requiredHandlers = new ArrayList();
+
+ /**
+ * List of listeners.
+ */
+ protected List m_listeners = new ArrayList(2);
+
+ /**
+ * Logger for the factory (and all component instance).
+ */
+ protected Logger m_logger;
+
+ /**
+ * Is the factory public (expose as a service).
+ */
+ protected boolean m_isPublic;
+
+ /**
+ * Service Registration of this factory (Factory & ManagedServiceFactory).
+ */
+ protected ServiceRegistration m_sr;
+
+ /**
+ * Factory state.
+ */
+ protected int m_state = Factory.INVALID;
+
+ /**
+ * Index used to generate instance name if not set.
+ */
+ private long m_index = 0;
+
+ /**
+ * Flag indicating if this factory has already a computed description or not.
+ */
+ private boolean m_described;
+
+ /**
+ * Constructor.
+ * @param context : bundle context of the bundle containing the factory.
+ * @param metadata : description of the component type.
+ * @throws ConfigurationException occurs when the element describing the factory is malformed.
+ */
+ public IPojoFactory(BundleContext context, Element metadata) throws ConfigurationException {
+ m_context = context;
+ m_componentMetadata = metadata;
+ m_factoryName = getFactoryName();
+ String fac = metadata.getAttribute("factory");
+ m_isPublic = fac == null || !fac.equalsIgnoreCase("false");
+ m_logger = new Logger(m_context, m_factoryName);
+ m_requiredHandlers = getRequiredHandlerList();
+ }
+
+ public ComponentTypeDescription getComponentTypeDescription() {
+ return new ComponentTypeDescription(this);
+ }
+
+ /**
+ * Add a factory listener.
+ * @param listener : the factory listener to add.
+ * @see org.apache.felix.ipojo.Factory#addFactoryStateListener(org.apache.felix.ipojo.FactoryStateListener)
+ */
+ public void addFactoryStateListener(FactoryStateListener listener) {
+ synchronized (m_listeners) {
+ m_listeners.add(listener);
+ }
+ }
+
+ /**
+ * Get the logger used by instances of he current factory.
+ * @return the factory logger.
+ */
+ public Logger getLogger() {
+ return m_logger;
+ }
+
+ /**
+ * Compute the factory name.
+ * @return the factory name.
+ */
+ public abstract String getFactoryName();
+
+ /**
+ * Compute the required handler list.
+ * @return the required handler list
+ */
+ public abstract List getRequiredHandlerList();
+
+ /**
+ * Create an instance.
+ * @param config : instance configuration
+ * @param context : ipojo context to use
+ * @param handlers : handler array to use
+ * @return the new component instance.
+ * @throws ConfigurationException : occurs when the instance creation failed during the configuration process.
+ */
+ public abstract ComponentInstance createInstance(Dictionary config, IPojoContext context, HandlerManager[] handlers)
+ throws ConfigurationException;
+
+ /**
+ * Create an instance. The given configuration needs to contain the 'name' property.
+ * @param configuration : configuration of the created instance.
+ * @return the created component instance.
+ * @throws UnacceptableConfiguration : occurs if the given configuration is not consistent with the component type of this factory.
+ * @throws MissingHandlerException : occurs if an handler is unavailable when the instance is created.
+ * @throws org.apache.felix.ipojo.ConfigurationException : occurs when the instance or type configuration are not correct.
+ * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
+ */
+ public ComponentInstance createComponentInstance(Dictionary configuration) throws UnacceptableConfiguration, MissingHandlerException,
+ ConfigurationException {
+ return createComponentInstance(configuration, null);
+ }
+
+ /**
+ * Create an instance. The given configuration needs to contain the 'name' property.
+ * @param configuration : configuration of the created instance.
+ * @param serviceContext : the service context to push for this instance.
+ * @return the created component instance.
+ * @throws UnacceptableConfiguration : occurs if the given configuration is not consistent with the component type of this factory.
+ * @throws MissingHandlerException : occurs when an handler is unavailable when creating the instance.
+ * @throws org.apache.felix.ipojo.ConfigurationException : when the instance configuration failed.
+ * @see org.apache.felix.ipojo.Factory#createComponentInstance(java.util.Dictionary)
+ */
+ public ComponentInstance createComponentInstance(Dictionary configuration, ServiceContext serviceContext) throws UnacceptableConfiguration, // NOPMD
+ MissingHandlerException, ConfigurationException {
+ if (configuration == null) {
+ configuration = new Properties();
+ }
+
+ try {
+ checkAcceptability(configuration);
+ } catch (UnacceptableConfiguration e) {
+ m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
+ throw new UnacceptableConfiguration("The configuration "
+ + configuration
+ + " is not acceptable for "
+ + m_factoryName
+ + ": "
+ + e.getMessage());
+ }
+
+ String name = null;
+ if (configuration.get("name") == null) {
+ name = generateName();
+ configuration.put("name", name);
+ } else {
+ name = (String) configuration.get("name");
+ if (m_instancesName.contains(name)) {
+ m_logger.log(Logger.ERROR, "The configuration is not acceptable : Name already used");
+ throw new UnacceptableConfiguration("Name already used : " + name);
+ }
+ }
+
+ IPojoContext context = null;
+ if (serviceContext == null) {
+ context = new IPojoContext(m_context);
+ } else {
+ context = new IPojoContext(m_context, serviceContext);
+ }
+
+ HandlerManager[] handlers = new HandlerManager[m_requiredHandlers.size()];
+ for (int i = 0; i < handlers.length; i++) {
+ RequiredHandler req = (RequiredHandler) m_requiredHandlers.get(i);
+ handlers[i] = getHandler(req, serviceContext);
+ }
+ try {
+ ComponentInstance instance = createInstance(configuration, context, handlers);
+ m_instancesName.add(name);
+ m_componentInstances.put(name, instance);
+ return instance;
+ } catch (ConfigurationException e) {
+ m_logger.log(Logger.ERROR, e.getMessage());
+ throw new ConfigurationException(e.getMessage(), m_factoryName);
+ }
+ }
+
+ public BundleContext getBundleContext() {
+ return m_context;
+ }
+
+ /**
+ * Get the factory class name.
+ * @return the factory classname.
+ * @see org.apache.felix.ipojo.Factory#getClassName()
+ */
+ public abstract String getClassName();
+
+ /**
+ * Get the component type description.
+ * @return the component type description object. Null if not already computed.
+ */
+ public ComponentTypeDescription getComponentDescription() {
+ return m_componentDesc;
+ }
+
+ /**
+ * Get the component type description (Element-Attribute form).
+ * @return the component type description.
+ * @see org.apache.felix.ipojo.Factory#getDescription()
+ */
+ public Element getDescription() {
+ if (m_componentDesc == null) {
+ return new Element("No description available for " + m_factoryName, "");
+ }
+ return m_componentDesc.getDescription();
+ }
+
+ /**
+ * Compute the list of missing handlers.
+ * @return list of missing handlers.
+ * @see org.apache.felix.ipojo.Factory#getMissingHandlers()
+ */
+ public List getMissingHandlers() {
+ List list = new ArrayList();
+ for (int i = 0; i < m_requiredHandlers.size(); i++) {
+ RequiredHandler req = (RequiredHandler) m_requiredHandlers.get(i);
+ if (req.getReference() == null) {
+ list.add(req.getFullName());
+ }
+ }
+ return list;
+ }
+
+ public String getName() {
+ return m_factoryName;
+ }
+
+ /**
+ * Get the list of required handlers.
+ * @return list of required handlers.
+ * @see org.apache.felix.ipojo.Factory#getRequiredHandlers()
+ */
+ public List getRequiredHandlers() {
+ List list = new ArrayList();
+ for (int i = 0; i < m_requiredHandlers.size(); i++) {
+ RequiredHandler req = (RequiredHandler) m_requiredHandlers.get(i);
+ list.add(req.getFullName());
+ }
+ return list;
+ }
+
+ public int getState() {
+ return m_state;
+ }
+
+ /**
+ * Check if the configuration is acceptable.
+ * @param conf : the configuration to test.
+ * @return true if the configuration is acceptable.
+ * @see org.apache.felix.ipojo.Factory#isAcceptable(java.util.Dictionary)
+ */
+ public boolean isAcceptable(Dictionary conf) {
+ try {
+ checkAcceptability(conf);
+ } catch (MissingHandlerException e) {
+ return false;
+ } catch (UnacceptableConfiguration e) {
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Check if the configuration is acceptable.
+ * @param conf : the configuration to test.
+ * @throws UnacceptableConfiguration occurs if the configuration is unacceptable.
+ * @throws MissingHandlerException occurs if an handler is missing.
+ */
+ public void checkAcceptability(Dictionary conf) throws UnacceptableConfiguration, MissingHandlerException {
+ if (m_state == Factory.INVALID) {
+ throw new MissingHandlerException(getMissingHandlers());
+ }
+
+ // Check that the configuration does not override immutable properties.
+ PropertyDescription[] props = m_componentDesc.getProperties();
+ for (int i = 0; i < props.length; i++) {
+ // Is the property immutable
+ if (props[i].isImmutable() && conf.get(props[i].getName()) != null) {
+ throw new UnacceptableConfiguration("The property " + props[i] + " cannot be overide : immutable property"); // The instance
+ // configuration try
+ // to override an
+ // immutable property.
+ }
+ // Is the property required.
+ if (props[i].getValue() == null && conf.get(props[i].getName()) == null) {
+ throw new UnacceptableConfiguration("The property " + props[i].getName() + " is missing"); // The property must be set.
+ }
+ }
+ }
+
+ /**
+ * Reconfigure an existing instance.
+ * @param properties : the new configuration to push.
+ * @throws UnacceptableConfiguration : occurs if the new configuration is not consistent with the component type.
+ * @throws MissingHandlerException : occurs if the current factory is not valid.
+ * @see org.apache.felix.ipojo.Factory#reconfigure(java.util.Dictionary)
+ */
+ public synchronized void reconfigure(Dictionary properties) throws UnacceptableConfiguration, MissingHandlerException {
+ if (properties == null || properties.get("name") == null) {
+ throw new UnacceptableConfiguration("The configuration does not contains the \"name\" property");
+ }
+ String name = (String) properties.get("name");
+ ComponentInstance instance = (ComponentInstance) m_componentInstances.get(name);
+
+ if (instance == null) {
+ return; // The instance does not exist.
+ } else {
+ checkAcceptability(properties); // Test if the configuration is acceptable
+ instance.reconfigure(properties); // re-configure the component
+ }
+ }
+
+ /**
+ * Remove a factory listener.
+ * @param listener : the factory listener to remove.
+ * @see org.apache.felix.ipojo.Factory#removeFactoryStateListener(org.apache.felix.ipojo.FactoryStateListener)
+ */
+ public void removeFactoryStateListener(FactoryStateListener listener) {
+ synchronized (m_listeners) {
+ m_listeners.remove(listener);
+ }
+ }
+
+ /**
+ * Stopping method. This method is call when the factory is stopping.
+ */
+ public abstract void stopping();
+
+ /**
+ * Stop all the instance managers.
+ */
+ public synchronized void stop() {
+ if (m_sr != null) {
+ m_sr.unregister();
+ m_sr = null;
+ }
+
+ stopping();
+
+ if (m_state == VALID) {
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((FactoryStateListener) m_listeners.get(i)).stateChanged(this, INVALID);
+ }
+ }
+ m_state = INVALID;
+
+ // Dispose created instances.
+ Set col = m_componentInstances.keySet();
+ String[] keys = (String[]) col.toArray(new String[col.size()]);
+ for (int i = 0; i < keys.length; i++) {
+ ComponentInstance instance = (ComponentInstance) m_componentInstances.get(keys[i]);
+ if (instance.getState() != ComponentInstance.DISPOSED) {
+ instance.dispose();
+ }
+ }
+
+ // Release each handler
+ for (int i = 0; i < m_requiredHandlers.size(); i++) {
+ ((RequiredHandler) m_requiredHandlers.get(i)).unRef();
+ }
+
+ m_described = false;
+ m_componentDesc = null;
+ m_componentInstances.clear();
+ }
+
+ /**
+ * Destroy the factory. The factory cannot be restarted.
+ * Only the extender can call this method.
+ */
+ void dispose() {
+ stop();
+ m_componentMetadata = null;
+ m_componentInstances = null;
+ m_context = null;
+ m_requiredHandlers = null;
+ m_listeners = null;
+ m_logger = null;
+ }
+
+ /**
+ * Starting method. This method is called when the factory is starting.
+ */
+ public abstract void starting();
+
+ /**
+ * Start the factory.
+ */
+ public synchronized void start() {
+ if (m_described) { // Already started.
+ return;
+ }
+
+ m_componentDesc = getComponentTypeDescription();
+
+ starting();
+
+ computeFactoryState();
+
+ if (m_isPublic) {
+ // Exposition of the factory service
+ m_sr =
+ m_context.registerService(new String[] { Factory.class.getName(), ManagedServiceFactory.class.getName() }, this, m_componentDesc
+ .getPropertiesToPublish());
+ }
+ }
+
+ /**
+ * Create of update an instance.
+ * @param name : name of the instance
+ * @param properties : configuration of the instance
+ * @throws org.osgi.service.cm.ConfigurationException : if the configuration is not consistent for this component type
+ * @see org.osgi.service.cm.ManagedServiceFactory#updated(java.lang.String, java.util.Dictionary)
+ */
+ public synchronized void updated(String name, Dictionary properties) throws org.osgi.service.cm.ConfigurationException {
+ InstanceManager instance = (InstanceManager) m_componentInstances.get(name);
+ if (instance == null) {
+ try {
+ properties.put("name", name); // Add the name in the configuration
+ createComponentInstance(properties);
+ } catch (UnacceptableConfiguration e) {
+ m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
+ throw new org.osgi.service.cm.ConfigurationException(properties.toString(), e.getMessage());
+ } catch (MissingHandlerException e) {
+ m_logger.log(Logger.ERROR, "Handler not available : " + e.getMessage());
+ throw new org.osgi.service.cm.ConfigurationException(properties.toString(), e.getMessage());
+ } catch (ConfigurationException e) {
+ m_logger.log(Logger.ERROR, "The Component Type metadata are not correct : " + e.getMessage());
+ throw new org.osgi.service.cm.ConfigurationException(properties.toString(), e.getMessage());
+ }
+ } else {
+ try {
+ properties.put("name", name); // Add the name in the configuration
+ reconfigure(properties); // re-configure the component
+ } catch (UnacceptableConfiguration e) {
+ m_logger.log(Logger.ERROR, "The configuration is not acceptable : " + e.getMessage());
+ throw new org.osgi.service.cm.ConfigurationException(properties.toString(), e.getMessage());
+ } catch (MissingHandlerException e) {
+ m_logger.log(Logger.ERROR, "The facotry is not valid, at least one handler is missing : " + e.getMessage());
+ throw new org.osgi.service.cm.ConfigurationException(properties.toString(), e.getMessage());
+ }
+ }
+ }
+
+ /**
+ * Delete an instance.
+ * @param name : name of the instance to delete
+ * @see org.osgi.service.cm.ManagedServiceFactory#deleted(java.lang.String)
+ */
+ public synchronized void deleted(String name) {
+ m_instancesName.remove(name);
+ ComponentInstance instance = (ComponentInstance) m_componentInstances.remove(name);
+ if (instance != null) {
+ instance.dispose();
+ }
+ }
+
+ /**
+ * Callback called by instance when disposed.
+ * @param instance : the destroyed instance
+ */
+ public void disposed(ComponentInstance instance) {
+ String name = instance.getInstanceName();
+ m_instancesName.remove(name);
+ m_componentInstances.remove(name);
+ }
+
+ /**
+ * Compute the component type description. The factory must be valid when calling this method.
+ */
+ protected void computeDescription() {
+ for (int i = 0; i < m_requiredHandlers.size(); i++) {
+ RequiredHandler req = (RequiredHandler) m_requiredHandlers.get(i);
+ Handler handler = getHandler(req, null).getHandler();
+ try {
+ handler.setFactory(this);
+ handler.initializeComponentFactory(m_componentDesc, m_componentMetadata);
+ ((Pojo) handler).getComponentInstance().dispose();
+ } catch (org.apache.felix.ipojo.ConfigurationException e) {
+ ((Pojo) handler).getComponentInstance().dispose();
+ m_logger.log(Logger.ERROR, e.getMessage());
+ stop();
+ throw new IllegalStateException(e.getMessage());
+ }
+ }
+ }
+
+ /**
+ * Compute factory state.
+ */
+ protected void computeFactoryState() {
+ boolean isValid = true;
+ for (int i = 0; i < m_requiredHandlers.size(); i++) {
+ RequiredHandler req = (RequiredHandler) m_requiredHandlers.get(i);
+ if (req.getReference() == null) {
+ isValid = false;
+ break;
+ }
+
+ }
+
+ if (isValid) {
+ if (m_state == INVALID) {
+
+ if (!m_described) {
+ computeDescription();
+ m_described = true;
+ }
+
+ m_state = VALID;
+ if (m_sr != null) {
+ m_sr.setProperties(m_componentDesc.getPropertiesToPublish());
+ }
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((FactoryStateListener) m_listeners.get(i)).stateChanged(this, VALID);
+ }
+ return;
+ }
+ } else {
+ if (m_state == VALID) {
+ m_state = INVALID;
+
+ // Notify listeners.
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((FactoryStateListener) m_listeners.get(i)).stateChanged(this, INVALID);
+ }
+
+ // Dispose created instances.
+ Set col = m_componentInstances.keySet();
+ String[] keys = (String[]) col.toArray(new String[col.size()]);
+ for (int i = 0; i < keys.length; i++) {
+ ComponentInstance instance = (ComponentInstance) m_componentInstances.get(keys[i]);
+ if (instance.getState() != ComponentInstance.DISPOSED) {
+ instance.dispose();
+ }
+ m_instancesName.remove(instance.getInstanceName());
+ }
+
+ m_componentInstances.clear();
+
+ if (m_sr != null) {
+ m_sr.setProperties(m_componentDesc.getPropertiesToPublish());
+ }
+
+ return;
+ }
+ }
+ }
+
+ /**
+ * Check if the given handler identifier and the service reference can match.
+ * @param req : the handler identifier.
+ * @param ref : the service reference.
+ * @return true if the service reference can fulfill the handler requirement
+ */
+ protected boolean match(RequiredHandler req, ServiceReference ref) {
+ String name = (String) ref.getProperty(Handler.HANDLER_NAME_PROPERTY);
+ String namespace = (String) ref.getProperty(Handler.HANDLER_NAMESPACE_PROPERTY);
+ if (HandlerFactory.IPOJO_NAMESPACE.equals(namespace)) {
+ return name.equals(req.getName()) && req.getNamespace() == null;
+ }
+ return name.equals(req.getName()) && namespace.equals(req.getNamespace());
+ }
+
+ /**
+ * Return the handler object for the given required handler. The handler is instantiated in the given service context.
+ * @param req : handler to create.
+ * @param context : service context in which create the handler (instance context).
+ * @return the Handler object.
+ */
+ protected HandlerManager getHandler(RequiredHandler req, ServiceContext context) {
+ try {
+ return (HandlerManager) req.getFactory().createComponentInstance(null, context);
+ } catch (MissingHandlerException e) {
+ m_logger.log(Logger.ERROR, "The creation of the handler " + req.getFullName() + " has failed: " + e.getMessage());
+ stop();
+ return null;
+ } catch (UnacceptableConfiguration e) {
+ m_logger.log(Logger.ERROR, "The creation of the handler "
+ + req.getFullName()
+ + " has failed (UnacceptableConfiguration): "
+ + e.getMessage());
+ stop();
+ return null;
+ } catch (org.apache.felix.ipojo.ConfigurationException e) {
+ m_logger.log(Logger.ERROR, "The configuration of the handler "
+ + req.getFullName()
+ + " has failed (ConfigurationException): "
+ + e.getMessage());
+ stop();
+ return null;
+ }
+ }
+
+ /**
+ * Helping method generating a new unique name.
+ * @return an non already used name
+ */
+ protected synchronized String generateName() {
+ String name = m_factoryName + "-" + m_index;
+ while (m_instancesName.contains(name)) {
+ m_index = m_index + 1;
+ name = m_factoryName + "-" + m_index;
+ }
+ return name;
+ }
+
+ /**
+ * Structure storing required handlers.
+ */
+ protected class RequiredHandler implements Comparable {
+ /**
+ * Factory to create this handler.
+ */
+ private HandlerFactory m_factory;
+
+ /**
+ * Handler name.
+ */
+ private String m_name;
+
+ /**
+ * Handler start level.
+ */
+ private int m_level = Integer.MAX_VALUE;
+
+ /**
+ * Handler namespace.
+ */
+ private String m_namespace;
+
+ /**
+ * Service Reference of the handler factory.
+ */
+ private ServiceReference m_reference;
+
+ /**
+ * Constructor.
+ * @param name : handler name.
+ * @param namespace : handler namespace.
+ */
+ public RequiredHandler(String name, String namespace) {
+ m_name = name;
+ m_namespace = namespace;
+ }
+
+ /**
+ * Equals method. Two handlers are equals if they have same name and namespace or they share the same service reference.
+ * @param object : object to compare to the current object.
+ * @return : true if the two compared object are equals
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ public boolean equals(Object object) {
+ if (object instanceof RequiredHandler) {
+ RequiredHandler req = (RequiredHandler) object;
+ if (m_namespace == null) {
+ return req.m_name.equalsIgnoreCase(m_name) && req.m_namespace == null;
+ } else {
+ return req.m_name.equalsIgnoreCase(m_name) && m_namespace.equalsIgnoreCase(req.m_namespace);
+ }
+ } else {
+ return false;
+ }
+
+ }
+
+ /**
+ * Get the factory object used for this handler. The object is get when used for the first time.
+ * @return the factory object.
+ */
+ public HandlerFactory getFactory() {
+ if (m_reference == null) {
+ return null;
+ }
+ if (m_factory == null) {
+ m_factory = (HandlerFactory) m_context.getService(getReference());
+ }
+ return m_factory;
+ }
+
+ /**
+ * Get the handler full name (namespace:name).
+ * @return the handler full name
+ */
+ public String getFullName() {
+ if (m_namespace == null) {
+ return HandlerFactory.IPOJO_NAMESPACE + ":" + m_name;
+ } else {
+ return m_namespace + ":" + m_name;
+ }
+ }
+
+ public String getName() {
+ return m_name;
+ }
+
+ public String getNamespace() {
+ return m_namespace;
+ }
+
+ public ServiceReference getReference() {
+ return m_reference;
+ }
+
+ public int getLevel() {
+ return m_level;
+ }
+
+ /**
+ * Release the reference of the used factory.
+ */
+ public void unRef() {
+ if (m_reference != null) {
+ // m_context.ungetService(m_reference); // Will be unget automatically
+ m_factory = null;
+ m_reference = null;
+ }
+ }
+
+ /**
+ * Set the service reference. If the new service reference is null, it unget the used factory (if already get).
+ * @param ref : new service reference.
+ */
+ public void setReference(ServiceReference ref) {
+ m_reference = ref;
+ Integer level = (Integer) m_reference.getProperty(Handler.HANDLER_LEVEL_PROPERTY);
+ if (level != null) {
+ m_level = level.intValue();
+ }
+ }
+
+ /**
+ * Start level Comparison. This method is used to sort the handler array.
+ * @param object : object on which compare.
+ * @return -1, 0, +1 according to the comparison of their start level.
+ * @see java.lang.Comparable#compareTo(java.lang.Object)
+ */
+ public int compareTo(Object object) {
+ if (object instanceof RequiredHandler) {
+ RequiredHandler req = (RequiredHandler) object;
+ if (this.m_level == req.m_level) {
+ return 0;
+ } else if (this.m_level < req.m_level) {
+ return -1;
+ } else {
+ return +1;
+ }
+ }
+ return 0;
+ }
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceCreator.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceCreator.java
index c356b2a..7333161 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceCreator.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceCreator.java
@@ -18,51 +18,238 @@
*/
package org.apache.felix.ipojo;
+import java.util.ArrayList;
+import java.util.Collection;
import java.util.Dictionary;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
import org.apache.felix.ipojo.util.Logger;
-import org.apache.felix.ipojo.util.Tracker;
-import org.apache.felix.ipojo.util.TrackerCustomizer;
import org.osgi.framework.BundleContext;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
/**
- * An instance creator aims to create instances and to track their factories.
- * It's allow to create instance from outside factories.
- *
+ * An instance creator aims to create instances and to track their factories. It's allow to create instance from outside factories.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public class InstanceCreator implements TrackerCustomizer, FactoryStateListener {
- /**
- * Bundle Context.
- */
- private BundleContext m_context;
+public class InstanceCreator implements FactoryStateListener {
/**
* Logger to log messages if error occurs.
*/
private Logger m_logger;
-
- /**
- * Private factories.
- */
- private ComponentFactory[] m_factories;
/**
- * This structure aims to manage a configuration. It stores all necessary
- * information to create an instance and to track the factory.
+ * Configurations to create and maintains.
*/
- private class ManagedConfiguration {
+ private List m_idle = new ArrayList();
+
+ /**
+ * Map storing created instance. [AbstractFactory, List [ManagedInstance]]
+ */
+ private Map m_attached = new HashMap();
+
+ /**
+ * Abstract Factory list.
+ */
+ private List m_factories = new ArrayList();
+
+ /**
+ * Constructor.
+ * @param context : iPOJO bundle context.
+ */
+ public InstanceCreator(BundleContext context) {
+ m_logger = new Logger(context, "iPOJO Instance Creator");
+ }
+
+ /**
+ * Add an instance to manage.
+ * @param instance : instance configuration
+ * @param bundle : bundle id declaring the instance
+ */
+ synchronized void addInstance(Dictionary instance, long bundle) {
+ ManagedInstance managed = new ManagedInstance(instance, bundle);
+ for (int i = 0; i < m_factories.size(); i++) {
+ IPojoFactory factory = (IPojoFactory) m_factories.get(i);
+ if (factory.getState() == Factory.VALID && managed.match(factory)) {
+ managed.create(factory);
+ List list = (List) m_attached.get(factory);
+ if (list == null) {
+ list = new ArrayList();
+ list.add(managed);
+ m_attached.put(factory, list);
+ // Subscribe to the factory state change
+ factory.addFactoryStateListener(this);
+ } else {
+ list.add(managed);
+ }
+ return;
+ }
+ }
+ // If there is no matching factory, add the instance to the idle list
+ m_idle.add(managed);
+ }
+
+ /**
+ * Dispose and stop to manage all instances declared by the given bundle.
+ * @param bundle : bundle.
+ */
+ void removeInstancesFromBundle(long bundle) {
+ // Disposes instance from attached instances
+ Collection col = m_attached.keySet();
+ Iterator iterator = col.iterator();
+ List instanceToRemove = new ArrayList();
+ List factoryToRemove = new ArrayList();
+ while (iterator.hasNext()) {
+ IPojoFactory factory = (IPojoFactory) iterator.next();
+ List list = (List) m_attached.get(factory);
+ for (int i = 0; i < list.size(); i++) {
+ ManagedInstance managed = (ManagedInstance) list.get(i);
+ if (managed.m_bundleId == bundle) {
+ managed.dispose();
+ instanceToRemove.add(managed);
+ }
+ }
+ if (!instanceToRemove.isEmpty()) {
+ list.removeAll(instanceToRemove);
+ if (list.isEmpty()) {
+ factory.removeFactoryStateListener(this);
+ factoryToRemove.add(factory);
+ }
+ }
+ }
+
+ for (int i = 0; i < factoryToRemove.size(); i++) {
+ m_attached.remove(factoryToRemove.get(i));
+ }
+
+ // Delete idle instances
+ instanceToRemove.clear();
+ for (int i = 0; i < m_idle.size(); i++) {
+ ManagedInstance managed = (ManagedInstance) m_idle.get(i);
+ if (managed.m_bundleId == bundle) {
+ instanceToRemove.add(managed);
+ }
+ }
+ m_idle.removeAll(instanceToRemove);
+ }
+
+ /**
+ * A new factory appears.
+ * @param factory : the new factory.
+ */
+ public synchronized void addFactory(IPojoFactory factory) {
+ List createdInstances = new ArrayList(1);
+ m_factories.add(factory);
+ for (int i = 0; i < m_idle.size(); i++) {
+ ManagedInstance managed = (ManagedInstance) m_idle.get(i);
+ if (managed.match(factory)) {
+ // We have to subscribe to the factory.
+ factory.addFactoryStateListener(this);
+ if (factory.getState() == Factory.VALID) {
+ managed.create(factory);
+ List list = (List) m_attached.get(factory);
+ if (list == null) {
+ list = new ArrayList();
+ list.add(managed);
+ m_attached.put(factory, list);
+ } else {
+ list.add(managed);
+ }
+ createdInstances.add(managed);
+ }
+ }
+ }
+ if (!createdInstances.isEmpty()) {
+ m_idle.removeAll(createdInstances);
+ }
+ }
+
+ /**
+ * A factory is leaving.
+ * @param factory : the leaving factory
+ */
+ void removeFactory(IPojoFactory factory) {
+ factory.removeFactoryStateListener(this);
+ m_factories.remove(factory);
+ onInvalidation(factory);
+ m_attached.remove(factory);
+ }
+
+ /**
+ * The given factory becomes valid.
+ * @param factory : the factory becoming valid.
+ */
+ private void onValidation(IPojoFactory factory) {
+ List toRemove = new ArrayList();
+ for (int i = 0; i < m_idle.size(); i++) {
+ ManagedInstance managed = (ManagedInstance) m_idle.get(i);
+ if (managed.match(factory)) {
+ managed.create(factory);
+ List list = (List) m_attached.get(factory);
+ if (list == null) {
+ list = new ArrayList();
+ list.add(managed);
+ m_attached.put(factory, list);
+ } else {
+ list.add(managed);
+ }
+ toRemove.add(managed);
+ }
+ }
+ if (!toRemove.isEmpty()) {
+ m_idle.removeAll(toRemove);
+ }
+ }
+
+ /**
+ * The given factory becomes invalid.
+ * @param factory : factory which becomes invalid.
+ */
+ private void onInvalidation(IPojoFactory factory) {
+ List instances = (List) m_attached.remove(factory);
+ if (instances != null) {
+ for (int i = 0; i < instances.size(); i++) {
+ ManagedInstance managed = (ManagedInstance) instances.get(i);
+ managed.dispose();
+ m_idle.add(managed);
+ }
+ }
+ }
+
+ /**
+ * Factory state changed method.
+ * @param factory : factory.
+ * @param newState : new state.
+ * @see org.apache.felix.ipojo.FactoryStateListener#stateChanged(org.apache.felix.ipojo.Factory, int)
+ */
+ public void stateChanged(Factory factory, int newState) {
+ if (newState == Factory.VALID) {
+ onValidation((IPojoFactory) factory);
+ } else {
+ onInvalidation((IPojoFactory) factory);
+ }
+ }
+
+ /**
+ * This structure aims to manage a configuration. It stores all necessary information to create an instance and to track the factory.
+ */
+ private class ManagedInstance {
/**
* Configuration of the instance to create.
*/
private Dictionary m_configuration;
/**
- * Factory name.
+ * Bundle which create the instance.
*/
- private String m_factoryName;
+ private long m_bundleId;
+
+ /**
+ * Factory used to create the instance.
+ */
+ private IPojoFactory m_factory;
/**
* Created instance.
@@ -71,27 +258,20 @@
/**
* Constructor.
- *
* @param conf : the configuration to create.
+ * @param bundle : the bundle in which the instance is declared.
*/
- ManagedConfiguration(Dictionary conf) {
+ ManagedInstance(Dictionary conf, long bundle) {
m_configuration = conf;
- }
-
- /**
- * Return the managed configuration.
- * @return the configuration.
- */
- Dictionary getConfiguration() {
- return m_configuration;
+ m_bundleId = bundle;
}
/**
* Return the used factory name.
* @return the factory
*/
- String getFactory() {
- return m_factoryName;
+ IPojoFactory getFactory() {
+ return m_factory;
}
/**
@@ -103,215 +283,59 @@
}
/**
- * Set the factory name.
- *
- * @param name : the factory name.
+ * Test if the given factory match with the factory required by this instance. A factory matches if its name or its class name is equals to
+ * the 'component' property of the instance. Then the acceptability of the configuration is checked.
+ * @param factory : the factory to confront against the current instance.
+ * @return true if the factory match.
*/
- void setFactory(String name) {
- m_factoryName = name;
+ public boolean match(IPojoFactory factory) {
+ // Test factory name (and classname)
+ String component = (String) m_configuration.get("component");
+ if (factory.getName().equals(component) || factory.getClassName().equalsIgnoreCase(component)) {
+ // Test factory accessibility
+ if (factory.m_isPublic || factory.getBundleContext().getBundle().getBundleId() == m_bundleId) {
+ // Test the configuration validity.
+ if (factory.isAcceptable(m_configuration)) {
+ return true;
+ } else {
+ m_logger.log(Logger.ERROR, "An instance can be bound to a matching factory, however the configuration seems unacceptable : "
+ + m_configuration);
+ }
+ }
+ }
+ return false;
}
/**
- * Set the instance object.
- *
- * @param instance : the instance
+ * Create the instance by using the given factory.
+ * @param factory : the factory to use to create the instance. The factory must match.
*/
- void setInstance(ComponentInstance instance) {
- m_instance = instance;
- }
- }
-
- /**
- * Configurations to create and maintains.
- */
- private ManagedConfiguration[] m_configurations = new ManagedConfiguration[0];
-
- /**
- * Service Tracker tracking factories.
- */
- private Tracker m_tracker;
-
- /**
- * Constructor.
- *
- * @param context : the bundle context.
- * @param configurations : configuration set to create and maintain.
- * @param factories : private factories.
- */
- public InstanceCreator(BundleContext context, Dictionary[] configurations, ComponentFactory[] factories) {
- m_context = context;
- m_logger = new Logger(context, "InstanceCreator" + context.getBundle().getBundleId(), Logger.WARNING);
-
- m_configurations = new ManagedConfiguration[configurations.length];
- m_factories = factories;
-
- for (int i = 0; i < configurations.length; i++) {
- ManagedConfiguration conf = new ManagedConfiguration(configurations[i]);
- m_configurations[i] = conf;
- // Get the component type name :
- String componentType = (String) conf.getConfiguration().get("component");
-
- boolean found = false;
- for (int j = 0; m_factories != null && !found && j < m_factories.length; j++) {
- if (m_factories[j].m_state == Factory.VALID && (m_factories[j].getName().equals(componentType) || (m_factories[j].getComponentClassName() != null && m_factories[j].getComponentClassName().equals(componentType)))) {
- createInstance(m_factories[j], conf);
- found = true;
- }
+ public void create(IPojoFactory factory) {
+ try {
+ m_factory = factory;
+ m_instance = m_factory.createComponentInstance(m_configuration);
+ } catch (UnacceptableConfiguration e) {
+ m_logger.log(Logger.ERROR, "A matching factory was found for " + m_configuration + ", but the instantiation failed : "
+ + e.getMessage());
+ } catch (MissingHandlerException e) {
+ m_logger.log(Logger.ERROR, "A matching factory was found for " + m_configuration + ", but the instantiation failed : "
+ + e.getMessage());
+ } catch (ConfigurationException e) {
+ m_logger.log(Logger.ERROR, "A matching factory was found for " + m_configuration + ", but the instantiation failed : "
+ + e.getMessage());
}
}
-
- for (int i = 0; m_factories != null && i < m_factories.length; i++) {
- m_factories[i].addFactoryStateListener(this);
- }
-
-
- String filter = "(&(objectclass=" + Factory.class.getName() + ")(factory.state=1))";
- try {
- m_tracker = new Tracker(m_context, m_context.createFilter(filter), this);
- m_tracker.open();
- } catch (InvalidSyntaxException e) {
- e.printStackTrace();
- return;
- }
- }
- /**
- * Create an instance using the given factory and the given configuration.
- *
- * @param fact : the factory name to used.
- * @param config : the configuration.
- */
- private void createInstance(Factory fact, ManagedConfiguration config) {
- Dictionary conf = config.getConfiguration();
- try {
- config.setInstance(fact.createComponentInstance(conf));
- config.setFactory(fact.getName());
- } catch (UnacceptableConfiguration e) {
- m_logger.log(Logger.ERROR, "A factory is available for the configuration but the configuration is not acceptable", e);
- stop();
- } catch (MissingHandlerException e) {
- m_logger.log(Logger.ERROR, "The instance creation has failed, at least one handler is missing", e);
- stop();
- } catch (ConfigurationException e) {
- m_logger.log(Logger.ERROR, "The instance creation has failed, an error during the configuration has occured", e);
- stop();
- }
- }
-
- /**
- * Stop all created instances.
- */
- public synchronized void stop() {
- m_tracker.close();
-
- for (int i = 0; m_factories != null && i < m_factories.length; i++) {
- m_factories[i].removeFactoryStateListener(this);
- }
-
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() != null) {
- m_configurations[i].getInstance().dispose();
+ /**
+ * Dispose the current instance.
+ */
+ public void dispose() {
+ if (m_instance != null) {
+ m_instance.dispose();
}
- m_configurations[i].setInstance(null);
- m_configurations[i].setFactory(null);
+ m_instance = null;
+ m_factory = null;
}
-
- m_factories = null;
- m_tracker = null;
- m_logger = null;
- m_configurations = null;
- }
-
- /**
- * Factory state changed method.
- * @param factory : factory.
- * @param newState : new state.
- * @see org.apache.felix.ipojo.FactoryStateListener#stateChanged(org.apache.felix.ipojo.Factory, int)
- */
- public void stateChanged(Factory factory, int newState) {
- if (newState == Factory.VALID) {
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() == null
- && (m_configurations[i].getConfiguration().get("component").equals(factory.getName()) || m_configurations[i].getConfiguration().get(
- "component").equals(((ComponentFactory) factory).getComponentClassName()))) {
- Factory fact = factory;
- createInstance(fact, m_configurations[i]);
- }
- }
- return;
- } else {
- // newState == INVALID
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() != null && m_configurations[i].getFactory().equals(factory.getName())) {
- m_configurations[i].setInstance(null);
- m_configurations[i].setFactory(null);
- }
- }
- return;
- }
- }
-
- /**
- * A new factory has been detected.
- * @param ref : the factory service reference.
- * @return true if the factory can be used to create a managed instance.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
- */
- public boolean addingService(ServiceReference ref) {
- String factoryName = (String) ref.getProperty("factory.name");
- String componentClass = (String) ref.getProperty("component.class");
- boolean isValid = ((String) ref.getProperty("factory.state")).equals("" + Factory.VALID);
- Factory fact = (Factory) m_tracker.getService(ref);
-
- boolean used = false;
- if (isValid) {
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getInstance() == null
- && (m_configurations[i].getConfiguration().get("component").equals(factoryName) || m_configurations[i].getConfiguration().get("component").equals(componentClass))) {
- createInstance(fact, m_configurations[i]);
- used = true;
- }
- }
- }
- return used;
- }
-
- /**
- * A matching service has been added to the tracker.
- * Nothing to do, as all action are computed in the adding method.
- * @param ref : added reference.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
- */
- public void addedService(ServiceReference ref) { }
-
- /**
- * A used factory is modified.
- * @param ref : modified reference.
- * @param obj : factory object.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void modifiedService(ServiceReference ref, Object obj) { }
-
- /**
- * A used factory disappears.
- * All created instance are disposed.
- * @param ref : service reference.
- * @param obj : factory object.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void removedService(ServiceReference ref, Object obj) {
- String name = (String) ref.getProperty("factory.name");
- if (name == null) { return; }
- for (int i = 0; i < m_configurations.length; i++) {
- if (m_configurations[i].getFactory() != null && m_configurations[i].getFactory().equals(name)) {
- if (m_configurations[i].getInstance() != null) {
- m_configurations[i].getInstance().dispose();
- m_configurations[i].setInstance(null);
- }
- m_configurations[i].setFactory(null);
- }
- }
- m_tracker.ungetService(ref);
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
index b310ece..01172df 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/InstanceManager.java
@@ -19,7 +19,9 @@
package org.apache.felix.ipojo;
import java.lang.reflect.Constructor;
+import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.HashMap;
@@ -35,13 +37,10 @@
import org.osgi.framework.BundleContext;
/**
- * The instance manager class manages one instance of a component type. It
- * manages component lifecycle, component instance creation and handlers.
- *
+ * The instance manager class manages one instance of a component type. It manages component lifecycle, component instance creation and handlers.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class InstanceManager implements ComponentInstance, InstanceStateListener {
-
/**
* Name of the component instance.
*/
@@ -51,7 +50,7 @@
* Name of the component type implementation class.
*/
protected String m_className;
-
+
/**
* Handler list.
*/
@@ -61,12 +60,12 @@
* Component state (STOPPED at the beginning).
*/
protected int m_state = STOPPED;
-
+
/**
* Instance State Listener List.
*/
- protected List m_instanceListeners = null;
-
+ protected List m_listeners = null;
+
/**
* Parent factory (ComponentFactory).
*/
@@ -78,12 +77,12 @@
private BundleContext m_context;
/**
- * Map [field, handler list] storing handlers interested by the field.
+ * Map [field, field interceptor list] storing handlers interested by the field.
*/
- private Map m_fieldRegistration = new HashMap();
-
+ private Map m_fieldRegistration;
+
/**
- * Map [method identifier, handler list] storing handlers interested by the method.
+ * Map [method identifier, method interceptor list] storing handlers interested by the method.
*/
private Map m_methodRegistration;
@@ -95,78 +94,89 @@
/**
* Instances of the components.
*/
- private Object[] m_pojoObjects = null;
+ private List m_pojoObjects;
- /**
- * Is the component instance state changing?
- */
- private boolean m_inTransition = false;
-
/**
- * Queue of stored state changed.
+ * Factory method. Contains the name of the static method used to create POJO objects.
+ */
+ private String m_factoryMethod = null;
+
+ /**
+ * Is the component instance state changing?
+ */
+ private boolean m_inTransition = false;
+
+ /**
+ * Queue of stored state changed.
*/
private List m_stateQueue = new ArrayList();
-
+
/**
* Map of [field, value], storing POJO field value.
*/
- private Map m_map = new HashMap();
+ private Map m_fields = new HashMap();
+
+ /**
+ * Map method [id=>method].
+ */
+ private Map m_methods = new HashMap();
/**
* Construct a new Component Manager.
- *
* @param factory : the factory managing the instance manager
- * @param bc : the bundle context to give to the instance
+ * @param context : the bundle context to give to the instance
* @param handlers : handlers array
*/
- public InstanceManager(ComponentFactory factory, BundleContext bc, HandlerManager[] handlers) {
+ public InstanceManager(ComponentFactory factory, BundleContext context, HandlerManager[] handlers) {
m_factory = factory;
- m_context = bc;
+ m_context = context;
m_handlers = handlers;
}
/**
- * Configure the instance manager. Stop the existing handler, clear the
- * handler list, change the metadata, recreate the handlers
- *
- * @param cm : the component type metadata
+ * Configure the instance manager. Stop the existing handler, clear the handler list, change the metadata, recreate the handlers
+ * @param metadata : the component type metadata
* @param configuration : the configuration of the instance
* @throws ConfigurationException : occurs if the metadata are not correct
*/
- public void configure(Element cm, Dictionary configuration) throws ConfigurationException {
- m_className = cm.getAttribute("className");
-
+ public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
+ m_className = metadata.getAttribute("className");
+
// Add the name
m_name = (String) configuration.get("name");
-
+
+ // Get the factory method if presents.
+ m_factoryMethod = (String) metadata.getAttribute("factory-method");
+
// Create the standard handlers and add these handlers to the list
for (int i = 0; i < m_handlers.length; i++) {
- m_handlers[i].init(this, cm, configuration);
+ m_handlers[i].init(this, metadata, configuration);
}
}
/**
- * Get the description of the current instance.
+ * Get the description of the current instance.
* @return the instance description.
* @see org.apache.felix.ipojo.ComponentInstance#getInstanceDescription()
*/
public InstanceDescription getInstanceDescription() {
int componentState = getState();
- InstanceDescription instanceDescription = new InstanceDescription(m_name, componentState, getContext().getBundle().getBundleId(), m_factory.getComponentDescription());
+ InstanceDescription desc =
+ new InstanceDescription(m_name, componentState, getContext().getBundle().getBundleId(), m_factory.getComponentDescription());
if (m_pojoObjects != null) {
- String[] objects = new String[m_pojoObjects.length];
- for (int i = 0; i < m_pojoObjects.length; i++) {
- objects[i] = m_pojoObjects[i].toString();
+ String[] objects = new String[m_pojoObjects.size()];
+ for (int i = 0; i < m_pojoObjects.size(); i++) {
+ objects[i] = m_pojoObjects.get(i).toString();
}
- instanceDescription.setCreatedObjects(objects);
+ desc.setCreatedObjects(objects);
}
Handler[] handlers = getRegistredHandlers();
for (int i = 0; i < handlers.length; i++) {
- instanceDescription.addHandler(handlers[i].getDescription());
+ desc.addHandler(handlers[i].getDescription());
}
- return instanceDescription;
+ return desc;
}
/**
@@ -174,22 +184,21 @@
* @return the handler array of plugged handlers.
*/
public Handler[] getRegistredHandlers() {
- Handler[] h = new Handler[m_handlers.length];
+ Handler[] handler = new Handler[m_handlers.length];
for (int i = 0; i < m_handlers.length; i++) {
- h[i] = m_handlers[i].getHandler();
+ handler[i] = m_handlers[i].getHandler();
}
- return h;
+ return handler;
}
/**
* Return a specified handler.
- *
* @param name : class name of the handler to find or its qualified name (namespace:name)
* @return : the handler, or null if not found
*/
public Handler getHandler(String name) {
for (int i = 0; i < m_handlers.length; i++) {
- HandlerFactory fact = (HandlerFactory) m_handlers[i].getHandler().getInstance().getFactory();
+ HandlerFactory fact = (HandlerFactory) m_handlers[i].getHandler().getHandlerManager().getFactory();
if (fact.getHandlerName().equals(name)) {
return m_handlers[i].getHandler();
}
@@ -198,24 +207,83 @@
}
/**
+ * Give access to a field value to the first created pojo.
+ * This method process by analyzing both managed fields and pojo fields (by reflection).
+ * If no pojo were already created try only on managed fields.
+ * @param fieldName : field name.
+ * @return the field value, null is returned if the value is managed and not already set.
+ */
+ public synchronized Object getFieldValue(String fieldName) {
+ if (m_pojoObjects == null) {
+ return getFieldValue(fieldName, null);
+ } else {
+ return getFieldValue(fieldName, m_pojoObjects.get(0)); // Use the first pojo.
+ }
+ }
+
+ /**
+ * Give access to a field value to the given created pojo.
+ * This method process by analyzing both managed fields and pojo fields (by reflection).
+ * If the given pojo is null, try only on managed fields.
+ * @param fieldName : field name.
+ * @param pojo : the pojo on which computing field value.
+ * @return the field value, null is returned if the value is managed and not already set.
+ */
+ public synchronized Object getFieldValue(String fieldName, Object pojo) {
+ Object setByContainer = null;
+
+ if (m_fields != null) {
+ setByContainer = m_fields.get(fieldName);
+ }
+
+ if (setByContainer == null && pojo != null) { // In the case of no given pojo, return null.
+ // If null either the value was not already set or has the null value.
+ try {
+ Field field = pojo.getClass().getDeclaredField(fieldName);
+ if (!field.isAccessible()) {
+ field.setAccessible(true);
+ }
+ return field.get(pojo);
+ } catch (SecurityException e) {
+ m_factory.getLogger().log(Logger.ERROR, "Cannot reflect on field " + fieldName + " to obtain the value : " + e.getMessage());
+ } catch (NoSuchFieldException e) {
+ m_factory.getLogger().log(Logger.ERROR, "Cannot reflect on field " + fieldName + " to obtain the value : " + e.getMessage());
+ } catch (IllegalArgumentException e) {
+ m_factory.getLogger().log(Logger.ERROR, "Cannot reflect on field " + fieldName + " to obtain the value : " + e.getMessage());
+ } catch (IllegalAccessException e) {
+ m_factory.getLogger().log(Logger.ERROR, "Cannot reflect on field " + fieldName + " to obtain the value : " + e.getMessage());
+ }
+ return null;
+ } else {
+ return setByContainer;
+ }
+ }
+
+ /**
* Start the instance manager.
*/
public synchronized void start() {
if (m_state != STOPPED) { // Instance already started
return;
- }
-
+ }
+
for (int i = 0; i < m_handlers.length; i++) {
m_handlers[i].addInstanceStateListener(this);
- m_handlers[i].start();
+ try {
+ m_handlers[i].start();
+ } catch (IllegalStateException e) {
+ m_factory.getLogger().log(Logger.ERROR, e.getMessage());
+ stop();
+ throw e;
+ }
}
-
+
for (int i = 0; i < m_handlers.length; i++) {
-
if (m_handlers[i].getState() != VALID) {
setState(INVALID);
return;
}
+
}
setState(VALID);
}
@@ -227,26 +295,27 @@
if (m_state == STOPPED) {
return;
} // Instance already stopped
-
+
setState(INVALID);
-
+
+ m_state = STOPPED;
+
// Stop all the handlers
for (int i = m_handlers.length - 1; i > -1; i--) {
m_handlers[i].removeInstanceStateListener(this);
m_handlers[i].stop();
}
-
+
m_pojoObjects = null;
- m_state = STOPPED;
- if (m_instanceListeners != null) {
- for (int i = 0; i < m_instanceListeners.size(); i++) {
- ((InstanceStateListener) m_instanceListeners.get(i)).stateChanged(this, STOPPED);
+ if (m_listeners != null) {
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((InstanceStateListener) m_listeners.get(i)).stateChanged(this, STOPPED);
}
}
}
-
- /**
+
+ /**
* Dispose the instance.
* @see org.apache.felix.ipojo.ComponentInstance#dispose()
*/
@@ -254,100 +323,79 @@
if (m_state > STOPPED) { // Valid or invalid
stop();
}
-
+
m_state = DISPOSED;
-
- if (m_instanceListeners != null) {
- for (int i = 0; i < m_instanceListeners.size(); i++) {
- ((InstanceStateListener) m_instanceListeners.get(i)).stateChanged(this, DISPOSED);
- }
- m_instanceListeners = null;
+
+ for (int i = 0; m_listeners != null && i < m_listeners.size(); i++) {
+ ((InstanceStateListener) m_listeners.get(i)).stateChanged(this, DISPOSED);
}
-
- m_factory.disposed(this);
-
+ m_listeners = null;
+
for (int i = m_handlers.length - 1; i > -1; i--) {
m_handlers[i].dispose();
}
-
- m_map.clear();
- m_handlers = new HandlerManager[0];
- m_fieldRegistration = new HashMap();
- m_methodRegistration = new HashMap();
- m_clazz = null;
- m_inTransition = false;
- }
-
- /**
- * Kill the current instance.
- * Only the factory of this instance can call this method.
- */
- protected void kill() {
- if (m_state > STOPPED) {
- stop();
- }
- if (m_instanceListeners != null) {
- for (int i = 0; i < m_instanceListeners.size(); i++) {
- ((InstanceStateListener) m_instanceListeners.get(i)).stateChanged(this, DISPOSED);
- }
- m_instanceListeners = null;
- }
- // Cleaning
- m_state = DISPOSED;
-
- for (int i = 0; i < m_handlers.length; i++) {
- m_handlers[i].dispose();
- }
-
- m_map.clear();
m_handlers = new HandlerManager[0];
+ m_factory.disposed(this);
+ m_fields.clear();
m_fieldRegistration = new HashMap();
m_methodRegistration = new HashMap();
m_clazz = null;
m_inTransition = false;
-
}
-
+
/**
- * Set the state of the component instance.
- * if the state changed call the stateChanged(int) method on the handlers.
- * This method has a reentrant mechanism. If in the flow of the first call the method is called another times,
- * the second call is stored and executed after the first one is finished.
+ * Set the state of the component instance. if the state changed call the stateChanged(int) method on the handlers. This method has a reentrant
+ * mechanism. If in the flow of the first call the method is called another times, the second call is stored and executed after the first one is
+ * finished.
* @param state : the new state
*/
public synchronized void setState(int state) {
if (m_inTransition) {
- m_stateQueue.add(new Integer(state));
+ m_stateQueue.add(new Integer(state));
return;
}
-
+
if (m_state != state) {
m_inTransition = true;
if (state > m_state) {
// The state increases (Stopped = > IV, IV => V) => invoke handlers from the higher priority to the lower
m_state = state;
- for (int i = 0; i < m_handlers.length; i++) {
- m_handlers[i].getHandler().stateChanged(state);
+ try {
+ for (int i = 0; i < m_handlers.length; i++) {
+ m_handlers[i].getHandler().stateChanged(state);
+ }
+ } catch (IllegalStateException e) {
+ // When an illegal state exception happens, the instance manager must be stopped immediately.
+ m_stateQueue.clear();
+ stop();
+ return;
}
} else {
// The state decreases (V => IV, IV = > Stopped, Stopped => Disposed)
m_state = state;
- for (int i = m_handlers.length - 1; i > -1; i--) {
- m_handlers[i].getHandler().stateChanged(state);
+ try {
+ for (int i = m_handlers.length - 1; i > -1; i--) {
+ m_handlers[i].getHandler().stateChanged(state);
+ }
+ } catch (IllegalStateException e) {
+ // When an illegal state exception happens, the instance manager must be stopped immediately.
+ m_stateQueue.clear();
+ stop();
+ return;
}
}
-
- if (m_instanceListeners != null) {
- for (int i = 0; i < m_instanceListeners.size(); i++) {
- ((InstanceStateListener) m_instanceListeners.get(i)).stateChanged(this, state);
+
+ if (m_listeners != null) {
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ((InstanceStateListener) m_listeners.get(i)).stateChanged(this, state);
}
}
}
-
+
m_inTransition = false;
- if (! m_stateQueue.isEmpty()) {
+ if (!m_stateQueue.isEmpty()) {
int newState = ((Integer) (m_stateQueue.remove(0))).intValue();
setState(newState);
}
@@ -370,18 +418,18 @@
public boolean isStarted() {
return m_state > STOPPED;
}
-
+
/**
* Register an instance state listener.
* @param listener : listener to register.
* @see org.apache.felix.ipojo.ComponentInstance#addInstanceStateListener(org.apache.felix.ipojo.InstanceStateListener)
*/
- public void addInstanceStateListener(InstanceStateListener listener) {
- if (m_instanceListeners == null) {
- m_instanceListeners = new ArrayList();
+ public synchronized void addInstanceStateListener(InstanceStateListener listener) {
+ if (m_listeners == null) {
+ m_listeners = new ArrayList();
}
- synchronized (m_instanceListeners) {
- m_instanceListeners.add(listener);
+ synchronized (m_listeners) {
+ m_listeners.add(listener);
}
}
@@ -390,12 +438,12 @@
* @param listener : listener to unregister.
* @see org.apache.felix.ipojo.ComponentInstance#removeInstanceStateListener(org.apache.felix.ipojo.InstanceStateListener)
*/
- public void removeInstanceStateListener(InstanceStateListener listener) {
- if (m_instanceListeners != null) {
- synchronized (m_instanceListeners) {
- m_instanceListeners.remove(listener);
- if (m_instanceListeners.size() == 0) {
- m_instanceListeners = null;
+ public synchronized void removeInstanceStateListener(InstanceStateListener listener) {
+ if (m_listeners != null) {
+ synchronized (m_listeners) {
+ m_listeners.remove(listener);
+ if (m_listeners.isEmpty()) {
+ m_listeners = null;
}
}
}
@@ -424,129 +472,186 @@
}
/**
- * Add an instance to the created instance list.
- * @param o : the instance to add
- */
- private synchronized void addInstance(Object o) {
- if (m_pojoObjects != null) {
- Object[] newInstances = new Object[m_pojoObjects.length + 1];
- System.arraycopy(m_pojoObjects, 0, newInstances, 0, m_pojoObjects.length);
- newInstances[m_pojoObjects.length] = o;
- m_pojoObjects = newInstances;
- } else {
- m_pojoObjects = new Object[] { o };
- }
- }
-
- /**
* Get the array of object created by the instance.
* @return the created instance of the component instance.
*/
public Object[] getPojoObjects() {
- return m_pojoObjects;
+ if (m_pojoObjects == null) {
+ return null;
+ }
+ return m_pojoObjects.toArray(new Object[m_pojoObjects.size()]);
}
/**
- * Delete the created instance (remove it from the list, to allow the
- * garbage collector to eat the instance).
- *
- * @param o : the instance to delete
- */
- public synchronized void deletePojoObject(Object o) {
- int idx = -1;
- for (int i = 0; i < m_pojoObjects.length; i++) {
- if (m_pojoObjects[i] == o) {
- idx = i;
- break;
- }
- }
-
- if (idx >= 0) {
- if ((m_pojoObjects.length - 1) == 0) {
- m_pojoObjects = null;
- } else {
- Object[] newInstances = new Object[m_pojoObjects.length - 1];
- System.arraycopy(m_pojoObjects, 0, newInstances, 0, idx);
- if (idx < newInstances.length) {
- System.arraycopy(m_pojoObjects, idx + 1, newInstances, idx, newInstances.length - idx);
- }
- m_pojoObjects = newInstances;
- }
- }
- }
-
- /**
- * Create an instance of the component. This method need to be called one
- * time only for singleton provided service
- *
+ * Create an instance of the component. This method need to be called one time only for singleton provided service
* @return a new instance
*/
public Object createPojoObject() {
-
if (m_clazz == null) {
load();
}
+
Object instance = null;
- try {
- // Try to find if there is a constructor with a bundle context as
- // parameter :
+
+ if (m_factoryMethod == null) {
+ // No factory-method, we use the constructor.
try {
- Constructor constructor = m_clazz.getConstructor(new Class[] { InstanceManager.class, BundleContext.class });
- constructor.setAccessible(true);
- instance = constructor.newInstance(new Object[] { this, m_context });
+ // Try to find if there is a constructor with a bundle context as parameter :
+ try {
+ Constructor cst = m_clazz.getDeclaredConstructor(new Class[] { InstanceManager.class, BundleContext.class });
+ if (! cst.isAccessible()) {
+ cst.setAccessible(true);
+ }
+ Object[] args = new Object[] { this, m_context };
+ onEntry(null, m_className, new Object[] {m_context});
+ instance = cst.newInstance(args);
+ onExit(null, m_className, instance);
+ } catch (NoSuchMethodException e) {
+ // Create an instance if no instance are already created with <init>()BundleContext
+ if (instance == null) {
+ Constructor cst = m_clazz.getDeclaredConstructor(new Class[] { InstanceManager.class });
+ if (! cst.isAccessible()) {
+ cst.setAccessible(true);
+ }
+ Object[] args = new Object[] {this};
+ onEntry(null, m_className, new Object[0]);
+ instance = cst.newInstance(args);
+ onExit(null, m_className, instance);
+ }
+ }
+ } catch (IllegalAccessException e) {
+ m_factory.getLogger().log(Logger.ERROR,
+ "[" + m_name + "] createInstance -> The POJO constructor is not accessible : " + e.getMessage());
+ stop();
+ } catch (SecurityException e) {
+ m_factory.getLogger().log(
+ Logger.ERROR,
+ "["
+ + m_name
+ + "] createInstance -> The Component Instance is not accessible (security reason) : "
+ + e.getMessage());
+ stop();
+ } catch (InvocationTargetException e) {
+ m_factory.getLogger().log(
+ Logger.ERROR,
+ "["
+ + m_name
+ + "] createInstance -> Cannot invoke the constructor method (illegal target) : "
+ + e.getTargetException().getMessage());
+ onError(null, m_className, e.getTargetException());
+ stop();
} catch (NoSuchMethodException e) {
- instance = null;
+ m_factory.getLogger().log(Logger.ERROR,
+ "[" + m_name + "] createInstance -> Cannot invoke the constructor (method not found) : " + e.getMessage());
+ stop();
+ } catch (IllegalArgumentException e) {
+ m_factory.getLogger().log(Logger.ERROR,
+ "[" + m_name + "] createInstance -> The POJO constructor invocation failed : " + e.getMessage());
+ stop();
+ } catch (InstantiationException e) {
+ m_factory.getLogger().log(Logger.ERROR,
+ "[" + m_name + "] createInstance -> The POJO constructor invocation failed : " + e.getMessage());
+ stop();
+ }
+ } else {
+ try {
+ // Build the pojo object with the factory-method.
+ Method factory = null;
+ // Try with the bundle context
+ try {
+ factory = m_clazz.getDeclaredMethod(m_factoryMethod, new Class[] { BundleContext.class });
+ if (! factory.isAccessible()) {
+ factory.setAccessible(true);
+ }
+ Object[] args = new Object[] { m_context };
+ onEntry(null, m_className, args);
+ instance = factory.invoke(null, new Object[] { m_context });
+ } catch (NoSuchMethodException e1) {
+ // Try without the bundle context
+ try {
+ factory = m_clazz.getDeclaredMethod(m_factoryMethod, new Class[0]);
+ if (! factory.isAccessible()) {
+ factory.setAccessible(true);
+ }
+ Object[] args = new Object[0];
+ onEntry(null, m_className, args);
+ instance = factory.invoke(null, args);
+ } catch (NoSuchMethodException e2) {
+ // Error : factory-method not found
+ m_factory.getLogger().log(
+ Logger.ERROR,
+ "["
+ + m_name
+ + "] createInstance -> Cannot invoke the factory-method (method not found) : "
+ + e2.getMessage());
+ stop();
+ }
+ }
+
+ // Now call the setInstanceManager method.
+ Method method = instance.getClass().getDeclaredMethod("_setInstanceManager", new Class[] { InstanceManager.class });
+ if (!method.isAccessible()) {
+ method.setAccessible(true);
+ }
+ method.invoke(instance, new Object[] { this });
+ onExit(null, m_className, instance);
+
+ } catch (SecurityException e) {
+ // Error : invocation failed
+ m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the factory-method : " + e.getMessage());
+ stop();
+ } catch (IllegalArgumentException e) {
+ // Error : arguments mismatch
+ m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the factory-method : " + e.getMessage());
+ stop();
+ } catch (IllegalAccessException e) {
+ // Error : illegal access
+ m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the factory-method : " + e.getMessage());
+ stop();
+ } catch (InvocationTargetException e) {
+ // Error : invocation failed
+ m_factory.getLogger().log(Logger.ERROR,
+ "[" + m_name + "] createInstance -> The factory-method returns an exception : " + e.getTargetException());
+ onError(null, m_className, e.getTargetException());
+ stop();
+ } catch (NoSuchMethodException e) {
+ // Error : _setInstanceManager method is missing
+ m_factory.getLogger()
+ .log(
+ Logger.ERROR,
+ "["
+ + m_name
+ + "] createInstance -> Cannot invoke the factory-method (the _setInstanceManager method does not exist) : "
+ + e.getMessage());
+ stop();
}
- // Create an instance if no instance are already created with
- // <init>()BundleContext
- if (instance == null) {
- Constructor constructor = m_clazz.getConstructor(new Class[] { InstanceManager.class });
- constructor.setAccessible(true);
- instance = constructor.newInstance(new Object[] { this });
+ }
+
+ // Register the new instance in not already present.
+ if (m_pojoObjects == null) {
+ m_pojoObjects = new ArrayList(1);
+ }
+ if (!m_pojoObjects.contains(instance)) {
+ m_pojoObjects.add(instance);
+ // Call createInstance on Handlers :
+ for (int i = 0; i < m_handlers.length; i++) {
+ ((PrimitiveHandler) m_handlers[i].getHandler()).onCreation(instance);
}
-
- } catch (InstantiationException e) {
- m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance cannot be instancied : " + e.getMessage());
- stop();
- } catch (IllegalAccessException e) {
- m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance is not accessible : " + e.getMessage());
- stop();
- } catch (SecurityException e) {
- m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> The Component Instance is not accessible (security reason) : " + e.getMessage());
- stop();
- } catch (InvocationTargetException e) {
- m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the constructor method (illegal target) : " + e.getTargetException().getMessage());
- e.printStackTrace();
- stop();
- } catch (NoSuchMethodException e) {
- m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot invoke the constructor (method not found) : " + e.getMessage());
- stop();
- }
- if (instance == null) {
- m_factory.getLogger().log(Logger.ERROR, "[" + m_name + "] createInstance -> Cannot create the instance");
- stop();
}
- // Register the new instance
- addInstance(instance);
- // Call createInstance on Handlers :
- for (int i = 0; i < m_handlers.length; i++) {
- ((PrimitiveHandler) m_handlers[i].getHandler()).objectCreated(instance);
- }
return instance;
}
/**
- * Get the first object created by the instance.
- * If no object created, create and return one object.
+ * Get the first object created by the instance. If no object created, create and return one object.
* @return the instance of the component instance to use for singleton component
*/
public synchronized Object getPojoObject() {
if (m_pojoObjects == null) {
- createPojoObject();
+ return createPojoObject();
}
- return m_pojoObjects[0];
+ return m_pojoObjects.get(0);
}
/**
@@ -561,134 +666,219 @@
}
/**
- * Register an handler. The handler will be notified of event on each field
- * given in the list.
- *
- * @param h : the handler to register
+ * Register an handler. The handler will be notified of event on each field given in the list.
+ * @param handler : the handler to register
* @param fields : the field metadata list
* @param methods : the method metadata list
+ * @deprecated use register(FieldMetadata fm, FieldInterceptor fi) and register(MethodMetadata mm, MethodInterceptor mi) instead.
*/
- public void register(PrimitiveHandler h, FieldMetadata[] fields, MethodMetadata[] methods) {
+ public void register(PrimitiveHandler handler, FieldMetadata[] fields, MethodMetadata[] methods) {
for (int i = 0; fields != null && i < fields.length; i++) {
- if (m_fieldRegistration.get(fields[i].getFieldName()) == null) {
- m_fieldRegistration.put(fields[i].getFieldName(), new PrimitiveHandler[] { h });
+ register(fields[i], handler);
+ }
+ for (int i = 0; methods != null && i < methods.length; i++) {
+ register(methods[i], handler);
+ }
+
+ }
+
+ /**
+ * Register a field interceptor.
+ * @param field : intercepted field
+ * @param interceptor : interceptor
+ */
+ public void register(FieldMetadata field, FieldInterceptor interceptor) {
+ if (m_fieldRegistration == null) {
+ m_fieldRegistration = new HashMap();
+ m_fieldRegistration.put(field.getFieldName(), new FieldInterceptor[] { interceptor });
+ } else {
+ FieldInterceptor[] list = (FieldInterceptor[]) m_fieldRegistration.get(field.getFieldName());
+ if (list == null) {
+ m_fieldRegistration.put(field.getFieldName(), new FieldInterceptor[] { interceptor });
} else {
- PrimitiveHandler[] list = (PrimitiveHandler[]) m_fieldRegistration.get(fields[i].getFieldName());
for (int j = 0; j < list.length; j++) {
- if (list[j] == h) {
+ if (list[j] == interceptor) {
return;
}
}
- PrimitiveHandler[] newList = new PrimitiveHandler[list.length + 1];
+ FieldInterceptor[] newList = new FieldInterceptor[list.length + 1];
System.arraycopy(list, 0, newList, 0, list.length);
- newList[list.length] = h;
- m_fieldRegistration.put(fields[i].getFieldName(), newList);
+ newList[list.length] = interceptor;
+ m_fieldRegistration.put(field.getFieldName(), newList);
}
}
- for (int i = 0; methods != null && i < methods.length; i++) {
- if (m_methodRegistration == null) {
- m_methodRegistration = new HashMap();
- m_methodRegistration.put(methods[i].getMethodIdentifier(), new PrimitiveHandler[] { h });
- } else {
- PrimitiveHandler[] list = (PrimitiveHandler[]) m_methodRegistration.get(methods[i].getMethodIdentifier());
- if (list == null) {
- m_methodRegistration.put(methods[i].getMethodIdentifier(), new PrimitiveHandler[] { h });
- } else {
- for (int j = 0; j < list.length; j++) {
- if (list[j] == h) {
- return;
- }
+ }
+
+ /**
+ * Register a method interceptor.
+ * @param method : intercepted method
+ * @param interceptor : interceptor
+ */
+ public void register(MethodMetadata method, MethodInterceptor interceptor) {
+ if (m_methodRegistration == null) {
+ m_methodRegistration = new HashMap();
+ m_methodRegistration.put(method.getMethodIdentifier(), new MethodInterceptor[] { interceptor });
+ } else {
+ MethodInterceptor[] list = (MethodInterceptor[]) m_methodRegistration.get(method.getMethodIdentifier());
+ if (list == null) {
+ m_methodRegistration.put(method.getMethodIdentifier(), new MethodInterceptor[] { interceptor });
+ } else {
+ for (int j = 0; j < list.length; j++) {
+ if (list[j] == interceptor) {
+ return;
}
- PrimitiveHandler[] newList = new PrimitiveHandler[list.length + 1];
- System.arraycopy(list, 0, newList, 0, list.length);
- newList[list.length] = h;
- m_methodRegistration.put(methods[i].getMethodIdentifier(), newList);
}
+ MethodInterceptor[] newList = new MethodInterceptor[list.length + 1];
+ System.arraycopy(list, 0, newList, 0, list.length);
+ newList[list.length] = interceptor;
+ m_methodRegistration.put(method.getMethodIdentifier(), newList);
}
}
-
}
/**
- * This method is called by the manipulated class each time that a GETFIELD
- * instruction is found. The method ask to each handler which value need to
- * be returned.
- *
- * @param fieldName : the field name on which the GETFIELD instruction is
- * called
- * @return the value decided by the last asked handler (throw a warning if
- * two fields decide two different values)
+ * This method is called by the manipulated class each time that a GETFIELD instruction is found. The method ask to each handler which value need
+ * to be returned.
+ * @param pojo : the pojo object on which the field was get
+ * @param fieldName : the field name on which the GETFIELD instruction is called
+ * @return the value decided by the last asked handler (throw a warning if two fields decide two different values)
*/
- public Object getterCallback(String fieldName) {
- Object initialValue = m_map.get(fieldName);
+ public Object onGet(Object pojo, String fieldName) {
+ Object initialValue = m_fields.get(fieldName);
Object result = initialValue;
// Get the list of registered handlers
- PrimitiveHandler[] list = (PrimitiveHandler[]) m_fieldRegistration.get(fieldName);
+
+ FieldInterceptor[] list = (FieldInterceptor[]) m_fieldRegistration.get(fieldName);
for (int i = 0; list != null && i < list.length; i++) {
- Object handlerResult = list[i].getterCallback(fieldName, initialValue);
+ Object handlerResult = list[i].onGet(null, fieldName, initialValue);
if (handlerResult == initialValue) {
continue; // Non-binding case (default implementation).
} else {
if (result != initialValue) {
- if ((handlerResult != null && ! handlerResult.equals(result)) || (result != null && handlerResult == null)) {
- m_factory.getLogger().log(Logger.WARNING, "A conflict was detected on the injection of " + fieldName + " - return the last value from " + list[i].getInstance().getInstanceName());
+ if ((handlerResult != null && !handlerResult.equals(result)) || (result != null && handlerResult == null)) {
+ m_factory.getLogger().log(
+ Logger.WARNING,
+ "A conflict was detected on the injection of "
+ + fieldName);
}
}
result = handlerResult;
}
}
-
- if ((result != null && ! result.equals(initialValue)) || (result == null && initialValue != null)) {
+
+ if ((result != null && !result.equals(initialValue)) || (result == null && initialValue != null)) {
// A change occurs => notify the change
- m_map.put(fieldName, result);
+ m_fields.put(fieldName, result);
for (int i = 0; list != null && i < list.length; i++) {
- list[i].setterCallback(fieldName, result);
+ list[i].onSet(null, fieldName, result);
}
}
-
- return result;
+
+ return result;
}
-
+
/**
* Dispatch entry method event on registered handler.
+ * @param pojo : the pojo object on which method is invoked.
* @param methodId : method id
+ * @param args : argument array
*/
- public void entryCallback(String methodId) {
- PrimitiveHandler[] list = (PrimitiveHandler[]) m_methodRegistration.get(methodId);
+ public void onEntry(Object pojo, String methodId, Object[] args) {
+ if (m_methodRegistration == null) {
+ return;
+ }
+ MethodInterceptor[] list = (MethodInterceptor[]) m_methodRegistration.get(methodId);
+ Method method = getMethodById(methodId);
for (int i = 0; list != null && i < list.length; i++) {
- list[i].entryCallback(methodId);
+ list[i].onEntry(pojo, method, args);
}
}
/**
- * Dispatch exit method event on registered handler.
- * The given returned object is an instance of Exception if the method has launched an exception.
+ * Dispatch exit method event on registered handler. The given returned object is an instance of Exception if the method has launched an
+ * exception. If the given object is null, either the method returns void, either the method has returned null.
+ * @param pojo : the pojo object on which the method was invoked
+ * @param methodId : method id
+ * @param result : returned object.
+ */
+ public void onExit(Object pojo, String methodId, Object result) {
+ if (m_methodRegistration == null) {
+ return;
+ }
+ MethodInterceptor[] list = (MethodInterceptor[]) m_methodRegistration.get(methodId);
+ Method method = getMethodById(methodId);
+ for (int i = 0; list != null && i < list.length; i++) {
+ list[i].onExit(pojo, method, result);
+ }
+ for (int i = 0; list != null && i < list.length; i++) {
+ list[i].onFinally(pojo, method);
+ }
+ }
+
+ /**
+ * Dispatch error method event on registered handler. The given returned object is an instance of Exception if the method has thrown an exception.
* If the given object is null, either the method returns void, either the method has returned null.
+ * @param pojo : the pojo object on which the method was invoked
* @param methodId : method id
- * @param e : returned object.
+ * @param error : throwable object.
*/
- public void exitCallback(String methodId, Object e) {
- PrimitiveHandler[] list = (PrimitiveHandler[]) m_methodRegistration.get(methodId);
+ public void onError(Object pojo, String methodId, Throwable error) {
+ if (m_methodRegistration == null) {
+ return;
+ }
+ MethodInterceptor[] list = (MethodInterceptor[]) m_methodRegistration.get(methodId);
+ Method method = getMethodById(methodId);
for (int i = 0; list != null && i < list.length; i++) {
- list[i].exitCallback(methodId, e);
+ list[i].onError(pojo, method, error);
+ }
+ for (int i = 0; list != null && i < list.length; i++) {
+ list[i].onFinally(pojo, method);
}
}
/**
- * This method is called by the manipulated class each time that a PUTFILED
- * instruction is found. the method send to each handler the new value.
- *
- * @param fieldName : the field name on which the PUTFIELD instruction is
- * called
+ * Get method object by id.
+ * @param methodId : method id
+ * @return : the method object or null if the method cannot be found.
+ */
+ private Method getMethodById(String methodId) {
+ Method method = (Method) m_methods.get(methodId);
+ if (method == null) {
+ Method[] mets = m_clazz.getDeclaredMethods();
+ for (int i = 0; i < mets.length; i++) {
+ // Check if the method was not already computed. If not, compute the Id and check.
+ if (!m_methods.containsValue(mets[i]) && (MethodMetadata.computeMethodId(mets[i]).equals(methodId))) {
+ // Store the new methodId
+ m_methods.put(methodId, mets[i]);
+ return mets[i];
+ }
+ }
+ // If not found, it is a constructor, return null in this case.
+ if (methodId.equals(m_clazz.getName())) {
+ // Constructor.
+ return null;
+ }
+ // Cannot happen
+ m_factory.getLogger().log(Logger.ERROR, "A methodID cannot be associate with a POJO method : " + methodId);
+ return null;
+ } else {
+ return method;
+ }
+ }
+
+ /**
+ * This method is called by the manipulated class each time that a PUTFILED instruction is found. the method send to each handler the new value.
+ * @param pojo : the pojo object on which the field was set
+ * @param fieldName : the field name on which the PUTFIELD instruction is called
* @param objectValue : the value of the field
*/
- public void setterCallback(String fieldName, Object objectValue) {
- Object o = m_map.get(fieldName);
- if ((o != null && ! o.equals(objectValue)) || (o == null && objectValue != null)) {
- m_map.put(fieldName, objectValue);
- PrimitiveHandler[] list = (PrimitiveHandler[]) m_fieldRegistration.get(fieldName);
+ public void onSet(Object pojo, String fieldName, Object objectValue) {
+ Object value = m_fields.get(fieldName);
+ if ((value != null && !value.equals(objectValue)) || (value == null && objectValue != null)) {
+ m_fields.put(fieldName, objectValue);
+ FieldInterceptor[] list = (FieldInterceptor[]) m_fieldRegistration.get(fieldName);
for (int i = 0; list != null && i < list.length; i++) {
- list[i].setterCallback(fieldName, objectValue);
+ list[i].onSet(null, fieldName, objectValue);
}
}
}
@@ -701,11 +891,11 @@
public BundleContext getContext() {
return m_context;
}
-
+
public BundleContext getGlobalContext() {
return ((IPojoContext) m_context).getGlobalContext();
}
-
+
public ServiceContext getLocalServiceContext() {
return ((IPojoContext) m_context).getServiceContext();
}
@@ -748,15 +938,16 @@
}
/**
- * State Change listener callback.
- * This method is notified at each time a plugged handler becomes invalid.
- * @param instance : changing instance
+ * State Change listener callback. This method is notified at each time a plugged handler becomes invalid.
+ * @param instance : changing instance
* @param newState : new state
* @see org.apache.felix.ipojo.InstanceStateListener#stateChanged(org.apache.felix.ipojo.ComponentInstance, int)
*/
public synchronized void stateChanged(ComponentInstance instance, int newState) {
- if (m_state <= STOPPED) { return; }
-
+ if (m_state <= STOPPED) {
+ return;
+ }
+
// Update the component state if necessary
if (newState == INVALID && m_state == VALID) {
// Need to update the state to UNRESOLVED
@@ -766,36 +957,35 @@
if (newState == VALID && m_state == INVALID) {
// An handler becomes valid => check if all handlers are valid
for (int i = 0; i < m_handlers.length; i++) {
- if (m_handlers[i].getState() != VALID) { return; }
+ if (m_handlers[i].getState() != VALID) {
+ return;
+ }
}
setState(VALID);
return;
- }
+ }
}
-
+
/**
- * Get the list of registered fields.
- * This method is invoked by the POJO itself.
+ * Get the list of registered fields. This method is invoked by the POJO itself.
* @return the set of registered fields.
*/
public Set getRegistredFields() {
- if (m_fieldRegistration != null) {
- return m_fieldRegistration.keySet();
- } else {
+ if (m_fieldRegistration == null) {
return null;
}
+ return m_fieldRegistration.keySet();
}
-
+
/**
- * Get the list of registered methods.
- * This method is invoked by the POJO itself.
+ * Get the list of registered methods. This method is invoked by the POJO itself.
* @return the set of registered methods.
*/
public Set getRegistredMethods() {
- if (m_methodRegistration != null) {
- return m_methodRegistration.keySet();
- } else {
+ if (m_methodRegistration == null) {
return null;
+ } else {
+ return m_methodRegistration.keySet();
}
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/MethodInterceptor.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/MethodInterceptor.java
new file mode 100644
index 0000000..951452f
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/MethodInterceptor.java
@@ -0,0 +1,69 @@
+/*
+ * 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;
+
+import java.lang.reflect.Method;
+
+/**
+* Method interceptor.
+* A class implementing this interface is able to be notified of method invocation.
+* The listener need to be register on the instance manager.
+* For event are send to the listener : before the method entry, after the method returns,
+* when an error is thrown by the method, and before the after either a returns or an error (finally)
+*
+* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+*/
+public interface MethodInterceptor {
+
+ /**
+ * This method is called when the execution enter in a method.
+ * @param pojo : pojo on which the method is called.
+ * @param method : method invoked.
+ * @param args arguments array.
+ */
+ void onEntry(Object pojo, Method method, Object[] args);
+
+ /**
+ * This method is called when the execution exit a method (before a return or a throw).
+ * If the given returned object is null, either the method is void, either it returns null.
+ * You must not modified the returned object.
+ * @param pojo : the pojo on which the method exits.
+ * @param method : exiting method.
+ * @param returnedObj : the returned object (boxed for primitive type)
+ */
+ void onExit(Object pojo, Method method, Object returnedObj);
+
+ /**
+ * This method is called when the execution throw an exception in the given method.
+ * @param pojo : the pojo on which the method was accessed.
+ * @param method : invoked method.
+ * @param throwable : the thrown exception
+ */
+ void onError(Object pojo, Method method, Throwable throwable);
+
+ /**
+ * This method is called when the execution of a method will terminate :
+ * just before to throw an exception or before to return.
+ * OnError or OnExit was already called.
+ * @param pojo : the pojo on which the method was accessed.
+ * @param method : invoked method.
+ */
+ void onFinally(Object pojo, Method method);
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/MissingHandlerException.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/MissingHandlerException.java
index 7e90e43..3ba91b4 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/MissingHandlerException.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/MissingHandlerException.java
@@ -42,6 +42,7 @@
* @param missing : list of missing handlers.
*/
public MissingHandlerException(List missing) {
+ super();
m_message = "Missing handlers : ";
for (int i = 0; i < missing.size(); i++) {
m_message += (String) missing.get(i) + " ";
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/Nullable.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/Nullable.java
index 22ce37c..797d02e 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/Nullable.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/Nullable.java
@@ -1,28 +1,28 @@
-/*
- * 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;
-
-/**
- * A Nullable object must implement this interface.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public interface Nullable {
- // Nothing
-}
+/*
+ * 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;
+
+/**
+ * A Nullable object must implement this interface.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public interface Nullable {
+ // Nothing
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/PolicyServiceContext.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/PolicyServiceContext.java
index 45034a2..501050c 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/PolicyServiceContext.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/PolicyServiceContext.java
@@ -22,7 +22,6 @@
import java.io.InputStream;
import java.util.Dictionary;
-import org.apache.felix.ipojo.composite.ServiceReferenceImpl;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.osgi.framework.BundleException;
@@ -85,7 +84,11 @@
public PolicyServiceContext(BundleContext global, ServiceContext local, int policy) {
m_global = global;
m_local = local;
- m_policy = policy;
+ if (m_local == null) {
+ m_policy = GLOBAL;
+ } else {
+ m_policy = policy;
+ }
}
/**
@@ -137,23 +140,7 @@
case LOCAL_AND_GLOBAL:
ServiceReference[] refLocal = m_local.getAllServiceReferences(clazz, filter);
ServiceReference[] refGlobal = m_global.getAllServiceReferences(clazz, filter);
- if (refLocal != null && refGlobal != null) {
- ServiceReference[] refs = new ServiceReference[refLocal.length + refGlobal.length];
- int j = 0;
- for (int i = 0; i < refLocal.length; i++) {
- refs[j] = refLocal[i];
- j++;
- }
- for (int i = 0; i < refGlobal.length; i++) {
- refs[j] = refGlobal[i];
- j++;
- }
- return refs;
- } else if (refLocal != null && refGlobal == null) {
- return refLocal;
- } else {
- return refGlobal;
- }
+ return computeServiceReferencesFromBoth(refLocal, refGlobal);
default:
return null;
}
@@ -166,7 +153,7 @@
* @see org.apache.felix.ipojo.ServiceContext#getService(org.osgi.framework.ServiceReference)
*/
public Object getService(ServiceReference ref) {
- switch(m_policy) {
+ switch(m_policy) { // NOPMD No break needed as we return in each branch.
case LOCAL:
// The reference comes from the local scope
return m_local.getService(ref);
@@ -174,8 +161,7 @@
// The reference comes from the global registry
return m_global.getService(ref);
case LOCAL_AND_GLOBAL:
- if (ref instanceof org.apache.felix.ipojo.composite.ServiceReferenceImpl) {
- // The reference comes from a composite, i.e. necessary the local composite
+ if (ref instanceof org.apache.felix.ipojo.context.ServiceReferenceImpl) {
return m_local.getService(ref);
} else {
return m_global.getService(ref);
@@ -192,17 +178,17 @@
* @see org.apache.felix.ipojo.ServiceContext#getServiceReference(java.lang.String)
*/
public ServiceReference getServiceReference(String clazz) {
- switch (m_policy) {
+ switch (m_policy) { // NOPMD No break needed as we return in each branch.
case LOCAL:
return m_local.getServiceReference(clazz);
case GLOBAL:
return m_global.getServiceReference(clazz);
case LOCAL_AND_GLOBAL:
ServiceReference refLocal = m_local.getServiceReference(clazz);
- if (refLocal != null) {
- return refLocal;
+ if (refLocal == null) {
+ return m_global.getServiceReference(clazz);
} else {
- return m_global.getServiceReference(clazz);
+ return refLocal;
}
default:
return null;
@@ -226,28 +212,31 @@
case LOCAL_AND_GLOBAL:
ServiceReference[] refLocal = m_local.getServiceReferences(clazz, filter);
ServiceReference[] refGlobal = m_global.getServiceReferences(clazz, filter);
- if (refLocal != null && refGlobal != null) {
- ServiceReference[] refs = new ServiceReference[refLocal.length + refGlobal.length];
- int j = 0;
- for (int i = 0; i < refLocal.length; i++) {
- refs[j] = refLocal[i];
- j++;
- }
- for (int i = 0; i < refGlobal.length; i++) {
- refs[j] = refGlobal[i];
- j++;
- }
- return refs;
- } else if (refLocal != null && refGlobal == null) {
- return refLocal;
- } else {
- return refGlobal;
- }
+ return computeServiceReferencesFromBoth(refLocal, refGlobal);
default:
return null;
}
}
+
+ /**
+ * Compute the service reference array from the two given set of service references.
+ * @param refLocal : local references
+ * @param refGlobal : global references
+ * @return the set of service reference
+ */
+ private ServiceReference[] computeServiceReferencesFromBoth(ServiceReference[] refLocal, ServiceReference[] refGlobal) {
+ if (refLocal == null) {
+ return refGlobal; // If refGlobal is null, return null, else return refGlobal
+ } else if (refGlobal == null) { // refLocal != null && refGlobal == null
+ return refLocal;
+ } else { // Both refGlobal and refLocal are not null
+ ServiceReference[] refs = new ServiceReference[refLocal.length + refGlobal.length];
+ System.arraycopy(refLocal, 0, refs, 0, refLocal.length);
+ System.arraycopy(refGlobal, 0, refs, refLocal.length, refGlobal.length);
+ return refs;
+ }
+ }
/**
* This method is not supported.
@@ -294,7 +283,7 @@
* @see org.apache.felix.ipojo.ServiceContext#ungetService(org.osgi.framework.ServiceReference)
*/
public boolean ungetService(ServiceReference reference) {
- if (reference instanceof ServiceReferenceImpl) {
+ if (reference instanceof org.apache.felix.ipojo.context.ServiceReferenceImpl) {
return m_local.ungetService(reference);
} else {
return m_global.ungetService(reference);
@@ -343,12 +332,12 @@
/**
* Get the bundle object with the given id.
- * @param id : bundle id
+ * @param bundleId : bundle id
* @return the bundle object
* @see org.osgi.framework.BundleContext#getBundle(long)
*/
- public Bundle getBundle(long id) {
- return m_global.getBundle(id);
+ public Bundle getBundle(long bundleId) {
+ return m_global.getBundle(bundleId);
}
/**
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/PrimitiveHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/PrimitiveHandler.java
index 25a9eda..8add263 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/PrimitiveHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/PrimitiveHandler.java
@@ -18,6 +18,12 @@
*/
package org.apache.felix.ipojo;
+import java.lang.reflect.Method;
+
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.PojoMetadata;
+import org.apache.felix.ipojo.util.Logger;
+
/**
@@ -25,7 +31,7 @@
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public abstract class PrimitiveHandler extends Handler {
+public abstract class PrimitiveHandler extends Handler implements FieldInterceptor, MethodInterceptor {
/**
* "Primitive" Handler type (value).
@@ -37,20 +43,45 @@
*/
private InstanceManager m_manager;
+
+ /**
+ * Factory of the instance manager.
+ */
+ private ComponentFactory m_factory;
+
/**
* Attach the current handler to the given instance.
- * @param im ! the instance on which the current handler will be attached.
+ * @param manager ! the instance on which the current handler will be attached.
* @see org.apache.felix.ipojo.Handler#attach(org.apache.felix.ipojo.ComponentInstance)
*/
- protected final void attach(ComponentInstance im) {
- m_manager = (InstanceManager) im;
- setLogger(m_manager.getFactory().getLogger());
+ protected final void attach(ComponentInstance manager) {
+ m_manager = (InstanceManager) manager;
+ }
+
+ public final void setFactory(Factory factory) {
+ m_factory = (ComponentFactory) factory;
+ }
+
+ public Logger getLogger() {
+ return m_factory.getLogger();
}
public InstanceManager getInstanceManager() {
return m_manager;
}
+ public ComponentFactory getFactory() {
+ return m_factory;
+ }
+
+ public Element[] getMetadata() {
+ return null;
+ }
+
+ public PojoMetadata getPojoMetadata() {
+ return m_factory.getPojoMetadata();
+ }
+
/**
* Get a plugged handler of the same container.
* This method must be call only in the start method (or after).
@@ -65,45 +96,76 @@
/**
* This method is called when a PUTFIELD operation is detected.
+ * @param pojo : the pojo object setting the value
* @param fieldName : the field name
* @param value : the value passed to the field
*/
- public void setterCallback(String fieldName, Object value) {
- return;
+ public void onSet(Object pojo, String fieldName, Object value) {
+ // Nothing do do in the default implementation
}
/**
* This method is called when a GETFIELD operation is detected.
+ * @param pojo : the pojo object getting the value
* @param fieldName : the field name
* @param value : the value passed to the field (by the previous call)
* @return : the managed value of the field
*/
- public Object getterCallback(String fieldName, Object value) {
+ public Object onGet(Object pojo, String fieldName, Object value) {
return value;
}
/**
* This method is called when the execution enter in a method.
- * @param methodId : the method identifier
+ * @param pojo : pojo on which the method is called.
+ * @param method : method invoked.
+ * @param args arguments array.
*/
- public void entryCallback(String methodId) { }
+ public void onEntry(Object pojo, Method method, Object[] args) {
+ // Nothing do do in the default implementation
+ }
/**
* This method is called when the execution exit a method (before a return or a throw).
- * If the given returned object is an instance of Exception, this means that the method throwed this exception.
* If the given returned object is null, either the method is void, either it returns null.
* You must not modified the returned object.
- * @param methodId : the method identifier
+ * @param pojo : the pojo on which the method exits.
+ * @param method : exiting method.
* @param returnedObj : the returned object (boxed for primitive type)
*/
- public void exitCallback(String methodId, Object returnedObj) { }
+ public void onExit(Object pojo, Method method, Object returnedObj) {
+ // Nothing do do in the default implementation
+ }
+
+ /**
+ * This method is called when the execution throw an exception in the given method.
+ * @param pojo : the pojo on which the method was accessed.
+ * @param method : invoked method.
+ * @param throwable : the thrown exception
+ */
+ public void onError(Object pojo, Method method, Throwable throwable) {
+ // Nothing do do in the default implementation
+ }
+
+ /**
+ * This method is called when the execution of a method will terminate :
+ * just before to throw an exception or before to return.
+ * OnError or OnExit was already called.
+ * @param pojo : the pojo on which the method was accessed.
+ * @param method : invoked method.
+ */
+ public void onFinally(Object pojo, Method method) {
+ // Nothing do do in the default implementation
+ }
/**
* This method is called when an instance of the component is created, but
* before someone can use it.
* @param instance : the created instance
*/
- public void objectCreated(Object instance) { }
+ public void onCreation(Object instance) {
+ // Nothing do do in the default implementation
+ }
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/ComponentDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/ComponentTypeDescription.java
similarity index 66%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/ComponentDescription.java
rename to ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/ComponentTypeDescription.java
index 1e6c94f..feb86ba 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/ComponentDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/ComponentTypeDescription.java
@@ -18,20 +18,21 @@
*/
package org.apache.felix.ipojo.architecture;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Dictionary;
+import java.util.Properties;
import org.apache.felix.ipojo.ComponentFactory;
import org.apache.felix.ipojo.Factory;
import org.apache.felix.ipojo.metadata.Attribute;
import org.apache.felix.ipojo.metadata.Element;
import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
/**
* Component Type description.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public class ComponentDescription {
+public class ComponentTypeDescription {
/**
* Provided service by the component type.
@@ -42,13 +43,6 @@
* Configuration Properties accepted by the component type.
*/
private PropertyDescription[] m_properties = new PropertyDescription[0];
-
- /**
- * List of required properties.
- * This list contains only property which does not have a default value.
- */
- private List m_requiredProperties = new ArrayList();
-
/**
* Represented factory.
@@ -59,13 +53,9 @@
* Constructor.
* @param factory : represented factory.
*/
- public ComponentDescription(Factory factory) {
+ public ComponentTypeDescription(Factory factory) {
m_factory = factory;
}
-
- public List getRequiredProperties() {
- return m_requiredProperties;
- }
/**
* Get a printable form of the current component type description.
@@ -98,36 +88,40 @@
* @param value : property value.
*/
public void addProperty(String name, String value) {
- PropertyDescription pd = new PropertyDescription(name, String.class.getName(), value);
- addProperty(pd);
+ addProperty(name, value, false);
+ }
+
+ /**
+ * Add a String property in the component type.
+ * @param name : property name.
+ * @param value : property value.
+ * @param immutable : the property is immutable.
+ */
+ public void addProperty(String name, String value, boolean immutable) {
+ PropertyDescription prop = new PropertyDescription(name, String.class.getName(), value);
+ addProperty(prop);
}
/**
* Add a configuration properties to the component type.
* @param pd : the property to add
*/
- public void addProperty(PropertyDescription pd) {
- String n = pd.getName();
- if ("name".equals(n)) {
- pd = new PropertyDescription(n, pd.getType(), null); // Instance name case.
- }
+ public void addProperty(PropertyDescription pd) { //NOPMD remove the instance name of the 'name' property.
+ String name = pd.getName();
+ if ("name".equals(name)) {
+ pd = new PropertyDescription(name, pd.getType(), null); //NOPMD Instance name case.
+ }
// Check if the property is not already in the array
for (int i = 0; i < m_properties.length; i++) {
PropertyDescription desc = m_properties[i];
- if (desc.getName().equals(n)) {
- return;
- }
+ if (desc.getName().equals(name)) { return; }
}
PropertyDescription[] newProps = new PropertyDescription[m_properties.length + 1];
System.arraycopy(m_properties, 0, newProps, 0, m_properties.length);
newProps[m_properties.length] = pd;
m_properties = newProps;
-
- if (pd.getValue() == null) {
- m_requiredProperties.add(n);
- }
}
/**
@@ -156,6 +150,37 @@
public String getName() {
return m_factory.getName();
}
+
+ /**
+ * Compute the default service properties to publish :
+ * factory.name, service.pid, component.providedServiceSpecification, component.properties, component.description, factory.State.
+ * @return : the dictionary of properties to publish.
+ */
+ public Dictionary getPropertiesToPublish() {
+ Properties props = new Properties();
+
+ props.put("factory.name", m_factory.getName());
+ props.put(Constants.SERVICE_PID, m_factory.getName()); // Service PID is required for the integration in the configuration admin.
+
+ props.put("component.providedServiceSpecifications", m_providedServiceSpecification);
+ props.put("component.properties", m_properties);
+ props.put("component.description", this);
+
+ // add every immutable property
+ for (int i = 0; i < m_properties.length; i++) {
+ if (m_properties[i].isImmutable() && m_properties[i].getValue() != null) {
+ props.put(m_properties[i].getName(), m_properties[i].getObjectValue(m_factory.getBundleContext()));
+ }
+ }
+
+ // Add factory state
+ props.put("factory.state", new Integer(m_factory.getState()));
+
+ return props;
+
+ }
+
+
/**
* Get the component type description.
@@ -165,14 +190,9 @@
Element desc = new Element("Factory", "");
desc.addAttribute(new Attribute("name", m_factory.getName()));
- desc.addAttribute(new Attribute("bundle", "" + ((ComponentFactory) m_factory).getBundleContext().getBundle().getBundleId()));
-
- String cn = getClassName();
- if (cn == null) {
- desc.addAttribute(new Attribute("Composite", "true"));
- } else {
- desc.addAttribute(new Attribute("Implementation-Class", getClassName()));
- }
+ desc.addAttribute(
+ new Attribute("bundle",
+ Long.toString(((ComponentFactory) m_factory).getBundleContext().getBundle().getBundleId())));
String state = "valid";
if (m_factory.getState() == Factory.INVALID) {
@@ -181,12 +201,12 @@
desc.addAttribute(new Attribute("state", state));
// Display required & missing handlers
- Element rh = new Element("RequiredHandlers", "");
- rh.addAttribute(new Attribute("list", m_factory.getRequiredHandlers().toString()));
- Element mh = new Element("MissingHandlers", "");
- mh.addAttribute(new Attribute("list", m_factory.getMissingHandlers().toString()));
- desc.addElement(rh);
- desc.addElement(mh);
+ Element req = new Element("RequiredHandlers", "");
+ req.addAttribute(new Attribute("list", m_factory.getRequiredHandlers().toString()));
+ Element missing = new Element("MissingHandlers", "");
+ missing.addAttribute(new Attribute("list", m_factory.getMissingHandlers().toString()));
+ desc.addElement(req);
+ desc.addElement(missing);
for (int i = 0; i < m_providedServiceSpecification.length; i++) {
Element prov = new Element("provides", "");
@@ -198,10 +218,10 @@
Element prop = new Element("property", "");
prop.addAttribute(new Attribute("name", m_properties[i].getName()));
prop.addAttribute(new Attribute("type", m_properties[i].getType()));
- if (m_properties[i].getValue() != null) {
- prop.addAttribute(new Attribute("value", m_properties[i].getValue()));
- } else {
+ if (m_properties[i].getValue() == null) {
prop.addAttribute(new Attribute("value", "REQUIRED"));
+ } else {
+ prop.addAttribute(new Attribute("value", m_properties[i].getValue()));
}
desc.addElement(prop);
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java
index 8847575..2cd3a5a 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/HandlerDescription.java
@@ -18,7 +18,6 @@
*/
package org.apache.felix.ipojo.architecture;
-import org.apache.felix.ipojo.CompositeHandler;
import org.apache.felix.ipojo.Handler;
import org.apache.felix.ipojo.metadata.Attribute;
import org.apache.felix.ipojo.metadata.Element;
@@ -43,21 +42,11 @@
/**
* Constructor.
*
- * @param h : handler.
+ * @param handler : handler.
*/
- public HandlerDescription(Handler h) {
- m_handlerName = h.getClass().getName();
- m_isValid = h.isValid();
- }
-
- /**
- * Constructor.
- *
- * @param h : composite handler.
- */
- public HandlerDescription(CompositeHandler h) {
- m_handlerName = h.getClass().getName();
- m_isValid = h.isValid();
+ public HandlerDescription(Handler handler) {
+ m_handlerName = handler.getClass().getName();
+ m_isValid = handler.isValid();
}
/**
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java
index 14bb1e8..3ebb43a 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/InstanceDescription.java
@@ -57,7 +57,7 @@
/**
* Component Type of the instance.
*/
- private ComponentDescription m_type;
+ private ComponentTypeDescription m_type;
/**
* COntained instance list.
@@ -70,16 +70,16 @@
* @param name : the name of the component instance.
* @param state : the state of the instance.
* @param bundleId : bundle id owning this instance.
- * @param cd : the component type description of this instance.
+ * @param desc : the component type description of this instance.
*/
- public InstanceDescription(String name, int state, long bundleId, ComponentDescription cd) {
+ public InstanceDescription(String name, int state, long bundleId, ComponentTypeDescription desc) {
m_name = name;
m_state = state;
m_createdObjects = new String[0];
m_handlers = new HandlerDescription[0];
m_containedInstances = new InstanceDescription[0];
m_bundleId = bundleId;
- m_type = cd;
+ m_type = desc;
}
/**
@@ -110,7 +110,7 @@
* Get the component type description of the described instance.
* @return : the component type description of this instance.
*/
- public ComponentDescription getComponentDescription() {
+ public ComponentTypeDescription getComponentDescription() {
return m_type;
}
@@ -124,12 +124,12 @@
/**
* Add an handler description to the list.
- * @param hd : the handler description to add
+ * @param desc : the handler description to add
*/
- public void addHandler(HandlerDescription hd) {
+ public void addHandler(HandlerDescription desc) {
// Verify that the dependency description is not already in the array.
for (int i = 0; i < m_handlers.length; i++) {
- if (m_handlers[i] == hd) {
+ if (m_handlers[i] == desc) {
return; // NOTHING TO DO, the description is already in the
// array
}
@@ -137,7 +137,7 @@
// The component Description is not in the array, add it
HandlerDescription[] newHd = new HandlerDescription[m_handlers.length + 1];
System.arraycopy(m_handlers, 0, newHd, 0, m_handlers.length);
- newHd[m_handlers.length] = hd;
+ newHd[m_handlers.length] = desc;
m_handlers = newHd;
}
@@ -163,10 +163,10 @@
/**
* Set the state of the component.
*
- * @param i : the state
+ * @param state : the state
*/
- public void setState(int i) {
- m_state = i;
+ public void setState(int state) {
+ m_state = state;
}
/**
@@ -215,7 +215,7 @@
instance.addAttribute(new Attribute("state", "disposed"));
}
// Bundle
- instance.addAttribute(new Attribute("bundle", "" + m_bundleId));
+ instance.addAttribute(new Attribute("bundle", Long.toString(m_bundleId)));
// Component Type
instance.addAttribute(new Attribute("component.type", m_type.getName()));
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/PropertyDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/PropertyDescription.java
index f3f63f4..222be42 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/PropertyDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/architecture/PropertyDescription.java
@@ -18,6 +18,10 @@
*/
package org.apache.felix.ipojo.architecture;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.util.Property;
+import org.osgi.framework.BundleContext;
+
/**
* Property Information.
*
@@ -39,6 +43,14 @@
* Default value of the property.
*/
private String m_value = null;
+
+
+ /**
+ * Immutable property flag
+ * IF true, the property cannot be override by the instance configuration.
+ * Moreover, immutable properties are exposed on the factory service too.
+ */
+ private boolean m_immutable = false;
/**
* Constructor.
@@ -52,6 +64,21 @@
m_type = type;
m_value = value;
}
+
+ /**
+ * Constructor.
+ *
+ * @param name : name of the property
+ * @param type : type of the property
+ * @param value : default value of the property
+ * @param immutable : the property is immutable.
+ */
+ public PropertyDescription(String name, String type, String value, boolean immutable) {
+ m_name = name;
+ m_type = type;
+ m_value = value;
+ m_immutable = immutable;
+ }
/**
* Get the current property name.
@@ -76,5 +103,27 @@
public String getValue() {
return m_value;
}
+
+ /**
+ * Is the property immutable.
+ * @return true if the property is immutable.
+ */
+ public boolean isImmutable() {
+ return m_immutable;
+ }
+ /**
+ * Get the object value of the current immutable property.
+ * @param context : bundle context to use to load classes.
+ * @return the object value of the current property.
+ */
+ public Object getObjectValue(BundleContext context) {
+ Class type = null;
+ try {
+ type = Property.computeType(m_type, context);
+ return Property.create(type, m_value);
+ } catch (ConfigurationException e) {
+ return m_value; // Cannot create the object.
+ }
+ }
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ExportDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ExportDescription.java
deleted file mode 100644
index 9994698..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ExportDescription.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.composite.service.importer;
-
-import java.util.List;
-
-import org.apache.felix.ipojo.CompositeHandler;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-
-/**
- * Description of the Import Export Handler.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ExportDescription extends HandlerDescription {
-
- /**
- * List of exports.
- */
- private List m_exports;
-
- /**
- * Constructor.
- *
- * @param h : composite handler
- * @param exporters : list of managed exports
- */
- public ExportDescription(CompositeHandler h, List exporters) {
- super(h);
- m_exports = exporters;
- }
-
- /**
- * Build the ImportExport handler description.
- * @return the handler description
- * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
- */
- public Element getHandlerInfo() {
- Element handler = super.getHandlerInfo();
- for (int i = 0; i < m_exports.size(); i++) {
- ServiceExporter exp = (ServiceExporter) m_exports.get(i);
- Element expo = new Element("Exports", "");
- expo.addAttribute(new Attribute("Specification", exp.getSpecification()));
- expo.addAttribute(new Attribute("Filter", exp.getFilter()));
- if (exp.isSatisfied()) {
- expo.addAttribute(new Attribute("State", "resolved"));
- } else {
- expo.addAttribute(new Attribute("State", "unresolved"));
- }
- handler.addElement(expo);
- }
- return handler;
-
- }
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ExportHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ExportHandler.java
deleted file mode 100644
index 707dac8..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ExportHandler.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * 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.composite.service.importer;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.List;
-
-import org.apache.felix.ipojo.CompositeHandler;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.metadata.Element;
-import org.osgi.framework.BundleContext;
-
-/**
- * This handler manages the import and the export of services from /
- * to the parent context.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ExportHandler extends CompositeHandler {
-
- /**
- * Service Scope.
- */
- private ServiceContext m_scope;
-
- /**
- * Parent context.
- */
- private BundleContext m_context;
-
- /**
- * List of exporters.
- */
- private List m_exporters = new ArrayList();
-
- /**
- * Is the handler valid ?
- * (Lifecycle controller)
- */
- private boolean m_valid;
-
- /**
- * Initialize the component type.
- * @param cd : component type description to populate.
- * @param metadata : component type metadata.
- * @throws ConfigurationException : occurs when the 'specification' attribute is missing
- * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentDescription, org.apache.felix.ipojo.metadata.Element)
- */
- public void initializeComponentFactory(ComponentDescription cd, Element metadata) throws ConfigurationException {
- // Update the component type description
- Element[] exp = metadata.getElements("exports");
- for (int i = 0; i < exp.length; i++) {
- String spec = exp[i].getAttribute("specification");
- if (spec != null) {
- cd.addProvidedServiceSpecification(spec);
- } else {
- // Malformed exports
- throw new ConfigurationException("Malformed exports - Missing the specification attribute");
- }
- }
- }
-
- /**
- * Configure the handler.
- * @param metadata : the metadata of the component
- * @param conf : the instance configuration
- * @throws ConfigurationException : if the specification attribute is missing in the metadata.
- * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager,
- * org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
- */
- public void configure(Element metadata, Dictionary conf) throws ConfigurationException {
- m_context = getCompositeManager().getContext();
- m_scope = getCompositeManager().getServiceContext();
-
- Element[] exp = metadata.getElements("exports");
-
- for (int i = 0; i < exp.length; i++) {
- boolean optional = false;
- boolean aggregate = false;
- String specification = exp[i].getAttribute("specification");
- String filter = "(objectClass=" + specification + ")";
-
- String opt = exp[i].getAttribute("optional");
- optional = opt != null && opt.equalsIgnoreCase("true");
-
- String agg = exp[i].getAttribute("aggregate");
- aggregate = agg != null && agg.equalsIgnoreCase("true");
-
- String f = exp[i].getAttribute("filter");
- if (f != null) {
- filter = "(&" + filter + f + ")";
- }
- ServiceExporter si = new ServiceExporter(specification, filter, aggregate, optional, m_scope, m_context, this);
- m_exporters.add(si);
- }
- }
-
- /**
- * Start the handler.
- * Start importers and exporters.
- * @see org.apache.felix.ipojo.CompositeHandler#start()
- */
- public void start() {
- for (int i = 0; i < m_exporters.size(); i++) {
- ServiceExporter se = (ServiceExporter) m_exporters.get(i);
- se.start();
- }
-
- isHandlerValid();
-
- }
-
- /**
- * Stop the handler.
- * Stop all importers and exporters.
- * @see org.apache.felix.ipojo.CompositeHandler#stop()
- */
- public void stop() {
- for (int i = 0; i < m_exporters.size(); i++) {
- ServiceExporter se = (ServiceExporter) m_exporters.get(i);
- se.stop();
- }
- }
-
- /**
- * Check the handler validity.
- * @return true if all importers and exporters are valid
- * @see org.apache.felix.ipojo.CompositeHandler#isValid()
- */
- private boolean isHandlerValid() {
- for (int i = 0; i < m_exporters.size(); i++) {
- ServiceExporter se = (ServiceExporter) m_exporters.get(i);
- if (!se.isSatisfied()) {
- m_valid = false;
- return false;
- }
- }
-
- m_valid = true;
- return true;
- }
-
- /**
- * Notify the handler that an exporter becomes invalid.
- *
- * @param exporter : the implicated exporter.
- */
- protected void invalidating(ServiceExporter exporter) {
- // An export is no more valid
- if (m_valid) {
- m_valid = false;
- }
-
- }
-
- /**
- * Notify the handler that an exporter becomes valid.
- *
- * @param exporter : the implicated exporter.
- */
- protected void validating(ServiceExporter exporter) {
- // An import becomes valid
- if (!m_valid) {
- isHandlerValid();
- }
- }
-
- /**
- * Get the import / export handler description.
- * @return the handler description
- * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
- */
- public HandlerDescription getDescription() {
- return new ExportDescription(this, m_exporters);
- }
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportDescription.java
deleted file mode 100644
index 0a56014..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportDescription.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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.composite.service.importer;
-
-import java.util.List;
-
-import org.apache.felix.ipojo.CompositeHandler;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-
-/**
- * Description of the Import Export Handler.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ImportDescription extends HandlerDescription {
-
- /**
- * List of exports.
- */
- private List m_imports;
-
- /**
- * Constructor.
- *
- * @param h : composite handler
- * @param importers : list of managed imports
- */
- public ImportDescription(CompositeHandler h, List importers) {
- super(h);
- m_imports = importers;
- }
-
- /**
- * Build the ImportExport handler description.
- * @return the handler description
- * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
- */
- public Element getHandlerInfo() {
- Element handler = super.getHandlerInfo();
- for (int i = 0; i < m_imports.size(); i++) {
- ServiceImporter imp = (ServiceImporter) m_imports.get(i);
- Element impo = new Element("Requires", "");
- impo.addAttribute(new Attribute("Specification", imp.getSpecification()));
- if (imp.getFilter() != null) {
- impo.addAttribute(new Attribute("Filter", imp.getFilter()));
- }
- if (imp.isSatisfied()) {
- impo.addAttribute(new Attribute("State", "resolved"));
- for (int j = 0; j < imp.getProviders().size(); j++) {
- Element pr = new Element("Provider", "");
- pr.addAttribute(new Attribute("name", (String) imp.getProviders().get(j)));
- impo.addElement(pr);
- }
- } else {
- impo.addAttribute(new Attribute("State", "unresolved"));
- }
- handler.addElement(impo);
- }
- return handler;
- }
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportHandler.java
deleted file mode 100644
index b54397f..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ImportHandler.java
+++ /dev/null
@@ -1,208 +0,0 @@
-/*
- * 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.composite.service.importer;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.List;
-
-import org.apache.felix.ipojo.CompositeHandler;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.PolicyServiceContext;
-import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.util.Logger;
-import org.osgi.framework.BundleContext;
-
-/**
- * This handler manages the import and the export of services from /
- * to the parent context.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ImportHandler extends CompositeHandler {
-
- /**
- * Service Scope.
- */
- private ServiceContext m_scope;
-
- /**
- * Parent context.
- */
- private BundleContext m_context;
-
- /**
- * List of importers.
- */
- private List m_importers = new ArrayList();
-
- /**
- * Is the handler valid ?
- * (Lifecycle controller)
- */
- private boolean m_valid;
-
-
- /**
- * Configure the handler.
- *
- * @param metadata : the metadata of the component
- * @param conf : the instance configuration
- * @throws ConfigurationException : the specification attribute is missing.
- * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager,
- * org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
- */
- public void configure(Element metadata, Dictionary conf) throws ConfigurationException {
- m_context = getCompositeManager().getContext();
- m_scope = getCompositeManager().getServiceContext();
- Element[] imp = metadata.getElements("requires");
-
- // Get instance filters
- Dictionary filtersConfiguration = null;
- if (conf.get("requires.filters") != null) {
- filtersConfiguration = (Dictionary) conf.get("requires.filters");
- }
-
- for (int i = 0; i < imp.length; i++) {
- boolean optional = false;
- boolean aggregate = false;
- String specification = imp[i].getAttribute("specification");
-
- if (specification != null) {
- String opt = imp[i].getAttribute("optional");
- optional = opt != null && opt.equalsIgnoreCase("true");
-
- String agg = imp[i].getAttribute("aggregate");
- aggregate = agg != null && agg.equalsIgnoreCase("true");
-
- String filter = "(&(objectClass=" + specification + ")(!(instance.name=" + getCompositeManager().getInstanceName() + ")))"; // Cannot import yourself
- String f = imp[i].getAttribute("filter");
- if (f != null) {
- filter = "(&" + filter + f + ")";
- }
-
- String id = imp[i].getAttribute("id");
-
- int scopePolicy = -1;
- String scope = imp[i].getAttribute("scope");
- if (scope != null) {
- if (scope.equalsIgnoreCase("global")) {
- scopePolicy = PolicyServiceContext.GLOBAL;
- } else if (scope.equalsIgnoreCase("composite")) {
- scopePolicy = PolicyServiceContext.LOCAL;
- } else if (scope.equalsIgnoreCase("composite+global")) {
- scopePolicy = PolicyServiceContext.LOCAL_AND_GLOBAL;
- }
- }
-
- // Configure instance filter if available
- if (filtersConfiguration != null && id != null && filtersConfiguration.get(id) != null) {
- filter = (String) filtersConfiguration.get(id);
- }
-
- ServiceImporter si = new ServiceImporter(specification, filter, aggregate, optional, m_context, m_scope, scopePolicy, id, this);
- m_importers.add(si);
- } else { // Malformed import
- log(Logger.ERROR, "Malformed imports : the specification attribute is mandatory");
- throw new ConfigurationException("Malformed imports : the specification attribute is mandatory");
- }
- }
- }
-
- /**
- * Start the handler.
- * Start importers and exporters.
- * @see org.apache.felix.ipojo.CompositeHandler#start()
- */
- public void start() {
- for (int i = 0; i < m_importers.size(); i++) {
- ServiceImporter si = (ServiceImporter) m_importers.get(i);
- si.start();
- }
- isHandlerValid();
- }
-
- /**
- * Stop the handler.
- * Stop all importers and exporters.
- * @see org.apache.felix.ipojo.CompositeHandler#stop()
- */
- public void stop() {
- for (int i = 0; i < m_importers.size(); i++) {
- ServiceImporter si = (ServiceImporter) m_importers.get(i);
- si.stop();
- }
- }
-
- /**
- * Check the handler validity.
- * @return true if all importers and exporters are valid
- * @see org.apache.felix.ipojo.CompositeHandler#isValid()
- */
- public boolean isHandlerValid() {
- for (int i = 0; i < m_importers.size(); i++) {
- ServiceImporter si = (ServiceImporter) m_importers.get(i);
- if (!si.isSatisfied()) {
- m_valid = false;
- return false;
- }
- }
- m_valid = true;
- return true;
- }
-
- /**
- * Notify the handler that an importer is no more valid.
- *
- * @param importer : the implicated importer.
- */
- protected void invalidating(ServiceImporter importer) {
- // An import is no more valid
- if (m_valid) {
- m_valid = false;
- }
- }
-
- /**
- * Notify the handler that an importer becomes valid.
- *
- * @param importer : the implicated importer.
- */
- protected void validating(ServiceImporter importer) {
- // An import becomes valid
- if (!m_valid) {
- isHandlerValid();
- }
- }
-
- /**
- * Get the import / export handler description.
- * @return the handler description
- * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
- */
- public HandlerDescription getDescription() {
- return new ImportDescription(this, m_importers);
- }
-
- public List getRequirements() {
- return m_importers;
- }
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceExporter.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceExporter.java
deleted file mode 100644
index 52347c5..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceExporter.java
+++ /dev/null
@@ -1,313 +0,0 @@
-/*
- * 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.composite.service.importer;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.util.Tracker;
-import org.apache.felix.ipojo.util.TrackerCustomizer;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-
-/**
- * Export an service from the scope to the parent context.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ServiceExporter implements TrackerCustomizer {
-
- /**
- * Destination context.
- */
- private BundleContext m_destination;
-
- /**
- * Origin context.
- */
- private ServiceContext m_origin;
-
- /**
- * Exported specification.
- */
- private String m_specification;
-
- /**
- * LDAP filter filtering internal provider.
- */
- private Filter m_filter;
-
- /**
- * String form of the LDAP filter.
- */
- private String m_filterStr;
-
- /**
- * Should be exported several providers.
- */
- private boolean m_aggregate = false;
-
- /**
- * Is this exports optional?
- */
- private boolean m_optional = false;
-
- /**
- * Reference of the handler.
- */
- private ExportHandler m_handler;
-
- /**
- * Is the exporter valid?
- */
- private boolean m_isValid;
-
- /**
- * Tracker tracking internal service (to export).
- */
- private Tracker m_tracker;
-
- /**
- * Structure Reference, Registration, Service Object.
- */
- private class Record {
- /**
- * Internal Reference.
- */
- private ServiceReference m_ref;
- /**
- * External Registration.
- */
- private ServiceRegistration m_reg;
- /**
- * Exposed object.
- */
- private Object m_svcObject;
- }
-
- /**
- * List of managed records.
- */
- private List/*<Record>*/m_records = new ArrayList()/* <Record> */;
-
- /**
- * Constructor.
- *
- * @param specification : exported service specification.
- * @param filter : LDAP filter
- * @param multiple : is the export an aggregate export?
- * @param optional : is the export optional?
- * @param from : internal service context
- * @param to : external bundle context
- * @param exp : handler
- */
- public ServiceExporter(String specification, String filter, boolean multiple, boolean optional, ServiceContext from, BundleContext to,
- ExportHandler exp) {
- this.m_destination = to;
- this.m_origin = from;
- this.m_handler = exp;
- try {
- this.m_filter = to.createFilter(filter);
- } catch (InvalidSyntaxException e) {
- e.printStackTrace();
- return;
- }
- this.m_aggregate = multiple;
- this.m_specification = specification;
- this.m_optional = optional;
- }
-
- /**
- * Start method.
- * Start the provider tracking and the publication.
- */
- public void start() {
- m_tracker = new Tracker(m_origin, m_filter, this);
- m_tracker.open();
-
- m_isValid = isSatisfied();
- }
-
- /**
- * Transform service reference property in a dictionary.
- * instance.name and factory.name are injected too.
- * @param ref : the service reference.
- * @return the dictionary containing all property of the given service reference.
- */
- private Dictionary getProps(ServiceReference ref) {
- Properties prop = new Properties();
- String[] keys = ref.getPropertyKeys();
- for (int i = 0; i < keys.length; i++) {
- prop.put(keys[i], ref.getProperty(keys[i]));
- }
-
- prop.put("instance.name", m_handler.getCompositeManager().getInstanceName());
- prop.put("factory.name", m_handler.getCompositeManager().getFactory().getName());
-
- return prop;
- }
-
- /**
- * Stop an exporter.
- * Remove the service listener
- * Unregister all exported services.
- */
- public void stop() {
- m_tracker.close();
-
- for (int i = 0; i < m_records.size(); i++) {
- Record rec = (Record) m_records.get(i);
- rec.m_svcObject = null;
- if (rec.m_reg != null) {
- rec.m_reg.unregister();
- rec.m_reg = null;
- m_tracker.ungetService(rec.m_ref);
- rec.m_ref = null;
- }
- }
-
- m_tracker = null;
- m_records.clear();
-
- }
-
- /**
- * Check the exporter validity.
- * @return true if optional or 'valid'
- */
- public boolean isSatisfied() {
- return m_optional || m_records.size() > 0;
- }
-
- /**
- * Get the list of records using the given reference.
- * @param ref : the service reference
- * @return the list of records using the given reference, empty if no record used this reference
- */
- private List/* <Record> */getRecordsByRef(ServiceReference ref) {
- List l = new ArrayList();
- for (int i = 0; i < m_records.size(); i++) {
- Record rec = (Record) m_records.get(i);
- if (rec.m_ref == ref) {
- l.add(rec);
- }
- }
- return l;
- }
-
- protected String getSpecification() {
- return m_specification;
- }
-
- public String getFilter() {
- return m_filterStr;
- }
-
- /**
- * An exported service appears.
- * @param reference : service reference
- * @return true as the filter guaranty the export.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
- */
- public boolean addingService(ServiceReference reference) {
- return true;
- }
-
- /**
- * A service has been added in the tracker. Can now thest the validity of the exporter.
- * @param reference : the new reference.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
- */
- public void addedService(ServiceReference reference) {
- Record rec = new Record();
- rec.m_ref = reference;
- m_records.add(rec);
- // Publishing ?
- if (m_records.size() == 1 || m_aggregate) { // If the service is the first one, or if it is a multiple imports
- rec.m_svcObject = m_tracker.getService(rec.m_ref);
- rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
- }
- // Compute the new state
- if (!m_isValid && isSatisfied()) {
- m_isValid = true;
- m_handler.validating(this);
- }
- }
-
- /**
- * An exported service was modified.
- * @param reference : modified reference
- * @param service : service object
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void modifiedService(ServiceReference reference, Object service) {
- // A published service has been modified
- List l = getRecordsByRef(reference);
- for (int i = 0; i < l.size(); i++) { // Update the implied record
- Record rec = (Record) l.get(i);
- if (rec.m_reg != null) {
- rec.m_reg.setProperties(getProps(reference));
- }
- }
- }
-
- /**
- * An exported service disappears.
- * @param reference : service reference
- * @param service : service object
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void removedService(ServiceReference reference, Object service) {
- List l = getRecordsByRef(reference);
- for (int i = 0; i < l.size(); i++) { // Stop the implied record
- Record rec = (Record) l.get(i);
- if (rec.m_reg != null) {
- rec.m_svcObject = null;
- rec.m_reg.unregister();
- rec.m_reg = null;
- m_tracker.ungetService(rec.m_ref);
- }
- }
- m_records.removeAll(l);
-
- // Check the validity & if we need to re-import the service
- if (m_records.size() > 0) {
- // There is other available services
- if (!m_aggregate) { // Import the next one
- Record rec = (Record) m_records.get(0);
- if (rec.m_svcObject == null) { // It is the first service which disappears - create the next one
- rec.m_svcObject = m_tracker.getService(rec.m_ref);
- rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
- }
- }
- } else {
- if (!m_optional) {
- m_isValid = false;
- m_handler.invalidating(this);
- }
- }
-
- }
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceImporter.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceImporter.java
deleted file mode 100644
index 9118fd2..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/importer/ServiceImporter.java
+++ /dev/null
@@ -1,392 +0,0 @@
-/*
- * 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.composite.service.importer;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.felix.ipojo.PolicyServiceContext;
-import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.util.Tracker;
-import org.apache.felix.ipojo.util.TrackerCustomizer;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-
-/**
- * Import a service form the parent to the internal service registry.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ServiceImporter implements TrackerCustomizer {
-
- /**
- * Destination context.
- */
- private ServiceContext m_destination;
-
- /**
- * Context where service need to be found.
- */
- private ServiceContext m_origin;
-
- /**
- * Imported Specification.
- */
- private String m_specification;
-
- /**
- * LDAP filter filtering external providers.
- */
- private Filter m_filter;
-
- /**
- * String form of the LDAP filter.
- */
- private String m_filterStr;
-
- /**
- * Should we importer several providers?
- */
- private boolean m_aggregate = false;
-
- /**
- * Is the import optional?
- */
- private boolean m_optional = false;
-
- /**
- * Is the importer valid?
- */
- private boolean m_isValid;
-
- /**
- * Resolving policy.
- */
- private int m_policy;
-
- /**
- * TRacker tracking imported service.
- */
- private Tracker m_tracker;
-
- /**
- * Reference on the handler.
- */
- private ImportHandler m_handler;
-
- private class Record {
- /**
- * External Reference.
- */
- private ServiceReference m_ref;
- /**
- * Internal Registration.
- */
- private ServiceRegistration m_reg;
- /**
- * Exposed Object.
- */
- private Object m_svcObject;
-
- /**
- * Test object equality.
- * @param o : object to confront against the current object.
- * @return true if the two objects are equals (same service reference).
- * @see java.lang.Object#equals(java.lang.Object)
- */
- public boolean equals(Object o) {
- if (o instanceof Record) {
- Record rec = (Record) o;
- return rec.m_ref == m_ref;
- }
- return false;
- }
- }
-
- /**
- * List of managed records.
- */
- private List/*<Record>*/m_records = new ArrayList()/* <Record> */;
-
- /**
- * Requirement Id.
- */
- private String m_id;
-
- /**
- * Is this requirement attached to a service-level requirement.
- */
- private boolean m_isServiceLevelRequirement;
-
- /**
- * Constructor.
- *
- * @param specification : targeted specification
- * @param filter : LDAP filter
- * @param multiple : should the importer imports several services ?
- * @param optional : is the import optional ?
- * @param from : parent context
- * @param to : internal context
- * @param policy : resolving policy
- * @param id : requirement id (may be null)
- * @param in : handler
- */
- public ServiceImporter(String specification, String filter, boolean multiple, boolean optional, BundleContext from, ServiceContext to, int policy, String id,
- ImportHandler in) {
- this.m_destination = to;
- try {
- this.m_filter = from.createFilter(filter);
- } catch (InvalidSyntaxException e) {
- e.printStackTrace();
- return;
- }
- this.m_aggregate = multiple;
- this.m_specification = specification;
- this.m_optional = optional;
- this.m_handler = in;
-
- if (m_id == null) {
- m_id = m_specification;
- } else {
- m_id = id;
- }
-
- if (policy == -1) {
- m_policy = PolicyServiceContext.LOCAL_AND_GLOBAL;
- } else {
- m_policy = policy;
- }
- }
-
- /**
- * Start method to begin the import.
- */
- public void start() {
- m_origin = new PolicyServiceContext(m_handler.getCompositeManager().getGlobalContext(), m_handler.getCompositeManager().getParentServiceContext(), m_policy);
- m_tracker = new Tracker(m_origin, m_filter, this);
- m_tracker.open();
- m_isValid = isSatisfied();
- }
-
- /**
- * Get the properties for the exposed service from the given reference.
- *
- * @param ref : the reference.
- * @return the property dictionary
- */
- private Dictionary getProps(ServiceReference ref) {
- Properties prop = new Properties();
- String[] keys = ref.getPropertyKeys();
- for (int i = 0; i < keys.length; i++) {
- prop.put(keys[i], ref.getProperty(keys[i]));
- }
- return prop;
- }
-
- /**
- * Stop the management of the import.
- */
- public void stop() {
-
- m_tracker.close();
-
- for (int i = 0; i < m_records.size(); i++) {
- Record rec = (Record) m_records.get(i);
- rec.m_svcObject = null;
- if (rec.m_reg != null) {
- rec.m_reg.unregister();
- m_tracker.ungetService(rec.m_ref);
- rec.m_ref = null;
- }
- }
-
- m_tracker = null;
- m_records.clear();
-
- }
-
- /**
- * Check if the import is satisfied.
- * @return true if the import is optional or at least one provider is imported
- */
- public boolean isSatisfied() {
- return m_optional || m_records.size() > 0;
- }
-
- /**
- * Get the record list using the given reference.
- *
- * @param ref : the reference
- * @return the list containing all record using the given reference
- */
- private List/* <Record> */getRecordsByRef(ServiceReference ref) {
- List l = new ArrayList();
- for (int i = 0; i < m_records.size(); i++) {
- Record rec = (Record) m_records.get(i);
- if (rec.m_ref == ref) {
- l.add(rec);
- }
- }
- return l;
- }
-
- public String getSpecification() {
- return m_specification;
- }
-
- /**
- * Build the list of imported service provider.
- * @return the list of all imported services.
- */
- protected List getProviders() {
- List l = new ArrayList();
- for (int i = 0; i < m_records.size(); i++) {
- l.add((((Record) m_records.get(i)).m_ref).getProperty("instance.name"));
- }
- return l;
-
- }
-
- public String getFilter() {
- return m_filterStr;
- }
-
- /**
- * Set that this dependency is a service level dependency.
- * This forces the scoping policy to be STRICT.
- * @param b
- */
- public void setServiceLevelDependency() {
- m_isServiceLevelRequirement = true;
- m_policy = PolicyServiceContext.LOCAL;
- }
-
- public String getId() {
- return m_id;
- }
-
- public boolean isServiceLevelRequirement() {
- return m_isServiceLevelRequirement;
- }
-
- public boolean isAggregate() {
- return m_aggregate;
- }
-
- public boolean isOptional() {
- return m_optional;
- }
-
- /**
- * A new service is detected.
- * @param reference : service reference
- * @return true if not already imported.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
- */
- public boolean addingService(ServiceReference reference) {
- for (int i = 0; i < m_records.size(); i++) {
- Record rec = (Record) m_records.get(i);
- if (rec.m_ref == reference) {
- return false; // Already contained
- }
- }
- return true;
- }
-
- /**
- * The given service reference was added inside the tracker list.
- * Register the internal service.
- * @param reference : added reference
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
- */
- public void addedService(ServiceReference reference) {
- Record rec = new Record();
- rec.m_ref = reference;
- m_records.add(rec);
- // Publishing ?
- if (m_records.size() == 1 || m_aggregate) { // If the service is the first one, or if it is a multiple imports
- rec.m_svcObject = m_tracker.getService(rec.m_ref);
- rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
- }
- // Compute the new state
- if (!m_isValid && isSatisfied()) {
- m_isValid = true;
- m_handler.validating(this);
- }
- }
-
- /**
- * An imported service was modified.
- * @param reference : service reference
- * @param service : service object (if already get)
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void modifiedService(ServiceReference reference, Object service) {
- List l = getRecordsByRef(reference);
- for (int i = 0; i < l.size(); i++) { // Stop the implied record
- Record rec = (Record) l.get(i);
- if (rec.m_reg != null) {
- rec.m_reg.setProperties(getProps(rec.m_ref));
- }
- }
- }
-
- /**
- * An imported service disappears.
- *@param reference : service reference
- * @param service : service object (if already get)
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void removedService(ServiceReference reference, Object service) {
- List l = getRecordsByRef(reference);
- for (int i = 0; i < l.size(); i++) { // Stop the implied record
- Record rec = (Record) l.get(i);
- if (rec.m_reg != null) {
- rec.m_svcObject = null;
- rec.m_reg.unregister();
- rec.m_reg = null;
- m_tracker.ungetService(rec.m_ref);
- }
- }
- m_records.removeAll(l);
-
- // Check the validity & if we need to re-import the service
- if (m_records.size() > 0) {
- // There is other available services
- if (!m_aggregate) { // Import the next one
- Record rec = (Record) m_records.get(0);
- if (rec.m_svcObject == null) { // It is the first service which disappears - create the next one
- rec.m_svcObject = m_tracker.getService(rec.m_ref);
- rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
- }
- }
- } else {
- if (!m_optional) {
- m_isValid = false;
- m_handler.invalidating(this);
- }
- }
- }
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java
deleted file mode 100644
index c3275b9..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorDescription.java
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * 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.composite.service.instantiator;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.CompositeHandler;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Description of the Service Creator Handler.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ServiceInstantiatorDescription extends HandlerDescription {
-
- /**
- * List of managed service instances.
- */
- private List m_instances;
-
- /**
- * Constructor.
- *
- * @param h : composite handler
- * @param insts : list of service instance
- */
- public ServiceInstantiatorDescription(CompositeHandler h, List insts) {
- super(h);
- m_instances = insts;
- }
-
- /**
- * Build service instantiator handler description.
- * @return the handler description
- * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
- */
- public Element getHandlerInfo() {
- Element services = super.getHandlerInfo();
- for (int i = 0; i < m_instances.size(); i++) {
- SvcInstance inst = (SvcInstance) m_instances.get(i);
- Element service = new Element("Service", "");
- service.addAttribute(new Attribute("Specification", inst.getSpecification()));
- String state = "unresolved";
- if (inst.isSatisfied()) {
- state = "resolved";
- }
- service.addAttribute(new Attribute("State", state));
- Map map = inst.getUsedReferences();
- Set keys = map.keySet();
- Iterator it = keys.iterator();
- while (it.hasNext()) {
- ServiceReference ref = (ServiceReference) it.next();
- Object o = map.get(ref);
- if (o != null) {
- Element fact = new Element("Factory", "");
- fact.addAttribute(new Attribute("Name", ((ComponentInstance) o).getFactory().getName()));
- service.addElement(fact);
- }
- }
- services.addElement(service);
- }
- return services;
- }
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorHandler.java
deleted file mode 100644
index b0f1bac..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/ServiceInstantiatorHandler.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * 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.composite.service.instantiator;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.felix.ipojo.CompositeHandler;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.metadata.Element;
-
-/**
- * Service Instantiator Class. This handler allows to instantiate service
- * instance inside the composition.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ServiceInstantiatorHandler extends CompositeHandler {
-
- /**
- * Is the handler valid ?
- * (Lifecycle controller)
- */
- private boolean m_isValid;
-
- /**
- * List of instances to manage.
- */
- private List/* <SvcInstance> */m_instances = new ArrayList();
-
- /**
- * Configure the handler.
- *
- * @param metadata : the metadata of the component
- * @param conf : the instance configuration
- * @throws ConfigurationException : the specification attribute is missing
- * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager,
- * org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
- */
- public void configure(Element metadata, Dictionary conf) throws ConfigurationException {
- Element[] services = metadata.getElements("service");
- for (int i = 0; i < services.length; i++) {
- String spec = services[i].getAttribute("specification");
- if (spec == null) {
- throw new ConfigurationException("Malformed service : the specification attribute is mandatory");
- }
- String filter = "(&(!(factory.name=" + getCompositeManager().getFactory().getComponentDescription().getName() + "))(factory.state=1))"; // Cannot reinstantiate yourself
- String f = services[i].getAttribute("filter");
- if (f != null) {
- filter = "(&" + filter + f + ")";
- }
- Properties prop = new Properties();
- for (int k = 0; k < services[i].getElements("property").length; k++) {
- String key = services[i].getElements("property")[k].getAttribute("name");
- String value = services[i].getElements("property")[k].getAttribute("value");
- prop.put(key, value);
- }
- String ag = services[i].getAttribute("aggregate");
- boolean agg = ag != null && ag.equalsIgnoreCase("true");
-
- String op = services[i].getAttribute("optional");
- boolean opt = op != null && op.equalsIgnoreCase("true");
-
- SvcInstance inst = new SvcInstance(this, spec, prop, agg, opt, filter);
- m_instances.add(inst);
- }
- }
-
- /**
- * Start the service instantiator handler.
- * Start all created service instance.
- * @see org.apache.felix.ipojo.CompositeHandler#start()
- */
- public void start() {
- // Init
- for (int i = 0; i < m_instances.size(); i++) {
- SvcInstance inst = (SvcInstance) m_instances.get(i);
- inst.start();
- }
-
- m_isValid = isHandlerValid();
- }
-
- /**
- * Check the handler validity.
- * @return true if all created service instances are valid
- * @see org.apache.felix.ipojo.CompositeHandler#isValid()
- */
- private boolean isHandlerValid() {
- for (int i = 0; i < m_instances.size(); i++) {
- SvcInstance inst = (SvcInstance) m_instances.get(i);
- if (!inst.isSatisfied()) {
- return false;
- }
- }
- return true;
- }
-
- /**
- * Handler stop method.
- * Stop all created service instance.
- * @see org.apache.felix.ipojo.CompositeHandler#stop()
- */
- public void stop() {
- for (int i = 0; i < m_instances.size(); i++) {
- SvcInstance inst = (SvcInstance) m_instances.get(i);
- inst.stop();
- }
- m_instances.clear();
- }
-
- /**
- * An service instance becomes valid.
- */
- public void validate() {
- if (!m_isValid) {
- if (isHandlerValid()) {
- m_isValid = true;
- }
- }
- }
-
- /**
- * A service instance becomes invalid.
- */
- public void invalidate() {
- if (m_isValid) {
- if (!isHandlerValid()) {
- m_isValid = false;
- }
- }
- }
-
- /**
- * Get the service instantiator handler description.
- * @return the description
- * @see org.apache.felix.ipojo.CompositeHandler#getDescription()
- */
- public HandlerDescription getDescription() {
- return new ServiceInstantiatorDescription(this, m_instances);
- }
-
- public List getInstances() {
- return m_instances;
- }
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
deleted file mode 100644
index a738675..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/instantiator/SvcInstance.java
+++ /dev/null
@@ -1,387 +0,0 @@
-/*
- * 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.composite.service.instantiator;
-
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-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.ServiceContext;
-import org.apache.felix.ipojo.UnacceptableConfiguration;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.util.Logger;
-import org.apache.felix.ipojo.util.Tracker;
-import org.apache.felix.ipojo.util.TrackerCustomizer;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Manage a service instantiation. This service create component instance
- * providing the required service specification.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class SvcInstance implements TrackerCustomizer {
-
- /**
- * Required specification.
- */
- private String m_specification;
-
- /**
- * Configuration to push to the instance.
- */
- private Dictionary m_configuration;
-
- /**
- * Map of factory references => instance or NO_INSTANCE.
- */
- private Map /* ServiceReference */m_usedRef = new HashMap();
-
- /**
- * Does we instantiate several provider ?
- */
- private boolean m_isAggregate = false;
-
- /**
- * Is the service optional ?
- */
- private boolean m_isOptional = false;
-
- /**
- * Handler creating the service instance.
- */
- private ServiceInstantiatorHandler m_handler;
-
- /**
- * Service Context (internal scope).
- */
- private ServiceContext m_context;
-
- /**
- * True if the service instantiation is valid.
- */
- private boolean m_isValid = false;
-
- /**
- * Tracker used to track required factory.
- */
- private Tracker m_tracker;
-
- /**
- * Constructor.
- * @param h : the handler.
- * @param spec : required specification.
- * @param conf : instance configuration.
- * @param isAgg : is the service instance an aggregate service ?
- * @param isOpt : is the service instance optional ?
- * @param filt : LDAP filter
- */
- public SvcInstance(ServiceInstantiatorHandler h, String spec, Dictionary conf, boolean isAgg, boolean isOpt, String filt) {
- m_handler = h;
- m_context = h.getCompositeManager().getServiceContext();
- m_specification = spec;
- m_configuration = conf;
- m_isAggregate = isAgg;
- m_isOptional = isOpt;
- try {
- m_tracker = new Tracker(m_context, h.getCompositeManager().getContext().createFilter(filt), this);
- } catch (InvalidSyntaxException e) {
- e.printStackTrace();
- }
- }
-
- /**
- * Start the service instance.
- * @param sc
- */
- public void start() {
- m_tracker.open();
- m_isValid = isSatisfied();
- }
-
- /**
- * Stop the service instance.
- */
- public void stop() {
- m_tracker.close();
-
- Set keys = m_usedRef.keySet();
- Iterator it = keys.iterator();
- while (it.hasNext()) {
- ServiceReference ref = (ServiceReference) it.next();
- Object o = m_usedRef.get(ref);
- if (o != null) {
- ((ComponentInstance) o).dispose();
- }
- }
- m_usedRef.clear();
- m_tracker = null;
- m_isValid = false;
- }
-
- /**
- * Check if an instance is already created.
- * @return true if at least one instance is created.
- */
- private boolean isAnInstanceCreated() {
- Set keys = m_usedRef.keySet();
- Iterator it = keys.iterator();
- while (it.hasNext()) {
- if (m_usedRef.get(it.next()) != null) {
- return true;
- }
- }
- return false;
- }
-
- /**
- * Create an instance for the given reference.
- * The instance is not added inside the map.
- * @param factory : the factory from which we need to create the instance.
- * @return the created component instance.
- */
- private ComponentInstance createInstance(Factory factory) {
- // Add an unique name if not specified.
- Properties p = new Properties();
- Enumeration kk = m_configuration.keys();
- while (kk.hasMoreElements()) {
- String k = (String) kk.nextElement();
- p.put(k, m_configuration.get(k));
- }
- ComponentInstance instance = null;
- try {
- instance = factory.createComponentInstance(p);
- } catch (UnacceptableConfiguration e) {
- e.printStackTrace();
- } catch (MissingHandlerException e) {
- e.printStackTrace();
- } catch (ConfigurationException e) {
- e.printStackTrace();
- }
- return instance;
- }
-
- /**
- * Create an instance for the next available factory.
- */
- private void createNextInstance() {
- Set keys = m_usedRef.keySet();
- Iterator it = keys.iterator();
- ServiceReference ref = (ServiceReference) it.next();
- try {
- Factory factory = (Factory) m_context.getService(ref);
-
- // Add an unique name if not specified.
- Properties p = new Properties();
- Enumeration kk = m_configuration.keys();
- while (kk.hasMoreElements()) {
- String k = (String) kk.nextElement();
- p.put(k, m_configuration.get(k));
- }
-
- ComponentInstance instance = factory.createComponentInstance(p);
- m_usedRef.put(ref, instance);
- m_context.ungetService(ref);
- } catch (UnacceptableConfiguration e) {
- m_handler.log(Logger.ERROR, "A matching factory (" + ref.getProperty("instance.name") + ") seems to refuse the given configuration : " + e.getMessage());
- } catch (MissingHandlerException e) {
- m_handler.log(Logger.ERROR, "A matching factory (" + ref.getProperty("instance.name") + ") seems to refuse the given configuration : " + e.getMessage());
- } catch (ConfigurationException e) {
- m_handler.log(Logger.ERROR, "A matching factory (" + ref.getProperty("instance.name") + ") seems to refuse the given configuration : " + e.getMessage());
- }
- }
-
-
-
- /**
- * Check if the service instance is satisfied.
- * @return true if the service instance if satisfied.
- */
- public boolean isSatisfied() {
- return m_isOptional || m_usedRef.size() > 0;
- }
-
- /**
- * Does the service instance match with the given factory ?
- * @param fact : the factory to test.
- * @return true if the factory match, false otherwise.
- */
- private boolean match(Factory fact) {
- //TODO : use the service reference instead of the factory object to avoid to get the factory.
- // Check if the factory can provide the specification
- Element[] provides = fact.getDescription().getElements("provides");
- for (int i = 0; i < provides.length; i++) {
- if (provides[i].getAttribute("specification").equals(m_specification)) {
-
- // Check that the factory needs every properties contained in
- // the configuration
- Enumeration e = m_configuration.keys();
- while (e.hasMoreElements()) {
- String k = (String) e.nextElement();
- if (!containsProperty(k, fact)) {
- return false;
- }
- }
-
- // Add an unique name if not specified.
- Properties p = new Properties();
- Enumeration keys = m_configuration.keys();
- while (keys.hasMoreElements()) {
- String k = (String) keys.nextElement();
- p.put(k, m_configuration.get(k));
- }
-
- // Check the acceptability.
- return fact.isAcceptable(p);
- }
- }
- return false;
- }
-
- /**
- * Does the factory support the given property ?
- *
- * @param name : name of the property
- * @param factory : factory to test
- * @return true if the factory support this property
- */
- private boolean containsProperty(String name, Factory factory) {
- Element[] props = factory.getDescription().getElements("property");
- for (int i = 0; i < props.length; i++) {
- if (props[i].getAttribute("name").equalsIgnoreCase(name)) {
- return true;
- }
- }
- if (name.equalsIgnoreCase("name")) {
- return true;
- } // Skip the name property
- return false;
- }
-
- /**
- * Get the required specification.
- * @return the required specification.
- */
- public String getSpecification() {
- return m_specification;
- }
-
- public boolean isAggregate() {
- return m_isAggregate;
- }
-
- public boolean isOptional() {
- return m_isOptional;
- }
-
- /**
- * Get the map of used references [reference, component instance].
- * @return the map of used references.
- */
- protected Map getUsedReferences() {
- return m_usedRef;
- }
-
- /**
- * A factory potentially matching with the managed instance appears.
- * @param reference : service reference
- * @return : true if the factory match
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
- */
- public boolean addingService(ServiceReference reference) {
- Factory fact = (Factory) m_tracker.getService(reference);
- if (match(fact)) {
- m_tracker.ungetService(reference);
- return true;
- } else {
- m_tracker.ungetService(reference);
- return false;
- }
-
- }
-
- /**
- * A matching service reference has been added in the tracker.
- * @param reference : added reference.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
- */
- public void addedService(ServiceReference reference) {
- Factory fact = (Factory) m_tracker.getService(reference);
- if (m_isAggregate) { // Create an instance for the new factory
- m_usedRef.put(reference, createInstance(fact));
- if (!m_isValid) {
- m_isValid = true;
- m_handler.validate();
- }
- } else {
- if (!isAnInstanceCreated()) {
- m_usedRef.put(reference, createInstance(fact));
- } else {
- m_usedRef.put(reference, null); // Store the reference
- }
- if (!m_isValid) {
- m_isValid = true;
- m_handler.validate();
- }
- }
- m_tracker.ungetService(reference);
- }
-
- /**
- * A used factory was modified.
- * @param reference : service reference
- * @param service : object if already get
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void modifiedService(ServiceReference reference, Object service) { }
-
- /**
- * A used factory disappears.
- * @param reference : service reference
- * @param service : object if already get
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
- */
- public void removedService(ServiceReference reference, Object service) {
- // Remove the reference is contained
- Object o = m_usedRef.remove(reference);
- if (o != null) {
- ((ComponentInstance) o).dispose();
- if (m_usedRef.size() > 0) {
- if (!m_isAggregate) {
- createNextInstance(); // Create an instance with another factory
- }
- } else { // No more candidate
- if (!m_isOptional) {
- m_isValid = false;
- m_handler.invalidate();
- }
- }
- }
- }
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedService.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedService.java
deleted file mode 100644
index 994f01e..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedService.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * 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.composite.service.provides;
-
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.felix.ipojo.ComponentFactory;
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.CompositeManager;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.MissingHandlerException;
-import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.UnacceptableConfiguration;
-import org.apache.felix.ipojo.composite.instance.InstanceHandler;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.util.Logger;
-import org.osgi.framework.BundleContext;
-
-/**
- * Composite Provided Service.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ProvidedService {
-
- /**
- * Composite Manager.
- */
- private CompositeManager m_manager;
-
- /**
- * Composition Model.
- */
- private CompositionMetadata m_composition;
-
- /**
- * generated POJO class.
- */
- private byte[] m_clazz;
-
- /**
- * Metadata of the POJO.
- */
- private Element m_metadata;
-
- /**
- * Internal context.
- */
- private ServiceContext m_scope;
-
- /**
- * External context.
- */
- private BundleContext m_context;
-
- /**
- * Created Factory.
- */
- private ComponentFactory m_factory;
-
- /**
- * Created Instance.
- */
- private ComponentInstance m_instance;
-
- /**
- * Exporter.
- */
- private ServiceExporter m_exports;
-
- /**
- * Created instance name.
- */
- private String m_instanceName;
-
- /**
- * Constructor.
- * The delegation mapping is infers in this method.
- * @param handler : the handler.
- * @param element : 'provides' element.
- * @param name : name of this provided service.
- */
- public ProvidedService(ProvidedServiceHandler handler, Element element, String name) {
- m_manager = handler.getCompositeManager();
- m_scope = m_manager.getServiceContext();
- m_context = m_manager.getContext();
- m_composition = new CompositionMetadata(m_manager.getContext(), element, handler, name);
- }
-
- /**
- * Start method.
- * Build service implementation type, factory and instance.
- * @throws CompositionException if a consistent mapping cannot be discovered.
- */
- public void start() throws CompositionException {
- m_composition.buildMapping();
-
- m_instanceName = m_composition.getSpecificationMetadata().getName() + "Provider-Gen";
- m_clazz = m_composition.buildPOJO();
- m_metadata = m_composition.buildMetadata(m_instanceName);
-
- // Create the factory
- m_factory = new ComponentFactory(m_context, m_clazz, m_metadata);
- m_factory.start();
-
- // Create the exports
- m_exports = new ServiceExporter(m_composition.getSpecificationMetadata().getName(), "(instance.name=" + m_instanceName + ")", false, false,
- m_scope, m_context, this);
- m_exports.start();
- }
-
- /**
- * Stop the provided service.
- * Kill the exporter, the instance and the factory.
- */
- public void stop() {
- if (m_exports != null) {
- m_exports.stop();
- m_exports = null;
- }
- if (m_instance != null) {
- m_instance.dispose();
- m_instance = null;
- }
- if (m_factory != null) {
- m_factory.stop();
- m_factory = null;
- }
- }
-
- protected CompositeManager getManager() {
- return m_manager;
- }
-
- /**
- * The exporter becomes valid.
- * @param exporter : the exporter
- */
- public void validating(ServiceExporter exporter) {
- }
-
- /**
- * The exporter becomes invalid.
- * @param exporter : the exporter
- */
- public void invalidating(ServiceExporter exporter) {
- }
-
- /**
- * Unregister published service.
- */
- protected void unregister() {
- if (m_instance != null) {
- m_instance.dispose();
- m_instance = null;
- }
- }
-
- /**
- * Register published service.
- */
- protected void register() {
- if (m_exports != null) {
- if (m_instance != null) { m_instance.dispose(); }
- Properties p = new Properties();
- p.put("name", m_instanceName);
- List fields = m_composition.getFieldList();
- for (int i = 0; i < fields.size(); i++) {
- FieldMetadata fm = (FieldMetadata) fields.get(i);
- if (fm.isUseful() && !fm.getSpecification().isInterface()) {
- String type = fm.getSpecification().getComponentType();
- Object o = getObjectByType(type);
- p.put(fm.getName(), o);
- }
- }
- try {
- m_instance = m_factory.createComponentInstance(p, m_manager.getServiceContext());
- } catch (UnacceptableConfiguration e) {
- e.printStackTrace();
- } catch (MissingHandlerException e) {
- e.printStackTrace();
- } catch (ConfigurationException e) {
- e.printStackTrace();
- }
- }
- }
-
- /**
- * Get an object from the given type.
- * @param type : type
- * @return an object from an instance of this type or null
- */
- private Object getObjectByType(String type) {
- InstanceHandler h = (InstanceHandler) m_manager.getCompositeHandler("org.apache.felix.ipojo.composite.instance.InstanceHandler");
- Object o = h.getObjectFromInstance(type);
- if (o == null) {
- m_manager.getFactory().getLogger().log(Logger.ERROR, "An instance object cannot be found for the type : " + type);
- }
- return o;
-
- }
-
- public String getSpecification() {
- return m_composition.getSpecificationMetadata().getName();
- }
-
- /**
- * Check the provided service state.
- * @return true if the exporter is publishing.
- */
- public boolean getState() {
- if (m_exports != null && m_exports.isPublishing()) {
- return true;
- }
- return false;
- }
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java
deleted file mode 100644
index ef86839..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandler.java
+++ /dev/null
@@ -1,370 +0,0 @@
-/*
- * 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.composite.service.provides;
-
-import java.lang.reflect.Field;
-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.CompositeHandler;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.Factory;
-import org.apache.felix.ipojo.HandlerManager;
-import org.apache.felix.ipojo.IPojoConfiguration;
-import org.apache.felix.ipojo.PolicyServiceContext;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.composite.instance.InstanceHandler;
-import org.apache.felix.ipojo.composite.service.importer.ImportHandler;
-import org.apache.felix.ipojo.composite.service.importer.ServiceImporter;
-import org.apache.felix.ipojo.composite.service.instantiator.ServiceInstantiatorHandler;
-import org.apache.felix.ipojo.composite.service.instantiator.SvcInstance;
-import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.parser.ManifestMetadataParser;
-import org.apache.felix.ipojo.parser.ParseException;
-import org.apache.felix.ipojo.util.Logger;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Composite Provided Service Handler.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ProvidedServiceHandler extends CompositeHandler {
-
- /**
- * External context.
- */
- private BundleContext m_context;
-
- /**
- * List of "available" services in the internal context.
- */
- private List m_services = new ArrayList();
-
- /**
- * List of managed services.
- */
- private List m_managedServices = new ArrayList();
-
- /**
- * Handler validity.
- * (Lifecycle controller)
- */
- private boolean m_valid = false;
-
- /**
- * List of component type.
- */
- private List m_types;
-
- /**
- * Initialize the component type.
- * @param cd : component type description to populate.
- * @param metadata : component type metadata.
- * @throws ConfigurationException : metadata are incorrect.
- * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentDescription, org.apache.felix.ipojo.metadata.Element)
- */
- public void initializeComponentFactory(ComponentDescription cd, Element metadata) throws ConfigurationException {
- Element[] provides = metadata.getElements("provides", "");
- for (int i = 0; i < provides.length; i++) {
- String spec = provides[i].getAttribute("specification");
- if (spec != null) {
- cd.addProvidedServiceSpecification(spec);
- } else {
- throw new ConfigurationException("Malformed provides : the specification attribute is mandatory");
- }
- }
- }
-
- /**
- * Configure the handler.
- * @param metadata : the metadata of the component
- * @param configuration : the instance configuration
- * @see org.apache.felix.ipojo.CompositeHandler#configure(org.apache.felix.ipojo.CompositeManager,
- * org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
- */
- public void configure(Element metadata, Dictionary configuration) {
- m_context = getCompositeManager().getContext();
-
- // Get composition metadata
- Element[] provides = metadata.getElements("provides", "");
- if (provides.length == 0) { return; }
-
- for (int i = 0; i < provides.length; i++) {
- ProvidedService ps = new ProvidedService(this, provides[i], "" + i);
- m_managedServices.add(ps);
- }
- }
-
- /**
- * Start method.
- * Start all managed provided service.
- * @see org.apache.felix.ipojo.CompositeHandler#start()
- */
- public void start() {
- // Compute imports and instances
- computeAvailableServices();
- computeAvailableTypes();
-
- for (int i = 0; i < m_managedServices.size(); i++) {
- ProvidedService ps = (ProvidedService) m_managedServices.get(i);
- try {
- checkServiceSpecification(ps);
- ps.start();
- } catch (CompositionException e) {
- log(Logger.ERROR, "Cannot start the provided service handler", e);
- if (m_valid) { m_valid = false; }
- return;
- }
- }
- m_valid = true;
- }
-
- /**
- * Stop method.
- * Stop all managed provided service.
- * @see org.apache.felix.ipojo.CompositeHandler#stop()
- */
- public void stop() {
- for (int i = 0; i < m_managedServices.size(); i++) {
- ProvidedService ps = (ProvidedService) m_managedServices.get(i);
- ps.stop();
- }
- }
-
- /**
- * Handler state changed.
- * @param state : the new instance state.
- * @see org.apache.felix.ipojo.CompositeHandler#stateChanged(int)
- */
- public void stateChanged(int state) {
- if (state == ComponentInstance.INVALID) {
- for (int i = 0; i < m_managedServices.size(); i++) {
- ProvidedService ps = (ProvidedService) m_managedServices.get(i);
- ps.unregister();
- }
- return;
- }
-
- // If the new state is VALID => register all the services
- if (state == ComponentInstance.VALID) {
- for (int i = 0; i < m_managedServices.size(); i++) {
- ProvidedService ps = (ProvidedService) m_managedServices.get(i);
- ps.register();
- }
- return;
- }
- }
-
- /**
- * Build the list of available specification.
- * @return the list of available specification.
- */
- protected List getSpecifications() {
- return m_services;
- }
-
- /**
- * Build the list of available specifications.
- */
- private void computeAvailableServices() {
- // Get instantiated services :
- ImportHandler ih = (ImportHandler) getHandler(IPojoConfiguration.IPOJO_NAMESPACE + ":requires");
- ServiceInstantiatorHandler sh = (ServiceInstantiatorHandler) getHandler(IPojoConfiguration.IPOJO_NAMESPACE + ":service");
-
- for (int i = 0; sh != null && i < sh.getInstances().size(); i++) {
- SvcInstance svc = (SvcInstance) sh.getInstances().get(i);
- String itf = svc.getSpecification();
- boolean agg = svc.isAggregate();
- boolean opt = svc.isOptional();
-
- SpecificationMetadata sm = new SpecificationMetadata(itf, m_context, agg, opt, this);
- m_services.add(sm);
- }
-
- for (int i = 0; ih != null && i < ih.getRequirements().size(); i++) {
- ServiceImporter si = (ServiceImporter) ih.getRequirements().get(i);
- String itf = si.getSpecification();
- boolean agg = si.isAggregate();
- boolean opt = si.isOptional();
-
- SpecificationMetadata sm = new SpecificationMetadata(itf, m_context, agg, opt, this);
- m_services.add(sm);
- }
- }
-
- /**
- * Check composite requirement against service specification requirement is available.
- * @param ps : the provided service to check
- * @throws CompositionException : occurs if the specification field of the service specification cannot be analyzed correctly.
- */
- private void checkServiceSpecification(ProvidedService ps) throws CompositionException {
- try {
- Class spec = m_context.getBundle().loadClass(ps.getSpecification());
- Field specField = spec.getField("specification");
- Object o = specField.get(null);
- if (o instanceof String) {
- Element specification = ManifestMetadataParser.parse((String) o);
- Element[] reqs = specification.getElements("requires");
- for (int j = 0; j < reqs.length; j++) {
- ServiceImporter imp = getAttachedRequirement(reqs[j]);
- if (imp != null) {
- // Fix service-level dependency flag
- imp.setServiceLevelDependency();
- }
- checkRequirement(imp, reqs[j]);
- }
- } else {
- log(Logger.ERROR, "[" + getCompositeManager().getInstanceName() + "] The specification field of the service specification " + ps.getSpecification() + " need to be a String");
- throw new CompositionException("Service Specification checking failed : The specification field of the service specification " + ps.getSpecification() + " need to be a String");
- }
- } catch (NoSuchFieldException e) {
- return; // No specification field
- } catch (ClassNotFoundException e) {
- log(Logger.ERROR, "[" + getCompositeManager().getInstanceName() + "] The service specification " + ps.getSpecification() + " cannot be load");
- throw new CompositionException("The service specification " + ps.getSpecification() + " cannot be load : " + e.getMessage());
- } catch (IllegalArgumentException e) {
- log(Logger.ERROR, "[" + getCompositeManager().getInstanceName() + "] The field 'specification' of the service specification " + ps.getSpecification() + " is not accessible : " + e.getMessage());
- throw new CompositionException("The field 'specification' of the service specification " + ps.getSpecification() + " is not accessible : " + e.getMessage());
- } catch (IllegalAccessException e) {
- log(Logger.ERROR, "[" + getCompositeManager().getInstanceName() + "] The field 'specification' of the service specification " + ps.getSpecification() + " is not accessible : " + e.getMessage());
- throw new CompositionException("The field 'specification' of the service specification " + ps.getSpecification() + " is not accessible : " + e.getMessage());
- } catch (ParseException e) {
- log(Logger.ERROR, "[" + getCompositeManager().getInstanceName() + "] The field 'specification' of the service specification " + ps.getSpecification() + " does not contain a valid String : " + e.getMessage());
- throw new CompositionException("The field 'specification' of the service specification " + ps.getSpecification() + " does not contain a valid String : " + e.getMessage());
- }
- }
-
- /**
- * Look for the implementation (i.e. composite) requirement for the given service-level requirement metadata.
- * @param element : the service-level requirement metadata
- * @return the ServiceImporter object, null if not found or if the DependencyHandler is not plugged to the instance
- */
- private ServiceImporter getAttachedRequirement(Element element) {
- ImportHandler ih = (ImportHandler) getHandler(IPojoConfiguration.IPOJO_NAMESPACE + ":requires");
- if (ih == null) { return null; }
-
- String id = element.getAttribute("id");
- if (id != null) {
- // Look for dependency Id
- for (int i = 0; i < ih.getRequirements().size(); i++) {
- ServiceImporter imp = (ServiceImporter) ih.getRequirements().get(i);
- if (imp.getId().equals(id)) { return imp; }
- }
- }
-
- // If not found or no id, look for a dependency with the same specification
- String requirement = element.getAttribute("specification");
- for (int i = 0; i < ih.getRequirements().size(); i++) {
- ServiceImporter imp = (ServiceImporter) ih.getRequirements().get(i);
- if (imp.getSpecification().equals(requirement)) { return imp; }
- }
- return null;
- }
-
- /**
- * Check the correctness of the composite requirement against the service level dependency.
- * @param imp : requirement to check
- * @param elem : service-level dependency metadata
- * @throws CompositionException : occurs if the requirement does not match with service-level specification requirement
- */
- private void checkRequirement(ServiceImporter imp, Element elem) throws CompositionException {
- String op = elem.getAttribute("optional");
- boolean opt = op != null && op.equalsIgnoreCase("true");
-
- String ag = elem.getAttribute("aggregate");
- boolean agg = ag != null && ag.equalsIgnoreCase("true");
-
- if (imp == null) {
- // Add the missing requirement
- ImportHandler ih = (ImportHandler) getHandler(IPojoConfiguration.IPOJO_NAMESPACE + ":requires");
- if (ih == null) {
- // Look for the import handler factory
- HandlerManager ci = null;
- try {
- ServiceReference[] refs = m_context.getServiceReferences(Factory.class.getName(), "(&(handler.name=requires)(handler.namespace=" + IPojoConfiguration.IPOJO_NAMESPACE + ")(handler.type=composite))");
- Factory factory = (Factory) m_context.getService(refs[0]);
- ci = (HandlerManager) factory.createComponentInstance(null, getCompositeManager().getServiceContext());
- } catch (Exception e) {
- e.printStackTrace(); // Should not happen
- }
- // Add the required handler
- try {
- ci.init(getCompositeManager(), new Element("composite", ""), new Properties());
- } catch (ConfigurationException e) {
- log(Logger.ERROR, "Internal error : cannot configure the Import Handler : " + e.getMessage());
- throw new CompositionException("Internal error : cannot configure the Import Handler : " + e.getMessage());
- }
- ih = (ImportHandler) ci.getHandler();
- getCompositeManager().addCompositeHandler(ci);
- }
- String spec = elem.getAttribute("specification");
- String filter = "(&(objectClass=" + spec + ")(!(instance.name=" + getCompositeManager().getInstanceName() + ")))"; // Cannot import yourself
- String f = elem.getAttribute("filter");
- if (f != null) {
- filter = "(&" + filter + f + ")";
- }
-
- ServiceImporter si = new ServiceImporter(spec, filter, agg, opt, getCompositeManager().getContext(), getCompositeManager().getServiceContext(), PolicyServiceContext.LOCAL, null, ih);
- ih.getRequirements().add(si);
- SpecificationMetadata sm = new SpecificationMetadata(spec, m_context, agg, opt, this);
- m_services.add(sm); // Update the available types
- return;
- }
-
- if (imp.isAggregate() && !agg) {
- log(Logger.ERROR, "[" + getCompositeManager().getInstanceName() + "] The requirement " + elem.getAttribute("specification") + " is aggregate in the implementation and is declared as a simple service-level requirement");
- throw new CompositionException("The requirement " + elem.getAttribute("specification") + " is aggregate in the implementation and is declared as a simple service-level requirement");
- }
-
- String filter = elem.getAttribute("filter");
- if (filter != null) {
- String filter2 = imp.getFilter();
- if (filter2 == null || !filter2.equalsIgnoreCase(filter)) {
- log(Logger.ERROR, "[" + getCompositeManager().getInstanceName() + "] The specification requirement " + elem.getAttribute("specification") + " as not the same filter as declared in the service-level requirement");
- throw new CompositionException("The specification requirement " + elem.getAttribute("specification") + " as not the same filter as declared in the service-level requirement");
- }
- }
- }
-
- public HandlerDescription getDescription() {
- return new ProvidedServiceHandlerDescription(this, m_managedServices);
- }
-
- /**
- * Build available instance types.
- */
- private void computeAvailableTypes() {
- InstanceHandler ih = (InstanceHandler) getHandler(IPojoConfiguration.IPOJO_NAMESPACE + ":instance");
- if (ih == null) {
- m_types = new ArrayList();
- } else {
- m_types = ih.getUsedType();
- }
- }
-
- public List getInstanceType() {
- return m_types;
- }
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandlerDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandlerDescription.java
deleted file mode 100644
index 19256d6..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ProvidedServiceHandlerDescription.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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.composite.service.provides;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.felix.ipojo.CompositeHandler;
-import org.apache.felix.ipojo.architecture.HandlerDescription;
-import org.apache.felix.ipojo.metadata.Attribute;
-import org.apache.felix.ipojo.metadata.Element;
-
-/**
- * Provided Service Handler Description for composite.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ProvidedServiceHandlerDescription extends HandlerDescription {
-
- /**
- * Provided Service Description list.
- */
- private List m_providedServices = new ArrayList();
-
- /**
- * Constructor.
- *
- * @param h : composite handler.
- * @param ps : The list of Provided Service.
- */
- public ProvidedServiceHandlerDescription(CompositeHandler h, List ps) {
- super(h);
- m_providedServices = ps;
- }
-
- /**
- * Get the handler description.
- * @return the provided service handler description
- * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
- */
- public Element getHandlerInfo() {
- Element services = super.getHandlerInfo();
- for (int i = 0; i < m_providedServices.size(); i++) {
- ProvidedService ps = (ProvidedService) m_providedServices.get(i);
- Element service = new Element("service", "");
- String state = "unregistered";
- if (ps.getState()) {
- state = "registered";
- }
- String spec = "[" + ps.getSpecification() + "]";
- service.addAttribute(new Attribute("Specification", spec));
- service.addAttribute(new Attribute("State", state));
- services.addElement(service);
- }
- return services;
- }
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ServiceExporter.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ServiceExporter.java
deleted file mode 100644
index 080c98d..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/service/provides/ServiceExporter.java
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * 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.composite.service.provides;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.List;
-import java.util.Properties;
-
-import org.apache.felix.ipojo.ServiceContext;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-
-/**
- * Export an service from the scope to the parent context.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ServiceExporter implements ServiceListener {
-
- /**
- * Destination context.
- */
- private BundleContext m_destination;
-
- /**
- * Origin context.
- */
- private ServiceContext m_origin;
-
- /**
- * Exported specification.
- */
- private String m_specification;
-
- /**
- * LDAP filter filtering internal provider.
- */
- private Filter m_filter;
-
- /**
- * String form of the LDAP filter.
- */
- private String m_filterStr;
-
- /**
- * Should be exported several providers.
- */
- private boolean m_aggregate = false;
-
- /**
- * Is this exports optional?
- */
- private boolean m_optional = false;
-
- /**
- * Reference on the provided service.
- */
- private ProvidedService m_ps;
-
- /**
- * Is the export valid?
- */
- private boolean m_isValid;
-
- private class Record {
- /**
- * Internal Reference.
- */
- private ServiceReference m_ref;
- /**
- * External Registration.
- */
- private ServiceRegistration m_reg;
- /**
- * Exposed object.
- */
- private Object m_svcObject;
- }
-
- /**
- * List of managed records.
- */
- private List/* <Record> */m_records = new ArrayList()/* <Record> */;
-
- /**
- * Constructor.
- *
- * @param specification : exported service specification.
- * @param filter : LDAP filter
- * @param multiple : is the export an aggregate export?
- * @param optional : is the export optional?
- * @param from : internal service context
- * @param to : external bundle context
- * @param exp : handler
- */
- public ServiceExporter(String specification, String filter, boolean multiple, boolean optional, ServiceContext from, BundleContext to, ProvidedService exp) {
- this.m_destination = to;
- this.m_origin = from;
- this.m_ps = exp;
- try {
- this.m_filter = to.createFilter(filter);
- } catch (InvalidSyntaxException e) {
- e.printStackTrace();
- return;
- }
- this.m_aggregate = multiple;
- this.m_specification = specification;
- this.m_optional = optional;
- }
-
- /**
- * Start method.
- * Start the export and the provider tracking.
- */
- public synchronized void start() {
- try {
- ServiceReference[] refs = m_origin.getServiceReferences(m_specification, null);
- if (refs != null) {
- for (int i = 0; i < refs.length; i++) {
- if (m_filter.match(refs[i])) {
- Record rec = new Record();
- rec.m_ref = refs[i];
- m_records.add(rec);
- }
- }
- }
- } catch (InvalidSyntaxException e) {
- e.printStackTrace();
- }
-
- // Publish available services
- if (m_records.size() > 0) {
- if (m_aggregate) {
- for (int i = 0; i < m_records.size(); i++) {
- Record rec = (Record) m_records.get(i);
- rec.m_svcObject = m_origin.getService(rec.m_ref);
- rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
- }
- } else {
- Record rec = (Record) m_records.get(0);
- if (rec.m_reg == null) {
- rec.m_svcObject = m_origin.getService(rec.m_ref);
- rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
- }
- }
- }
-
- // Register service listener
- try {
- m_origin.addServiceListener(this, "(" + Constants.OBJECTCLASS + "=" + m_specification + ")");
- } catch (InvalidSyntaxException e) {
- e.printStackTrace();
- }
-
- m_isValid = isSatisfied();
- }
-
- /**
- * Transform service reference property in a dictionary.
- * instance.name and factory.name are injected too.
- * @param ref : the service reference.
- * @return the dictionary containing all property of the given service reference.
- */
- private Dictionary getProps(ServiceReference ref) {
- Properties prop = new Properties();
- String[] keys = ref.getPropertyKeys();
- for (int i = 0; i < keys.length; i++) {
- prop.put(keys[i], ref.getProperty(keys[i]));
- }
-
- prop.put("instance.name", m_ps.getManager().getInstanceName());
- prop.put("factory.name", m_ps.getManager().getFactory().getName());
-
- return prop;
- }
-
- /**
- * Stop method.
- * Remove the service listener and unregister all exported service.
- */
- public synchronized void stop() {
- m_origin.removeServiceListener(this);
-
- for (int i = 0; i < m_records.size(); i++) {
- Record rec = (Record) m_records.get(i);
- rec.m_svcObject = null;
- if (rec.m_reg != null) {
- rec.m_reg.unregister();
- m_origin.ungetService(rec.m_ref);
- rec.m_ref = null;
- }
- }
-
- m_records.clear();
- }
-
- /**
- * Check exporter validity.
- * @return true if the exports is optional, or a service is really exported
- */
- public boolean isSatisfied() {
- return m_optional || m_records.size() > 0;
- }
-
- /**
- * Check if a service is published.
- * @return true if at least one service is published by this handler
- */
- public boolean isPublishing() {
- return m_records.size() > 0;
- }
-
- /**
- * Get the list of records using the given reference.
- * @param ref : the service reference
- * @return the list of records using the given reference, empty if no record used this reference
- */
- private List/* <Record> */getRecordsByRef(ServiceReference ref) {
- List l = new ArrayList();
- for (int i = 0; i < m_records.size(); i++) {
- Record rec = (Record) m_records.get(i);
- if (rec.m_ref == ref) {
- l.add(rec);
- }
- }
- return l;
- }
-
- /**
- * Service Listener Implementation.
- * @param ev : the service event
- * @see org.osgi.framework.ServiceListener#serviceChanged(org.osgi.framework.ServiceEvent)
- */
- public void serviceChanged(ServiceEvent ev) {
- if (ev.getType() == ServiceEvent.REGISTERED) {
- arrivalManagement(ev.getServiceReference());
- }
- if (ev.getType() == ServiceEvent.UNREGISTERING) {
- departureManagement(ev.getServiceReference());
- }
-
- if (ev.getType() == ServiceEvent.MODIFIED) {
- if (m_filter.match(ev.getServiceReference())) {
- // Test if the ref is always matching with the filter
- List l = getRecordsByRef(ev.getServiceReference());
- if (l.size() > 0) { // The ref is already contained => update
- // the properties
- for (int i = 0; i < l.size(); i++) { // Stop the implied
- // record
- Record rec = (Record) l.get(i);
- if (rec.m_reg != null) {
- rec.m_reg.setProperties(getProps(rec.m_ref));
- }
- }
- } else { // it is a new mathcing service => add it
- arrivalManagement(ev.getServiceReference());
- }
- } else {
- List l = getRecordsByRef(ev.getServiceReference());
- if (l.size() > 0) { // The ref is already contained => the
- // service does no more match
- departureManagement(ev.getServiceReference());
- }
- }
- }
- }
-
- /**
- * Manage the arrival of a service.
- * @param ref : the new service reference.
- */
- private void arrivalManagement(ServiceReference ref) {
- // Check if the new service match
- if (m_filter.match(ref)) {
- // Add it to the record list
- Record rec = new Record();
- rec.m_ref = ref;
- m_records.add(rec);
- // Publishing ?
- if (m_records.size() == 1 || m_aggregate) { // If the service is the
- // first one, or if it
- // is a multiple imports
- rec.m_svcObject = m_origin.getService(rec.m_ref);
- rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
- }
- // Compute the new state
- if (!m_isValid && isSatisfied()) {
- m_isValid = true;
- m_ps.validating(this);
- }
- }
- }
-
- /**
- * Manage the departure of a service.
- * @param ref : the new service reference.
- */
- private void departureManagement(ServiceReference ref) {
- List l = getRecordsByRef(ref);
- for (int i = 0; i < l.size(); i++) { // Stop the implied record
- Record rec = (Record) l.get(i);
- if (rec.m_reg != null) {
- rec.m_svcObject = null;
- rec.m_reg.unregister();
- rec.m_reg = null;
- m_origin.ungetService(rec.m_ref);
- }
- }
- m_records.removeAll(l);
-
- // Check the validity & if we need to reimport the service
- if (m_records.size() > 0) {
- // There is other available services
- if (!m_aggregate) { // Import the next one
- Record rec = (Record) m_records.get(0);
- if (rec.m_svcObject == null) { // It is the first service who
- // disappears - create the next
- // one
- rec.m_svcObject = m_origin.getService(rec.m_ref);
- rec.m_reg = m_destination.registerService(m_specification, rec.m_svcObject, getProps(rec.m_ref));
- }
- }
- } else {
- if (!m_optional) {
- m_isValid = false;
- m_ps.invalidating(this);
- }
- }
- }
-
-
- protected String getSpecification() {
- return m_specification;
- }
-
-
- public String getFilter() {
- return m_filterStr;
- }
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/ServiceReferenceImpl.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/context/ServiceReferenceImpl.java
similarity index 86%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/ServiceReferenceImpl.java
rename to ipojo/core/src/main/java/org/apache/felix/ipojo/context/ServiceReferenceImpl.java
index 1ebbcf3..7bdb382 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/ServiceReferenceImpl.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/context/ServiceReferenceImpl.java
@@ -1,112 +1,112 @@
-/*
- * 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.composite;
-
-import org.apache.felix.ipojo.ComponentInstance;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Internal service reference implementation. This class is used for in the
- * composition.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ServiceReferenceImpl implements ServiceReference {
-
- /**
- * Service Registration attached to the service reference.
- */
- private ServiceRegistrationImpl m_registration = null;
-
- /**
- * Component Instance.
- */
- private ComponentInstance m_cm;
-
- /**
- * Constructor.
- *
- * @param cm : component instance publishing the service.
- * @param sr : registration attached to this service reference.
- */
- public ServiceReferenceImpl(ComponentInstance cm, ServiceRegistrationImpl sr) {
- m_registration = sr;
- m_cm = cm;
- }
-
- /**
- * Not supported in composite.
- * @return null
- * @see org.osgi.framework.ServiceReference#getBundle()
- */
- public Bundle getBundle() {
- return m_cm.getContext().getBundle();
- }
-
- /**
- * Get the service registration for this reference.
- * @return the service registration for this service reference.
- */
- public ServiceRegistrationImpl getServiceRegistration() {
- return m_registration;
- }
-
-
- /**
- * Get a property value.
- * @param s : the key of the required property.
- * @return the property value or null if no property for the given key.
- * @see org.osgi.framework.ServiceReference#getProperty(java.lang.String)
- */
- public Object getProperty(String s) {
- return m_registration.getProperty(s);
- }
-
- /**
- * Get the String arrays of service property keys.
- * @return : the list of property keys.
- * @see org.osgi.framework.ServiceReference#getPropertyKeys()
- */
- public String[] getPropertyKeys() {
- return m_registration.getPropertyKeys();
- }
-
-
- /**
- * Unsupported Operation inside composite.
- * @return bundles using this reference.
- * @see org.osgi.framework.ServiceReference#getUsingBundles()
- */
- public Bundle[] getUsingBundles() {
- throw new UnsupportedOperationException("getUsingBundles is not supported in scope");
- }
-
- /**
- * Check if the current service reference is assignable to the given bundle.
- * @param arg0 : the bundle to check
- * @param arg1 : the class name to check.
- * @return true in the case of composite
- * @see org.osgi.framework.ServiceReference#isAssignableTo(org.osgi.framework.Bundle, java.lang.String)
- */
- public boolean isAssignableTo(Bundle arg0, String arg1) {
- return true;
- }
-
-}
+/*
+ * 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.context;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Internal service reference implementation. This class is used for in the
+ * composition.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ServiceReferenceImpl implements ServiceReference {
+
+ /**
+ * Service Registration attached to the service reference.
+ */
+ private ServiceRegistrationImpl m_registration = null;
+
+ /**
+ * Component Instance.
+ */
+ private ComponentInstance m_cm;
+
+ /**
+ * Constructor.
+ *
+ * @param instance : component instance publishing the service.
+ * @param ref : registration attached to this service reference.
+ */
+ public ServiceReferenceImpl(ComponentInstance instance, ServiceRegistrationImpl ref) {
+ m_registration = ref;
+ m_cm = instance;
+ }
+
+ /**
+ * Not supported in composite.
+ * @return null
+ * @see org.osgi.framework.ServiceReference#getBundle()
+ */
+ public Bundle getBundle() {
+ return m_cm.getContext().getBundle();
+ }
+
+ /**
+ * Get the service registration for this reference.
+ * @return the service registration for this service reference.
+ */
+ public ServiceRegistrationImpl getServiceRegistration() {
+ return m_registration;
+ }
+
+
+ /**
+ * Get a property value.
+ * @param name : the key of the required property.
+ * @return the property value or null if no property for the given key.
+ * @see org.osgi.framework.ServiceReference#getProperty(java.lang.String)
+ */
+ public Object getProperty(String name) {
+ return m_registration.getProperty(name);
+ }
+
+ /**
+ * Get the String arrays of service property keys.
+ * @return : the list of property keys.
+ * @see org.osgi.framework.ServiceReference#getPropertyKeys()
+ */
+ public String[] getPropertyKeys() {
+ return m_registration.getPropertyKeys();
+ }
+
+
+ /**
+ * Unsupported Operation inside composite.
+ * @return bundles using this reference.
+ * @see org.osgi.framework.ServiceReference#getUsingBundles()
+ */
+ public Bundle[] getUsingBundles() {
+ throw new UnsupportedOperationException("getUsingBundles is not supported in scope");
+ }
+
+ /**
+ * Check if the current service reference is assignable to the given bundle.
+ * @param arg0 : the bundle to check
+ * @param arg1 : the class name to check.
+ * @return true in the case of composite
+ * @see org.osgi.framework.ServiceReference#isAssignableTo(org.osgi.framework.Bundle, java.lang.String)
+ */
+ public boolean isAssignableTo(Bundle arg0, String arg1) {
+ return true;
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistrationImpl.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/context/ServiceRegistrationImpl.java
similarity index 87%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistrationImpl.java
rename to ipojo/core/src/main/java/org/apache/felix/ipojo/context/ServiceRegistrationImpl.java
index 6818899..9cd8edf 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistrationImpl.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/context/ServiceRegistrationImpl.java
@@ -1,257 +1,257 @@
-/*
- * 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.composite;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.InstanceManager;
-import org.osgi.framework.Constants;
-import org.osgi.framework.ServiceFactory;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-
-/**
- * Internal service registration implementation. This class is used for in the
- * composition.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ServiceRegistrationImpl implements ServiceRegistration {
-
- /**
- * Service Registry.
- */
- private ServiceRegistry m_registry = null;
-
- /**
- * Interfaces associated with the service object.
- */
- private String[] m_classes = null;
-
- /**
- * Service Id associated with the service object.
- */
- private Long m_serviceId = null;
-
- /**
- * Service object.
- */
- private Object m_svcObj = null;
-
- /**
- * Service factory interface.
- */
- private ServiceFactory m_factory = null;
-
- /**
- * Associated property dictionary.
- */
- private Map m_propMap = null;
-
- /**
- * Re-usable service reference.
- */
- private ServiceReferenceImpl m_ref = null;
-
- /**
- * Property Keys List.
- */
- private List m_list = new ArrayList();
-
- /**
- * Constructor.
- *
- * @param registry : the service registry
- * @param cm : component instance
- * @param classes : published interfaces array
- * @param serviceId : the unique service id
- * @param svcObj : the service object or the service factory object
- * @param dict : service properties
- */
- public ServiceRegistrationImpl(ServiceRegistry registry, ComponentInstance cm, String[] classes, Long serviceId, Object svcObj, Dictionary dict) {
- m_registry = registry;
- m_classes = classes;
- m_serviceId = serviceId;
- m_svcObj = svcObj;
- if (m_svcObj instanceof ServiceFactory) { m_factory = (ServiceFactory) m_svcObj; }
- initializeProperties(dict);
-
- // This reference is the "standard" reference for this service and will
- // always be returned by getReference().
- // Since all reference to this service are supposed to be equal, we use
- // the hash code of this reference for
- // a references to this service in ServiceReference.
- m_ref = new ServiceReferenceImpl(cm, this);
- }
-
- /**
- * Check if the service registration still valid.
- * @return true if the service registration is valid.
- */
- protected boolean isValid() {
- return m_svcObj != null;
- }
-
- /**
- * Get the service reference attached with this service registration.
- * @return the service reference
- * @see org.osgi.framework.ServiceRegistration#getReference()
- */
- public ServiceReference getReference() {
- return m_ref;
- }
-
- /**
- * Add properties to a service registration.
- * @param dict : the properties to add
- * @see org.osgi.framework.ServiceRegistration#setProperties(java.util.Dictionary)
- */
- public void setProperties(Dictionary dict) {
- // Make sure registration is valid.
- if (!isValid()) {
- throw new IllegalStateException("The service registration is no longer valid.");
- }
- // Set the properties.
- initializeProperties(dict);
- // Tell registry about it.
- m_registry.servicePropertiesModified(this);
- }
-
- /**
- * Unregister the service.
- * @see org.osgi.framework.ServiceRegistration#unregister()
- */
- public void unregister() {
- if (m_svcObj != null) {
- m_registry.unregisterService(this);
- m_svcObj = null;
- m_factory = null;
- } else {
- throw new IllegalStateException("Service already unregistered.");
- }
- }
-
- /**
- * Look for a property in the service properties.
- *
- * @param key : property key
- * @return the object associated with the key or null if the key is not
- * present.
- */
- protected Object getProperty(String key) {
- return m_propMap.get(key);
- }
-
- /**
- * Get the property keys.
- * @return the property keys list.
- */
- protected String[] getPropertyKeys() {
- synchronized (m_propMap) {
- m_list.clear();
- Iterator i = m_propMap.entrySet().iterator();
- while (i.hasNext()) {
- Map.Entry entry = (Map.Entry) i.next();
- m_list.add(entry.getKey());
- }
- return (String[]) m_list.toArray(new String[m_list.size()]);
- }
- }
-
- /**
- * Get the service object.
- * @return the service object. Call the service factory if needed.
- */
- protected Object getService() {
- // If the service object is a service factory, then
- // let it create the service object.
- if (m_factory != null) {
- return getFactoryUnchecked();
- } else {
- return m_svcObj;
- }
- }
-
- /**
- * Initialize properties.
- *
- * @param dict : service properties to publish.
- */
- private void initializeProperties(Dictionary dict) {
- // Create a case insensitive map.
- if (m_propMap == null) {
- m_propMap = new StringMap(false);
- } else {
- m_propMap.clear();
- }
-
- if (dict != null) {
- Enumeration keys = dict.keys();
- while (keys.hasMoreElements()) {
- Object key = keys.nextElement();
- m_propMap.put(key, dict.get(key));
- }
- }
- // Add the framework assigned properties.
- m_propMap.put(Constants.OBJECTCLASS, m_classes);
- m_propMap.put(Constants.SERVICE_ID, m_serviceId);
- }
-
- /**
- * Get a service object via a service factory.
- * @return the service object via the service factory invocation.
- */
- private Object getFactoryUnchecked() {
- return m_factory.getService(null, this);
- }
-
- /**
- * Unget a service. (Internal Method)
- *
- * @param cm : component instance using the service.
- * @param svcObj : the unget service object.
- */
- private void ungetFactoryUnchecked(ComponentInstance cm, Object svcObj) {
- if (cm instanceof InstanceManager) {
- m_factory.ungetService(((InstanceManager) cm).getContext().getBundle(), this, svcObj);
- }
-
- }
-
- /**
- * Unget a service.
- *
- * @param cm : component instance using the service.
- * @param srvObj : the unget service object.
- */
- public void ungetService(ComponentInstance cm, Object srvObj) {
- // If the service object is a service factory, then let is release the
- // service object.
- if (m_factory != null) {
- ungetFactoryUnchecked(cm, srvObj);
- }
- }
-
-}
+/*
+ * 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.context;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.InstanceManager;
+import org.osgi.framework.Constants;
+import org.osgi.framework.ServiceFactory;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * Internal service registration implementation. This class is used for in the
+ * composition.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ServiceRegistrationImpl implements ServiceRegistration {
+
+ /**
+ * Service Registry.
+ */
+ private ServiceRegistry m_registry = null;
+
+ /**
+ * Interfaces associated with the service object.
+ */
+ private String[] m_classes = null;
+
+ /**
+ * Service Id associated with the service object.
+ */
+ private Long m_serviceId = null;
+
+ /**
+ * Service object.
+ */
+ private Object m_svcObj = null;
+
+ /**
+ * Service factory interface.
+ */
+ private ServiceFactory m_factory = null;
+
+ /**
+ * Associated property dictionary.
+ */
+ private Map m_propMap = null;
+
+ /**
+ * Re-usable service reference.
+ */
+ private ServiceReferenceImpl m_ref = null;
+
+ /**
+ * Property Keys List.
+ */
+ private List m_list = new ArrayList();
+
+ /**
+ * Constructor.
+ *
+ * @param registry : the service registry
+ * @param instance : component instance
+ * @param classes : published interfaces array
+ * @param serviceId : the unique service id
+ * @param svcObj : the service object or the service factory object
+ * @param dict : service properties
+ */
+ public ServiceRegistrationImpl(ServiceRegistry registry, ComponentInstance instance, String[] classes, Long serviceId, Object svcObj, Dictionary dict) {
+ m_registry = registry;
+ m_classes = classes;
+ m_serviceId = serviceId;
+ m_svcObj = svcObj;
+ if (m_svcObj instanceof ServiceFactory) { m_factory = (ServiceFactory) m_svcObj; }
+ initializeProperties(dict);
+
+ // This reference is the "standard" reference for this service and will
+ // always be returned by getReference().
+ // Since all reference to this service are supposed to be equal, we use
+ // the hash code of this reference for
+ // a references to this service in ServiceReference.
+ m_ref = new ServiceReferenceImpl(instance, this);
+ }
+
+ /**
+ * Check if the service registration still valid.
+ * @return true if the service registration is valid.
+ */
+ protected boolean isValid() {
+ return m_svcObj != null;
+ }
+
+ /**
+ * Get the service reference attached with this service registration.
+ * @return the service reference
+ * @see org.osgi.framework.ServiceRegistration#getReference()
+ */
+ public ServiceReference getReference() {
+ return m_ref;
+ }
+
+ /**
+ * Add properties to a service registration.
+ * @param dict : the properties to add
+ * @see org.osgi.framework.ServiceRegistration#setProperties(java.util.Dictionary)
+ */
+ public void setProperties(Dictionary dict) {
+ // Make sure registration is valid.
+ if (!isValid()) {
+ throw new IllegalStateException("The service registration is no longer valid.");
+ }
+ // Set the properties.
+ initializeProperties(dict);
+ // Tell registry about it.
+ m_registry.servicePropertiesModified(this);
+ }
+
+ /**
+ * Unregister the service.
+ * @see org.osgi.framework.ServiceRegistration#unregister()
+ */
+ public void unregister() {
+ if (m_svcObj == null) {
+ throw new IllegalStateException("Service already unregistered.");
+ } else {
+ m_registry.unregisterService(this);
+ m_svcObj = null;
+ m_factory = null;
+ }
+ }
+
+ /**
+ * Look for a property in the service properties.
+ *
+ * @param key : property key
+ * @return the object associated with the key or null if the key is not
+ * present.
+ */
+ protected Object getProperty(String key) {
+ return m_propMap.get(key);
+ }
+
+ /**
+ * Get the property keys.
+ * @return the property keys list.
+ */
+ protected String[] getPropertyKeys() {
+ synchronized (m_propMap) {
+ m_list.clear();
+ Iterator iterator = m_propMap.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Map.Entry entry = (Map.Entry) iterator.next();
+ m_list.add(entry.getKey());
+ }
+ return (String[]) m_list.toArray(new String[m_list.size()]);
+ }
+ }
+
+ /**
+ * Get the service object.
+ * @return the service object. Call the service factory if needed.
+ */
+ protected Object getService() {
+ // If the service object is a service factory, then
+ // let it create the service object.
+ if (m_factory == null) {
+ return m_svcObj;
+ } else {
+ return getFactoryUnchecked();
+ }
+ }
+
+ /**
+ * Initialize properties.
+ *
+ * @param dict : service properties to publish.
+ */
+ private void initializeProperties(Dictionary dict) {
+ // Create a case insensitive map.
+ if (m_propMap == null) {
+ m_propMap = new StringMap(false);
+ } else {
+ m_propMap.clear();
+ }
+
+ if (dict != null) {
+ Enumeration keys = dict.keys();
+ while (keys.hasMoreElements()) {
+ Object key = keys.nextElement();
+ m_propMap.put(key, dict.get(key));
+ }
+ }
+ // Add the framework assigned properties.
+ m_propMap.put(Constants.OBJECTCLASS, m_classes);
+ m_propMap.put(Constants.SERVICE_ID, m_serviceId);
+ }
+
+ /**
+ * Get a service object via a service factory.
+ * @return the service object via the service factory invocation.
+ */
+ private Object getFactoryUnchecked() {
+ return m_factory.getService(null, this);
+ }
+
+ /**
+ * Unget a service. (Internal Method)
+ *
+ * @param instance : component instance using the service.
+ * @param svcObj : the unget service object.
+ */
+ private void ungetFactoryUnchecked(ComponentInstance instance, Object svcObj) {
+ if (instance instanceof InstanceManager) {
+ m_factory.ungetService(((InstanceManager) instance).getContext().getBundle(), this, svcObj);
+ }
+
+ }
+
+ /**
+ * Unget a service.
+ *
+ * @param instance : component instance using the service.
+ * @param srvObj : the unget service object.
+ */
+ public void ungetService(ComponentInstance instance, Object srvObj) {
+ // If the service object is a service factory, then let is release the
+ // service object.
+ if (m_factory != null) {
+ ungetFactoryUnchecked(instance, srvObj);
+ }
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistry.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/context/ServiceRegistry.java
similarity index 82%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistry.java
rename to ipojo/core/src/main/java/org/apache/felix/ipojo/context/ServiceRegistry.java
index c14c5e4..6eb3d7e 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/ServiceRegistry.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/context/ServiceRegistry.java
@@ -1,336 +1,344 @@
-/*
- * 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.composite;
-
-import java.util.ArrayList;
-import java.util.Dictionary;
-import java.util.List;
-
-import org.apache.felix.ipojo.ComponentInstance;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.Constants;
-import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
-import org.osgi.framework.ServiceEvent;
-import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceReference;
-import org.osgi.framework.ServiceRegistration;
-
-/**
- * Internal Service Registry. This class is used for in the composition.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ServiceRegistry {
-
- /**
- * Service Id index.
- */
- private long m_serviceId = 1L;
-
- /**
- * List of service listeners.
- */
- private List m_listeners = new ArrayList(); // ListenerInfo List
-
- /**
- * List of service registration.
- */
- private List m_regs = new ArrayList();
-
- /**
- * A "real" bundle context to create LDAP filter.
- */
- private BundleContext m_bc; // BundleContext to create Filter
-
- /**
- * Listener info structure.
- */
- private class ListenerInfo {
- /**
- * Listener object.
- */
- private ServiceListener m_listener;
- /**
- * Filter associated with the filter.
- */
- private Filter m_filter;
- }
-
- /**
- * Constructor.
- *
- * @param bc : bundle context.
- */
- public ServiceRegistry(BundleContext bc) {
- m_bc = bc;
- }
-
- /**
- * Add a given service listener with no filter.
- *
- * @param arg0 : the service listener to add
- */
- public void addServiceListener(ServiceListener arg0) {
- ListenerInfo li = new ListenerInfo();
- li.m_listener = arg0;
- li.m_filter = null;
- m_listeners.add(li);
- }
-
- /**
- * Unget a service.
- *
- * @param cm : instance releasing the service.
- * @param ref : released reference.
- * @return true if the unget success
- */
- public boolean ungetService(ComponentInstance cm, ServiceReference ref) {
-
- ServiceRegistrationImpl reg = ((ServiceReferenceImpl) ref).getServiceRegistration();
- if (reg.isValid()) {
- reg.ungetService(cm, reg.getService());
- return true;
- } else {
- return false;
- }
- }
-
- /**
- * Unregister a service listener.
- *
- * @param arg0 : the service listener to remove
- */
- public void removeServiceListener(ServiceListener arg0) {
- m_listeners.remove(arg0);
- }
-
- /**
- * Register a service.
- *
- * @param cm : provider instance.
- * @param clazz : provided interface.
- * @param svcObj : service object of service factory object.
- * @param dict : service properties.
- * @return the created service registration.
- */
- public ServiceRegistration registerService(ComponentInstance cm, String clazz, Object svcObj, Dictionary dict) {
- synchronized (m_regs) {
- ServiceRegistrationImpl reg = new ServiceRegistrationImpl(this, cm, new String[] { clazz }, new Long(m_serviceId++), svcObj, dict);
- m_regs.add(reg);
- fireServiceChanged(new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()));
- return reg;
- }
- }
-
- /**
- * Register a service.
- *
- * @param cm : provider instance.
- * @param clazzes : provided interfaces.
- * @param svcObj : service object of service factory object.
- * @param dict : service properties.
- * @return the created service registration.
- */
- public ServiceRegistration registerService(ComponentInstance cm, String[] clazzes, Object svcObj, Dictionary dict) {
- synchronized (m_regs) {
- ServiceRegistrationImpl reg = new ServiceRegistrationImpl(this, cm, clazzes, new Long(m_serviceId++), svcObj, dict);
- m_regs.add(reg);
- fireServiceChanged(new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()));
- return reg;
- }
- }
-
- /**
- * Dispatch a service event.
- * @param event : the service to dispatch
- */
- private void fireServiceChanged(ServiceEvent event) {
- synchronized (m_listeners) {
- // Iterate on the service listener list to notify service listener
- for (int i = 0; i < m_listeners.size(); i++) {
- ListenerInfo li = (ListenerInfo) m_listeners.get(i);
- ServiceReference sr = event.getServiceReference();
- if (li.m_filter == null) {
- li.m_listener.serviceChanged(event);
- }
- if (li.m_filter != null && li.m_filter.match(sr)) {
- li.m_listener.serviceChanged(event);
- }
- }
- }
- }
-
- /**
- * Get available (and accessible) service references.
- *
- * @param className : required interface
- * @param expr : LDAP filter
- * @return : the list of available service references.
- * @throws InvalidSyntaxException
- * occurs when the LDAP filter is malformed.
- */
- public ServiceReference[] getServiceReferences(String className, String expr) throws InvalidSyntaxException {
- synchronized (m_regs) {
- // Define filter if expression is not null.
- Filter filter = null;
- if (expr != null) {
- filter = m_bc.createFilter(expr);
- }
-
- List refs = new ArrayList();
-
- for (int i = 0; i < m_regs.size(); i++) {
- ServiceRegistrationImpl reg = (ServiceRegistrationImpl) m_regs.get(i);
- // Determine if the registered services matches the search
- // criteria.
- boolean matched = false;
-
- // If className is null, then look at filter only.
- if ((className == null) && ((filter == null) || filter.match(reg.getReference()))) {
- matched = true;
- } else if (className != null) {
- // If className is not null, then first match the
- // objectClass property before looking at the
- // filter.
- String[] objectClass = (String[]) ((ServiceRegistrationImpl) reg).getProperty(Constants.OBJECTCLASS);
- for (int classIdx = 0; classIdx < objectClass.length; classIdx++) {
- if (objectClass[classIdx].equals(className) && ((filter == null) || filter.match(reg.getReference()))) {
- matched = true;
- break;
- }
- }
- }
-
- // Add reference if it was a match.
- if (matched) {
- refs.add(reg.getReference());
- }
- }
-
- if (refs.size() > 0) {
- return (ServiceReference[]) refs.toArray(new ServiceReference[refs.size()]);
- }
- return null;
- }
- }
-
- /**
- * Look for a service reference.
- *
- * @param clazz : required interface.
- * @return the first available provider or null if none available.
- */
- public ServiceReference getServiceReference(String clazz) {
- synchronized (m_regs) {
- try {
- ServiceReference[] refs = getServiceReferences(clazz, null);
- if (refs != null) {
- return refs[0];
- } // If the refs != null we are sure that it exists one reference or more.
- } catch (InvalidSyntaxException ex) {
- System.err.println("Scope Service Registry : Problem when looking for service reference" + ex.getMessage());
- }
- return null;
- }
- }
-
- /**
- * Get a service object.
- * @param cm : component instance requiring the service.
- * @param ref : the required reference.
- * @return the service object.
- */
- public Object getService(ComponentInstance cm, ServiceReference ref) {
- synchronized (m_regs) {
- // Look for the service registration for this ref
- ServiceRegistrationImpl reg = ((ServiceReferenceImpl) ref).getServiceRegistration();
- if (reg.isValid()) {
- // Delegate the service providing to the service registration
- return reg.getService();
- } else {
- return null;
- }
- }
- }
-
- /**
- * Get all service references consistent with the given interface and
- * filter.
- * @param clazz : the required interface.
- * @param filter : the LDAP filter.
- * @return the list of all service reference or null if none available.
- * @throws InvalidSyntaxException occurs when the LDAP filter is malformed.
- */
- public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
- synchronized (m_regs) {
- // Can delegate on getServiceReference, indeed their is no test on
- // the "modularity" conflict.
- return getServiceReferences(clazz, filter);
- }
- }
-
- /**
- * Add a service listener with a filter.
- * @param listener : the service listener to add
- * @param filter : LDAP filter
- */
- public void addServiceListener(ServiceListener listener, String filter) {
- // If the filter is null, subscribe with no filter.
- if (filter == null) {
- addServiceListener(listener);
- return;
- }
-
- ListenerInfo li = new ListenerInfo();
- li.m_listener = listener;
- try {
- li.m_filter = m_bc.createFilter(filter);
- } catch (InvalidSyntaxException ex) {
- System.err.println("Scope Service Registry : Problem when creating a service listener " + ex.getMessage());
- }
- m_listeners.add(li);
- }
-
- /**
- * Dispatch a service properties modified event.
- * @param reg : the implicated service registration.
- */
- public void servicePropertiesModified(ServiceRegistrationImpl reg) {
- fireServiceChanged(new ServiceEvent(ServiceEvent.MODIFIED, reg.getReference()));
- }
-
- /**
- * Unregister a service.
- * @param reg : the service registration to unregister
- */
- public void unregisterService(ServiceRegistrationImpl reg) {
- m_regs.remove(reg);
- fireServiceChanged(new ServiceEvent(ServiceEvent.UNREGISTERING, reg.getReference()));
- }
-
- /**
- * Reset the service registry.
- */
- protected void reset() {
- m_serviceId = 1L;
- m_listeners = new ArrayList();
- m_regs = new ArrayList();
- }
-}
+/*
+ * 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.context;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.util.Logger;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+/**
+ * Internal Service Registry. This class is used for in the composition.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ServiceRegistry {
+
+ /**
+ * Service Id index.
+ */
+ private long m_serviceId = 1L;
+
+ /**
+ * List of service listeners.
+ */
+ private List m_listeners = new ArrayList(); // ListenerInfo List
+
+ /**
+ * List of service registration.
+ */
+ private List m_regs = new ArrayList();
+
+ /**
+ * A "real" bundle context to create LDAP filter.
+ */
+ private BundleContext m_context; // BundleContext to create Filter
+
+ /**
+ * Registry logger.
+ */
+ private Logger m_logger;
+
+ /**
+ * Listener info structure.
+ */
+ private class ListenerInfo {
+ /**
+ * Listener object.
+ */
+ private ServiceListener m_listener;
+ /**
+ * Filter associated with the filter.
+ */
+ private Filter m_filter;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param context : bundle context.
+ */
+ public ServiceRegistry(BundleContext context) {
+ m_context = context;
+ m_logger = new Logger(m_context, "Registry logger " + m_context.getBundle().getBundleId());
+ }
+
+ /**
+ * Add a given service listener with no filter.
+ *
+ * @param arg0 : the service listener to add
+ */
+ public void addServiceListener(ServiceListener arg0) {
+ ListenerInfo info = new ListenerInfo();
+ info.m_listener = arg0;
+ info.m_filter = null;
+ m_listeners.add(info);
+ }
+
+ /**
+ * Unget a service.
+ *
+ * @param instance : instance releasing the service.
+ * @param ref : released reference.
+ * @return true if the unget success
+ */
+ public boolean ungetService(ComponentInstance instance, ServiceReference ref) {
+
+ ServiceRegistrationImpl reg = ((ServiceReferenceImpl) ref).getServiceRegistration();
+ if (reg.isValid()) {
+ reg.ungetService(instance, reg.getService());
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * Unregister a service listener.
+ *
+ * @param arg0 : the service listener to remove
+ */
+ public void removeServiceListener(ServiceListener arg0) {
+ m_listeners.remove(arg0);
+ }
+
+ /**
+ * Register a service.
+ *
+ * @param instance : provider instance.
+ * @param clazz : provided interface.
+ * @param svcObj : service object of service factory object.
+ * @param dict : service properties.
+ * @return the created service registration.
+ */
+ public ServiceRegistration registerService(ComponentInstance instance, String clazz, Object svcObj, Dictionary dict) {
+ synchronized (m_regs) {
+ ServiceRegistrationImpl reg = new ServiceRegistrationImpl(this, instance, new String[] { clazz }, new Long(m_serviceId++), svcObj, dict);
+ m_regs.add(reg);
+ fireServiceChanged(new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()));
+ return reg;
+ }
+ }
+
+ /**
+ * Register a service.
+ *
+ * @param instance : provider instance.
+ * @param clazzes : provided interfaces.
+ * @param svcObj : service object of service factory object.
+ * @param dict : service properties.
+ * @return the created service registration.
+ */
+ public ServiceRegistration registerService(ComponentInstance instance, String[] clazzes, Object svcObj, Dictionary dict) {
+ synchronized (m_regs) {
+ ServiceRegistrationImpl reg = new ServiceRegistrationImpl(this, instance, clazzes, new Long(m_serviceId++), svcObj, dict);
+ m_regs.add(reg);
+ fireServiceChanged(new ServiceEvent(ServiceEvent.REGISTERED, reg.getReference()));
+ return reg;
+ }
+ }
+
+ /**
+ * Dispatch a service event.
+ * @param event : the service to dispatch
+ */
+ private void fireServiceChanged(ServiceEvent event) {
+ synchronized (m_listeners) {
+ // Iterate on the service listener list to notify service listener
+ for (int i = 0; i < m_listeners.size(); i++) {
+ ListenerInfo info = (ListenerInfo) m_listeners.get(i);
+ ServiceReference ref = event.getServiceReference();
+ if (info.m_filter == null) {
+ info.m_listener.serviceChanged(event);
+ }
+ if (info.m_filter != null && info.m_filter.match(ref)) {
+ info.m_listener.serviceChanged(event);
+ }
+ }
+ }
+ }
+
+ /**
+ * Get available (and accessible) service references.
+ *
+ * @param className : required interface
+ * @param expr : LDAP filter
+ * @return : the list of available service references.
+ * @throws InvalidSyntaxException
+ * occurs when the LDAP filter is malformed.
+ */
+ public ServiceReference[] getServiceReferences(String className, String expr) throws InvalidSyntaxException {
+ synchronized (m_regs) {
+ // Define filter if expression is not null.
+ Filter filter = null;
+ if (expr != null) {
+ filter = m_context.createFilter(expr);
+ }
+
+ List refs = new ArrayList();
+
+ for (int i = 0; i < m_regs.size(); i++) {
+ ServiceRegistrationImpl reg = (ServiceRegistrationImpl) m_regs.get(i);
+ // Determine if the registered services matches the search
+ // criteria.
+ boolean matched = false;
+
+ // If className is null, then look at filter only.
+ if ((className == null) && ((filter == null) || filter.match(reg.getReference()))) {
+ matched = true;
+ } else if (className != null) {
+ // If className is not null, then first match the
+ // objectClass property before looking at the
+ // filter.
+ String[] objectClass = (String[]) ((ServiceRegistrationImpl) reg).getProperty(Constants.OBJECTCLASS);
+ for (int classIdx = 0; classIdx < objectClass.length; classIdx++) {
+ if (objectClass[classIdx].equals(className) && ((filter == null) || filter.match(reg.getReference()))) {
+ matched = true;
+ break;
+ }
+ }
+ }
+
+ // Add reference if it was a match.
+ if (matched) {
+ refs.add(reg.getReference());
+ }
+ }
+
+ if (! refs.isEmpty()) {
+ return (ServiceReference[]) refs.toArray(new ServiceReference[refs.size()]);
+ }
+ return null;
+ }
+ }
+
+ /**
+ * Look for a service reference.
+ *
+ * @param clazz : required interface.
+ * @return the first available provider or null if none available.
+ */
+ public ServiceReference getServiceReference(String clazz) {
+ synchronized (m_regs) {
+ try {
+ ServiceReference[] refs = getServiceReferences(clazz, null);
+ if (refs != null) {
+ return refs[0];
+ } // If the refs != null we are sure that it exists one reference or more.
+ } catch (InvalidSyntaxException ex) {
+ // Cannot happen : null filter.
+ }
+ return null;
+ }
+ }
+
+ /**
+ * Get a service object.
+ * @param instance : component instance requiring the service.
+ * @param ref : the required reference.
+ * @return the service object.
+ */
+ public Object getService(ComponentInstance instance, ServiceReference ref) {
+ synchronized (m_regs) {
+ // Look for the service registration for this ref
+ ServiceRegistrationImpl reg = ((ServiceReferenceImpl) ref).getServiceRegistration();
+ if (reg.isValid()) {
+ // Delegate the service providing to the service registration
+ return reg.getService();
+ } else {
+ return null;
+ }
+ }
+ }
+
+ /**
+ * Get all service references consistent with the given interface and
+ * filter.
+ * @param clazz : the required interface.
+ * @param filter : the LDAP filter.
+ * @return the list of all service reference or null if none available.
+ * @throws InvalidSyntaxException occurs when the LDAP filter is malformed.
+ */
+ public ServiceReference[] getAllServiceReferences(String clazz, String filter) throws InvalidSyntaxException {
+ synchronized (m_regs) {
+ // Can delegate on getServiceReference, indeed their is no test on
+ // the "modularity" conflict.
+ return getServiceReferences(clazz, filter);
+ }
+ }
+
+ /**
+ * Add a service listener with a filter.
+ * @param listener : the service listener to add
+ * @param filter : LDAP filter
+ */
+ public void addServiceListener(ServiceListener listener, String filter) {
+ // If the filter is null, subscribe with no filter.
+ if (filter == null) {
+ addServiceListener(listener);
+ return;
+ }
+
+ try {
+ ListenerInfo info = new ListenerInfo();
+ info.m_listener = listener;
+ info.m_filter = m_context.createFilter(filter);
+ m_listeners.add(info);
+ } catch (InvalidSyntaxException ex) {
+ m_logger.log(Logger.ERROR, ex.getMessage(), ex);
+ }
+
+ }
+
+ /**
+ * Dispatch a service properties modified event.
+ * @param reg : the implicated service registration.
+ */
+ public void servicePropertiesModified(ServiceRegistrationImpl reg) {
+ fireServiceChanged(new ServiceEvent(ServiceEvent.MODIFIED, reg.getReference()));
+ }
+
+ /**
+ * Unregister a service.
+ * @param reg : the service registration to unregister
+ */
+ public void unregisterService(ServiceRegistrationImpl reg) {
+ m_regs.remove(reg);
+ fireServiceChanged(new ServiceEvent(ServiceEvent.UNREGISTERING, reg.getReference()));
+ }
+
+ /**
+ * Reset the service registry.
+ */
+ public void reset() {
+ m_serviceId = 1L;
+ m_listeners = new ArrayList();
+ m_regs = new ArrayList();
+ }
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/StringMap.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/context/StringMap.java
similarity index 80%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/composite/StringMap.java
rename to ipojo/core/src/main/java/org/apache/felix/ipojo/context/StringMap.java
index bd057aa..31f7331 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/composite/StringMap.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/context/StringMap.java
@@ -1,142 +1,142 @@
-/*
- * 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.composite;
-
-import java.util.Comparator;
-import java.util.Map;
-import java.util.TreeMap;
-
-/**
- * Simple utility class that creates a map for string-based keys by extending
- * <tt>TreeMap</tt>. This map can be set to use case-sensitive or
- * case-insensitive comparison when searching for the key. Any keys put into
- * this map will be converted to a <tt>String</tt> using the
- * <tt>toString()</tt> method, since it is only intended to compare strings.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class StringMap extends TreeMap {
-
- /**
- * serialVersionUID.
- */
- private static final long serialVersionUID = 6948801857034259744L;
-
- /**
- * Constructor.
- */
- public StringMap() {
- this(true);
- }
-
- /**
- * Constructor.
- *
- * @param caseSensitive : fix if the map if case sensitive or not.
- */
- public StringMap(boolean caseSensitive) {
- super(new StringComparator(caseSensitive));
- }
-
- /**
- * Constructor.
- *
- * @param map : initial properties.
- * @param caseSensitive : fix if the map if case sensitive or not.
- */
- public StringMap(Map map, boolean caseSensitive) {
- this(caseSensitive);
- putAll(map);
- }
-
- /**
- * Put a record in the map.
- * @param key : key
- * @param value : value
- * @return an object.
- * @see java.util.TreeMap#put(K, V)
- */
- public Object put(Object key, Object value) {
- return super.put(key.toString(), value);
- }
-
- /**
- * Check if the map is case-sensitive.
- * @return true if the map is case sensitive.
- */
- public boolean isCaseSensitive() {
- return ((StringComparator) comparator()).isCaseSensitive();
- }
-
- /**
- * Set the case sensitivity.
- *
- * @param b : the new case sensitivity.
- */
- public void setCaseSensitive(boolean b) {
- ((StringComparator) comparator()).setCaseSensitive(b);
- }
-
- private static class StringComparator implements Comparator {
- /**
- * Is the map case sensitive?
- */
- private boolean m_isCaseSensitive = true;
-
- /**
- * Constructor.
- *
- * @param b : true to enable the case sensitivity.
- */
- public StringComparator(boolean b) {
- m_isCaseSensitive = b;
- }
-
- /**
- * Compare to object.
- * @param o1 : first object to compare
- * @param o2 : second object to compare
- * @return the comparison result
- * @see java.util.Comparator#compare(T, T)
- */
- public int compare(Object o1, Object o2) {
- if (m_isCaseSensitive) {
- return o1.toString().compareTo(o2.toString());
- } else {
- return o1.toString().compareToIgnoreCase(o2.toString());
- }
- }
-
- /**
- * Check if the comparator is case sensitive.
- * @return true if the map is case sensitive.
- */
- public boolean isCaseSensitive() {
- return m_isCaseSensitive;
- }
-
- /**
- * Set the case sensitivity.
- *
- * @param b : true to enable the case sensitivity
- */
- public void setCaseSensitive(boolean b) {
- m_isCaseSensitive = b;
- }
- }
-}
+/*
+ * 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.context;
+
+import java.util.Comparator;
+import java.util.Map;
+import java.util.TreeMap;
+
+/**
+ * Simple utility class that creates a map for string-based keys by extending
+ * <tt>TreeMap</tt>. This map can be set to use case-sensitive or
+ * case-insensitive comparison when searching for the key. Any keys put into
+ * this map will be converted to a <tt>String</tt> using the
+ * <tt>toString()</tt> method, since it is only intended to compare strings.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class StringMap extends TreeMap {
+
+ /**
+ * serialVersionUID.
+ */
+ private static final long serialVersionUID = 6948801857034259744L;
+
+ /**
+ * Constructor.
+ */
+ public StringMap() {
+ this(true);
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param caseSensitive : fix if the map if case sensitive or not.
+ */
+ public StringMap(boolean caseSensitive) {
+ super(new StringComparator(caseSensitive));
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param map : initial properties.
+ * @param caseSensitive : fix if the map if case sensitive or not.
+ */
+ public StringMap(Map map, boolean caseSensitive) {
+ this(caseSensitive);
+ putAll(map);
+ }
+
+ /**
+ * Put a record in the map.
+ * @param key : key
+ * @param value : value
+ * @return an object.
+ * @see java.util.TreeMap#put(K, V)
+ */
+ public Object put(Object key, Object value) {
+ return super.put(key.toString(), value);
+ }
+
+ /**
+ * Check if the map is case-sensitive.
+ * @return true if the map is case sensitive.
+ */
+ public boolean isCaseSensitive() {
+ return ((StringComparator) comparator()).isCaseSensitive();
+ }
+
+ /**
+ * Set the case sensitivity.
+ *
+ * @param flag : the new case sensitivity.
+ */
+ public void setCaseSensitive(boolean flag) {
+ ((StringComparator) comparator()).setCaseSensitive(flag);
+ }
+
+ private static class StringComparator implements Comparator {
+ /**
+ * Is the map case sensitive?
+ */
+ private boolean m_isCaseSensitive = true;
+
+ /**
+ * Constructor.
+ *
+ * @param flag : true to enable the case sensitivity.
+ */
+ public StringComparator(boolean flag) {
+ m_isCaseSensitive = flag;
+ }
+
+ /**
+ * Compare to object.
+ * @param object1 : first object to compare
+ * @param object2 : second object to compare
+ * @return the comparison result
+ * @see java.util.Comparator#compare(T, T)
+ */
+ public int compare(Object object1, Object object2) {
+ if (m_isCaseSensitive) {
+ return object1.toString().compareTo(object2.toString());
+ } else {
+ return object1.toString().compareToIgnoreCase(object2.toString());
+ }
+ }
+
+ /**
+ * Check if the comparator is case sensitive.
+ * @return true if the map is case sensitive.
+ */
+ public boolean isCaseSensitive() {
+ return m_isCaseSensitive;
+ }
+
+ /**
+ * Set the case sensitivity.
+ *
+ * @param flag : true to enable the case sensitivity
+ */
+ public void setCaseSensitive(boolean flag) {
+ m_isCaseSensitive = flag;
+ }
+ }
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java
index 1509cf6..6021c5a 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/architecture/ArchitectureHandler.java
@@ -24,7 +24,6 @@
import org.apache.felix.ipojo.architecture.Architecture;
import org.apache.felix.ipojo.architecture.InstanceDescription;
import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.util.Logger;
/**
* Architecture Handler : do reflection on your component.
@@ -52,6 +51,7 @@
* @see org.apache.felix.ipojo.Handler#stop()
*/
public void stop() {
+ // Nothing do do when stopping.
}
/**
@@ -59,7 +59,7 @@
* @see org.apache.felix.ipojo.Handler#start()
*/
public void start() {
- log(Logger.INFO, "Start architecture handler with " + m_name + " name");
+ info("Start architecture handler with " + m_name + " name");
}
/**
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurableProperty.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurableProperty.java
deleted file mode 100644
index 26db364..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurableProperty.java
+++ /dev/null
@@ -1,688 +0,0 @@
-/*
- * 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.handlers.configuration;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.parser.ParseUtils;
-import org.apache.felix.ipojo.util.Callback;
-import org.apache.felix.ipojo.util.Logger;
-
-/**
- * Configurable Property.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class ConfigurableProperty {
-
- /**
- * Name of the property (filed name if not set).
- */
- private String m_name;
-
- /**
- * Field of the property.
- */
- private String m_field;
-
- /**
- * Method of the property.
- */
- private Callback m_method;
-
- /**
- * Value of the property.
- */
- private Object m_value;
-
- /**
- * Type of the property.
- */
- private Class m_type;
-
- /**
- * Configuration Handler managing this property.
- */
- private ConfigurationHandler m_handler;
-
- /**
- * Configurable Property Constructor. At least the method or the field need
- * to be referenced.
- *
- * @param name : name of the property (optional)
- * @param field : name of the field
- * @param method : method name
- * @param value : initial value of the property (optional)
- * @param type : the type of the property
- * @param ch : configuration handler managing this configurable property
- * @throws ConfigurationException : occurs when the property value cannot be set.
- */
- public ConfigurableProperty(String name, String field, String method, String value, String type, ConfigurationHandler ch) throws ConfigurationException {
- m_handler = ch;
-
- m_field = field;
-
- if (name != null) {
- m_name = name;
- } else {
- if (m_field != null) {
- m_name = field;
- } else {
- m_name = method;
- }
- }
- m_field = field;
-
- if (value != null) {
- setValue(value, type);
- } else {
- setType(type);
- }
-
- if (method != null) {
- m_method = new Callback(method, new String[] { m_type.getName() }, false, m_handler.getInstanceManager());
- }
-
- }
-
- /**
- * The set type method fix the property type according to the given type name.
- * @param type : the type name
- * @throws ConfigurationException if an error occurs when loading the type class for non-primitive types.
- */
- private void setType(String type) throws ConfigurationException {
- // Syntactic sugar to avoid writing java.lang.String
- if ("string".equals(type) || "String".equals(type)) {
- m_type = java.lang.String.class;
- return;
- }
- if (type.equals("boolean")) {
- m_type = Boolean.TYPE;
- return;
- }
- if ("byte".equals(type)) {
- m_type = Byte.TYPE;
- return;
- }
- if ("short".equals(type)) {
- m_type = Short.TYPE;
- return;
- }
- if ("int".equals(type)) {
- m_type = Integer.TYPE;
- return;
- }
- if ("long".equals(type)) {
- m_type = Long.TYPE;
- return;
- }
- if ("float".equals(type)) {
- m_type = Float.TYPE;
- return;
- }
- if ("double".equals(type)) {
- m_type = Double.TYPE;
- return;
- }
- if ("char".equals(type)) {
- m_type = Character.TYPE;
- return;
- }
-
- // Array :
- if (type.endsWith("[]")) {
- String internalType = type.substring(0, type.length() - 2);
- if ("string".equals(internalType) || "String".equals(internalType)) {
- m_type = new String[0].getClass();
- return;
- }
- if ("boolean".equals(internalType)) {
- m_type = new boolean[0].getClass();
- return;
- }
- if ("byte".equals(internalType)) {
- m_type = new byte[0].getClass();
- return;
- }
- if ("short".equals(internalType)) {
- m_type = new short[0].getClass();
- return;
- }
- if ("int".equals(internalType)) {
- m_type = new int[0].getClass();
- return;
- }
- if ("long".equals(internalType)) {
- m_type = new long[0].getClass();
- return;
- }
- if ("float".equals(internalType)) {
- m_type = new float[0].getClass();
- return;
- }
- if ("double".equals(internalType)) {
- m_type = new double[0].getClass();
- return;
- }
- if ("char".equals(internalType)) {
- m_type = new char[0].getClass();
- return;
- }
-
- // Complex array type.
- try {
- Class c = m_handler.getInstanceManager().getContext().getBundle().loadClass(internalType);
- Object[] ob = (Object[]) Array.newInstance(c, 0);
- m_type = ob.getClass();
- return;
- } catch (ClassNotFoundException e) {
- throw new ConfigurationException("Class not found exception in setValue on " + internalType);
- } catch (SecurityException e) {
- throw new ConfigurationException("Secutiry Exception in setValue on " + internalType);
- } catch (IllegalArgumentException e) {
- throw new ConfigurationException("Argument problem to call the constructor of the type " + internalType);
- }
- }
-
- // Non array, complex type.
- try {
- m_type = m_handler.getInstanceManager().getContext().getBundle().loadClass(type);
- } catch (ClassNotFoundException e) {
- throw new ConfigurationException("Class not found exception in setValue on " + type + " : " + e.getMessage());
- } catch (SecurityException e) {
- throw new ConfigurationException("Security excption in setValue on " + type + " : " + e.getMessage());
- } catch (IllegalArgumentException e) {
- throw new ConfigurationException("Argument problem to call the constructor of the type " + type);
- }
- }
-
- /**
- * Set the value of the property.
- * @param strValue : value of the property (String)
- * @param type : type of the property
- * @throws ConfigurationException : occurs when the property value cannot be initialized.
- */
- private void setValue(String strValue, String type) throws ConfigurationException {
- Object value = null;
-
- // Syntactic sugar to avoid writing java.lang.String
- if ("string".equals(type) || "String".equals(type)) {
- value = new String(strValue);
- m_type = java.lang.String.class;
- }
- if (type.equals("boolean")) {
- value = new Boolean(strValue);
- m_type = Boolean.TYPE;
- }
- if ("byte".equals(type)) {
- value = new Byte(strValue);
- m_type = Byte.TYPE;
- }
- if ("short".equals(type)) {
- value = new Short(strValue);
- m_type = Short.TYPE;
- }
- if ("int".equals(type)) {
- value = new Integer(strValue);
- m_type = Integer.TYPE;
- }
- if ("long".equals(type)) {
- value = new Long(strValue);
- m_type = Long.TYPE;
- }
- if ("float".equals(type)) {
- value = new Float(strValue);
- m_type = Float.TYPE;
- }
- if ("double".equals(type)) {
- value = new Double(strValue);
- m_type = Double.TYPE;
- }
- if ("char".equals(type)) {
- value = new Character(strValue.charAt(0));
- m_type = Character.TYPE;
- }
-
- // Array :
- if (type.endsWith("[]")) {
- String internalType = type.substring(0, type.length() - 2);
- setArrayValue(internalType, ParseUtils.parseArrays(strValue));
- return;
- }
-
- if (value == null) {
- // Else it is a neither a primitive type neither a String -> create
- // the object by calling a constructor with a string in argument.
- try {
- m_type = m_handler.getInstanceManager().getContext().getBundle().loadClass(type);
- Constructor cst = m_type.getConstructor(new Class[] { String.class });
- value = cst.newInstance(new Object[] { strValue });
- } catch (ClassNotFoundException e) {
- throw new ConfigurationException("Class not found exception in setValue on " + type + " : " + e.getMessage());
- } catch (SecurityException e) {
- throw new ConfigurationException("Security excption in setValue on " + type + " : " + e.getMessage());
- } catch (NoSuchMethodException e) {
- throw new ConfigurationException("Constructor not found exeption in setValue on " + type + " : " + e.getMessage());
- } catch (IllegalArgumentException e) {
- throw new ConfigurationException("Argument problem to call the constructor of the type " + type);
- } catch (InstantiationException e) {
- throw new ConfigurationException("Instantiation problem " + type);
- } catch (IllegalAccessException e) {
- throw new ConfigurationException("Illegal Access " + type);
- } catch (InvocationTargetException e) {
- throw new ConfigurationException("Invocation problem " + type + " : " + e.getTargetException().getMessage());
- }
- }
-
- m_value = value;
-
- }
-
- /**
- * Set array value to the current property.
- *
- * @param internalType : type of the property
- * @param values : new property value
- * @throws ConfigurationException occurs when the array cannot be initialized
- */
- private void setArrayValue(String internalType, String[] values) throws ConfigurationException {
- if ("string".equals(internalType) || "String".equals(internalType)) {
- String[] str = new String[values.length];
- for (int i = 0; i < values.length; i++) {
- str[i] = new String(values[i]);
- }
- m_value = str;
- m_type = new String[0].getClass();
- return;
- }
- if ("boolean".equals(internalType)) {
- boolean[] bool = new boolean[values.length];
- for (int i = 0; i < values.length; i++) {
- bool[i] = new Boolean(values[i]).booleanValue();
- }
- m_value = bool;
- m_type = new boolean[0].getClass();
- return;
- }
- if ("byte".equals(internalType)) {
- byte[] byt = new byte[values.length];
- for (int i = 0; i < values.length; i++) {
- byt[i] = new Byte(values[i]).byteValue();
- }
- m_value = byt;
- m_type = new byte[0].getClass();
- return;
- }
- if ("short".equals(internalType)) {
- short[] shor = new short[values.length];
- for (int i = 0; i < values.length; i++) {
- shor[i] = new Short(values[i]).shortValue();
- }
- m_value = shor;
- m_type = new short[0].getClass();
- return;
- }
- if ("int".equals(internalType)) {
- int[] in = new int[values.length];
- for (int i = 0; i < values.length; i++) {
- in[i] = new Integer(values[i]).intValue();
- }
- m_value = in;
- m_type = new int[0].getClass();
- return;
- }
- if ("long".equals(internalType)) {
- long[] ll = new long[values.length];
- for (int i = 0; i < values.length; i++) {
- ll[i] = new Long(values[i]).longValue();
- }
- m_value = ll;
- m_type = new long[0].getClass();
- return;
- }
- if ("float".equals(internalType)) {
- float[] fl = new float[values.length];
- for (int i = 0; i < values.length; i++) {
- fl[i] = new Float(values[i]).floatValue();
- }
- m_value = fl;
- m_type = new float[0].getClass();
- return;
- }
- if ("double".equals(internalType)) {
- double[] dl = new double[values.length];
- for (int i = 0; i < values.length; i++) {
- dl[i] = new Double(values[i]).doubleValue();
- }
- m_value = dl;
- m_type = new double[0].getClass();
- return;
- }
- if ("char".equals(internalType)) {
- char[] dl = new char[values.length];
- for (int i = 0; i < values.length; i++) {
- dl[i] = values[i].toCharArray()[0];
- }
- m_value = dl;
- m_type = new char[0].getClass();
- return;
- }
-
- // Else it is a neither a primitive type neither a String -> create the
- // object by calling a constructor with a string in argument.
- try {
- Class c = m_handler.getInstanceManager().getContext().getBundle().loadClass(internalType);
- Constructor cst = c.getConstructor(new Class[] { String.class });
- Object[] ob = (Object[]) Array.newInstance(c, values.length);
- for (int i = 0; i < values.length; i++) {
- ob[i] = cst.newInstance(new Object[] { values[i].trim() });
- }
- m_value = ob;
- m_type = ob.getClass();
- return;
- } catch (ClassNotFoundException e) {
- throw new ConfigurationException("Class not found exception in setValue on " + internalType);
- } catch (SecurityException e) {
- throw new ConfigurationException("Secutiry Exception in setValue on " + internalType);
- } catch (NoSuchMethodException e) {
- throw new ConfigurationException("Constructor not found exception in setValue on " + internalType);
- } catch (IllegalArgumentException e) {
- throw new ConfigurationException("Argument problem to call the constructor of the type " + internalType);
- } catch (InstantiationException e) {
- throw new ConfigurationException("Instantiation problem " + internalType);
- } catch (IllegalAccessException e) {
- throw new ConfigurationException("Illegal Access Exception in " + internalType);
- } catch (InvocationTargetException e) {
- throw new ConfigurationException("Invocation problem " + internalType + " : " + e.getTargetException().getMessage());
- }
- }
-
- public String getName() {
- return m_name;
- }
-
- public String getField() {
- return m_field;
- }
-
- /**
- * Get method name, null if no method.
- * @return the method name.
- */
- public String getMethod() {
- if (m_method == null) { return null; }
- return m_method.getMethod();
- }
-
- /**
- * Check if the property has a method callback.
- * @return true if the property has a method.
- */
- public boolean hasMethod() {
- return m_method != null;
- }
-
- /**
- * Check if the property has a field.
- * @return true if the property has a field.
- */
- public boolean hasField() {
- return m_field != null;
- }
-
- public Object getValue() {
- return m_value;
- }
-
- /**
- * Fix the value of the property.
- * @param value : the new value.
- */
- public void setValue(Object value) {
- // Is the object is directly assignable to the property, affect it.
- if (isAssignable(m_type, value)) {
- m_value = value;
- } else {
- // If the object is a String, we must recreate the object from the String form
- if (value instanceof String) {
- try {
- m_value = create(m_type, (String) value);
- } catch (ConfigurationException e) {
- throw new ClassCastException("Incompatible type for the property " + m_name + " : " + e.getMessage());
- }
- } else {
- // Error, the given property cannot be injected.
- throw new ClassCastException("Incompatible type for the property " + m_name + " " + m_type.getName() + " expected, " + value.getClass() + " received");
- }
- }
- }
-
- /**
- * Test if the given value is assignable to the given type.
- * @param type : class of the type
- * @param value : object to check
- * @return true if the object is assignable in the property of type 'type'.
- */
- public static boolean isAssignable(Class type, Object value) {
- if (type.isInstance(value)) {
- return true;
- } else if (type.isPrimitive()) {
- // Manage all boxing types.
- if (value instanceof Boolean && type.equals(Boolean.TYPE)) {
- return true;
- }
- if (value instanceof Byte && type.equals(Byte.TYPE)) {
- return true;
- }
- if (value instanceof Short && type.equals(Short.TYPE)) {
- return true;
- }
- if (value instanceof Integer && type.equals(Integer.TYPE)) {
- return true;
- }
- if (value instanceof Long && type.equals(Long.TYPE)) {
- return true;
- }
- if (value instanceof Float && type.equals(Float.TYPE)) {
- return true;
- }
- if (value instanceof Double && type.equals(Double.TYPE)) {
- return true;
- }
- if (value instanceof Character && type.equals(Character.TYPE)) {
- return true;
- }
- return false;
- } else {
- // Else return false.
- return false;
- }
- }
-
- /**
- * Create an object of the given type with the given String value.
- * @param type : type of the returned object
- * @param strValue : String value.
- * @return the object of type 'type' created from the String 'value'
- * @throws ConfigurationException occurs when the object cannot be created.
- */
- public static Object create(Class type, String strValue) throws ConfigurationException {
- if (type.equals(Boolean.TYPE)) { return new Boolean(strValue); }
- if (type.equals(Byte.TYPE)) { return new Byte(strValue); }
- if (type.equals(Short.TYPE)) { return new Short(strValue); }
- if (type.equals(Integer.TYPE)) { return new Integer(strValue); }
- if (type.equals(Long.TYPE)) { return new Long(strValue); }
- if (type.equals(Float.TYPE)) { return new Float(strValue); }
- if (type.equals(Double.TYPE)) { return new Double(strValue); }
- if (type.equals(Character.TYPE)) { return new Character(strValue.charAt(0)); }
-
- // Array :
- if (type.isArray()) { return createArrayObject(type.getComponentType(), ParseUtils.parseArrays(strValue)); }
- // Else it is a neither a primitive type neither a String -> create
- // the object by calling a constructor with a string in argument.
- try {
- Constructor cst = type.getConstructor(new Class[] { String.class });
- return cst.newInstance(new Object[] { strValue });
- } catch (SecurityException e) {
- throw new ConfigurationException("Security exception in create on " + type + " : " + e.getMessage());
- } catch (NoSuchMethodException e) {
- throw new ConfigurationException("Constructor not found exception in create on " + type + " : " + e.getMessage());
- } catch (IllegalArgumentException e) {
- throw new ConfigurationException("Argument problem to call the constructor of the type " + type);
- } catch (InstantiationException e) {
- throw new ConfigurationException("Instantiation problem " + type);
- } catch (IllegalAccessException e) {
- throw new ConfigurationException("Illegal Access " + type);
- } catch (InvocationTargetException e) {
- throw new ConfigurationException("Invocation problem " + type + " : " + e.getTargetException().getMessage());
- }
-
- }
-
- /**
- * Create an array object containing the type 'interntype' from the String array 'values'.
- * @param interntype : internal type of the array.
- * @param values : String array
- * @return the array containing objects created from the 'values' array
- * @throws ConfigurationException occurs when the array cannot be created correctly
- */
- public static Object createArrayObject(Class interntype, String[] values) throws ConfigurationException {
- if (interntype.equals(Boolean.TYPE)) {
- boolean[] bool = new boolean[values.length];
- for (int i = 0; i < values.length; i++) {
- bool[i] = new Boolean(values[i]).booleanValue();
- }
- return bool;
- }
- if (interntype.equals(Byte.TYPE)) {
- byte[] byt = new byte[values.length];
- for (int i = 0; i < values.length; i++) {
- byt[i] = new Byte(values[i]).byteValue();
- }
- return byt;
- }
- if (interntype.equals(Short.TYPE)) {
- short[] shor = new short[values.length];
- for (int i = 0; i < values.length; i++) {
- shor[i] = new Short(values[i]).shortValue();
- }
- return shor;
- }
- if (interntype.equals(Integer.TYPE)) {
- int[] in = new int[values.length];
- for (int i = 0; i < values.length; i++) {
- in[i] = new Integer(values[i]).intValue();
- }
- return in;
- }
- if (interntype.equals(Long.TYPE)) {
- long[] ll = new long[values.length];
- for (int i = 0; i < values.length; i++) {
- ll[i] = new Long(values[i]).longValue();
- }
- return ll;
- }
- if (interntype.equals(Float.TYPE)) {
- float[] fl = new float[values.length];
- for (int i = 0; i < values.length; i++) {
- fl[i] = new Float(values[i]).floatValue();
- }
- return fl;
- }
- if (interntype.equals(Double.TYPE)) {
- double[] dl = new double[values.length];
- for (int i = 0; i < values.length; i++) {
- dl[i] = new Double(values[i]).doubleValue();
- }
- return dl;
- }
- if (interntype.equals(Character.TYPE)) {
- char[] dl = new char[values.length];
- for (int i = 0; i < values.length; i++) {
- dl[i] = values[i].toCharArray()[0];
- }
- return dl;
- }
-
- // Else it is a neither a primitive type -> create the
- // object by calling a constructor with a string in argument.
- try {
- Constructor cst = interntype.getConstructor(new Class[] { String.class });
- Object[] ob = (Object[]) Array.newInstance(interntype, values.length);
- for (int i = 0; i < values.length; i++) {
- ob[i] = cst.newInstance(new Object[] { values[i].trim() });
- }
- return ob;
- } catch (NoSuchMethodException e) {
- throw new ConfigurationException("Constructor not found exception in setValue on " + interntype.getName());
- } catch (IllegalArgumentException e) {
- throw new ConfigurationException("Argument problem to call the constructor of the type " + interntype.getName());
- } catch (InstantiationException e) {
- throw new ConfigurationException("Instantiation problem " + interntype.getName());
- } catch (IllegalAccessException e) {
- throw new ConfigurationException("Illegal Access Exception in " + interntype.getName());
- } catch (InvocationTargetException e) {
- throw new ConfigurationException("Invocation problem " + interntype.getName() + " : " + e.getTargetException().getMessage());
- }
- }
-
- /**
- * Invoke the method (if specified).
- * If the invocation failed, the instance is stopped.
- */
- public void invoke() {
- try {
- m_method.call(new Object[] { m_value });
- } catch (NoSuchMethodException e) {
- m_handler.log(Logger.ERROR, "The method " + m_method + " does not exist in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_handler.log(Logger.ERROR, "The method " + m_method + " is not accessible in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_handler.log(Logger.ERROR, "The method " + m_method + " in the class " + m_handler.getInstanceManager().getClassName() + "throws an exception : " + e.getTargetException().getMessage());
- m_handler.getInstanceManager().setState(ComponentInstance.INVALID);
- }
- }
-
- /**
- * Handler createInstance method. This method is override to allow delayed callback invocation.
- * If the invocation failed, the instance is stopped.
- * @param instance : the created object
- * @see org.apache.felix.ipojo.Handler#objectCreated(java.lang.Object)
- */
- public void invoke(Object instance) {
- try {
- m_method.call(instance, new Object[] { m_value });
- } catch (NoSuchMethodException e) {
- m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "The method " + m_method + " does not exist in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "The method " + m_method + " is not accessible in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "The method " + m_method + " in the class " + m_handler.getInstanceManager().getClassName() + "throws an exception : " + e.getTargetException().getMessage());
- m_handler.getInstanceManager().setState(ComponentInstance.INVALID);
- }
- }
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
index 186caa9..ef89f07 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
@@ -18,24 +18,23 @@
*/
package org.apache.felix.ipojo.handlers.configuration;
-import java.util.ArrayList;
import java.util.Dictionary;
import java.util.Enumeration;
-import java.util.List;
import java.util.Properties;
import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.IPojoConfiguration;
+import org.apache.felix.ipojo.HandlerFactory;
import org.apache.felix.ipojo.InstanceManager;
import org.apache.felix.ipojo.PrimitiveHandler;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.architecture.PropertyDescription;
import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler;
import org.apache.felix.ipojo.metadata.Attribute;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.parser.FieldMetadata;
-import org.apache.felix.ipojo.parser.ManipulationMetadata;
import org.apache.felix.ipojo.parser.MethodMetadata;
+import org.apache.felix.ipojo.parser.PojoMetadata;
+import org.apache.felix.ipojo.util.Property;
/**
* Handler managing the Configuration Admin.
@@ -46,7 +45,7 @@
/**
* List of the configurable fields.
*/
- private ConfigurableProperty[] m_configurableProperties = new ConfigurableProperty[0];
+ private Property[] m_configurableProperties = new Property[0];
/**
* ProvidedServiceHandler of the component. It is useful to propagate
@@ -71,16 +70,16 @@
/**
* Initialize the component type.
- * @param cd : component type description to populate.
+ * @param desc : component type description to populate.
* @param metadata : component type metadata.
* @throws ConfigurationException : metadata are incorrect.
- * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentDescription, org.apache.felix.ipojo.metadata.Element)
+ * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentTypeDescription, org.apache.felix.ipojo.metadata.Element)
*/
- public void initializeComponentFactory(ComponentDescription cd, Element metadata) throws ConfigurationException {
+ public void initializeComponentFactory(ComponentTypeDescription desc, Element metadata) throws ConfigurationException {
Element[] confs = metadata.getElements("Properties", "");
- if (confs.length == 0) { return; }
+ if (confs == null) { return; }
Element[] configurables = confs[0].getElements("Property");
- for (int i = 0; i < configurables.length; i++) {
+ for (int i = 0; configurables != null && i < configurables.length; i++) {
String fieldName = configurables[i].getAttribute("field");
String methodName = configurables[i].getAttribute("method");
@@ -90,10 +89,10 @@
String name = configurables[i].getAttribute("name");
if (name == null) {
- if (fieldName != null) {
- name = fieldName;
- } else {
+ if (fieldName == null) {
name = methodName;
+ } else {
+ name = fieldName;
}
configurables[i].addAttribute(new Attribute("name", name)); // Add the type to avoid configure checking
}
@@ -101,35 +100,43 @@
String value = configurables[i].getAttribute("value");
// Detect the type of the property
- ManipulationMetadata manipulation = new ManipulationMetadata(metadata);
+ PojoMetadata manipulation = getFactory().getPojoMetadata();
String type = null;
- if (fieldName != null) {
- FieldMetadata fm = manipulation.getField(fieldName);
- if (fm == null) { throw new ConfigurationException("Malformed property : The field " + fieldName + " does not exist in the implementation"); }
- type = fm.getFieldType();
- configurables[i].addAttribute(new Attribute("type", type)); // Add the type to avoid configure checking
- } else {
- MethodMetadata[] mm = manipulation.getMethods(methodName);
- if (mm.length != 0) {
- if (mm[0].getMethodArguments().length != 1) {
- throw new ConfigurationException("Malformed property : The method " + methodName + " does not have one argument");
- }
- if (type != null && !type.equals(mm[0].getMethodArguments()[0])) {
- throw new ConfigurationException("Malformed property : The field type (" + type + ") and the method type (" + mm[0].getMethodArguments()[0] + ") are not the same.");
- }
- type = mm[0].getMethodArguments()[0];
- configurables[i].addAttribute(new Attribute("type", type)); // Add the type to avoid configure checking
- } else {
+ if (fieldName == null) {
+ MethodMetadata[] method = manipulation.getMethods(methodName);
+ if (method.length == 0) {
type = configurables[i].getAttribute("type");
if (type == null) {
throw new ConfigurationException("Malformed property : The type of the property cannot be discovered, please add a 'type' attribute");
}
+ } else {
+ if (method[0].getMethodArguments().length != 1) {
+ throw new ConfigurationException("Malformed property : The method " + methodName + " does not have one argument");
+ }
+ if (type != null && !type.equals(method[0].getMethodArguments()[0])) {
+ throw new ConfigurationException("Malformed property : The field type (" + type + ") and the method type (" + method[0].getMethodArguments()[0] + ") are not the same.");
+ }
+ type = method[0].getMethodArguments()[0];
+ configurables[i].addAttribute(new Attribute("type", type)); // Add the type to avoid configure checking
}
- }
- if (value != null) {
- cd.addProperty(new PropertyDescription(name, type, value));
} else {
- cd.addProperty(new PropertyDescription(name, type, null));
+ FieldMetadata field = manipulation.getField(fieldName);
+ if (field == null) { throw new ConfigurationException("Malformed property : The field " + fieldName + " does not exist in the implementation"); }
+ type = field.getFieldType();
+ configurables[i].addAttribute(new Attribute("type", type)); // Add the type to avoid configure checking
+ }
+
+ // Is the property set to immutable
+ boolean immutable = false;
+ String imm = configurables[i].getAttribute("immutable");
+ if (imm != null && imm.equalsIgnoreCase("true")) {
+ immutable = true;
+ }
+
+ if (value == null) {
+ desc.addProperty(new PropertyDescription(name, type, null, false)); // Cannot be immutable if we have no value.
+ } else {
+ desc.addProperty(new PropertyDescription(name, type, value, immutable));
}
}
}
@@ -145,7 +152,7 @@
*/
public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
// Store the component manager
- m_configurableProperties = new ConfigurableProperty[0];
+ m_configurableProperties = new Property[0];
// Build the map
Element[] confs = metadata.getElements("Properties", "");
@@ -160,43 +167,32 @@
m_toPropagate = configuration;
}
- List ff = new ArrayList();
-
- for (int i = 0; i < configurables.length; i++) {
+ for (int i = 0; configurables != null && i < configurables.length; i++) {
String fieldName = configurables[i].getAttribute("field");
String methodName = configurables[i].getAttribute("method");
String name = configurables[i].getAttribute("name"); // The initialize method has fixed the property name.
String value = configurables[i].getAttribute("value");
- if (configuration.get(name) != null && configuration.get(name) instanceof String) {
- value = (String) configuration.get(name);
- } else {
- if (fieldName != null && configuration.get(fieldName) != null && configuration.get(fieldName) instanceof String) {
- value = (String) configuration.get(fieldName);
- }
- }
-
String type = configurables[i].getAttribute("type"); // The initialize method has fixed the property name.
- if (fieldName != null) {
- FieldMetadata fm = new FieldMetadata(fieldName, type);
- ff.add(fm);
- }
-
- ConfigurableProperty cp = new ConfigurableProperty(name, fieldName, methodName, value, type, this);
- addProperty(cp);
+ Property prop = new Property(name, fieldName, methodName, value, type, getInstanceManager(), this);
+ addProperty(prop);
// Check if the instance configuration contains value for the current property :
- if (configuration.get(name) != null && !(configuration.get(name) instanceof String)) {
- cp.setValue(configuration.get(name));
- } else {
- if (fieldName != null && configuration.get(fieldName) != null && !(configuration.get(fieldName) instanceof String)) {
- cp.setValue(configuration.get(fieldName));
+ if (configuration.get(name) == null) {
+ if (fieldName != null && configuration.get(fieldName) != null) {
+ prop.setValue(configuration.get(fieldName));
}
+ } else {
+ prop.setValue(configuration.get(name));
+ }
+
+ if (fieldName != null) {
+ FieldMetadata field = new FieldMetadata(fieldName, type);
+ getInstanceManager().register(field, prop);
}
}
- getInstanceManager().register(this, (FieldMetadata[]) ff.toArray(new FieldMetadata[ff.size()]), null);
}
/**
@@ -205,6 +201,7 @@
* @see org.apache.felix.ipojo.Handler#stop()
*/
public void stop() {
+ // Nothing to do.
}
/**
@@ -214,7 +211,7 @@
*/
public void start() {
// Get the provided service handler :
- m_providedServiceHandler = (ProvidedServiceHandler) getHandler(IPojoConfiguration.IPOJO_NAMESPACE + ":provides");
+ m_providedServiceHandler = (ProvidedServiceHandler) getHandler(HandlerFactory.IPOJO_NAMESPACE + ":provides");
// Propagation
if (m_isConfigurable) {
@@ -225,45 +222,47 @@
}
}
- /**
- * Setter Callback Method.
- * Check if the modified field is a configurable property to update the value.
- * @param fieldName : field name
- * @param value : new value
- * @see org.apache.felix.ipojo.Handler#setterCallback(java.lang.String, java.lang.Object)
- */
- public void setterCallback(String fieldName, Object value) {
- // Verify that the field name correspond to a configurable property
- for (int i = 0; i < m_configurableProperties.length; i++) {
- ConfigurableProperty cp = m_configurableProperties[i];
- if (cp.hasField() && cp.getField().equals(fieldName)) {
- // Check if the value has changed
- if (cp.getValue() == null || !cp.getValue().equals(value)) {
- cp.setValue(value); // Change the value
- }
- }
- }
- // Else do nothing
- }
-
- /**
- * Getter Callback Method.
- * Check if the field is a configurable property to push the stored value.
- * @param fieldName : field name
- * @param value : value pushed by the previous handler
- * @return the stored value or the previous value.
- * @see org.apache.felix.ipojo.Handler#getterCallback(java.lang.String,
- * java.lang.Object)
- */
- public Object getterCallback(String fieldName, Object value) {
- // Check if the field is a configurable property
- for (int i = 0; i < m_configurableProperties.length; i++) {
- if (fieldName.equals(m_configurableProperties[i].getField())) {
- return m_configurableProperties[i].getValue();
- }
- }
- return value;
- }
+// /**
+// * Setter Callback Method.
+// * Check if the modified field is a configurable property to update the value.
+// * @param pojo : the pojo object on which the field is accessed
+// * @param fieldName : field name
+// * @param value : new value
+// * @see org.apache.felix.ipojo.Handler#onSet(Object, java.lang.String, java.lang.Object)
+// */
+// public void onSet(Object pojo, String fieldName, Object value) {
+// // Verify that the field name correspond to a configurable property
+// for (int i = 0; i < m_configurableProperties.length; i++) {
+// Property prop = m_configurableProperties[i];
+// if (prop.hasField() && prop.getField().equals(fieldName)) {
+// // Check if the value has changed
+// if (prop.getValue() == null || !prop.getValue().equals(value)) {
+// prop.setValue(value); // Change the value
+// }
+// }
+// }
+// // Else do nothing
+// }
+//
+// /**
+// * Getter Callback Method.
+// * Check if the field is a configurable property to push the stored value.
+// * @param pojo : the pojo object on which the field is accessed
+// * @param fieldName : field name
+// * @param value : value pushed by the previous handler
+// * @return the stored value or the previous value.
+// * @see org.apache.felix.ipojo.Handler#onGet(Object,
+// * java.lang.String, java.lang.Object)
+// */
+// public Object onGet(Object pojo, String fieldName, Object value) {
+// // Check if the field is a configurable property
+// for (int i = 0; i < m_configurableProperties.length; i++) {
+// if (fieldName.equals(m_configurableProperties[i].getField())) {
+// return m_configurableProperties[i].getValue();
+// }
+// }
+// return value;
+// }
/**
* Handler state changed.
@@ -284,20 +283,20 @@
/**
* Add the given property metadata to the property metadata list.
*
- * @param p : property metadata to add
+ * @param prop : property metadata to add
*/
- protected void addProperty(ConfigurableProperty p) {
+ protected void addProperty(Property prop) {
for (int i = 0; (m_configurableProperties != null) && (i < m_configurableProperties.length); i++) {
- if (m_configurableProperties[i].getName().equals(p.getName())) { return; }
+ if (m_configurableProperties[i].getName().equals(prop.getName())) { return; }
}
if (m_configurableProperties.length > 0) {
- ConfigurableProperty[] newProp = new ConfigurableProperty[m_configurableProperties.length + 1];
+ Property[] newProp = new Property[m_configurableProperties.length + 1];
System.arraycopy(m_configurableProperties, 0, newProp, 0, m_configurableProperties.length);
- newProp[m_configurableProperties.length] = p;
+ newProp[m_configurableProperties.length] = prop;
m_configurableProperties = newProp;
} else {
- m_configurableProperties = new ConfigurableProperty[] { p };
+ m_configurableProperties = new Property[] { prop };
}
}
@@ -317,31 +316,31 @@
/**
* Reconfigure the component instance.
* Check if the new configuration modify the current configuration.
- * @param np : the new configuration
+ * @param configuration : the new configuration
* @see org.apache.felix.ipojo.Handler#reconfigure(java.util.Dictionary)
*/
- public void reconfigure(Dictionary np) {
+ public void reconfigure(Dictionary configuration) {
Properties toPropagate = new Properties();
- Enumeration keysEnumeration = np.keys();
+ Enumeration keysEnumeration = configuration.keys();
while (keysEnumeration.hasMoreElements()) {
String name = (String) keysEnumeration.nextElement();
- Object value = np.get(name);
+ Object value = configuration.get(name);
boolean found = false;
// Check if the name is a configurable property
- for (int i = 0; !found && i < m_configurableProperties.length; i++) {
+ for (int i = 0; i < m_configurableProperties.length; i++) {
if (m_configurableProperties[i].getName().equals(name)) {
// Check if the value has changed
if (m_configurableProperties[i].getValue() == null || !m_configurableProperties[i].getValue().equals(value)) {
if (m_configurableProperties[i].hasField()) {
- getInstanceManager().setterCallback(m_configurableProperties[i].getField(), value); // dispatch that the value has changed
+ getInstanceManager().onSet(null, m_configurableProperties[i].getField(), value); // dispatch that the value has changed
}
if (m_configurableProperties[i].hasMethod()) {
m_configurableProperties[i].setValue(value);
- m_configurableProperties[i].invoke();
+ m_configurableProperties[i].invoke(null); // Call on all created pojo objects.
}
}
found = true;
- // Else do nothing
+ break;
}
}
if (!found) {
@@ -366,9 +365,9 @@
* Handler createInstance method.
* This method is override to allow delayed callback invocation.
* @param instance : the created object
- * @see org.apache.felix.ipojo.Handler#objectCreated(java.lang.Object)
+ * @see org.apache.felix.ipojo.Handler#onCreation(java.lang.Object)
*/
- public void objectCreated(Object instance) {
+ public void onCreation(Object instance) {
for (int i = 0; i < m_configurableProperties.length; i++) {
if (m_configurableProperties[i].hasMethod()) {
m_configurableProperties[i].invoke(instance);
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
index 7258e23..9b3c0e3 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/Dependency.java
@@ -20,62 +20,28 @@
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
-import java.util.ArrayList;
-import java.util.Collections;
+import java.util.Arrays;
+import java.util.Comparator;
import java.util.List;
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.IPojoContext;
+import org.apache.felix.ipojo.FieldInterceptor;
import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.MethodInterceptor;
import org.apache.felix.ipojo.Nullable;
import org.apache.felix.ipojo.PolicyServiceContext;
-import org.apache.felix.ipojo.ServiceContext;
-import org.apache.felix.ipojo.composite.CompositeServiceContext;
-import org.apache.felix.ipojo.util.Logger;
-import org.apache.felix.ipojo.util.ServiceReferenceRankingComparator;
-import org.apache.felix.ipojo.util.Tracker;
-import org.apache.felix.ipojo.util.TrackerCustomizer;
+import org.apache.felix.ipojo.handlers.dependency.ServiceUsage.Usage;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.osgi.framework.BundleContext;
import org.osgi.framework.Filter;
-import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
/**
* Represent a service dependency of the component instance.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public class Dependency implements TrackerCustomizer {
-
- /**
- * Dependency State : RESOLVED.
- */
- public static final int RESOLVED = 1;
-
- /**
- * Dependency State : UNRESOLVED.
- */
- public static final int UNRESOLVED = 2;
-
- /**
- * Dependency State : BROKEN.
- * Broken means that a used service disappears for static dependency.
- */
- public static final int BROKEN = 3;
-
- /**
- * Dynamic Binding Policy (default).
- */
- public static final int DYNAMIC_POLICY = 0;
-
- /**
- * Dynamic Priority Binding Policy.
- */
- public static final int DYNAMIC_PRIORITY_POLICY = 1;
-
- /**
- * Static Binding Policy.
- */
- public static final int STATIC_POLICY = 2;
+public class Dependency extends DependencyModel implements FieldInterceptor, MethodInterceptor {
/**
* Reference on the Dependency Handler.
@@ -90,144 +56,88 @@
/**
* List of dependency callback.
*/
- private DependencyCallback[] m_callbacks = new DependencyCallback[0];
+ private DependencyCallback[] m_callbacks;
/**
- * Service Specification required by the dependency.
- */
- private String m_specification;
-
- /**
- * Dependency ID (declared ID, if not declare use the specification).
- */
- private String m_id;
-
- /**
- * Is the dependency a multiple dependency ?
- */
- private boolean m_isAggregate = false;
-
- /**
- * Is the Dependency an optional dependency ?
- */
- private boolean m_isOptional = false;
-
- /**
- * LDAP Filter of the Dependency (String form).
- */
- private String m_strFilter;
-
- /**
* Is the dependency a service level dependency.
*/
- private boolean m_isServiceLevelRequirement = false;
-
- /**
- * Resolution policy.
- */
- private int m_policy = PolicyServiceContext.LOCAL_AND_GLOBAL;
+ private boolean m_isServiceLevelRequirement;
/**
- * Array of service references.
- * m_ref : Array
+ * Is the provider set frozen ?
*/
- private List m_references = new ArrayList();
-
- /**
- * Array of service reference containing used service references.
- */
- private List m_usedReferences = new ArrayList();
+ private boolean m_isFrozen;
/**
- * State of the dependency. 0 : stopped, 1 : valid, 2 : invalid.
- * m_state : int
+ * Is the dependency started ?
*/
- private int m_state;
+ private boolean m_isStarted;
/**
- * Class of the dependency.
- * Useful to create in the case of multiple dependency
- */
- private Class m_clazz;
-
- /**
- * LDAP Filter of the dependency.
- */
- private Filter m_filter;
-
- /**
- * Service Context in which resolving the dependency.
- */
- private ServiceContext m_serviceContext;
-
- /**
* Thread Local.
*/
- private ServiceUsage m_usage = new ServiceUsage();
+ private ServiceUsage m_usage;
/**
- * Service Tracker.
- */
- private Tracker m_tracker;
-
- /**
- * IS the instance activated ?
- */
- private boolean m_activated = false;
-
- /**
- * Binding Policy.
- */
- private int m_bindingPolicy;
-
- /**
* Nullable object.
*/
private Object m_nullable;
-
+
/**
* Default-Implementation.
*/
private String m_di;
/**
+ * Id of the dependency.
+ */
+ private String m_id;
+
+ /**
* Dependency constructor. After the creation the dependency is not started.
*
- * @param dh : the dependency handler managing this dependency
+ * @param handler : the dependency handler managing this dependency
* @param field : field of the dependency
* @param spec : required specification
* @param filter : LDAP filter of the dependency
* @param isOptional : is the dependency an optional dependency ?
* @param isAggregate : is the dependency an aggregate dependency
- * @param id : id of the dependency, may be null
+ * @param identity : id of the dependency, may be null
+ * @param context : bundle context (or service context) to use.
* @param policy : resolution policy
- * @param bindingPolicy : binding policy
- * @param di : default-implementation class
+ * @param cmp : comparator to sort references
+ * @param defaultImplem : default-implementation class
*/
- public Dependency(DependencyHandler dh, String field, String spec, String filter, boolean isOptional, boolean isAggregate, String id, int policy, int bindingPolicy, String di) {
- m_handler = dh;
- m_field = field;
- m_specification = spec;
- m_isOptional = isOptional;
- m_di = di;
-
- m_strFilter = filter;
- m_isAggregate = isAggregate;
- if (m_id == null) {
- m_id = m_specification;
+ public Dependency(DependencyHandler handler, String field, Class spec, Filter filter, boolean isOptional, boolean isAggregate, String identity, BundleContext context, int policy, Comparator cmp, String defaultImplem) {
+ super(spec, isAggregate, isOptional, filter, cmp, policy, context, handler);
+ m_handler = handler;
+ if (field != null) {
+ m_field = field;
+ m_usage = new ServiceUsage();
+ }
+ m_di = defaultImplem;
+
+ if (identity == null) {
+ if (spec != null) {
+ m_id = spec.getName();
+ }
} else {
- m_id = id;
- }
- if (policy != -1) {
- m_policy = policy;
- }
-
- m_bindingPolicy = bindingPolicy;
-
- // Fix the policy according to the level
- if ((m_policy == PolicyServiceContext.LOCAL_AND_GLOBAL || m_policy == PolicyServiceContext.LOCAL) && ! ((((IPojoContext) m_handler.getInstanceManager().getContext()).getServiceContext()) instanceof CompositeServiceContext)) {
- // We are not in a composite : BOTH | STRICT => GLOBAL
- m_policy = PolicyServiceContext.GLOBAL;
+ m_id = identity;
+ }
+ // Else wait the setSpecification call.
+ }
+
+ /**
+ * Set the specification of the current dependency.
+ * In order to store the id of the dependency, this
+ * method is override.
+ * @param spec : request service Class
+ * @see org.apache.felix.ipojo.util.DependencyModel#setSpecification(java.lang.Class)
+ */
+ public void setSpecification(Class spec) {
+ super.setSpecification(spec);
+ if (m_id == null) {
+ m_id = spec.getName();
}
}
@@ -235,122 +145,76 @@
return m_field;
}
-
- public String getSpecification() {
- return m_specification;
- }
-
-
- public boolean isOptional() {
- return m_isOptional;
- }
-
-
- public boolean isAggregate() {
- return m_isAggregate;
- }
-
- /**
- * Set the dependency to aggregate.
- */
- protected void setAggregate() {
- m_isAggregate = true;
- }
-
- /**
- * Activate the dependency.
- * For static policy it freezes the service reference set.
- */
- void activate() {
- if (m_bindingPolicy == STATIC_POLICY) {
- m_activated = true;
- }
- }
-
- /**
- * Set the tracked specification for this dependency.
- * @param spec : the tracked specification (interface name)
- */
- protected void setSpecification(String spec) {
- m_specification = spec;
- }
-
/**
* Add a callback to the dependency.
- * @param cb : callback to add
+ * @param callback : callback to add
*/
- protected void addDependencyCallback(DependencyCallback cb) {
- if (m_callbacks.length > 0) {
+ protected void addDependencyCallback(DependencyCallback callback) {
+ if (m_callbacks == null) {
+ m_callbacks = new DependencyCallback[] { callback };
+ } else {
DependencyCallback[] newCallbacks = new DependencyCallback[m_callbacks.length + 1];
System.arraycopy(m_callbacks, 0, newCallbacks, 0, m_callbacks.length);
- newCallbacks[m_callbacks.length] = cb;
+ newCallbacks[m_callbacks.length] = callback;
m_callbacks = newCallbacks;
- } else {
- m_callbacks = new DependencyCallback[] { cb };
}
}
+ /**
+ * Stop the current dependency.
+ * @see org.apache.felix.ipojo.util.DependencyModel#stop()
+ */
+ public void stop() {
+ m_isStarted = false;
+ super.stop();
+ }
/**
* Get the string form of the filter.
* @return : the string form of the filter.
*/
- public String getFilter() {
- if (m_strFilter == null) { return ""; }
- return m_strFilter;
+ public String getStringFilter() {
+ return getFilter().toString();
}
-
public DependencyHandler getHandler() {
return m_handler;
}
- /**
- * Build the Set [service reference] of used services.
- * @return the used service.
- */
- public List getUsedServices() {
- return m_usedReferences;
+ public synchronized boolean isFrozen() {
+ return m_isFrozen;
}
/**
- * This method is called by the replaced code in the component
- * implementation class. Construct the service object list is necessary.
- *
- * @return null or a service object or a list of service object according to
- * the dependency.
+ * Call the bind method.
+ * @param pojo : pojo instance on which calling the bind method.
*/
- Object get() {
- // Initialize the thread local object is not already touched.
- if (m_usage.getObjects().isEmpty()) {
- if (isAggregate()) {
- synchronized (m_tracker) {
- for (int i = 0; i < m_references.size(); i++) {
- ServiceReference ref = (ServiceReference) m_references.get(i);
- m_usage.getReferences().add(ref);
- m_usage.getObjects().add(getService(ref));
- }
- }
- } else {
- if (m_references.size() == 0) {
- if (m_nullable == null) {
- m_handler.log(Logger.WARNING, "[" + m_handler.getInstanceManager().getInstanceName() + "] The dependency is not optional, however no service object can be injected in " + m_field + " -> " + m_specification);
- return null;
- }
- m_usage.getObjects().add(m_nullable);
- } else {
- ServiceReference ref = (ServiceReference) m_references.get(0);
- m_usage.getReferences().add(ref); // Get the first one
- m_usage.getObjects().add(getService(ref));
- }
- }
- m_usage.setStackLevel(1);
+ protected synchronized void onObjectCreation(Object pojo) {
+ if (!m_isStarted) { return; }
+
+ // We are notified of an instance creation, we have to freeze when the static policy is used
+ if (getBindingPolicy() == STATIC_BINDING_POLICY) {
+ m_isFrozen = true;
}
- if (m_isAggregate) { // Multiple dependency
- return (Object[]) m_usage.getObjects().toArray((Object[]) Array.newInstance(m_clazz, m_usage.getObjects().size()));
- } else {
- return m_usage.getObjects().get(0);
+ // Check optional case : nullable object case : do not call bind on nullable object
+ if (isOptional() && getSize() == 0) { return; }
+
+ // Call bind callback.
+ for (int j = 0; m_callbacks != null && j < m_callbacks.length; j++) {
+ if (m_callbacks[j].getMethodType() == DependencyCallback.BIND) {
+ if (isAggregate()) {
+ ServiceReference[] refs = getServiceReferences();
+ for (int i = 0; i < refs.length; i++) {
+ invokeCallback(m_callbacks[j], refs[i], pojo);
+ }
+ } else {
+ ServiceReference ref = getServiceReference();
+ if (ref != null) {
+ invokeCallback(m_callbacks[j], ref, pojo);
+ }
+ }
+ }
}
}
@@ -360,95 +224,38 @@
*/
private void callUnbindMethod(ServiceReference ref) {
if (m_handler.getInstanceManager().getState() > InstanceManager.STOPPED && m_handler.getInstanceManager().getPojoObjects() != null) {
- for (int i = 0; i < m_callbacks.length; i++) {
+ for (int i = 0; m_callbacks != null && i < m_callbacks.length; i++) {
if (m_callbacks[i].getMethodType() == DependencyCallback.UNBIND) {
- try {
- m_callbacks[i].call(ref, getService(ref));
- } catch (NoSuchMethodException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[i].getMethodName() + " does not exist in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[i].getMethodName() + " is not accessible in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[i].getMethodName() + " in the class " + m_handler.getInstanceManager().getClassName() + "throws an exception : " + e.getTargetException().getMessage());
- m_handler.getInstanceManager().stop();
- }
+ invokeCallback(m_callbacks[i], ref, null); // Call on each created pojo objects.
}
}
}
}
/**
- * Get a service object for the given reference according to the resolving policy.
- * @param ref : service reference
- * @return the service object
+ * Helper method calling the given callback.
+ * @param callback : callback to call.
+ * @param ref : service reference.
+ * @param pojo : pojo on which calling the callback, if null call on each created pojo objects.
*/
- private synchronized Object getService(ServiceReference ref) {
- if (!m_usedReferences.contains(ref)) {
- m_usedReferences.add(ref);
- }
- return m_tracker.getService(ref);
- }
-
- /**
- * Unget the given service reference according to the resolving policy.
- * @param ref : service reference to unget
- */
- private void ungetService(ServiceReference ref) {
- m_tracker.ungetService(ref);
- }
-
- /**
- * Call the bind method.
- * @param instance : instance on which calling the bind method.
- */
- protected synchronized void callBindMethod(Object instance) {
- if (m_tracker == null) { return; }
- // Check optional case : nullable object case : do not call bind on nullable object
- if (m_isOptional && m_references.size() == 0) { return; }
-
- if (m_isAggregate) {
- for (int i = 0; i < m_references.size(); i++) {
- ServiceReference ref = (ServiceReference) m_references.get(i);
- for (int j = 0; j < m_callbacks.length; j++) {
- if (m_callbacks[j].getMethodType() == DependencyCallback.BIND) {
- try {
- m_callbacks[j].callOnInstance(instance, ref, getService(ref));
- } catch (NoSuchMethodException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[j].getMethodName() + " does not exist in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[j].getMethodName() + " is not accessible in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[j].getMethodName() + " in the class " + m_handler.getInstanceManager().getClassName() + "throws an exception : " + e.getTargetException().getMessage());
- m_handler.getInstanceManager().setState(ComponentInstance.INVALID);
- }
- }
- }
+ private void invokeCallback(DependencyCallback callback, ServiceReference ref, Object pojo) {
+ try {
+ if (pojo == null) {
+ callback.call(ref, getService(ref));
+ } else {
+ callback.callOnInstance(pojo, ref, getService(ref));
}
- } else {
- for (int j = 0; j < m_callbacks.length; j++) {
- if (m_callbacks[j].getMethodType() == DependencyCallback.BIND) {
- try {
- ServiceReference ref = (ServiceReference) m_references.get(0);
- if (ref != null) {
- m_callbacks[j].callOnInstance(instance, ref, getService(ref));
- }
- } catch (NoSuchMethodException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[j].getMethodName() + " does not exist in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[j].getMethodName() + " is not accessible in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[j].getMethodName() + " in the class " + m_handler.getInstanceManager().getClassName() + "throws an exception : " + e.getTargetException().getMessage());
- m_handler.getInstanceManager().setState(ComponentInstance.INVALID);
- }
- }
- }
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The method " + callback.getMethodName() + " does not exist in the class " + m_handler.getInstanceManager().getClassName());
+ m_handler.getInstanceManager().stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The method " + callback.getMethodName() + " is not accessible in the class " + m_handler.getInstanceManager().getClassName());
+ m_handler.getInstanceManager().stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The method " + callback.getMethodName() + " in the class " + m_handler.getInstanceManager().getClassName() + " throws an exception : " + e.getTargetException().getMessage(), e.getTargetException());
+ m_handler.getInstanceManager().stop();
}
+
}
/**
@@ -459,112 +266,45 @@
// call bind method :
// if (m_handler.getInstanceManager().getState() == InstanceManager.VALID) {
if (m_handler.getInstanceManager().getState() > InstanceManager.STOPPED && m_handler.getInstanceManager().getPojoObjects() != null) {
- for (int i = 0; i < m_callbacks.length; i++) {
+ for (int i = 0; m_callbacks != null && i < m_callbacks.length; i++) {
if (m_callbacks[i].getMethodType() == DependencyCallback.BIND) {
- try {
- m_callbacks[i].call(ref, getService(ref));
- ungetService(ref);
- } catch (NoSuchMethodException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[i].getMethodName() + " does not exist in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[i].getMethodName() + " is not accessible in the class " + m_handler.getInstanceManager().getClassName());
- m_handler.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_handler.log(Logger.ERROR, "The method " + m_callbacks[i].getMethodName() + " in the class " + m_handler.getInstanceManager().getClassName() + "throws an exception : " + e.getTargetException().getMessage());
- m_handler.getInstanceManager().setState(ComponentInstance.INVALID);
- }
+ invokeCallback(m_callbacks[i], ref, null);
}
}
}
}
-
+
/**
* Start the dependency.
*/
- public void start() {
-
- m_serviceContext = new PolicyServiceContext(m_handler.getInstanceManager().getGlobalContext(), m_handler.getInstanceManager().getLocalServiceContext(), m_policy);
-
- // Construct the filter with the objectclass + filter
- String filter = "(objectClass=" + m_specification + ")";
- if (m_strFilter != null) {
- filter = "(&" + filter + m_strFilter + ")";
- }
-
- try {
- m_clazz = m_handler.getInstanceManager().getContext().getBundle().loadClass(m_specification);
- } catch (ClassNotFoundException e) {
- m_handler.log(Logger.ERROR, "Cannot load the interface class for the dependency " + m_field + " [" + m_specification + "]");
- }
-
- if (m_isOptional) {
- if (m_di != null) {
- try {
- Class c = getHandler().getInstanceManager().getContext().getBundle().loadClass(m_di);
- m_nullable = c.newInstance();
- } catch (IllegalAccessException e) {
- m_handler.log(Logger.ERROR, "Cannot load the default-implementation " + m_di + " : " + e.getMessage());
- } catch (InstantiationException e) {
- m_handler.log(Logger.ERROR, "Cannot load the default-implementation " + m_di + " : " + e.getMessage());
- } catch (ClassNotFoundException e) {
- m_handler.log(Logger.ERROR, "Cannot load the default-implementation " + m_di + " : " + e.getMessage());
- }
+ public void start() {
+ if (isOptional() && !isAggregate()) {
+ if (m_di == null) {
+ // To load the proxy we use the POJO class loader. Indeed, this classloader imports iPOJO (so can access to Nullable) and has access to the service specification.
+ m_nullable = Proxy.newProxyInstance(getHandler().getInstanceManager().getClazz().getClassLoader(), new Class[] { getSpecification(), Nullable.class }, new NullableObject()); // NOPMD
} else {
- m_nullable = Proxy.newProxyInstance(getHandler().getInstanceManager().getClazz().getClassLoader(), new Class[] {m_clazz, Nullable.class}, new NullableObject());
+ try {
+ Class clazz = getHandler().getInstanceManager().getContext().getBundle().loadClass(m_di);
+ m_nullable = clazz.newInstance();
+ } catch (IllegalAccessException e) {
+ throw new IllegalStateException("Cannot load the default-implementation " + m_di + " : " + e.getMessage());
+ } catch (InstantiationException e) {
+ throw new IllegalStateException("Cannot load the default-implementation " + m_di + " : " + e.getMessage());
+ } catch (ClassNotFoundException e) {
+ throw new IllegalStateException("Cannot load the default-implementation " + m_di + " : " + e.getMessage());
+ }
}
}
- m_state = UNRESOLVED;
+ super.start();
- try {
- m_filter = m_handler.getInstanceManager().getContext().createFilter(filter); // Store the filter
- } catch (InvalidSyntaxException e1) {
- m_handler.log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] A filter is malformed : " + filter + " - " + e1.getMessage());
- m_handler.getInstanceManager().stop();
- }
- m_tracker = new Tracker(m_serviceContext, m_filter, this);
- m_tracker.open();
- if (m_tracker.size() == 0 && !m_isOptional) {
- m_state = UNRESOLVED;
- } else {
- m_state = RESOLVED;
- }
- }
-
- /**
- * Stop the dependency.
- */
- public void stop() {
- if (m_tracker != null) {
- m_tracker.close(); // Will unget all used reference.
- m_tracker = null;
+ if (getBindingPolicy() == STATIC_BINDING_POLICY && m_handler.getInstanceManager().getPojoObjects() != null) {
+ m_isFrozen = true;
}
- m_state = UNRESOLVED;
-
- m_activated = false;
- m_references.clear();
- m_usedReferences.clear();
- m_clazz = null;
+ m_isStarted = true;
}
- /**
- * Return the state of the dependency.
- * @return the state of the dependency (1 : valid, 2 : invalid)
- */
- public int getState() {
- return m_state;
- }
-
- /**
- * Return the list of used service reference.
- * @return the service reference list.
- */
- public List getServiceReferences() {
- return m_references;
- }
-
protected DependencyCallback[] getCallbacks() {
return m_callbacks;
}
@@ -572,136 +312,183 @@
/**
* Set that this dependency is a service level dependency.
* This forces the scoping policy to be STRICT.
- * @param b
*/
public void setServiceLevelDependency() {
m_isServiceLevelRequirement = true;
- m_policy = PolicyServiceContext.LOCAL;
+ setBundleContext(new PolicyServiceContext(m_handler.getInstanceManager().getGlobalContext(), m_handler.getInstanceManager().getLocalServiceContext(), PolicyServiceContext.LOCAL));
}
public String getId() {
return m_id;
}
-
+
public boolean isServiceLevelRequirement() {
return m_isServiceLevelRequirement;
}
- /**
- * Method called when a thread enters in a method.
- * @param method : method id.
- */
- public void entry(String method) {
- if (! m_usage.getObjects().isEmpty()) {
- int level = m_usage.getStackLevel();
- m_usage.setStackLevel(level++);
- }
- }
-
- /**
- * Method called when a thread exits a method.
- * @param method : the method id.
- */
- public void exit(String method) {
- if (! m_usage.getObjects().isEmpty()) {
- int level = m_usage.getStackLevel();
- level = level - 1;
- if (level == 0) {
- // Exit the method flow => Release all object
- m_usage.getObjects().clear();
- List refs = m_usage.getReferences();
- refs.clear();
- }
- }
- }
- /**
- * A new service is detected. This method check the reference against the stored filter.
- * @param ref : new service reference.
- * @return the service object, null is the service object is rejected.
- * @see org.osgi.util.tracker.ServiceTrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
- */
- public boolean addingService(ServiceReference ref) {
- if (! m_activated) {
- return true;
- }
- return false;
- }
-
/**
- * A new service reference has been added in the tracker.
- * Call the bind method if needed, and check the dependency context.
- * @param reference : added reference.
- * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
+ * A new service has to be injected.
+ * @param reference : the new matching service reference.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onServiceArrival(org.osgi.framework.ServiceReference)
*/
- public void addedService(ServiceReference reference) {
- m_references.add(reference);
- if (m_bindingPolicy == DYNAMIC_PRIORITY_POLICY) {
- Collections.sort(m_references, new ServiceReferenceRankingComparator());
- }
- m_state = RESOLVED;
- if (m_isAggregate || m_references.size() == 1) {
- callBindMethod(reference);
- }
-
- m_handler.checkContext();
+ public void onServiceArrival(ServiceReference reference) {
+ callBindMethod(reference);
+ //The method is only called when a new service arrives, or when the used one is replaced.
}
/**
- * A used service is modified.
- * @param ref : modified reference
- * @param arg1 : service object (returned when added)
- * @see org.osgi.util.tracker.ServiceTrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ * A used (already injected) service disappears.
+ * @param ref : leaving service reference.
+ * @see org.apache.felix.ipojo.util.DependencyModel#onServiceDeparture(org.osgi.framework.ServiceReference)
*/
- public void modifiedService(ServiceReference ref, Object arg1) { }
+ public void onServiceDeparture(ServiceReference ref) {
+ callUnbindMethod(ref);
+ }
/**
- * A used service disappears.
- * @param ref : implicated service.
- * @param arg1 : service object.
- * @see org.osgi.util.tracker.ServiceTrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ * The dependency has been reconfigured.
+ * @param departs : service no more matching.
+ * @param arrivals : new services
+ * @see org.apache.felix.ipojo.util.DependencyModel#onDependencyReconfiguration(org.osgi.framework.ServiceReference[], org.osgi.framework.ServiceReference[])
*/
- public void removedService(ServiceReference ref, Object arg1) {
- // Call unbind method
- boolean hasChanged = false;
- m_references.remove(ref);
- if (m_usedReferences.remove(ref)) {
- callUnbindMethod(ref);
-
- // Null the ref in the instance manager map
- if (m_field != null) {
- m_handler.getInstanceManager().setterCallback(m_field, null);
- }
-
- // Unget the service reference
- ungetService(ref);
- hasChanged = true;
- }
-
- if (m_bindingPolicy == STATIC_POLICY) {
- if (hasChanged && m_activated) {
- m_state = BROKEN;
- }
+ public void onDependencyReconfiguration(ServiceReference[] departs, ServiceReference[] arrivals) {
+ throw new UnsupportedOperationException("Dependency set change is not yet supported");
+ }
+
+ /**
+ * Get the used service references list.
+ * @return the used service reference or null if no service reference are available.
+ */
+ public List getServiceReferencesAsList() {
+ ServiceReference[] refs = super.getServiceReferences();
+ if (refs == null) {
+ return null;
} else {
- // Is the state valid or invalid, the reference is already removed
- if (m_references.size() == 0 && !m_isOptional) {
- m_state = UNRESOLVED;
- } else {
- m_state = RESOLVED;
- }
-
- // Is there any change ?
- if (!m_isAggregate) {
- if (hasChanged) { // The used reference has been removed
- if (m_references.size() != 0) {
- callBindMethod(m_references.get(0));
+ return Arrays.asList(refs);
+ }
+ }
+
+ /**
+ * This method is called by the replaced code in the component
+ * implementation class. Construct the service object list is necessary.
+ * @param pojo : POJO object.
+ * @param fieldName : field
+ * @param value : last value.
+ * @return the service object or a nullable / default implementation if defined.
+ * @see org.apache.felix.ipojo.FieldInterceptor#onGet(java.lang.Object, java.lang.String, java.lang.Object)
+ */
+ public Object onGet(Object pojo, String fieldName, Object value) {
+ // Initialize the thread local object is not already touched.
+ Usage usage = (Usage) m_usage.get();
+ if (usage.m_stack == 0) { // uninitialized usage.
+ ServiceReference[] refs = super.getServiceReferences();
+ if (isAggregate()) { // If we are aggregate we get the objects.
+ if (refs == null) {
+ usage.m_objects = (Object[]) Array.newInstance(getSpecification(), 0); // Create an empty array.
+ } else {
+ // Use a reflective construction to avoid class cast exception. This method allow to set the component type.
+ usage.m_objects = (Object[]) Array.newInstance(getSpecification(), refs.length);
+ for (int i = 0; refs != null && i < refs.length; i++) {
+ ServiceReference ref = refs[i];
+ usage.m_objects[i] = getService(ref);
}
}
+ } else { // We are singular.
+ // Use a reflective construction to avoid class cast exception. This method allow to set the component type.
+ usage.m_objects = (Object[]) Array.newInstance(getSpecification(), 1);
+ if (refs == null) {
+ if (m_nullable == null) {
+ m_handler.warn("[" + m_handler.getInstanceManager().getInstanceName() + "] The dependency is not optional, however no service object can be injected in " + m_field + " -> " + getSpecification().getName());
+ return null;
+ }
+ usage.m_objects[0] = m_nullable;
+ } else {
+ ServiceReference ref = getServiceReference();
+ usage.m_objects[0] = getService(ref);
+ }
+ }
+ usage.inc(); // Start the tracking, so fix the stack level to 1
+ m_usage.set(usage);
+ }
+
+ if (isAggregate()) { // Multiple dependency
+ return usage.m_objects;
+ } else {
+ return usage.m_objects[0];
+ }
+ }
+
+ /**
+ * The field was set.
+ * This method should not be call if the POJO is written correctly.
+ * @param pojo : POJO object
+ * @param fieldName : field name
+ * @param value : set value.
+ * @see org.apache.felix.ipojo.FieldInterceptor#onSet(java.lang.Object, java.lang.String, java.lang.Object)
+ */
+ public void onSet(Object pojo, String fieldName, Object value) {
+ // Nothing to do.
+ }
+
+ /**
+ * A POJO method will be invoked.
+ * @param pojo : Pojo object
+ * @param method : called method
+ * @param args : arguments
+ * @see org.apache.felix.ipojo.MethodInterceptor#onEntry(java.lang.Object, java.lang.reflect.Method, java.lang.Object[])
+ */
+ public void onEntry(Object pojo, Method method, Object[] args) {
+ if (m_usage != null) {
+ Usage usage = (Usage) m_usage.get();
+ if (usage.m_stack > 0) {
+ usage.inc();
+ m_usage.set(usage); // Set the Thread local as value has been modified
+ }
+ }
+ }
+
+ /**
+ * A POJO method has thrown an error.
+ * This method does nothing and wait for the finally.
+ * @param pojo : POJO object.
+ * @param method : Method object.
+ * @param throwable : thrown error
+ * @see org.apache.felix.ipojo.MethodInterceptor#onError(java.lang.Object, java.lang.reflect.Method, java.lang.Throwable)
+ */
+ public void onError(Object pojo, Method method, Throwable throwable) {
+ // Nothing to do : wait onFinally
+ }
+
+ /**
+ * A POJO method has returned.
+ * @param pojo : POJO object.
+ * @param method : Method object.
+ * @param returnedObj : returned object (null for void method)
+ * @see org.apache.felix.ipojo.MethodInterceptor#onExit(java.lang.Object, java.lang.reflect.Method, java.lang.Object)
+ */
+ public void onExit(Object pojo, Method method, Object returnedObj) {
+ // Nothing to do : wait onFinally
+
+ }
+
+ /**
+ * A POJO method is finished.
+ * @param pojo : POJO object.
+ * @param method : Method object.
+ * @see org.apache.felix.ipojo.MethodInterceptor#onFinally(java.lang.Object, java.lang.reflect.Method)
+ */
+ public void onFinally(Object pojo, Method method) {
+ if (m_usage != null) {
+ Usage usage = (Usage) m_usage.get();
+ if (usage.m_stack > 0) {
+ if (usage.dec()) {
+ // Exit the method flow => Release all objects
+ usage.clear();
+ m_usage.set(usage); // Set the Thread local as value has been modified
+ }
}
}
-
- m_handler.checkContext();
- return;
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java
index cb47c30..ad476c6 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyCallback.java
@@ -22,7 +22,6 @@
import java.lang.reflect.Method;
import org.apache.felix.ipojo.util.Callback;
-import org.apache.felix.ipojo.util.Logger;
import org.osgi.framework.ServiceReference;
/**
@@ -42,7 +41,6 @@
* Unbind method (called when a service disappears).
*/
public static final int UNBIND = 1;
-
/**
* Is the method a bind method or an unbind method ?
@@ -104,20 +102,25 @@
protected void searchMethod() {
if (m_argument != null) {
Method[] methods = m_dependency.getHandler().getInstanceManager().getClazz().getDeclaredMethods();
- for (int i = 0; m_methodObj == null && i < methods.length; i++) {
+ for (int i = 0; i < methods.length; i++) {
// First check the method name
if (methods[i].getName().equals(m_method)) {
// Check arguments
Class[] clazzes = methods[i].getParameterTypes();
- if (clazzes.length == m_argument.length) { // Test size to avoid useless loop
- boolean ok = true;
- for (int j = 0; ok && j < m_argument.length; j++) {
- if (!m_argument[j].equals(clazzes[j].getName())) {
- ok = false;
+ if (clazzes.length == m_argument.length) { // Test size to avoid useless loop // NOPMD
+ int argIndex = 0;
+ for (; argIndex < m_argument.length; argIndex++) {
+ if (!m_argument[argIndex].equals(clazzes[argIndex].getName())) {
+ break;
}
}
- if (ok) {
+ if (argIndex == m_argument.length) { // If the array was completely read.
m_methodObj = methods[i]; // It is the looked method.
+ if (! m_methodObj.isAccessible()) {
+ // If not accessible, try to set the accessibility.
+ m_methodObj.setAccessible(true);
+ }
+ return;
}
}
@@ -125,51 +128,64 @@
}
}
- if (m_methodObj == null) { //look at parent classes
- Method[] methods = m_dependency.getHandler().getInstanceManager().getClazz().getMethods();
- for (int i = 0; m_methodObj == null && i < methods.length; i++) {
- // First check the method name
- if (methods[i].getName().equals(m_method)) {
- // Check arguments
- Class[] clazzes = methods[i].getParameterTypes();
- switch(clazzes.length) {
- case 0 :
- // Callback with no arguments.
- m_methodObj = methods[i];
- m_argument = new String[0];
- break;
- case 1 :
- if (clazzes[0].getName().equals(ServiceReference.class.getName())) {
- // Callback with a service reference.
- m_methodObj = methods[i];
- m_argument = new String[] {ServiceReference.class.getName()};
- break;
- }
- if (clazzes[0].getName().equals(m_dependency.getSpecification())) {
- // Callback with the service object.
- m_methodObj = methods[i];
- m_argument = new String[] {m_dependency.getSpecification()};
- break;
- }
- case 2 :
- if (clazzes[0].getName().equals(m_dependency.getSpecification()) && clazzes[1].getName().equals(ServiceReference.class.getName())) {
- // Callback with two arguments.
- m_methodObj = methods[i];
- m_argument = new String[] {m_dependency.getSpecification(), ServiceReference.class.getName()};
- }
- break;
- default :
- break;
- }
- }
- }
- }
+ // Not found => Try parent method.
+ searchParentMethod();
if (m_methodObj == null) {
- m_dependency.getHandler().log(Logger.ERROR, "The method " + m_method + " cannot be called : method not found");
+ // If not found, stop the instance (fatal error)
+ m_dependency.getHandler().error("The method " + m_method + " cannot be called : method not found");
m_dependency.getHandler().getInstanceManager().stop();
} else {
- m_methodObj.setAccessible(true);
+ if (! m_methodObj.isAccessible()) {
+ // If not accessible, try to set the accessibility.
+ m_methodObj.setAccessible(true);
+ }
+ }
+ }
+
+ /**
+ * Introspect parent class to find the method.
+ */
+ private void searchParentMethod() {
+ // look at parent classes
+ Method[] methods = m_dependency.getHandler().getInstanceManager().getClazz().getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ // First check the method name
+ if (methods[i].getName().equals(m_method)) {
+ // Check arguments
+ Class[] clazzes = methods[i].getParameterTypes();
+ switch (clazzes.length) {
+ case 0:
+ // Callback with no arguments.
+ m_methodObj = methods[i];
+ m_argument = new String[0];
+ return;
+ case 1:
+ if (clazzes[0].getName().equals(ServiceReference.class.getName())) {
+ // Callback with a service reference.
+ m_methodObj = methods[i];
+ m_argument = new String[] { ServiceReference.class.getName() };
+ return;
+ }
+ if (clazzes[0].getName().equals(m_dependency.getSpecification().getName())) {
+ // Callback with the service object.
+ m_methodObj = methods[i];
+ m_argument = new String[] { m_dependency.getSpecification().getName() };
+ return;
+ }
+ break;
+ case 2:
+ if (clazzes[0].getName().equals(m_dependency.getSpecification().getName()) && clazzes[1].getName().equals(ServiceReference.class.getName())) {
+ // Callback with two arguments.
+ m_methodObj = methods[i];
+ m_argument = new String[] { m_dependency.getSpecification().getName(), ServiceReference.class.getName() };
+ return;
+ }
+ break;
+ default:
+ break;
+ }
+ }
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
index f9dea1b..6c09bd5 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyDescription.java
@@ -79,7 +79,6 @@
m_optional = optional;
m_filter = filter;
m_state = state;
- m_serviceReferences = new ArrayList();
}
public boolean isMultiple() { return m_multiple; }
@@ -106,9 +105,9 @@
/**
* Set the service reference array.
- * @param sr : the list of service reference
+ * @param refs : the list of service reference
*/
- public void setServiceReferences(List sr) { m_serviceReferences = sr; }
+ public void setServiceReferences(List refs) { m_serviceReferences = refs; }
/**
* Get the used service set.
@@ -118,10 +117,10 @@
/**
* Set the usedServices.
- * @param hm : the list of used service reference.
+ * @param usages : the list of used service reference.
*/
- public void setUsedServices(List hm) {
- m_usedServices = hm;
+ public void setUsedServices(List usages) {
+ m_usedServices = usages;
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
index 433f0b1..5a0f4d8 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandler.java
@@ -18,27 +18,30 @@
*/
package org.apache.felix.ipojo.handlers.dependency;
-import java.util.ArrayList;
+import java.util.Comparator;
import java.util.Dictionary;
-import java.util.List;
-import org.apache.felix.ipojo.ComponentInstance;
import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.IPojoContext;
import org.apache.felix.ipojo.PolicyServiceContext;
import org.apache.felix.ipojo.PrimitiveHandler;
import org.apache.felix.ipojo.architecture.HandlerDescription;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.parser.FieldMetadata;
-import org.apache.felix.ipojo.parser.ManipulationMetadata;
import org.apache.felix.ipojo.parser.MethodMetadata;
-import org.apache.felix.ipojo.util.Logger;
+import org.apache.felix.ipojo.parser.PojoMetadata;
+import org.apache.felix.ipojo.util.DependencyModel;
+import org.apache.felix.ipojo.util.DependencyStateListener;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.InvalidSyntaxException;
import org.osgi.framework.ServiceReference;
/**
* The dependency handler manages a list of service dependencies.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public class DependencyHandler extends PrimitiveHandler {
+public class DependencyHandler extends PrimitiveHandler implements DependencyStateListener {
/**
* List of dependencies of the component.
@@ -46,12 +49,6 @@
private Dependency[] m_dependencies = new Dependency[0];
/**
- * State of the handler.
- * Lifecycle controller.
- */
- private boolean m_state;
-
- /**
* Is the handler started.
*/
private boolean m_started;
@@ -61,16 +58,18 @@
* @param dep : the dependency to add
*/
private void addDependency(Dependency dep) {
- for (int i = 0; i < m_dependencies.length; i++) {
- if (m_dependencies[i] == dep) { return; }
+ for (int i = 0; m_dependencies != null && i < m_dependencies.length; i++) {
+ if (m_dependencies[i] == dep) {
+ return;
+ }
}
- if (m_dependencies.length > 0) {
+ if (m_dependencies == null) {
+ m_dependencies = new Dependency[] { dep };
+ } else {
Dependency[] newDep = new Dependency[m_dependencies.length + 1];
System.arraycopy(m_dependencies, 0, newDep, 0, m_dependencies.length);
newDep[m_dependencies.length] = dep;
m_dependencies = newDep;
- } else {
- m_dependencies = new Dependency[] { dep };
}
}
@@ -83,36 +82,56 @@
}
/**
+ * Validate method. This method is invoked by an AbstractServiceDependency when this dependency becomes RESOLVED.
+ * @param dep : the dependency becoming RESOLVED.
+ * @see org.apache.felix.ipojo.util.DependencyStateListener#validate(org.apache.felix.ipojo.util.DependencyModel)
+ */
+ public void validate(DependencyModel dep) {
+ checkContext();
+ }
+
+ /**
+ * Invalidate method. This method is invoked by an AbstractServiceDependency when this dependency becomes UNRESOLVED or BROKEN.
+ * @param dep : the dependency becoming UNRESOLVED or BROKEN.
+ * @see org.apache.felix.ipojo.util.DependencyStateListener#invalidate(org.apache.felix.ipojo.util.DependencyModel)
+ */
+ public void invalidate(DependencyModel dep) {
+ setValidity(false);
+ }
+
+ /**
* Check the validity of the dependencies.
*/
protected void checkContext() {
- if (! m_started) { return; }
+ if (!m_started) {
+ return;
+ }
synchronized (m_dependencies) {
// Store the initial state
- boolean initialState = m_state;
+ boolean initialState = getValidity();
boolean valid = true;
for (int i = 0; i < m_dependencies.length; i++) {
Dependency dep = m_dependencies[i];
- if (dep.getState() > Dependency.RESOLVED) {
+ if (dep.getState() != Dependency.RESOLVED) {
valid = false;
break;
}
}
-
+
// Check the component dependencies
if (valid) {
// The dependencies are valid
if (!initialState) {
// There is a state change
- m_state = true;
+ setValidity(true);
}
// Else do nothing, the component state stay VALID
} else {
// The dependencies are not valid
if (initialState) {
// There is a state change
- m_state = false;
+ setValidity(false);
}
// Else do nothing, the component state stay UNRESOLVED
}
@@ -121,155 +140,197 @@
}
/**
- * Check if the dependency given is valid in the sense that metadata are
- * consistent.
+ * Check if the dependency given is valid in the sense that metadata are consistent.
* @param dep : the dependency to check
* @param manipulation : the component-type manipulation metadata
* @return true if the dependency is valid
* @throws ConfigurationException : the checked dependency is not correct
*/
- private boolean checkDependency(Dependency dep, ManipulationMetadata manipulation) throws ConfigurationException {
+ private boolean checkDependency(Dependency dep, PojoMetadata manipulation) throws ConfigurationException {
// Check the internal type of dependency
String field = dep.getField();
DependencyCallback[] callbacks = dep.getCallbacks();
- for (int i = 0; i < callbacks.length; i++) {
+ if (callbacks == null && field == null) {
+ throw new ConfigurationException("A service requirement requires at least callbacks or a field");
+ }
+
+ for (int i = 0; callbacks != null && i < callbacks.length; i++) {
MethodMetadata[] mets = manipulation.getMethods(callbacks[i].getMethodName());
- if (mets.length != 0) {
+ if (mets.length == 0) {
+ info("A requirement callback " + callbacks[i].getMethodName() + " does not exist in the implementation, try the super classes");
+ } else {
if (mets[0].getMethodArguments().length > 2) {
- throw new ConfigurationException("Requirement Callback : A requirement callback " + callbacks[i].getMethodName() + " must have 0 or 1 or 2 arguments");
+ throw new ConfigurationException("Requirement Callback : A requirement callback "
+ + callbacks[i].getMethodName()
+ + " must have 0 or 1 or 2 arguments");
}
-
+
callbacks[i].setArgument(mets[0].getMethodArguments());
+
if (mets[0].getMethodArguments().length == 1) {
if (!mets[0].getMethodArguments()[0].equals(ServiceReference.class.getName())) {
- if (dep.getSpecification() == null) {
- dep.setSpecification(mets[0].getMethodArguments()[0]);
- }
- if (!dep.getSpecification().equals(mets[0].getMethodArguments()[0])) {
- log(Logger.WARNING, "[DependencyHandler on " + getInstanceManager().getInstanceName() + "] The field type [" + mets[0].getMethodArguments()[0] + "] and the needed service interface [" + dep.getSpecification() + "] are not the same");
- dep.setSpecification(mets[0].getMethodArguments()[0]);
- }
+ // The callback receives the service object.
+ setSpecification(dep, mets[0].getMethodArguments()[0], false); // Just warn if a mismatch is discovered.
}
} else if (mets[0].getMethodArguments().length == 2) {
- // Check that the second arguments is a service reference
+ // The callback receives service object, service reference. Check that the second argument is a service reference
if (!mets[0].getMethodArguments()[1].equals(ServiceReference.class.getName())) {
- String message = "The requirement callback " + callbacks[i].getMethodName() + " must have a ServiceReference as the second arguments";
+ String message =
+ "The requirement callback " + callbacks[i].getMethodName() + " must have a ServiceReference as the second argument";
throw new ConfigurationException(message);
}
- if (dep.getSpecification() == null) {
- dep.setSpecification(mets[0].getMethodArguments()[0]);
- } else {
- if (!dep.getSpecification().equals(mets[0].getMethodArguments()[0])) {
- log(Logger.WARNING, "[DependencyHandler on " + getInstanceManager().getInstanceName() + "] The field type [" + mets[0].getMethodArguments()[0] + "] and the needed service interface [" + dep.getSpecification() + "] are not the same");
- dep.setSpecification(mets[0].getMethodArguments()[0]);
- }
- }
+ setSpecification(dep, mets[0].getMethodArguments()[0], false); // Just warn if a mismatch is discovered.
}
- } else {
- log(Logger.INFO, "A requirement callback " + callbacks[i].getMethodName() + " does not exist in the implementation, try the super classes");
}
}
if (field != null) {
- FieldMetadata fm = manipulation.getField(field);
- if (fm == null) {
- throw new ConfigurationException("Requirement Callback : A requirement field " + field + " does not exist in the implementation class");
+ FieldMetadata meta = manipulation.getField(field);
+ if (meta == null) {
+ throw new ConfigurationException("Requirement Callback : A requirement field "
+ + field
+ + " does not exist in the implementation class");
}
- String type = fm.getFieldType();
+ String type = meta.getFieldType();
if (type.endsWith("[]")) {
// Set the dependency to multiple
- dep.setAggregate();
+ dep.setAggregate(true);
type = type.substring(0, type.length() - 2);
+ } else {
+ if (dep.isAggregate()) {
+ throw new ConfigurationException("A required service is not correct : the field "
+ + meta.getFieldName()
+ + " must be an array to support aggregate injections");
+ }
}
-
- if (dep.getSpecification() == null) {
- dep.setSpecification(type);
- }
-
- if (!dep.getSpecification().equals(type)) {
- log(Logger.WARNING, "[DependencyHandler on " + getInstanceManager().getInstanceName() + "] The field type [" + type + "] and the needed service interface [" + dep.getSpecification() + "] are not the same");
- dep.setSpecification(type);
- }
+ setSpecification(dep, type, true); // Throw an exception if the filed type mismatch.
}
- //Check that all required info are set
+ // Check that all required info are set
return dep.getSpecification() != null;
}
/**
+ * Check if we have to set the dependency specification with the given class name.
+ * @param dep : dependency to check
+ * @param className : class name
+ * @param error : set to true to throw an error if the set dependency specification and the given specification are different.
+ * @throws ConfigurationException : the specification class cannot be loaded correctly
+ */
+ private void setSpecification(Dependency dep, String className, boolean error) throws ConfigurationException {
+ // We have to set the dependency in two cases : either the dependency as no specification, or the specification is different from the given
+ // one
+ if (dep.getSpecification() == null || !dep.getSpecification().getName().equals(className)) {
+ if (dep.getSpecification() != null) {
+ if (error) {
+ throw new ConfigurationException("A required service is not correct : the discoevered type ["
+ + className
+ + "] and the specified (or already discovered) service interface ["
+ + dep.getSpecification().getName()
+ + "] are not the same");
+ } else {
+ // If the specification is different, warn that we will overide it.
+ warn("[DependencyHandler on "
+ + getInstanceManager().getInstanceName()
+ + "] The field type ["
+ + className
+ + "] and the needed service interface ["
+ + dep.getSpecification()
+ + "] are not the same");
+ }
+ }
+ try {
+ dep.setSpecification(getInstanceManager().getContext().getBundle().loadClass(className));
+ } catch (ClassNotFoundException e) {
+ throw new ConfigurationException("The required service interface cannot be loaded : " + e.getMessage());
+ }
+ }
+ }
+
+ /**
* Configure the handler.
* @param componentMetadata : the component type metadata
* @param configuration : the instance configuration
* @throws ConfigurationException : one dependency metadata is not correct.
- * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+ * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element,
+ * java.util.Dictionary)
*/
public void configure(Element componentMetadata, Dictionary configuration) throws ConfigurationException {
- m_dependencies = new Dependency[0];
-
- ManipulationMetadata manipulation = new ManipulationMetadata(componentMetadata);
- List fl = new ArrayList();
+ // getPojoMetadata();
+ PojoMetadata manipulation = getFactory().getPojoMetadata();
+ boolean atLeastOneField = false;
// Create the dependency according to the component metadata
Element[] deps = componentMetadata.getElements("Requires");
-
+
// Get instance filters.
Dictionary filtersConfiguration = (Dictionary) configuration.get("requires.filters");
-
- for (int i = 0; i < deps.length; i++) {
+
+ for (int i = 0; deps != null && i < deps.length; i++) {
// Create the dependency metadata
String field = deps[i].getAttribute("field");
String serviceSpecification = deps[i].getAttribute("interface");
String filter = deps[i].getAttribute("filter");
String opt = deps[i].getAttribute("optional");
boolean optional = opt != null && opt.equalsIgnoreCase("true");
- String di = deps[i].getAttribute("default-implementation");
-
+ String defaultImplem = deps[i].getAttribute("default-implementation");
+
String agg = deps[i].getAttribute("aggregate");
boolean aggregate = agg != null && agg.equalsIgnoreCase("true");
- String id = deps[i].getAttribute("id");
+ String identitity = deps[i].getAttribute("id");
- int scopePolicy = -1;
- String scope = deps[i].getAttribute("scope");
+ String scope = deps[i].getAttribute("scope");
+ BundleContext context = getInstanceManager().getContext(); // Get the default bundle context.
if (scope != null) {
- if (scope.equalsIgnoreCase("global")) {
- scopePolicy = PolicyServiceContext.GLOBAL;
+ // If we are not in a composite, the policy is set to global.
+ if (scope.equalsIgnoreCase("global") || ((((IPojoContext) getInstanceManager().getContext()).getServiceContext()) == null)) {
+ context =
+ new PolicyServiceContext(getInstanceManager().getGlobalContext(), getInstanceManager().getLocalServiceContext(),
+ PolicyServiceContext.GLOBAL);
} else if (scope.equalsIgnoreCase("composite")) {
- scopePolicy = PolicyServiceContext.LOCAL;
+ context =
+ new PolicyServiceContext(getInstanceManager().getGlobalContext(), getInstanceManager().getLocalServiceContext(),
+ PolicyServiceContext.LOCAL);
} else if (scope.equalsIgnoreCase("composite+global")) {
- scopePolicy = PolicyServiceContext.LOCAL_AND_GLOBAL;
+ context =
+ new PolicyServiceContext(getInstanceManager().getGlobalContext(), getInstanceManager().getLocalServiceContext(),
+ PolicyServiceContext.LOCAL_AND_GLOBAL);
}
}
// Get instance filter if available
- if (filtersConfiguration != null && id != null && filtersConfiguration.get(id) != null) {
- filter = (String) filtersConfiguration.get(id);
+ if (filtersConfiguration != null && identitity != null && filtersConfiguration.get(identitity) != null) {
+ filter = (String) filtersConfiguration.get(identitity);
}
-
-
- // Parse binding policy
- int bindingPolicy = Dependency.DYNAMIC_POLICY;
- String policy = deps[i].getAttribute("policy");
- if (policy != null) {
- if (policy.equalsIgnoreCase("static")) {
- bindingPolicy = Dependency.STATIC_POLICY;
- } else if (policy.equalsIgnoreCase("dynamic")) {
- bindingPolicy = Dependency.DYNAMIC_POLICY;
- } else if (policy.equalsIgnoreCase("dynamic-priority")) {
- bindingPolicy = Dependency.DYNAMIC_PRIORITY_POLICY;
+
+ Filter fil = null;
+ if (filter != null) {
+ try {
+ fil = getInstanceManager().getContext().createFilter(filter);
+ } catch (InvalidSyntaxException e) {
+ throw new ConfigurationException("A requirement filter is invalid : " + filter + " - " + e.getMessage());
}
}
-
- Dependency dep = new Dependency(this, field, serviceSpecification, filter, optional, aggregate, id, scopePolicy, bindingPolicy, di);
+
+ Class spec = null;
+ if (serviceSpecification != null) {
+ spec = DependencyModel.loadSpecification(serviceSpecification, getInstanceManager().getContext());
+ }
+
+ int policy = DependencyModel.getPolicy(deps[i]);
+ Comparator cmp = DependencyModel.getComparator(deps[i], getInstanceManager().getGlobalContext());
+ Dependency dep = new Dependency(this, field, spec, fil, optional, aggregate, identitity, context, policy, cmp, defaultImplem);
// Look for dependency callback :
- for (int j = 0; j < (deps[i].getElements("Callback", "")).length; j++) {
- if (!(deps[i].getElements("Callback", "")[j].containsAttribute("method") && deps[i].getElements("Callback", "")[j].containsAttribute("type"))) {
- throw new ConfigurationException("Requirement Callback : a dependency callback must contain a method and a type attribute");
+ Element[] cbs = deps[i].getElements("Callback");
+ for (int j = 0; cbs != null && j < cbs.length; j++) {
+ if (!cbs[j].containsAttribute("method") && cbs[j].containsAttribute("type")) {
+ throw new ConfigurationException("Requirement Callback : a dependency callback must contain a method and a type attribute");
}
- String method = deps[i].getElements("Callback", "")[j].getAttribute("method");
- String type = deps[i].getElements("Callback", "")[j].getAttribute("type");
+ String method = cbs[j].getAttribute("method");
+ String type = cbs[j].getAttribute("type");
int methodType = 0;
if ("bind".equalsIgnoreCase(type)) {
methodType = DependencyCallback.BIND;
@@ -277,74 +338,49 @@
methodType = DependencyCallback.UNBIND;
}
- DependencyCallback dc = new DependencyCallback(dep, method, methodType);
- dep.addDependencyCallback(dc);
+ DependencyCallback callback = new DependencyCallback(dep, method, methodType);
+ dep.addDependencyCallback(callback);
}
// Check the dependency :
if (checkDependency(dep, manipulation)) {
addDependency(dep);
if (dep.getField() != null) {
- fl.add(manipulation.getField(dep.getField()));
+ getInstanceManager().register(manipulation.getField(dep.getField()), dep);
+ atLeastOneField = true;
}
}
}
- if (deps.length > 0) {
- getInstanceManager().register(this, (FieldMetadata[]) fl.toArray(new FieldMetadata[0]), manipulation.getMethods());
- } else {
- throw new ConfigurationException("No dependencies found in " + getInstanceManager().getInstanceName());
- }
- }
-
- /**
- * GetterCallback Method.
- * @param fieldName : the field name.
- * @param value : the value passed to the field (by the previous handler).
- * @return the object that the dependency handler want to push.
- * @see org.apache.felix.ipojo.Handler#getterCallback(java.lang.String, java.lang.Object)
- */
- public Object getterCallback(String fieldName, Object value) {
- for (int i = 0; i < m_dependencies.length; i++) {
- Dependency dep = m_dependencies[i];
- String field = dep.getField();
- if (field != null && field.equals(fieldName)) {
- // The field name is a dependency, return the get
- return dep.get();
- }
- }
- // Else return the value
- return value;
- }
-
- /**
- * Method Entry callback.
- * @param methodId : method Id.
- * @see org.apache.felix.ipojo.Handler#entryCallback(java.lang.String)
- */
- public void entryCallback(String methodId) {
- for (int i = 0; i < m_dependencies.length; i++) {
- Dependency dep = m_dependencies[i];
- if (dep.getField() != null) {
- dep.entry(methodId);
+ if (atLeastOneField) { // Does register only if we have fields
+ MethodMetadata[] methods = manipulation.getMethods();
+ for (int i = 0; i < methods.length; i++) {
+ for (int j = 0; j < m_dependencies.length; j++) {
+ getInstanceManager().register(methods[i], m_dependencies[j]);
+ }
}
}
}
- /**
- * Method Exit callback.
- * @param methodId : method id.
- * @param returnedObj : returned object.
- * @see org.apache.felix.ipojo.Handler#exitCallback(java.lang.String, java.lang.Object)
- */
- public void exitCallback(String methodId, Object returnedObj) {
- for (int i = 0; i < m_dependencies.length; i++) {
- Dependency dep = m_dependencies[i];
- if (dep.getField() != null) {
- dep.exit(methodId);
- }
- }
- }
+// /**
+// * GetterCallback Method.
+// * @param pojo : the pojo object on which the field is accessed
+// * @param fieldName : the field name.
+// * @param value : the value passed to the field (by the previous handler).
+// * @return the object that the dependency handler want to push.
+// * @see org.apache.felix.ipojo.Handler#onGet(Object, java.lang.String, java.lang.Object)
+// */
+// public Object onGet(Object pojo, String fieldName, Object value) {
+// for (int i = 0; i < m_dependencies.length; i++) {
+// Dependency dep = m_dependencies[i];
+// if (fieldName.equals(dep.getField())) {
+// // The field name is a dependency, return the get
+// return dep.get();
+// }
+// }
+// // Else return the value
+// return value;
+// }
/**
* Handler start method.
@@ -358,6 +394,7 @@
}
// Check the state
m_started = true;
+ setValidity(false);
checkContext();
}
@@ -373,27 +410,13 @@
}
/**
- * Handler createInstance method.
- * This method is override to allow delayed callback invocation.
+ * Handler createInstance method. This method is override to allow delayed callback invocation.
* @param instance : the created object
- * @see org.apache.felix.ipojo.Handler#objectCreated(java.lang.Object)
+ * @see org.apache.felix.ipojo.Handler#onCreation(java.lang.Object)
*/
- public void objectCreated(Object instance) {
+ public void onCreation(Object instance) {
for (int i = 0; i < m_dependencies.length; i++) {
- m_dependencies[i].callBindMethod(instance);
- }
- }
-
- /**
- * The instance state changes. If the new state is valid, we need to activate dependencies.
- * @param state : the new state
- * @see org.apache.felix.ipojo.Handler#stateChanged(int)
- */
- public void stateChanged(int state) {
- if (state == ComponentInstance.VALID) {
- for (int i = 0; i < m_dependencies.length; i++) {
- m_dependencies[i].activate();
- }
+ m_dependencies[i].onObjectCreation(instance);
}
}
@@ -407,10 +430,11 @@
for (int j = 0; j < getDependencies().length; j++) {
Dependency dep = getDependencies()[j];
// Create & add the dependency description
- DependencyDescription dd = new DependencyDescription(dep.getSpecification(), dep.isAggregate(), dep.isOptional(), dep.getFilter(), dep.getState());
- dd.setServiceReferences(dep.getServiceReferences());
- dd.setUsedServices(dep.getUsedServices());
- dhd.addDependency(dd);
+ DependencyDescription desc =
+ new DependencyDescription(dep.getSpecification().getName(), dep.isAggregate(), dep.isOptional(), dep.getFilter(), dep.getState());
+ desc.setServiceReferences(dep.getServiceReferencesAsList());
+ desc.setUsedServices(dep.getUsedServiceReferences());
+ dhd.addDependency(desc);
}
return dhd;
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
index 1615521..aaf5baa 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/DependencyHandlerDescription.java
@@ -42,10 +42,10 @@
/**
* Constructor.
- * @param h : Handler.
+ * @param handler : Handler.
*/
- public DependencyHandlerDescription(Handler h) {
- super(h);
+ public DependencyHandlerDescription(Handler handler) {
+ super(handler);
}
/**
@@ -94,7 +94,7 @@
Element dep = new Element("Requires", "");
dep.addAttribute(new Attribute("Specification", m_dependencies[i].getInterface()));
- if (!"".equals(m_dependencies[i].getFilter())) {
+ if (m_dependencies[i].getFilter() != null) {
dep.addAttribute(new Attribute("Filter", m_dependencies[i].getFilter()));
}
@@ -112,16 +112,18 @@
dep.addAttribute(new Attribute("State", state));
List set = m_dependencies[i].getUsedServices();
- Iterator it = set.iterator();
- while (it.hasNext()) {
- Element use = new Element("Uses", "");
- ServiceReference ref = (ServiceReference) it.next();
- use.addAttribute(new Attribute("service.id", ref.getProperty(Constants.SERVICE_ID).toString()));
- String in = (String) ref.getProperty("instance.name");
- if (in != null) {
- use.addAttribute(new Attribute("instance.name", in));
+ if (set != null) {
+ Iterator iterator = set.iterator();
+ while (iterator.hasNext()) {
+ Element use = new Element("Uses", "");
+ ServiceReference ref = (ServiceReference) iterator.next();
+ use.addAttribute(new Attribute("service.id", ref.getProperty(Constants.SERVICE_ID).toString()));
+ String instance = (String) ref.getProperty("instance.name");
+ if (instance != null) {
+ use.addAttribute(new Attribute("instance.name", instance));
+ }
+ dep.addElement(use);
}
- dep.addElement(use);
}
deps.addElement(dep);
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/NullableObject.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/NullableObject.java
index e0e4900..b11419f 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/NullableObject.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/NullableObject.java
@@ -26,41 +26,42 @@
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class NullableObject implements InvocationHandler {
-
+
/**
* Default boolean value.
*/
private static final Boolean DEFAULT_BOOLEAN = Boolean.FALSE;
+
/**
* Default byte value.
*/
private static final Byte DEFAULT_BYTE = new Byte((byte) 0);
-
+
/**
* Default short value.
*/
private static final Short DEFAULT_SHORT = new Short((short) 0);
-
+
/**
* Default integer value.
*/
private static final Integer DEFAULT_INT = new Integer(0);
-
+
/**
* Default long value.
*/
private static final Long DEFAULT_LONG = new Long(0);
-
+
/**
* Default float value.
*/
private static final Float DEFAULT_FLOAT = new Float(0.0f);
-
+
/**
* Default double value.
*/
private static final Double DEFAULT_DOUBLE = new Double(0.0);
-
+
/**
* Invokes a method on this null object. The method will return a default
* value without doing anything.
@@ -72,19 +73,19 @@
*/
public Object invoke(Object proxy, Method method, Object[] args) {
Class returnType = method.getReturnType();
- if (returnType.equals(Boolean.TYPE)) {
+ if (Boolean.TYPE.equals(returnType)) {
return DEFAULT_BOOLEAN;
- } else if (returnType.equals(Byte.TYPE)) {
+ } else if (Byte.TYPE.equals(returnType)) {
return DEFAULT_BYTE;
- } else if (returnType.equals(Short.TYPE)) {
+ } else if (Short.TYPE.equals(returnType)) {
return DEFAULT_SHORT;
- } else if (returnType.equals(Integer.TYPE)) {
+ } else if (Integer.TYPE.equals(returnType)) {
return DEFAULT_INT;
- } else if (returnType.equals(Long.TYPE)) {
+ } else if (Long.TYPE.equals(returnType)) {
return DEFAULT_LONG;
- } else if (returnType.equals(Float.TYPE)) {
+ } else if (Float.TYPE.equals(returnType)) {
return DEFAULT_FLOAT;
- } else if (returnType.equals(Double.TYPE)) {
+ } else if (Double.TYPE.equals(returnType)) {
return DEFAULT_DOUBLE;
} else {
return null;
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/ServiceUsage.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/ServiceUsage.java
index 822910b..7d289f1 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/ServiceUsage.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/dependency/ServiceUsage.java
@@ -18,8 +18,6 @@
*/
package org.apache.felix.ipojo.handlers.dependency;
-import java.util.ArrayList;
-import java.util.List;
/**
* Object managing thread local copy of required services.
@@ -31,19 +29,40 @@
/**
* Structure contained in the Thread Local.
*/
- private class Usage {
+ public class Usage {
+
/**
* Stack Size.
*/
- Integer m_stack = new Integer(0);
- /**
- * List of used service references.
- */
- List m_refs = new ArrayList();
+ int m_stack = 0;
/**
* List of used objects.
*/
- List m_objects = new ArrayList();
+ Object[] m_objects;
+
+ /**
+ * Increment the statck level.
+ */
+ public void inc() {
+ m_stack++;
+ }
+
+ /**
+ * Decrement the stack level.
+ * @return true if the stack is 0 after the decrement.
+ */
+ public boolean dec() {
+ m_stack--;
+ return m_stack == 0;
+ }
+
+ /**
+ * Clear the service object array.
+ */
+ public void clear() {
+ m_objects = null;
+ }
+
}
/**
@@ -53,45 +72,6 @@
*/
public Object initialValue() {
return new Usage();
- }
-
- /**
- * Get the list of stored references.
- * @return the list of stored references.
- */
- public List getReferences() {
- Usage use = (Usage) super.get();
- return use.m_refs;
- }
-
- /**
- * Get the lost of stored object.
- * @return the list of stored service objects.
- */
- public List getObjects() {
- Usage use = (Usage) super.get();
- return use.m_objects;
- }
-
- /**
- * Get the stack level.
- * @return the stack level.
- */
- public int getStackLevel() {
- Usage use = (Usage) super.get();
- return use.m_stack.intValue();
- }
-
- /**
- * Set the stack level.
- * @param level : the new stack level.
- */
- public void setStackLevel(int level) {
- Usage use = (Usage) super.get();
- use.m_stack = new Integer(level);
- }
-
-
-
+ }
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallback.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallback.java
index 15db443..cd86798 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallback.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallback.java
@@ -53,29 +53,29 @@
/**
* LifecycleCallback constructor.
*
- * @param hh : the callback handler calling the callback
+ * @param handler : the callback handler calling the callback
* @param transition : transition on which calling the callback
- * @param mm : method metadata to invoke
+ * @param method : method metadata to invoke
*/
- public LifecycleCallback(LifecycleCallbackHandler hh, int transition, MethodMetadata mm) {
+ public LifecycleCallback(LifecycleCallbackHandler handler, int transition, MethodMetadata method) {
m_transition = transition;
- m_callback = new Callback(mm, hh.getInstanceManager());
+ m_callback = new Callback(method, handler.getInstanceManager());
}
/**
* LifecycleCallback constructor.
*
- * @param hh : the callback handler calling the callback
+ * @param handler : the callback handler calling the callback
* @param transition : transition on which calling the callback
- * @param mm : method name to invoke
+ * @param method : method name to invoke
*/
- public LifecycleCallback(LifecycleCallbackHandler hh, int transition, String mm) {
+ public LifecycleCallback(LifecycleCallbackHandler handler, int transition, String method) {
m_transition = transition;
- m_callback = new Callback(mm, new String[0], false, hh.getInstanceManager());
+ m_callback = new Callback(method, new String[0], false, handler.getInstanceManager());
}
/**
- * Call the callback method when the transition from inital to final state is
+ * Call the callback method when the transition from inital tostate is
* detected.
*
* @throws NoSuchMethodException : Method is not found in the class
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java
index 7b153ef..85ca69a 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/callback/LifecycleCallbackHandler.java
@@ -26,9 +26,8 @@
import org.apache.felix.ipojo.InstanceManager;
import org.apache.felix.ipojo.PrimitiveHandler;
import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.parser.ManipulationMetadata;
import org.apache.felix.ipojo.parser.MethodMetadata;
-import org.apache.felix.ipojo.util.Logger;
+import org.apache.felix.ipojo.parser.PojoMetadata;
/**
* Lifecycle callback handler.
@@ -54,11 +53,11 @@
/**
* Add the given callback to the callback list.
*
- * @param hk : the element to add
+ * @param callback : the element to add
*/
- private void addCallback(LifecycleCallback hk) {
+ private void addCallback(LifecycleCallback callback) {
for (int i = 0; (m_callbacks != null) && (i < m_callbacks.length); i++) {
- if (m_callbacks[i] == hk) {
+ if (m_callbacks[i] == callback) {
return;
}
}
@@ -66,10 +65,10 @@
if (m_callbacks.length > 0) {
LifecycleCallback[] newHk = new LifecycleCallback[m_callbacks.length + 1];
System.arraycopy(m_callbacks, 0, newHk, 0, m_callbacks.length);
- newHk[m_callbacks.length] = hk;
+ newHk[m_callbacks.length] = callback;
m_callbacks = newHk;
} else {
- m_callbacks = new LifecycleCallback[] { hk };
+ m_callbacks = new LifecycleCallback[] { callback };
}
}
@@ -87,38 +86,38 @@
String imm = metadata.getAttribute("immediate");
m_immediate = imm != null && imm.equalsIgnoreCase("true");
- ManipulationMetadata mm = new ManipulationMetadata(metadata);
+ PojoMetadata meta = getFactory().getPojoMetadata();
Element[] hooksMetadata = metadata.getElements("callback");
- for (int i = 0; i < hooksMetadata.length; i++) {
+ for (int i = 0; hooksMetadata != null && i < hooksMetadata.length; i++) {
String method = hooksMetadata[i].getAttribute("method");
if (method == null) {
throw new ConfigurationException("Lifecycle callback : A callback needs to contains a method attribute");
}
- MethodMetadata met = mm.getMethod(method, new String[0]);
+ MethodMetadata met = meta.getMethod(method, new String[0]);
int transition = -1;
String trans = hooksMetadata[i].getAttribute("transition");
- if (trans != null) {
+ if (trans == null) {
+ throw new ConfigurationException("Lifecycle callback : the transition attribute is missing");
+ } else {
if (trans.equalsIgnoreCase("validate")) {
transition = LifecycleCallback.VALIDATE;
} else if (trans.equalsIgnoreCase("invalidate")) {
transition = LifecycleCallback.INVALIDATE;
} else {
- throw new ConfigurationException("Lifecycle callback : Unknown or malformed transition : " + transition);
+ throw new ConfigurationException("Lifecycle callback : Unknown or malformed transition : " + trans);
}
- } else {
- throw new ConfigurationException("Lifecycle callback : Unknown or malformed transition");
}
- LifecycleCallback hk = null;
- if (met != null) {
- hk = new LifecycleCallback(this, transition, met);
+ LifecycleCallback callback = null;
+ if (met == null) {
+ callback = new LifecycleCallback(this, transition, method);
} else {
- hk = new LifecycleCallback(this, transition, method);
+ callback = new LifecycleCallback(this, transition, met);
}
- addCallback(hk);
+ addCallback(callback);
}
}
@@ -127,7 +126,8 @@
* @see org.apache.felix.ipojo.Handler#start()
*/
public void start() {
- } // Do nothing during the start
+ // Do nothing during the start
+ }
/**
* Stop the handler.
@@ -162,13 +162,13 @@
try {
m_callbacks[i].call();
} catch (NoSuchMethodException e) {
- log(Logger.ERROR, "[" + getInstanceManager().getInstanceName() + "] The callback method " + m_callbacks[i].getMethod() + " is not found", e);
- getInstanceManager().stop();
+ error("[" + getInstanceManager().getInstanceName() + "] The callback method " + m_callbacks[i].getMethod() + " is not found");
+ throw new IllegalStateException(e.getMessage());
} catch (IllegalAccessException e) {
- log(Logger.ERROR, "[" + getInstanceManager().getInstanceName() + "] The callback method " + m_callbacks[i].getMethod() + " is not accessible", e);
- getInstanceManager().stop();
+ error("[" + getInstanceManager().getInstanceName() + "] The callback method " + m_callbacks[i].getMethod() + " is not accessible");
+ throw new IllegalStateException(e.getMessage());
} catch (InvocationTargetException e) {
- log(Logger.ERROR, "[" + getInstanceManager().getInstanceName() + "] The callback method " + m_callbacks[i].getMethod() + " has throws an exception : " + e.getTargetException().getMessage());
+ error("[" + getInstanceManager().getInstanceName() + "] The callback method " + m_callbacks[i].getMethod() + " has throws an exception : " + e.getTargetException().getMessage(), e.getTargetException());
getInstanceManager().setState(ComponentInstance.INVALID);
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/controller/ControllerHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/controller/ControllerHandler.java
index 41b7250..6d00b3b 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/controller/ControllerHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/lifecycle/controller/ControllerHandler.java
@@ -24,11 +24,10 @@
import org.apache.felix.ipojo.ConfigurationException;
import org.apache.felix.ipojo.InstanceManager;
import org.apache.felix.ipojo.PrimitiveHandler;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.parser.FieldMetadata;
-import org.apache.felix.ipojo.parser.ManipulationMetadata;
-import org.apache.felix.ipojo.util.Logger;
+import org.apache.felix.ipojo.parser.PojoMetadata;
/**
* Lifecycle Controller handler.
@@ -51,9 +50,9 @@
* @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.InstanceManager, org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
*/
public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
- Element[] lc = metadata.getElements("controller");
- String field = lc[0].getAttribute("field");
- getInstanceManager().register(this, new FieldMetadata[] {new FieldMetadata(field, "boolean")}, null);
+ Element[] controller = metadata.getElements("controller");
+ String field = controller[0].getAttribute("field");
+ getInstanceManager().register(new FieldMetadata(field, "boolean"), this);
}
/**
@@ -70,38 +69,42 @@
* Nothing to do.
* @see org.apache.felix.ipojo.Handler#stop()
*/
- public void stop() { }
+ public void stop() {
+ // Nothing to do.
+ }
/**
* GetterCallback.
+ * @param pojo : the pojo object on which the field is accessed
* Return the stored value.
* @param field : field name.
- * @param o : value given by the previous handler.
+ * @param value : value given by the previous handler.
* @return : the handler state.
*/
- public Object getterCallback(String field, Object o) {
+ public Object onGet(Object pojo, String field, Object value) {
return new Boolean(m_state);
}
/**
* SetterCallback.
+ * @param pojo : the pojo object on which the field is accessed
* Store the new field value & invalidate / validate the handler is required.
* @param field : field name.
- * @param o : new value.
+ * @param value : new value.
*/
- public void setterCallback(String field, Object o) {
- if (o instanceof Boolean) {
- boolean nv = ((Boolean) o).booleanValue();
- if (nv != m_state) {
- m_state = nv;
+ public void onSet(Object pojo, String field, Object value) {
+ if (value instanceof Boolean) {
+ boolean newValue = ((Boolean) value).booleanValue();
+ if (newValue != m_state) {
+ m_state = newValue;
if (m_state) {
- ((InstanceManager) getInstance()).setState(ComponentInstance.VALID);
+ ((InstanceManager) getHandlerManager()).setState(ComponentInstance.VALID);
} else {
- ((InstanceManager) getInstance()).setState(ComponentInstance.INVALID);
+ ((InstanceManager) getHandlerManager()).setState(ComponentInstance.INVALID);
}
}
} else {
- log(Logger.ERROR, "Boolean expected for the lifecycle controller");
+ error("Boolean expected for the lifecycle controller");
getInstanceManager().stop();
}
}
@@ -109,28 +112,28 @@
/**
* Initialize the component factory.
* The controller field is checked to avoid configure check.
- * @param cd : component description
+ * @param desc : component description
* @param metadata : component type metadata
* @throws ConfigurationException : occurs if the controller field is not in the POJO class or is not a boolean.
- * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentDescription, org.apache.felix.ipojo.metadata.Element)
+ * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentTypeDescription, org.apache.felix.ipojo.metadata.Element)
*/
- public void initializeComponentFactory(ComponentDescription cd, Element metadata) throws ConfigurationException {
+ public void initializeComponentFactory(ComponentTypeDescription desc, Element metadata) throws ConfigurationException {
String field = null;
- Element[] lc = metadata.getElements("controller");
+ Element[] controller = metadata.getElements("controller");
// Use only the first controller
- field = lc[0].getAttribute("field");
+ field = controller[0].getAttribute("field");
if (field == null) {
throw new ConfigurationException("Lifecycle controller : the controller element needs to have a field attribute");
}
- ManipulationMetadata mm = new ManipulationMetadata(metadata);
- FieldMetadata fm = mm.getField(field);
- if (fm == null) {
+ PojoMetadata method = getFactory().getPojoMetadata();
+ FieldMetadata fieldMetadata = method.getField(field);
+ if (fieldMetadata == null) {
throw new ConfigurationException("Lifecycle controller : The field " + field + " does not exist in the class");
}
- if (!fm.getFieldType().equalsIgnoreCase("boolean")) {
- throw new ConfigurationException("Lifecycle controller : The field " + field + " must be a boolean (" + fm.getFieldType() + " found)");
+ if (!fieldMetadata.getFieldType().equalsIgnoreCase("boolean")) {
+ throw new ConfigurationException("Lifecycle controller : The field " + field + " must be a boolean (" + fieldMetadata.getFieldType() + " found)");
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java
deleted file mode 100644
index f6b3b6f..0000000
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/Property.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * 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.handlers.providedservice;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
-import org.apache.felix.ipojo.ComponentInstance;
-import org.apache.felix.ipojo.parser.ParseUtils;
-import org.apache.felix.ipojo.util.Logger;
-
-/**
- * Represent a property i.e. a set : [name, type, value]. A property can be
- * attached to a field. The value of the property is thefield value. When the
- * value change, the published value change too.
- *
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class Property {
-
- /**
- * A property is link with a service. This field represent this provided
- * service. m_providedService : ProvidedService
- */
- private ProvidedService m_providedService;
-
- /**
- * Value of the property (before we know the type).
- */
- private Object m_value;
-
- /**
- * Field of the property.
- */
- private String m_field;
-
- /**
- * Name of the property.
- */
- private String m_name;
-
- /**
- * Type of the property.
- */
- private String m_type;
-
- /**
- * String value of the property (initial value).
- */
- private String m_initialValue;
-
- /**
- * Property constructor.
- *
- * @param ps : the provided service
- * @param name : name of the property
- * @param field : name of the field (if a field is attached to the property)
- * @param type : type of the property
- * @param value : initial value of the property
- */
- public Property(ProvidedService ps, String name, String field, String type, String value) {
- m_providedService = ps;
- m_name = name;
- m_field = field;
- m_type = type;
- m_initialValue = value;
-
- // Dynamic property case :
- if (m_field != null && m_name == null) {
- m_name = m_field;
- }
-
- if (m_initialValue != null) {
- setValue(m_initialValue);
- }
- }
-
- /**
- * Property constructor. This constructor is used only for non-field
- * property (property not attached to a field).
- *
- * @param ps : the provided service
- * @param name : the name of the property
- * @param value : the value of the property
- */
- public Property(ProvidedService ps, String name, Object value) {
- m_providedService = ps;
- m_name = name;
- m_type = value.getClass().getName();
- m_value = value;
- }
-
- /**
- * Get the property value.
- * @return the Object value of the property
- */
- protected Object get() {
- return m_value;
- }
-
- /**
- * This method is automaticaly called when the value of the property is
- * changed. Set the value of a property.
- *
- * @param s : the new value of the property (in String)
- */
- protected void set(String s) {
- setValue(s);
- }
-
- /**
- * This method is called when the value of the property is changed. Set the
- * value of a property.
- *
- * @param o : the new value of the property (object)
- */
- protected void set(Object o) {
- // Is the object is directly assignable to the property, affect it.
- if (!(o instanceof String) || m_type.equals("java.lang.String")) {
- m_value = o;
- } else {
- // If the object is a String, we must recreate the object from the String form
- if (o instanceof String) {
- setValue((String) o);
- } else {
- // Error, the given property cannot be injected.
- throw new ClassCastException("Incompatible type for the property " + m_name + " " + m_type + " expected");
- }
- }
- }
-
- /**
- * Set the provided service of this property.
- *
- * @param ps : the provided service to attached.
- */
- void setProvidedService(ProvidedService ps) {
- m_providedService = ps;
- }
-
- /**
- * Set the value of the property.
- *
- * @param value : value of the property (String)
- */
- private void setValue(String value) {
-
- // Array :
- if (m_type.endsWith("[]")) {
- String internalType = m_type.substring(0, m_type.length() - 2);
- setArrayValue(internalType, ParseUtils.parseArrays(value));
- return;
- }
-
- // Simple :
- if ("string".equals(m_type) || "String".equals(m_type)) {
- m_value = new String(value);
- return;
- }
- if ("boolean".equals(m_type)) {
- m_value = new Boolean(value);
- return;
- }
- if ("byte".equals(m_type)) {
- m_value = new Byte(value);
- return;
- }
- if ("short".equals(m_type)) {
- m_value = new Short(value);
- return;
- }
- if ("int".equals(m_type)) {
- m_value = new Integer(value);
- return;
- }
- if ("long".equals(m_type)) {
- m_value = new Long(value);
- return;
- }
- if ("float".equals(m_type)) {
- m_value = new Float(value);
- return;
- }
- if ("double".equals(m_type)) {
- m_value = new Double(value);
- return;
- }
-
- // Else it is a neither a primitive type neither a String -> create the
- // object by calling a constructor with a string in argument.
- try {
- Class c = m_providedService.getInstanceManager().getContext().getBundle().loadClass(m_type);
- // Class string =
- // m_providedService.getComponentManager().getContext().getBundle().loadClass("java.lang.String");
- Constructor cst = c.getConstructor(new Class[] { String.class });
- m_value = cst.newInstance(new Object[] { value });
- } catch (ClassNotFoundException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Class not found exception in setValue on " + m_type);
- m_providedService.getInstanceManager().stop();
- } catch (SecurityException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Security Exception in setValue on " + m_type);
- m_providedService.getInstanceManager().stop();
- } catch (NoSuchMethodException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Constructor not found exeption in setValue on " + m_type);
- m_providedService.getInstanceManager().stop();
- } catch (IllegalArgumentException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Argument problem to call the constructor of the type " + m_type);
- m_providedService.getInstanceManager().stop();
- } catch (InstantiationException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Instantiation problem " + m_type);
- m_providedService.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Illegal Access Exception in setValue on " + m_type);
- m_providedService.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Invocation problem " + m_type + " : " + e.getTargetException().getMessage());
- m_providedService.getInstanceManager().setState(ComponentInstance.INVALID);
- }
- }
-
- /**
- * Set a array value to the current property.
- *
- * @param internalType : internal array type
- * @param values : the new value
- */
- private void setArrayValue(String internalType, String[] values) {
- if ("string".equals(internalType) || "String".equals(internalType)) {
- m_value = values;
- return;
- }
- if ("boolean".equals(internalType)) {
- boolean[] bool = new boolean[values.length];
- for (int i = 0; i < values.length; i++) {
- bool[i] = new Boolean(values[i]).booleanValue();
- }
- m_value = bool;
- return;
- }
- if ("byte".equals(internalType)) {
- byte[] byt = new byte[values.length];
- for (int i = 0; i < values.length; i++) {
- byt[i] = new Byte(values[i]).byteValue();
- }
- m_value = byt;
- return;
- }
- if ("short".equals(internalType)) {
- short[] shor = new short[values.length];
- for (int i = 0; i < values.length; i++) {
- shor[i] = new Short(values[i]).shortValue();
- }
- m_value = shor;
- return;
- }
- if ("int".equals(internalType)) {
- int[] in = new int[values.length];
- for (int i = 0; i < values.length; i++) {
- in[i] = new Integer(values[i]).intValue();
- }
- m_value = in;
- return;
- }
- if ("long".equals(internalType)) {
- long[] ll = new long[values.length];
- for (int i = 0; i < values.length; i++) {
- ll[i] = new Long(values[i]).longValue();
- }
- m_value = ll;
- return;
- }
- if ("float".equals(internalType)) {
- float[] fl = new float[values.length];
- for (int i = 0; i < values.length; i++) {
- fl[i] = new Float(values[i]).floatValue();
- }
- m_value = fl;
- return;
- }
- if ("double".equals(internalType)) {
- double[] dl = new double[values.length];
- for (int i = 0; i < values.length; i++) {
- dl[i] = new Double(values[i]).doubleValue();
- }
- m_value = dl;
- return;
- }
-
- // Else it is a neither a primitive type neither a String -> create the
- // object by calling a constructor with a string in argument.
- try {
- Class c = m_providedService.getInstanceManager().getContext().getBundle().loadClass(internalType);
- Constructor cst = c.getConstructor(new Class[] { String.class });
- Object[] ob = (Object[]) Array.newInstance(c, values.length);
- for (int i = 0; i < values.length; i++) {
- ob[i] = cst.newInstance(new Object[] { values[i] });
- }
- m_value = ob;
- return;
- } catch (ClassNotFoundException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Class not found exception in setArrayValue on " + internalType);
- m_providedService.getInstanceManager().stop();
- } catch (SecurityException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Security Exception in setArrayValue on " + internalType);
- m_providedService.getInstanceManager().stop();
- } catch (NoSuchMethodException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Constructor not found exception in setArrayValue on " + internalType);
- m_providedService.getInstanceManager().stop();
- } catch (IllegalArgumentException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Argument problem to call the constructor of the type " + internalType);
- m_providedService.getInstanceManager().stop();
- } catch (InstantiationException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Instantiation problem " + internalType);
- m_providedService.getInstanceManager().stop();
- } catch (IllegalAccessException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Illegal Access Exception in setArrayValue on " + internalType);
- m_providedService.getInstanceManager().stop();
- } catch (InvocationTargetException e) {
- m_providedService.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Invocation problem " + internalType + " : " + e.getTargetException().getMessage());
- m_providedService.getInstanceManager().setState(ComponentInstance.INVALID);
- }
- }
-
- /**
- * Get the stored value.
- * @return the value of the property.
- */
- public Object getValue() {
- return m_value;
- }
-
- /**
- * Get the property name.
- * @return the name of the property
- */
- public String getName() {
- return m_name;
- }
-
- /**
- * Get the property field.
- * @return the field name of the property (null if the property has no
- * field).
- */
- protected String getField() {
- return m_field;
- }
-
- /**
- * Set the type of the property.
- *
- * @param type : the type to attached to the property
- */
- public void setType(String type) {
- m_type = type;
- }
-
- /**
- * Get the property type.
- * @return the type of the property.
- */
- public String getType() {
- return m_type;
- }
-
- /**
- * Get the property initial value.
- * @return the initial value of the property.
- */
- public String getInitialValue() {
- return m_initialValue;
- }
-
-}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
index ee1248a..4f1d52c 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
@@ -22,8 +22,9 @@
import java.util.Enumeration;
import java.util.Properties;
+import org.apache.felix.ipojo.ConfigurationException;
import org.apache.felix.ipojo.InstanceManager;
-import org.apache.felix.ipojo.util.Logger;
+import org.apache.felix.ipojo.util.Property;
import org.osgi.framework.Bundle;
import org.osgi.framework.ServiceFactory;
import org.osgi.framework.ServiceReference;
@@ -55,6 +56,11 @@
* Factory policy : SERVICE_FACTORY.
*/
public static final int SERVICE_FACTORY = 1;
+
+ /**
+ * Factory policy : STATIC_FACTORY.
+ */
+ public static final int STATIC_FACTORY = 2;
/**
* At this time, it is only the java interface full name.
@@ -80,7 +86,7 @@
/**
* Properties Array.
*/
- private Property[] m_properties = new Property[0];
+ private Property[] m_properties;
/**
* Construct a provided service object.
@@ -96,8 +102,12 @@
m_factoryPolicy = factoryPolicy;
// Add instance name & factory name
- addProperty(new Property(this, "instance.name", handler.getInstanceManager().getInstanceName()));
- addProperty(new Property(this, "factory.name", handler.getInstanceManager().getFactory().getName()));
+ try {
+ addProperty(new Property("instance.name", null, null, handler.getInstanceManager().getInstanceName(), String.class.getName(), handler.getInstanceManager(), handler));
+ addProperty(new Property("factory.name", null, null, handler.getInstanceManager().getFactory().getFactoryName(), String.class.getName(), handler.getInstanceManager(), handler));
+ } catch (ConfigurationException e) {
+ m_handler.error("An exception occurs when adding instance.name and factory.name property : " + e.getMessage());
+ }
}
/**
@@ -113,22 +123,22 @@
/**
* Add the given property to the property list.
*
- * @param p : the element to add
+ * @param prop : the element to add
*/
- private synchronized void addProperty(Property p) {
+ private synchronized void addProperty(Property prop) {
for (int i = 0; (m_properties != null) && (i < m_properties.length); i++) {
- if (m_properties[i] == p) {
+ if (m_properties[i] == prop) {
return;
}
}
- if (m_properties.length > 0) {
+ if (m_properties == null) {
+ m_properties = new Property[] { prop };
+ } else {
Property[] newProp = new Property[m_properties.length + 1];
System.arraycopy(m_properties, 0, newProp, 0, m_properties.length);
- newProp[m_properties.length] = p;
+ newProp[m_properties.length] = prop;
m_properties = newProp;
- } else {
- m_properties = new Property[] { p };
}
}
@@ -148,7 +158,7 @@
if (idx >= 0) {
if ((m_properties.length - 1) == 0) {
- m_properties = new Property[0];
+ m_properties = null;
} else {
Property[] newPropertiesList = new Property[m_properties.length - 1];
System.arraycopy(m_properties, 0, newPropertiesList, 0, idx);
@@ -166,10 +176,10 @@
* service is not published).
*/
public ServiceReference getServiceReference() {
- if (m_serviceRegistration != null) {
- return m_serviceRegistration.getReference();
- } else {
+ if (m_serviceRegistration == null) {
return null;
+ } else {
+ return m_serviceRegistration.getReference();
}
}
@@ -189,9 +199,14 @@
case SERVICE_FACTORY:
svc = m_handler.getInstanceManager().createPojoObject();
break;
+ case STATIC_FACTORY:
+ // In this case, we need to try to create a new pojo object, the factory method will handle the creation.
+ svc = m_handler.getInstanceManager().createPojoObject();
+ break;
default:
- m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "[" + m_handler.getInstanceManager().getClassName() + "] Unknown factory policy for " + m_serviceSpecification + " : " + m_factoryPolicy);
+ m_handler.error("[" + m_handler.getInstanceManager().getClassName() + "] Unknown factory policy for " + m_serviceSpecification + " : " + m_factoryPolicy);
getInstanceManager().stop();
+ break;
}
return svc;
}
@@ -258,8 +273,8 @@
// Contruct the service properties list
Properties serviceProperties = new Properties();
for (int i = 0; i < m_properties.length; i++) {
- if (m_properties[i].get() != null) {
- serviceProperties.put(m_properties[i].getName(), m_properties[i].get());
+ if (m_properties[i].getValue() != null) {
+ serviceProperties.put(m_properties[i].getName(), m_properties[i].getValue());
}
}
return serviceProperties;
@@ -278,18 +293,9 @@
* the service registry.
*/
public synchronized void update() {
- // Contruct the service properties list
- Properties serviceProperties = getServiceProperties();
-
- if (serviceProperties == null) {
- m_handler.getInstanceManager().getFactory().getLogger().log(Logger.ERROR, "Cannot get the properties of the provided service");
- getInstanceManager().stop();
- return;
- }
-
// Update the service registration
if (m_serviceRegistration != null) {
- m_serviceRegistration.setProperties(serviceProperties);
+ m_serviceRegistration.setProperties(getServiceProperties());
}
}
@@ -302,8 +308,13 @@
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
Object value = props.get(key);
- Property prop = new Property(this, key, value);
- addProperty(prop);
+ Property prop;
+ try {
+ prop = new Property(key, null, null, value.toString(), value.getClass().getName(), getInstanceManager(), m_handler);
+ addProperty(prop);
+ } catch (ConfigurationException e) {
+ m_handler.error("The propagated property " + key + " cannot be pcreated correctly : " + e.getMessage());
+ }
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
index 59f2cda..d8fe68a 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceDescription.java
@@ -69,13 +69,13 @@
*
* @param serviceSpecification : the provided contract
* @param state : state (UNREGITRED | REGISTRED)
- * @param sr : Service Registration (to obtain the reference), or null if
+ * @param ref : Service Registration (to obtain the reference), or null if
* state is UNREGISTRED
*/
- public ProvidedServiceDescription(String[] serviceSpecification, int state, ServiceReference sr) {
+ public ProvidedServiceDescription(String[] serviceSpecification, int state, ServiceReference ref) {
m_serviceSpecification = serviceSpecification;
m_state = state;
- m_serviceReference = sr;
+ m_serviceReference = ref;
// m_parent = parent;
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
index a791797..1fc3e1d 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandler.java
@@ -19,7 +19,6 @@
package org.apache.felix.ipojo.handlers.providedservice;
import java.lang.reflect.Field;
-import java.util.ArrayList;
import java.util.Dictionary;
import java.util.HashSet;
import java.util.Iterator;
@@ -28,10 +27,10 @@
import java.util.Set;
import org.apache.felix.ipojo.ConfigurationException;
-import org.apache.felix.ipojo.IPojoConfiguration;
+import org.apache.felix.ipojo.HandlerFactory;
import org.apache.felix.ipojo.InstanceManager;
import org.apache.felix.ipojo.PrimitiveHandler;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.architecture.HandlerDescription;
import org.apache.felix.ipojo.architecture.PropertyDescription;
import org.apache.felix.ipojo.handlers.dependency.Dependency;
@@ -40,9 +39,10 @@
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.parser.FieldMetadata;
import org.apache.felix.ipojo.parser.ManifestMetadataParser;
-import org.apache.felix.ipojo.parser.ManipulationMetadata;
import org.apache.felix.ipojo.parser.ParseException;
import org.apache.felix.ipojo.parser.ParseUtils;
+import org.apache.felix.ipojo.parser.PojoMetadata;
+import org.apache.felix.ipojo.util.Property;
import org.osgi.framework.Bundle;
/**
@@ -60,21 +60,21 @@
/**
* Add a provided service to the list .
*
- * @param ps : the provided service to add
+ * @param svc : the provided service to add
*/
- private void addProvidedService(ProvidedService ps) {
+ private void addProvidedService(ProvidedService svc) {
// Verify that the provided service is not already in the array.
for (int i = 0; (m_providedServices != null) && (i < m_providedServices.length); i++) {
- if (m_providedServices[i] == ps) { return; }
+ if (m_providedServices[i] == svc) { return; }
}
if (m_providedServices.length > 0) {
ProvidedService[] newPS = new ProvidedService[m_providedServices.length + 1];
System.arraycopy(m_providedServices, 0, newPS, 0, m_providedServices.length);
- newPS[m_providedServices.length] = ps;
+ newPS[m_providedServices.length] = svc;
m_providedServices = newPS;
} else {
- m_providedServices = new ProvidedService[] { ps };
+ m_providedServices = new ProvidedService[] { svc };
}
}
@@ -97,7 +97,6 @@
m_providedServices = new ProvidedService[0];
// Create the dependency according to the component metadata
Element[] providedServices = componentMetadata.getElements("Provides");
- List fields = new ArrayList();
for (int i = 0; i < providedServices.length; i++) {
String[] serviceSpecifications = ParseUtils.parseArrays(providedServices[i].getAttribute("interface")); // Set by the initialize component factory.
@@ -107,62 +106,54 @@
if (fact != null && "service".equalsIgnoreCase(fact)) {
factory = ProvidedService.SERVICE_FACTORY;
}
-
- // Then create the provided service
- ProvidedService ps = new ProvidedService(this, serviceSpecifications, factory);
-
- Element[] props = providedServices[i].getElements("Property");
- Property[] properties = new Property[props.length];
- for (int j = 0; j < props.length; j++) {
- String name = props[j].getAttribute("name");
- String value = props[j].getAttribute("value");
- String type = props[j].getAttribute("type");
- String field = props[j].getAttribute("field");
-
- if (name != null && configuration.get(name) != null && configuration.get(name) instanceof String) {
- value = (String) configuration.get(name);
- } else {
- if (field != null && configuration.get(field) != null && configuration.get(field) instanceof String) {
- value = (String) configuration.get(field);
- }
- }
-
- Property prop = new Property(ps, name, field, type, value);
- properties[j] = prop;
-
- // Check if the instance configuration has a value for this property
- Object o = configuration.get(prop.getName());
- if (o != null && ! (o instanceof String)) {
- prop.set(o);
- } else {
- if (field != null) {
- o = configuration.get(field);
- if (o != null && !(o instanceof String)) {
- prop.set(configuration.get(field));
- }
- }
- }
-
- if (field != null) {
- fields.add(new FieldMetadata(field, type));
- }
+ if (fact != null && "method".equalsIgnoreCase(fact)) {
+ factory = ProvidedService.STATIC_FACTORY;
}
- // Attached to properties to the provided service
- ps.setProperties(properties);
+ // Then create the provided service
+ ProvidedService svc = new ProvidedService(this, serviceSpecifications, factory);
- if (checkProvidedService(ps)) {
- addProvidedService(ps);
+ Element[] props = providedServices[i].getElements("Property");
+ if (props != null) {
+ //Property[] properties = new Property[props.length];
+ Property[] properties = new Property[props.length];
+ for (int j = 0; j < props.length; j++) {
+ String name = props[j].getAttribute("name");
+ String value = props[j].getAttribute("value");
+ String type = props[j].getAttribute("type");
+ String field = props[j].getAttribute("field");
+
+ Property prop = new Property(name, field, null, value, type, getInstanceManager(), this);
+ properties[j] = prop;
+
+ // Check if the instance configuration has a value for this property
+ Object object = configuration.get(prop.getName());
+ if (object != null) {
+ prop.setValue(object);
+ }
+
+ if (field != null) {
+ getInstanceManager().register(new FieldMetadata(field, type), this);
+ // Cannot register the property as the interception is necessary to deal with registration update.
+ }
+ }
+
+ // Attach to properties to the provided service
+ svc.setProperties(properties);
+ }
+
+ if (checkProvidedService(svc)) {
+ addProvidedService(svc);
} else {
- String itfs = "";
+ StringBuffer itfs = new StringBuffer();
for (int j = 0; j < serviceSpecifications.length; j++) {
- itfs = itfs + " " + serviceSpecifications[j];
+ itfs.append(' ');
+ itfs.append(serviceSpecifications[j]);
}
throw new ConfigurationException("[" + getInstanceManager().getInstanceName() + "] The provided service" + itfs + " is not valid");
}
}
- getInstanceManager().register(this, (FieldMetadata[]) fields.toArray(new FieldMetadata[fields.size()]), null);
}
/**
@@ -185,8 +176,8 @@
// Look for parent class.
if (parent != null) {
- Class cl = bundle.loadClass(parent);
- collectInterfacesFromClass(cl, result, bundle);
+ Class clazz = bundle.loadClass(parent);
+ collectInterfacesFromClass(clazz, result, bundle);
}
return result;
@@ -195,78 +186,78 @@
/**
* Look for inherited interfaces.
* @param clazz : interface name to explore (class object)
- * @param l : set (accumulator)
- * @param b : bundle
+ * @param acc : set (accumulator)
+ * @param bundle : bundle
* @throws ClassNotFoundException : occurs when an interface cannot be loaded.
*/
- private void collectInterfaces(Class clazz, Set l, Bundle b) throws ClassNotFoundException {
+ private void collectInterfaces(Class clazz, Set acc, Bundle bundle) throws ClassNotFoundException {
Class[] clazzes = clazz.getInterfaces();
for (int i = 0; i < clazzes.length; i++) {
- l.add(clazzes[i].getName());
- collectInterfaces(clazzes[i], l, b);
+ acc.add(clazzes[i].getName());
+ collectInterfaces(clazzes[i], acc, bundle);
}
}
/**
* Collect interfaces for the given class.
* This method explores super class to.
- * @param cl : class object.
- * @param l : set of implemented interface (accumulator)
- * @param b : bundle.
+ * @param clazz : class object.
+ * @param acc : set of implemented interface (accumulator)
+ * @param bundle : bundle.
* @throws ClassNotFoundException : occurs if an interface cannot be load.
*/
- private void collectInterfacesFromClass(Class cl, Set l, Bundle b) throws ClassNotFoundException {
- Class[] clazzes = cl.getInterfaces();
+ private void collectInterfacesFromClass(Class clazz, Set acc, Bundle bundle) throws ClassNotFoundException {
+ Class[] clazzes = clazz.getInterfaces();
for (int i = 0; i < clazzes.length; i++) {
- l.add(clazzes[i].getName());
- collectInterfaces(clazzes[i], l, b);
+ acc.add(clazzes[i].getName());
+ collectInterfaces(clazzes[i], acc, bundle);
}
// Iterate on parent classes
- Class sup = cl.getSuperclass();
+ Class sup = clazz.getSuperclass();
if (sup != null) {
- collectInterfacesFromClass(sup, l, b);
+ collectInterfacesFromClass(sup, acc, bundle);
}
}
/**
* Check the provided service given in argument in the sense that the metadata are consistent.
- * @param ps : the provided service to check.
+ * @param svc : the provided service to check.
* @return true if the provided service is correct
* @throws ConfigurationException : the checked provided service is not correct.
*/
- private boolean checkProvidedService(ProvidedService ps) throws ConfigurationException {
- for (int i = 0; i < ps.getServiceSpecification().length; i++) {
- String specName = ps.getServiceSpecification()[i];
+ private boolean checkProvidedService(ProvidedService svc) throws ConfigurationException {
+ for (int i = 0; i < svc.getServiceSpecification().length; i++) {
+ String specName = svc.getServiceSpecification()[i];
// Check service level dependencies
try {
Class spec = getInstanceManager().getFactory().loadClass(specName);
Field specField = spec.getField("specification");
- Object o = specField.get(null);
- if (o instanceof String) {
- Element specification = ManifestMetadataParser.parse((String) o);
+ Object specif = specField.get(null);
+ if (specif instanceof String) {
+ Element specification = ManifestMetadataParser.parse((String) specif);
Element[] deps = specification.getElements("requires");
- for (int j = 0; j < deps.length; j++) {
- Dependency d = getAttachedDependency(deps[j]);
- if (d != null) {
+ for (int j = 0; deps != null && j < deps.length; j++) {
+ Dependency dep = getAttachedDependency(deps[j]);
+ if (dep != null) {
// Fix service-level dependency flag
- d.setServiceLevelDependency();
+ dep.setServiceLevelDependency();
}
- isDependencyCorrect(d, deps[j]);
+ isDependencyCorrect(dep, deps[j]);
}
} else {
- throw new ConfigurationException("Provides : The specification field of the service specification " + ps.getServiceSpecification()[i] + " need to be a String");
+ throw new ConfigurationException("Provides : The specification field of the service specification " + svc.getServiceSpecification()[i] + " need to be a String");
}
} catch (NoSuchFieldException e) {
return true; // No specification field
} catch (ClassNotFoundException e) {
- throw new ConfigurationException("Provides : The service specification " + ps.getServiceSpecification()[i] + " cannot be load");
+ throw new ConfigurationException("Provides : The service specification " + svc.getServiceSpecification()[i] + " cannot be load");
} catch (IllegalArgumentException e) {
- throw new ConfigurationException("Provides : The field 'specification' of the service specification " + ps.getServiceSpecification()[i] + " is not accessible : " + e.getMessage());
+ throw new ConfigurationException("Provides : The field 'specification' of the service specification " + svc.getServiceSpecification()[i] + " is not accessible : " + e.getMessage());
} catch (IllegalAccessException e) {
- throw new ConfigurationException("Provides : The field 'specification' of the service specification " + ps.getServiceSpecification()[i] + " is not accessible : " + e.getMessage());
+ throw new ConfigurationException("Provides : The field 'specification' of the service specification " + svc.getServiceSpecification()[i] + " is not accessible : " + e.getMessage());
} catch (ParseException e) {
- throw new ConfigurationException("Provides : The field 'specification' of the service specification " + ps.getServiceSpecification()[i] + " does not contain a valid String : " + e.getMessage());
+ throw new ConfigurationException("Provides : The field 'specification' of the service specification " + svc.getServiceSpecification()[i] + " does not contain a valid String : " + e.getMessage());
}
}
@@ -279,20 +270,20 @@
* @return the Dependency object, null if not found or if the DependencyHandler is not plugged to the instance
*/
private Dependency getAttachedDependency(Element element) {
- DependencyHandler dh = (DependencyHandler) getHandler(IPojoConfiguration.IPOJO_NAMESPACE + ":requires");
- if (dh == null) { return null; }
+ DependencyHandler handler = (DependencyHandler) getHandler(HandlerFactory.IPOJO_NAMESPACE + ":requires");
+ if (handler == null) { return null; }
- String id = element.getAttribute("id");
- if (id != null) {
+ String identity = element.getAttribute("id");
+ if (identity != null) {
// Look for dependency Id
- for (int i = 0; i < dh.getDependencies().length; i++) {
- if (dh.getDependencies()[i].getId().equals(id)) { return dh.getDependencies()[i]; }
+ for (int i = 0; i < handler.getDependencies().length; i++) {
+ if (handler.getDependencies()[i].getId().equals(identity)) { return handler.getDependencies()[i]; }
}
}
// If not found or no id, look for a dependency with the same specification
String requirement = element.getAttribute("specification");
- for (int i = 0; i < dh.getDependencies().length; i++) {
- if (dh.getDependencies()[i].getSpecification().equals(requirement)) { return dh.getDependencies()[i]; }
+ for (int i = 0; i < handler.getDependencies().length; i++) {
+ if (handler.getDependencies()[i].getSpecification().equals(requirement)) { return handler.getDependencies()[i]; }
}
return null;
@@ -334,6 +325,7 @@
* @see org.apache.felix.ipojo.Handler#stop()
*/
public void stop() {
+ //Nothing to do.
}
/**
@@ -341,31 +333,34 @@
*
* @see org.apache.felix.ipojo.Handler#start()
*/
- public void start() { }
+ public void start() {
+ // Nothing to do.
+ }
/**
* Setter Callback Method.
* Check if the modified field is a property to update the value.
+ * @param pojo : the pojo object on which the field is accessed
* @param fieldName : field name
* @param value : new value
- * @see org.apache.felix.ipojo.Handler#setterCallback(java.lang.String,
- * java.lang.Object)
+ * @see org.apache.felix.ipojo.Handler#onSet(Object,
+ * java.lang.String, java.lang.Object)
*/
- public void setterCallback(String fieldName, Object value) {
+ public void onSet(Object pojo, String fieldName, Object value) {
// Verify that the field name correspond to a dependency
for (int i = 0; i < m_providedServices.length; i++) {
- ProvidedService ps = m_providedServices[i];
+ ProvidedService svc = m_providedServices[i];
boolean update = false;
- for (int j = 0; j < ps.getProperties().length; j++) {
- Property prop = ps.getProperties()[j];
- if (fieldName.equals(prop.getField())) {
+ for (int j = 0; j < svc.getProperties().length; j++) {
+ Property prop = svc.getProperties()[j];
+ if (fieldName.equals(prop.getField()) && ! prop.getValue().equals(value)) {
// it is the associated property
- prop.set(value);
+ prop.setValue(value);
update = true;
}
}
if (update) {
- ps.update();
+ svc.update();
}
}
// Else do nothing
@@ -374,20 +369,21 @@
/**
* Getter Callback Method.
* Check if the field is a property to push the stored value.
+ * @param pojo : the pojo object on which the field is accessed
* @param fieldName : field name
* @param value : value pushed by the previous handler
* @return the stored value or the previous value.
- * @see org.apache.felix.ipojo.Handler#getterCallback(java.lang.String,
- * java.lang.Object)
+ * @see org.apache.felix.ipojo.Handler#onGet(Object,
+ * java.lang.String, java.lang.Object)
*/
- public Object getterCallback(String fieldName, Object value) {
+ public Object onGet(Object pojo, String fieldName, Object value) {
for (int i = 0; i < m_providedServices.length; i++) {
- ProvidedService ps = m_providedServices[i];
- for (int j = 0; j < ps.getProperties().length; j++) {
- Property prop = ps.getProperties()[j];
+ ProvidedService svc = m_providedServices[i];
+ for (int j = 0; j < svc.getProperties().length; j++) {
+ Property prop = svc.getProperties()[j];
if (fieldName.equals(prop.getField())) {
// it is the associated property
- return prop.get();
+ return prop.getValue();
}
}
}
@@ -452,12 +448,12 @@
ProvidedServiceHandlerDescription pshd = new ProvidedServiceHandlerDescription(this);
for (int j = 0; j < getProvidedService().length; j++) {
- ProvidedService ps = getProvidedService()[j];
- ProvidedServiceDescription psd = new ProvidedServiceDescription(ps.getServiceSpecification(), ps.getState(), ps.getServiceReference());
+ ProvidedService svc = getProvidedService()[j];
+ ProvidedServiceDescription psd = new ProvidedServiceDescription(svc.getServiceSpecification(), svc.getState(), svc.getServiceReference());
Properties props = new Properties();
- for (int k = 0; k < ps.getProperties().length; k++) {
- Property prop = ps.getProperties()[k];
+ for (int k = 0; k < svc.getProperties().length; k++) {
+ Property prop = svc.getProperties()[k];
if (prop.getValue() != null) {
props.put(prop.getName(), prop.getValue().toString());
}
@@ -475,36 +471,32 @@
*/
public void reconfigure(Dictionary dict) {
for (int j = 0; j < getProvidedService().length; j++) {
- ProvidedService ps = getProvidedService()[j];
- Property[] props = ps.getProperties();
+ ProvidedService svc = getProvidedService()[j];
+ Property[] props = svc.getProperties();
boolean update = false;
for (int k = 0; k < props.length; k++) {
if (dict.get(props[k].getName()) != null) {
update = true;
- if (dict.get(props[k].getName()) instanceof String) {
- props[k].set((String) dict.get(props[k].getName()));
- } else {
- props[k].set(dict.get(props[k].getName()));
- }
+ props[k].setValue(dict.get(props[k].getName()));
}
}
if (update) {
- ps.update();
+ svc.update();
}
}
}
/**
* Initialize the component type.
- * @param cd : component type description to populate.
+ * @param desc : component type description to populate.
* @param metadata : component type metadata.
* @throws ConfigurationException : occurs when the POJO does not implement any interfaces.
- * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentDescription, org.apache.felix.ipojo.metadata.Element)
+ * @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentTypeDescription, org.apache.felix.ipojo.metadata.Element)
*/
- public void initializeComponentFactory(ComponentDescription cd, Element metadata) throws ConfigurationException {
+ public void initializeComponentFactory(ComponentTypeDescription desc, Element metadata) throws ConfigurationException {
// Change ComponentInfo
Element[] provides = metadata.getElements("provides");
- ManipulationMetadata manipulation = new ManipulationMetadata(metadata);
+ PojoMetadata manipulation = getFactory().getPojoMetadata();
for (int i = 0; i < provides.length; i++) {
// First : create the serviceSpecification list
@@ -512,7 +504,7 @@
String parent = manipulation.getSuperClass();
Set all = null;
try {
- all = computeInterfaces(serviceSpecification, parent, cd.getBundleContext().getBundle());
+ all = computeInterfaces(serviceSpecification, parent, desc.getBundleContext().getBundle());
} catch (ClassNotFoundException e) {
throw new ConfigurationException("A interface cannot be loaded : " + e.getMessage());
}
@@ -522,35 +514,37 @@
List itfs = ParseUtils.parseArraysAsList(serviceSpecificationStr);
for (int j = 0; j < itfs.size(); j++) {
if (! all.contains(itfs.get(j))) {
- throw new ConfigurationException("The specification " + itfs.get(j) + " is not implemented by " + cd.getClassName());
+ throw new ConfigurationException("The specification " + itfs.get(j) + " is not implemented by " + desc.getClassName());
}
}
all = new HashSet(itfs);
}
- if (all.size() == 0) {
+ if (all.isEmpty()) {
throw new ConfigurationException("Provides : Cannot instantiate a provided service : no specifications found (no interfaces implemented by the pojo)");
}
- String specs = null;
+ StringBuffer specs = null;
Set set = new HashSet(all);
- Iterator it = set.iterator();
- while (it.hasNext()) {
- String sp = (String) it.next();
- cd.addProvidedServiceSpecification(sp);
+ Iterator iterator = set.iterator();
+ while (iterator.hasNext()) {
+ String spec = (String) iterator.next();
+ desc.addProvidedServiceSpecification(spec);
if (specs == null) {
- specs = "{" + sp;
+ specs = new StringBuffer("{");
+ specs.append(spec);
} else {
- specs += "," + sp;
+ specs.append(',');
+ specs.append(spec);
}
}
- specs += "}";
+ specs.append('}');
- provides[i].addAttribute(new Attribute("interface", specs)); // Add interface attribute to avoid checking in the configure method
+ provides[i].addAttribute(new Attribute("interface", specs.toString())); // Add interface attribute to avoid checking in the configure method
Element[] props = provides[i].getElements("property");
- for (int j = 0; j < props.length; j++) {
+ for (int j = 0; props != null && j < props.length; j++) {
String name = props[j].getAttribute("name");
String value = props[j].getAttribute("value");
String type = props[j].getAttribute("type");
@@ -566,15 +560,22 @@
if (field == null) {
throw new ConfigurationException("The property " + name + " has neither type neither field.");
}
- FieldMetadata fm = manipulation.getField(field);
- if (fm == null) {
+ FieldMetadata fieldMeta = manipulation.getField(field);
+ if (fieldMeta == null) {
throw new ConfigurationException("A declared property was not found in the class : " + field);
}
- type = fm.getFieldType();
+ type = fieldMeta.getFieldType();
props[j].addAttribute(new Attribute("type", type));
}
+
+ // Is the property set to immutable
+ boolean immutable = false;
+ String imm = props[j].getAttribute("immutable");
+ if (imm != null && imm.equalsIgnoreCase("true")) {
+ immutable = true;
+ }
- cd.addProperty(new PropertyDescription(name, type, value));
+ desc.addProperty(new PropertyDescription(name, type, value, immutable));
}
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
index d2bb779..59601f9 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedServiceHandlerDescription.java
@@ -40,10 +40,10 @@
/**
* Constructor.
- * @param h : handler.
+ * @param handler : handler.
*/
- public ProvidedServiceHandlerDescription(Handler h) {
- super(h);
+ public ProvidedServiceHandlerDescription(Handler handler) {
+ super(handler);
}
/**
@@ -83,17 +83,18 @@
public Element getHandlerInfo() {
Element services = super.getHandlerInfo();
for (int i = 0; i < m_providedServices.length; i++) {
- Element service = new Element("provides", "");
- String spec = "[";
+ Element service = new Element("provides", null);
+ StringBuffer spec = new StringBuffer("[");
for (int j = 0; j < m_providedServices[i].getServiceSpecification().length; j++) {
if (j == 0) {
- spec += m_providedServices[i].getServiceSpecification()[j];
+ spec.append(m_providedServices[i].getServiceSpecification()[j]);
} else {
- spec += ", " + m_providedServices[i].getServiceSpecification()[j];
+ spec.append(',');
+ spec.append(m_providedServices[i].getServiceSpecification()[j]);
}
}
- spec += "]";
- service.addAttribute(new Attribute("specifications", spec));
+ spec.append(']');
+ service.addAttribute(new Attribute("specifications", spec.toString()));
if (m_providedServices[i].getState() == ProvidedService.REGISTERED) {
service.addAttribute(new Attribute("state", "registered"));
@@ -102,12 +103,12 @@
service.addAttribute(new Attribute("state", "unregistered"));
}
- Iterator it = m_providedServices[i].getProperties().keySet().iterator();
- while (it.hasNext()) {
- Element prop = new Element("property", "");
- String k = (String) it.next();
- prop.addAttribute(new Attribute("name", k));
- prop.addAttribute(new Attribute("value", m_providedServices[i].getProperties().getProperty(k).toString()));
+ Iterator iterator = m_providedServices[i].getProperties().keySet().iterator();
+ while (iterator.hasNext()) {
+ Element prop = new Element("property", null);
+ String name = (String) iterator.next();
+ prop.addAttribute(new Attribute("name", name));
+ prop.addAttribute(new Attribute("value", m_providedServices[i].getProperties().getProperty(name).toString()));
service.addElement(prop);
}
services.addElement(service);
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/FieldMetadata.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/FieldMetadata.java
index 9c6ea8d..bc272d0 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/FieldMetadata.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/FieldMetadata.java
@@ -62,45 +62,32 @@
public String getFieldType() { return m_type; }
/**
- * Get the 'reflective' type of the field.
+ * Get the 'reflective' type of the given type.
* The reflective type is the type used by the Java Reflection API.
+ * @param type : the type to analyze to find the Java reflective type.
* @return : the reflective type corresponding to this field.
*/
- public String getReflectionType() {
+ public static String getReflectionType(String type) {
// Primitive Array
- if (m_type.endsWith("[]") && m_type.indexOf(".") == -1) {
- String arr = "";
- for (int i = 0; i < m_type.length(); i++) {
- if (m_type.charAt(i) == '[') { arr += '['; }
- }
- int index = m_type.indexOf('[');
- String t = m_type.substring(0, index);
- return arr + getInternalPrimitiveType(t);
+ if (type.endsWith("[]") && type.indexOf('.') == -1) {
+ int index = type.indexOf('[');
+ return '[' + getInternalPrimitiveType(type.substring(0, index));
}
// Non-Primitive Array
- if (m_type.endsWith("[]") && m_type.indexOf(".") != -1) {
- String arr = "";
- for (int i = 0; i < m_type.length(); i++) {
- if (m_type.charAt(i) == '[') { arr += '['; }
- }
- int index = m_type.indexOf('[');
- String t = m_type.substring(0, index);
- return arr + "L" + t + ";";
+ if (type.endsWith("[]") && type.indexOf('.') != -1) {
+ int index = type.indexOf('[');
+ return "[L" + type.substring(0, index) + ";";
}
- // Simple type
- if (!m_type.endsWith("[]")) {
- return m_type;
- }
-
- return null;
+ // The type is not an array.
+ return type;
}
/**
* Get the internal notation for primitive type.
- * @param string : Stringform of the type
+ * @param string : String form of the type
* @return the internal notation or null if not found
*/
- private String getInternalPrimitiveType(String string) {
+ public static String getInternalPrimitiveType(String string) {
if (string.equalsIgnoreCase("boolean")) {
return "Z";
}
@@ -125,7 +112,39 @@
if (string.equalsIgnoreCase("double")) {
return "D";
}
- System.err.println("No primitive type found for " + m_type);
+ return null;
+ }
+
+ /**
+ * Get the iPOJO primitive type from the given primitive class.
+ * @param clazz : a primitive class
+ * @return the primitive type.
+ */
+ public static String getPrimitiveTypeByClass(Class clazz) {
+ if (clazz.equals(Boolean.TYPE)) {
+ return "boolean";
+ }
+ if (clazz.equals(Character.TYPE)) {
+ return "char";
+ }
+ if (clazz.equals(Byte.TYPE)) {
+ return "byte";
+ }
+ if (clazz.equals(Short.TYPE)) {
+ return "short";
+ }
+ if (clazz.equals(Integer.TYPE)) {
+ return "int";
+ }
+ if (clazz.equals(Float.TYPE)) {
+ return "float";
+ }
+ if (clazz.equals(Long.TYPE)) {
+ return "long";
+ }
+ if (clazz.equals(Double.TYPE)) {
+ return "double";
+ }
return null;
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
index 172338a..ea0709e 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManifestMetadataParser.java
@@ -18,7 +18,9 @@
*/
package org.apache.felix.ipojo.parser;
+import java.util.ArrayList;
import java.util.Dictionary;
+import java.util.List;
import java.util.Properties;
import org.apache.felix.ipojo.metadata.Attribute;
@@ -32,11 +34,6 @@
public class ManifestMetadataParser {
/**
- * Manifest Headers.
- */
- private Dictionary m_headers;
-
- /**
* Element list.
*/
private Element[] m_elements = new Element[0];
@@ -47,24 +44,14 @@
* @throws ParseException when a parsing error occurs
*/
public Element[] getComponentsMetadata() throws ParseException {
- Element[] components = m_elements[0].getElements("Component");
- Element[] composites = m_elements[0].getElements("Composite");
- Element[] handlers = m_elements[0].getElements("Handler");
- Element[] all = new Element[components.length + composites.length + handlers.length];
- int l = 0;
- for (int i = 0; i < components.length; i++) {
- all[l] = components[i];
- l++;
+ Element[] elems = m_elements[0].getElements();
+ List list = new ArrayList();
+ for (int i = 0; i < elems.length; i++) {
+ if (!"instance".equals(elems[i].getName())) {
+ list.add(elems[i]);
+ }
}
- for (int i = 0; i < composites.length; i++) {
- all[l] = composites[i];
- l++;
- }
- for (int i = 0; i < handlers.length; i++) {
- all[l] = handlers[i];
- l++;
- }
- return all;
+ return (Element[]) list.toArray(new Element[list.size()]);
}
/**
@@ -73,7 +60,10 @@
* @throws ParseException : if the metadata cannot be parsed successfully
*/
public Dictionary[] getInstances() throws ParseException {
- Element[] configs = m_elements[0].getElements("Instance");
+ Element[] configs = m_elements[0].getElements("instance");
+ if (configs == null) {
+ return null;
+ }
Dictionary[] dicts = new Dictionary[configs.length];
for (int i = 0; i < configs.length; i++) {
dicts[i] = parseInstance(configs[i]);
@@ -95,17 +85,18 @@
if (name != null) {
dict.put("name", instance.getAttribute("name"));
}
-
+
if (comp == null) {
throw new ParseException("An instance does not have the 'component' attribute");
}
-
- dict.put("component", comp);
- for (int i = 0; i < instance.getElements("property").length; i++) {
- parseProperty(instance.getElements("property")[i], dict);
+ dict.put("component", comp);
+ Element[] props = instance.getElements("property");
+
+ for (int i = 0; props != null && i < props.length; i++) {
+ parseProperty(props[i], dict);
}
-
+
return dict;
}
@@ -122,10 +113,8 @@
if (name == null) {
throw new ParseException("A property does not have the 'name' attribute");
}
- // Final case : the property element has a 'value' attribute
- if (value != null) {
- dict.put(prop.getAttribute("name"), prop.getAttribute("value"));
- } else {
+ //case : the property element has a 'value' attribute
+ if (value == null) {
// Recursive case
// Check if there is 'property' element
Element[] subProps = prop.getElements("property");
@@ -137,6 +126,8 @@
parseProperty(subProps[i], dict2);
dict.put(name, dict2);
}
+ } else {
+ dict.put(prop.getAttribute("name"), prop.getAttribute("value"));
}
}
@@ -146,13 +137,13 @@
* @param elem : the element to add
*/
private void addElement(Element elem) {
- if (m_elements != null) {
+ if (m_elements == null) {
+ m_elements = new Element[] { elem };
+ } else {
Element[] newElementsList = new Element[m_elements.length + 1];
System.arraycopy(m_elements, 0, newElementsList, 0, m_elements.length);
newElementsList[m_elements.length] = elem;
m_elements = newElementsList;
- } else {
- m_elements = new Element[] { elem };
}
}
@@ -180,19 +171,18 @@
}
/**
- * Parse the given dictionnary and create the instance managers.
+ * Parse the given dictionary and create the instance managers.
*
* @param dict : the given headers of the manifest file
* @throws ParseException : if any error occurs
*/
public void parse(Dictionary dict) throws ParseException {
- m_headers = dict;
- String componentClassesStr = (String) m_headers.get("iPOJO-Components");
+ String componentClassesStr = (String) dict.get("iPOJO-Components");
// Add the ipojo element inside the element list
addElement(new Element("iPOJO", ""));
parseElements(componentClassesStr.trim());
}
-
+
/**
* Parse the given header and create the instance managers.
*
@@ -222,57 +212,61 @@
}
/**
- * Paser the given string.
+ * Parse the given string.
*
- * @param s : the string to parse
+ * @param elems : the string to parse
*/
- private void parseElements(String s) {
- char[] string = s.toCharArray();
+ private void parseElements(String elems) {
+ char[] string = elems.toCharArray();
for (int i = 0; i < string.length; i++) {
- char c = string[i];
+ char current = string[i];
- switch (c) {
+ switch (current) { //NOPMD
// Beginning of an attribute.
case '$':
- String attName = "";
- String attValue = "";
- String attNs = "";
+ StringBuffer attName = new StringBuffer();
+ StringBuffer attValue = new StringBuffer();
+ StringBuffer attNs = null;
i++;
- c = string[i];
- while (c != '=') {
- if (c == ':') {
+ current = string[i]; // Increment and get the new current char.
+ while (current != '=') {
+ if (current == ':') {
attNs = attName;
- attName = "";
+ attName = new StringBuffer();
} else {
- attName = attName + c;
+ attName.append(current);
}
- i = i + 1;
- c = string[i];
- }
- i++; // skip =
- i++; // skip "
- c = string[i];
- while (c != '"') {
- attValue = attValue + c;
i++;
- c = string[i];
+ current = string[i];
+ }
+ i = i + 2; // skip ="
+ current = string[i];
+ while (current != '"') {
+ attValue.append(current);
+ i++;
+ current = string[i]; // Increment and get the new current char.
}
i++; // skip "
- c = string[i];
+ current = string[i];
- Attribute att = new Attribute(attName, attNs, attValue);
+ Attribute att = null;
+ if (attNs == null) {
+ att = new Attribute(attName.toString(), attValue.toString());
+ } else {
+ att = new Attribute(attName.toString(), attNs.toString(), attValue.toString());
+ }
m_elements[m_elements.length - 1].addAttribute(att);
break;
// End of an element
case '}':
Element lastElement = removeLastElement();
- if (m_elements.length != 0) {
+ if (m_elements.length == 0) {
+ addElement(lastElement);
+ } else {
Element newQueue = m_elements[m_elements.length - 1];
newQueue.addElement(lastElement);
- } else {
- addElement(lastElement);
}
break;
@@ -282,19 +276,19 @@
// Default case
default:
- String name = "";
- String ns = "";
- c = string[i];
- while (c != ' ') {
- if (c == ':') {
- ns = name;
- name = "";
+ StringBuffer name = new StringBuffer();
+ StringBuffer namespace = null;
+ current = string[i];
+ while (current != ' ') {
+ if (current == ':') {
+ namespace = name;
+ name = new StringBuffer();
i++;
- c = string[i];
+ current = string[i];
} else {
- name = name + c;
+ name.append(current);
i++;
- c = string[i];
+ current = string[i]; // Increment and get the new current char.
}
}
// Skip spaces
@@ -302,8 +296,15 @@
i = i + 1;
}
i = i + 1; // skip {
- Element elem = new Element(name, ns);
+
+ Element elem = null;
+ if (namespace == null) {
+ elem = new Element(name.toString(), null);
+ } else {
+ elem = new Element(name.toString(), namespace.toString());
+ }
addElement(elem);
+
break;
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/MethodMetadata.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/MethodMetadata.java
index 1a8b482..302c2d4 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/MethodMetadata.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/MethodMetadata.java
@@ -18,6 +18,8 @@
*/
package org.apache.felix.ipojo.parser;
+import java.lang.reflect.Method;
+
import org.apache.felix.ipojo.metadata.Element;
/**
@@ -27,22 +29,22 @@
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class MethodMetadata {
-
+
/**
* Name of the method.
*/
private String m_name;
-
+
/**
* Argument type array.
*/
private String[] m_arguments = new String[0];
-
+
/**
* Returned type.
*/
private String m_return = "void";
-
+
/**
* Constructor.
* @param metadata : method manipulation element.
@@ -50,37 +52,77 @@
MethodMetadata(Element metadata) {
m_name = metadata.getAttribute("name");
String arg = metadata.getAttribute("arguments");
- String rt = metadata.getAttribute("return");
+ String result = metadata.getAttribute("return");
if (arg != null) {
m_arguments = ParseUtils.parseArrays(arg);
}
- if (rt != null) {
- m_return = rt;
+ if (result != null) {
+ m_return = result;
}
}
-
- public String getMethodName() { return m_name; }
-
- public String[] getMethodArguments() { return m_arguments; }
-
- public String getMethodReturn() { return m_return; }
-
+
+ public String getMethodName() {
+ return m_name;
+ }
+
+ public String[] getMethodArguments() {
+ return m_arguments;
+ }
+
+ public String getMethodReturn() {
+ return m_return;
+ }
+
/**
* Get the method unique identifier. For internal usage only.
* @return the method identifier.
*/
public String getMethodIdentifier() {
- String id = m_name;
+ StringBuffer identifier = new StringBuffer(m_name);
for (int i = 0; i < m_arguments.length; i++) {
- String cn = m_arguments[i];
- if (cn.endsWith("[]")) {
- cn = cn.replace('[', '$');
- cn = cn.substring(0, cn.length() - 1);
+ String arg = m_arguments[i];
+ identifier.append('$');
+ if (arg.endsWith("[]")) {
+ arg = arg.substring(0, arg.length() - 2);
+ identifier.append(arg.replace('.', '_'));
+ identifier.append("__"); // Replace [] by __
+ } else {
+ identifier.append(arg.replace('.', '_'));
}
- cn = cn.replace('.', '_');
- id += cn;
}
- return id;
+ return identifier.toString();
+ }
+
+ /**
+ * Compute the method id for the given method.
+ * @param method : Method object.
+ * @return the method id.
+ */
+ public static String computeMethodId(Method method) {
+ StringBuffer identifier = new StringBuffer(method.getName());
+ Class[] args = method.getParameterTypes();
+ for (int i = 0; i < args.length; i++) {
+ identifier.append('$'); // Argument separator.
+ if (args[i].isArray()) {
+ if (args[i].getComponentType().isPrimitive()) {
+ // Primitive array
+ identifier.append(FieldMetadata.getPrimitiveTypeByClass(args[i].getComponentType()));
+ } else {
+ // Object array
+ identifier.append(args[i].getComponentType().getName().replace('.', '_')); // Replace '.' by '_'
+ }
+ identifier.append("__"); // Add __ (array)
+ } else {
+ if (args[i].isPrimitive()) {
+ // Primitive type
+ identifier.append(FieldMetadata.getPrimitiveTypeByClass(args[i]));
+ } else {
+ // Object type
+ identifier.append(args[i].getName().replace('.', '_')); // Replace '.' by '_'
+ }
+ }
+ }
+ return identifier.toString();
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ParseUtils.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ParseUtils.java
index 08ceccb..e1597a3 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ParseUtils.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ParseUtils.java
@@ -18,7 +18,7 @@
*/
package org.apache.felix.ipojo.parser;
-import java.util.ArrayList;
+import java.util.Arrays;
import java.util.List;
import java.util.StringTokenizer;
@@ -27,7 +27,7 @@
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public class ParseUtils {
+public final class ParseUtils {
/**
* Parse the string form of an array as {a, b, c}.
@@ -37,18 +37,13 @@
*/
public static String[] parseArrays(String str) {
// Remove { and }
- if (str.startsWith("{") && str.endsWith("}")) {
- String m = str.substring(1, str.length() - 1);
+ if (str.charAt(0) == '{' && str.charAt(str.length() - 1) == '}') {
+ String internal = (str.substring(1, str.length() - 1)).trim();
// Check empty array
- m = m.trim();
- if (m.length() == 0) {
+ if (internal.length() == 0) {
return new String[0];
}
- String[] values = split(m, ",");
- for (int i = 0; i < values.length; i++) {
- values[i] = values[i].trim();
- }
- return values;
+ return split(internal, ",");
} else {
return new String[] { str };
}
@@ -61,40 +56,24 @@
* @return the resulting string array
*/
public static List parseArraysAsList(String str) {
- List result = new ArrayList();
- // Remove { and }
- if (str.startsWith("{") && str.endsWith("}")) {
- String m = str.substring(1, str.length() - 1);
- // Check empty array
- m = m.trim();
- if (m.length() == 0) {
- return result;
- }
- String[] values = split(m, ",");
- for (int i = 0; i < values.length; i++) {
- result.add(values[i].trim());
- }
- return result;
- } else {
- result.add(str);
- return result;
- }
+ return Arrays.asList(parseArrays(str));
}
/**
* Split method.
* This method is equivalent of the String.split in java 1.4
+ * The result array contains 'trimmed' String
* @param toSplit : String to split
* @param separator : separator
* @return the token array
*/
public static String[] split(String toSplit, String separator) {
- StringTokenizer st = new StringTokenizer(toSplit, separator);
- String[] result = new String[st.countTokens()];
- int i = 0;
- while (st.hasMoreElements()) {
- result[i] = st.nextToken();
- i++;
+ StringTokenizer tokenizer = new StringTokenizer(toSplit, separator);
+ String[] result = new String[tokenizer.countTokens()];
+ int index = 0;
+ while (tokenizer.hasMoreElements()) {
+ result[index] = tokenizer.nextToken().trim();
+ index++;
}
return result;
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManipulationMetadata.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/PojoMetadata.java
similarity index 82%
rename from ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManipulationMetadata.java
rename to ipojo/core/src/main/java/org/apache/felix/ipojo/parser/PojoMetadata.java
index 3d08854..ee8c6fc 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/ManipulationMetadata.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/parser/PojoMetadata.java
@@ -26,7 +26,7 @@
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public class ManipulationMetadata {
+public class PojoMetadata {
/**
* List of implemented interfaces.
@@ -55,21 +55,21 @@
* parsing manipulation metadata.
* @param metadata : component type metadata
*/
- public ManipulationMetadata(Element metadata) {
+ public PojoMetadata(Element metadata) {
Element manip = metadata.getElements("manipulation", "")[0];
m_super = manip.getAttribute("super");
Element[] fields = manip.getElements("field");
- for (int i = 0; i < fields.length; i++) {
- FieldMetadata fm = new FieldMetadata(fields[i]);
- addField(fm);
+ for (int i = 0; fields != null && i < fields.length; i++) {
+ FieldMetadata field = new FieldMetadata(fields[i]);
+ addField(field);
}
Element[] methods = manip.getElements("method");
- for (int i = 0; i < methods.length; i++) {
- MethodMetadata fm = new MethodMetadata(methods[i]);
- addMethod(fm);
+ for (int i = 0; methods != null && i < methods.length; i++) {
+ MethodMetadata method = new MethodMetadata(methods[i]);
+ addMethod(method);
}
Element[] itfs = manip.getElements("interface");
- for (int i = 0; i < itfs.length; i++) {
+ for (int i = 0; itfs != null && i < itfs.length; i++) {
addInterface(itfs[i].getAttribute("name"));
}
}
@@ -167,13 +167,13 @@
public MethodMetadata getMethod(String name, String[] types) {
for (int i = 0; i < m_methods.length; i++) {
if (m_methods[i].getMethodName().equalsIgnoreCase(name) && m_methods[i].getMethodArguments().length == types.length) {
- boolean ok = true;
- for (int j = 0; ok && j < types.length; j++) {
- if (! types[j].equals(m_methods[i].getMethodArguments()[j])) {
- ok = false;
+ int argIndex = 0;
+ for (; argIndex < types.length; argIndex++) {
+ if (! types[argIndex].equals(m_methods[i].getMethodArguments()[argIndex])) {
+ break;
}
}
- if (ok) { return m_methods[i]; }
+ if (argIndex == types.length) { return m_methods[i]; } // No mismatch detected.
}
}
return null;
@@ -181,11 +181,11 @@
/**
* Add a method to the list.
- * @param mm : Method Metadata to add.
+ * @param method : Method Metadata to add.
*/
- private void addMethod(MethodMetadata mm) {
+ private void addMethod(MethodMetadata method) {
for (int i = 0; (m_methods != null) && (i < m_methods.length); i++) {
- if (m_methods[i] == mm) {
+ if (m_methods[i] == method) {
return;
}
}
@@ -193,20 +193,20 @@
if (m_methods.length > 0) {
MethodMetadata[] newInstances = new MethodMetadata[m_methods.length + 1];
System.arraycopy(m_methods, 0, newInstances, 0, m_methods.length);
- newInstances[m_methods.length] = mm;
+ newInstances[m_methods.length] = method;
m_methods = newInstances;
} else {
- m_methods = new MethodMetadata[] { mm };
+ m_methods = new MethodMetadata[] { method };
}
}
/**
* Add a field to the list.
- * @param mm : the Field Metadata to add.
+ * @param field : the Field Metadata to add.
*/
- private void addField(FieldMetadata mm) {
+ private void addField(FieldMetadata field) {
for (int i = 0; (m_fields != null) && (i < m_fields.length); i++) {
- if (m_fields[i] == mm) {
+ if (m_fields[i] == field) {
return;
}
}
@@ -214,20 +214,20 @@
if (m_fields.length > 0) {
FieldMetadata[] newInstances = new FieldMetadata[m_fields.length + 1];
System.arraycopy(m_fields, 0, newInstances, 0, m_fields.length);
- newInstances[m_fields.length] = mm;
+ newInstances[m_fields.length] = field;
m_fields = newInstances;
} else {
- m_fields = new FieldMetadata[] { mm };
+ m_fields = new FieldMetadata[] { field };
}
}
/**
* Add the interface to the list.
- * @param mm : the interface name to add.
+ * @param itf : the interface name to add.
*/
- private void addInterface(String mm) {
+ private void addInterface(String itf) {
for (int i = 0; (m_interfaces != null) && (i < m_interfaces.length); i++) {
- if (m_interfaces[i] == mm) {
+ if (m_interfaces[i] == itf) {
return;
}
}
@@ -235,10 +235,10 @@
if (m_interfaces.length > 0) {
String[] newInstances = new String[m_interfaces.length + 1];
System.arraycopy(m_interfaces, 0, newInstances, 0, m_interfaces.length);
- newInstances[m_interfaces.length] = mm;
+ newInstances[m_interfaces.length] = itf;
m_interfaces = newInstances;
} else {
- m_interfaces = new String[] { mm };
+ m_interfaces = new String[] { itf };
}
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Callback.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Callback.java
index f19373c..a17326d 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Callback.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Callback.java
@@ -22,15 +22,15 @@
import java.lang.reflect.Method;
import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.parser.FieldMetadata;
import org.apache.felix.ipojo.parser.MethodMetadata;
/**
* A callback allows calling a method on the component instances.
- *
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class Callback {
-
+
/**
* Method object.
*/
@@ -50,7 +50,7 @@
* Reference on the instance manager.
*/
private InstanceManager m_manager;
-
+
/**
* Argument classes.
*/
@@ -58,193 +58,112 @@
/**
* Callback constructor.
- *
* @param method : the name of the method to call
* @param args : argument type name
* @param isStatic : is the method a static method
- * @param im : the instance manager of the component containing the method
+ * @param manager : the instance manager of the component containing the method
*/
- public Callback(String method, String[] args, boolean isStatic, InstanceManager im) {
+ public Callback(String method, String[] args, boolean isStatic, InstanceManager manager) {
m_method = method;
m_isStatic = isStatic;
- m_manager = im;
+ m_manager = manager;
if (args != null) {
- m_args = new String[args.length];
- for (int i = 0; i < args.length; i++) {
- // Primitive Array
- if (args[i].endsWith("[]") && args[i].indexOf(".") == -1) {
- String arr = "";
- for (int j = 0; j < args[i].length(); j++) {
- if (args[i].charAt(j) == '[') { arr += '['; }
- }
- int index = args[i].indexOf('[');
- m_args[i] = arr + getInternalPrimitiveType(args[i].substring(0, index));
- }
- // Non-Primitive Array
- if (args[i].endsWith("[]") && args[i].indexOf(".") != -1) {
- String arr = "";
- for (int j = 0; j < args[i].length(); j++) {
- if (args[i].charAt(j) == '[') { arr += '['; }
- }
- int index = args[i].indexOf('[');
- m_args[i] = arr + "L" + args[i].substring(0, index) + ";";
- }
- // Simple type
- if (!args[i].endsWith("[]")) {
- m_args[i] = args[i];
- }
- }
+ computeArguments(args);
}
-
}
-
+
/**
* Callback constructor.
- *
* @param method : the name of the method to call
* @param args : argument classes
* @param isStatic : is the method a static method
- * @param im : the instance manager of the component containing the method
+ * @param manager : the instance manager of the component containing the method
*/
- public Callback(String method, Class[] args, boolean isStatic, InstanceManager im) {
+ public Callback(String method, Class[] args, boolean isStatic, InstanceManager manager) {
m_method = method;
m_isStatic = isStatic;
- m_manager = im;
+ m_manager = manager;
m_args = new String[args.length];
for (int i = 0; i < args.length; i++) {
m_args[i] = args[i].getName();
}
}
-
+
/**
* Constructor.
- * @param mm : Method Metadata obtain form manipulation metadata.
- * @param im : instance manager.
+ * @param method : Method Metadata obtain form manipulation metadata.
+ * @param manager : instance manager.
*/
- public Callback(MethodMetadata mm, InstanceManager im) {
+ public Callback(MethodMetadata method, InstanceManager manager) {
m_isStatic = false;
- m_method = mm.getMethodName();
- m_manager = im;
- String[] args = mm.getMethodArguments();
+ m_method = method.getMethodName();
+ m_manager = manager;
+ computeArguments(method.getMethodArguments());
+ }
+
+ /**
+ * Compute arguments of the method.
+ * @param args : arguments of the method.
+ */
+ private void computeArguments(String[] args) {
m_args = new String[args.length];
for (int i = 0; i < args.length; i++) {
- // Primitive Array
- if (args[i].endsWith("[]") && args[i].indexOf(".") == -1) {
- String arr = "";
- for (int j = 0; j < args[i].length(); j++) {
- if (args[i].charAt(j) == '[') { arr += '['; }
- }
- int index = args[i].indexOf('[');
- m_args[i] = arr + getInternalPrimitiveType(args[i].substring(0, index));
- }
- // Non-Primitive Array
- if (args[i].endsWith("[]") && args[i].indexOf(".") != -1) {
- String arr = "";
- for (int j = 0; j < args[i].length(); j++) {
- if (args[i].charAt(j) == '[') { arr += '['; }
- }
- int index = args[i].indexOf('[');
- m_args[i] = arr + "L" + args[i].substring(0, index) + ";";
- }
- // Simple type
- if (!args[i].endsWith("[]")) {
- m_args[i] = args[i];
- }
+ m_args[i] = FieldMetadata.getReflectionType(args[i]);
}
}
/**
- * Get the internal notation for primitive type.
- * @param string : Stringform of the type
- * @return the internal notation or null if not found
+ * Search the looked method in the given method arrays.
+ * @param methods : method array in which we need to look
+ * @return the method object or null if not found
*/
- private String getInternalPrimitiveType(String string) {
- if (string.equalsIgnoreCase("boolean")) {
- return "Z";
- }
- if (string.equalsIgnoreCase("char")) {
- return "C";
- }
- if (string.equalsIgnoreCase("byte")) {
- return "B";
- }
- if (string.equalsIgnoreCase("short")) {
- return "S";
- }
- if (string.equalsIgnoreCase("int")) {
- return "I";
- }
- if (string.equalsIgnoreCase("float")) {
- return "F";
- }
- if (string.equalsIgnoreCase("long")) {
- return "J";
- }
- if (string.equalsIgnoreCase("double")) {
- return "D";
- }
- return null;
- }
-
- /**
- * Search the method object in the POJO by analyzing present method.
- * The name of the method and the argument type are checked.
- */
- protected void searchMethod() {
- Method[] methods = m_manager.getClazz().getDeclaredMethods();
- for (int i = 0; m_methodObj == null && i < methods.length; i++) {
+ private Method searchMethodInMethodArray(Method[] methods) {
+ for (int i = 0; i < methods.length; i++) {
// First check the method name
if (methods[i].getName().equals(m_method)) {
// Check arguments
Class[] clazzes = methods[i].getParameterTypes();
if (clazzes.length == m_args.length) { // Test size to avoid useless loop
- boolean ok = true;
- for (int j = 0; ok && j < m_args.length; j++) {
- if (!m_args[j].equals(clazzes[j].getName())) {
- ok = false;
+ int argIndex = 0;
+ for (; argIndex < m_args.length; argIndex++) {
+ if (!m_args[argIndex].equals(clazzes[argIndex].getName())) {
+ break;
}
}
- if (ok) {
- m_methodObj = methods[i]; // It is the looked method.
- }
+ if (argIndex == m_args.length) { // No mismatch detected.
+ return methods[i]; // It is the looked method.
+ }
}
+ }
+ }
+ return null;
+ }
- }
- }
-
- if (m_methodObj == null) { //look at parent classes
+ /**
+ * Search the method object in the POJO by analyzing present method. The name of the method and the argument type are checked.
+ * @throws NoSuchMethodException : occurs when the method cannot be found either in the pojo class either in parent classes.
+ */
+ protected void searchMethod() throws NoSuchMethodException {
+ Method[] methods = m_manager.getClazz().getDeclaredMethods();
+ m_methodObj = searchMethodInMethodArray(methods);
+
+ if (m_methodObj == null) { // look at parent classes
methods = m_manager.getClazz().getMethods();
- for (int i = 0; m_methodObj == null && i < methods.length; i++) {
- // First check the method name
- if (methods[i].getName().equals(m_method)) {
- // Check arguments
- Class[] clazzes = methods[i].getParameterTypes();
- if (clazzes.length == m_args.length) { // Test size to avoid useless loop
- boolean ok = true;
- for (int j = 0; ok && j < m_args.length; j++) {
- if (!m_args[j].equals(clazzes[j].getName())) {
- ok = false;
- }
- }
- if (ok) {
- m_methodObj = methods[i]; // It is the looked method.
- }
- }
- }
- }
+ m_methodObj = searchMethodInMethodArray(methods);
}
-
+
if (m_methodObj == null) {
- m_manager.getFactory().getLogger().log(Logger.ERROR, "The method " + m_method + " cannot be called : method not found");
- m_manager.stop();
+ throw new NoSuchMethodException(m_method);
} else {
- m_methodObj.setAccessible(true);
+ if (! m_methodObj.isAccessible()) {
+ // If not accessible, try to set the accessibility.
+ m_methodObj.setAccessible(true);
+ }
}
}
/**
* Call the method.
- *
* @return the result of the invocation, null for void method, the last result for multi-object instance
* @throws NoSuchMethodException : Method is not found in the class
* @throws InvocationTargetException : The method is not static
@@ -256,7 +175,6 @@
/**
* Call the current callback method on the instance given in parameter.
- *
* @param instance : instance on which call the callback
* @return the result of the invocation, null for void method
* @throws NoSuchMethodException : the method was not found
@@ -269,19 +187,17 @@
/**
* Call the callback on the method with the argument given in parameter.
- *
* @param arg : the parameters
* @return the result of the invocation, null for void method, the last result for multi-object instance
* @throws NoSuchMethodException : the callback method is not found
* @throws IllegalAccessException : the callback method cannot be called
- * @throws InvocationTargetException : an error occurs inside the called
- * method
+ * @throws InvocationTargetException : an error occurs inside the called method
*/
public Object call(Object[] arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
if (m_methodObj == null) {
searchMethod();
}
-
+
if (m_isStatic) {
return m_methodObj.invoke(null, arg);
} else {
@@ -291,35 +207,32 @@
if (m_manager.getPojoObjects() == null) {
return m_methodObj.invoke(m_manager.getPojoObject(), arg);
} else {
- Object r = null;
+ Object newObject = null;
for (int i = 0; i < m_manager.getPojoObjects().length; i++) {
- r = m_methodObj.invoke(m_manager.getPojoObjects()[i], arg);
+ newObject = m_methodObj.invoke(m_manager.getPojoObjects()[i], arg);
}
- return r;
+ return newObject;
}
}
}
/**
- * Call the callback on the method with the argument given in parameter and
- * with the arguments given in parameter too.
- *
+ * Call the callback on the method with the argument given in parameter and with the arguments given in parameter too.
* @param instance : instance on which call the callback
* @param arg : the argument array
* @return the result of the invocation, null for void method
* @throws NoSuchMethodException : the callback method is not found
* @throws IllegalAccessException : the callback method cannot be called
- * @throws InvocationTargetException : an error occurs inside the called
- * method
+ * @throws InvocationTargetException : an error occurs inside the called method
*/
public Object call(Object instance, Object[] arg) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException {
if (m_methodObj == null) {
searchMethod();
}
-
+
return m_methodObj.invoke(instance, arg);
}
-
+
public String getMethod() {
return m_method;
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java
new file mode 100644
index 0000000..d644805
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyModel.java
@@ -0,0 +1,792 @@
+/*
+ * 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.util;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.metadata.Element;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Abstract dependency model. This class is the parent class of every service dependency. It manages the most part of dependency management. This
+ * class creates an insterface between the service tracker and the concrete dependency.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public abstract class DependencyModel implements TrackerCustomizer {
+
+ /**
+ * Dependency state : BROKEN. A broken dependency cannot be fulfilled anymore. The dependency becomes broken when a used service disappears in the
+ * static binding policy.
+ */
+ public static final int BROKEN = -1;
+
+ /**
+ * Dependency state : UNRESOLVED. A dependency is unresolved if the dependency is not valid and no service providers are available.
+ */
+ public static final int UNRESOLVED = 0;
+
+ /**
+ * Dependency state : RESOLVED. A dependency is resolved if the dependency is optional or at least one provider is available.
+ */
+ public static final int RESOLVED = 1;
+
+ /**
+ * Binding policy : Dynamic. In this policy, services can appears and departs without special treatment.
+ */
+ public static final int DYNAMIC_BINDING_POLICY = 0;
+
+ /**
+ * Binding policy : Static. Once a service is used, if this service disappears the dependency becomes BROKEN. The instance needs to be recreated.
+ */
+ public static final int STATIC_BINDING_POLICY = 1;
+
+ /**
+ * Binding policy : Dynamic-Priority. In this policy, services can appears and departs. However, once a service with a highest ranking (according
+ * to the used comparator) appears, this new service is re-injected.
+ */
+ public static final int DYNAMIC_PRIORITY_BINDING_POLICY = 2;
+
+ /**
+ * Does the dependency bind several providers ?
+ */
+ private boolean m_aggregate;
+
+ /**
+ * Is the dependency optional ?
+ */
+ private boolean m_optional;
+
+ /**
+ * Required specification. Cannot change once set.
+ */
+ private Class m_specification;
+
+ /**
+ * Comparator to sort service references.
+ */
+ private Comparator m_comparator;
+
+ /**
+ * LDAP filter object selecting service references form the set of providers providing the required specification.
+ */
+ private Filter m_filter;
+
+ /**
+ * Bundle context used by the dependency. (could be a service context).
+ */
+ private BundleContext m_context;
+
+ /**
+ * Listener object on which invoking the validate and invalidate methods.
+ */
+ private final DependencyStateListener m_listener;
+
+ /**
+ * Actual state of the dependency.
+ */
+ private int m_state;
+
+ /**
+ * Binding policy of the dependency.
+ */
+ private int m_policy = DYNAMIC_BINDING_POLICY; // Is notas we have to handler policy change in a future version.
+
+ /**
+ * Service tracker used by this dependency.
+ */
+ private Tracker m_tracker;
+
+ /**
+ * List of matching service references. This list is a subset of tracked references. This set is compute according to the filter and the match
+ * method.
+ */
+ private final List m_matchingRefs = new ArrayList();
+
+ /**
+ * Constructor.
+ * @param specification : required specification
+ * @param aggregate : is the dependency aggregate ?
+ * @param optional : is the dependency optional ?
+ * @param filter : LDAP filter
+ * @param comparator : comparator object to sort references
+ * @param policy : binding policy
+ * @param context : bundle context (or service context)
+ * @param listener : dependency lifecycle listener to notify from dependency state changes.
+ */
+ public DependencyModel(Class specification, boolean aggregate, boolean optional, Filter filter, Comparator comparator, int policy,
+ BundleContext context, DependencyStateListener listener) {
+ m_specification = specification;
+ m_aggregate = aggregate;
+ m_optional = optional;
+ m_filter = filter;
+ m_comparator = comparator;
+ m_context = context;
+ m_policy = policy;
+ // If the dynamic priority policy is chosen, and we have no comparator, fix it to OSGi standard service reference comparator.
+ if (m_policy == DYNAMIC_PRIORITY_BINDING_POLICY && m_comparator == null) {
+ m_comparator = new ServiceReferenceRankingComparator();
+ }
+ m_state = UNRESOLVED;
+ m_listener = listener;
+ }
+
+ /**
+ * Open the tracking.
+ */
+ public void start() {
+ m_tracker = new Tracker(m_context, m_specification.getName(), this);
+ m_tracker.open();
+ computeDependencyState();
+ }
+
+ /**
+ * Close the tracking.
+ */
+ public void stop() {
+ if (m_tracker != null) {
+ m_tracker.close();
+ m_tracker = null;
+ }
+ m_state = UNRESOLVED;
+ }
+
+ /**
+ * Is the reference set frozen (cannot change anymore) ? This method must be override by concrete dependency to support the static binding policy.
+ * This method is just used by default. The method must always return false for non-static dependency.
+ * @return true if the reference set is frozen.
+ */
+ public boolean isFrozen() {
+ return false;
+ }
+
+ /**
+ * Does the service reference match ? This method must be override by concrete dependency if they need to advanced testing on service reference
+ * (that cannot be express in the LDAP filter). By default this method return true.
+ * @param ref : tested reference.
+ * @return true
+ */
+ public boolean match(ServiceReference ref) {
+ return true;
+ }
+
+ /**
+ * Compute the actual dependency state.
+ */
+ private void computeDependencyState() {
+ if (m_state == BROKEN) { return; } // The dependency is broken ...
+
+ boolean mustCallValidate = false;
+ boolean mustCallInvalidate = false;
+ synchronized (this) {
+ if (m_optional || !m_matchingRefs.isEmpty()) {
+ // The dependency is valid
+ if (m_state == UNRESOLVED) {
+ m_state = RESOLVED;
+ mustCallValidate = true;
+ }
+ } else {
+ // The dependency is invalid
+ if (m_state == RESOLVED) {
+ m_state = UNRESOLVED;
+ mustCallInvalidate = true;
+ }
+ }
+ }
+
+ // Invoke callback in a non-synchronized region
+ if (mustCallInvalidate) {
+ invalidate();
+ } else if (mustCallValidate) {
+ validate();
+ }
+
+ }
+
+ /**
+ * Service tracker adding service callback. We accept the service only if we aren't broken or frozen.
+ * @param ref : the new dependency.
+ * @return true if the reference must be tracked.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
+ */
+ public boolean addingService(ServiceReference ref) {
+ return !((m_state == BROKEN) || isFrozen());
+ }
+
+ /**
+ * Service Tracker added service callback. If the service matches, manage the arrival.
+ * @param ref : new references.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
+ */
+ public void addedService(ServiceReference ref) {
+ if ((m_filter == null || m_filter.match(ref)) && match(ref)) {
+ manageArrival(ref);
+ }
+ // Do not store the service if it doesn't match.
+ }
+
+ /**
+ * Manage the arrival of a new service reference. The reference is valid and match the filter and the match method. This method has different
+ * behavior according to the binding policy.
+ * @param ref : the new reference
+ */
+ private void manageArrival(ServiceReference ref) {
+
+ // Create a local copy of the state and of the list size.
+ int state = m_state;
+ int size;
+
+ synchronized (this) {
+ m_matchingRefs.add(ref);
+
+ // Sort the collection if needed.
+ if (m_comparator != null) {
+ Collections.sort(m_matchingRefs, m_comparator);
+ }
+
+ size = m_matchingRefs.size();
+ }
+
+ if (m_aggregate) {
+ onServiceArrival(ref); // Always notify the arrival for aggregate dependencies.
+ if (state == UNRESOLVED) { // If we was unresolved, try to validate the dependency.
+ computeDependencyState();
+ }
+ } else { // We are not aggregate.
+ if (size == 1) {
+ onServiceArrival(ref); // It is the first service, so notify.
+ computeDependencyState();
+ } else {
+ // In the case of a dynamic priority binding, we have to test if we have to update the bound reference
+ if (m_policy == DYNAMIC_PRIORITY_BINDING_POLICY && m_matchingRefs.get(0) == ref) {
+ // We are sure that we have at least two references, so if the highest ranked references (first one) is the new received
+ // references,
+ // we have to unbind the used one and to bind the the new one.
+ onServiceDeparture((ServiceReference) m_matchingRefs.get(1));
+ onServiceArrival(ref);
+ }
+ }
+ }
+ // Ignore others cases
+ }
+
+ /**
+ * Service tracker removed service callback. A service goes away. The depart need to be managed only if the reference was used.
+ * @param ref : leaving service reference
+ * @param arg1 : service object if the service was get
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void removedService(ServiceReference ref, Object arg1) {
+ if (m_matchingRefs.contains(ref)) {
+ manageDeparture(ref, arg1);
+ }
+ }
+
+ /**
+ * Manage the departure of a used service.
+ * @param ref : leaving service reference
+ * @param obj : service object if the service was get
+ */
+ private void manageDeparture(ServiceReference ref, Object obj) {
+ // If we already get this service and the binding policy is static, the dependency becomes broken
+ if (isFrozen() && obj != null) {
+ if (m_state != BROKEN) {
+ m_state = BROKEN;
+ invalidate();
+ }
+ } else {
+ synchronized (this) {
+ m_matchingRefs.remove(ref);
+ }
+ if (obj == null) {
+ computeDependencyState(); // check if the dependency stills valid.
+ } else {
+ onServiceDeparture(ref);
+ ServiceReference newRef = getServiceReference();
+ if (newRef == null) { // Check if there is another provider.
+ computeDependencyState(); // no more references.
+ } else {
+ if (!m_aggregate) {
+ onServiceArrival(newRef); // Injecting the new service reference for non aggregate dependencies.
+ }
+ }
+ }
+ }
+
+ }
+
+ /**
+ * Service tracker modified service callback. This method must handle if the modified service should be considered as a depart or an arrival.
+ * According to the dependency filter, a service can now match or can no match anymore.
+ * @param ref : modified reference
+ * @param arg1 : service object if already get.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void modifiedService(ServiceReference ref, Object arg1) {
+ if (m_matchingRefs.contains(ref)) {
+ // It's a used service. Check if the service always match.
+ if (!(m_filter == null || m_filter.match(ref)) && match(ref)) {
+ // The service does not match anymore. Call removedService.
+ manageDeparture(ref, arg1);
+ } else {
+ onServiceModification(ref);
+ }
+ } else {
+ // The service was not used. Check if it matches.
+ if ((m_filter == null || m_filter.match(ref)) && match(ref)) {
+ manageArrival(ref);
+ }
+ // Else, the service does not match.
+ }
+ }
+
+ /**
+ * Get the next matching service reference.
+ * @return null if no more provider is available, else return the first reference from the matching set.
+ */
+ public ServiceReference getServiceReference() {
+ synchronized (this) {
+ if (m_matchingRefs.isEmpty()) {
+ return null;
+ } else {
+ return (ServiceReference) m_matchingRefs.get(0);
+ }
+ }
+ }
+
+ /**
+ * Get matching service references.
+ * @return the sorted (if a comparator is used) array of matching service references, null if no references are available.
+ */
+ public ServiceReference[] getServiceReferences() {
+ synchronized (this) {
+ if (m_matchingRefs.isEmpty()) { return null; }
+ return (ServiceReference[]) m_matchingRefs.toArray(new ServiceReference[m_matchingRefs.size()]);
+ }
+ }
+
+ /**
+ * Get the list of currently used service references.
+ * @return the list of used reference (according to the service tracker).
+ */
+ public List getUsedServiceReferences() {
+ synchronized (this) {
+ // The list must confront actual matching services with already get services from the tracker.
+
+ int size = m_matchingRefs.size();
+ List usedByTracker = m_tracker.getUsedServiceReferences();
+ if (size == 0 || usedByTracker == null) { return null; }
+
+ List list = new ArrayList(1);
+ for (int i = 0; i < size; i++) {
+ if (usedByTracker.contains(m_matchingRefs.get(i))) {
+ list.add(m_matchingRefs.get(i)); // Add the service in the list.
+ if (!isAggregate()) { // IF we are not multiple, return the list when the first element is found.
+ return list;
+ }
+ }
+ }
+
+ return list;
+ }
+ }
+
+ /**
+ * Get the number of actual matching references.
+ * @return the number of matching references
+ */
+ public int getSize() {
+ return m_matchingRefs.size();
+ }
+
+ /**
+ * Concrete dependency callback. This method is called when a new service need to be re-injected in the underlying concrete dependency.
+ * @param ref : service reference to inject.
+ */
+ public abstract void onServiceArrival(ServiceReference ref);
+
+ /**
+ * Concrete dependency callback. This method is called when a used service (already injected) is leaving.
+ * @param ref : the leaving service reference.
+ */
+ public abstract void onServiceDeparture(ServiceReference ref);
+
+ /**
+ * This method can be override by the concrete dependency to be notified of service modification. This modification is not an arrival or a
+ * departure.
+ * @param ref : modified service reference.
+ */
+ public void onServiceModification(ServiceReference ref) {
+ // Do nothing by default.
+ }
+
+ /**
+ * Concrete dependency callback. This method is called when the dependency is reconfigured and when this reconfiguration implies changes on the
+ * matching service set ( and by the way on the injected service).
+ * @param departs : service leaving the matching set.
+ * @param arrivals : service arriving in the matching set.
+ */
+ public abstract void onDependencyReconfiguration(ServiceReference[] departs, ServiceReference[] arrivals);
+
+ /**
+ * Call the listener callback to notify the new state of the current dependency.
+ */
+ private void invalidate() {
+ m_listener.invalidate(this);
+ }
+
+ /**
+ * Call the listener callback to notify the new state of the current dependency.
+ */
+ private void validate() {
+ m_listener.validate(this);
+ }
+
+ /**
+ * Get the actual state of the dependency.
+ * @return : the state of the dependency.
+ */
+ public int getState() {
+ return m_state;
+ }
+
+ /**
+ * Get the tracked specification.
+ * @return the Class object tracked by the dependency.
+ */
+ public Class getSpecification() {
+ return m_specification;
+ }
+
+ /**
+ * Set the required specification of this service dependency. This operation is not supported if the dependency tracking has already begun.
+ * @param specification : required specification.
+ */
+ public void setSpecification(Class specification) {
+ if (m_tracker == null) {
+ m_specification = specification;
+ } else {
+ throw new UnsupportedOperationException("Dynamic specification change is not yet supported");
+ }
+ }
+
+ /**
+ * Set the filter of the dependency. This method recompute the matching set and call the onDependencyReconfiguration callback.
+ * @param filter : new LDAP filter.
+ */
+ public void setFilter(Filter filter) { //NOPMD
+ m_filter = filter;
+ if (m_tracker != null) { // Tracking started ...
+ List toRemove = new ArrayList();
+ List toAdd = new ArrayList();
+ ServiceReference usedRef = null;
+ synchronized (this) {
+
+ // Store the used service references.
+ if (!m_aggregate && !m_matchingRefs.isEmpty()) {
+ usedRef = (ServiceReference) m_matchingRefs.get(0);
+ }
+
+ // Get actually all tracked references.
+ ServiceReference[] refs = m_tracker.getServiceReferences();
+
+ if (refs == null) {
+ for (int j = 0; j < m_matchingRefs.size(); j++) {
+ // All references need to be removed.
+ toRemove.add(m_matchingRefs.get(j));
+ }
+ // No more matching dependency. Clear the matching reference set.
+ m_matchingRefs.clear();
+ } else {
+ // Compute matching services.
+ List matching = new ArrayList();
+ for (int i = 0; i < refs.length; i++) {
+ if (m_filter == null || m_filter.match(refs[i]) && match(refs[i])) {
+ matching.add(refs[i]);
+ }
+ }
+ // Now compare with used services.
+ for (int j = 0; j < m_matchingRefs.size(); j++) {
+ ServiceReference ref = (ServiceReference) m_matchingRefs.get(j);
+ // Check if the reference is inside the matching list:
+ if (!matching.contains(ref)) {
+ // The reference should be removed
+ toRemove.add(ref);
+ }
+ }
+
+ // Then remove services which do no more match.
+ m_matchingRefs.removeAll(toRemove);
+
+ // Then, add new matching services.
+
+ for (int k = 0; k < matching.size(); k++) {
+ if (!m_matchingRefs.contains(matching.get(k))) {
+ m_matchingRefs.add(matching.get(k));
+ toAdd.add(matching.get(k));
+ }
+ }
+
+ // Sort the collections if needed.
+ if (m_comparator != null) {
+ Collections.sort(m_matchingRefs, m_comparator);
+ Collections.sort(toAdd, m_comparator);
+ Collections.sort(toRemove, m_comparator);
+ }
+
+ }
+ }
+
+ // Call the callback outside the sync bloc.
+ if (m_aggregate) {
+ ServiceReference[] rem = null;
+ ServiceReference[] add = null;
+ if (!toAdd.isEmpty()) {
+ add = (ServiceReference[]) toAdd.toArray(new ServiceReference[toAdd.size()]);
+ }
+ if (!toRemove.isEmpty()) {
+ rem = (ServiceReference[]) toRemove.toArray(new ServiceReference[toRemove.size()]);
+ }
+ if (rem != null || add != null) { // Notify the change only when a change is made on the matching reference list.
+ onDependencyReconfiguration(rem, add);
+ }
+ } else {
+ // Create a local copy to avoid un-sync reference list access.
+ int size;
+ ServiceReference newRef = null;
+ synchronized (m_matchingRefs) {
+ size = m_matchingRefs.size();
+ if (size > 0) {
+ newRef = (ServiceReference) m_matchingRefs.get(0);
+ }
+ }
+ // Non aggregate case.
+ // If the used reference was not null
+ if (usedRef == null) {
+ // The used ref was null,
+ if (size > 0) {
+ onDependencyReconfiguration(null, new ServiceReference[] { newRef });
+ } // Don't notify the change, if the set is not touched by the reconfiguration.
+ } else {
+ // If the used ref disappears, inject a new service if available, else reinject null.
+ if (toRemove.contains(usedRef)) {
+ // We have to replace the service.
+ if (size > 0) {
+ onDependencyReconfiguration(new ServiceReference[] { usedRef }, new ServiceReference[] { newRef });
+ } else {
+ onDependencyReconfiguration(new ServiceReference[] { usedRef }, null);
+ }
+ } else if (m_policy == DYNAMIC_PRIORITY_BINDING_POLICY && newRef != usedRef) { //NOPMD
+ // In the case of dynamic-priority, check if the used ref is no more the highest reference
+ onDependencyReconfiguration(new ServiceReference[] { usedRef }, new ServiceReference[] { newRef });
+ }
+ }
+ }
+ // Now, compute the new dependency state.
+ computeDependencyState();
+ }
+ }
+
+ /**
+ * Return the dependency filter (String form).
+ * @return the String form of the LDAP filter used by this dependency, null if not set.
+ */
+ public String getFilter() {
+ if (m_filter == null) {
+ return null;
+ } else {
+ return m_filter.toString();
+ }
+ }
+
+ /**
+ * Set the aggregate attribute of the current dependency. If the tracking is open, it will call arrival and departure callbacks.
+ * @param isAggregate : new aggregate attribute value.
+ */
+ public synchronized void setAggregate(boolean isAggregate) {
+ if (m_tracker == null) { // Not started ...
+ m_aggregate = isAggregate;
+ } else {
+ // We become aggregate.
+ if (!m_aggregate && isAggregate) {
+ m_aggregate = true;
+ // Call the callback on all non already injected service.
+ if (m_state == RESOLVED) {
+
+ for (int i = 1; i < m_matchingRefs.size(); i++) { // The loop begin at 1, as the 0 is already injected.
+ onServiceArrival((ServiceReference) m_matchingRefs.get(i));
+ }
+ }
+ } else if (m_aggregate && !isAggregate) {
+ m_aggregate = false;
+ // We become non-aggregate.
+ if (m_state == RESOLVED) {
+ for (int i = 1; i < m_matchingRefs.size(); i++) { // The loop begin at 1, as the 0 stills injected.
+ onServiceDeparture((ServiceReference) m_matchingRefs.get(i));
+ }
+ }
+ }
+ // Else, do nothing.
+ }
+ }
+
+ public boolean isAggregate() {
+ return m_aggregate;
+ }
+
+ /**
+ * Set the optionality attribute of the current dependency.
+ * @param isOptional : the new optional attribute value.
+ */
+ public void setOptionality(boolean isOptional) {
+ if (m_tracker == null) { // Not started ...
+ m_optional = isOptional;
+ } else {
+ computeDependencyState();
+ }
+ }
+
+ public boolean isOptional() {
+ return m_optional;
+ }
+
+ /**
+ * Return the used binding policy.
+ * @return the current binding policy.
+ */
+ public int getBindingPolicy() {
+ return m_policy;
+ }
+
+ /**
+ * Set the binding policy. Not yet supported.
+ */
+ public void setBindingPolicy() {
+ throw new UnsupportedOperationException("Binding Policy change is not yet supported");
+ // TODO supporting dynamic policy change.
+ }
+
+ public void setComparator(Comparator cmp) {
+ m_comparator = cmp;
+ // NOTE: the array will be sorted at the next get.
+ }
+
+ /**
+ * Set the bundle context used by this dependency. This operation is not supported if the tracker is already opened.
+ * @param context : bundle context or service context to use
+ */
+ public void setBundleContext(BundleContext context) {
+ if (m_tracker == null) { // Not started ...
+ m_context = context;
+ } else {
+ throw new UnsupportedOperationException("Dynamic bundle (i.e. service) context change is not supported");
+ }
+ }
+
+ /**
+ * Get a service object for the given reference.
+ * @param ref : wanted service reference
+ * @return : the service object attached to the given reference
+ */
+ public Object getService(ServiceReference ref) {
+ return m_tracker.getService(ref);
+ }
+
+ /**
+ * Unget a used service reference.
+ * @param ref : reference to unget.
+ */
+ public void ungetService(ServiceReference ref) {
+ m_tracker.ungetService(ref);
+ }
+
+ /**
+ * Helper method parsing the comparator attribute and returning the comparator object. If the 'comparator' attribute is not set, this method
+ * returns null. If the 'comparator' attribute is set to 'osgi', this method returns the normal OSGi comparator. In other case, it tries to create
+ * an instance of the declared comparator class.
+ * @param dep : Element describing the dependency
+ * @param context : bundle context (to load the comparator class)
+ * @return the comparator object, null if not set.
+ * @throws ConfigurationException the comparator class cannot be load or the comparator cannot be instantiated correctly.
+ */
+ public static Comparator getComparator(Element dep, BundleContext context) throws ConfigurationException {
+ Comparator cmp = null;
+ String comp = dep.getAttribute("comparator");
+ if (comp != null) {
+ if (comp.equalsIgnoreCase("osgi")) {
+ cmp = new ServiceReferenceRankingComparator();
+ } else {
+ try {
+ Class cla = context.getBundle().loadClass(comp);
+ cmp = (Comparator) cla.newInstance();
+ } catch (ClassNotFoundException e) {
+ throw new ConfigurationException("Cannot load a customized comparator : " + e.getMessage());
+ } catch (IllegalAccessException e) {
+ throw new ConfigurationException("Cannot create a customized comparator : " + e.getMessage());
+ } catch (InstantiationException e) {
+ throw new ConfigurationException("Cannot create a customized comparator : " + e.getMessage());
+ }
+ }
+ }
+ return cmp;
+ }
+
+ /**
+ * Load the given specification class.
+ * @param specification : specification class name to load
+ * @param context : bundle context
+ * @return : the class object for the given specification
+ * @throws ConfigurationException : the class cannot be loaded correctly.
+ */
+ public static Class loadSpecification(String specification, BundleContext context) throws ConfigurationException {
+ Class spec = null;
+ try {
+ spec = context.getBundle().loadClass(specification);
+ } catch (ClassNotFoundException e) {
+ throw new ConfigurationException("A required specification cannot be loaded : " + specification);
+ }
+ return spec;
+ }
+
+ /**
+ * Helper method parsing the binding policy. If the 'policy' attribute is not set in the dependency, the method returns the 'DYNAMIC BINDING
+ * POLICY'. Accepted policy values are : dynamic, dynamic-priority and static.
+ * @param dep : Element describing the dependency
+ * @return : the policy attached to this dependency
+ * @throws ConfigurationException : an unknown biding policy was described.
+ */
+ public static int getPolicy(Element dep) throws ConfigurationException {
+ String policy = dep.getAttribute("policy");
+ if (policy == null || policy.equalsIgnoreCase("dynamic")) {
+ return DYNAMIC_BINDING_POLICY;
+ } else if (policy.equalsIgnoreCase("dynamic-priority")) {
+ return DYNAMIC_PRIORITY_BINDING_POLICY;
+ } else if (policy.equalsIgnoreCase("static")) {
+ return STATIC_BINDING_POLICY;
+ } else {
+ throw new ConfigurationException("Binding policy unknown : " + policy);
+ }
+ }
+
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyStateListener.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyStateListener.java
new file mode 100644
index 0000000..5131337
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/DependencyStateListener.java
@@ -0,0 +1,39 @@
+/*
+ * 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.util;
+
+
+/**
+ * This interface allows a class to be notified of dependency state changes.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public interface DependencyStateListener {
+
+ /**
+ * The given dependency becomes valid.
+ * @param dependency : dependency becoming valid.
+ */
+ void validate(DependencyModel dependency);
+
+ /**
+ * The given dependency becomes invalid.
+ * @param dependency : dependency becoming invalid.
+ */
+ void invalidate(DependencyModel dependency);
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Logger.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Logger.java
index 30a33a2..c8b8c26 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Logger.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Logger.java
@@ -28,6 +28,11 @@
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
public class Logger {
+
+ /**
+ * Ipojo default log level property.
+ */
+ public static final String IPOJO_LOG_LEVEL = "ipojo.log.level";
/**
* Log Level ERROR.
@@ -67,14 +72,24 @@
/**
* Constructor.
*
- * @param bc : bundle context
+ * @param context : bundle context
* @param name : name of the logger
* @param level : trace level
*/
- public Logger(BundleContext bc, String name, int level) {
+ public Logger(BundleContext context, String name, int level) {
m_name = name;
m_level = level;
- m_context = bc;
+ m_context = context;
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param context : bundle context
+ * @param name : name of the logger
+ */
+ public Logger(BundleContext context, String name) {
+ this(context, name, getDefaultLevel(context));
}
/**
@@ -85,7 +100,7 @@
*/
public void log(int level, String msg) {
if (m_level >= level) {
- dispatch(level, msg, null);
+ dispatch(level, msg);
}
}
@@ -94,26 +109,21 @@
*
* @param level : level of the message
* @param msg : message to log
- * @param ex : exception attached to the message
+ * @param exception : exception attached to the message
*/
- public void log(int level, String msg, Throwable ex) {
+ public void log(int level, String msg, Throwable exception) {
if (m_level >= level) {
- dispatch(level, msg, ex);
+ dispatch(level, msg, exception);
}
}
-
+
/**
* Internal log method.
*
* @param level : level of the message.
* @param msg : message to log
- * @param ex : exception attached to the message
*/
- private void dispatch(int level, String msg, Throwable ex) {
- String s = msg;
- if (ex != null) {
- s += " (" + ex.getMessage() + ")";
- }
+ private void dispatch(int level, String msg) {
ServiceReference ref = m_context.getServiceReference(LogService.class.getName());
LogService log = null;
@@ -124,35 +134,35 @@
String message = null;
switch (level) {
case DEBUG:
- message = "[" + m_name + "] DEBUG: " + s;
+ message = "[" + m_name + "] DEBUG: " + msg;
if (log != null) {
log.log(LogService.LOG_DEBUG, message);
}
- System.err.println(message);
+ System.err.println(message); // NOPMD
break;
case ERROR:
- message = "[" + m_name + "] ERROR: " + s;
+ message = "[" + m_name + "] ERROR: " + msg;
if (log != null) {
log.log(LogService.LOG_ERROR, message);
}
- System.err.println(message);
+ System.err.println(message); //NOPMD
break;
case INFO:
- message = "[" + m_name + "] INFO: " + s;
+ message = "[" + m_name + "] INFO: " + msg;
if (log != null) {
log.log(LogService.LOG_INFO, message);
}
- System.err.println(message);
+ System.err.println(message); // NOPMD
break;
case WARNING:
- message = "[" + m_name + "] WARNING: " + s;
+ message = "[" + m_name + "] WARNING: " + msg;
if (log != null) {
log.log(LogService.LOG_WARNING, message);
}
- System.err.println(message);
+ System.err.println(message); // NOPMD
break;
default:
- System.err.println("[" + m_name + "] UNKNOWN[" + level + "]: " + s);
+ System.err.println("[" + m_name + "] UNKNOWN[" + level + "]: " + msg); // NOPMD
break;
}
@@ -160,4 +170,98 @@
m_context.ungetService(ref);
}
}
+
+ /**
+ * Internal log method.
+ *
+ * @param level : level of the message.
+ * @param msg : message to log
+ * @param exception : exception attached to the message
+ */
+ private void dispatch(int level, String msg, Throwable exception) {
+
+ ServiceReference ref = m_context.getServiceReference(LogService.class.getName());
+ LogService log = null;
+ if (ref != null) {
+ log = (LogService) m_context.getService(ref);
+ }
+
+ String message = null;
+ switch (level) {
+ case DEBUG:
+ message = "[" + m_name + "] DEBUG: " + msg;
+ if (log != null) {
+ log.log(LogService.LOG_DEBUG, message, exception);
+ }
+ System.err.println(message); // NOPMD
+ exception.printStackTrace(); // NOPMD
+ break;
+ case ERROR:
+ message = "[" + m_name + "] ERROR: " + msg;
+ if (log != null) {
+ log.log(LogService.LOG_ERROR, message, exception);
+ }
+ System.err.println(message); // NOPMD
+ exception.printStackTrace(System.err); // NOPMD
+ break;
+ case INFO:
+ message = "[" + m_name + "] INFO: " + msg;
+ if (log != null) {
+ log.log(LogService.LOG_INFO, message, exception);
+ }
+ System.err.println(message); // NOPMD
+ exception.printStackTrace(System.err); // NOPMD
+ break;
+ case WARNING:
+ message = "[" + m_name + "] WARNING: " + msg;
+ if (log != null) {
+ log.log(LogService.LOG_WARNING, message, exception);
+ }
+ System.err.println(message); // NOPMD
+ exception.printStackTrace(System.err); // NOPMD
+ break;
+ default:
+ System.err.println("[" + m_name + "] UNKNOWN[" + level + "]: " + msg); // NOPMD
+ exception.printStackTrace(); // NOPMD
+ break;
+ }
+
+ if (log != null) {
+ m_context.ungetService(ref);
+ }
+ }
+
+ /**
+ * Get the default logger level.
+ * The property is searched inside the framework properties, the system properties,
+ * and in the manifest from the given bundle context. By default, set the level to WARNING.
+ * @param context : bundle context.
+ * @return the default log level.
+ */
+ private static int getDefaultLevel(BundleContext context) {
+ // First check in the framework and in the system properties
+ String level = context.getProperty(IPOJO_LOG_LEVEL);
+
+ // If null, look in bundle manifest
+ if (level == null) {
+ level = (String) context.getBundle().getHeaders().get(IPOJO_LOG_LEVEL);
+ }
+
+ if (level != null) {
+ if (level.equalsIgnoreCase("info")) {
+ return INFO;
+ } else if (level.equalsIgnoreCase("debug")) {
+ return DEBUG;
+ } else if (level.equalsIgnoreCase("warning")) {
+ return WARNING;
+ } else if (level.equalsIgnoreCase("error")) {
+ return ERROR;
+ }
+ }
+
+ // Either l is null, either the specified log level was unknown
+ // Set the default to WARNING
+ return WARNING;
+
+ }
}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Property.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Property.java
new file mode 100644
index 0000000..948b66b
--- /dev/null
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Property.java
@@ -0,0 +1,472 @@
+/*
+ * 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.util;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.FieldInterceptor;
+import org.apache.felix.ipojo.Handler;
+import org.apache.felix.ipojo.InstanceManager;
+import org.apache.felix.ipojo.parser.ParseUtils;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Property class managing a property.
+ * This class allows storing property value and calling setter method too.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class Property implements FieldInterceptor {
+
+ /**
+ * Name of the property (filed name if not set).
+ */
+ private String m_name;
+
+ /**
+ * Field of the property.
+ */
+ private String m_field;
+
+ /**
+ * Setter method of the property.
+ */
+ private Callback m_method;
+
+ /**
+ * Value of the property.
+ */
+ private Object m_value;
+
+ /**
+ * Type of the property.
+ */
+ private Class m_type;
+
+ /**
+ * Handler object on to use the logger.
+ */
+ private Handler m_handler;
+
+ /**
+ * Instance Manager.
+ */
+ private InstanceManager m_manager;
+
+ /**
+ * Configurable Property Constructor. At least the method or the field need
+ * to be referenced.
+ *
+ * @param name : name of the property (optional)
+ * @param field : name of the field
+ * @param method : method name
+ * @param value : initial value of the property (optional)
+ * @param type : the type of the property
+ * @param manager : instance manager
+ * @param handler : handler object which manage this property.
+ * @throws ConfigurationException : occurs when the property value cannot be set.
+ */
+ public Property(String name, String field, String method, String value, String type, InstanceManager manager, Handler handler) throws ConfigurationException {
+ m_handler = handler;
+ m_manager = manager;
+ m_field = field;
+
+ if (name == null) {
+ if (m_field == null) {
+ m_name = method;
+ } else {
+ m_name = field;
+ }
+ } else {
+ m_name = name;
+ }
+
+ m_field = field;
+ m_type = computeType(type, manager.getGlobalContext());
+ if (value != null) {
+ m_value = create(m_type, value);
+ }
+
+ if (method != null) {
+ m_method = new Callback(method, new String[] { m_type.getName() }, false, manager);
+ }
+
+ }
+
+ /**
+ * The set type method computes and returns the property type according to the given type name.
+ * @param type : the type name
+ * @param context : bundle context (used to load classes)
+ * @return the class of the given type
+ * @throws ConfigurationException if an error occurs when loading the type class for non-primitive types.
+ */
+ public static Class computeType(String type, BundleContext context) throws ConfigurationException {
+ // Array :
+ if (type.endsWith("[]")) {
+ return computeArrayType(type, context);
+ } else {
+ // Syntactic sugar to avoid writing java.lang.String
+ if ("string".equals(type) || "String".equals(type)) {
+ return java.lang.String.class;
+ } else if ("boolean".equals(type)) {
+ return Boolean.TYPE;
+ } else if ("byte".equals(type)) {
+ return Byte.TYPE;
+ } else if ("short".equals(type)) {
+ return Short.TYPE;
+ } else if ("int".equals(type)) {
+ return Integer.TYPE;
+ } else if ("long".equals(type)) {
+ return Long.TYPE;
+ } else if ("float".equals(type)) {
+ return Float.TYPE;
+ } else if ("double".equals(type)) {
+ return Double.TYPE;
+ } else if ("char".equals(type)) {
+ return Character.TYPE;
+ } else {
+ // Non array, complex type.
+ try {
+ return context.getBundle().loadClass(type);
+ } catch (ClassNotFoundException e) {
+ throw new ConfigurationException("Class not found exception in setValue on " + type + " : " + e.getMessage());
+ } catch (SecurityException e) {
+ throw new ConfigurationException("Security excption in setValue on " + type + " : " + e.getMessage());
+ } catch (IllegalArgumentException e) {
+ throw new ConfigurationException("Argument problem to call the constructor of the type " + type);
+ }
+ }
+ }
+ }
+
+ /**
+ * Get the Class object of a type array.
+ * @param type : the string descriptor of the type (must end by [] )
+ * @param context : bundle context (used to load classes)
+ * @return the Class object of the given type array.
+ * @throws ConfigurationException : if the class cannot be loaded
+ */
+ private static Class computeArrayType(String type, BundleContext context) throws ConfigurationException {
+ String internalType = type.substring(0, type.length() - 2);
+ if ("string".equals(internalType) || "String".equals(internalType)) {
+ return new String[0].getClass();
+ }
+ if ("boolean".equals(internalType)) {
+ return new boolean[0].getClass();
+ }
+ if ("byte".equals(internalType)) {
+ return new byte[0].getClass();
+ }
+ if ("short".equals(internalType)) {
+ return new short[0].getClass();
+ }
+ if ("int".equals(internalType)) {
+ return new int[0].getClass();
+ }
+ if ("long".equals(internalType)) {
+ return new long[0].getClass();
+ }
+ if ("float".equals(internalType)) {
+ return new float[0].getClass();
+ }
+ if ("double".equals(internalType)) {
+ return new double[0].getClass();
+ }
+ if ("char".equals(internalType)) {
+ return new char[0].getClass();
+ }
+
+ // Complex array type.
+ try {
+ Class clazz = context.getBundle().loadClass(internalType);
+ Object[] object = (Object[]) Array.newInstance(clazz, 0);
+ return object.getClass();
+ } catch (ClassNotFoundException e) {
+ throw new ConfigurationException("Class not found exception in setValue on " + internalType);
+ } catch (SecurityException e) {
+ throw new ConfigurationException("Secutiry Exception in setValue on " + internalType);
+ } catch (IllegalArgumentException e) {
+ throw new ConfigurationException("Argument problem to call the constructor of the type " + internalType);
+ }
+ }
+
+ public String getName() {
+ return m_name;
+ }
+
+ public String getField() {
+ return m_field;
+ }
+
+ /**
+ * Get method name, null if no method.
+ * @return the method name.
+ */
+ public String getMethod() {
+ if (m_method == null) { return null; }
+ return m_method.getMethod();
+ }
+
+ /**
+ * Check if the property has a method callback.
+ * @return true if the property has a method.
+ */
+ public boolean hasMethod() {
+ return m_method != null;
+ }
+
+ /**
+ * Check if the property has a field.
+ * @return true if the property has a field.
+ */
+ public boolean hasField() {
+ return m_field != null;
+ }
+
+ public Object getValue() {
+ return m_value;
+ }
+
+ /**
+ * Fix the value of the property.
+ * @param value : the new value.
+ */
+ public void setValue(Object value) {
+ // Is the object is directly assignable to the property, affect it.
+ if (isAssignable(m_type, value)) {
+ m_value = value;
+ } else {
+ // If the object is a String, we must recreate the object from the String form
+ if (value instanceof String) {
+ try {
+ m_value = create(m_type, (String) value);
+ } catch (ConfigurationException e) {
+ throw new ClassCastException("Incompatible type for the property " + m_name + " : " + e.getMessage());
+ }
+ } else {
+ // Error, the given property cannot be injected.
+ throw new ClassCastException("Incompatible type for the property " + m_name + " " + m_type.getName() + " expected, " + value.getClass() + " received");
+ }
+ }
+ }
+
+ /**
+ * Test if the given value is assignable to the given type.
+ * @param type : class of the type
+ * @param value : object to check
+ * @return true if the object is assignable in the property of type 'type'.
+ */
+ public static boolean isAssignable(Class type, Object value) {
+ if (value == null || type.isInstance(value)) { // When the value is null, the assign works necessary.
+ return true;
+ } else if (type.isPrimitive()) {
+ // Manage all boxing types.
+ if (value instanceof Boolean && Boolean.TYPE.equals(type)) { return true; }
+ if (value instanceof Byte && Byte.TYPE.equals(type)) { return true; }
+ if (value instanceof Short && Short.TYPE.equals(type)) { return true; }
+ if (value instanceof Integer && Integer.TYPE.equals(type)) { return true; }
+ if (value instanceof Long && Long.TYPE.equals(type)) { return true; }
+ if (value instanceof Float && Float.TYPE.equals(type)) { return true; }
+ if (value instanceof Double && Double.TYPE.equals(type)) { return true; }
+ if (value instanceof Character && Character.TYPE.equals(type)) { return true; }
+ return false;
+ } else {
+ // Else return false.
+ return false;
+ }
+ }
+
+ /**
+ * Create an object of the given type with the given String value.
+ * @param type : type of the returned object
+ * @param strValue : String value.
+ * @return the object of type 'type' created from the String 'value'
+ * @throws ConfigurationException occurs when the object cannot be created.
+ */
+ public static Object create(Class type, String strValue) throws ConfigurationException {
+ if (Boolean.TYPE.equals(type)) { return new Boolean(strValue); }
+ if (Byte.TYPE.equals(type)) { return new Byte(strValue); }
+ if (Short.TYPE.equals(type)) { return new Short(strValue); }
+ if (Integer.TYPE.equals(type)) { return new Integer(strValue); }
+ if (Long.TYPE.equals(type)) { return new Long(strValue); }
+ if (Float.TYPE.equals(type)) { return new Float(strValue); }
+ if (Double.TYPE.equals(type)) { return new Double(strValue); }
+ if (Character.TYPE.equals(type)) { return new Character(strValue.charAt(0)); }
+
+ // Array :
+ if (type.isArray()) { return createArrayObject(type.getComponentType(), ParseUtils.parseArrays(strValue)); }
+ // Else it is a neither a primitive type neither a String -> create
+ // the object by calling a constructor with a string in argument.
+ try {
+ Constructor cst = type.getConstructor(new Class[] { String.class });
+ return cst.newInstance(new Object[] { strValue });
+ } catch (SecurityException e) {
+ throw new ConfigurationException("Security exception in create on " + type + " : " + e.getMessage());
+ } catch (NoSuchMethodException e) {
+ throw new ConfigurationException("Constructor not found exception in create on " + type + " : " + e.getMessage());
+ } catch (IllegalArgumentException e) {
+ throw new ConfigurationException("Argument problem to call the constructor of the type " + type);
+ } catch (InstantiationException e) {
+ throw new ConfigurationException("Instantiation problem " + type);
+ } catch (IllegalAccessException e) {
+ throw new ConfigurationException("Illegal Access " + type);
+ } catch (InvocationTargetException e) {
+ throw new ConfigurationException("Invocation problem " + type + " : " + e.getTargetException().getMessage());
+ }
+
+ }
+
+ /**
+ * Create an array object containing the type 'interntype' from the String array 'values'.
+ * @param interntype : internal type of the array.
+ * @param values : String array
+ * @return the array containing objects created from the 'values' array
+ * @throws ConfigurationException occurs when the array cannot be created correctly
+ */
+ public static Object createArrayObject(Class interntype, String[] values) throws ConfigurationException {
+ if (Boolean.TYPE.equals(interntype)) {
+ boolean[] bool = new boolean[values.length];
+ for (int i = 0; i < values.length; i++) {
+ bool[i] = new Boolean(values[i]).booleanValue();
+ }
+ return bool;
+ }
+ if (Byte.TYPE.equals(interntype)) {
+ byte[] byt = new byte[values.length];
+ for (int i = 0; i < values.length; i++) {
+ byt[i] = new Byte(values[i]).byteValue();
+ }
+ return byt;
+ }
+ if (Short.TYPE.equals(interntype)) {
+ short[] shor = new short[values.length];
+ for (int i = 0; i < values.length; i++) {
+ shor[i] = new Short(values[i]).shortValue();
+ }
+ return shor;
+ }
+ if (Integer.TYPE.equals(interntype)) {
+ int[] ints = new int[values.length];
+ for (int i = 0; i < values.length; i++) {
+ ints[i] = new Integer(values[i]).intValue();
+ }
+ return ints;
+ }
+ if (Long.TYPE.equals(interntype)) {
+ long[] longs = new long[values.length];
+ for (int i = 0; i < values.length; i++) {
+ longs[i] = new Long(values[i]).longValue();
+ }
+ return longs;
+ }
+ if (Float.TYPE.equals(interntype)) {
+ float[] floats = new float[values.length];
+ for (int i = 0; i < values.length; i++) {
+ floats[i] = new Float(values[i]).floatValue();
+ }
+ return floats;
+ }
+ if (Double.TYPE.equals(interntype)) {
+ double[] doubles = new double[values.length];
+ for (int i = 0; i < values.length; i++) {
+ doubles[i] = new Double(values[i]).doubleValue();
+ }
+ return doubles;
+ }
+ if (Character.TYPE.equals(interntype)) {
+ char[] chars = new char[values.length];
+ for (int i = 0; i < values.length; i++) {
+ chars[i] = values[i].toCharArray()[0];
+ }
+ return chars;
+ }
+
+ // Else it is a neither a primitive type -> create the
+ // object by calling a constructor with a string in argument.
+ try {
+ Constructor cst = interntype.getConstructor(new Class[] { String.class });
+ Object[] object = (Object[]) Array.newInstance(interntype, values.length);
+ for (int i = 0; i < values.length; i++) {
+ object[i] = cst.newInstance(new Object[] { values[i].trim() });
+ }
+ return object;
+ } catch (NoSuchMethodException e) {
+ throw new ConfigurationException("Constructor not found exception in setValue on " + interntype.getName());
+ } catch (IllegalArgumentException e) {
+ throw new ConfigurationException("Argument problem to call the constructor of the type " + interntype.getName());
+ } catch (InstantiationException e) {
+ throw new ConfigurationException("Instantiation problem " + interntype.getName());
+ } catch (IllegalAccessException e) {
+ throw new ConfigurationException("Illegal Access Exception in " + interntype.getName());
+ } catch (InvocationTargetException e) {
+ throw new ConfigurationException("Invocation problem " + interntype.getName() + " : " + e.getTargetException().getMessage());
+ }
+ }
+
+ /**
+ * Invoke the setter method on the given pjo object. If no specified pojo object, will call on each created pojo object.
+ * @param instance : the created object (could be null
+ * @see org.apache.felix.ipojo.Handler#onCreation(java.lang.Object)
+ */
+ public void invoke(Object instance) {
+ try {
+ if (instance == null) {
+ m_method.call(new Object[] { m_value });
+ } else {
+ m_method.call(instance, new Object[] { m_value });
+ }
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The method " + m_method + " does not exist in the class " + m_manager.getClassName());
+ m_manager.stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The method " + m_method + " is not accessible in the class " + m_manager.getClassName());
+ m_manager.stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The method " + m_method + " in the class " + m_manager.getClassName() + "throws an exception : " + e.getTargetException().getMessage(), e.getTargetException());
+ m_manager.setState(ComponentInstance.INVALID);
+ }
+ }
+
+ /**
+ * A field value is required by the object 'pojo'.
+ * @param pojo : POJO object
+ * @param fieldName : field
+ * @param value : last value
+ * @return the value if the handler want to inject this value.
+ * @see org.apache.felix.ipojo.FieldInterceptor#onGet(java.lang.Object, java.lang.String, java.lang.Object)
+ */
+ public Object onGet(Object pojo, String fieldName, Object value) {
+ return getValue();
+ }
+
+ /**
+ * The field 'field' receives a new value.
+ * @param pojo : pojo
+ * @param fieldName : field name
+ * @param value : new value
+ * @see org.apache.felix.ipojo.FieldInterceptor#onSet(java.lang.Object, java.lang.String, java.lang.Object)
+ */
+ public void onSet(Object pojo, String fieldName, Object value) {
+ setValue(value);
+
+ }
+}
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Tracker.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Tracker.java
index 1c8ae1d..7dd3349 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Tracker.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/util/Tracker.java
@@ -42,7 +42,7 @@
/**
* Bundle context against which this Tracker object is tracking.
*/
- protected final BundleContext m_context;
+ protected BundleContext m_context;
/**
* Filter specifying search criteria for the services to track.
@@ -52,22 +52,22 @@
/**
* TrackerCustomizer object for this tracker.
*/
- final TrackerCustomizer m_customizer;
+ protected TrackerCustomizer m_customizer;
/**
* Filter string for use when adding the ServiceListener. If this field is set, then certain optimizations can be taken since we don't have a user supplied filter.
*/
- final String m_listenerFilter;
+ protected String m_listenerFilter;
/**
* Class name to be tracked. If this field is set, then we are tracking by class name.
*/
- private final String m_trackClass;
+ private String m_trackClass;
/**
* Reference to be tracked. If this field is set, then we are tracking a single ServiceReference.
*/
- private final ServiceReference m_trackReference;
+ private ServiceReference m_trackReference;
/**
* Tracked services: ServiceReference object -> customized. Object and ServiceListener object
@@ -126,13 +126,13 @@
} else {
m_customizer = customizer;
}
- this.m_listenerFilter = "(" + Constants.OBJECTCLASS + "=" + clazz.toString() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+ this.m_listenerFilter = "(" + Constants.OBJECTCLASS + "=" + clazz + ")";
try {
this.m_filter = context.createFilter(m_listenerFilter);
} catch (InvalidSyntaxException e) { // we could only get this exception
// if the clazz argument was
// malformed
- throw new IllegalArgumentException("unexpected InvalidSyntaxException: " + e.getMessage()); //$NON-NLS-1$
+ throw new IllegalArgumentException("unexpected InvalidSyntaxException: " + e.getMessage());
}
}
@@ -157,7 +157,7 @@
m_customizer = customizer;
}
if ((context == null) || (filter == null)) { // we throw a NPE here to be consistent with the other constructors
- throw new NullPointerException();
+ throw new NullPointerException(); // NOPMD by clement on 29/02/08 14:12
}
}
@@ -188,7 +188,7 @@
// the initial
// references
} catch (InvalidSyntaxException e) {
- throw new RuntimeException("unexpected InvalidSyntaxException: " + e.getMessage()); //$NON-NLS-1$
+ throw new IllegalStateException("unexpected InvalidSyntaxException: " + e.getMessage()); //$NON-NLS-1$
}
}
/* Call tracked outside of synchronized region */
@@ -220,8 +220,8 @@
try {
m_context.removeServiceListener(outgoing);
- } catch (IllegalStateException e) {
- System.err.println("Context stopped");
+ } catch (IllegalStateException e) { //NOPMD
+ //System.err.println("Context stopped");
/* In case the context was stopped. */
}
if (references != null) {
@@ -254,7 +254,7 @@
* @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
*/
public void addedService(ServiceReference reference) {
-
+ // Nothing to do.
}
/**
@@ -266,6 +266,7 @@
* @see TrackerCustomizer
*/
public void modifiedService(ServiceReference reference, Object service) {
+ // Nothing to do.
}
/**
@@ -326,8 +327,7 @@
Iterator keys = tracked.keySet().iterator();
for (int i = 0; i < length; i++) {
references[i] = (ServiceReference) keys.next();
- }
- // The resulting array is sorted by ranking.
+ }
return references;
}
}
@@ -353,6 +353,31 @@
return references;
}
}
+
+ /**
+ * Return the list of references used by the tracker.
+ * A reference becomes used when the dependency has already
+ * call getService on this reference.
+ * @return : the list of used references.
+ */
+ public List/*<ServiceReference>*/getUsedServiceReferences() {
+ Tracked tracked = this.m_tracked; // use local var since we are not synchronized
+ if (tracked == null || tracked.size() == 0) { // if Tracker is not open or empty
+ return null;
+ }
+ synchronized (tracked) {
+ int length = tracked.size();
+ List references = new ArrayList();
+ Iterator keys = tracked.keySet().iterator();
+ for (int i = 0; i < length; i++) {
+ Object key = keys.next();
+ if (tracked.get(key) != null) {
+ references.add(key);
+ }
+ }
+ return references;
+ }
+ }
/**
* Returns a ServiceReference object for one of the services being tracked by this Tracker object.
@@ -388,11 +413,13 @@
Object object = null;
synchronized (tracked) {
object = tracked.get(reference);
- if (object != null) { // The object was already get.
- return object;
- } else if (tracked.containsKey(reference)) { // Not already get
- object = m_context.getService(reference);
- tracked.put(reference, object);
+ if (object == null) {
+ if (tracked.containsKey(reference)) { // Not already get but already tracked.
+ object = m_context.getService(reference);
+ tracked.put(reference, object);
+ return object;
+ }
+ } else { // The object was already get.
return object;
}
// Not already tracked.
@@ -430,10 +457,10 @@
synchronized (tracked) {
ServiceReference[] references = getServiceReferences();
int length = 0;
- if (references != null) {
- length = references.length;
- } else {
+ if (references == null) {
return null;
+ } else {
+ length = references.length;
}
Object[] objects = new Object[length];
for (int i = 0; i < length; i++) {
@@ -541,7 +568,7 @@
while (true) {
ServiceReference reference;
synchronized (this) {
- if (m_initial.size() == 0) { // if there are no more inital services
+ if (m_initial.isEmpty()) { // if there are no more inital services
return; // we are done
}
@@ -580,14 +607,14 @@
switch (event.getType()) {
case ServiceEvent.REGISTERED:
case ServiceEvent.MODIFIED:
- if (m_listenerFilter != null) { // constructor supplied filter
- track(reference);
- } else { // user supplied filter
+ if (m_listenerFilter == null) { // user supplied filter
if (m_filter.match(reference)) {
track(reference); // Arrival
} else {
untrack(reference); // Departure
}
+ } else { // constructor supplied filter
+ track(reference);
}
break;
case ServiceEvent.UNREGISTERING:
diff --git a/ipojo/core/src/main/resources/metadata.xml b/ipojo/core/src/main/resources/metadata.xml
index 9d02336..3163416 100644
--- a/ipojo/core/src/main/resources/metadata.xml
+++ b/ipojo/core/src/main/resources/metadata.xml
@@ -1,41 +1,27 @@
<ipojo>
-<!-- Primitives handler -->
-<handler classname="org.apache.felix.ipojo.handlers.lifecycle.controller.ControllerHandler" name="controller" architecture="false"/>
-<handler classname="org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler" name="callback" level="1" architecture="false"/>
-<handler classname="org.apache.felix.ipojo.handlers.dependency.DependencyHandler" name="requires" level="0" architecture="false">
- <controller field="m_state"/>
-</handler>
-<handler classname="org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler" name="provides" level="3" architecture="false"/>
-<handler classname="org.apache.felix.ipojo.handlers.configuration.ConfigurationHandler" name="properties" level="1" architecture="false"/>
-<handler classname="org.apache.felix.ipojo.handlers.architecture.ArchitectureHandler" name="architecture" architecture="false">
- <provides>
- <property field="m_name" name="instance.name" value=""/>
- </provides>
-</handler>
-
-<!-- Composite Handler -->
-<handler classname="org.apache.felix.ipojo.composite.instance.InstanceHandler" name="instance" type="composite" architecture="false">
- <controller field="m_isValid"/>
- <requires filter="(&(factory.state=1)(factory.name=*))" field="m_factories" optional="true" architecture="false">
- <callback type="bind" method="bindFactory"/>
- <callback type="unbind" method="unbindFactory"/>
- </requires>
-</handler>
-<handler classname="org.apache.felix.ipojo.composite.service.importer.ImportHandler" name="requires" type="composite" architecture="false">
- <controller field="m_valid"/>
-</handler>
-<handler classname="org.apache.felix.ipojo.composite.service.importer.ExportHandler" name="exports" type="composite" architecture="false">
- <controller field="m_valid"/>
-</handler>
-<handler classname="org.apache.felix.ipojo.composite.service.instantiator.ServiceInstantiatorHandler" name="service" type="composite" architecture="false">
- <controller field="m_isValid"/>
-</handler>
-<handler classname="org.apache.felix.ipojo.composite.service.provides.ProvidedServiceHandler" name="provides" type="composite" architecture="false">
- <controller field="m_valid"/>
-</handler>
-<handler classname="org.apache.felix.ipojo.composite.architecture.ArchitectureHandler" name="architecture" type="composite" architecture="false">
- <provides>
- <property field="m_name" name="instance.name" value=""/>
- </provides>
-</handler>
+ <!-- Primitives handler -->
+ <handler
+ classname="org.apache.felix.ipojo.handlers.lifecycle.controller.ControllerHandler"
+ name="controller" architecture="false" />
+ <handler
+ classname="org.apache.felix.ipojo.handlers.lifecycle.callback.LifecycleCallbackHandler"
+ name="callback" level="1" architecture="false" />
+ <handler
+ classname="org.apache.felix.ipojo.handlers.dependency.DependencyHandler"
+ name="requires" level="0" architecture="false">
+ <!-- <controller field="m_state"/> -->
+ </handler>
+ <handler
+ classname="org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler"
+ name="provides" level="3" architecture="false" />
+ <handler
+ classname="org.apache.felix.ipojo.handlers.configuration.ConfigurationHandler"
+ name="properties" level="1" architecture="false" />
+ <handler
+ classname="org.apache.felix.ipojo.handlers.architecture.ArchitectureHandler"
+ name="architecture" architecture="false">
+ <provides>
+ <property field="m_name" name="instance.name" value="" />
+ </provides>
+ </handler>
</ipojo>
\ No newline at end of file
diff --git a/ipojo/event.admin.handler/pom.xml b/ipojo/event.admin.handler/pom.xml
index fb69c57..840cf9f 100644
--- a/ipojo/event.admin.handler/pom.xml
+++ b/ipojo/event.admin.handler/pom.xml
@@ -1,84 +1,90 @@
-<!--
- 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.
--->
+<!--
+ 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.
+-->
<project>
- <modelVersion>4.0.0</modelVersion>
- <packaging>bundle</packaging>
- <name>iPOJO Event Admin Handler</name>
- <groupId>org.apache.felix</groupId>
- <version>0.7.5-SNAPSHOT</version>
- <artifactId>org.apache.felix.ipojo.handler.event</artifactId>
-
- <dependencies>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.ipojo</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.apache.felix.ipojo.metadata</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.osgi.core</artifactId>
- <version>1.1.0-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>org.apache.felix</groupId>
- <artifactId>org.osgi.compendium</artifactId>
- <version>1.0.0</version>
- </dependency>
- </dependencies>
-
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO Event Admin Handler</name>
+ <artifactId>org.apache.felix.ipojo.handler.event</artifactId>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <version>1.4.0</version>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Private-Package>org.apache.felix.ipojo.handler.event</Private-Package>
- <Bundle-Name>${pom.name}</Bundle-Name>
- <Bundle-SymbolicName>ipojo.event.admin.handler</Bundle-SymbolicName>
- </instructions>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-ipojo-plugin</artifactId>
- <version>${pom.version}</version>
- <executions>
- <execution>
- <goals>
- <goal>ipojo-bundle</goal>
- </goals>
- <configuration>
- <metadata>metadata.xml</metadata>
- </configuration>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Private-Package>
+ org.apache.felix.ipojo.handler.event
+ </Private-Package>
+ <Bundle-Name>${pom.name}</Bundle-Name>
+ <Bundle-SymbolicName>
+ ipojo.event.admin.handler
+ </Bundle-SymbolicName>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <metadata>metadata.xml</metadata>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
</project>
diff --git a/ipojo/event.admin.handler/src/main/java/org/apache/felix/ipojo/handler/event/EventAdminSubscriberHandler.java b/ipojo/event.admin.handler/src/main/java/org/apache/felix/ipojo/handler/event/EventAdminSubscriberHandler.java
index b2654ca..5c090c3 100644
--- a/ipojo/event.admin.handler/src/main/java/org/apache/felix/ipojo/handler/event/EventAdminSubscriberHandler.java
+++ b/ipojo/event.admin.handler/src/main/java/org/apache/felix/ipojo/handler/event/EventAdminSubscriberHandler.java
@@ -27,13 +27,13 @@
import org.apache.felix.ipojo.ConfigurationException;
import org.apache.felix.ipojo.InstanceManager;
import org.apache.felix.ipojo.PrimitiveHandler;
-import org.apache.felix.ipojo.architecture.ComponentDescription;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
import org.apache.felix.ipojo.architecture.PropertyDescription;
import org.apache.felix.ipojo.metadata.Element;
-import org.apache.felix.ipojo.parser.ManipulationMetadata;
import org.apache.felix.ipojo.parser.MethodMetadata;
+import org.apache.felix.ipojo.parser.ParseUtils;
+import org.apache.felix.ipojo.parser.PojoMetadata;
import org.apache.felix.ipojo.util.Callback;
-import org.apache.felix.ipojo.util.Logger;
import org.osgi.framework.InvalidSyntaxException;
import org.osgi.service.event.Event;
import org.osgi.service.event.EventHandler;
@@ -71,7 +71,7 @@
* @throws ConfigurationException : metadata are incorrect.
* @see org.apache.felix.ipojo.Handler#initializeComponentFactory(org.apache.felix.ipojo.architecture.ComponentDescription, org.apache.felix.ipojo.metadata.Element)
*/
- public void initializeComponentFactory(ComponentDescription cd, Element metadata) throws ConfigurationException {
+ public void initializeComponentFactory(ComponentTypeDescription cd, Element metadata) throws ConfigurationException {
// Update the current component description
Dictionary dict = new Properties();
cd.addProperty(new PropertyDescription("event.topics", Dictionary.class.getName(), dict.toString()));
@@ -93,11 +93,11 @@
// Store the component manager
m_manager = getInstanceManager();
- ManipulationMetadata mm = new ManipulationMetadata(metadata);
+ PojoMetadata mm = getFactory().getPojoMetadata();
// Get Metadata subscribers
Element[] subscribers = metadata.getElements("subscriber", NAMESPACE);
- if (subscribers.length > 0) {
+ if (subscribers != null) {
// then check publishers are well formed and fill the publishers'
// map
for (int i = 0; i < subscribers.length; i++) {
@@ -109,25 +109,24 @@
Callback cb = new Callback(methodMetadata, m_manager);
eventAdminSubscriberMetadata.setCallback(cb);
} else {
- log(Logger.WARNING, " EVENT HANDLER SUBSCRIBERS : malformed subscriber : the method " + eventAdminSubscriberMetadata.getCallbackStr() + "(Event myEvent) is not present in the component");
+ warn(" EVENT HANDLER SUBSCRIBERS : malformed subscriber : the method " + eventAdminSubscriberMetadata.getCallbackStr() + "(Event myEvent) is not present in the component");
throw new ConfigurationException("EVENT HANDLER SUBSCRIBERS : malformed subscriber : the method " + eventAdminSubscriberMetadata.getCallbackStr() + "(Event myEvent) is not present in the component");
}
m_subEvent.add(eventAdminSubscriberMetadata);
} else {
- log(Logger.WARNING, " EVENT HANDLER SUBSCRIBERS : malformed subscriber !");
+ warn(" EVENT HANDLER SUBSCRIBERS : malformed subscriber !");
throw new ConfigurationException("EVENT HANDLER SUBSCRIBERS : malformed subscriber !");
}
}
- log(Logger.INFO, " EVENT HANDLER SUBSCRIBERS : Suscribers detected !");
} else {
- log(Logger.ERROR, " EVENT HANDLER SUBSCRIBERS : no Suscribers detected !");
+ error(" EVENT HANDLER SUBSCRIBERS : no Suscribers detected !");
throw new ConfigurationException(" EVENT HANDLER SUBSCRIBERS : no Suscribers detected !");
}
// if well formed publishers or subscribers found
if (!m_subEvent.isEmpty()) {
// register the handler
- log(Logger.INFO, " EVENT HANDLER SUBSCRIBERS has been configured !");
+ info(" EVENT HANDLER SUBSCRIBERS has been configured !");
} else {
return;
}
@@ -178,8 +177,6 @@
* @see org.apache.felix.ipojo.Handler#start()
*/
public void start() {
- log(Logger.INFO, " EVENT HANDLER SUBSCRIBERS STARTING!!!");
-
if (!m_subEvent.isEmpty()) {
// build the topic to listen
// Topics is a merge of all required topics by subscribers
@@ -198,9 +195,7 @@
}
// Put the m_topics properties to the good value
- m_topics = topics.split(",");
-
- log(Logger.INFO, " EVENT HANDLER SUBSCRIBERS : EventHandler registered object: " + this);
+ m_topics = ParseUtils.split(topics, ",");
}
}
@@ -249,7 +244,7 @@
c.call(new Object[] { event });
}
} catch (Exception e) {
- log(Logger.ERROR, "EVENT HANDLER SUBSCRIBERS CALLBACK error : " + eventSubscriberData.getCallbackStr() + " exception :" + e + " Cause : " + e.getCause());
+ error("EVENT HANDLER SUBSCRIBERS CALLBACK error : " + eventSubscriberData.getCallbackStr() + " exception :" + e.getMessage());
// stop the component :
m_manager.setState(InstanceManager.INVALID);
}
diff --git a/ipojo/event.admin.handler/src/main/java/org/apache/felix/ipojo/handler/event/EventAdminSubscriberMetadata.java b/ipojo/event.admin.handler/src/main/java/org/apache/felix/ipojo/handler/event/EventAdminSubscriberMetadata.java
index 989f633..826f547 100644
--- a/ipojo/event.admin.handler/src/main/java/org/apache/felix/ipojo/handler/event/EventAdminSubscriberMetadata.java
+++ b/ipojo/event.admin.handler/src/main/java/org/apache/felix/ipojo/handler/event/EventAdminSubscriberMetadata.java
@@ -20,6 +20,7 @@
import org.apache.felix.ipojo.InstanceManager;
import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ParseUtils;
import org.apache.felix.ipojo.util.Callback;
import org.apache.felix.ipojo.util.Logger;
import org.osgi.framework.Filter;
@@ -43,7 +44,7 @@
private Callback m_callback;
/**
- * Listenned topics.
+ * Listened topics.
*/
private String m_topics;
@@ -112,12 +113,11 @@
* @return true if the given topic is a listenned topic.
*/
public boolean matchingTopic(String topic) {
- return EventUtil.matches(topic, m_topics.split(","));
+ return EventUtil.matches(topic, ParseUtils.split(m_topics, ","));
}
/**
- * Is the subscriber metadata valid ?
- * This method check only the existence of a callback and a name attribute.
+ * Is the subscriber metadata valid ? This method check only the existence of a callback and a name attribute.
* @param subscriber : metadata.
* @return true if the metadata is valid.
*/
@@ -174,8 +174,7 @@
}
/**
- * Create and set the filter.
- * The filter is create from the given argument.
+ * Create and set the filter. The filter is create from the given argument.
* @param filter : the String form of the LDAP filter.
* @throws InvalidSyntaxException : occurs when the given filter is invalid.
*/
diff --git a/ipojo/examples/junit4osgi/felix-command/metadata.xml b/ipojo/examples/junit4osgi/felix-command/metadata.xml
new file mode 100644
index 0000000..87f7db1
--- /dev/null
+++ b/ipojo/examples/junit4osgi/felix-command/metadata.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO>
+ <component
+ className="org.apache.felix.ipojo.junit4osgi.command.JunitCommand"
+ factory="false">
+ <requires field="runner" />
+ <provides />
+ </component>
+ <instance
+ component="org.apache.felix.ipojo.junit4osgi.command.JunitCommand" />
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/junit4osgi/felix-command/pom.xml b/ipojo/examples/junit4osgi/felix-command/pom.xml
new file mode 100644
index 0000000..f810d59
--- /dev/null
+++ b/ipojo/examples/junit4osgi/felix-command/pom.xml
@@ -0,0 +1,95 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>Junit4Osgi</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Junit4Osgi-Felix-Command</name>
+ <artifactId>
+ org.apache.felix.ipojo.junit4osgi.felix-command
+ </artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.shell</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ </dependency>
+ </dependencies>
+ <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.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>
+ iPOJO OSGi Junit Runner - Felix Command
+ </Bundle-Name>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ org.apache.felix.ipojo.junit4osgi.command
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/junit4osgi/felix-command/src/main/java/org/apache/felix/ipojo/junit4osgi/command/JunitCommand.java b/ipojo/examples/junit4osgi/felix-command/src/main/java/org/apache/felix/ipojo/junit4osgi/command/JunitCommand.java
new file mode 100644
index 0000000..a217a9e
--- /dev/null
+++ b/ipojo/examples/junit4osgi/felix-command/src/main/java/org/apache/felix/ipojo/junit4osgi/command/JunitCommand.java
@@ -0,0 +1,111 @@
+/*
+ * 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.junit4osgi.command;
+
+import java.io.PrintStream;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ListIterator;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestFailure;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiJunitRunner;
+import org.apache.felix.shell.Command;
+
+/**
+ * Felix shell command. Allow to run tests.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class JunitCommand implements Command {
+
+ private OSGiJunitRunner runner;
+
+ private List<String> getNamesFromTests(List<Test> list) {
+ List<String> names = new ArrayList<String>(list.size());
+ for (int i = 0; i < list.size(); i++) {
+ if (list.get(i) instanceof TestCase) {
+ names.add(((TestCase) list.get(i)).getName());
+ }
+ if (list.get(i) instanceof TestSuite) {
+ String name = ((TestSuite) list.get(i)).getName();
+ if (name == null) {
+ name = ((TestSuite) list.get(i)).toString();
+ }
+ names.add(name);
+ }
+ }
+ return names;
+ }
+
+ public void execute(String line, PrintStream out, PrintStream err) {
+ line = line.substring(getName().length()).trim();
+ List<TestResult> tr = null;
+ if (line.equals("all")) {
+ if (runner.getTests() == null) {
+ err.println("No tests to execute");
+ return;
+ } else {
+ out.println("Executing " + getNamesFromTests(runner.getTests()));
+ tr = runner.run();
+ }
+ } else {
+ try {
+ Long bundleId = new Long(line);
+ if (runner.getTests(bundleId) == null) {
+ err.println("No tests to execute");
+ return;
+ } else {
+ out.println("Executing " + getNamesFromTests(runner.getTests(bundleId)));
+ tr = runner.run(bundleId);
+ }
+ } catch (NumberFormatException e) {
+ err.println("Unable to parse id " + line);
+ return;
+ }
+ }
+
+ ListIterator<TestResult> it = tr.listIterator();
+ while (it.hasNext()) {
+ TestResult result = it.next();
+ if (result.failureCount() != 0) {
+ TestFailure fail = (TestFailure) result.failures().nextElement();
+ out.println(fail.trace());
+ return;
+ }
+ }
+
+ }
+
+ public String getName() {
+ return "junit";
+ }
+
+ public String getShortDescription() {
+ return "launch junit tests";
+ }
+
+ public String getUsage() {
+ return "junit";
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/immediate-launcher/metadata.xml b/ipojo/examples/junit4osgi/immediate-launcher/metadata.xml
new file mode 100644
index 0000000..648ab67
--- /dev/null
+++ b/ipojo/examples/junit4osgi/immediate-launcher/metadata.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO>
+ <component
+ className="org.apache.felix.ipojo.junit4osgi.command.ImmediateRunner"
+ factory="false">
+ <requires field="runner" />
+ <callback method="start" transition="validate" />
+ </component>
+ <instance
+ component="org.apache.felix.ipojo.junit4osgi.command.ImmediateRunner"
+ name="immediate-runner" />
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/junit4osgi/immediate-launcher/pom.xml b/ipojo/examples/junit4osgi/immediate-launcher/pom.xml
new file mode 100644
index 0000000..18cfb31
--- /dev/null
+++ b/ipojo/examples/junit4osgi/immediate-launcher/pom.xml
@@ -0,0 +1,95 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>Junit4Osgi</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Junit4Osgi-Immediate-Runner</name>
+ <artifactId>
+ org.apache.felix.ipojo.junit4osgi.immediate-runner
+ </artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.shell</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ </dependency>
+ </dependencies>
+ <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.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>
+ iPOJO OSGi Junit Runner - Immediate Runner
+ </Bundle-Name>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ org.apache.felix.ipojo.junit4osgi.command
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/junit4osgi/immediate-launcher/src/main/java/org/apache/felix/ipojo/junit4osgi/command/ImmediateRunner.java b/ipojo/examples/junit4osgi/immediate-launcher/src/main/java/org/apache/felix/ipojo/junit4osgi/command/ImmediateRunner.java
new file mode 100644
index 0000000..199cdf6
--- /dev/null
+++ b/ipojo/examples/junit4osgi/immediate-launcher/src/main/java/org/apache/felix/ipojo/junit4osgi/command/ImmediateRunner.java
@@ -0,0 +1,35 @@
+/*
+ * 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.junit4osgi.command;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiJunitRunner;
+
+/**
+ * Felix shell command. Allow to run tests.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ImmediateRunner {
+
+ private OSGiJunitRunner runner;
+
+ public void start() {
+ runner.run();
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/junit4osgi/metadata.xml b/ipojo/examples/junit4osgi/junit4osgi/metadata.xml
new file mode 100644
index 0000000..83d84d3
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/metadata.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO xmlns:extender="org.apache.felix.ipojo.extender">
+ <Component
+ className="org.apache.felix.ipojo.junit4osgi.impl.JunitExtender">
+ <extender:extender extension="Test-Suite"
+ onArrival="onBundleArrival" onDeparture="onBundleDeparture" />
+ <callback transition="invalidate" method="stopping" />
+ <callback transition="validate" method="starting" />
+ <provides />
+ </Component>
+ <instance
+ component="org.apache.felix.ipojo.junit4osgi.impl.JunitExtender" />
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/junit4osgi/junit4osgi/pom.xml b/ipojo/examples/junit4osgi/junit4osgi/pom.xml
new file mode 100644
index 0000000..e4ffbf4
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/pom.xml
@@ -0,0 +1,103 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>Junit4Osgi</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Junit4Osgi</name>
+ <artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ </dependency>
+ </dependencies>
+ <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.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>
+ iPOJO OSGi Junit Runner
+ </Bundle-Name>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ org.apache.felix.ipojo.junit4osgi.impl,
+ org.apache.felix.ipojo.junit4osgi.test
+ </Private-Package>
+ <Export-Package>
+ org.apache.felix.ipojo.junit4osgi, junit.*
+ </Export-Package>
+ <Test-Suite>
+ org.apache.felix.ipojo.junit4osgi.test.TestTestCase,
+ org.apache.felix.ipojo.junit4osgi.test.TestOSGiTestCase,
+ org.apache.felix.ipojo.junit4osgi.test.TestTestSuite,
+ org.apache.felix.ipojo.junit4osgi.test.TestOSGiTestSuite
+ </Test-Suite>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/OSGiJunitRunner.java b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/OSGiJunitRunner.java
new file mode 100644
index 0000000..57a67d6
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/OSGiJunitRunner.java
@@ -0,0 +1,72 @@
+/*
+ * 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.junit4osgi;
+
+import java.io.PrintStream;
+import java.util.List;
+
+import junit.framework.Test;
+import junit.framework.TestResult;
+
+/**
+ * OSGi Junit Runner.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public interface OSGiJunitRunner {
+
+ /**
+ * Set the output stream of the runner.
+ * @param ps : print stream.
+ */
+ void setResultPrinter(PrintStream ps);
+
+ /**
+ * Run the tests.
+ * @return the list of TestResult.
+ */
+ List<TestResult> run();
+
+ /**
+ * Run the tests from the given bundle.
+ * @param bundleId : bundle containing the tests.
+ * @return the list of the results.
+ */
+ List<TestResult> run(long bundleId);
+
+ /**
+ * Get the list of available test suites.
+ * @return the list of test suites.
+ */
+ List<Test> getTests();
+
+ /**
+ * Get the tests from the given bundle.
+ * @param bundleId : bundle id.
+ * @return the list of test suites contained in the given bundle.
+ */
+ List<Test> getTests(long bundleId);
+
+ /**
+ * Run the given test.
+ * @param test : test to execute.
+ * @return the result.
+ */
+ public TestResult run(Test test);
+
+}
diff --git a/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/OSGiTestCase.java b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/OSGiTestCase.java
new file mode 100644
index 0000000..e10ad04
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/OSGiTestCase.java
@@ -0,0 +1,187 @@
+/*
+ * 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.junit4osgi;
+
+import junit.framework.TestCase;
+
+import org.osgi.framework.BundleContext;
+
+/**
+ * OSGi Test Case. Allow the injection of the bundle context.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class OSGiTestCase extends TestCase {
+
+ protected BundleContext context;
+
+ public void setBundleContext(BundleContext bc) {
+ context = bc;
+ }
+
+ /**
+ * Asserts that two doubles are equal. If they are not an AssertionFailedError is thrown with the given message.
+ */
+ static public void assertEquals(String message, double expected, double actual) {
+ if (Double.compare(expected, actual) != 0) {
+ fail(formatEqualsMessage(message, expected, actual));
+ }
+ }
+
+ static String formatEqualsMessage(String message, Object expected, Object actual) {
+ String formatted = "";
+ if (message != null) {
+ formatted = message + " ";
+ }
+ return formatted + "expected:<" + expected + "> but was:<" + actual + ">";
+ }
+
+ static String formatNotEqualsMessage(String message, Object o1, Object o2) {
+ String formatted = "";
+ if (message != null) {
+ formatted = message + " ";
+ }
+ return formatted + "o1:<" + o1 + "> is equals to o2:<" + o2 + ">";
+ }
+
+ static String formatContainsMessage(String message, Object[] array, Object txt) {
+ String formatted = "";
+ if (message != null) {
+ formatted = message + " ";
+ }
+
+ String arr = null;
+ for (int i = 0; i < array.length; i++) {
+ if (arr == null) {
+ arr = "[" + array[i];
+ } else {
+ arr += "," + array[i];
+ }
+ }
+ arr += "]";
+
+ return formatted + "array:" + arr + " does not contains:<" + txt + ">";
+ }
+
+ static public void assertNotEquals(String message, Object o1, Object o2) {
+ if (o1.equals(o2)) {
+ fail(formatNotEqualsMessage(message, o1, o2));
+ }
+ }
+
+ static public void assertContains(String message, String[] array, String txt) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i].equals(txt)) {
+ return;
+ }
+ }
+ fail(formatContainsMessage(message, array, txt));
+ }
+
+ static public void assertContains(String message, byte[] array, int txt) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] == txt) {
+ return;
+ }
+ }
+ Byte[] bytes = new Byte[array.length];
+ for (int i = 0; i < array.length; i++) {
+ bytes[i] = new Byte(array[i]);
+ }
+ fail(formatContainsMessage(message, bytes, txt));
+ }
+
+ static public void assertContains(String message, short[] array, int txt) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] == txt) {
+ return;
+ }
+ }
+ Short[] bytes = new Short[array.length];
+ for (int i = 0; i < array.length; i++) {
+ bytes[i] = new Short(array[i]);
+ }
+ fail(formatContainsMessage(message, bytes, txt));
+ }
+
+ static public void assertContains(String message, int[] array, int txt) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] == txt) {
+ return;
+ }
+ }
+ Integer[] bytes = new Integer[array.length];
+ for (int i = 0; i < array.length; i++) {
+ bytes[i] = new Integer(array[i]);
+ }
+ fail(formatContainsMessage(message, bytes, txt));
+ }
+
+ static public void assertContains(String message, long[] array, long txt) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] == txt) {
+ return;
+ }
+ }
+ Long[] bytes = new Long[array.length];
+ for (int i = 0; i < array.length; i++) {
+ bytes[i] = new Long(array[i]);
+ }
+ fail(formatContainsMessage(message, bytes, txt));
+ }
+
+ static public void assertContains(String message, float[] array, float txt) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] == txt) {
+ return;
+ }
+ }
+ Float[] bytes = new Float[array.length];
+ for (int i = 0; i < array.length; i++) {
+ bytes[i] = new Float(array[i]);
+ }
+ fail(formatContainsMessage(message, bytes, txt));
+ }
+
+ static public void assertContains(String message, double[] array, double txt) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] == txt) {
+ return;
+ }
+ }
+ Double[] bytes = new Double[array.length];
+ for (int i = 0; i < array.length; i++) {
+ bytes[i] = new Double(array[i]);
+ }
+ fail(formatContainsMessage(message, bytes, txt));
+ }
+
+ static public void assertContains(String message, char[] array, char txt) {
+ for (int i = 0; i < array.length; i++) {
+ if (array[i] == txt) {
+ return;
+ }
+ }
+ Character[] bytes = new Character[array.length];
+ for (int i = 0; i < array.length; i++) {
+ bytes[i] = new Character(array[i]);
+ }
+ fail(formatContainsMessage(message, bytes, txt));
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/OSGiTestSuite.java b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/OSGiTestSuite.java
new file mode 100644
index 0000000..8e7795a
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/OSGiTestSuite.java
@@ -0,0 +1,87 @@
+/*
+ * 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.junit4osgi;
+
+import junit.framework.Test;
+import junit.framework.TestCase;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import org.osgi.framework.BundleContext;
+
+/**
+ * OSGi Test Suite.
+ * Allow the injection of the bundle context.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class OSGiTestSuite extends TestSuite {
+
+ protected BundleContext context;
+
+ public OSGiTestSuite(Class clazz, BundleContext bc) {
+ super(clazz);
+ context = bc;
+ }
+
+ public OSGiTestSuite(BundleContext bc) {
+ super();
+ context = bc;
+ }
+
+ public OSGiTestSuite(String name, BundleContext bc) {
+ super(name);
+ context = bc;
+ }
+
+ public OSGiTestSuite(Class clazz, String name, BundleContext bc) {
+ super(clazz, name);
+ context = bc;
+ }
+
+ public void setBundleContext(BundleContext bc) {
+ context = bc;
+ }
+
+ /**
+ * Adds the tests from the given class to the suite
+ */
+ public void addTestSuite(Class testClass) {
+ if (OSGiTestCase.class.isAssignableFrom(testClass)) {
+ addTest(new OSGiTestSuite(testClass, context));
+ } else if (TestCase.class.isAssignableFrom(testClass)) {
+ addTest(new TestSuite(testClass));
+ } else {
+ System.out.println("Error : the " + testClass + " is not a valid test class");
+ }
+ }
+
+ public void runTest(Test test, TestResult result) {
+ if (test instanceof OSGiTestSuite) {
+ ((OSGiTestSuite) test).context = context;
+ test.run(result);
+ } else if (test instanceof OSGiTestCase) {
+ ((OSGiTestCase) test).context = context;
+ test.run(result);
+ } else {
+ test.run(result);
+ }
+
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/impl/JunitExtender.java b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/impl/JunitExtender.java
new file mode 100644
index 0000000..34f0382
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/impl/JunitExtender.java
@@ -0,0 +1,302 @@
+/*
+ * 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.junit4osgi.impl;
+
+import java.io.PrintStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import junit.framework.Test;
+import junit.framework.TestResult;
+import junit.framework.TestSuite;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiJunitRunner;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Detect test suite from installed bundles.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class JunitExtender implements OSGiJunitRunner {
+
+ public static final String SUITE_METHODNAME = "suite";
+
+ private Map<Bundle, List<Class>> m_suites = new HashMap<Bundle, List<Class>>();
+
+ private ResultPrinter m_printer = new ResultPrinter(System.out);
+
+ void onBundleArrival(Bundle bundle, String header) {
+ String[] tss = header.split(",");
+ for (int i = 0; i < tss.length; i++) {
+ try {
+ if (tss[i].length() != 0) {
+ System.out.println("Loading " + tss[i]);
+ Class<? extends Test> clazz = bundle.loadClass(tss[i].trim());
+ addTestSuite(bundle, clazz);
+ }
+ } catch (ClassNotFoundException e) {
+ System.err.println("The test suite " + tss[i] + " is not in the bundle " + bundle.getBundleId() + " : " + e.getMessage());
+ }
+ }
+ }
+
+ private synchronized void addTestSuite(Bundle bundle, Class<? extends Test> test) {
+ List<Class> list = m_suites.get(bundle);
+ if (list == null) {
+ list = new ArrayList<Class>();
+ list.add(test);
+ m_suites.put(bundle, list);
+ } else {
+ list.add(test);
+ }
+ }
+
+ private synchronized void removeTestSuites(Bundle bundle) {
+ m_suites.remove(bundle);
+ }
+
+ void onBundleDeparture(Bundle bundle) {
+ removeTestSuites(bundle);
+ }
+
+ public void setResultPrinter(PrintStream pw) {
+ m_printer = new ResultPrinter(pw);
+ }
+
+ public synchronized List<TestResult> run() {
+ List<TestResult> results = new ArrayList<TestResult>(m_suites.size());
+ Iterator<Entry<Bundle, List<Class>>> it = m_suites.entrySet().iterator();
+ while (it.hasNext()) {
+ Entry<Bundle, List<Class>> entry = it.next();
+ Bundle bundle = entry.getKey();
+ List<Class> list = m_suites.get(bundle);
+ for (int i = 0; i < list.size(); i++) {
+ Test test = createTestFromClass(list.get(i), bundle);
+ TestResult tr = doRun(test);
+ results.add(tr);
+ }
+ }
+ return results;
+ }
+
+ private TestResult doRun(Test test) {
+ TestResult result = new TestResult();
+ result.addListener(m_printer);
+ long startTime = System.currentTimeMillis();
+
+ test.run(result);
+
+ long endTime = System.currentTimeMillis();
+ long runTime = endTime - startTime;
+ m_printer.print(result, runTime);
+
+ return result;
+ }
+
+ private Test createTestFromClass(Class<?> clazz, Bundle bundle) {
+ Method suiteMethod = null;
+ boolean bc = false;
+ try {
+ suiteMethod = clazz.getMethod(SUITE_METHODNAME, new Class[0]);
+ } catch (Exception e) {
+ // try to use a suite method receiving a bundle context
+ try {
+ suiteMethod = clazz.getMethod(SUITE_METHODNAME, new Class[] { BundleContext.class });
+ bc = true;
+ } catch (Exception e2) {
+ // try to extract a test suite automatically
+ if (OSGiTestSuite.class.isAssignableFrom(clazz)) {
+ OSGiTestSuite ts = new OSGiTestSuite(clazz, getBundleContext(bundle));
+ return ts;
+ } else if (OSGiTestCase.class.isAssignableFrom(clazz)) {
+ OSGiTestSuite ts = new OSGiTestSuite(clazz, getBundleContext(bundle));
+ return ts;
+ } else {
+ return new TestSuite(clazz);
+ }
+ }
+ }
+
+ if (!Modifier.isStatic(suiteMethod.getModifiers())) {
+ System.err.println("Suite() method must be static");
+ return null;
+ }
+ Test test = null;
+ try {
+ if (bc) {
+ test = (Test) suiteMethod.invoke(null, new Object[] { getBundleContext(bundle) }); // static method injection the bundle context
+ } else {
+ test = (Test) suiteMethod.invoke(null, (Object[]) new Class[0]); // static method
+ }
+ } catch (InvocationTargetException e) {
+ System.err.println("Failed to invoke suite():" + e.getTargetException().toString());
+ return null;
+ } catch (IllegalAccessException e) {
+ System.err.println("Failed to invoke suite():" + e.toString());
+ return null;
+ }
+
+ return test;
+ }
+
+ public synchronized List<Test> getTests() {
+ List<Test> results = new ArrayList<Test>();
+ Iterator<Entry<Bundle, List<Class>>> it = m_suites.entrySet().iterator();
+ while (it.hasNext()) {
+ Entry<Bundle, List<Class>> entry = it.next();
+ Bundle bundle = entry.getKey();
+ List<Class> list = m_suites.get(bundle);
+ for (int i = 0; i < list.size(); i++) {
+ Test test = createTestFromClass(list.get(i), bundle);
+ results.add(test);
+ }
+ }
+ return results;
+ }
+
+ public TestResult run(Test test) {
+ return doRun(test);
+ }
+
+ public synchronized List<Test> getTests(long bundleId) {
+ Iterator<Entry<Bundle, List<Class>>> it = m_suites.entrySet().iterator();
+ while (it.hasNext()) {
+ Entry<Bundle, List<Class>> entry = it.next();
+ Bundle bundle = entry.getKey();
+ if (bundle.getBundleId() == bundleId) {
+ List<Test> results = new ArrayList<Test>();
+ List<Class> list = m_suites.get(bundle);
+ for (int i = 0; i < list.size(); i++) {
+ Test test = createTestFromClass(list.get(i), bundle);
+ results.add(test);
+ }
+ return results;
+ }
+ }
+ return null;
+ }
+
+ public synchronized List<TestResult> run(long bundleId) {
+ Iterator<Entry<Bundle, List<Class>>> it = m_suites.entrySet().iterator();
+ while (it.hasNext()) {
+ Entry<Bundle, List<Class>> entry = it.next();
+ Bundle bundle = entry.getKey();
+ if (bundle.getBundleId() == bundleId) {
+ List<TestResult> results = new ArrayList<TestResult>();
+ List<Class> list = m_suites.get(bundle);
+ for (int i = 0; i < list.size(); i++) {
+ Test test = createTestFromClass(list.get(i), bundle);
+ TestResult tr = doRun(test);
+ results.add(tr);
+ }
+ return results;
+ }
+ }
+ return null;
+ }
+
+ public synchronized void stopping() {
+ System.out.println("Cleaning test suites ...");
+ m_suites.clear();
+ }
+
+ public void starting() {
+ System.out.println("Junit Extender starting ...");
+ }
+
+ private BundleContext getBundleContext(Bundle bundle) {
+ if (bundle == null) { return null; }
+
+ // getBundleContext (OSGi 4.1)
+ Method meth = null;
+ try {
+ meth = bundle.getClass().getMethod("getBundleContext", new Class[0]);
+ } catch (SecurityException e) {
+ // Nothing do to, will try the Equinox method
+ } catch (NoSuchMethodException e) {
+ // Nothing do to, will try the Equinox method
+ }
+
+ // try Equinox getContext if not found.
+ if (meth == null) {
+ try {
+ meth = bundle.getClass().getMethod("getContext", new Class[0]);
+ } catch (SecurityException e) {
+ // Nothing do to, will try field inspection
+ } catch (NoSuchMethodException e) {
+ // Nothing do to, will try field inspection
+ }
+ }
+
+ if (meth != null) {
+ if (! meth.isAccessible()) {
+ meth.setAccessible(true);
+ }
+ try {
+ return (BundleContext) meth.invoke(bundle, new Object[0]);
+ } catch (IllegalArgumentException e) {
+ err("Cannot get the BundleContext by invoking " + meth.getName(), e);
+ return null;
+ } catch (IllegalAccessException e) {
+ err("Cannot get the BundleContext by invoking " + meth.getName(), e);
+ return null;
+ } catch (InvocationTargetException e) {
+ err("Cannot get the BundleContext by invoking " + meth.getName(), e);
+ return null;
+ }
+ }
+
+ // Else : Field inspection (KF and Prosyst)
+ Field[] fields = bundle.getClass().getDeclaredFields();
+ for (int i = 0; i < fields.length; i++) {
+ if (BundleContext.class.isAssignableFrom(fields[i].getType())) {
+ if (! fields[i].isAccessible()) {
+ fields[i].setAccessible(true);
+ }
+ try {
+ return (BundleContext) fields[i].get(bundle);
+ } catch (IllegalArgumentException e) {
+ err("Cannot get the BundleContext by invoking " + meth.getName(), e);
+ return null;
+ } catch (IllegalAccessException e) {
+ err("Cannot get the BundleContext by invoking " + meth.getName(), e);
+ return null;
+ }
+ }
+ }
+ err("Cannot find the BundleContext for " + bundle.getSymbolicName(), null);
+ return null;
+ }
+
+ private void err(String s, Throwable e) {
+ System.err.println(s + " : " + e.getMessage());
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/impl/ResultPrinter.java b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/impl/ResultPrinter.java
new file mode 100644
index 0000000..4eb4e96
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/impl/ResultPrinter.java
@@ -0,0 +1,161 @@
+/*
+ * 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.junit4osgi.impl;
+
+import java.io.PrintStream;
+import java.text.NumberFormat;
+import java.util.Enumeration;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestFailure;
+import junit.framework.TestListener;
+import junit.framework.TestResult;
+import junit.runner.BaseTestRunner;
+
+/**
+ * Result Printer.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ResultPrinter implements TestListener {
+ PrintStream fWriter;
+
+ int fColumn = 0;
+
+ public ResultPrinter(PrintStream writer) {
+ fWriter = writer;
+ }
+
+ /*
+ * API for use by textui.TestRunner
+ */
+
+ synchronized void print(TestResult result, long runTime) {
+ printHeader(runTime);
+ printErrors(result);
+ printFailures(result);
+ printFooter(result);
+ }
+
+ void printWaitPrompt() {
+ getWriter().println();
+ getWriter().println("<RETURN> to continue");
+ }
+
+ /*
+ * Internal methods
+ */
+
+ protected void printHeader(long runTime) {
+ getWriter().println();
+ getWriter().println("Time: " + elapsedTimeAsString(runTime));
+ }
+
+ protected void printErrors(TestResult result) {
+ printDefects(result.errors(), result.errorCount(), "error");
+ }
+
+ protected void printFailures(TestResult result) {
+ printDefects(result.failures(), result.failureCount(), "failure");
+ }
+
+ protected void printDefects(Enumeration<TestFailure> booBoos, int count, String type) {
+ if (count == 0)
+ return;
+ if (count == 1)
+ getWriter().println("There was " + count + " " + type + ":");
+ else
+ getWriter().println("There were " + count + " " + type + "s:");
+ for (int i = 1; booBoos.hasMoreElements(); i++) {
+ printDefect(booBoos.nextElement(), i);
+ }
+ }
+
+ public void printDefect(TestFailure booBoo, int count) { // only public for testing purposes
+ printDefectHeader(booBoo, count);
+ printDefectTrace(booBoo);
+ }
+
+ protected void printDefectHeader(TestFailure booBoo, int count) {
+ // I feel like making this a println, then adding a line giving the throwable a chance to print something
+ // before we get to the stack trace.
+ getWriter().print(count + ") " + booBoo.failedTest());
+ }
+
+ protected void printDefectTrace(TestFailure booBoo) {
+ getWriter().print(BaseTestRunner.getFilteredTrace(booBoo.trace()));
+ }
+
+ protected void printFooter(TestResult result) {
+ if (result.wasSuccessful()) {
+ getWriter().println();
+ getWriter().print("OK");
+ getWriter().println(" (" + result.runCount() + " test" + (result.runCount() == 1 ? "" : "s") + ")");
+
+ } else {
+ getWriter().println();
+ getWriter().println("FAILURES!!!");
+ getWriter().println("Tests run: " + result.runCount() + ", Failures: " + result.failureCount() + ", Errors: " + result.errorCount());
+ }
+ getWriter().println();
+ }
+
+ /**
+ * Returns the formatted string of the elapsed time. Duplicated from BaseTestRunner. Fix it.
+ */
+ protected String elapsedTimeAsString(long runTime) {
+ return NumberFormat.getInstance().format((double) runTime / 1000);
+ }
+
+ public PrintStream getWriter() {
+ return fWriter;
+ }
+
+ /**
+ * @see junit.framework.TestListener#addError(Test, Throwable)
+ */
+ public void addError(Test test, Throwable t) {
+ getWriter().print("E");
+ }
+
+ /**
+ * @see junit.framework.TestListener#addFailure(Test, AssertionFailedError)
+ */
+ public void addFailure(Test test, AssertionFailedError t) {
+ getWriter().print("F");
+ }
+
+ /**
+ * @see junit.framework.TestListener#endTest(Test)
+ */
+ public void endTest(Test test) {
+ }
+
+ /**
+ * @see junit.framework.TestListener#startTest(Test)
+ */
+ public void startTest(Test test) {
+ getWriter().print(".");
+ if (fColumn++ >= 40) {
+ getWriter().println();
+ fColumn = 0;
+ }
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestOSGiTestCase.java b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestOSGiTestCase.java
new file mode 100644
index 0000000..2ee139e
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestOSGiTestCase.java
@@ -0,0 +1,34 @@
+/*
+ * 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.junit4osgi.test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+
+/**
+ * Simple OSGi Test Case.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class TestOSGiTestCase extends OSGiTestCase {
+
+ public void test1() {
+ System.out.println("Test BC");
+ assertNotNull("Test bundle context", context);
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestOSGiTestSuite.java b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestOSGiTestSuite.java
new file mode 100644
index 0000000..c68f37c
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestOSGiTestSuite.java
@@ -0,0 +1,43 @@
+/*
+ * 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.junit4osgi.test;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+/**
+ * Simple OSGi Test suite.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class TestOSGiTestSuite extends TestSuite {
+
+ public static Test suite(BundleContext bc) {
+ TestSuite ts = new TestSuite();
+ ts.setName("Test OSGi suite() method");
+ ts.addTestSuite(TestTestCase.class);
+ OSGiTestSuite ots = new OSGiTestSuite(TestOSGiTestCase.class, bc);
+ ots.setBundleContext(bc);
+ ts.addTest(ots);
+ return ts;
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestTestCase.java b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestTestCase.java
new file mode 100644
index 0000000..0e1527b
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestTestCase.java
@@ -0,0 +1,37 @@
+/*
+ * 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.junit4osgi.test;
+
+import junit.framework.TestCase;
+
+/**
+ * Simple Test Case.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class TestTestCase extends TestCase {
+
+ public void test1() { }
+
+ public void test2() { }
+
+ public void test3() { }
+
+ public void test4() { }
+
+}
diff --git a/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestTestSuite.java b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestTestSuite.java
new file mode 100644
index 0000000..6bd1bf1
--- /dev/null
+++ b/ipojo/examples/junit4osgi/junit4osgi/src/main/java/org/apache/felix/ipojo/junit4osgi/test/TestTestSuite.java
@@ -0,0 +1,37 @@
+/*
+ * 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.junit4osgi.test;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * Simple OSGi Test Suite.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class TestTestSuite extends TestSuite {
+
+ public static Test suite() {
+ TestSuite ts = new TestSuite();
+ ts.setName("Test suite() method");
+ ts.addTestSuite(TestTestCase.class);
+ return ts;
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/metadata.xml b/ipojo/examples/junit4osgi/metadata.xml
new file mode 100644
index 0000000..29be5f3
--- /dev/null
+++ b/ipojo/examples/junit4osgi/metadata.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO xmlns:extender="org.apache.felix.ipojo.extender">
+ <Component className="org.apache.felix.ipojo.junit4osgi.impl.JunitExtender">
+ <extender:extender extension="Test-Suite" onArrival="onBundleArrival" onDeparture="onBundleDeparture"/>
+ <callback transition="invalidate" method="stopping"/>
+ <provides/>
+ </Component>
+ <instance component="org.apache.felix.ipojo.junit4osgi.impl.JunitExtender"/>
+
+ <component className="org.apache.felix.ipojo.junit4osgi.command.JunitCommand" factory="false">
+ <requires field="runner"/>
+ <provides/>
+ </component>
+ <instance component="org.apache.felix.ipojo.junit4osgi.command.JunitCommand"/>
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/junit4osgi/pom.xml b/ipojo/examples/junit4osgi/pom.xml
new file mode 100644
index 0000000..4e5a05e
--- /dev/null
+++ b/ipojo/examples/junit4osgi/pom.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project>
+ <parent>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>ipojo.examples</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>Junit4Osgi</artifactId>
+ <name>Apache Felix iPOJO Junit4OSGi</name>
+ <packaging>pom</packaging>
+
+ <profiles>
+ <profile>
+ <id>java5</id>
+ <activation>
+ <jdk>1.5</jdk>
+ </activation>
+ <modules>
+ <module>junit4osgi</module>
+ <module>felix-command</module>
+ <module>swing-runner</module>
+ <module>immediate-launcher</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>java6</id>
+ <activation>
+ <jdk>1.6</jdk>
+ </activation>
+ <modules>
+ <module>junit4osgi</module>
+ <module>felix-command</module>
+ <module>swing-runner</module>
+ <module>immediate-launcher</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
diff --git a/ipojo/examples/junit4osgi/swing-runner/metadata.xml b/ipojo/examples/junit4osgi/swing-runner/metadata.xml
new file mode 100644
index 0000000..9251b6f
--- /dev/null
+++ b/ipojo/examples/junit4osgi/swing-runner/metadata.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO>
+ <component
+ classname="org.apache.felix.ipojo.junit4osgi.command.SwingRunner">
+ <requires field="m_runner" />
+ <callback method="stop" transition="invalidate" />
+ <callback method="start" transition="validate" />
+ </component>
+ <instance
+ component="org.apache.felix.ipojo.junit4osgi.command.SwingRunner" />
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/junit4osgi/swing-runner/pom.xml b/ipojo/examples/junit4osgi/swing-runner/pom.xml
new file mode 100644
index 0000000..da9bae5
--- /dev/null
+++ b/ipojo/examples/junit4osgi/swing-runner/pom.xml
@@ -0,0 +1,105 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>Junit4Osgi</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Junit4Osgi-Swing-GUI</name>
+ <artifactId>org.apache.felix.ipojo.junit4osgi.swing-gui</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.shell</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ </dependency>
+ </dependencies>
+ <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.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>
+ iPOJO OSGi Junit Runner - Swing Gui
+ </Bundle-Name>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ org.apache.felix.ipojo.junit4osgi.command
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ <repositories>
+ <repository>
+ <id>unknown-jars-temp-repo</id>
+ <name>
+ A temporary repository created by NetBeans for libraries
+ and jars it could not identify. Please replace the
+ dependencies in this repository with correct ones and
+ delete this repository.
+ </name>
+ <url>file:${project.basedir}/lib</url>
+ </repository>
+ </repositories>
+</project>
diff --git a/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/ResultCellRenderer.java b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/ResultCellRenderer.java
new file mode 100644
index 0000000..680ad32
--- /dev/null
+++ b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/ResultCellRenderer.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2008 clement.
+ *
+ * Licensed 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.
+ * under the License.
+ */
+
+/*
+ * 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.junit4osgi.command;
+
+import java.awt.Color;
+import java.awt.Component;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+
+/**
+ * Test result renderer.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ResultCellRenderer extends DefaultTableCellRenderer {
+
+ /**
+ * UUID.
+ */
+ private static final long serialVersionUID = 1L;
+
+ public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+ Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+
+ ResultTableModel results = (ResultTableModel) table.getModel();
+ String status = (String) results.getValueAt(row, column);
+ if (status.equals(ResultTableModel.SUCESS)) {
+ c.setForeground(Color.GREEN);
+ setToolTipText(results.getMessage(row, column));
+ }
+ if (status.equals(ResultTableModel.FAILURE)) {
+ c.setForeground(Color.ORANGE);
+ setToolTipText(results.getMessage(row, column));
+ }
+ if (status.equals(ResultTableModel.ERROR)) {
+ c.setForeground(Color.RED);
+ setToolTipText(results.getMessage(row, column));
+ }
+
+ return c;
+ }
+}
diff --git a/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/ResultTableModel.java b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/ResultTableModel.java
new file mode 100644
index 0000000..491f223
--- /dev/null
+++ b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/ResultTableModel.java
@@ -0,0 +1,183 @@
+/*
+ * 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.junit4osgi.command;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.table.AbstractTableModel;
+
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+
+/**
+ * Result Table Model.
+ * Store the results of executed tests.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ResultTableModel extends AbstractTableModel {
+
+ public static final String SUCESS = "success";
+
+ public static final String FAILURE = "failure";
+
+ public static final String ERROR = "error";
+
+ private static final long serialVersionUID = 1L;
+
+ private List<TestRecord> results = new ArrayList<TestRecord>();
+
+ public int getRowCount() {
+ return results.size();
+ }
+
+ public int getColumnCount() {
+ return 2;
+ }
+
+ public void addTest(Test t, AssertionFailedError e) {
+ TestRecord rec = new TestRecord(t, e);
+ results.add(rec);
+ fireTableDataChanged();
+ }
+
+ public void addTest(Test t, Throwable e) {
+ TestRecord rec = new TestRecord(t, e);
+ results.add(rec);
+ fireTableDataChanged();
+ }
+
+ public void addTest(Test t) {
+ if (!contains(t)) {
+ TestRecord rec = new TestRecord(t);
+ results.add(rec);
+ fireTableDataChanged();
+ }
+ }
+
+ public int getTestCount() {
+ return results.size();
+ }
+
+ public int getSucess() {
+ int count = 0;
+ for (TestRecord test : results) {
+ if (test.m_wasSucessFull) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ public int getErrors() {
+ int count = 0;
+ for (TestRecord test : results) {
+ if (test.m_error != null) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ public int getFailures() {
+ int count = 0;
+ for (TestRecord test : results) {
+ if (test.m_failure != null) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ private boolean contains(Test t) {
+ for (TestRecord test : results) {
+ if (test.m_test.equals(t)) { return true; }
+ }
+ return false;
+ }
+
+ public void clear() {
+ results.clear();
+ fireTableDataChanged();
+ }
+
+ public Object getValueAt(int rowIndex, int columnIndex) {
+ if (columnIndex == 0) { return results.get(rowIndex).m_test; }
+ if (columnIndex == 1) {
+ TestRecord tr = results.get(rowIndex);
+ if (tr.m_wasSucessFull) { return SUCESS; }
+ if (tr.m_failure != null) { return FAILURE; }
+ if (tr.m_error != null) { return ERROR; }
+ }
+ return null;
+ }
+
+ public String getColumnName(int column) {
+ if (column == 0) { return "Test"; }
+
+ if (column == 1) { return "Status"; }
+
+ return null;
+ }
+
+ public String getMessage(int row, int column) {
+ if (row == -1) { return null; }
+ TestRecord rec = results.get(row);
+ if (rec.m_wasSucessFull) { return "The test " + rec.m_test + " was executed sucessfully."; }
+ if (rec.m_failure != null) { return "The test " + rec.m_test + " has failed : \n" + rec.m_failure.getMessage(); }
+ if (rec.m_error != null) {
+ String message = "The test " + rec.m_test + " has thrown an error : \n" + rec.m_error.getMessage();
+ StringWriter sw = new StringWriter();
+ rec.m_error.printStackTrace(new PrintWriter(sw));
+ message += "\n" + sw.toString();
+ return message;
+ }
+ return "";
+ }
+
+ private class TestRecord {
+ private boolean m_wasSucessFull;
+
+ private Test m_test;
+
+ private AssertionFailedError m_failure;
+
+ private Throwable m_error;
+
+ public TestRecord(Test t, AssertionFailedError e) {
+ m_test = t;
+ m_wasSucessFull = false;
+ m_failure = e;
+ }
+
+ public TestRecord(Test t, Throwable e) {
+ m_test = t;
+ m_wasSucessFull = false;
+ m_error = e;
+ }
+
+ public TestRecord(Test t) {
+ m_test = t;
+ m_wasSucessFull = true;
+ }
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/SwingRunner.form b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/SwingRunner.form
new file mode 100644
index 0000000..55cf564
--- /dev/null
+++ b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/SwingRunner.form
@@ -0,0 +1,273 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.3" maxVersion="1.5" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <NonVisualComponents>
+ <Container class="javax.swing.JDialog" name="m_resultDialog">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="0"/>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[320, 250]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="windowClosed" listener="java.awt.event.WindowListener" parameters="java.awt.event.WindowEvent" handler="onDialogClosed"/>
+ <EventHandler event="windowClosing" listener="java.awt.event.WindowListener" parameters="java.awt.event.WindowEvent" handler="onDialogClosed"/>
+ </Events>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JScrollPane" name="m_message">
+ <Properties>
+ <Property name="border" type="javax.swing.border.Border" editor="org.netbeans.modules.form.editors2.BorderEditor">
+ <Border info="null"/>
+ </Property>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[300, 202]"/>
+ </Property>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[300, 202]"/>
+ </Property>
+ </Properties>
+ <AuxValues>
+ <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+ </AuxValues>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="Center"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JTextArea" name="m_messageArea">
+ <Properties>
+ <Property name="background" type="java.awt.Color" editor="org.netbeans.beaninfo.editors.ColorEditor">
+ <Color blue="f0" green="f0" id="Panel.background" palette="3" red="f0" type="palette"/>
+ </Property>
+ <Property name="columns" type="int" value="20"/>
+ <Property name="editable" type="boolean" value="false"/>
+ <Property name="lineWrap" type="boolean" value="true"/>
+ <Property name="rows" type="int" value="5"/>
+ <Property name="wrapStyleWord" type="boolean" value="true"/>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[300, 250]"/>
+ </Property>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[250, 200]"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Component class="javax.swing.JButton" name="m_ok">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Ok"/>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[120, 23]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="m_okActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout" value="org.netbeans.modules.form.compat2.layouts.DesignBorderLayout$BorderConstraintsDescription">
+ <BorderConstraints direction="South"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </NonVisualComponents>
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="2"/>
+ <Property name="title" type="java.lang.String" value="Junit Runner"/>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[580, 580]"/>
+ </Property>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,2,84,0,0,2,98"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="m_panel">
+ <Properties>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[580, 560]"/>
+ </Property>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[580, 566]"/>
+ </Property>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="2" fill="1" ipadX="0" ipadY="0" insetsTop="3" insetsLeft="3" insetsBottom="3" insetsRight="3" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JScrollPane" name="m_suiteScroll">
+ <Properties>
+ <Property name="autoscrolls" type="boolean" value="true"/>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[400, 147]"/>
+ </Property>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[400, 147]"/>
+ </Property>
+ </Properties>
+ <AuxValues>
+ <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+ </AuxValues>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="0" gridWidth="4" gridHeight="2" fill="1" ipadX="0" ipadY="0" insetsTop="3" insetsLeft="3" insetsBottom="3" insetsRight="3" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JList" name="m_suiteList">
+ <Properties>
+ <Property name="model" type="javax.swing.ListModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection code="new TestListModel()" type="code"/>
+ </Property>
+ <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[250, 147]"/>
+ </Property>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[250, 147]"/>
+ </Property>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[250, 147]"/>
+ </Property>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ <Component class="javax.swing.JButton" name="m_allButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Select All"/>
+ <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[90, 23]"/>
+ </Property>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[90, 23]"/>
+ </Property>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[90, 23]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="m_allButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="4" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="3" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JButton" name="m_executeButton">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Execute"/>
+ <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[90, 23]"/>
+ </Property>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[90, 23]"/>
+ </Property>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[90, 23]"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="m_executeButtonActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="4" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="18" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Container class="javax.swing.JScrollPane" name="m_resultScroll">
+ <Properties>
+ <Property name="verticalScrollBarPolicy" type="int" value="22"/>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[452, 402]"/>
+ </Property>
+ </Properties>
+ <AuxValues>
+ <AuxValue name="autoScrollPane" type="java.lang.Boolean" value="true"/>
+ </AuxValues>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="2" gridWidth="5" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="3" insetsBottom="3" insetsRight="3" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.support.JScrollPaneSupportLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JTable" name="m_resultTable">
+ <Properties>
+ <Property name="autoCreateRowSorter" type="boolean" value="true"/>
+ <Property name="font" type="java.awt.Font" editor="org.netbeans.beaninfo.editors.FontEditor">
+ <Font name="Tahoma" size="10" style="0"/>
+ </Property>
+ <Property name="model" type="javax.swing.table.TableModel" editor="org.netbeans.modules.form.RADConnectionPropertyEditor">
+ <Connection code="new ResultTableModel()" type="code"/>
+ </Property>
+ <Property name="autoResizeMode" type="int" value="4"/>
+ <Property name="maximumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[300, 400]"/>
+ </Property>
+ <Property name="minimumSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="[300, 400]"/>
+ </Property>
+ <Property name="preferredSize" type="java.awt.Dimension" editor="org.netbeans.beaninfo.editors.DimensionEditor">
+ <Dimension value="null"/>
+ </Property>
+ </Properties>
+ <Events>
+ <EventHandler event="mouseClicked" listener="java.awt.event.MouseListener" parameters="java.awt.event.MouseEvent" handler="m_resultTableMouseClicked"/>
+ </Events>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+ </Container>
+ <Container class="javax.swing.JPanel" name="m_statusBar">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignBoxLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JProgressBar" name="m_progress">
+ <Properties>
+ <Property name="indeterminate" type="boolean" value="true"/>
+ </Properties>
+ </Component>
+ <Component class="javax.swing.JLabel" name="m_executedResults">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="aaaaaaaaaaaaaaa"/>
+ </Properties>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/SwingRunner.java b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/SwingRunner.java
new file mode 100644
index 0000000..82c4366
--- /dev/null
+++ b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/SwingRunner.java
@@ -0,0 +1,475 @@
+/*
+ * 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.junit4osgi.command;
+
+import java.awt.Cursor;
+import java.awt.Point;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JScrollBar;
+
+import javax.swing.table.TableColumn;
+import junit.framework.AssertionFailedError;
+import junit.framework.Test;
+import junit.framework.TestResult;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiJunitRunner;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.BundleListener;
+
+/**
+ * Swing Runner for Junit4Osgi.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class SwingRunner extends javax.swing.JFrame implements BundleListener {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * Bundle context (to register the bundle listener).
+ */
+ private BundleContext m_context;
+
+ /**
+ * OSGi Junit Runner Service.
+ */
+ private OSGiJunitRunner m_runner;
+
+ /**
+ * State variable describing if we are executing tests.
+ */
+ private boolean m_running = false;
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton m_allButton;
+ private javax.swing.JButton m_executeButton;
+ private javax.swing.JLabel m_executedResults;
+ private javax.swing.JScrollPane m_message;
+ private javax.swing.JTextArea m_messageArea;
+ private javax.swing.JButton m_ok;
+ private javax.swing.JPanel m_panel;
+ private javax.swing.JProgressBar m_progress;
+ private javax.swing.JDialog m_resultDialog;
+ private javax.swing.JScrollPane m_resultScroll;
+ private javax.swing.JTable m_resultTable;
+ private javax.swing.JPanel m_statusBar;
+ private javax.swing.JList m_suiteList;
+ private javax.swing.JScrollPane m_suiteScroll;
+ // End of variables declaration//GEN-END:variables
+
+ /**
+ * Constructor.
+ * @param bc : bundle context.
+ */
+ public SwingRunner(BundleContext bc) {
+ m_context = bc;
+ }
+
+ /**
+ * Start method.
+ */
+ public void start() {
+ initComponents();
+ setVisible(true);
+ m_resultDialog.setVisible(false);
+ refreshSuites();
+ m_context.addBundleListener(this);
+ m_executedResults.setText(" \t No executed tests");
+ m_progress.setIndeterminate(false);
+ m_progress.setMaximum(100);
+ m_progress.setValue(100);
+
+ TableColumn column = null;
+ for (int i = 0; i < m_resultTable.getColumnCount(); i++) {
+ column = m_resultTable.getColumnModel().getColumn(i);
+ if (i == 0) {
+ column.setPreferredWidth(350); //first column is bigger
+ } else {
+ column.setPreferredWidth(50);
+ column.setCellRenderer(new ResultCellRenderer());
+ }
+}
+ }
+
+ /**
+ * Stop method.
+ */
+ public void stop() {
+ m_context.removeBundleListener(this);
+ dispose();
+ }
+
+ /**
+ * Refresh the list of available test suites.
+ */
+ private void refreshSuites() {
+ List<Test> list = m_runner.getTests();
+ TestListModel lm = (TestListModel) m_suiteList.getModel();
+ lm.clear();
+ for (Test t : list) {
+ lm.addTest(t);
+ }
+ }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ m_resultDialog = new javax.swing.JDialog();
+ m_message = new javax.swing.JScrollPane();
+ m_messageArea = new javax.swing.JTextArea();
+ m_ok = new javax.swing.JButton();
+ m_panel = new javax.swing.JPanel();
+ m_suiteScroll = new javax.swing.JScrollPane();
+ m_suiteList = new javax.swing.JList();
+ m_allButton = new javax.swing.JButton();
+ m_executeButton = new javax.swing.JButton();
+ m_resultScroll = new javax.swing.JScrollPane();
+ m_resultTable = new javax.swing.JTable();
+ m_statusBar = new javax.swing.JPanel();
+ m_progress = new javax.swing.JProgressBar();
+ m_executedResults = new javax.swing.JLabel();
+
+ m_resultDialog.setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
+ m_resultDialog.setMinimumSize(new java.awt.Dimension(320, 250));
+ m_resultDialog.addWindowListener(new java.awt.event.WindowAdapter() {
+ public void windowClosed(java.awt.event.WindowEvent evt) {
+ onDialogClosed(evt);
+ }
+ public void windowClosing(java.awt.event.WindowEvent evt) {
+ onDialogClosed(evt);
+ }
+ });
+
+ m_message.setBorder(null);
+ m_message.setMinimumSize(new java.awt.Dimension(300, 202));
+ m_message.setPreferredSize(new java.awt.Dimension(300, 202));
+
+ m_messageArea.setBackground(javax.swing.UIManager.getDefaults().getColor("Panel.background"));
+ m_messageArea.setColumns(20);
+ m_messageArea.setEditable(false);
+ m_messageArea.setLineWrap(true);
+ m_messageArea.setRows(5);
+ m_messageArea.setWrapStyleWord(true);
+ m_messageArea.setMinimumSize(new java.awt.Dimension(300, 250));
+ m_messageArea.setPreferredSize(new java.awt.Dimension(250, 200));
+ m_message.setViewportView(m_messageArea);
+
+ m_resultDialog.getContentPane().add(m_message, java.awt.BorderLayout.CENTER);
+
+ m_ok.setText("Ok");
+ m_ok.setPreferredSize(new java.awt.Dimension(120, 23));
+ m_ok.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ okActionPerformed(evt);
+ }
+ });
+ m_resultDialog.getContentPane().add(m_ok, java.awt.BorderLayout.SOUTH);
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+ setTitle("Junit Runner");
+ setMinimumSize(new java.awt.Dimension(580, 580));
+ getContentPane().setLayout(new java.awt.GridBagLayout());
+
+ m_panel.setMinimumSize(new java.awt.Dimension(580, 560));
+ m_panel.setPreferredSize(new java.awt.Dimension(580, 566));
+ m_panel.setLayout(new java.awt.GridBagLayout());
+
+ m_suiteScroll.setAutoscrolls(true);
+ m_suiteScroll.setMinimumSize(new java.awt.Dimension(400, 147));
+ m_suiteScroll.setPreferredSize(new java.awt.Dimension(400, 147));
+
+ m_suiteList.setModel(new TestListModel());
+ m_suiteList.setMaximumSize(new java.awt.Dimension(250, 147));
+ m_suiteList.setMinimumSize(new java.awt.Dimension(250, 147));
+ m_suiteList.setPreferredSize(new java.awt.Dimension(250, 147));
+ m_suiteScroll.setViewportView(m_suiteList);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.gridwidth = 4;
+ gridBagConstraints.gridheight = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
+ m_panel.add(m_suiteScroll, gridBagConstraints);
+
+ m_allButton.setText("Select All");
+ m_allButton.setMaximumSize(new java.awt.Dimension(90, 23));
+ m_allButton.setMinimumSize(new java.awt.Dimension(90, 23));
+ m_allButton.setPreferredSize(new java.awt.Dimension(90, 23));
+ m_allButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ allButtonActionPerformed(evt);
+ }
+ });
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 4;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(3, 0, 0, 0);
+ m_panel.add(m_allButton, gridBagConstraints);
+
+ m_executeButton.setText("Execute");
+ m_executeButton.setMaximumSize(new java.awt.Dimension(90, 23));
+ m_executeButton.setMinimumSize(new java.awt.Dimension(90, 23));
+ m_executeButton.setPreferredSize(new java.awt.Dimension(90, 23));
+ m_executeButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ executeButtonActionPerformed(evt);
+ }
+ });
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 4;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
+ gridBagConstraints.insets = new java.awt.Insets(2, 0, 0, 0);
+ m_panel.add(m_executeButton, gridBagConstraints);
+
+ m_resultScroll.setVerticalScrollBarPolicy(javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+ m_resultScroll.setMinimumSize(new java.awt.Dimension(452, 402));
+
+ m_resultTable.setFont(new java.awt.Font("Tahoma", 0, 10));
+ m_resultTable.setModel(new ResultTableModel());
+ m_resultTable.setAutoResizeMode(javax.swing.JTable.AUTO_RESIZE_ALL_COLUMNS);
+ m_resultTable.setMaximumSize(new java.awt.Dimension(300, 400));
+ m_resultTable.setMinimumSize(new java.awt.Dimension(300, 400));
+ m_resultTable.setPreferredSize(null);
+ m_resultTable.addMouseListener(new java.awt.event.MouseAdapter() {
+ public void mouseClicked(java.awt.event.MouseEvent evt) {
+ resultTableMouseClicked(evt);
+ }
+ });
+ m_resultScroll.setViewportView(m_resultTable);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.gridwidth = 5;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(2, 3, 3, 3);
+ m_panel.add(m_resultScroll, gridBagConstraints);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.gridheight = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ gridBagConstraints.insets = new java.awt.Insets(3, 3, 3, 3);
+ getContentPane().add(m_panel, gridBagConstraints);
+
+ m_statusBar.setLayout(new javax.swing.BoxLayout(m_statusBar, javax.swing.BoxLayout.LINE_AXIS));
+
+ m_progress.setIndeterminate(true);
+ m_statusBar.add(m_progress);
+
+ m_executedResults.setText("aaaaaaaaaaaaaaa");
+ m_statusBar.add(m_executedResults);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ getContentPane().add(m_statusBar, gridBagConstraints);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ /**
+ * Execute button action.
+ * @param evt : event.
+ */
+ private void executeButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_executeButtonActionPerformed
+ if (m_running) { return; }
+ // Collect selected test.
+ int[] indices = m_suiteList.getSelectedIndices();
+ List<Test> list = new ArrayList<Test>(indices.length);
+ TestListModel model = (TestListModel) m_suiteList.getModel();
+ for (int i = 0; i < indices.length; i++) {
+ list.add(model.getTestElementAt(indices[i]));
+ }
+ setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
+ executeTest(list);
+ }//GEN-LAST:event_m_executeButtonActionPerformed
+
+ /**
+ * All button action.
+ * @param evt : event.
+ */
+ private void allButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_allButtonActionPerformed
+ int max = m_suiteList.getModel().getSize();
+ int[] indices = new int[max];
+ for (int i = 0; i < max; i++) {
+ indices[i] = i;
+ }
+ m_suiteList.setSelectedIndices(indices);
+ }//GEN-LAST:event_m_allButtonActionPerformed
+
+ /**
+ * Listener on table click.
+ * @param evt : event.
+ */
+ private void resultTableMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_m_resultTableMouseClicked
+ Point p = evt.getPoint();
+ int row = m_resultTable.rowAtPoint(p);
+ int col = m_resultTable.columnAtPoint(p);
+ ResultTableModel model = (ResultTableModel) m_resultTable.getModel();
+ String message = model.getMessage(row, col);
+ if (message != null) {
+ setEnabled(false);
+ m_resultDialog.setTitle("Test Report");
+ m_messageArea.setText(message);
+ m_resultDialog.setVisible(true);
+ }
+ }//GEN-LAST:event_m_resultTableMouseClicked
+
+ /**
+ * Ok button action.
+ * @param evt : event.
+ */
+ private void okActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_m_okActionPerformed
+ m_resultDialog.setVisible(false);
+ setEnabled(true);
+ }//GEN-LAST:event_m_okActionPerformed
+
+ /**
+ * Listener when the test report is closed.
+ * @param evt : event.
+ */
+ private void onDialogClosed(java.awt.event.WindowEvent evt) {//GEN-FIRST:event_onDialogClosed
+ m_resultDialog.setVisible(false);
+ setEnabled(true);
+ }//GEN-LAST:event_onDialogClosed
+
+ /**
+ * Execute method.
+ * @param list : list of test to execute.
+ */
+ private void executeTest(final List<Test> list) {
+ Runnable thread = new Runnable() {
+ public void run() {
+ ResultTableModel model = (ResultTableModel) m_resultTable.getModel();
+ m_running = true;
+ m_executeButton.setText("Running...");
+ m_progress.setIndeterminate(true);
+ model.clear();
+ for (int i = 0; i < list.size(); i++) {
+ TestResult tr = new TestResult();
+ tr.addListener(new MyTestListener());
+ list.get(i).run(tr);
+ }
+ m_running = false;
+ m_progress.setIndeterminate(false);
+ m_progress.setMaximum(100);
+ m_progress.setValue(100);
+ m_executeButton.setText("Execute");
+ computeExecutedTest();
+ setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
+ }
+
+ };
+ new Thread(thread).start();
+ }
+
+ private void computeExecutedTest() {
+ ResultTableModel results = (ResultTableModel) m_resultTable.getModel();
+ String m = " \t ";
+ m+= results.getTestCount() + " tests executed / ";
+ m+= results.getSucess() + " sucess / ";
+ m+= results.getFailures() + " failures / ";
+ m+= results.getErrors() + " errors ";
+ m_executedResults.setText(m);
+ }
+
+ private class MyTestListener implements junit.framework.TestListener {
+ /**
+ * Table model.
+ */
+ ResultTableModel m_model = (ResultTableModel) m_resultTable.getModel();
+
+ /**
+ * Add an error.
+ * @param arg0 : test which throws an error.
+ * @param arg1 : thrown exception.
+ * @see junit.framework.TestListener#addError(junit.framework.Test, java.lang.Throwable)
+ */
+ public void addError(Test arg0, Throwable arg1) {
+ m_model.addTest(arg0, arg1);
+ adjustScroll();
+ }
+
+ /**
+ * Add a failure.
+ * @param arg0 : failing test.
+ * @param arg1 : thrown failure.
+ * @see junit.framework.TestListener#addError(junit.framework.Test, java.lang.Throwable)
+ */
+ public void addFailure(Test arg0, AssertionFailedError arg1) {
+ m_model.addTest(arg0, arg1);
+ adjustScroll();
+ }
+
+ /**
+ * End of a test.
+ * @param arg0 : test.
+ * @see junit.framework.TestListener#endTest(junit.framework.Test)
+ */
+ public void endTest(Test arg0) {
+ m_model.addTest(arg0);
+ adjustScroll();
+ }
+
+ /**
+ * Start of a test.
+ * @param arg0 : test.
+ * @see junit.framework.TestListener#startTest(junit.framework.Test)
+ */
+ public void startTest(Test arg0) {
+ // Nothing to do here.
+ }
+
+ /**
+ * Adjust the scrolling bar of the result table.
+ */
+ private void adjustScroll() {
+ JScrollBar bar = m_resultScroll.getVerticalScrollBar();
+ if ((bar != null) && (bar.isVisible())) {
+ bar.setValue(Integer.MAX_VALUE);
+ }
+ }
+
+ }
+
+ /**
+ * Bundle Changed callback method.
+ * @param arg0 : bundle event.
+ * @see org.osgi.framework.BundleListener#bundleChanged(org.osgi.framework.BundleEvent)
+ */
+ public void bundleChanged(BundleEvent arg0) {
+ refreshSuites();
+ }
+
+}
diff --git a/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/TestListModel.java b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/TestListModel.java
new file mode 100644
index 0000000..4811c5e
--- /dev/null
+++ b/ipojo/examples/junit4osgi/swing-runner/src/main/java/org/apache/felix/ipojo/junit4osgi/command/TestListModel.java
@@ -0,0 +1,89 @@
+/*
+ * 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.junit4osgi.command;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.swing.AbstractListModel;
+import junit.framework.Test;
+
+/**
+ * Test Suite list model.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class TestListModel extends AbstractListModel {
+
+ private static final long serialVersionUID = 1L;
+
+ private List<TestRecord> list = new ArrayList<TestRecord>();
+
+ public Object getElementAt(int index) {
+ if (index >= list.size()) {
+ return null;
+ } else {
+ return list.get(index).name;
+ }
+ }
+
+ public Test getTestElementAt(int index) {
+ return list.get(index).test;
+ }
+
+ public void addTest(Test test) {
+ synchronized(this) {
+ TestRecord tr = new TestRecord();
+ tr.test = test;
+ tr.name = test.toString();
+ list.add(tr);
+ }
+ fireContentsChanged(this, list.size() - 1, list.size() - 1);
+ }
+
+ public void removeTest(Test test) {
+ int index = 1;
+ synchronized(this) {
+ for (TestRecord t : list) {
+ if (t.test.equals(test)) {
+ index = list.indexOf(t);
+ list.remove(t);
+ return;
+ }
+ }
+ }
+
+ if (index != -1) {
+ fireContentsChanged(this, index, index);
+ }
+ }
+
+ public void clear() {
+ list.clear();
+ }
+
+ private class TestRecord {
+ public Test test;
+
+ public String name;
+ }
+
+ public int getSize() {
+ return list.size();
+ }
+
+}
diff --git a/ipojo/examples/pom.xml b/ipojo/examples/pom.xml
new file mode 100644
index 0000000..0aef7eb
--- /dev/null
+++ b/ipojo/examples/pom.xml
@@ -0,0 +1,40 @@
+<project>
+ <parent>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>iPOJO</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>ipojo.examples</artifactId>
+ <name>Apache Felix iPOJO Examples</name>
+ <packaging>pom</packaging>
+ <modules>
+ <module>tutorial-maven</module>
+ </modules>
+
+ <profiles>
+ <profile>
+ <id>java5</id>
+ <activation>
+ <jdk>1.5</jdk>
+ </activation>
+ <modules>
+ <module>junit4osgi</module>
+ <module>property-handler</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>java6</id>
+ <activation>
+ <jdk>1.6</jdk>
+ </activation>
+ <modules>
+ <module>junit4osgi</module>
+ <module>property-handler</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
\ No newline at end of file
diff --git a/ipojo/examples/property-handler/PropertyHandler/metadata.xml b/ipojo/examples/property-handler/PropertyHandler/metadata.xml
new file mode 100644
index 0000000..48d7bef
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandler/metadata.xml
@@ -0,0 +1,9 @@
+<ipojo xmlns:props="example.handler.properties">
+
+ <!-- Declare the handler -->
+ <handler name="properties" namespace="example.handler.properties"
+ classname="org.apache.felix.ipojo.handler.properties.PropertiesHandler">
+ <!-- the properties handler does not use any other handler -->
+ </handler>
+
+</ipojo>
diff --git a/ipojo/examples/property-handler/PropertyHandler/pom.xml b/ipojo/examples/property-handler/PropertyHandler/pom.xml
new file mode 100644
index 0000000..d806ab9
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandler/pom.xml
@@ -0,0 +1,85 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>ipojo.examples.property.handler</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO Property Handler</name>
+ <artifactId>
+ org.apache.felix.ipojo.example.handler.property
+ </artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ </dependencies>
+ <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.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Private-Package>
+ org.apache.felix.ipojo.handler.properties,
+ example.handler.properties
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/property-handler/PropertyHandler/src/main/java/example/handler/properties/Properties.java b/ipojo/examples/property-handler/PropertyHandler/src/main/java/example/handler/properties/Properties.java
new file mode 100644
index 0000000..9144bb8
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandler/src/main/java/example/handler/properties/Properties.java
@@ -0,0 +1,33 @@
+/*
+ * 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 example.handler.properties;
+
+/**
+ * The Properties annotation.
+ * This annotation may be used in POJO class to used the Property handler.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public @interface Properties {
+
+ /**
+ * Returns the property file used by the handler.
+ */
+ String file();
+
+}
diff --git a/ipojo/examples/property-handler/PropertyHandler/src/main/java/org/apache/felix/ipojo/handler/properties/PropertiesHandler.java b/ipojo/examples/property-handler/PropertyHandler/src/main/java/org/apache/felix/ipojo/handler/properties/PropertiesHandler.java
new file mode 100644
index 0000000..abd3583
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandler/src/main/java/org/apache/felix/ipojo/handler/properties/PropertiesHandler.java
@@ -0,0 +1,283 @@
+/*
+ * 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.handler.properties;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.FieldMetadata;
+import org.apache.felix.ipojo.parser.PojoMetadata;
+
+/**
+ * This handler load a properties file containing property value. The handler injects this values inside fields. When stopping the handler stores
+ * updated value inside the file. The properties file contains [field-name: field-value] (field-value are strings) Metadata :
+ * <example.handler.properties:properties file="file-path"> Instances can override file locations by setting the properties.file property.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class PropertiesHandler extends PrimitiveHandler {
+
+ /** The Handler NAMESPACE. */
+ private final String NAMESPACE = "example.handler.properties";
+
+ /** Properties file. */
+ private Properties m_properties = new Properties();
+
+ /** File location. */
+ private String m_file;
+
+ /**
+ * This method is the first to be invoked. This method aims to configure the handler. It receives the component type metadata and the instance
+ * description. The method parses given metadata and register field to listen. Step 3 : when the instance configuration contains the
+ * properties.file property, it overrides the properties file location.
+ * @param metadata : component type metadata
+ * @param configuration : instance description
+ * @throws ConfigurationException : the configuration of the handler has failed.
+ * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+ */
+ @SuppressWarnings("unchecked")
+ public void configure(Element metadata, Dictionary configuration) throws ConfigurationException {
+ // Parse metadata to get <properties file="$file"/>
+
+ Element[] elem = metadata.getElements("properties", NAMESPACE); // Get all example.handler.properties:properties element
+
+ switch (elem.length) {
+ case 0:
+ // No matching element in metadata, throw a configuration error.
+ throw new ConfigurationException("No properties found");
+ case 1:
+ // One 'properties' found, get attributes.
+ m_file = elem[0].getAttribute("file");
+ if (m_file == null) {
+ // if file is null, throw a configuration error.
+ throw new ConfigurationException("Malformed properties element : file attribute must be set");
+ }
+ break;
+ default:
+ // To simplify we handle only one properties element.
+ throw new ConfigurationException("Only one properties element is supported");
+ }
+
+ // Look if the instance overrides file location :
+ String instanceFile = (String) configuration.get("properties.file");
+ if (instanceFile != null) {
+ m_file = instanceFile;
+ }
+
+ // Load properties
+ try {
+ loadProperties();
+ } catch (IOException e) {
+ throw new ConfigurationException("Error when reading the " + m_file + " file : " + e.getMessage());
+ }
+
+ // Register fields
+ // By convention, properties file entry are field name, so look for each property to get field list.
+
+ //First get Pojo Metadata metadata :
+ PojoMetadata pojoMeta = getPojoMetadata();
+ Enumeration e = m_properties.keys();
+ while (e.hasMoreElements()) {
+ String field = (String) e.nextElement();
+ FieldMetadata fm = pojoMeta.getField(field);
+
+ if (fm == null) { // The field does not exist
+ throw new ConfigurationException("The field " + field + " is declared in the properties file but does not exist in the pojo");
+ }
+
+ // Then check that the field is a String field
+ if (!fm.getFieldType().equals(String.class.getName())) {
+ throw new ConfigurationException("The field " + field + " exists in the pojo, but is not a String");
+ }
+
+ // All checks are ok, register the interceptor.
+ getInstanceManager().register(fm, this);
+ }
+
+ // Finally register the field to listen
+ }
+
+ /**
+ * This method is called when the instance start (after the configure method). We just print stored properties.
+ * @see org.apache.felix.ipojo.Handler#start()
+ */
+ public void start() {
+ // The properties are already loaded (in the configure method), just print values.
+ m_properties.list(System.out);
+ }
+
+ /**
+ * This method is called when the instance stops. We save the properties to not lost the instance state and clear the stored properties.
+ * @see org.apache.felix.ipojo.Handler#stop()
+ */
+ public void stop() {
+ try {
+ saveProperties();
+ } catch (IOException e) {
+ error("Cannot read the file : " + m_file, e); // Log an error message by using the iPOJO logger
+ }
+ m_properties = null;
+ }
+
+ /**
+ * This method is called at each time the pojo 'get' a listened field. The method return the stored value.
+ * @param pojo : pojo object getting the field
+ * @param field : field name.
+ * @param o : previous value.
+ * @return the stored value.
+ * @see org.apache.felix.ipojo.PrimitiveHandler#getterCallback(java.lang.String, java.lang.Object)
+ */
+ public Object onGet(Object pojo, String field, Object o) {
+ // When the pojo requires a value for a managed field, this method is invoked.
+ // So, we have just to return the stored value.
+ return m_properties.get(field);
+ }
+
+ /**
+ * This method is called at each time the pojo 'set' a listened field. This method updates the local properties.
+ * @param pojo : pojo object setting the field
+ * @param field : field name
+ * @param newvalue : new value
+ * @see org.apache.felix.ipojo.PrimitiveHandler#setterCallback(java.lang.String, java.lang.Object)
+ */
+ public void onSet(Object pojo, String field, Object newvalue) {
+ // When the pojo set a value to a managed field, this method is invoked.
+ // So, we update the stored value.
+ m_properties.put(field, newvalue);
+ }
+
+ /**
+ * Step 2 : state properties when the instance becomes invalid.
+ * @param newState : the instance state
+ * @see org.apache.felix.ipojo.Handler#stateChanged(int)
+ */
+ public void stateChanged(int newState) {
+ // This method is invoked each times that the instance state changed.
+
+ // If the new state is invalid, save the properties.
+ if (newState == ComponentInstance.INVALID) {
+ // Reload properties
+ try {
+ saveProperties();
+ } catch (IOException e) {
+ error("Cannot read the file : " + m_file, e); // Log an error message by using the iPOJO logger
+ }
+ return;
+ }
+ }
+
+ /**
+ * Step 5 : dynamic reconfiguration. This method is call when the instance is reconfigured externally. The given property contains property value.
+ * @param dict : new properties
+ * @see org.apache.felix.ipojo.Handler#reconfigure(java.util.Dictionary)
+ */
+ @SuppressWarnings("unchecked")
+ public synchronized void reconfigure(Dictionary dict) {
+ // For each property, look if a new value is contained in the new configuration.
+ Enumeration e = m_properties.keys();
+ while (e.hasMoreElements()) {
+ String field = (String) e.nextElement();
+ String value = (String) dict.get(field);
+ // If the dictionary contains a value, update the stored value.
+ if (value != null) {
+ m_properties.put(field, value);
+ }
+ }
+ }
+
+ /**
+ * Returns handler description.
+ * @return the handler description.
+ * @see org.apache.felix.ipojo.Handler#getDescription()
+ */
+ public HandlerDescription getDescription() {
+ return new Description(this);
+ }
+
+ /**
+ * Helper method just loading the properties.
+ * @throws IOException : the file cannot be read.
+ */
+ private void loadProperties() throws IOException {
+ // Load the properties file from file system
+ File file = new File(m_file);
+ InputStream is = new FileInputStream(file);
+ m_properties.load(is);
+ }
+
+ /**
+ * Helper method writing properties.
+ * @throws IOException : the file cannot be written.
+ */
+ private void saveProperties() throws IOException {
+ // Store the file, modified the last modification date.
+ File file = new File(m_file);
+ OutputStream os = new FileOutputStream(file);
+ m_properties.store(os, "");
+ }
+
+ /**
+ * Step 3 : The handler will participate to the instance architecture.
+ * This class describing the handler.
+ */
+ private class Description extends HandlerDescription {
+
+ /**
+ * Instantiates a new description.
+ * @param h the h
+ */
+ public Description(PrimitiveHandler h) {
+ super(h);
+ }
+
+ /**
+ * This method must return the Element describing the handler. The description of this handler contains the list of properties with attached
+ * value.
+ * @return the description of the handler.
+ * @see org.apache.felix.ipojo.architecture.HandlerDescription#getHandlerInfo()
+ */
+ @SuppressWarnings("unchecked")
+ public Element getHandlerInfo() {
+ Element elem = super.getHandlerInfo(); // This method must be called to get the root description element.
+ Enumeration e = m_properties.keys();
+ while (e.hasMoreElements()) {
+ String field = (String) e.nextElement();
+ Element prop = new Element("property", ""); // Create an element for the actual property.
+ // Add two attribute (the field and the value).
+ prop.addAttribute(new Attribute("field", field));
+ prop.addAttribute(new Attribute("value", (String) m_properties.get(field)));
+ elem.addElement(prop); // Attach the current element to the root element.
+ }
+ return elem;
+ }
+
+ }
+}
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/metadata.xml b/ipojo/examples/property-handler/PropertyHandlerTest/metadata.xml
new file mode 100644
index 0000000..dcc9c16
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandlerTest/metadata.xml
@@ -0,0 +1,21 @@
+<ipojo xmlns:props="example.handler.properties">
+
+ <!-- Declare a component using your handler -->
+ <component
+ classname="org.apache.felix.ipojo.handler.properties.example.PropertiesTester">
+ <callback transition="validate" method="start" />
+ <callback transition="invalidate" method="stop" />
+ <!-- declare our handler -->
+ <props:properties file="props\properties.txt" />
+ </component>
+
+ <!-- Declare an instance -->
+ <instance component="annotationTester" />
+ <instance
+ component="org.apache.felix.ipojo.handler.properties.example.PropertiesTester"
+ name="i1">
+ <property name="properties.file"
+ value="props\properties-i1.txt" />
+ </instance>
+
+</ipojo>
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/pom.xml b/ipojo/examples/property-handler/PropertyHandlerTest/pom.xml
new file mode 100644
index 0000000..dc28218
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandlerTest/pom.xml
@@ -0,0 +1,83 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>ipojo.examples.property.handler</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO Property Handler Test</name>
+ <artifactId>
+ org.apache.felix.ipojo.example.handler.property.test
+ </artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.annotations</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>
+ org.apache.felix.ipojo.example.handler.property
+ </artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ </dependencies>
+ <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.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Private-Package>
+ org.apache.felix.ipojo.handler.properties.example
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/props/properties-i1.txt b/ipojo/examples/property-handler/PropertyHandlerTest/props/properties-i1.txt
new file mode 100644
index 0000000..7d688d2
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandlerTest/props/properties-i1.txt
@@ -0,0 +1,4 @@
+#
+#Sun Nov 18 20:33:54 CET 2007
+m_property2=foo - 18 nov. 2007 20\:32\:55 - 18 nov. 2007 20\:33\:51
+m_property1=bar - 18 nov. 2007 20\:32\:55 - 18 nov. 2007 20\:33\:51
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/props/properties.txt b/ipojo/examples/property-handler/PropertyHandlerTest/props/properties.txt
new file mode 100644
index 0000000..2d46de8
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandlerTest/props/properties.txt
@@ -0,0 +1,4 @@
+#
+#Sun Nov 18 20:33:54 CET 2007
+m_property2=prop2 - 18 nov. 2007 20\:32\:55 - 18 nov. 2007 20\:33\:51
+m_property1=prop1 - 18 nov. 2007 20\:32\:55 - 18 nov. 2007 20\:33\:51
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/AnnotationPropertiesTester.java b/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/AnnotationPropertiesTester.java
new file mode 100644
index 0000000..0f3df8d
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/AnnotationPropertiesTester.java
@@ -0,0 +1,83 @@
+/*
+ * 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.handler.properties.example;
+
+import java.text.DateFormat;
+import java.util.Date;
+
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Invalidate;
+import org.apache.felix.ipojo.annotations.Validate;
+
+import example.handler.properties.Properties;
+
+/**
+ * A simple component implementation using the property handler.
+ *@author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@Component(name = "annotationTester")
+@Properties(file = "props\\properties.txt")
+public class AnnotationPropertiesTester {
+
+ /**
+ * Property 1 : injected.
+ */
+ private String m_property1;
+
+ /**
+ * Property 1 : injected.
+ */
+ private String m_property2;
+
+ /**
+ * Start method :
+ * displays loaded & injected properties before modifying them.
+ */
+ @Validate
+ public void start() {
+ System.out.println("AnnotationPropertiesTester is starting ...");
+ System.out.println("Property 1 : " + m_property1);
+ System.out.println("Property 2 : " + m_property2);
+
+ updateProperties();
+ }
+
+ /**
+ * Stop method :
+ * displays properties values.
+ */
+ @Invalidate
+ public void stop() {
+ System.out.println("AnnotationPropertiesTester is stopping ...");
+ System.out.println("Property 1 : " + m_property1);
+ System.out.println("Property 2 : " + m_property2);
+ }
+
+ /**
+ * Update property value.
+ */
+ private void updateProperties() {
+ System.out.println("Update properties");
+ Date date = new Date();
+ DateFormat df = DateFormat.getDateTimeInstance();
+ m_property1 = m_property1 + " - " + df.format(date);
+ m_property2 = m_property2 + " - " + df.format(date);
+
+ }
+}
diff --git a/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/PropertiesTester.java b/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/PropertiesTester.java
new file mode 100644
index 0000000..37872db
--- /dev/null
+++ b/ipojo/examples/property-handler/PropertyHandlerTest/src/main/java/org/apache/felix/ipojo/handler/properties/example/PropertiesTester.java
@@ -0,0 +1,68 @@
+/*
+ * 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.handler.properties.example;
+
+import java.text.DateFormat;
+import java.util.Date;
+
+public class PropertiesTester {
+
+ // These two fields will be injected.
+ private String property1;
+ private String property2;
+
+ /**
+ * Starting method.
+ * This method will be called when the instance starts.
+ */
+ public void start() {
+ System.out.println("PropertiesTester is starting ...");
+ // Read the injected properties.
+ System.out.println("Property 1 : " + property1);
+ System.out.println("Property 2 : " + property2);
+
+ // Update the properties.
+ updateProperties();
+ }
+
+ /**
+ * Stopping method.
+ * This method will be called when the instance stops.
+ */
+ public void stop() {
+ System.out.println("PropertiesTester is stopping ...");
+ System.out.println("Property 1 : " + property1);
+ System.out.println("Property 2 : " + property2);
+ }
+
+ /**
+ * This method just updates managed properties.
+ * It appends the current date to the actual property value.
+ */
+ private void updateProperties() {
+ System.out.println("Update properties");
+ Date date = new Date();
+ DateFormat df = DateFormat.getDateTimeInstance();
+ // The properties will be updated in the property file
+ property1 = property1 + " - " + df.format(date);
+ property2 = property2 + " - " + df.format(date);
+
+ }
+
+}
diff --git a/ipojo/examples/property-handler/pom.xml b/ipojo/examples/property-handler/pom.xml
new file mode 100644
index 0000000..2b9f2df
--- /dev/null
+++ b/ipojo/examples/property-handler/pom.xml
@@ -0,0 +1,36 @@
+<project>
+ <parent>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>ipojo.examples</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>ipojo.examples.property.handler</artifactId>
+ <name>Apache Felix iPOJO Property Handler</name>
+ <packaging>pom</packaging>
+
+ <profiles>
+ <profile>
+ <id>java5</id>
+ <activation>
+ <jdk>1.5</jdk>
+ </activation>
+ <modules>
+ <module>PropertyHandler</module>
+ <module>PropertyHandlerTest</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>java6</id>
+ <activation>
+ <jdk>1.6</jdk>
+ </activation>
+ <modules>
+ <module>PropertyHandler</module>
+ <module>PropertyHandlerTest</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.client.annotation/metadata.xml b/ipojo/examples/tutorial-maven/hello.client.annotation/metadata.xml
new file mode 100644
index 0000000..134250d
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.client.annotation/metadata.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO>
+ <instance component="AnnotatedHelloClient" name="HelloClient"/>
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.client.annotation/pom.xml b/ipojo/examples/tutorial-maven/hello.client.annotation/pom.xml
new file mode 100644
index 0000000..eee6444
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.client.annotation/pom.xml
@@ -0,0 +1,66 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>hello.client.annotation</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <name>Hello Service Client using Annotations</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>hello.service</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.annotations</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+ <pluginRepositories>
+ <pluginRepository>
+ <id>apache.snapshots</id>
+ <name>snapshot plugins</name>
+ <url>
+ http://people.apache.org/repo/m2-snapshot-repository
+ </url>
+ </pluginRepository>
+ </pluginRepositories>
+
+ <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.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+ <Private-Package>ipojo.example.hello.client</Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/tutorial-maven/hello.client.annotation/src/main/java/ipojo/example/hello/client/HelloClient.java b/ipojo/examples/tutorial-maven/hello.client.annotation/src/main/java/ipojo/example/hello/client/HelloClient.java
new file mode 100644
index 0000000..2c3697c
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.client.annotation/src/main/java/ipojo/example/hello/client/HelloClient.java
@@ -0,0 +1,90 @@
+/*
+ * 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 ipojo.example.hello.client;
+
+import ipojo.example.hello.Hello;
+
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Invalidate;
+import org.apache.felix.ipojo.annotations.Requires;
+import org.apache.felix.ipojo.annotations.Validate;
+
+/**
+ * A simple Hello service client. This client use annotation instead of XML metadata.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@Component(name = "AnnotatedHelloClient", architecture = true)
+public class HelloClient implements Runnable {
+
+ /** Delay between two invocations. */
+ private static final int DELAY = 10000;
+
+ /**
+ * Hello services. Injected by the container.
+ */
+ @Requires
+ private Hello[] m_hello;
+
+ /**
+ * End flag.
+ */
+ private boolean m_end;
+
+ /**
+ * Run method.
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ while (!m_end) {
+ try {
+ invokeHelloServices();
+ Thread.sleep(DELAY);
+ } catch (InterruptedException ie) {
+ /* will recheck end */
+ }
+ }
+ }
+
+ /**
+ * Invoke hello services.
+ */
+ public void invokeHelloServices() {
+ for (int i = 0; i < m_hello.length; i++) {
+ System.out.println(i + " :" + m_hello[i].sayHello("Clement"));
+ }
+ }
+
+ /**
+ * Starting.
+ */
+ @Validate
+ public void starting() {
+ Thread thread = new Thread(this);
+ m_end = false;
+ thread.start();
+ }
+
+ /**
+ * Stopping.
+ */
+ @Invalidate
+ public void stopping() {
+ m_end = true;
+ }
+}
diff --git a/ipojo/examples/tutorial-maven/hello.client.annotation/src/main/java/ipojo/example/source.txt b/ipojo/examples/tutorial-maven/hello.client.annotation/src/main/java/ipojo/example/source.txt
new file mode 100644
index 0000000..0198756
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.client.annotation/src/main/java/ipojo/example/source.txt
@@ -0,0 +1 @@
+PUT YOUR SOURCE FILES HERE
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.client/metadata.xml b/ipojo/examples/tutorial-maven/hello.client/metadata.xml
new file mode 100644
index 0000000..4141c34
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.client/metadata.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO>
+ <component className="ipojo.example.hello.client.HelloClient"
+ architecture="true">
+ <requires field="m_hello" />
+ <callback transition="validate" method="starting" />
+ <callback transition="invalidate" method="stopping" />
+ <properties>
+ <property field="m_name" name="name" />
+ </properties>
+ </component>
+ <instance component="ipojo.example.hello.client.HelloClient">
+ <property name="name" value="clement" />
+ </instance>
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.client/pom.xml b/ipojo/examples/tutorial-maven/hello.client/pom.xml
new file mode 100644
index 0000000..91cbe69
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.client/pom.xml
@@ -0,0 +1,82 @@
+<!--
+ 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.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging><!-- Use the BND Maven plug-in -->
+ <groupId>ipojo.examples</groupId>
+ <artifactId>hello.client</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <name>Hello Service Client</name>
+ <dependencies>
+ <dependency>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>hello.service</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ </dependencies>
+
+ <pluginRepositories>
+ <pluginRepository>
+ <id>apache.snapshots</id>
+ <name>snapshot plugins</name>
+ <url>
+ http://people.apache.org/repo/m2-snapshot-repository
+ </url>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </pluginRepository>
+ </pluginRepositories>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <version>1.4.0</version>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ ipojo.example.hello.client
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/tutorial-maven/hello.client/src/main/java/ipojo/example/hello/client/HelloClient.java b/ipojo/examples/tutorial-maven/hello.client/src/main/java/ipojo/example/hello/client/HelloClient.java
new file mode 100644
index 0000000..023db3f
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.client/src/main/java/ipojo/example/hello/client/HelloClient.java
@@ -0,0 +1,90 @@
+/*
+ * 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 ipojo.example.hello.client;
+
+import ipojo.example.hello.Hello;
+
+/**
+ * Hello Service simple client.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class HelloClient implements Runnable {
+
+ /**
+ * Delay between two invocations.
+ */
+ private static final int DELAY = 10000;
+
+ /**
+ * Hello services.
+ * Injected by the container.
+ * */
+ private Hello[] m_hello; // Service Requirement
+
+ /**
+ * End flag.
+ * */
+ private boolean m_end;
+
+ /**
+ * Name property.
+ * Injected by the container.
+ * */
+ private String m_name;
+
+ /**
+ * Run method.
+ * @see java.lang.Runnable#run()
+ */
+ public void run() {
+ while (!m_end) {
+ try {
+ invokeHelloServices();
+ Thread.sleep(DELAY);
+ } catch (InterruptedException ie) {
+ /* will recheck end */
+ }
+ }
+ }
+
+ /**
+ * Invoke hello services.
+ */
+ public void invokeHelloServices() {
+ for (int i = 0; i < m_hello.length; i++) {
+ System.out.println(m_hello[i].sayHello(m_name));
+ }
+ }
+
+ /**
+ * Starting.
+ */
+ public void starting() {
+ Thread thread = new Thread(this);
+ m_end = false;
+ thread.start();
+ }
+
+ /**
+ * Stopping.
+ */
+ public void stopping() {
+ m_end = true;
+ }
+}
diff --git a/ipojo/examples/tutorial-maven/hello.client/src/main/java/ipojo/example/source.txt b/ipojo/examples/tutorial-maven/hello.client/src/main/java/ipojo/example/source.txt
new file mode 100644
index 0000000..0198756
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.client/src/main/java/ipojo/example/source.txt
@@ -0,0 +1 @@
+PUT YOUR SOURCE FILES HERE
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.impl.annotation/pom.xml b/ipojo/examples/tutorial-maven/hello.impl.annotation/pom.xml
new file mode 100644
index 0000000..2281a57
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.impl.annotation/pom.xml
@@ -0,0 +1,88 @@
+<!--
+ 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.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>hello.impl.annotation</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <name>Hello Service Provider using Annotations</name>
+
+ <pluginRepositories>
+ <pluginRepository>
+ <id>apache.snapshots</id>
+ <name>snapshot plugins</name>
+ <url>
+ http://people.apache.org/repo/m2-snapshot-repository
+ </url>
+ </pluginRepository>
+ </pluginRepositories>
+
+ <dependencies>
+ <dependency>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>hello.service</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.annotations</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+
+ <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.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ ipojo.example.hello.impl
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/tutorial-maven/hello.impl.annotation/src/main/java/ipojo/example/hello/impl/HelloImpl.java b/ipojo/examples/tutorial-maven/hello.impl.annotation/src/main/java/ipojo/example/hello/impl/HelloImpl.java
new file mode 100644
index 0000000..8b37c2f
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.impl.annotation/src/main/java/ipojo/example/hello/impl/HelloImpl.java
@@ -0,0 +1,42 @@
+/*
+ * 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 ipojo.example.hello.impl;
+
+import ipojo.example.hello.Hello;
+
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Provides;
+
+/**
+ * Component implementing the Hello service.
+ * This class used annotations to describe the component type.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+@Component
+@Provides
+public class HelloImpl implements Hello {
+
+ /**
+ * Returns an 'Hello' message.
+ * @param name : name
+ * @return Hello message
+ * @see ipojo.example.hello.Hello#sayHello(java.lang.String)
+ */
+ public String sayHello(String name) { return "hello " + name + " @"; }
+}
diff --git a/ipojo/examples/tutorial-maven/hello.impl.annotation/src/main/java/ipojo/example/hello/impl/source.txt b/ipojo/examples/tutorial-maven/hello.impl.annotation/src/main/java/ipojo/example/hello/impl/source.txt
new file mode 100644
index 0000000..0198756
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.impl.annotation/src/main/java/ipojo/example/hello/impl/source.txt
@@ -0,0 +1 @@
+PUT YOUR SOURCE FILES HERE
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.impl.annotation/src/main/resources/metadata.xml b/ipojo/examples/tutorial-maven/hello.impl.annotation/src/main/resources/metadata.xml
new file mode 100644
index 0000000..559b556
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.impl.annotation/src/main/resources/metadata.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO>
+ <instance component="ipojo.example.hello.impl.HelloImpl"
+ name="HelloService2" />
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.impl/metadata.xml b/ipojo/examples/tutorial-maven/hello.impl/metadata.xml
new file mode 100644
index 0000000..59d9666
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.impl/metadata.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO>
+ <component className="ipojo.example.hello.impl.HelloImpl"
+ name="HelloProvider" architecture="true">
+ <provides />
+ </component>
+ <instance component="HelloProvider" name="HelloService" />
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.impl/pom.xml b/ipojo/examples/tutorial-maven/hello.impl/pom.xml
new file mode 100644
index 0000000..3cf4551
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.impl/pom.xml
@@ -0,0 +1,65 @@
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>hello.impl</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <name>Hello Service Provider</name>
+
+ <pluginRepositories>
+ <pluginRepository>
+ <id>apache.snapshots</id>
+ <name>snapshot plugins</name>
+ <url>
+ http://people.apache.org/repo/m2-snapshot-repository
+ </url>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </pluginRepository>
+ </pluginRepositories>
+
+ <dependencies>
+ <dependency>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>hello.service</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ ipojo.example.hello.impl
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/tutorial-maven/hello.impl/src/main/java/ipojo/example/hello/impl/HelloImpl.java b/ipojo/examples/tutorial-maven/hello.impl/src/main/java/ipojo/example/hello/impl/HelloImpl.java
new file mode 100644
index 0000000..8008fa9
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.impl/src/main/java/ipojo/example/hello/impl/HelloImpl.java
@@ -0,0 +1,36 @@
+/*
+ * 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 ipojo.example.hello.impl;
+
+import ipojo.example.hello.Hello;
+
+/**
+ * Component implementing the Hello service.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class HelloImpl implements Hello {
+
+ /**
+ * Returns an 'Hello' message.
+ * @param name : name
+ * @return Hello message
+ * @see ipojo.example.hello.Hello#sayHello(java.lang.String)
+ */
+ public String sayHello(String name) { return "hello " + name; }
+}
diff --git a/ipojo/examples/tutorial-maven/hello.impl/src/main/java/ipojo/example/hello/impl/source.txt b/ipojo/examples/tutorial-maven/hello.impl/src/main/java/ipojo/example/hello/impl/source.txt
new file mode 100644
index 0000000..0198756
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.impl/src/main/java/ipojo/example/hello/impl/source.txt
@@ -0,0 +1 @@
+PUT YOUR SOURCE FILES HERE
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.service/metadata.xml b/ipojo/examples/tutorial-maven/hello.service/metadata.xml
new file mode 100644
index 0000000..89547bc
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.service/metadata.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO>
+ <component className="ipojo.example.hello.impl.HelloImpl" name="HelloProvider" architecture="true">
+ <provides/>
+ </component>
+ <instance component="HelloProvider" name="HelloService"/>
+</iPOJO>
\ No newline at end of file
diff --git a/ipojo/examples/tutorial-maven/hello.service/pom.xml b/ipojo/examples/tutorial-maven/hello.service/pom.xml
new file mode 100644
index 0000000..084989d
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.service/pom.xml
@@ -0,0 +1,63 @@
+<!--
+ 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.
+-->
+<project>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>hello.service</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <name>Hello Service</name>
+
+ <pluginRepositories>
+ <pluginRepository>
+ <id>apache.snapshots</id>
+ <name>snapshot plugins</name>
+ <url>
+ http://people.apache.org/repo/m2-snapshot-repository
+ </url>
+ <releases>
+ <enabled>false</enabled>
+ </releases>
+ <snapshots>
+ <enabled>true</enabled>
+ </snapshots>
+ </pluginRepository>
+ </pluginRepositories>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Export-Package>
+ ipojo.example.hello
+ </Export-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/examples/tutorial-maven/hello.service/src/main/java/ipojo/example/hello/Hello.java b/ipojo/examples/tutorial-maven/hello.service/src/main/java/ipojo/example/hello/Hello.java
new file mode 100644
index 0000000..e0c25da
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/hello.service/src/main/java/ipojo/example/hello/Hello.java
@@ -0,0 +1,33 @@
+/*
+ * 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 ipojo.example.hello;
+
+/**
+ * Hello Interface.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public interface Hello {
+
+ /**
+ * Returns a message like: "Hello $user_name".
+ * @param name the name
+ * @return the hello message
+ */
+ String sayHello(String name);
+}
diff --git a/ipojo/examples/tutorial-maven/pom.xml b/ipojo/examples/tutorial-maven/pom.xml
new file mode 100644
index 0000000..99d12ac
--- /dev/null
+++ b/ipojo/examples/tutorial-maven/pom.xml
@@ -0,0 +1,40 @@
+<project>
+ <parent>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>ipojo.examples</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>ipojo.tutorial</artifactId>
+ <name>Apache Felix iPOJO Tutorial</name>
+ <packaging>pom</packaging>
+ <modules>
+ <module>hello.service</module>
+ <module>hello.impl</module>
+ <module>hello.client</module>
+ </modules>
+
+ <profiles>
+ <profile>
+ <id>java5</id>
+ <activation>
+ <jdk>1.5</jdk>
+ </activation>
+ <modules>
+ <module>hello.impl.annotation</module>
+ <module>hello.client.annotation</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>java6</id>
+ <activation>
+ <jdk>1.6</jdk>
+ </activation>
+ <modules>
+ <module>hello.impl.annotation</module>
+ <module>hello.client.annotation</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
\ No newline at end of file
diff --git a/ipojo/extender.pattern.handler/metadata.xml b/ipojo/extender.pattern.handler/metadata.xml
new file mode 100644
index 0000000..cb45ffc
--- /dev/null
+++ b/ipojo/extender.pattern.handler/metadata.xml
@@ -0,0 +1,6 @@
+<ipojo>
+ <handler
+ classname="org.apache.felix.ipojo.handler.extender.ExtenderModelHandler"
+ name="extender" namespace="org.apache.felix.ipojo.extender">
+ </handler>
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/extender.pattern.handler/pom.xml b/ipojo/extender.pattern.handler/pom.xml
new file mode 100644
index 0000000..a89fbd0
--- /dev/null
+++ b/ipojo/extender.pattern.handler/pom.xml
@@ -0,0 +1,91 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO Extender Pattern Handler</name>
+ <artifactId>
+ org.apache.felix.ipojo.handler.extender.pattern
+ </artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Private-Package>
+ org.apache.felix.ipojo.handler.extender
+ </Private-Package>
+ <Bundle-Name>${pom.name}</Bundle-Name>
+ <Bundle-SymbolicName>
+ org.apache.felix.ipojo.handler.extender.pattern
+ </Bundle-SymbolicName>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <metadata>metadata.xml</metadata>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/extender.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/extender/ExtenderManager.java b/ipojo/extender.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/extender/ExtenderManager.java
new file mode 100644
index 0000000..aa8341a
--- /dev/null
+++ b/ipojo/extender.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/extender/ExtenderManager.java
@@ -0,0 +1,178 @@
+/*
+ * 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.handler.extender;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.util.Callback;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleEvent;
+import org.osgi.framework.SynchronousBundleListener;
+
+/**
+ * Track and manage extensions.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ExtenderManager implements SynchronousBundleListener {
+
+ /**
+ * Looked extension.
+ */
+ private String m_extension;
+
+ /**
+ * OnArrival method.
+ */
+ private Callback m_onArrival;
+
+ /**
+ * OnDeparture method.
+ */
+ private Callback m_onDeparture;
+
+ /**
+ * Attached handler.
+ */
+ private PrimitiveHandler m_handler;
+
+ /**
+ * Bundle context.
+ */
+ private BundleContext m_context;
+
+ /**
+ * List of managed bundles.
+ */
+ private List m_bundles = new ArrayList();
+
+ /**
+ * Constructor.
+ * @param handler : attached handler.
+ * @param extension : looked extension.
+ * @param bind : onArrival method
+ * @param unbind : onDeparture method.
+ */
+ public ExtenderManager(ExtenderModelHandler handler, String extension, String bind, String unbind) {
+ m_handler = handler;
+ m_onArrival = new Callback(bind, new Class[] {Bundle.class, String.class}, false, m_handler.getInstanceManager());
+ m_onDeparture = new Callback(unbind, new Class[] {Bundle.class}, false, m_handler.getInstanceManager());
+ m_extension = extension;
+ m_context = handler.getInstanceManager().getContext();
+ }
+
+ /**
+ * Start method.
+ * Look for already presents bundle and register a (synchronous) bundle listener.
+ */
+ public void start() {
+ synchronized (this) {
+ // listen to any changes in bundles.
+ m_context.addBundleListener(this);
+ // compute already started bundles.
+ for (int i = 0; i < m_context.getBundles().length; i++) {
+ if (m_context.getBundles()[i].getState() == Bundle.ACTIVE) {
+ onArrival(m_context.getBundles()[i]);
+ }
+ }
+ }
+ }
+
+ /**
+ * Manage a bundle arrival:
+ * Check the extension and manage it if present.
+ * @param bundle : bundle.
+ */
+ private void onArrival(Bundle bundle) {
+ Dictionary headers = bundle.getHeaders();
+ String header = (String) headers.get(m_extension);
+ if (header != null) {
+ m_bundles.add(bundle);
+ try {
+ m_onArrival.call(new Object[] {bundle, header});
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The onArrival method " + m_onArrival.getMethod() + " does not exist in the class", e);
+ m_handler.getInstanceManager().stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The onArrival method " + m_onArrival.getMethod() + " cannot be called", e);
+ m_handler.getInstanceManager().stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The onArrival method " + m_onArrival.getMethod() + " has thrown an exception", e.getTargetException());
+ m_handler.getInstanceManager().stop();
+ }
+ }
+ }
+
+ /**
+ * Stop method.
+ * Remove the bundle listener.
+ */
+ public void stop() {
+ m_context.removeBundleListener(this);
+ m_bundles.clear();
+ }
+
+ /**
+ * Bundle listener.
+ * @param event : event.
+ * @see org.osgi.framework.BundleListener#bundleChanged(org.osgi.framework.BundleEvent)
+ */
+ public void bundleChanged(BundleEvent event) {
+ switch (event.getType()) {
+ case BundleEvent.STARTED:
+ onArrival(event.getBundle());
+ break;
+ case BundleEvent.STOPPING:
+ onDeparture(event.getBundle());
+ break;
+ default:
+ break;
+ }
+
+ }
+
+ /**
+ * Manage a bundle departure.
+ * If the bundle was managed, invoke the OnDeparture callback, and remove the bundle from the list.
+ * @param bundle : bundle.
+ */
+ private void onDeparture(Bundle bundle) {
+ if (m_bundles.contains(bundle)) {
+ try {
+ m_onDeparture.call(new Object[] {bundle});
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " does not exist in the class", e);
+ m_handler.getInstanceManager().stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " cannot be called", e);
+ m_handler.getInstanceManager().stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " has thrown an exception", e.getTargetException());
+ m_handler.getInstanceManager().stop();
+ }
+ }
+ }
+
+
+
+}
diff --git a/ipojo/extender.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/extender/ExtenderModelHandler.java b/ipojo/extender.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/extender/ExtenderModelHandler.java
new file mode 100644
index 0000000..8fc50b9
--- /dev/null
+++ b/ipojo/extender.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/extender/ExtenderModelHandler.java
@@ -0,0 +1,94 @@
+/*
+ * 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.handler.extender;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.metadata.Element;
+
+/**
+ * Handler automating extender pattern. The component using this handler is notified
+ * when an handler with a special manifest extension is detected, the component is notified.
+ * When a managed handler leaves, the component is also notified.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class ExtenderModelHandler extends PrimitiveHandler {
+
+ /**
+ * Handler namespace.
+ */
+ public static final String NAMESPACE = "org.apache.felix.ipojo.extender";
+
+ /**
+ * Extension manager list.
+ */
+ private List m_managers = new ArrayList(1);
+
+ /**
+ * Configure method.
+ * @param elem : component type element.
+ * @param dict : instance configuration.
+ * @throws ConfigurationException : the configuration is not valid.
+ * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+ */
+ public void configure(Element elem, Dictionary dict) throws ConfigurationException {
+ Element[] elems = elem.getElements("extender", NAMESPACE);
+ for (int i = 0; i < elems.length; i++) {
+ String extension = elems[i].getAttribute("extension");
+ String onArrival = elems[i].getAttribute("onArrival");
+ String onDeparture = elems[i].getAttribute("onDeparture");
+
+ if (extension == null) {
+ throw new ConfigurationException("The extender element requires an 'extender' attribute");
+ }
+ if (onArrival == null || onDeparture == null) {
+ throw new ConfigurationException("The extender element requires the onArrival and onDeparture attributes");
+ }
+
+ ExtenderManager wbm = new ExtenderManager(this, extension, onArrival, onDeparture);
+ m_managers.add(wbm);
+ }
+
+ }
+
+ /**
+ * Start the handler.
+ * @see org.apache.felix.ipojo.Handler#start()
+ */
+ public void start() {
+ for (int i = 0; i < m_managers.size(); i++) {
+ ((ExtenderManager) m_managers.get(i)).start();
+ }
+ }
+
+ /**
+ * Stop the handler.
+ * @see org.apache.felix.ipojo.Handler#stop()
+ */
+ public void stop() {
+ for (int i = 0; i < m_managers.size(); i++) {
+ ((ExtenderManager) m_managers.get(i)).stop();
+ }
+ }
+
+}
diff --git a/ipojo/jmx.handler/pom.xml b/ipojo/jmx.handler/pom.xml
index fb5750c..f2da02d 100644
--- a/ipojo/jmx.handler/pom.xml
+++ b/ipojo/jmx.handler/pom.xml
@@ -1,49 +1,53 @@
-<!--
- 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.
--->
+<!--
+ 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.
+-->
<project>
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
<modelVersion>4.0.0</modelVersion>
<packaging>bundle</packaging>
- <groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.ipojo.handler.jmx</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- <name>iPOJO JMX Handler</name>
+ <name>Apache Felix iPOJO JMX Handler</name>
<dependencies>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.core</artifactId>
- <version>1.1.0-SNAPSHOT</version>
+ <version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.osgi.compendium</artifactId>
- <version>1.0.0</version>
+ <version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.ipojo.metadata</artifactId>
- <version>0.7.5-SNAPSHOT</version>
+ <version>${pom.version}</version>
</dependency>
<dependency>
<groupId>org.apache.felix</groupId>
<artifactId>org.apache.felix.ipojo</artifactId>
- <version>0.7.5-SNAPSHOT</version>
+ <version>${pom.version}</version>
</dependency>
</dependencies>
@@ -52,7 +56,7 @@
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
- <version>1.4.0</version>
+ <version>1.4.0</version>
<extensions>true</extensions>
<configuration>
<instructions>
@@ -60,7 +64,9 @@
org.apache.felix.ipojo.handlers.jmx
</Private-Package>
<Bundle-Name>${pom.name}</Bundle-Name>
- <Bundle-SymbolicName>ipojo.jmx.handler</Bundle-SymbolicName>
+ <Bundle-SymbolicName>
+ ipojo.jmx.handler
+ </Bundle-SymbolicName>
</instructions>
</configuration>
</plugin>
@@ -73,20 +79,20 @@
</configuration>
</plugin>
<plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-ipojo-plugin</artifactId>
- <version>${pom.version}</version>
- <executions>
- <execution>
- <goals>
- <goal>ipojo-bundle</goal>
- </goals>
- <configuration>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
<metadata>metadata.xml</metadata>
- </configuration>
- </execution>
- </executions>
- </plugin>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
</plugins>
</build>
</project>
diff --git a/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanImpl.java b/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanImpl.java
index 0c36ab0..c539f82 100644
--- a/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanImpl.java
+++ b/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/DynamicMBeanImpl.java
@@ -43,6 +43,7 @@
import org.apache.felix.ipojo.InstanceManager;
import org.apache.felix.ipojo.parser.MethodMetadata;
import org.apache.felix.ipojo.util.Callback;
+import org.apache.felix.ipojo.util.Logger;
/**
* this class implements iPOJO DynamicMBean.
@@ -55,24 +56,27 @@
* JmxConfigDFieldMap : store the data extracted from metadata.xml.
*/
private JmxConfigFieldMap m_configMap;
+
/**
* InstanceManager: use to store the InstanceManager instance.
*/
private InstanceManager m_instanceManager;
+
/**
* MBeanInfo : class wich store the MBean Informations.
*/
private MBeanInfo m_mBeanInfo;
+
/**
* String : constant which store the name of the class.
*/
private String m_className = this.getClass().getName();
-
+
/**
* sequenceNumber : use to calculate unique id to notification.
*/
private int m_sequenceNumber = 0;
-
+
/**
* DynamicMBeanImpl : constructor.
* @param properties : data extracted from metadat.xml file
@@ -83,7 +87,7 @@
m_instanceManager = instanceManager;
this.buildMBeanInfo();
}
-
+
/**
* getAttribute implements from JMX.
* get the value of the required attribute
@@ -95,13 +99,14 @@
*/
public Object getAttribute(String arg0) throws AttributeNotFoundException, MBeanException, ReflectionException {
PropertyField attribute = m_configMap.getPropertyFromName(arg0);
-
+
if (attribute == null) {
throw new AttributeNotFoundException(arg0 + " not found");
} else {
return attribute.getValue();
}
}
+
/**
* getAttributes : implement from JMX.
* get values of reuqired attributes
@@ -109,21 +114,22 @@
* @return return the list of the attribute
*/
public AttributeList getAttributes(String[] attributeNames) {
-
+
if (attributeNames == null) {
throw new IllegalArgumentException("attributeNames[] cannot be null");
}
-
+
AttributeList resultList = new AttributeList();
for (int i = 0; i < attributeNames.length; i++) {
PropertyField propertyField = (PropertyField) m_configMap.getPropertyFromField((String) attributeNames[i]);
-
+
if (propertyField != null) {
resultList.add(new Attribute(attributeNames[i], propertyField.getValue()));
}
}
return resultList;
}
+
/**
* getMBeanInfo : return the MBean Class builded.
* @return return MBeanInfo class constructed by buildMBeanInfo
@@ -131,6 +137,7 @@
public MBeanInfo getMBeanInfo() {
return m_mBeanInfo;
}
+
/**
* invoke : invoke the required method on the targeted POJO.
* @param operationName : name of the method called
@@ -159,13 +166,15 @@
e.printStackTrace();
}
} else {
- throw new ReflectionException(new NoSuchMethodException(
- operationName), "Cannot find the operation "
- + operationName + " in " + m_className);
+ throw new ReflectionException(new NoSuchMethodException(operationName), "Cannot find the operation "
+ + operationName
+ + " in "
+ + m_className);
}
-
+
return null;
}
+
/**
* setAttribute : change specified attribute value.
* @param attribute : attribute with new value to be changed
@@ -174,71 +183,68 @@
* @throws MBeanException :
* @throws ReflectionException :
*/
- public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException, ReflectionException {
-
+ public void setAttribute(Attribute attribute) throws AttributeNotFoundException, InvalidAttributeValueException, MBeanException,
+ ReflectionException {
+
// Check attribute is not null to avoid NullPointerException later on
if (attribute == null) {
- throw new RuntimeOperationsException(new IllegalArgumentException(
- "Attribute cannot be null"), "Cannot invoke a setter of "
- + m_className + " with null attribute");
+ throw new RuntimeOperationsException(new IllegalArgumentException("Attribute cannot be null"), "Cannot invoke a setter of "
+ + m_className
+ + " with null attribute");
}
String name = attribute.getName();
Object value = attribute.getValue();
if (name == null) {
- throw new RuntimeOperationsException(new IllegalArgumentException(
- "Attribute name cannot be null"),
- "Cannot invoke the setter of " + m_className
- + " with null attribute name");
+ throw new RuntimeOperationsException(new IllegalArgumentException("Attribute name cannot be null"), "Cannot invoke the setter of "
+ + m_className
+ + " with null attribute name");
}
// Check for a recognized attribute name and call the corresponding
// setter
//
-
+
PropertyField propertyField = (PropertyField) m_configMap.getPropertyFromName(name);
if (propertyField == null) {
// unrecognized attribute name:
- throw new AttributeNotFoundException("Attribute " + name
- + " not found in " + m_className);
+ throw new AttributeNotFoundException("Attribute " + name + " not found in " + m_className);
}
if (!propertyField.isWritable()) {
- throw new InvalidAttributeValueException(
- "Attribute " + name + " can not be setted");
+ throw new InvalidAttributeValueException("Attribute " + name + " can not be setted");
}
-
+
if (value == null) {
try {
- m_instanceManager.setterCallback(propertyField.getField(), null);
+ m_instanceManager.onSet(null, propertyField.getField(), null);
} catch (Exception e) {
- throw new InvalidAttributeValueException(
- "Cannot set attribute " + name + " to null");
+ throw new InvalidAttributeValueException("Cannot set attribute " + name + " to null");
}
} else { // if non null value, make sure it is assignable to the attribute
if (true /* TODO type.class.isAssignableFrom(value.getClass())*/) {
//propertyField.setValue(value);
// setValue(attributeField.getField(),null);
- m_instanceManager.setterCallback(propertyField.getField(), value);
+ m_instanceManager.onSet(null, propertyField.getField(), value);
} else {
- throw new InvalidAttributeValueException(
- "Cannot set attribute " + name + " to a "
- + value.getClass().getName()
- + " object, String expected");
+ throw new InvalidAttributeValueException("Cannot set attribute "
+ + name
+ + " to a "
+ + value.getClass().getName()
+ + " object, String expected");
}
}
-
}
+
/**
* setAttributes : change all the attributes value.
* @param attributes : list of attribute value to be changed
* @return AttributeList : list of new attribute
*/
public AttributeList setAttributes(AttributeList attributes) {
-
-// Check attributes is not null to avoid NullPointerException later on
+
+ // Check attributes is not null to avoid NullPointerException later on
if (attributes == null) {
- throw new RuntimeOperationsException(new IllegalArgumentException(
- "AttributeList attributes cannot be null"),
+ throw new RuntimeOperationsException(new IllegalArgumentException("AttributeList attributes cannot be null"),
"Cannot invoke a setter of " + m_className);
}
AttributeList resultList = new AttributeList();
@@ -247,7 +253,7 @@
if (attributes.isEmpty()) {
return resultList;
}
-
+
// for each attribute, try to set it and add to the result list if
// successfull
for (Iterator i = attributes.iterator(); i.hasNext();) {
@@ -263,58 +269,45 @@
}
return resultList;
}
+
/**
- * buildMBeanInfo : buil the MBean information on initilisation.
+ * buildMBeanInfo : build the MBean information on initialization.
* this value don't change after
*/
private void buildMBeanInfo() {
String dDescription = m_configMap.getDecription();
-
+
// generate infos for attributes
MBeanAttributeInfo[] dAttributes = null;
-
+
if (m_configMap == null) {
return;
}
-
- if (m_configMap.getProperties() != null) {
- List <MBeanAttributeInfo> lAttributes = null;
- lAttributes = new ArrayList <MBeanAttributeInfo> ();
- Iterator <PropertyField> iterator = m_configMap.getProperties().iterator();
+ if (m_configMap.getProperties() != null) {
+ List<MBeanAttributeInfo> lAttributes = null;
+ lAttributes = new ArrayList<MBeanAttributeInfo>();
+
+ Iterator<PropertyField> iterator = m_configMap.getProperties().iterator();
while (iterator.hasNext()) {
PropertyField propertyField = (PropertyField) iterator.next();
- lAttributes.add(new MBeanAttributeInfo(
- propertyField.getName(),
- propertyField.getType(),
- propertyField.getDescription(),
- propertyField.isReadable(),
- propertyField.isWritable(),
- false));
+ lAttributes.add(new MBeanAttributeInfo(propertyField.getName(), propertyField.getType(), propertyField.getDescription(),
+ propertyField.isReadable(), propertyField.isWritable(), false));
}
- dAttributes = (MBeanAttributeInfo[]) lAttributes.toArray(new MBeanAttributeInfo[ lAttributes.size() ]);
+ dAttributes = (MBeanAttributeInfo[]) lAttributes.toArray(new MBeanAttributeInfo[lAttributes.size()]);
}
-
-
MBeanOperationInfo[] dOperations = null;
if (m_configMap.getMethods() != null) {
-
- List <MBeanOperationInfo> lOperations = new ArrayList <MBeanOperationInfo>();
-
- Iterator <MethodField[]> iterator = m_configMap.getMethods().iterator();
+
+ List<MBeanOperationInfo> lOperations = new ArrayList<MBeanOperationInfo>();
+
+ Iterator<MethodField[]> iterator = m_configMap.getMethods().iterator();
while (iterator.hasNext()) {
MethodField[] method = (MethodField[]) iterator.next();
- for (int i = 0 ; i < method.length ; i++) {
- lOperations.add(
- new MBeanOperationInfo(
- method[i].getName(),
- method[i].getDescription(),
- method[i].getParams(),
- method[i].getReturnType(),
- MBeanOperationInfo.UNKNOWN
- )
- );
+ for (int i = 0; i < method.length; i++) {
+ lOperations.add(new MBeanOperationInfo(method[i].getName(), method[i].getDescription(), method[i].getParams(), method[i]
+ .getReturnType(), MBeanOperationInfo.UNKNOWN));
}
dOperations = (MBeanOperationInfo[]) lOperations.toArray(new MBeanOperationInfo[lOperations.size()]);
}
@@ -322,10 +315,10 @@
MBeanNotificationInfo[] dNotification = new MBeanNotificationInfo[0];
if (m_configMap.getMethods() != null) {
-
- List <MBeanNotificationInfo> lNotifications = new ArrayList <MBeanNotificationInfo>();
-
- Iterator <NotificationField> iterator = m_configMap.getNotifications().iterator();
+
+ List<MBeanNotificationInfo> lNotifications = new ArrayList<MBeanNotificationInfo>();
+
+ Iterator<NotificationField> iterator = m_configMap.getNotifications().iterator();
while (iterator.hasNext()) {
NotificationField notification = (NotificationField) iterator.next();
lNotifications.add(notification.getNotificationInfo());
@@ -333,13 +326,8 @@
dNotification = (MBeanNotificationInfo[]) lNotifications.toArray(new MBeanNotificationInfo[lNotifications.size()]);
}
- m_mBeanInfo = new MBeanInfo(
- this.m_className,
- dDescription,
- dAttributes,
- null, // No constructor
- dOperations,
- dNotification);
+ m_mBeanInfo = new MBeanInfo(this.m_className, dDescription, dAttributes, null, // No constructor
+ dOperations, dNotification);
}
/**
@@ -349,10 +337,10 @@
public MBeanNotificationInfo[] getNotificationInfo() {
MBeanNotificationInfo[] dNotification = new MBeanNotificationInfo[0];
if (m_configMap.getMethods() != null) {
-
- List < MBeanNotificationInfo> lNotifications = new ArrayList < MBeanNotificationInfo>();
-
- Iterator <NotificationField> iterator = m_configMap.getNotifications().iterator();
+
+ List<MBeanNotificationInfo> lNotifications = new ArrayList<MBeanNotificationInfo>();
+
+ Iterator<NotificationField> iterator = m_configMap.getNotifications().iterator();
while (iterator.hasNext()) {
NotificationField notification = (NotificationField) iterator.next();
lNotifications.add(notification.getNotificationInfo());
@@ -361,7 +349,7 @@
}
return dNotification;
}
-
+
/**
* sendNotification : send a notification to a subscriver.
* @param msg : msg to send
@@ -370,20 +358,17 @@
* @param oldValue : oldvalue of the attribute
* @param newValue : new value of the attribute
*/
- public void sendNotification(String msg, String attributeName,
- String attributeType, Object oldValue, Object newValue) {
+ public void sendNotification(String msg, String attributeName, String attributeType, Object oldValue, Object newValue) {
long timeStamp = System.currentTimeMillis();
-
-
+
if (newValue.equals(oldValue)) {
return;
}
m_sequenceNumber++;
- Notification notification = new AttributeChangeNotification(
- this, m_sequenceNumber, timeStamp,
- msg, attributeName, attributeType, oldValue, newValue);
+ Notification notification =
+ new AttributeChangeNotification(this, m_sequenceNumber, timeStamp, msg, attributeName, attributeType, oldValue, newValue);
sendNotification(notification);
- System.out.println("DEBUG: Notification sent");
+ m_instanceManager.getFactory().getLogger().log(Logger.INFO, "Notification sent");
}
}
diff --git a/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java b/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java
index 64a72da..c3df29d 100644
--- a/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java
+++ b/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/JmxConfigFieldMap.java
@@ -228,7 +228,6 @@
return false;
} else {
for (int i = 0; i < sig1.length; i++) {
- //System.out.println(sig1[i] +" == "+ sig2[i]);
if (!sig1[i].equals(sig2[i])) {
return false;
}
diff --git a/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java b/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java
index 9e04bb0..ff3dd17 100644
--- a/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java
+++ b/ipojo/jmx.handler/src/main/java/org/apache/felix/ipojo/handlers/jmx/MBeanHandler.java
@@ -27,12 +27,13 @@
import org.apache.felix.ipojo.PrimitiveHandler;
import org.apache.felix.ipojo.metadata.Element;
import org.apache.felix.ipojo.parser.FieldMetadata;
-import org.apache.felix.ipojo.parser.ManipulationMetadata;
import org.apache.felix.ipojo.parser.MethodMetadata;
+import org.apache.felix.ipojo.parser.PojoMetadata;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;
-/** this class implements iPOJO Handler.
+/**
+ * This class implements iPOJO Handler.
* it builds the dynamic MBean from metadata.xml and expose it to the MBean Server.
*
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
@@ -43,7 +44,7 @@
*/
private InstanceManager m_instanceManager;
/**
- * ServiceRegistration : use to register and deregister the Dynamic MBean.
+ * ServiceRegistration : use to register and unregister the Dynamic MBean.
*/
private ServiceRegistration m_serviceRegistration;
/**
@@ -57,16 +58,16 @@
/**
* String : constant which store the name of the class.
*/
- private String m_NAMESPACE = this.getClass().getName();
+ private String m_namespace = this.getClass().getName();
/**
* configure : construct the structure JmxConfigFieldMap.and the Dynamic Mbean.
* @param metadata Element
- * @param dict Dictionnary
+ * @param dict Dictionary
*/
public void configure(Element metadata, Dictionary dict) {
- ManipulationMetadata manipulation = new ManipulationMetadata(metadata);
+ PojoMetadata manipulation = getPojoMetadata();
m_instanceManager = getInstanceManager();
@@ -74,7 +75,7 @@
m_jmxConfigFieldMap = new JmxConfigFieldMap();
// Build the hashmap
- Element[] mbeans = metadata.getElements("config", m_NAMESPACE);
+ Element[] mbeans = metadata.getElements("config", m_namespace);
if (mbeans.length != 1) { return; }
@@ -83,47 +84,48 @@
// set property
Element[] attributes = mbeans[0].getElements("property");
//String[] fields = new String[attributes.length];
- FieldMetadata[] fields = new FieldMetadata[attributes.length];
- for (int i = 0 ; i < attributes.length ; i++) {
- boolean notif = false;
- String rights;
- String name;
- String field = attributes[i].getAttribute("field");
+ if (attributes != null) {
+ for (int i = 0 ; attributes != null && i < attributes.length ; i++) {
+ boolean notif = false;
+ String rights;
+ String name;
+ String field = attributes[i].getAttribute("field");
- if (attributes[i].containsAttribute("name")) {
- name = attributes[i].getAttribute("name");
- } else {
- name = field;
- }
- if (attributes[i].containsAttribute("rights")) {
- rights = attributes[i].getAttribute("rights");
- } else {
- rights = "w";
- }
+ if (attributes[i].containsAttribute("name")) {
+ name = attributes[i].getAttribute("name");
+ } else {
+ name = field;
+ }
+ if (attributes[i].containsAttribute("rights")) {
+ rights = attributes[i].getAttribute("rights");
+ } else {
+ rights = "w";
+ }
- PropertyField property = new PropertyField(name, field, rights, getTypeFromAttributeField(field, manipulation));
+ PropertyField property = new PropertyField(name, field, rights, getTypeFromAttributeField(field, manipulation));
- if (attributes[i].containsAttribute("notification")) {
- notif = Boolean.parseBoolean(attributes[i].getAttribute("notification"));
- }
+ if (attributes[i].containsAttribute("notification")) {
+ notif = Boolean.parseBoolean(attributes[i].getAttribute("notification"));
+ }
- property.setNotifiable(notif);
+ property.setNotifiable(notif);
- if (notif) {
- //add the new notifiable property in structure
- NotificationField notification = new NotificationField(name, this.getClass().getName() + "." + field, null);
- m_jmxConfigFieldMap.addNotificationFromName(name, notification);
- }
- m_jmxConfigFieldMap.addPropertyFromName(name, property);
- fields[i] = manipulation.getField(field);
- System.out.println("DEBUG: property exposed:" + name + " " + field + ":"
+ if (notif) {
+ //add the new notifiable property in structure
+ NotificationField notification = new NotificationField(name, this.getClass().getName() + "." + field, null);
+ m_jmxConfigFieldMap.addNotificationFromName(name, notification);
+ }
+ m_jmxConfigFieldMap.addPropertyFromName(name, property);
+ getInstanceManager().register(manipulation.getField(field), this);
+ info("property exposed:" + name + " " + field + ":"
+ getTypeFromAttributeField(field, manipulation) + " " + rights
+ ", Notif=" + notif);
+ }
}
//set methods
Element[] methods = mbeans[0].getElements("method");
- for (int i = 0 ; i < methods.length ; i++) {
+ for (int i = 0 ; methods != null && i < methods.length ; i++) {
String name = methods[i].getAttribute("name");
String description = null;
if (methods[i].containsAttribute("description")) {
@@ -135,19 +137,16 @@
for (int j = 0 ; j < method.length ; j++) {
m_jmxConfigFieldMap.addMethodFromName(name, method[j]);
- System.out.println("DEBUG: method exposed:" + method[j].getReturnType() + " " + name);
+ info("method exposed:" + method[j].getReturnType() + " " + name);
}
}
-
- m_instanceManager.register(this, fields, null);
}
/**
* start : register the Dynamic Mbean.
*/
public void start() {
-
-// create the corresponding MBean
+ // create the corresponding MBean
m_MBean = new DynamicMBeanImpl(m_jmxConfigFieldMap, m_instanceManager);
if (m_serviceRegistration != null) { m_serviceRegistration.unregister(); }
@@ -163,21 +162,20 @@
}
/**
- * stop : deregister the Dynamic Mbean.
+ * stop : unregister the Dynamic Mbean.
*/
public void stop() {
if (m_serviceRegistration != null) { m_serviceRegistration.unregister(); }
-
-
}
/**
* setterCallback : call when a POJO member is modified externally.
+ * @param pojo : the POJO object
* @param fieldName : name of the modified field
* @param value : new value of the field
*/
- public void setterCallback(String fieldName, Object value) {
+ public void onSet(Object pojo, String fieldName, Object value) {
// Check if the field is a configurable property
PropertyField propertyField = (PropertyField) m_jmxConfigFieldMap.getPropertyFromField(fieldName);
@@ -193,20 +191,20 @@
/**
* getterCallback : call when a POJO member is modified by the MBean.
+ * @pojo : pojo object.
* @param fieldName : name of the modified field
* @param value : old value of the field
* @return : new value of the field
*/
- public Object getterCallback(String fieldName, Object value) {
-
+ public Object onGet(Object pojo, String fieldName, Object value) {
// Check if the field is a configurable property
PropertyField propertyField = (PropertyField) m_jmxConfigFieldMap.getPropertyFromField(fieldName);
if (propertyField != null) {
- m_instanceManager.setterCallback(fieldName, propertyField.getValue());
+ m_instanceManager.onSet(pojo, fieldName, propertyField.getValue());
return propertyField.getValue();
}
- m_instanceManager.setterCallback(fieldName, value);
+ m_instanceManager.onSet(pojo, fieldName, value);
return value;
}
@@ -216,13 +214,13 @@
* @param manipulation : metadata extract from metadata.xml file
* @return : type of the field or null if it wasn't found
*/
- private static String getTypeFromAttributeField(String fieldRequire, ManipulationMetadata manipulation) {
+ private static String getTypeFromAttributeField(String fieldRequire, PojoMetadata manipulation) {
FieldMetadata field = manipulation.getField(fieldRequire);
if (field == null) {
return null;
} else {
- return field.getReflectionType();
+ return FieldMetadata.getReflectionType(field.getFieldType());
}
}
@@ -233,7 +231,7 @@
* @param description : description which appears in jmx console
* @return : array of methods with the right name
*/
- private MethodField[] getMethodsFromName(String methodName, ManipulationMetadata manipulation, String description) {
+ private MethodField[] getMethodsFromName(String methodName, PojoMetadata manipulation, String description) {
MethodMetadata[] fields = manipulation.getMethods(methodName);
if (fields.length == 0) {
diff --git a/ipojo/manipulator/pom.xml b/ipojo/manipulator/pom.xml
index 45e50dd..afa5a94 100644
--- a/ipojo/manipulator/pom.xml
+++ b/ipojo/manipulator/pom.xml
@@ -1,82 +1,79 @@
-<!--
- 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.
--->
-<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/xsd/maven-4.0.0.xsd">
- <parent>
- <groupId>org.apache.felix</groupId>
- <artifactId>felix</artifactId>
- <version>1.0.2</version>
- <relativePath>../../pom/pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <packaging>bundle</packaging>
- <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- <name>Apache Felix iPOJO Manipulator</name>
-
-
- <dependencies>
- <dependency>
- <groupId>asm</groupId>
- <artifactId>asm</artifactId>
- <version>3.0</version>
- </dependency>
- <dependency>
- <groupId>asm</groupId>
- <artifactId>asm-commons</artifactId>
- <version>3.0</version>
- <exclusions>
- <exclusion>
- <groupId>asm</groupId>
- <artifactId>asm-tree</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.ipojo.metadata</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <version>1.4.0</version>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-Name>iPOJO Manipulator</Bundle-Name>
- <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
- <Bundle-Description> iPOJO Manipulator </Bundle-Description>
- <Export-Package>org.apache.felix.ipojo.manipulator</Export-Package>
- <Private-Package>
- org.apache.felix.ipojo.manipulation,
- org.apache.felix.ipojo.manipulation.annotations,
- org.apache.felix.ipojo.xml.parser,
- org.objectweb.asm,
- org.objectweb.asm.commons
- </Private-Package>
- </instructions>
- </configuration>
- </plugin>
- </plugins>
- </build>
-</project>
+<!--
+ 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.
+-->
+<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/xsd/maven-4.0.0.xsd">
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
+ <name>Apache Felix iPOJO Manipulator</name>
+
+ <dependencies>
+ <dependency>
+ <groupId>asm</groupId>
+ <artifactId>asm-all</artifactId>
+ <version>3.0</version>
+ <exclusions>
+ <exclusion>
+ <groupId>asm</groupId>
+ <artifactId>asm-tree</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>iPOJO Manipulator</Bundle-Name>
+ <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
+ <Bundle-Description>
+ iPOJO Manipulator
+ </Bundle-Description>
+ <Export-Package>
+ org.apache.felix.ipojo.manipulator
+ </Export-Package>
+ <Private-Package>
+ org.apache.felix.ipojo.manipulation,
+ org.apache.felix.ipojo.manipulation.annotations,
+ org.apache.felix.ipojo.xml.parser,
+ org.objectweb.asm, org.objectweb.asm.commons
+ </Private-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ClassChecker.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ClassChecker.java
index b026c17..658f18a 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ClassChecker.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ClassChecker.java
@@ -76,12 +76,14 @@
public FieldVisitor visitField(int access, String name, String desc,
String signature, Object value) {
- if (access == ACC_PRIVATE && name.equals("_cm")
+ if (access == ACC_PRIVATE && name.equals(MethodCreator.IM_FIELD)
&& desc.equals("Lorg/apache/felix/ipojo/InstanceManager;")) {
m_isAlreadyManipulated = true;
} else if (name.startsWith("class$")) { // Does not add class$* field generated by 'x.class'
return null;
- }
+ } else if ((access & ACC_STATIC) == ACC_STATIC) {
+ return null;
+ }
Type type = Type.getType(desc);
if (type.getSort() == Type.ARRAY) {
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java
index e552072..2902b74 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/ConstructorCodeAdapter.java
@@ -23,7 +23,6 @@
import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
import org.objectweb.asm.commons.GeneratorAdapter;
@@ -48,11 +47,6 @@
* Set of contained fields.
*/
private Set m_fields;
-
- /**
- * Constructor description.
- */
- private String m_desc;
/**
* PropertyCodeAdapter constructor.
@@ -69,7 +63,6 @@
m_owner = owner;
m_superDetected = false;
m_fields = fields;
- m_desc = desc;
}
@@ -89,12 +82,12 @@
if (m_fields.contains(name) && m_owner.equals(owner)) {
if (opcode == GETFIELD) {
String gDesc = "()" + desc;
- visitMethodInsn(INVOKESPECIAL, owner, "_get" + name, gDesc);
+ visitMethodInsn(INVOKESPECIAL, owner, "__get" + name, gDesc);
return;
} else
if (opcode == PUTFIELD) {
String sDesc = "(" + desc + ")V";
- visitMethodInsn(INVOKESPECIAL, owner, "_set" + name, sDesc);
+ visitMethodInsn(INVOKESPECIAL, owner, "__set" + name, sDesc);
return;
}
}
@@ -124,12 +117,8 @@
//mv.visitVarInsn(ALOAD, Type.getArgumentTypes(m_constructorDesc).length);
mv.visitVarInsn(ALOAD, 1); // CM is always the first argument
// 3) Initialize the field
- mv.visitMethodInsn(INVOKESPECIAL, m_owner, "_setComponentManager", "(Lorg/apache/felix/ipojo/InstanceManager;)V");
+ mv.visitMethodInsn(INVOKESPECIAL, m_owner, "_setInstanceManager", "(Lorg/apache/felix/ipojo/InstanceManager;)V");
- // Add the entry callback call.
- methodEntry();
-
- // insertion finished
} else {
mv.visitMethodInsn(opcode, owner, name, desc);
}
@@ -197,101 +186,6 @@
public void visitMaxs(int maxStack, int maxLocals) {
mv.visitMaxs(maxStack + 1, maxLocals + 2);
}
-
- /**
- * Visit zero argument instruction.
- * This allow to catch RETURN instruction in order to insert the invocation to exit callback.
- * @param opcode : instruction code
- * @see org.objectweb.asm.MethodAdapter#visitInsn(int)
- */
- public void visitInsn(int opcode) {
- switch(opcode) {
- case RETURN:
- onMethodExit(opcode);
- break;
- default :
- break;
- }
- super.visitInsn(opcode);
- }
-
- /**
- * Method injecting call at the entry of each method.
- */
- private void methodEntry() {
- Type[] args = Type.getArgumentTypes(m_desc);
- String name = "$init";
-
- for (int i = 0; i < args.length; i++) {
- String cn = args[i].getClassName();
- if (cn.endsWith("[]")) {
- cn = cn.replace('[', '$');
- cn = cn.substring(0, cn.length() - 1);
- }
- cn = cn.replace('.', '_');
- name += cn;
- }
-
- String flag = "_M" + name;
-
- Label l0 = new Label();
- mv.visitLabel(l0);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, flag, "Z");
- Label l1 = new Label();
- mv.visitJumpInsn(IFEQ, l1);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "entryCallback", "(Ljava/lang/String;)V");
- mv.visitLabel(l1);
- }
-
- /**
- * Method injecting call at the exit of each method.
- * @param opcode : returned opcode (ARETURN, IRETURN, ATHROW ...)
- * @see org.objectweb.asm.commons.AdviceAdapter#onMethodExit(int)
- */
- protected void onMethodExit(int opcode) {
- Type[] args = Type.getArgumentTypes(m_desc);
- String name = "$init";
-
- for (int i = 0; i < args.length; i++) {
- String cn = args[i].getClassName();
- if (cn.endsWith("[]")) {
- cn = cn.replace('[', '$');
- cn = cn.substring(0, cn.length() - 1);
- }
- cn = cn.replace('.', '_');
- name += cn;
- }
-
- String flag = "_M" + name;
-
- int local = newLocal(Type.getType(Object.class));
- local++;
- visitInsn(ACONST_NULL);
-
- mv.visitVarInsn(ASTORE, local);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, flag, "Z");
- Label l5 = new Label();
- mv.visitJumpInsn(IFEQ, l5);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitVarInsn(ALOAD, local);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "exitCallback", "(Ljava/lang/String;Ljava/lang/Object;)V");
-
- mv.visitLabel(l5);
- }
-
-
- /**
- * Do nothing.
- * @see org.objectweb.asm.commons.AdviceAdapter#onMethodEnter()
- */
- protected void onMethodEnter() { }
}
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/FieldAdapter.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/FieldAdapter.java
deleted file mode 100644
index fec3d3e..0000000
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/FieldAdapter.java
+++ /dev/null
@@ -1,470 +0,0 @@
-/*
- * 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.manipulation;
-
-import org.objectweb.asm.ClassAdapter;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-/**
- * Create getter and setter for each fields .
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class FieldAdapter extends ClassAdapter implements Opcodes {
-
- /**
- * The owner.
- * m_owner : String
- */
- private String m_owner;
-
- /**
- * Constructor.
- * @param cv : Class visitor
- */
- public FieldAdapter(final ClassVisitor cv) {
- super(cv);
- }
-
- /**
- * The visit method. - Insert the _cm field - Create the _initialize method - Create the _cm setter method
- *
- * @see org.objectweb.asm.ClassVisitor#visit(int, int, String, String, String, String[])
- * @param version : Version
- * @param access : Access modifier
- * @param name : name of the visited element
- * @param signature : signature of the visited element
- * @param superName : superclass (extend clause)
- * @param interfaces : implement clause
- */
- public void visit(final int version, final int access, final String name, final String signature, final String superName, final String[] interfaces) {
- m_owner = name;
- }
-
- /**
- * Visit a Field.
- * Inject the getter and the setter method for this field.
- * @see org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object)
- * @param access : access modifier
- * @param name : name of the field
- * @param desc : description of the field
- * @param signature : signature of the field
- * @param value : value of the field
- * @return FieldVisitor : null
- */
- public FieldVisitor visitField(final int access, final String name, final String desc, final String signature, final Object value) {
-
- if ((access & ACC_STATIC) == 0) {
- //ManipulationProperty.getLogger().log(Level.INFO, "Manipulate the field declaration of " + name);
- Type type = Type.getType(desc);
-
- if (type.getSort() == Type.ARRAY) {
- String gDesc = "()" + desc;
- createArrayGetter(name, gDesc, type);
-
- // Generates setter method
- String sDesc = "(" + desc + ")V";
- createArraySetter(name, sDesc, type);
-
- } else {
- // Generate the getter method
- String gDesc = "()" + desc;
- createSimpleGetter(name, gDesc, type);
-
- // Generates setter method
- String sDesc = "(" + desc + ")V";
- createSimpleSetter(name, sDesc, type);
- }
-
- }
-
- return null;
- }
-
- /**
- * Create a getter method for an array.
- * @param name : field name
- * @param desc : method description
- * @param type : contained type (inside the array)
- */
- private void createArraySetter(String name, String desc, Type type) {
- MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "_set" + name, desc, null, null);
-
- String internalType = desc.substring(1);
- internalType = internalType.substring(0, internalType.length() - 2);
-
- Label l1 = new Label();
- mv.visitLabel(l1);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- Label l2 = new Label();
- mv.visitJumpInsn(IFNE, l2);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitVarInsn(ALOAD, 1);
- mv.visitFieldInsn(PUTFIELD, m_owner, name, internalType);
- mv.visitInsn(RETURN);
- mv.visitLabel(l2);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitVarInsn(ALOAD, 1);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "setterCallback", "(Ljava/lang/String;Ljava/lang/Object;)V");
-
- mv.visitInsn(RETURN);
-
- // End
- mv.visitMaxs(0, 0);
- mv.visitEnd();
- }
-
- /**
- * Create a setter method for an array.
- * @param name : field name
- * @param desc : method description
- * @param type : contained type (inside the array)
- */
- private void createArrayGetter(String name, String desc, Type type) {
-
- String methodName = "_get" + name;
- MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, methodName, desc, null, null);
-
- String internalType = desc.substring(2);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- Label l1 = new Label();
- mv.visitJumpInsn(IFNE, l1);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, name, internalType);
- mv.visitInsn(ARETURN);
- mv.visitLabel(l1);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getterCallback", "(Ljava/lang/String;)Ljava/lang/Object;");
- mv.visitTypeInsn(CHECKCAST, internalType);
- mv.visitInsn(ARETURN);
-
- // End
- mv.visitMaxs(0, 0);
- mv.visitEnd();
- }
-
- /**
- * Create the getter for a field.
- * @param name : field of the dependency
- * @param desc : description of the getter method
- * @param type : type to return
- */
- private void createSimpleGetter(String name, String desc, Type type) {
-
- String methodName = "_get" + name;
- MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, methodName, desc, null, null);
-
- switch (type.getSort()) {
- case Type.BOOLEAN:
- case Type.CHAR:
- case Type.BYTE:
- case Type.SHORT:
- case Type.INT:
-
- String internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
- String boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
- String unboxingMethod = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][2];
-
- Label l0 = new Label();
- mv.visitLabel(l0);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- Label l1 = new Label();
- mv.visitJumpInsn(IFNE, l1);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, name, internalName);
- mv.visitInsn(IRETURN);
-
- mv.visitLabel(l1);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getterCallback", "(Ljava/lang/String;)Ljava/lang/Object;");
- mv.visitVarInsn(ASTORE, 1);
-
- mv.visitVarInsn(ALOAD, 1);
- mv.visitTypeInsn(CHECKCAST, boxingType);
- mv.visitVarInsn(ASTORE, 2);
-
- mv.visitVarInsn(ALOAD, 2);
- mv.visitMethodInsn(INVOKEVIRTUAL, boxingType, unboxingMethod, "()" + internalName);
- mv.visitInsn(type.getOpcode(IRETURN));
- break;
-
- case Type.LONG:
- internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
- boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
- unboxingMethod = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][2];
-
- l0 = new Label();
- mv.visitLabel(l0);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- l1 = new Label();
- mv.visitJumpInsn(IFNE, l1);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, name, internalName);
- mv.visitInsn(LRETURN);
- mv.visitLabel(l1);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getterCallback", "(Ljava/lang/String;)Ljava/lang/Object;");
- mv.visitVarInsn(ASTORE, 1);
-
- mv.visitVarInsn(ALOAD, 1);
- mv.visitTypeInsn(CHECKCAST, boxingType);
- mv.visitVarInsn(ASTORE, 2);
-
- mv.visitVarInsn(ALOAD, 2);
- mv.visitMethodInsn(INVOKEVIRTUAL, boxingType, unboxingMethod, "()" + internalName);
- mv.visitInsn(LRETURN);
-
- break;
-
- case Type.DOUBLE:
- internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
- boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
- unboxingMethod = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][2];
-
- l0 = new Label();
- mv.visitLabel(l0);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- l1 = new Label();
- mv.visitJumpInsn(IFNE, l1);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, name, internalName);
- mv.visitInsn(DRETURN);
- mv.visitLabel(l1);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getterCallback", "(Ljava/lang/String;)Ljava/lang/Object;");
- mv.visitVarInsn(ASTORE, 1);
-
- mv.visitVarInsn(ALOAD, 1);
- mv.visitTypeInsn(CHECKCAST, boxingType);
- mv.visitVarInsn(ASTORE, 2);
-
- mv.visitVarInsn(ALOAD, 2);
- mv.visitMethodInsn(INVOKEVIRTUAL, boxingType, unboxingMethod, "()" + internalName);
- mv.visitInsn(DRETURN);
-
- break;
-
- case Type.FLOAT:
- internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
- boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
- unboxingMethod = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][2];
-
- l0 = new Label();
- mv.visitLabel(l0);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- l1 = new Label();
- mv.visitJumpInsn(IFNE, l1);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, name, internalName);
- mv.visitInsn(FRETURN);
- mv.visitLabel(l1);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getterCallback", "(Ljava/lang/String;)Ljava/lang/Object;");
- mv.visitVarInsn(ASTORE, 1);
-
- mv.visitVarInsn(ALOAD, 1);
- mv.visitTypeInsn(CHECKCAST, boxingType);
- mv.visitVarInsn(ASTORE, 2);
-
- mv.visitVarInsn(ALOAD, 2);
- mv.visitMethodInsn(INVOKEVIRTUAL, boxingType, unboxingMethod, "()" + internalName);
- mv.visitInsn(FRETURN);
-
- break;
-
- case Type.OBJECT:
- l0 = new Label();
- mv.visitLabel(l0);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- l1 = new Label();
- mv.visitJumpInsn(IFNE, l1);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, name, "L" + type.getInternalName() + ";");
- mv.visitInsn(ARETURN);
- mv.visitLabel(l1);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getterCallback", "(Ljava/lang/String;)Ljava/lang/Object;");
- mv.visitTypeInsn(CHECKCAST, type.getInternalName());
- mv.visitInsn(ARETURN);
-
- break;
-
- default:
- ManipulationProperty.getLogger().log(ManipulationProperty.SEVERE, "Manipulation problem in " + m_owner + " : a type is not implemented : " + type);
- break;
- }
-
- mv.visitMaxs(0, 0);
- mv.visitEnd();
- }
-
- /**
- * Create the setter method for one property. The name of the method is _set+name of the field
- * @param name : name of the field representing a property
- * @param desc : description of the setter method
- * @param type : type of the property
- */
- private void createSimpleSetter(String name, String desc, Type type) {
- MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "_set" + name, desc, null, null);
-
- switch (type.getSort()) {
- case Type.BOOLEAN:
- case Type.CHAR:
- case Type.BYTE:
- case Type.SHORT:
- case Type.INT:
- case Type.FLOAT:
- String internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
- String boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
-
- Label l1 = new Label();
- mv.visitLabel(l1);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- Label l22 = new Label();
- mv.visitJumpInsn(IFNE, l22);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitVarInsn(type.getOpcode(ILOAD), 1);
- mv.visitFieldInsn(PUTFIELD, m_owner, name, internalName);
- mv.visitInsn(RETURN);
- mv.visitLabel(l22);
-
- mv.visitTypeInsn(NEW, boxingType);
- mv.visitInsn(DUP);
- mv.visitVarInsn(type.getOpcode(ILOAD), 1);
- mv.visitMethodInsn(INVOKESPECIAL, boxingType, "<init>", "(" + internalName + ")V");
- mv.visitVarInsn(ASTORE, 2);
-
- Label l2 = new Label();
- mv.visitLabel(l2);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitVarInsn(ALOAD, 2);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "setterCallback", "(Ljava/lang/String;Ljava/lang/Object;)V");
-
- Label l3 = new Label();
- mv.visitLabel(l3);
- mv.visitInsn(RETURN);
- break;
-
- case Type.LONG:
- case Type.DOUBLE:
- internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
- boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
-
- l1 = new Label();
- mv.visitLabel(l1);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- Label l23 = new Label();
- mv.visitJumpInsn(IFNE, l23);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitVarInsn(type.getOpcode(ILOAD), 1);
- mv.visitFieldInsn(PUTFIELD, m_owner, name, internalName);
- mv.visitInsn(RETURN);
- mv.visitLabel(l23);
-
- mv.visitTypeInsn(NEW, boxingType);
- mv.visitInsn(DUP);
- mv.visitVarInsn(type.getOpcode(ILOAD), 1);
- mv.visitMethodInsn(INVOKESPECIAL, boxingType, "<init>", "(" + internalName + ")V");
- mv.visitVarInsn(ASTORE, 3); // Double space
-
- l2 = new Label();
- mv.visitLabel(l2);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitVarInsn(ALOAD, 3);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "setterCallback", "(Ljava/lang/String;Ljava/lang/Object;)V");
-
- l3 = new Label();
- mv.visitLabel(l3);
- mv.visitInsn(RETURN);
- break;
-
- case Type.OBJECT:
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_F" + name, "Z");
- Label l24 = new Label();
- mv.visitJumpInsn(IFNE, l24);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitVarInsn(ALOAD, 1);
- mv.visitFieldInsn(PUTFIELD, m_owner, name, "L" + type.getInternalName() + ";");
- mv.visitInsn(RETURN);
- mv.visitLabel(l24);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitVarInsn(ALOAD, 1);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "setterCallback", "(Ljava/lang/String;Ljava/lang/Object;)V");
-
- mv.visitInsn(RETURN);
- break;
- default:
- ManipulationProperty.getLogger().log(ManipulationProperty.SEVERE, "Manipulation Error : Cannot create the setter method for the field : " + name + " (" + type + ")");
- break;
- }
-
- mv.visitMaxs(0, 0);
- mv.visitEnd();
- }
-}
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
index 1917582..da02b49 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/Manipulator.java
@@ -19,11 +19,8 @@
package org.apache.felix.ipojo.manipulation;
import java.io.ByteArrayInputStream;
-import java.io.File;
-import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.net.URL;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
@@ -60,73 +57,6 @@
private String m_superClass;
/**
- * Manipulate the class.
- *
- * @param name : The name of the class
- * @param outputDirectory : output directory where the class if stored.
- * @return true if the class is correctly manipulated.
- * @throws Exception : occurs if the manipulation failed.
- */
- public boolean manipulate(String name, File outputDirectory) throws Exception {
- // gets an input stream to read the byte code of the class
- String path = outputDirectory + "/" + name.replace('.', '/') + ".class";
- File clazz = new File(path);
-
- if (!clazz.exists()) {
- return false;
- }
-
- URL url = clazz.toURL();
-
- // if (url == null) { throw new ClassNotFoundException(name); }
- ManipulationProperty.getLogger().log(ManipulationProperty.INFO, "Manipulate the class file : " + clazz.getAbsolutePath());
-
- InputStream is1 = url.openStream();
-
- // First check if the class is already manipulated :
- ClassReader ckReader = new ClassReader(is1);
- ClassChecker ck = new ClassChecker();
- ckReader.accept(ck, ClassReader.SKIP_FRAMES);
- is1.close();
-
- m_fields = ck.getFields(); // Get visited fields (contains only POJO fields)
-
- // Get interfaces and super class.
- m_interfaces = ck.getInterfaces();
- m_superClass = ck.getSuperClass();
-
- // Get the methods list
- m_methods = ck.getMethods();
-
- if (!ck.isalreadyManipulated()) {
-
- // Manipulation ->
- // Add the _setComponentManager method
- // Instrument all fields
- InputStream is2 = url.openStream();
- ClassReader cr0 = new ClassReader(is2);
- ClassWriter cw0 = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- PojoAdapter preprocess = new PojoAdapter(cw0, m_fields);
- cr0.accept(preprocess, ClassReader.SKIP_FRAMES);
- is2.close();
-
- try {
- FileOutputStream fos = new FileOutputStream(clazz);
-
- fos.write(cw0.toByteArray());
-
- fos.close();
- ManipulationProperty.getLogger().log(ManipulationProperty.INFO, "Put the file " + clazz.getAbsolutePath() + " in the jar file");
- } catch (Exception e) {
- System.err.println("Problem to write the adapted class on the file system " + " [ " + clazz.getAbsolutePath() + " ] " + e.getMessage());
- e.printStackTrace();
- }
- }
- // The file is in the bundle
- return true;
- }
-
- /**
* Manipulate the given byte array.
* @param origin : original class.
* @return the manipulated class.
@@ -158,7 +88,8 @@
InputStream is2 = new ByteArrayInputStream(origin);
ClassReader cr0 = new ClassReader(is2);
ClassWriter cw0 = new ClassWriter(ClassWriter.COMPUTE_MAXS);
- PojoAdapter preprocess = new PojoAdapter(cw0, m_fields);
+ //CheckClassAdapter ch = new CheckClassAdapter(cw0);
+ MethodCreator preprocess = new MethodCreator(cw0, m_fields);
cr0.accept(preprocess, ClassReader.SKIP_FRAMES);
is2.close();
finalWriter = cw0;
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCodeAdapter.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCodeAdapter.java
index d8be885..ff7d096 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCodeAdapter.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCodeAdapter.java
@@ -20,28 +20,21 @@
import java.util.Set;
-import org.objectweb.asm.Label;
import org.objectweb.asm.MethodVisitor;
import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-import org.objectweb.asm.commons.AdviceAdapter;
+import org.objectweb.asm.commons.GeneratorAdapter;
/**
* Insert code calling callbacks at the entry and before the exit of a method.
* Moreover it replaces all GETFIELD and SETFIELD by getter and setter invocation.
* @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
*/
-public class MethodCodeAdapter extends AdviceAdapter implements Opcodes {
+public class MethodCodeAdapter extends GeneratorAdapter implements Opcodes {
/**
* The owner class of the field. m_owner : String
*/
private String m_owner;
-
- /**
- * Name of the method.
- */
- private String m_name;
/**
* Contained fields.
@@ -60,7 +53,6 @@
public MethodCodeAdapter(final MethodVisitor mv, final String owner, int access, String name, String desc, Set fields) {
super(mv, access, name, desc);
m_owner = owner;
- m_name = name;
m_fields = fields;
}
@@ -76,106 +68,15 @@
if (owner.equals(m_owner) && m_fields.contains(name)) {
if (opcode == GETFIELD) {
String gDesc = "()" + desc;
- visitMethodInsn(INVOKESPECIAL, owner, "_get" + name, gDesc);
+ visitMethodInsn(INVOKESPECIAL, owner, "__get" + name, gDesc);
return;
} else if (opcode == PUTFIELD) {
String sDesc = "(" + desc + ")V";
- visitMethodInsn(INVOKESPECIAL, owner, "_set" + name, sDesc);
+ visitMethodInsn(INVOKESPECIAL, owner, "__set" + name, sDesc);
return;
}
}
super.visitFieldInsn(opcode, owner, name, desc);
}
- /**
- * Method injecting call at the entry of each method.
- * @see org.objectweb.asm.commons.AdviceAdapter#onMethodEnter()
- */
- protected void onMethodEnter() {
- Type[] args = Type.getArgumentTypes(methodDesc);
- String name = m_name;
-
- for (int i = 0; i < args.length; i++) {
- String cn = args[i].getClassName();
- if (cn.endsWith("[]")) {
- cn = cn.replace('[', '$');
- cn = cn.substring(0, cn.length() - 1);
- }
- cn = cn.replace('.', '_');
- name += cn;
- }
-
- String flag = "_M" + name;
-
- Label l0 = new Label();
- mv.visitLabel(l0);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, flag, "Z");
- Label l1 = new Label();
- mv.visitJumpInsn(IFEQ, l1);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "entryCallback", "(Ljava/lang/String;)V");
- mv.visitLabel(l1);
- }
-
- /**
- * Method injecting call at the exit of each method.
- * @param opcode : returned opcode (ARETURN, IRETURN, ATHROW ...)
- * @see org.objectweb.asm.commons.AdviceAdapter#onMethodExit(int)
- */
- protected void onMethodExit(int opcode) {
- Type[] args = Type.getArgumentTypes(methodDesc);
- String name = m_name;
-
- for (int i = 0; i < args.length; i++) {
- String cn = args[i].getClassName();
- if (cn.endsWith("[]")) {
- cn = cn.replace('[', '$');
- cn = cn.substring(0, cn.length() - 1);
- }
- cn = cn.replace('.', '_');
- name += cn;
- }
-
- String flag = "_M" + name;
-
- int local = newLocal(Type.getType(Object.class));
- if (opcode == RETURN) {
- visitInsn(ACONST_NULL);
- } else if (opcode != ARETURN && opcode != ATHROW) {
- box(Type.getReturnType(this.methodDesc));
- }
-
- mv.visitVarInsn(ASTORE, local);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, flag, "Z");
- Label l5 = new Label();
- mv.visitJumpInsn(IFEQ, l5);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitLdcInsn(name);
- mv.visitVarInsn(ALOAD, local);
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "exitCallback", "(Ljava/lang/String;Ljava/lang/Object;)V");
-
- mv.visitLabel(l5);
- if (opcode == ARETURN || opcode == ATHROW) {
- mv.visitVarInsn(ALOAD, local);
- } else if (opcode != RETURN) {
- mv.visitVarInsn(ALOAD, local);
- unbox(Type.getReturnType(this.methodDesc));
- }
- }
-
- /**
- * Compute max local and max stack size.
- * @param maxStack : new stack size.
- * @param maxLocals : max local (do not modified, super will update it automatically).
- * @see org.objectweb.asm.commons.LocalVariablesSorter#visitMaxs(int, int)
- */
- public void visitMaxs(int maxStack, int maxLocals) {
- super.visitMaxs(maxStack + 1, maxLocals);
- }
-
}
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java
new file mode 100644
index 0000000..348f883
--- /dev/null
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/MethodCreator.java
@@ -0,0 +1,940 @@
+/*
+ * 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.manipulation;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.objectweb.asm.ClassAdapter;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.commons.GeneratorAdapter;
+
+/**
+ * iPOJO Class Adapter.
+ * This class adapt the visited class to link the class with the container.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class MethodCreator extends ClassAdapter implements Opcodes {
+
+ /**
+ * Instance Manager Field.
+ */
+ public static final String IM_FIELD = "__IM";
+
+ /**
+ * All POJO method will be renamed by using this prefix.
+ */
+ private static final String PREFIX = "__";
+
+ /**
+ * POJO class.
+ */
+ private static final String POJO = "org/apache/felix/ipojo/Pojo";
+
+ /**
+ * Filed flag prefix.
+ */
+ private static final String FIELD_FLAG_PREFIX = "__F";
+
+ /**
+ * MEthof flag prefix.
+ */
+ private static final String METHOD_FLAG_PREFIX = "__M";
+
+ /**
+ * onEntry method name.
+ */
+ private static final String ENTRY = "onEntry";
+
+ /**
+ * onExit method name.
+ */
+ private static final String EXIT = "onExit";
+
+ /**
+ * on Error method name.
+ */
+ private static final String ERROR = "onError";
+
+ /**
+ * onGet method name.
+ */
+ private static final String GET = "onGet";
+
+ /**
+ * onSet method name.
+ */
+ private static final String SET = "onSet";
+
+ /**
+ * Name of the current manipulated class.
+ */
+ private String m_owner;
+
+ /**
+ * Set of fields detected in the class.
+ * (this set is given by the previous analysis)
+ */
+ private Set m_fields;
+
+ /**
+ * List of methods contained in the class.
+ * This set contains method id.
+ */
+ private List m_methods = new ArrayList(); // Contains method id.
+
+ /**
+ * Constructor.
+ * @param arg0 : class visitor.
+ * @param fields : fields map detected during the previous class analysis.
+ */
+ public MethodCreator(ClassVisitor arg0, Map fields) {
+ super(arg0);
+ m_fields = fields.keySet();
+ }
+
+ /**
+ * Vist method.
+ * This method store the current class name.
+ * Moreover the POJO interface is added to the list of implemented interface.
+ * Then the Instance manager field is added.
+ * @param version : version
+ * @param access : access flag
+ * @param name : class name
+ * @param signature : signature
+ * @param superName : parent class
+ * @param interfaces : implemented interface
+ * @see org.objectweb.asm.ClassAdapter#visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
+ */
+ public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
+ m_owner = name;
+ addPOJOInterface(version, access, name, signature, superName, interfaces);
+ addIMField();
+ }
+
+ /**
+ * A method is visited.
+ * This method does not manipulate clinit and class$ methods.
+ * In the case of a constructor, this method will generate a constructor with the instance manager
+ * and will adapt the current constructor to call this constructor.
+ * For standard method, this method will create method header, rename the current method and adapt it.
+ * @param access : access flag.
+ * @param name : name of the method
+ * @param desc : method descriptor
+ * @param signature : signature
+ * @param exceptions : declared exceptions.
+ * @return the MethodVisitor wichi will visit the method code.
+ * @see org.objectweb.asm.ClassAdapter#visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
+ */
+ public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
+ // Avoid manipulating special methods
+ if (name.equals("<clinit>") || name.equals("class$")) { return super.visitMethod(access, name, desc, signature, exceptions); }
+ // The constructor is manipulated separately
+ if (name.equals("<init>")) {
+ //TODO : do not manipulate non matching constructor.
+
+
+ // 1) change the constructor descriptor (add a component manager arg as first argument)
+ String newDesc = desc.substring(1);
+ newDesc = "(Lorg/apache/felix/ipojo/InstanceManager;" + newDesc;
+
+ Type[] args = Type.getArgumentTypes(desc);
+ if (args.length == 0) {
+ generateEmptyConstructor(access, signature, exceptions);
+ } else if (args.length == 1 && args[0].getClassName().equals("org.osgi.framework.BundleContext")) {
+ generateBCConstructor(access, signature, exceptions);
+ } else {
+ // Do nothing, the constructor does not match.
+ return cv.visitMethod(access, name, desc, signature, exceptions);
+ }
+
+ // Insert the new constructor
+ MethodVisitor mv = super.visitMethod(ACC_PRIVATE, "<init>", newDesc, signature, exceptions);
+ return new ConstructorCodeAdapter(mv, m_owner, m_fields, ACC_PRIVATE, name, newDesc);
+ }
+
+ if ((access & ACC_STATIC) == ACC_STATIC) { return super.visitMethod(access, name, desc, signature, exceptions); }
+
+ generateMethodHeader(access, name, desc, signature, exceptions);
+ FieldVisitor flagField = cv.visitField(Opcodes.ACC_PRIVATE, generateMethodFlag(name, desc), "Z", null, null);
+ flagField.visitEnd();
+
+ MethodVisitor mv = super.visitMethod(ACC_PRIVATE, PREFIX + name, desc, signature, exceptions);
+ return new MethodCodeAdapter(mv, m_owner, ACC_PRIVATE, PREFIX + name, desc, m_fields);
+ }
+
+ /**
+ * Visit a Field.
+ * This field access is replaced by an invocation to the getter method or to the setter method.
+ * (except for static field).
+ * Inject the getter and the setter method for this field.
+ * @see org.objectweb.asm.ClassVisitor#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object)
+ * @param access : access modifier
+ * @param name : name of the field
+ * @param desc : description of the field
+ * @param signature : signature of the field
+ * @param value : value of the field
+ * @return FieldVisitor : null
+ */
+ public FieldVisitor visitField(final int access, final String name, final String desc, final String signature, final Object value) {
+ if ((access & ACC_STATIC) == 0) {
+ FieldVisitor flag = cv.visitField(Opcodes.ACC_PRIVATE, FIELD_FLAG_PREFIX + name, "Z", null, null);
+ flag.visitEnd();
+
+ Type type = Type.getType(desc);
+
+ if (type.getSort() == Type.ARRAY) {
+ String gDesc = "()" + desc;
+ createArrayGetter(name, gDesc, type);
+
+ // Generates setter method
+ String sDesc = "(" + desc + ")V";
+ createArraySetter(name, sDesc, type);
+
+ } else {
+ // Generate the getter method
+ String gDesc = "()" + desc;
+ createSimpleGetter(name, gDesc, type);
+
+ // Generates setter method
+ String sDesc = "(" + desc + ")V";
+ createSimpleSetter(name, sDesc, type);
+ }
+
+ }
+ return cv.visitField(access, name, desc, signature, value);
+ }
+
+ /**
+ * Create a constructor to call the manipulated constructor.
+ * This constructor does not have any argument. It will call the manipulated
+ * constructor with a null instance manager.
+ * @param access : access flag
+ * @param signature : method signature
+ * @param exceptions : declared exception
+ */
+ private void generateEmptyConstructor(int access, String signature, String[] exceptions) {
+ MethodVisitor mv = cv.visitMethod(access, "<init>", "()V", signature, exceptions);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ACONST_NULL);
+ mv.visitMethodInsn(INVOKESPECIAL, m_owner, "<init>", "(Lorg/apache/felix/ipojo/InstanceManager;)V");
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+
+ /**
+ * Create a constructor to call the manipulated constructor.
+ * This constructor has one argument (the bundle context). It will call the manipulated
+ * constructor with a null instance manager.
+ * @param access : access flag
+ * @param signature : method signature
+ * @param exceptions : declared exception
+ */
+ private void generateBCConstructor(int access, String signature, String[] exceptions) {
+ MethodVisitor mv = cv.visitMethod(access, "<init>", "(Lorg/osgi/framework/BundleContext;)V", signature, exceptions);
+ mv.visitCode();
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ACONST_NULL);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(INVOKESPECIAL, m_owner, "<init>", "(Lorg/apache/felix/ipojo/InstanceManager;Lorg/osgi/framework/BundleContext;)V");
+ mv.visitInsn(RETURN);
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+
+ /**
+ * Generate the method header of a POJO method.
+ * This method header encapsulate the POJO method call to
+ * signal entry exit and error to the container.
+ * @param access : access flag.
+ * @param name : method name.
+ * @param desc : method descriptor.
+ * @param signature : method signature.
+ * @param exceptions : declared exceptions.
+ */
+ private void generateMethodHeader(int access, String name, String desc, String signature, String[] exceptions) {
+ GeneratorAdapter mv = new GeneratorAdapter(cv.visitMethod(access, name, desc, signature, exceptions), access, name, desc);
+
+ mv.visitCode();
+ Type returnType = Type.getReturnType(desc);
+
+ // Compute result and exception stack location
+ int result = -1;
+ int exception = -1;
+
+ //int arguments = mv.newLocal(Type.getType((new Object[0]).getClass()));
+
+ if (returnType.getSort() != Type.VOID) {
+ // The method returns something
+ result = mv.newLocal(returnType);
+ exception = mv.newLocal(Type.getType(Throwable.class));
+ } else {
+ exception = mv.newLocal(Type.getType(Throwable.class));
+ }
+
+ Label l0 = new Label();
+ Label l1 = new Label();
+ Label l2 = new Label();
+
+ mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Throwable");
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, generateMethodFlag(name, desc), "Z");
+ mv.visitJumpInsn(IFNE, l0);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.loadArgs();
+ mv.visitMethodInsn(INVOKESPECIAL, m_owner, PREFIX + name, desc);
+ mv.visitInsn(returnType.getOpcode(IRETURN));
+
+ // end of the non intercepted method invocation.
+
+ mv.visitLabel(l0);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(generateMethodId(name, desc));
+ mv.loadArgArray();
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", ENTRY, "(Ljava/lang/Object;Ljava/lang/String;[Ljava/lang/Object;)V");
+
+ mv.visitVarInsn(ALOAD, 0);
+
+ // Do not allow argument modification : just reload arguments.
+ mv.loadArgs();
+ mv.visitMethodInsn(INVOKESPECIAL, m_owner, PREFIX + name, desc);
+
+ if (returnType.getSort() != Type.VOID) {
+ mv.visitVarInsn(returnType.getOpcode(ISTORE), result);
+ }
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(generateMethodId(name, desc));
+ if (returnType.getSort() != Type.VOID) {
+ mv.visitVarInsn(returnType.getOpcode(ILOAD), result);
+ mv.box(returnType);
+ } else {
+ mv.visitInsn(ACONST_NULL);
+ }
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", EXIT, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V");
+
+ mv.visitLabel(l1);
+ Label l7 = new Label();
+ mv.visitJumpInsn(GOTO, l7);
+ mv.visitLabel(l2);
+
+ mv.visitVarInsn(ASTORE, exception);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(generateMethodId(name, desc));
+ mv.visitVarInsn(ALOAD, exception);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", ERROR, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Throwable;)V");
+ mv.visitVarInsn(ALOAD, exception);
+ mv.visitInsn(ATHROW);
+
+ mv.visitLabel(l7);
+ if (returnType.getSort() != Type.VOID) {
+ mv.visitVarInsn(returnType.getOpcode(ILOAD), result);
+ }
+ mv.visitInsn(returnType.getOpcode(IRETURN));
+
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+
+ /**
+ * Generate a method flag name.
+ * @param name : method name.
+ * @param desc : method descriptor.
+ * @return the method flag name.
+ */
+ private String generateMethodFlag(String name, String desc) {
+ return METHOD_FLAG_PREFIX + generateMethodId(name, desc);
+ }
+
+ /**
+ * Generate the method id based on the given method name and method descriptor.
+ * The method Id is unique for this method and serves to create the flag field (so
+ * must follow field name Java restrictions).
+ * @param name : method name
+ * @param desc : method descriptor
+ * @return method ID
+ */
+ private String generateMethodId(String name, String desc) {
+ String id = name;
+ Type[] args = Type.getArgumentTypes(desc);
+ for (int i = 0; i < args.length; i++) {
+ String arg = args[i].getClassName();
+ if (arg.endsWith("[]")) {
+ arg = arg.substring(0, arg.length() - 2);
+ id += "$" + arg.replace('.', '_') + "__";
+ } else {
+ id += "$" + arg.replace('.', '_');
+ }
+ }
+ if (!m_methods.contains(id)) {
+ m_methods.add(id);
+ }
+ return id;
+ }
+
+ /**
+ * Add the instance manager field (__im).
+ */
+ private void addIMField() {
+ FieldVisitor fv = super.visitField(ACC_PRIVATE, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;", null, null);
+ fv.visitEnd();
+ }
+
+ /**
+ * Add the POJO interface to the visited class.
+ * @param version : class version
+ * @param access : class access
+ * @param name : class name
+ * @param signature : class signature
+ * @param superName : super class
+ * @param interfaces : implemented interfaces.
+ */
+ private void addPOJOInterface(int version, int access, String name, String signature, String superName, String[] interfaces) {
+
+ // Add the POJO interface to the interface list
+ // Check that the POJO interface is not already in the list
+ boolean found = false;
+ for (int i = 0; i < interfaces.length; i++) {
+ if (interfaces[i].equals(POJO)) {
+ found = true;
+ }
+ }
+ String[] itfs;
+ if (!found) {
+ itfs = new String[interfaces.length + 1];
+ for (int i = 0; i < interfaces.length; i++) {
+ itfs[i] = interfaces[i];
+ }
+ itfs[interfaces.length] = POJO;
+ } else {
+ itfs = interfaces;
+ }
+
+ String str = "";
+ for (int i = 0; i < itfs.length; i++) {
+ str += itfs[i] + " ";
+ }
+
+ cv.visit(version, access, name, signature, superName, itfs);
+ }
+
+ /**
+ * Visit end.
+ * Create helper methods.
+ * @see org.objectweb.asm.ClassAdapter#visitEnd()
+ */
+ public void visitEnd() {
+ // Create the component manager setter method
+ createSetInstanceManagerMethod();
+
+ // Add the getComponentInstance
+ createGetComponentInstanceMethod();
+
+ m_methods.clear();
+
+ cv.visitEnd();
+ }
+
+ /**
+ * Create the setter method for the __cm field.
+ */
+ private void createSetInstanceManagerMethod() {
+ MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "_setInstanceManager", "(Lorg/apache/felix/ipojo/InstanceManager;)V", null, null);
+ mv.visitCode();
+
+ // If the given instance manager is null, just returns.
+ mv.visitVarInsn(ALOAD, 1);
+ Label l1 = new Label();
+ mv.visitJumpInsn(IFNONNULL, l1);
+ mv.visitInsn(RETURN);
+ mv.visitLabel(l1);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitFieldInsn(PUTFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getRegistredFields", "()Ljava/util/Set;");
+ mv.visitVarInsn(ASTORE, 2);
+
+ mv.visitVarInsn(ALOAD, 2);
+ Label endif = new Label();
+ mv.visitJumpInsn(IFNULL, endif);
+ Iterator it = m_fields.iterator();
+ while (it.hasNext()) {
+ String field = (String) it.next();
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitLdcInsn(field);
+ mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "contains", "(Ljava/lang/Object;)Z");
+ Label l3 = new Label();
+ mv.visitJumpInsn(IFEQ, l3);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ICONST_1);
+ mv.visitFieldInsn(PUTFIELD, m_owner, FIELD_FLAG_PREFIX + field, "Z");
+ mv.visitLabel(l3);
+ }
+ mv.visitLabel(endif);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getRegistredMethods", "()Ljava/util/Set;");
+ mv.visitVarInsn(ASTORE, 2);
+
+ mv.visitVarInsn(ALOAD, 2);
+ Label endif2 = new Label();
+ mv.visitJumpInsn(IFNULL, endif2);
+
+ for (int i = 0; i < m_methods.size(); i++) {
+ String methodId = (String) m_methods.get(i);
+ if (!methodId.equals("<init>")) {
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitLdcInsn(methodId);
+ mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "contains", "(Ljava/lang/Object;)Z");
+ Label l3 = new Label();
+ mv.visitJumpInsn(IFEQ, l3);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitInsn(ICONST_1);
+ mv.visitFieldInsn(PUTFIELD, m_owner, METHOD_FLAG_PREFIX + methodId, "Z");
+ mv.visitLabel(l3);
+ }
+ }
+
+ mv.visitLabel(endif2);
+
+ mv.visitInsn(RETURN);
+
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+
+ /**
+ * Create the getComponentInstance method.
+ */
+ private void createGetComponentInstanceMethod() {
+ MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "getComponentInstance", "()Lorg/apache/felix/ipojo/ComponentInstance;", null, null);
+ mv.visitCode();
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitInsn(ARETURN);
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+
+ /**
+ * Create a getter method for an array.
+ * @param name : field name
+ * @param desc : method description
+ * @param type : contained type (inside the array)
+ */
+ private void createArraySetter(String name, String desc, Type type) {
+ MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "__set" + name, desc, null, null);
+ mv.visitCode();
+
+ String internalType = desc.substring(1);
+ internalType = internalType.substring(0, internalType.length() - 2);
+
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ Label l2 = new Label();
+ mv.visitJumpInsn(IFNE, l2);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitFieldInsn(PUTFIELD, m_owner, name, internalType);
+ mv.visitInsn(RETURN);
+ mv.visitLabel(l2);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", SET, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V");
+
+ mv.visitInsn(RETURN);
+
+ // End
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+
+ /**
+ * Create a setter method for an array.
+ * @param name : field name
+ * @param desc : method description
+ * @param type : contained type (inside the array)
+ */
+ private void createArrayGetter(String name, String desc, Type type) {
+ String methodName = "__get" + name;
+ MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, methodName, desc, null, null);
+ mv.visitCode();
+
+ String internalType = desc.substring(2);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ Label l1 = new Label();
+ mv.visitJumpInsn(IFNE, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, name, internalType);
+ mv.visitInsn(ARETURN);
+ mv.visitLabel(l1);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", GET, "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
+ mv.visitTypeInsn(CHECKCAST, internalType);
+ mv.visitInsn(ARETURN);
+
+ // End
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+
+ /**
+ * Create the getter for a field.
+ * @param name : field of the dependency
+ * @param desc : description of the getter method
+ * @param type : type to return
+ */
+ private void createSimpleGetter(String name, String desc, Type type) {
+ String methodName = "__get" + name;
+ MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, methodName, desc, null, null);
+ mv.visitCode();
+
+ switch (type.getSort()) {
+ case Type.BOOLEAN:
+ case Type.CHAR:
+ case Type.BYTE:
+ case Type.SHORT:
+ case Type.INT:
+
+ String internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
+ String boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
+ String unboxingMethod = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][2];
+
+ Label l0 = new Label();
+ mv.visitLabel(l0);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ Label l1 = new Label();
+ mv.visitJumpInsn(IFNE, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, name, internalName);
+ mv.visitInsn(IRETURN);
+
+ mv.visitLabel(l1);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", GET, "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
+ mv.visitVarInsn(ASTORE, 1);
+
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitTypeInsn(CHECKCAST, boxingType);
+ mv.visitVarInsn(ASTORE, 2);
+
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitMethodInsn(INVOKEVIRTUAL, boxingType, unboxingMethod, "()" + internalName);
+ mv.visitInsn(type.getOpcode(IRETURN));
+ break;
+
+ case Type.LONG:
+ internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
+ boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
+ unboxingMethod = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][2];
+
+ l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ l1 = new Label();
+ mv.visitJumpInsn(IFNE, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, name, internalName);
+ mv.visitInsn(LRETURN);
+ mv.visitLabel(l1);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", GET, "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
+ mv.visitVarInsn(ASTORE, 1);
+
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitTypeInsn(CHECKCAST, boxingType);
+ mv.visitVarInsn(ASTORE, 2);
+
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitMethodInsn(INVOKEVIRTUAL, boxingType, unboxingMethod, "()" + internalName);
+ mv.visitInsn(LRETURN);
+
+ break;
+
+ case Type.DOUBLE:
+ internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
+ boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
+ unboxingMethod = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][2];
+
+ l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ l1 = new Label();
+ mv.visitJumpInsn(IFNE, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, name, internalName);
+ mv.visitInsn(DRETURN);
+ mv.visitLabel(l1);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", GET, "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
+ mv.visitVarInsn(ASTORE, 1);
+
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitTypeInsn(CHECKCAST, boxingType);
+ mv.visitVarInsn(ASTORE, 2);
+
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitMethodInsn(INVOKEVIRTUAL, boxingType, unboxingMethod, "()" + internalName);
+ mv.visitInsn(DRETURN);
+
+ break;
+
+ case Type.FLOAT:
+ internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
+ boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
+ unboxingMethod = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][2];
+
+ l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ l1 = new Label();
+ mv.visitJumpInsn(IFNE, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, name, internalName);
+ mv.visitInsn(FRETURN);
+ mv.visitLabel(l1);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", GET, "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
+ mv.visitVarInsn(ASTORE, 1);
+
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitTypeInsn(CHECKCAST, boxingType);
+ mv.visitVarInsn(ASTORE, 2);
+
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitMethodInsn(INVOKEVIRTUAL, boxingType, unboxingMethod, "()" + internalName);
+ mv.visitInsn(FRETURN);
+
+ break;
+
+ case Type.OBJECT:
+ l0 = new Label();
+ mv.visitLabel(l0);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ l1 = new Label();
+ mv.visitJumpInsn(IFNE, l1);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, name, "L" + type.getInternalName() + ";");
+ mv.visitInsn(ARETURN);
+ mv.visitLabel(l1);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", GET, "(Ljava/lang/Object;Ljava/lang/String;)Ljava/lang/Object;");
+ mv.visitTypeInsn(CHECKCAST, type.getInternalName());
+ mv.visitInsn(ARETURN);
+
+ break;
+
+ default:
+ ManipulationProperty.getLogger().log(ManipulationProperty.SEVERE, "Manipulation problem in " + m_owner + " : a type is not implemented : " + type);
+ break;
+ }
+
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+
+ /**
+ * Create the setter method for one property. The name of the method is _set+name of the field
+ * @param name : name of the field representing a property
+ * @param desc : description of the setter method
+ * @param type : type of the property
+ */
+ private void createSimpleSetter(String name, String desc, Type type) {
+ MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "__set" + name, desc, null, null);
+ mv.visitCode();
+
+ switch (type.getSort()) {
+ case Type.BOOLEAN:
+ case Type.CHAR:
+ case Type.BYTE:
+ case Type.SHORT:
+ case Type.INT:
+ case Type.FLOAT:
+ String internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
+ String boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
+
+ Label l1 = new Label();
+ mv.visitLabel(l1);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ Label l22 = new Label();
+ mv.visitJumpInsn(IFNE, l22);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(type.getOpcode(ILOAD), 1);
+ mv.visitFieldInsn(PUTFIELD, m_owner, name, internalName);
+ mv.visitInsn(RETURN);
+ mv.visitLabel(l22);
+
+ mv.visitTypeInsn(NEW, boxingType);
+ mv.visitInsn(DUP);
+ mv.visitVarInsn(type.getOpcode(ILOAD), 1);
+ mv.visitMethodInsn(INVOKESPECIAL, boxingType, "<init>", "(" + internalName + ")V");
+ mv.visitVarInsn(ASTORE, 2);
+
+ Label l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitVarInsn(ALOAD, 2);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", SET, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V");
+
+ Label l3 = new Label();
+ mv.visitLabel(l3);
+ mv.visitInsn(RETURN);
+ break;
+
+ case Type.LONG:
+ case Type.DOUBLE:
+ internalName = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][0];
+ boxingType = ManipulationProperty.PRIMITIVE_BOXING_INFORMATION[type.getSort()][1];
+
+ l1 = new Label();
+ mv.visitLabel(l1);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ Label l23 = new Label();
+ mv.visitJumpInsn(IFNE, l23);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(type.getOpcode(ILOAD), 1);
+ mv.visitFieldInsn(PUTFIELD, m_owner, name, internalName);
+ mv.visitInsn(RETURN);
+ mv.visitLabel(l23);
+
+ mv.visitTypeInsn(NEW, boxingType);
+ mv.visitInsn(DUP);
+ mv.visitVarInsn(type.getOpcode(ILOAD), 1);
+ mv.visitMethodInsn(INVOKESPECIAL, boxingType, "<init>", "(" + internalName + ")V");
+ mv.visitVarInsn(ASTORE, 3); // Double space
+
+ l2 = new Label();
+ mv.visitLabel(l2);
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitVarInsn(ALOAD, 3);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", SET, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V");
+
+ l3 = new Label();
+ mv.visitLabel(l3);
+ mv.visitInsn(RETURN);
+ break;
+
+ case Type.OBJECT:
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, FIELD_FLAG_PREFIX + name, "Z");
+ Label l24 = new Label();
+ mv.visitJumpInsn(IFNE, l24);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitFieldInsn(PUTFIELD, m_owner, name, "L" + type.getInternalName() + ";");
+ mv.visitInsn(RETURN);
+ mv.visitLabel(l24);
+
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitFieldInsn(GETFIELD, m_owner, IM_FIELD, "Lorg/apache/felix/ipojo/InstanceManager;");
+ mv.visitVarInsn(ALOAD, 0);
+ mv.visitLdcInsn(name);
+ mv.visitVarInsn(ALOAD, 1);
+ mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", SET, "(Ljava/lang/Object;Ljava/lang/String;Ljava/lang/Object;)V");
+
+ mv.visitInsn(RETURN);
+ break;
+ default:
+ ManipulationProperty.getLogger().log(ManipulationProperty.SEVERE, "Manipulation Error : Cannot create the setter method for the field : " + name + " (" + type + ")");
+ break;
+ }
+
+ mv.visitMaxs(0, 0);
+ mv.visitEnd();
+ }
+
+}
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/PojoAdapter.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/PojoAdapter.java
deleted file mode 100644
index 41ca684..0000000
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/PojoAdapter.java
+++ /dev/null
@@ -1,403 +0,0 @@
-/*
- * 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.manipulation;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.objectweb.asm.AnnotationVisitor;
-import org.objectweb.asm.Attribute;
-import org.objectweb.asm.ClassAdapter;
-import org.objectweb.asm.ClassVisitor;
-import org.objectweb.asm.FieldVisitor;
-import org.objectweb.asm.Label;
-import org.objectweb.asm.MethodVisitor;
-import org.objectweb.asm.Opcodes;
-import org.objectweb.asm.Type;
-
-/**
- * Manipulate a POJO class.
- * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
- */
-public class PojoAdapter extends ClassAdapter implements Opcodes {
-
- /**
- * POJO interface.
- */
- private final String m_pojo = "org/apache/felix/ipojo/Pojo";
-
- /**
- * The owner. m_owner : String
- */
- private String m_owner;
-
- /**
- * Field list.
- */
- private Set m_fields;
-
-
- /**
- * Method list.
- */
- private List m_methods = new ArrayList();
-
- /**
- * Getter/Setter methods creator.
- */
- private FieldAdapter m_getterSetterCreator = new FieldAdapter(cv);
-
- /**
- * Constructor.
- * @param arg0 : class adapter on which delegate.
- * @param fields : map of contained fields.
- * @param m_fields2
- */
- public PojoAdapter(ClassVisitor arg0, Map fields) {
- super(arg0);
- m_fields = fields.keySet();
- }
-
- /**
- * Start visiting a class.
- * Initialize the getter/setter generator, add the _cm field, add the pojo interface.
- * @param version : class version
- * @param access : class access
- * @param name : class name
- * @param signature : class signature
- * @param superName : class super class
- * @param interfaces : implemented interfaces
- * @see org.objectweb.asm.ClassAdapter#visit(int, int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
- */
- public void visit(int version, int access, String name, String signature, String superName, String[] interfaces) {
- m_owner = name;
- m_getterSetterCreator.visit(version, access, name, signature, superName, interfaces);
- addCMField();
- addPOJOInterface(version, access, name, signature, superName, interfaces);
- }
-
- /**
- * Visit an annotation.
- * @param desc : annotation descriptor.
- * @param visible : is the annotation visible at runtime.
- * @return the annotation visitor.
- * @see org.objectweb.asm.ClassAdapter#visitAnnotation(java.lang.String, boolean)
- */
- public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
- return super.visitAnnotation(desc, visible);
- }
-
- /**
- * Visit an attribute.
- * @param attr : visited attribute
- * @see org.objectweb.asm.ClassAdapter#visitAttribute(org.objectweb.asm.Attribute)
- */
- public void visitAttribute(Attribute attr) {
- super.visitAttribute(attr);
- }
-
- /**
- * Visit end.
- * Create helper methods.
- * @see org.objectweb.asm.ClassAdapter#visitEnd()
- */
- public void visitEnd() {
- // Create the _cmSetter(ComponentManager cm) method
- createComponentManagerSetter();
-
- // Add the getComponentInstance
- createGetComponentInstanceMethod();
-
- m_methods.clear();
-
- cv.visitEnd();
- }
-
- /**
- * Visit a field.
- * Call the adapter generating getter and setter methods.
- * @param access : field access.
- * @param name : field name
- * @param desc : field descriptor
- * @param signature : field signature
- * @param value : field value (static field only)
- * @return the field visitor.
- * @see org.objectweb.asm.ClassAdapter#visitField(int, java.lang.String, java.lang.String, java.lang.String, java.lang.Object)
- */
- public FieldVisitor visitField(int access, String name, String desc, String signature, Object value) {
- // Add the field to the list.
- if (((access & ACC_STATIC) == 0) && (!name.startsWith("class$"))) {
- addFlagField(name);
- m_getterSetterCreator.visitField(access, name, desc, signature, value);
- }
-
- return super.visitField(access, name, desc, signature, value);
- }
-
- /**
- * Visit an inner class.
- * @param name : class name
- * @param outerName : outer name
- * @param innerName : inner name
- * @param access : class access
- * @see org.objectweb.asm.ClassAdapter#visitInnerClass(java.lang.String, java.lang.String, java.lang.String, int)
- */
- public void visitInnerClass(String name, String outerName, String innerName, int access) {
- super.visitInnerClass(name, outerName, innerName, access);
- }
-
- /**
- * Visit a method.
- * Manipulate constructor and methods. Does nothing with clinit and class$
- * @param access : method access
- * @param name : method name
- * @param desc : method descriptor
- * @param signature : method signature
- * @param exceptions : method exceptions
- * @return the Method Visitor.
- * @see org.objectweb.asm.ClassAdapter#visitMethod(int, java.lang.String, java.lang.String, java.lang.String, java.lang.String[])
- */
- public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
- // Avoid manipulating special method
- if (name.equals("<clinit>") || name.equals("class$")) { return super.visitMethod(access, name, desc, signature, exceptions); }
- // The constructor is manipulated separately
- if (name.equals("<init>")) {
-
- // 1) change the constructor descriptor (add a component manager arg as first argument)
- String newDesc = desc.substring(1);
- newDesc = "(Lorg/apache/felix/ipojo/InstanceManager;" + newDesc;
-
- // Insert the new constructor
- MethodVisitor mv = super.visitMethod(ACC_PUBLIC, "<init>", newDesc, null, null);
-
- Type[] args = Type.getArgumentTypes(newDesc);
- String id = "$init";
- for (int i = 0; i < args.length; i++) {
- String cn = args[i].getClassName();
- if (cn.endsWith("[]")) {
- cn = cn.replace('[', '$');
- cn = cn.substring(0, cn.length() - 1);
- }
- cn = cn.replace('.', '_');
- id += cn;
- }
-
- String flag = "_M" + id;
- m_methods.add(id);
-
- FieldVisitor flagField = cv.visitField(Opcodes.ACC_PRIVATE, flag, "Z", null, null);
- if (flagField != null) {
- flagField.visitEnd();
- }
-
- if (mv == null) {
- return null;
- } else {
- return new ConstructorCodeAdapter(mv, m_owner, m_fields, access, name, newDesc);
- }
- } else { // "Normal methods"
- // avoid manipulating static methods.
- if ((access & ACC_STATIC) == ACC_STATIC) { return super.visitMethod(access, name, desc, signature, exceptions); }
-
- Type[] args = Type.getArgumentTypes(desc);
- String id = name;
- for (int i = 0; i < args.length; i++) {
- String cn = args[i].getClassName();
- if (cn.endsWith("[]")) {
- cn = cn.replace('[', '$');
- cn = cn.substring(0, cn.length() - 1);
- }
- cn = cn.replace('.', '_');
- id += cn;
- }
-
- String flag = "_M" + id;
- m_methods.add(id);
-
- FieldVisitor flagField = cv.visitField(Opcodes.ACC_PRIVATE, flag, "Z", null, null);
- if (flagField != null) {
- flagField.visitEnd();
- }
-
- MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
- return new MethodCodeAdapter(mv, m_owner, access, name, desc, m_fields);
- }
- }
-
- /**
- * Visit an outer class.
- * @param owner : class owner
- * @param name : class name
- * @param desc : class descriptor.
- * @see org.objectweb.asm.ClassAdapter#visitOuterClass(java.lang.String, java.lang.String, java.lang.String)
- */
- public void visitOuterClass(String owner, String name, String desc) {
- super.visitOuterClass(owner, name, desc);
- }
-
- /**
- * Visit source.
- * @param source : source
- * @param debug : debug
- * @see org.objectweb.asm.ClassAdapter#visitSource(java.lang.String, java.lang.String)
- */
- public void visitSource(String source, String debug) {
- super.visitSource(source, debug);
- }
-
- /**
- * Add the instance manager field (_cm).
- */
- private void addCMField() {
- // Insert _cm field
- FieldVisitor fv = super.visitField(ACC_PRIVATE, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;", null, null);
- fv.visitEnd();
- }
-
- /**
- * Add the POJO interface to the visited class.
- * @param version : class version
- * @param access : class access
- * @param name : class name
- * @param signature : class signature
- * @param superName : super class
- * @param interfaces : implemented interfaces.
- */
- private void addPOJOInterface(int version, int access, String name, String signature, String superName, String[] interfaces) {
-
- // Add the POJO interface to the interface list
- // Check that the POJO interface is not already in the list
- boolean found = false;
- for (int i = 0; i < interfaces.length; i++) {
- if (interfaces[i].equals(m_pojo)) {
- found = true;
- }
- }
- String[] itfs;
- if (!found) {
- itfs = new String[interfaces.length + 1];
- for (int i = 0; i < interfaces.length; i++) {
- itfs[i] = interfaces[i];
- }
- itfs[interfaces.length] = m_pojo;
- } else {
- itfs = interfaces;
- }
-
- String str = "";
- for (int i = 0; i < itfs.length; i++) {
- str += itfs[i] + " ";
- }
-
- cv.visit(version, access, name, signature, superName, itfs);
- }
-
- /**
- * Create the setter method for the _cm field.
- */
- private void createComponentManagerSetter() {
- MethodVisitor mv = cv.visitMethod(ACC_PRIVATE, "_setComponentManager", "(Lorg/apache/felix/ipojo/InstanceManager;)V", null, null);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitVarInsn(ALOAD, 1);
- mv.visitFieldInsn(PUTFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getRegistredFields", "()Ljava/util/Set;");
- mv.visitVarInsn(ASTORE, 2);
-
- mv.visitVarInsn(ALOAD, 2);
- Label endif = new Label();
- mv.visitJumpInsn(IFNULL, endif);
- Iterator it = m_fields.iterator();
- while (it.hasNext()) {
- String field = (String) it.next();
- mv.visitVarInsn(ALOAD, 2);
- mv.visitLdcInsn(field);
- mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "contains", "(Ljava/lang/Object;)Z");
- Label l3 = new Label();
- mv.visitJumpInsn(IFEQ, l3);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitInsn(ICONST_1);
- mv.visitFieldInsn(PUTFIELD, m_owner, "_F" + field, "Z");
- mv.visitLabel(l3);
- }
- mv.visitLabel(endif);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitMethodInsn(INVOKEVIRTUAL, "org/apache/felix/ipojo/InstanceManager", "getRegistredMethods", "()Ljava/util/Set;");
- mv.visitVarInsn(ASTORE, 2);
-
- mv.visitVarInsn(ALOAD, 2);
- Label endif2 = new Label();
- mv.visitJumpInsn(IFNULL, endif2);
-
- for (int i = 0; i < m_methods.size(); i++) {
- String methodId = (String) m_methods.get(i);
- mv.visitVarInsn(ALOAD, 2);
- mv.visitLdcInsn(methodId);
- mv.visitMethodInsn(INVOKEINTERFACE, "java/util/Set", "contains", "(Ljava/lang/Object;)Z");
- Label l3 = new Label();
- mv.visitJumpInsn(IFEQ, l3);
- mv.visitVarInsn(ALOAD, 0);
- mv.visitInsn(ICONST_1);
- mv.visitFieldInsn(PUTFIELD, m_owner, "_M" + methodId, "Z");
- mv.visitLabel(l3);
- }
-
- mv.visitLabel(endif2);
-
- mv.visitInsn(RETURN);
-
- mv.visitMaxs(0, 0);
- mv.visitEnd();
- }
-
- /**
- * Create the getComponentInstance method.
- */
- private void createGetComponentInstanceMethod() {
- MethodVisitor mv = cv.visitMethod(ACC_PUBLIC, "getComponentInstance", "()Lorg/apache/felix/ipojo/ComponentInstance;", null, null);
-
- mv.visitVarInsn(ALOAD, 0);
- mv.visitFieldInsn(GETFIELD, m_owner, "_cm", "Lorg/apache/felix/ipojo/InstanceManager;");
- mv.visitInsn(ARETURN);
-
- mv.visitMaxs(0, 0);
- mv.visitEnd();
- }
-
- /**
- * Add the flag field.
- * @param name : name of the field
- */
- private void addFlagField(String name) {
- // Add the flag field
- FieldVisitor flag = cv.visitField(Opcodes.ACC_PRIVATE, "_F" + name, "Z", null, null);
- if (flag != null) {
- flag.visitEnd();
- }
- }
-
-}
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/FieldCollector.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/FieldCollector.java
index 7b68f69..a439e38 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/FieldCollector.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/FieldCollector.java
@@ -279,7 +279,7 @@
Element[] props = m_parent.getElements("Property");
Element prop = null;
- for (int i = 0; prop == null && i < props.length; i++) {
+ for (int i = 0; prop == null && props != null && i < props.length; i++) {
String name = props[i].getAttribute("name");
if (name != null && name.equals(m_name)) {
prop = props[i];
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java
index 9859888..0c5d53b 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulation/annotations/MethodCollector.java
@@ -334,7 +334,7 @@
}
Element[] props = m_parent.getElements("Property");
Element prop = null;
- for (int i = 0; prop == null && i < props.length; i++) {
+ for (int i = 0; props != null && prop == null && i < props.length; i++) {
String name = props[i].getAttribute("name");
if (name != null && name.equals(m_name)) {
prop = props[i];
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
index b78666f..6537861 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/manipulator/Pojoization.java
@@ -133,6 +133,9 @@
path = "/" + path;
}
m_metadata = parseXMLMetadata(path);
+ if (m_metadata == null) {
+ return;
+ }
}
JarFile inputJar;
@@ -422,7 +425,7 @@
private void setImports(Attributes att) {
Map imports = parseHeader(att.getValue("Import-Package"));
Map ver = new TreeMap();
- ver.put("version", "0.7.5");
+ ver.put("version", "0.7.6");
if (!imports.containsKey("org.apache.felix.ipojo")) {
imports.put("org.apache.felix.ipojo", ver);
}
diff --git a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/xml/parser/XMLMetadataParser.java b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/xml/parser/XMLMetadataParser.java
index bea964a..e10e762 100644
--- a/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/xml/parser/XMLMetadataParser.java
+++ b/ipojo/manipulator/src/main/java/org/apache/felix/ipojo/xml/parser/XMLMetadataParser.java
@@ -38,62 +38,13 @@
private Element[] m_elements = new Element[0];
/**
- * Get component type metadata. (both component and composite)
- *
- * @return a components metadata
- * @throws ParseException : occurs in the xml parsing
- */
- public Element[] getComponentsMetadata() throws ParseException {
- Element[] comp = m_elements[0].getElements("Component");
- Element[] compo = m_elements[0].getElements("Composite");
- Element[] handl = m_elements[0].getElements("Handler");
- Element[] metadata = new Element[comp.length + compo.length + handl.length];
- int l = 0;
- for (int i = 0; i < comp.length; i++) {
- metadata[l] = comp[i];
- l++;
- }
- for (int i = 0; i < compo.length; i++) {
- metadata[l] = compo[i];
- l++;
- }
- for (int i = 0; i < handl.length; i++) {
- metadata[l] = handl[i];
- l++;
- }
- return metadata;
- }
-
- /**
* Get parsed metadata.
* The document must be parsed before calling this method.
* @return : all the metadata.
* @throws ParseException : occurs if an error occurs during the parsing.
*/
public Element[] getMetadata() throws ParseException {
- Element[] comp = m_elements[0].getElements("Component");
- Element[] compo = m_elements[0].getElements("Composite");
- Element[] conf = m_elements[0].getElements("Instance");
- Element[] handl = m_elements[0].getElements("Handler");
- Element[] metadata = new Element[comp.length + conf.length + compo.length + handl.length];
- int l = 0;
- for (int i = 0; i < comp.length; i++) {
- metadata[l] = comp[i];
- l++;
- }
- for (int i = 0; i < compo.length; i++) {
- metadata[l] = compo[i];
- l++;
- }
- for (int i = 0; i < conf.length; i++) {
- metadata[l] = conf[i];
- l++;
- }
- for (int i = 0; i < handl.length; i++) {
- metadata[l] = handl[i];
- l++;
- }
- return metadata;
+ return m_elements[0].getElements();
}
diff --git a/ipojo/metadata/pom.xml b/ipojo/metadata/pom.xml
index 16d2048..38bc6e7 100644
--- a/ipojo/metadata/pom.xml
+++ b/ipojo/metadata/pom.xml
@@ -1,49 +1,52 @@
<!--
- 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.
+ 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.
-->
<project>
- <parent>
- <groupId>org.apache.felix</groupId>
- <artifactId>felix</artifactId>
- <version>1.0.2</version>
- <relativePath>../../pom/pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>org.apache.felix.ipojo.metadata</artifactId>
- <packaging>bundle</packaging>
- <version>0.7.5-SNAPSHOT</version>
- <name>Apache Felix iPOJO Metadata</name>
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.felix</groupId>
- <artifactId>maven-bundle-plugin</artifactId>
- <version>1.4.0</version>
- <extensions>true</extensions>
- <configuration>
- <instructions>
- <Bundle-Name>iPOJO Metadata</Bundle-Name>
- <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
- <Bundle-Description> iPOJO Metadata </Bundle-Description>
- <Export-Package>org.apache.felix.ipojo.metadata</Export-Package>
- </instructions>
- </configuration>
- </plugin>
- </plugins>
- </build>
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO Metadata</name>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Bundle-Name>iPOJO Metadata</Bundle-Name>
+ <Bundle-Vendor>Clement ESCOFFIER</Bundle-Vendor>
+ <Bundle-Description>
+ iPOJO Metadata
+ </Bundle-Description>
+ <Export-Package>
+ org.apache.felix.ipojo.metadata
+ </Export-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
</project>
diff --git a/ipojo/metadata/src/main/java/org/apache/felix/ipojo/metadata/Element.java b/ipojo/metadata/src/main/java/org/apache/felix/ipojo/metadata/Element.java
index 7b59150..f984aa8 100644
--- a/ipojo/metadata/src/main/java/org/apache/felix/ipojo/metadata/Element.java
+++ b/ipojo/metadata/src/main/java/org/apache/felix/ipojo/metadata/Element.java
@@ -83,7 +83,7 @@
list.add(v[i]);
}
}
- return (Element[]) list.toArray(new Element[0]);
+ return (Element[]) list.toArray(new Element[list.size()]);
}
/**
@@ -223,25 +223,21 @@
/**
* Get the elements array of the element type given in parameter. This method look for an empty namespace.
* @param name : the type of the element to find (element name)
- * @return the resulting element array (empty if the search failed)
+ * @return the resulting element array (null if the search failed)
*/
public Element[] getElements(String name) {
Element[] elems = (Element[]) m_elements.get(name.toLowerCase());
- if (elems == null) {
- return new Element[0];
- } else {
- return elems;
- }
+ return elems;
}
/**
* Get the elements array of the element type given in parameter.
* @param name : the type of the element to find (element name)
* @param ns : the namespace of the element
- * @return the resulting element array (empty if the search failed)
+ * @return the resulting element array (null if the search failed)
*/
public Element[] getElements(String name, String ns) {
- if (ns == null || ns.equals("")) {
+ if (ns == null || ns.length() == 0) {
return getElements(name);
}
name = ns + ":" + name;
@@ -254,8 +250,7 @@
* @return true if the element contains an element of the type "name"
*/
public boolean containsElement(String name) {
- name = name.toLowerCase();
- return m_elements.containsKey(name);
+ return m_elements.containsKey(name.toLowerCase());
}
/**
@@ -265,7 +260,7 @@
* @return true if the element contains an element of the type "name"
*/
public boolean containsElement(String name, String ns) {
- if (ns != null && !ns.equals("")) {
+ if (ns != null && ns.length() != 0) {
name = ns + ":" + name;
}
return containsElement(name);
diff --git a/ipojo/plugin/pom.xml b/ipojo/plugin/pom.xml
index 39e44c6..3f5c569 100644
--- a/ipojo/plugin/pom.xml
+++ b/ipojo/plugin/pom.xml
@@ -1,68 +1,68 @@
<!--
- 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.
+ 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.
-->
<project>
- <parent>
- <artifactId>felix</artifactId>
- <groupId>org.apache.felix</groupId>
- <version>1.0.2</version>
- <relativePath>../../pom/pom.xml</relativePath>
- </parent>
- <modelVersion>4.0.0</modelVersion>
- <artifactId>maven-ipojo-plugin</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- <name>Apache Felix iPOJO Maven Plugin</name>
- <packaging>maven-plugin</packaging>
- <dependencies>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-plugin-api</artifactId>
- <version>2.0</version>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-archiver</artifactId>
- <version>2.0</version>
- </dependency>
- <dependency>
- <groupId>org.codehaus.plexus</groupId>
- <artifactId>plexus-utils</artifactId>
- <version>1.1</version>
- </dependency>
- <dependency>
- <groupId>org.apache.maven</groupId>
- <artifactId>maven-artifact</artifactId>
- <version>2.0</version>
- </dependency>
- <dependency>
- <groupId>xerces</groupId>
- <artifactId>xercesImpl</artifactId>
- <version>2.4.0</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.ipojo.metadata</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- </dependency>
- <dependency>
- <groupId>${pom.groupId}</groupId>
- <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
- <version>0.7.5-SNAPSHOT</version>
- </dependency>
- </dependencies>
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <name>Apache Felix iPOJO Maven Plugin</name>
+ <packaging>maven-plugin</packaging>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-plugin-api</artifactId>
+ <version>2.0</version>
+ <scope>compile</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-archiver</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.codehaus.plexus</groupId>
+ <artifactId>plexus-utils</artifactId>
+ <version>1.1</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.maven</groupId>
+ <artifactId>maven-artifact</artifactId>
+ <version>2.0</version>
+ </dependency>
+ <dependency>
+ <groupId>xerces</groupId>
+ <artifactId>xercesImpl</artifactId>
+ <version>2.4.0</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${pom.groupId}</groupId>
+ <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ </dependencies>
</project>
diff --git a/ipojo/plugin/src/main/java/org/apache/felix/ipojo/plugin/ManipulatorMojo.java b/ipojo/plugin/src/main/java/org/apache/felix/ipojo/plugin/ManipulatorMojo.java
index 474eb75..a7391e1 100644
--- a/ipojo/plugin/src/main/java/org/apache/felix/ipojo/plugin/ManipulatorMojo.java
+++ b/ipojo/plugin/src/main/java/org/apache/felix/ipojo/plugin/ManipulatorMojo.java
@@ -1,4 +1,4 @@
-/*
+/*
* 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
@@ -25,7 +25,6 @@
import org.apache.felix.ipojo.manipulator.Pojoization;
import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
-import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.project.MavenProject;
import org.apache.maven.project.MavenProjectHelper;
@@ -113,11 +112,10 @@
/**
* Execute method : launch the pojoization.
- * @throws MojoExecutionException : an exception occurs.
- * @throws MojoFailureException : an failure occurs.
+ * @throws MojoExecutionException : an exception occurs during the manipulation.
* @see org.apache.maven.plugin.AbstractMojo#execute()
*/
- public void execute() throws MojoExecutionException, MojoFailureException {
+ public void execute() throws MojoExecutionException {
// ignore project types not supported, useful when the plugin is configured in the parent pom
if (!this.m_supportedProjectTypes.contains(this.getProject().getArtifact().getType())) {
this.getLog().debug("Ignoring project " + this.getProject().getArtifact() + " : type " + this.getProject().getArtifact().getType() + " is not supported by ipojo plugin, supported types are " + this.m_supportedProjectTypes);
@@ -126,7 +124,15 @@
getLog().info("Start bundle manipulation");
// Get metadata file
+
+ // Look for the metadata file in the output directory
File meta = new File(m_outputDirectory + File.separator + m_metadata);
+
+ // If not found look inside the pom directory
+ if (! meta.exists()) {
+ meta = new File(m_project.getBasedir() + File.separator + m_metadata);
+ }
+
getLog().info("Metadata File : " + meta.getAbsolutePath());
if (!meta.exists()) {
// Verify if annotations are ignored
diff --git a/ipojo/plugin/src/main/resources/archetype-resources/src/main/resources/metadata.xml b/ipojo/plugin/src/main/resources/archetype-resources/src/main/resources/metadata.xml
index a3d0839..cccd90d 100644
--- a/ipojo/plugin/src/main/resources/archetype-resources/src/main/resources/metadata.xml
+++ b/ipojo/plugin/src/main/resources/archetype-resources/src/main/resources/metadata.xml
@@ -1,7 +1,7 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<iPOJO>
- <component className="$YOUR_COMPONENT_CLASS">
-
- </component>
- <instance component="$YOUR_COMPONENT_CLASS"/>
+<?xml version="1.0" encoding="UTF-8"?>
+<iPOJO>
+ <component className="$YOUR_COMPONENT_CLASS">
+
+ </component>
+ <instance component="$YOUR_COMPONENT_CLASS"/>
</iPOJO>
\ No newline at end of file
diff --git a/ipojo/pom.xml b/ipojo/pom.xml
index 901c80c..d1a1378 100644
--- a/ipojo/pom.xml
+++ b/ipojo/pom.xml
@@ -19,22 +19,63 @@
<project>
<parent>
<groupId>org.apache.felix</groupId>
- <artifactId>felix</artifactId>
+ <artifactId>felix</artifactId>
<version>1.0.2</version>
- <relativePath>../pom/pom.xml</relativePath>
+ <relativePath>../pom/pom.xml</relativePath>
</parent>
<modelVersion>4.0.0</modelVersion>
- <artifactId>ipojo</artifactId>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
<name>Apache Felix iPOJO</name>
- <version>0.7.5-SNAPSHOT</version>
+ <version>0.7.6-SNAPSHOT</version>
<packaging>pom</packaging>
- <modules>
- <module>metadata</module>
- <module>manipulator</module>
- <module>plugin</module>
- <module>core</module>
- <module>arch</module>
- <module>ant</module>
- </modules>
-</project>
\ No newline at end of file
+
+ <modules>
+ <module>metadata</module>
+ <module>manipulator</module>
+ <module>plugin</module>
+ <module>core</module>
+ <module>composite</module>
+ <module>arch</module>
+ <module>ant</module>
+ <module>event.admin.handler</module>
+ <module>white.board.pattern.handler</module>
+ <module>extender.pattern.handler</module>
+ </modules>
+
+ <profiles>
+ <profile>
+ <id>java5</id>
+ <activation>
+ <jdk>1.5</jdk>
+ </activation>
+ <modules>
+ <module>annotations</module>
+ <module>jmx.handler</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>java6</id>
+ <activation>
+ <jdk>1.6</jdk>
+ </activation>
+ <modules>
+ <module>annotations</module>
+ <module>jmx.handler</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>examples</id>
+ <modules>
+ <module>examples</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>tests</id>
+ <modules>
+ <module>tests</module>
+ </modules>
+ </profile>
+ </profiles>
+</project>
diff --git a/ipojo/tests/pom.xml b/ipojo/tests/pom.xml
new file mode 100644
index 0000000..f6c29e5
--- /dev/null
+++ b/ipojo/tests/pom.xml
@@ -0,0 +1,36 @@
+<project>
+ <parent>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>iPOJO</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <groupId>ipojo.tests</groupId>
+ <artifactId>ipojo.tests</artifactId>
+ <name>Apache Felix iPOJO Tests</name>
+ <packaging>pom</packaging>
+ <profiles>
+ <profile>
+ <id>java5</id>
+ <activation>
+ <jdk>1.5</jdk>
+ </activation>
+ <modules>
+ <module>tests.core</module>
+ <module>tests.composite</module>
+ </modules>
+ </profile>
+ <profile>
+ <id>java6</id>
+ <activation>
+ <jdk>1.6</jdk>
+ </activation>
+ <modules>
+ <module>tests.core</module>
+ <module>tests.composite</module>
+ </modules>
+ </profile>
+</profiles>
+</project>
\ No newline at end of file
diff --git a/ipojo/tests/tests.composite/pom.xml b/ipojo/tests/tests.composite/pom.xml
new file mode 100644
index 0000000..e016d37
--- /dev/null
+++ b/ipojo/tests/tests.composite/pom.xml
@@ -0,0 +1,112 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <groupId>ipojo.tests</groupId>
+ <artifactId>ipojo.tests</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>iPOJO Composite Test Suite</name>
+ <artifactId>tests.composite</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.composite</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ </dependency>
+ <dependency>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>ipojo.tests</groupId>
+ <artifactId>tests.core</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Export-Package>
+ org.apache.felix.ipojo.test.composite.service
+ </Export-Package>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ org.apache.felix.ipojo.test.composite.*
+ </Private-Package>
+ <Test-Suite>
+ org.apache.felix.ipojo.test.composite.CompositeTestSuite
+ </Test-Suite>
+ <Import-Package>
+ org.apache.felix.ipojo.test.scenarios.service,*
+ </Import-Package>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/CompositeTestSuite.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/CompositeTestSuite.java
new file mode 100644
index 0000000..efa9de3
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/CompositeTestSuite.java
@@ -0,0 +1,48 @@
+/*
+ * 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.test.composite;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.apache.felix.ipojo.test.composite.exporter.ExportTestSuite;
+import org.apache.felix.ipojo.test.composite.importer.ImportTestSuite;
+import org.apache.felix.ipojo.test.composite.infrastructure.InfrastructureTestSuite;
+import org.apache.felix.ipojo.test.composite.instance.SimpleInstance;
+import org.apache.felix.ipojo.test.composite.instantiator.InstantiatorTestSuite;
+import org.apache.felix.ipojo.test.composite.provides.ProvidesTestSuite;
+import org.apache.felix.ipojo.test.composite.test.CompositeTest;
+import org.osgi.framework.BundleContext;
+
+public class CompositeTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("iPOJO Composites Test Suite", bc);
+ ots.addTest(InfrastructureTestSuite.suite(bc));
+ ots.addTest(InstantiatorTestSuite.suite(bc));
+ ots.addTest(ImportTestSuite.suite(bc));
+ ots.addTest(ExportTestSuite.suite(bc));
+ ots.addTestSuite(CompositeTest.class);
+ ots.addTestSuite(SimpleInstance.class);
+ ots.addTest(ProvidesTestSuite.suite(bc));
+
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/Baz2CheckProvider.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/Baz2CheckProvider.java
new file mode 100644
index 0000000..662c8e2
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/Baz2CheckProvider.java
@@ -0,0 +1,81 @@
+/*
+ * 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.test.composite.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class Baz2CheckProvider implements CheckService {
+
+ BazService fs;
+
+ int simpleB = 0;
+ int objectB = 0;
+ int refB = 0;
+ int simpleU = 0;
+ int objectU = 0;
+ int refU = 0;
+
+ public boolean check() {
+ return fs.foo();
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("result", new Boolean(fs.foo()));
+ props.put("voidB", new Integer(simpleB));
+ props.put("objectB", new Integer(objectB));
+ props.put("refB", new Integer(refB));
+ props.put("voidU", new Integer(simpleU));
+ props.put("objectU", new Integer(objectU));
+ props.put("refU", new Integer(refU));
+ props.put("boolean", new Boolean(fs.getBoolean()));
+ props.put("int", new Integer(fs.getInt()));
+ props.put("long", new Long(fs.getLong()));
+ props.put("double", new Double(fs.getDouble()));
+ if(fs.getObject() != null) { props.put("object", fs.getObject()); }
+
+ return props;
+ }
+
+ private void voidBind() {
+ simpleB++;
+ }
+ private void voidUnbind() {
+ simpleU++;
+ }
+
+ protected void objectBind(Object o) {
+ if(o != null && o instanceof FooService) { objectB++; }
+ }
+ protected void objectUnbind(Object o) {
+ if(o != null && o instanceof FooService) { objectU++; }
+ }
+
+ public void refBind(ServiceReference sr) {
+ if(sr != null) { refB++; }
+ }
+ public void refUnbind(ServiceReference sr) {
+ if(sr != null) { refU++; }
+ }
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/BazProviderType1.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/BazProviderType1.java
new file mode 100644
index 0000000..6917d39
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/BazProviderType1.java
@@ -0,0 +1,51 @@
+/*
+ * 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.test.composite.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+
+public class BazProviderType1 implements BazService {
+
+ private int m_bar;
+ private String m_foo;
+
+ public boolean foo() {
+ return true;
+ }
+
+ public Properties fooProps() {
+ Properties p = new Properties();
+ p.put("bar", new Integer(m_bar));
+ p.put("foo", m_foo);
+ return p;
+ }
+
+ public boolean getBoolean() { return true; }
+
+ public double getDouble() { return 1.0; }
+
+ public int getInt() { return 1; }
+
+ public long getLong() { return 1; }
+
+ public Boolean getObject() { return new Boolean(true); }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/TataProvider.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/TataProvider.java
new file mode 100644
index 0000000..2607b55
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/TataProvider.java
@@ -0,0 +1,222 @@
+/*
+ * 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.test.composite.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.composite.service.Tata;
+
+
+public class TataProvider implements Tata {
+
+ int tata = 0;
+ int tataStr = 0;
+ int tataStrs = 0;
+ int tata_2 = 0;
+ int tata_3 = 0;
+ int tata1 = 0;
+ int tata1_1 = 0;
+ int tata5 = 0;
+ int tata5_1 = 0;
+ int tata5_2 = 0;
+ int tataBoolean = 0;
+ int tataBooleans = 0;
+ int tataByte = 0;
+ int tataBytes = 0;
+ private int add;
+ private int tataShorts;
+ private int tataShort;
+ private int tataLongs;
+ private int tataLong;
+ private int tataInts;
+ private int tataInt;
+ private int tataFloat;
+ private int tataFloats;
+ private int tataDoubles;
+ private int tataDouble;
+ private int tataChars;
+ private int tataChar;
+
+ public Properties getPropsTata() {
+ Properties props = new Properties();
+ props.put("tata", new Integer(tata));
+ props.put("tataStr", new Integer(tataStr));
+ props.put("tataStrs", new Integer(tataStrs));
+ props.put("tata_2", new Integer(tata_2));
+ props.put("tata_3", new Integer(tata_3));
+ props.put("tata1", new Integer(tata1));
+ props.put("tata1_1", new Integer(tata1_1));
+ props.put("tata5", new Integer(tata5));
+ props.put("tata5_1", new Integer(tata5_1));
+ props.put("tata5_2", new Integer(tata5_2));
+ props.put("add", new Integer(add));
+ props.put("tataBoolean", new Integer(tataBoolean));
+ props.put("tataBoolean", new Integer(tataBoolean));
+ props.put("tataByte", new Integer(tataByte));
+ props.put("tataBytes", new Integer(tataBytes));
+ props.put("tataShort", new Integer(tataShort));
+ props.put("tataShorts", new Integer(tataShorts));
+ props.put("tataLongs", new Integer(tataLongs));
+ props.put("tataLong", new Integer(tataLong));
+ props.put("tataInt", new Integer(tataInt));
+ props.put("tataInts", new Integer(tataInts));
+ props.put("tataFloat", new Integer(tataFloat));
+ props.put("tataFloats", new Integer(tataFloats));
+ props.put("tataDouble", new Integer(tataDouble));
+ props.put("tataDoubles", new Integer(tataDoubles));
+ props.put("tataChar", new Integer(tataChar));
+ props.put("tataChars", new Integer(tataChars));
+ return props;
+ }
+
+ public void tata() {
+ tata++;
+ }
+
+ public String tataStr() {
+ tataStr++;
+ return "Tata";
+ }
+
+ public String[] tataStrs() {
+ tataStrs++;
+ return new String[] {"T", "A", "T", "A"};
+ }
+
+ public void tata(int i, int j) {
+ tata_2++;
+ }
+
+ public void tata(String s) {
+ tata_3++;
+ }
+
+ public String tata1(String a) {
+ tata1++;
+ return a;
+ }
+
+ public String tata1(char[] a) {
+ tata1_1++;
+ String s = new String(a);
+ return s;
+ }
+
+ public String tata5(String a, int i) {
+ tata5++;
+ return a+i;
+ }
+
+ public String tata5(String[] a, int i) {
+ tata5_1++;
+ return ""+a.length + i;
+ }
+
+ public String tata5(String a, int[] i) {
+ tata5_2++;
+ return a + i.length;
+ }
+
+ public boolean tataBoolean(boolean b) {
+ tataBoolean++;
+ return b;
+ }
+
+ public boolean[] tataBooleans(boolean[] b) {
+ tataBooleans++;
+ return b;
+ }
+
+ public byte tataByte(byte b) {
+ tataByte++;
+ return b;
+ }
+
+ public byte[] tataBytes(byte[] b) {
+ tataBytes++;
+ return b;
+ }
+
+ public char tataChar(char c) {
+ tataChar++;
+ return c;
+ }
+
+ public char[] tataChars(char[] c) {
+ tataChars++;
+ return c;
+ }
+
+ public double tataDouble(double d) {
+ tataDouble++;
+ return d;
+ }
+
+ public double[] tataDoubles(double[] d) {
+ tataDoubles++;
+ return d;
+ }
+
+ public float tataFloat(float f) {
+ tataFloat++;
+ return f;
+ }
+
+ public float[] tataFloats(float[] f) {
+ tataFloats++;
+ return f;
+ }
+
+ public int tataInt(int i) {
+ tataInt++;
+ return i;
+ }
+
+ public int[] tataInts(int[] its) {
+ tataInts++;
+ return its;
+ }
+
+ public long tataLong(long l) {
+ tataLong++;
+ return l;
+ }
+
+ public long[] tataLongs(long[] l) {
+ tataLongs++;
+ return l;
+ }
+
+ public short tataShort(short s) {
+ tataShort++;
+ return s;
+ }
+
+ public short[] tataShorts(short[] s) {
+ tataShorts++;
+ return s;
+ }
+
+ public long add(int i, int j, int k) {
+ add++;
+ return i + j + k;
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/TotoProvider.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/TotoProvider.java
new file mode 100644
index 0000000..fb79bc4
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/TotoProvider.java
@@ -0,0 +1,73 @@
+/*
+ * 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.test.composite.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.composite.service.Toto;
+
+
+public class TotoProvider implements Toto {
+
+ private int i = 0;
+ public static int toto = 0;
+ public static int toto_2 = 0;
+ public static int toto_3 = 0;
+ public static int toto_4 = 0;
+ public static int toto1 = 0;
+
+ public int count() {
+ return i;
+ }
+
+ public void toto() {
+ toto++;
+ }
+
+ public void toto(int i, int j) {
+ toto_2++;
+ }
+
+ public String toto(String a) {
+ toto_3++;
+ return a;
+ }
+
+ public String toto(String[] a) {
+ toto_4++;
+ return "toto";
+ }
+
+ public void toto1(String j) {
+ i++;
+ toto1++;
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("i", new Integer(i));
+ props.put("toto", new Integer(toto));
+ props.put("toto_2", new Integer(toto_2));
+ props.put("toto_3", new Integer(toto_3));
+ props.put("toto_4", new Integer(toto_4));
+ props.put("toto1", new Integer(toto1));
+ return props;
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/TotoProviderGlue.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/TotoProviderGlue.java
new file mode 100644
index 0000000..3ea3a88
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/component/TotoProviderGlue.java
@@ -0,0 +1,81 @@
+/*
+ * 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.test.composite.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.composite.service.Toto;
+
+
+public class TotoProviderGlue implements Toto {
+
+ Toto m_toto;
+
+ private int i = 0;
+ public static int toto = 0;
+ public static int toto_2 = 0;
+ public static int toto_3 = 0;
+ public static int toto_4 = 0;
+ public static int toto1 = 0;
+
+ public int count() {
+ return i;
+ }
+
+ public void toto() {
+ toto++;
+ m_toto.toto();
+ }
+
+ public void toto(int i, int j) {
+ toto_2++;
+ m_toto.toto(i, j);
+ }
+
+ public String toto(String a) {
+ toto_3++;
+ return a;
+ }
+
+ public String toto(String[] a) {
+ toto_4++;
+ return "toto";
+ }
+
+ public void toto1(String j) {
+ i++;
+ toto1++;
+ m_toto.toto1(j);
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("i", new Integer(i));
+ props.put("gtoto", new Integer(toto));
+ props.put("gtoto_2", new Integer(toto_2));
+ props.put("gtoto_3", new Integer(toto_3));
+ props.put("gtoto_4", new Integer(toto_4));
+ props.put("gtoto1", new Integer(toto1));
+ props.put("glue", "glue");
+ Properties p2 = m_toto.getProps();
+ props.putAll(p2);
+ return props;
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/ExportTestSuite.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/ExportTestSuite.java
new file mode 100644
index 0000000..d9b84f1
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/ExportTestSuite.java
@@ -0,0 +1,40 @@
+/*
+ * 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.test.composite.exporter;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class ExportTestSuite extends TestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Composite Service Exporters Test Suite", bc);
+ ots.addTestSuite(SimpleExport.class);
+ ots.addTestSuite(OptionalExport.class);
+ ots.addTestSuite(MultipleExport.class);
+ ots.addTestSuite(OptionalMultipleExport.class);
+ ots.addTestSuite(FilteredExport.class);
+ ots.setBundleContext(bc);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/FilteredExport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/FilteredExport.java
new file mode 100644
index 0000000..938bb94
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/FilteredExport.java
@@ -0,0 +1,230 @@
+/*
+ * 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.test.composite.exporter;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class FilteredExport extends OSGiTestCase {
+
+ ComponentInstance export1;
+ Factory fooProvider;
+ ComponentInstance foo1 = null, foo2 = null;
+
+ public void setUp() {
+ fooProvider = Utils.getFactoryByName(context, "BazProviderType");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to create foos : " + e.getMessage());
+ }
+
+ foo1.stop();
+ foo2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "composite.export.5");
+ Properties props = new Properties();
+ props.put("name", "export");
+ try {
+ export1 = factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Fail to instantiate exporter " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ export1.dispose();
+ foo1 = null;
+ foo2 = null;
+ export1 = null;
+ }
+
+ public void test1() {
+ export1.start();
+
+ // Check that no foo service are available
+ assertEquals("Check no foo service", Utils.getServiceReferences(context, FooService.class.getName(), null).length, 0);
+
+ // Test invalidity
+ assertTrue("Check invalidity - 0", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.start();
+ assertTrue("Check validity - 2", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo1.stop();
+ assertTrue("Check invalidity - 3", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo2.stop();
+ assertTrue("Check invalidity - 4", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check invalidity - 5", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 0);
+ }
+
+ public void test2() {
+ export1.start();
+
+ // Test invalidity
+ assertTrue("Check invalidity - 0", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.start();
+ assertTrue("Check validity - 2", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo2.stop();
+ assertTrue("Check validity - 3", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 3", invoke());
+
+ foo1.stop();
+ assertTrue("Check invalidity - 4", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 5", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 5", invoke());
+ }
+
+ public void test3() {
+ foo1.start();
+ foo2.start();
+
+ export1.start();
+ assertTrue("Check validity - 1", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo1.stop();
+ assertTrue("Check invalidity - 2", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 0);
+
+ foo2.stop();
+ assertTrue("Check invalidity - 3", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 4", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 4", invoke());
+ }
+
+ public void test4() {
+ foo1.start();
+ foo2.start();
+
+ export1.start();
+ assertTrue("Check validity - 1", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.stop();
+ assertTrue("Check validity - 2", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo1.stop();
+ assertTrue("Check invalidity - 3", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check invalidity - 4", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+ }
+
+
+
+ private boolean isFooServiceProvided() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export1.getInstanceName());
+ return ref != null;
+ }
+
+ private int countFooServiceProvided() {
+ ServiceReference[] refs = Utils.getServiceReferences(context, BazService.class.getName(), "(instance.name="+export1.getInstanceName()+")");
+ return refs.length;
+ }
+
+ private boolean invoke() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export1.getInstanceName());
+ if(ref == null) { return false; }
+ BazService fs = (BazService) context.getService(ref);
+ return fs.foo();
+ }
+
+
+
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/MultipleExport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/MultipleExport.java
new file mode 100644
index 0000000..10a0a4e
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/MultipleExport.java
@@ -0,0 +1,247 @@
+/*
+ * 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.test.composite.exporter;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class MultipleExport extends OSGiTestCase {
+
+ ComponentInstance export3;
+ Factory fooProvider;
+ ComponentInstance foo1 = null, foo2 = null;
+
+ public void setUp() {
+ fooProvider = Utils.getFactoryByName(context, "BazProviderType");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to create foos : " + e.getMessage());
+ }
+
+ foo1.stop();
+ foo2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "composite.export.3");
+ Properties props = new Properties();
+ props.put("name", "export");
+ try {
+ export3 = factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Fail to instantiate exporter " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ export3.dispose();
+ foo1 = null;
+ foo2 = null;
+ export3 = null;
+ }
+
+ public void test1() {
+ export3.start();
+
+ // Check that no foo service are available
+ assertEquals("Check no foo service", Utils.getServiceReferences(context, FooService.class.getName(), null).length, 0);
+
+ // Test invalidity
+ assertTrue("Check invalidity - 0", export3.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke(1));
+
+ foo2.start();
+ assertTrue("Check validity - 2", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 2);
+ assertTrue("Check invocation - 2", invoke(2));
+
+ foo1.stop();
+ assertTrue("Check validity - 3", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3 ("+countFooServiceProvided()+")", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 3", invoke(1));
+
+ foo2.stop();
+ assertTrue("Check invalidity - 4", export3.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check validity - 5", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 5", invoke(1));
+ }
+
+ public void test2() {
+ export3.start();
+
+ // Test invalidity
+ assertTrue("Check invalidity - 0", export3.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.start();
+ assertTrue("Check validity - 2", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 2);
+ assertTrue("Check invocation - 2", invoke(2));
+
+ foo2.stop();
+ assertTrue("Check validity - 3", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 3", invoke(1));
+
+ foo1.stop();
+ assertTrue("Check invalidity - 4", export3.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 5", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 5", invoke(1));
+ }
+
+ public void test3() {
+ foo1.start();
+ foo2.start();
+
+ export3.start();
+ assertTrue("Check validity - 1", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 2);
+ assertTrue("Check invocation - 1", invoke(2));
+
+ foo1.stop();
+ assertTrue("Check validity - 2", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke(1));
+
+ foo2.stop();
+ assertTrue("Check invalidity - 3", export3.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 4", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 4", invoke(1));
+ }
+
+ public void test4() {
+ foo1.start();
+ foo2.start();
+
+ export3.start();
+ assertTrue("Check validity - 1", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 2);
+ assertTrue("Check invocation - 1", invoke(2));
+
+ foo2.stop();
+ assertTrue("Check validity - 2", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke(1));
+
+ foo1.stop();
+ assertTrue("Check invalidity - 3", export3.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check validity - 4", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 4", invoke(1));
+ }
+
+
+
+ private boolean isFooServiceProvided() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export3.getInstanceName());
+ return ref != null;
+ }
+
+ private int countFooServiceProvided() {
+ ServiceReference[] refs = Utils.getServiceReferences(context, BazService.class.getName(), "(instance.name="+export3.getInstanceName()+")");
+ return refs.length;
+ }
+
+ private boolean invoke() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export3.getInstanceName());
+ if(ref == null) { return false; }
+ BazService fs = (BazService) context.getService(ref);
+ context.ungetService(ref);
+ return fs.foo();
+ }
+
+ private boolean invoke(int nb) {
+ ServiceReference[] refs = Utils.getServiceReferences(context, BazService.class.getName(), "(instance.name="+export3.getInstanceName()+")");
+ if(refs == null) { return false; }
+ if (nb > refs.length) { return false; }
+ for(int i = 0; i < nb; i++) {
+ BazService fs = (BazService) context.getService(refs[i]);
+ context.ungetService(refs[i]);
+ if(!fs.foo()) { return false; }
+ }
+ return true;
+ }
+
+
+
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/OptionalExport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/OptionalExport.java
new file mode 100644
index 0000000..5c30d24
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/OptionalExport.java
@@ -0,0 +1,234 @@
+/*
+ * 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.test.composite.exporter;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalExport extends OSGiTestCase {
+
+ ComponentInstance export2;
+ Factory fooProvider;
+ ComponentInstance foo1 = null, foo2 = null;
+
+ public void setUp() {
+ fooProvider = Utils.getFactoryByName(context, "BazProviderType");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to create foos : " + e.getMessage());
+ }
+
+ foo1.stop();
+ foo2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "composite.export.2");
+ Properties props = new Properties();
+ props.put("name", "export");
+ try {
+ export2 = factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Fail to instantiate exporter " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ export2.dispose();
+ foo1 = null;
+ foo2 = null;
+ export2 = null;
+ }
+
+ public void test1() {
+ export2.start();
+
+ // Check that no foo service are available
+ assertEquals("Check no foo service", Utils.getServiceReferences(context, FooService.class.getName(), null).length, 0);
+
+ // Test validity
+ assertTrue("Check validity - 0", export2.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.start();
+ assertTrue("Check validity - 2", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo1.stop();
+ assertTrue("Check validity - 3", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3 ("+countFooServiceProvided()+")", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 3", invoke());
+
+ foo2.stop();
+ assertTrue("Check validity - 4", export2.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check validity - 5", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 5", invoke());
+ }
+
+ public void test2() {
+ export2.start();
+
+ // Test invalidity
+ assertTrue("Check validity - 0", export2.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.start();
+ assertTrue("Check validity - 2", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo2.stop();
+ assertTrue("Check validity - 3", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 3", invoke());
+
+ foo1.stop();
+ assertTrue("Check validity - 4", export2.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 5", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 5", invoke());
+ }
+
+ public void test3() {
+ foo1.start();
+ foo2.start();
+
+ export2.start();
+ assertTrue("Check validity - 1", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo1.stop();
+ assertTrue("Check validity - 2", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo2.stop();
+ assertTrue("Check validity - 3", export2.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 4", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 4", invoke());
+ }
+
+ public void test4() {
+ foo1.start();
+ foo2.start();
+
+ export2.start();
+ assertTrue("Check validity - 1", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.stop();
+ assertTrue("Check validity - 2", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo1.stop();
+ assertTrue("Check validity - 3", export2.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check validity - 4", export2.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 4", invoke());
+ }
+
+
+
+ private boolean isFooServiceProvided() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export2.getInstanceName());
+ return ref != null;
+ }
+
+ private int countFooServiceProvided() {
+ ServiceReference[] refs = Utils.getServiceReferences(context, BazService.class.getName(), "(instance.name="+export2.getInstanceName()+")");
+ return refs.length;
+ }
+
+ private boolean invoke() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export2.getInstanceName());
+ if(ref == null) { return false; }
+ BazService fs = (BazService) context.getService(ref);
+ return fs.foo();
+ }
+
+
+
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/OptionalMultipleExport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/OptionalMultipleExport.java
new file mode 100644
index 0000000..997be4e
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/OptionalMultipleExport.java
@@ -0,0 +1,247 @@
+/*
+ * 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.test.composite.exporter;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalMultipleExport extends OSGiTestCase {
+
+ ComponentInstance export3;
+ Factory fooProvider;
+ ComponentInstance foo1 = null, foo2 = null;
+
+ public void setUp() {
+ fooProvider = Utils.getFactoryByName(context, "BazProviderType");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to create foos : " + e.getMessage());
+ }
+
+ foo1.stop();
+ foo2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "composite.export.4");
+ Properties props = new Properties();
+ props.put("name", "export");
+ try {
+ export3 = factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Fail to instantiate exporter " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ export3.dispose();
+ foo1 = null;
+ foo2 = null;
+ export3 = null;
+ }
+
+ public void test1() {
+ export3.start();
+
+ // Check that no foo service are available
+ assertEquals("Check no foo service", Utils.getServiceReferences(context, FooService.class.getName(), null).length, 0);
+
+ // Test invalidity
+ assertTrue("Check validity - 0", export3.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke(1));
+
+ foo2.start();
+ assertTrue("Check validity - 2", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 2);
+ assertTrue("Check invocation - 2", invoke(2));
+
+ foo1.stop();
+ assertTrue("Check validity - 3", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3 ("+countFooServiceProvided()+")", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 3", invoke(1));
+
+ foo2.stop();
+ assertTrue("Check validity - 4", export3.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check validity - 5", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 5", invoke(1));
+ }
+
+ public void test2() {
+ export3.start();
+
+ // Test invalidity
+ assertTrue("Check validity - 0", export3.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.start();
+ assertTrue("Check validity - 2", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 2);
+ assertTrue("Check invocation - 2", invoke(2));
+
+ foo2.stop();
+ assertTrue("Check validity - 3", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 3", invoke(1));
+
+ foo1.stop();
+ assertTrue("Check validity - 4", export3.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 5", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 5", invoke(1));
+ }
+
+ public void test3() {
+ foo1.start();
+ foo2.start();
+
+ export3.start();
+ assertTrue("Check validity - 1", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 2);
+ assertTrue("Check invocation - 1", invoke(2));
+
+ foo1.stop();
+ assertTrue("Check validity - 2", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke(1));
+
+ foo2.stop();
+ assertTrue("Check validity - 3", export3.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 4", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 4", invoke(1));
+ }
+
+ public void test4() {
+ foo1.start();
+ foo2.start();
+
+ export3.start();
+ assertTrue("Check validity - 1", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 2);
+ assertTrue("Check invocation - 1", invoke(2));
+
+ foo2.stop();
+ assertTrue("Check validity - 2", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke(1));
+
+ foo1.stop();
+ assertTrue("Check validity - 3", export3.getState() == ComponentInstance.VALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check validity - 4", export3.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 4", invoke(1));
+ }
+
+
+
+ private boolean isFooServiceProvided() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export3.getInstanceName());
+ return ref != null;
+ }
+
+ private int countFooServiceProvided() {
+ ServiceReference[] refs = Utils.getServiceReferences(context, BazService.class.getName(), "(instance.name="+export3.getInstanceName()+")");
+ return refs.length;
+ }
+
+ private boolean invoke() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export3.getInstanceName());
+ if(ref == null) { return false; }
+ BazService fs = (BazService) context.getService(ref);
+ context.ungetService(ref);
+ return fs.foo();
+ }
+
+ private boolean invoke(int nb) {
+ ServiceReference[] refs = Utils.getServiceReferences(context, BazService.class.getName(), "(instance.name="+export3.getInstanceName()+")");
+ if(refs == null) { return false; }
+ if (nb > refs.length) { return false; }
+ for(int i = 0; i < nb; i++) {
+ BazService fs = (BazService) context.getService(refs[i]);
+ context.ungetService(refs[i]);
+ if(!fs.foo()) { return false; }
+ }
+ return true;
+ }
+
+
+
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/SimpleExport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/SimpleExport.java
new file mode 100644
index 0000000..5ee7cd7
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/exporter/SimpleExport.java
@@ -0,0 +1,234 @@
+/*
+ * 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.test.composite.exporter;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class SimpleExport extends OSGiTestCase {
+
+ ComponentInstance export1;
+ Factory fooProvider;
+ ComponentInstance foo1 = null, foo2 = null;
+
+ public void setUp() {
+ fooProvider = Utils.getFactoryByName(context, "BazProviderType");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to create foos : " + e.getMessage());
+ }
+
+ foo1.stop();
+ foo2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "composite.export.1");
+ Properties props = new Properties();
+ props.put("name", "export");
+ try {
+ export1 = factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Fail to instantiate exporter " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ export1.dispose();
+ foo1 = null;
+ foo2 = null;
+ export1 = null;
+ }
+
+ public void test1() {
+ export1.start();
+
+ // Check that no foo service are available
+ assertEquals("Check no foo service", Utils.getServiceReferences(context, FooService.class.getName(), null).length, 0);
+
+ // Test invalidity
+ assertTrue("Check invalidity - 0", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.start();
+ assertTrue("Check validity - 2", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo1.stop();
+ assertTrue("Check validity - 3", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3 ("+countFooServiceProvided()+")", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 3", invoke());
+
+ foo2.stop();
+ assertTrue("Check invalidity - 4", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check validity - 5", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 5", invoke());
+ }
+
+ public void test2() {
+ export1.start();
+
+ // Test invalidity
+ assertTrue("Check invalidity - 0", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 0", isFooServiceProvided());
+ assertEquals("Check number of provides - 0", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 1", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.start();
+ assertTrue("Check validity - 2", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo2.stop();
+ assertTrue("Check validity - 3", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 3", invoke());
+
+ foo1.stop();
+ assertTrue("Check invalidity - 4", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 5", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 5", isFooServiceProvided());
+ assertEquals("Check number of provides - 5", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 5", invoke());
+ }
+
+ public void test3() {
+ foo1.start();
+ foo2.start();
+
+ export1.start();
+ assertTrue("Check validity - 1", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo1.stop();
+ assertTrue("Check validity - 2", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo2.stop();
+ assertTrue("Check invalidity - 3", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo1.start();
+ assertTrue("Check validity - 4", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 4", invoke());
+ }
+
+ public void test4() {
+ foo1.start();
+ foo2.start();
+
+ export1.start();
+ assertTrue("Check validity - 1", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 1", isFooServiceProvided());
+ assertEquals("Check number of provides - 1", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 1", invoke());
+
+ foo2.stop();
+ assertTrue("Check validity - 2", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 2", isFooServiceProvided());
+ assertEquals("Check number of provides - 2", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 2", invoke());
+
+ foo1.stop();
+ assertTrue("Check invalidity - 3", export1.getState() == ComponentInstance.INVALID);
+ assertFalse("Check providing - 3", isFooServiceProvided());
+ assertEquals("Check number of provides - 3", countFooServiceProvided(), 0);
+
+ foo2.start();
+ assertTrue("Check validity - 4", export1.getState() == ComponentInstance.VALID);
+ assertTrue("Check providing - 4", isFooServiceProvided());
+ assertEquals("Check number of provides - 4", countFooServiceProvided(), 1);
+ assertTrue("Check invocation - 4", invoke());
+ }
+
+
+
+ private boolean isFooServiceProvided() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export1.getInstanceName());
+ return ref != null;
+ }
+
+ private int countFooServiceProvided() {
+ ServiceReference[] refs = Utils.getServiceReferences(context, BazService.class.getName(), "(instance.name="+export1.getInstanceName()+")");
+ return refs.length;
+ }
+
+ private boolean invoke() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), export1.getInstanceName());
+ if(ref == null) { return false; }
+ BazService fs = (BazService) context.getService(ref);
+ return fs.foo();
+ }
+
+
+
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedFilteredImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedFilteredImport.java
new file mode 100644
index 0000000..659705f
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedFilteredImport.java
@@ -0,0 +1,150 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedFilteredImport extends OSGiTestCase {
+
+ ComponentInstance import1;
+ Factory fooProvider;
+ ComponentInstance foo1, foo2;
+
+ public void setUp() {
+
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.1");
+ try {
+ import1 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+
+ import1.stop();
+
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Cannot instantiate foo providers : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ import1.dispose();
+ foo1 = null;
+ foo2 = null;
+ import1 = null;
+ }
+
+ public void testSimple() {
+ import1.start();
+ //Two providers
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import1);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo1.stop();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo2.stop();
+ assertTrue("Test component invalidity - 2", import1.getState() == ComponentInstance.INVALID);
+
+ foo2.start();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+ public void testSimple2() {
+ import1.start();
+ //Two providers
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import1);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo2.stop();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo1.stop();
+ assertTrue("Test component invalidity - 2", import1.getState() == ComponentInstance.INVALID);
+
+ foo1.start();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedMultipleImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedMultipleImport.java
new file mode 100644
index 0000000..99b359c
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedMultipleImport.java
@@ -0,0 +1,156 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedMultipleImport extends OSGiTestCase {
+
+ ComponentInstance import2;
+ Factory fooProvider;
+ ComponentInstance foo1, foo2;
+
+ public void setUp() {
+
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.2");
+ try {
+ import2 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+
+ import2.stop();
+
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Cannot instantiate foo providers : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ import2.dispose();
+ foo1 = null;
+ foo2 = null;
+ import2 = null;
+ }
+
+ public void testSimple() {
+ import2.start();
+ //Two providers
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import2);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 2);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ fs = (FooService) sc.getService(refs[1]);
+ assertTrue("Test foo invocation (2)", fs.foo());
+ sc.ungetService(refs[1]);
+
+ foo1.stop();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo2.stop();
+ assertTrue("Test component invalidity - 2", import2.getState() == ComponentInstance.INVALID);
+
+ foo2.start();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+ public void testSimple2() {
+ import2.start();
+ //Two providers
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import2);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 2);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ fs = (FooService) sc.getService(refs[1]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[1]);
+
+ foo2.stop();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo1.stop();
+ assertTrue("Test component invalidity - 2", import2.getState() == ComponentInstance.INVALID);
+
+ foo1.start();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedOptionalImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedOptionalImport.java
new file mode 100644
index 0000000..41ffb28
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedOptionalImport.java
@@ -0,0 +1,156 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedOptionalImport extends OSGiTestCase {
+
+ ComponentInstance import3;
+ Factory fooProvider;
+ ComponentInstance foo1, foo2;
+
+ public void setUp() {
+
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.3");
+ try {
+ import3 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+
+ import3.stop();
+
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Cannot instantiate foo providers : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ import3.dispose();
+ foo1 = null;
+ foo2 = null;
+ import3 = null;
+ }
+
+ public void testSimple() {
+ import3.start();
+ //Two providers
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import3);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo1.stop();
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo2.stop();
+ assertTrue("Test component validity - 2", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertEquals("Test foo non-availability inside the composite - 3.1", refs.length, 0);
+
+ foo2.start();
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+ public void testSimple2() {
+ import3.start();
+ //Two providers
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import3);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo2.stop();
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo1.stop();
+ assertTrue("Test component validity - 2", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 0);
+
+ foo1.start();
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedOptionalMultipleImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedOptionalMultipleImport.java
new file mode 100644
index 0000000..de9d875
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedOptionalMultipleImport.java
@@ -0,0 +1,162 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedOptionalMultipleImport extends OSGiTestCase {
+
+ ComponentInstance import4;
+ Factory fooProvider;
+ ComponentInstance foo1, foo2;
+
+ public void setUp() {
+
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.4");
+ try {
+ import4 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+
+ import4.stop();
+
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Cannot instantiate foo providers : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ import4.dispose();
+ foo1 = null;
+ foo2 = null;
+ import4 = null;
+ }
+
+ public void testSimple() {
+ import4.start();
+ //Two providers
+ assertTrue("Test component validity", import4.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import4);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 2);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ fs = (FooService) sc.getService(refs[1]);
+ assertTrue("Test foo invocation (2)", fs.foo());
+ sc.ungetService(refs[1]);
+
+ foo1.stop();
+ assertTrue("Test component validity", import4.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import4);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo2.stop();
+ assertTrue("Test component validity - 2", import4.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import4);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertEquals("Test foo availability inside the composite - 1", refs.length, 0);
+
+ foo2.start();
+ assertTrue("Test component validity", import4.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import4);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+ public void testSimple2() {
+ import4.start();
+ //Two providers
+ assertTrue("Test component validity", import4.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import4);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 2);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ fs = (FooService) sc.getService(refs[1]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[1]);
+
+ foo2.stop();
+ assertTrue("Test component validity", import4.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import4);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo1.stop();
+ assertTrue("Test component validity - 2", import4.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import4);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertEquals("Test foo availability inside the composite - 1", refs.length, 0);
+
+ foo1.start();
+ assertTrue("Test component validity", import4.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import4);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedSimpleImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedSimpleImport.java
new file mode 100644
index 0000000..e29055d
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/DelayedSimpleImport.java
@@ -0,0 +1,151 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedSimpleImport extends OSGiTestCase {
+
+ ComponentInstance import1;
+ Factory fooProvider;
+ ComponentInstance foo1, foo2;
+
+ public void setUp() {
+
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.1");
+ try {
+ import1 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+
+ import1.stop();
+
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Cannot instantiate foo providers : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ import1.dispose();
+ foo1 = null;
+ foo2 = null;
+ import1 = null;
+ }
+
+ public void testSimple() {
+ import1.start();
+
+ //Two providers
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import1);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo1.stop();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 2", refs);
+ assertEquals("Test foo availability inside the composite - 2.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo2.stop();
+ assertTrue("Test component invalidity - 2", import1.getState() == ComponentInstance.INVALID);
+
+ foo2.start();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+ public void testSimple2() {
+ import1.start();
+ //Two providers
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import1);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo2.stop();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo1.stop();
+ assertTrue("Test component invalidity - 2", import1.getState() == ComponentInstance.INVALID);
+
+ foo1.start();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/FilteredImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/FilteredImport.java
new file mode 100644
index 0000000..69b3a37
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/FilteredImport.java
@@ -0,0 +1,147 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class FilteredImport extends OSGiTestCase {
+
+ ComponentInstance import1;
+ Factory fooProvider;
+ Factory fooProvider2;
+
+ ComponentInstance foo1, foo2;
+
+ public void setUp() {
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.5");
+ try {
+ import1 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+ import1.stop();
+
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-2");
+ assertNotNull("Check fooProvider availability", fooProvider2);
+
+ Properties p1 = new Properties();
+ p1.put("name", "foo1");
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo1 = fooProvider.createComponentInstance(p1);
+ foo2 = fooProvider2.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Cannot instantiate foo providers : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ foo1.dispose();
+ foo2.dispose();
+ import1.dispose();
+ foo1 = null;
+ foo2 = null;
+ import1 = null;
+ }
+
+ public void testSimple() {
+ import1.start();
+ //Two providers
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import1);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo1.stop();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo2.stop();
+ assertTrue("Test component invalidity - 2", import1.getState() == ComponentInstance.INVALID);
+
+ foo2.start();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+ public void testSimple2() {
+ import1.start();
+ //Two providers
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import1);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo2.stop();
+ assertTrue("Test component invalidity - 1", import1.getState() == ComponentInstance.INVALID);
+
+ // Stop the second provider
+ foo1.stop();
+ assertTrue("Test component invalidity - 2", import1.getState() == ComponentInstance.INVALID);
+
+ foo1.start();
+ assertTrue("Test component invalidity - 3", import1.getState() == ComponentInstance.INVALID);
+
+ foo2.start();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/ImportTestSuite.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/ImportTestSuite.java
new file mode 100644
index 0000000..2f25b2c
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/ImportTestSuite.java
@@ -0,0 +1,43 @@
+/*
+ * 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.test.composite.importer;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class ImportTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Composite Import Test Suite", bc);
+ ots.addTestSuite(SimpleImport.class);
+ ots.addTestSuite(DelayedSimpleImport.class);
+ ots.addTestSuite(OptionalImport.class);
+ ots.addTestSuite(DelayedOptionalImport.class);
+ ots.addTestSuite(MultipleImport.class);
+ ots.addTestSuite(DelayedMultipleImport.class);
+ ots.addTestSuite(OptionalMultipleImport.class);
+ ots.addTestSuite(DelayedOptionalMultipleImport.class);
+ ots.addTestSuite(FilteredImport.class);
+ ots.addTestSuite(DelayedFilteredImport.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/MultipleImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/MultipleImport.java
new file mode 100644
index 0000000..4d5df53
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/MultipleImport.java
@@ -0,0 +1,190 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class MultipleImport extends OSGiTestCase {
+
+ ComponentInstance import2;
+ Factory fooProvider;
+
+ public void setUp() {
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.2");
+ try {
+ import2 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ import2.dispose();
+ import2 = null;
+ }
+
+ public void testSimple() {
+ // No provider -> Invalid
+ assertTrue("Test component invalidity", import2.getState() == ComponentInstance.INVALID);
+
+ ComponentInstance foo = null;
+ Properties p = new Properties();
+ p.put("name", "foo");
+ try {
+ foo = fooProvider.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo component " + e.getMessage());
+ }
+
+ ComponentInstance foo2 = null;
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo2 component " + e.getMessage());
+ }
+
+ // The foo service is available => import1 must be valid
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import2);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2 ("+refs.length+")", refs.length, 2);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ FooService fs2 = (FooService) sc.getService(refs[1]);
+ assertTrue("Test foo invocation", fs2.foo());
+ sc.ungetService(refs[0]);
+ sc.ungetService(refs[1]);
+
+ // Stop the second provider
+ foo2.dispose();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 2", refs);
+ assertEquals("Test foo availability inside the composite - 2.1 ("+refs.length+")", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // stop the foo provider
+ foo.stop();
+
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 2", import2.getState() == ComponentInstance.INVALID);
+
+ foo.start();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo.dispose();
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 3", import2.getState() == ComponentInstance.INVALID);
+ }
+
+ public void testSimple2() {
+ // No provider -> Invalid
+ assertTrue("Test component invalidity", import2.getState() == ComponentInstance.INVALID);
+
+ ComponentInstance foo1 = null;
+ Properties p = new Properties();
+ p.put("name", "foo");
+ try {
+ foo1 = fooProvider.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo component " + e.getMessage());
+ }
+
+ ComponentInstance foo2 = null;
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo2 component " + e.getMessage());
+ }
+
+ // The foo service is available => import1 must be valid
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import2);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2 ("+refs.length+")", refs.length, 2);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ FooService fs2 = (FooService) sc.getService(refs[1]);
+ assertTrue("Test foo invocation", fs2.foo());
+ sc.ungetService(refs[0]);
+ sc.ungetService(refs[1]);
+
+ // Stop the first provider
+ foo1.stop();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 2", refs);
+ assertEquals("Test foo availability inside the composite - 2.1 ("+refs.length+")", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // stop the second foo provider
+ foo2.dispose();
+
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 2", import2.getState() == ComponentInstance.INVALID);
+
+ foo1.start();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo1.dispose();
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 3", import2.getState() == ComponentInstance.INVALID);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/OptionalImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/OptionalImport.java
new file mode 100644
index 0000000..69cd1bb
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/OptionalImport.java
@@ -0,0 +1,184 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalImport extends OSGiTestCase {
+
+ ComponentInstance import3;
+ Factory fooProvider;
+
+ public void setUp() {
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.3");
+ try {
+ import3 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ import3.dispose();
+ import3 = null;
+ }
+
+ public void testSimple() {
+ // No provider -> valid
+ assertTrue("Test component invalidity", import3.getState() == ComponentInstance.VALID);
+
+ ComponentInstance foo = null;
+ Properties p = new Properties();
+ p.put("name", "foo");
+ try {
+ foo = fooProvider.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo component " + e.getMessage());
+ }
+
+ ComponentInstance foo2 = null;
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo2 component " + e.getMessage());
+ }
+
+ // The foo service is available => import1 must be valid
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import3);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo2.dispose();
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 2", refs);
+ assertEquals("Test foo availability inside the composite - 2.1 ("+refs.length+")", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // stop the foo provider
+ foo.stop();
+
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 2", import3.getState() == ComponentInstance.VALID);
+
+ foo.start();
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo.dispose();
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 3", import3.getState() == ComponentInstance.VALID);
+ }
+
+ public void testSimple2() {
+ // No provider -> valid
+ assertTrue("Test component invalidity", import3.getState() == ComponentInstance.VALID);
+
+ ComponentInstance foo1 = null;
+ Properties p = new Properties();
+ p.put("name", "foo");
+ try {
+ foo1 = fooProvider.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo component " + e.getMessage());
+ }
+
+ ComponentInstance foo2 = null;
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo2 component " + e.getMessage());
+ }
+
+ // The foo service is available => import1 must be valid
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import3);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo1.stop();
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 2", refs);
+ assertEquals("Test foo availability inside the composite - 2.1 ("+refs.length+")", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // stop the foo provider
+ foo2.dispose();
+
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 2", import3.getState() == ComponentInstance.VALID);
+
+ foo1.start();
+ assertTrue("Test component validity", import3.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import3);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo1.dispose();
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 3", import3.getState() == ComponentInstance.VALID);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/OptionalMultipleImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/OptionalMultipleImport.java
new file mode 100644
index 0000000..811301d
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/OptionalMultipleImport.java
@@ -0,0 +1,201 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalMultipleImport extends OSGiTestCase {
+
+ ComponentInstance import2;
+ Factory fooProvider;
+
+ public void setUp() {
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.4");
+ try {
+ import2 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ import2.dispose();
+ import2 = null;
+ }
+
+ public void testSimple() {
+ // No provider -> valid
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+
+ ComponentInstance foo = null;
+ Properties p = new Properties();
+ p.put("name", "foo");
+ try {
+ foo = fooProvider.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo component " + e.getMessage());
+ }
+
+ ComponentInstance foo2 = null;
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo2 component " + e.getMessage());
+ }
+
+ // The foo service is available => import1 must be valid
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import2);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2 ("+refs.length+")", refs.length, 2);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ FooService fs2 = (FooService) sc.getService(refs[1]);
+ assertTrue("Test foo invocation", fs2.foo());
+ sc.ungetService(refs[0]);
+ sc.ungetService(refs[1]);
+
+ // Stop the second provider
+ foo2.dispose();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 2", refs);
+ assertEquals("Test foo availability inside the composite - 2.1 ("+refs.length+")", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // stop the foo provider
+ foo.stop();
+
+ // No provider -> valid
+ assertTrue("Test component validity - 2", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertEquals("Test foo non-availability inside the composite - 1", refs.length, 0);
+
+ foo.start();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo.dispose();
+ // No provider -> Invalid
+ assertTrue("Test component validity - 3", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertEquals("Test foo non-availability inside the composite - 2", refs.length, 0);
+ }
+
+ public void testSimple2() {
+ // No provider -> Invalid
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+
+ ComponentInstance foo1 = null;
+ Properties p = new Properties();
+ p.put("name", "foo");
+ try {
+ foo1 = fooProvider.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo component " + e.getMessage());
+ }
+
+ ComponentInstance foo2 = null;
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo2 component " + e.getMessage());
+ }
+
+ // The foo service is available => import1 must be valid
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import2);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2 ("+refs.length+")", refs.length, 2);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ FooService fs2 = (FooService) sc.getService(refs[1]);
+ assertTrue("Test foo invocation", fs2.foo());
+ sc.ungetService(refs[0]);
+ sc.ungetService(refs[1]);
+
+ // Stop the first provider
+ foo1.stop();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 2", refs);
+ assertEquals("Test foo availability inside the composite - 2.1 ("+refs.length+")", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // stop the second foo provider
+ foo2.dispose();
+
+ // No provider -> Invalid
+ assertTrue("Test component validity - 2", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertEquals("Test foo non-availability inside the composite - 1", refs.length, 0);
+
+ foo1.start();
+ assertTrue("Test component validity", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo1.dispose();
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 3", import2.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import2);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertEquals("Test foo non-availability inside the composite - 2", refs.length, 0);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/SimpleImport.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/SimpleImport.java
new file mode 100644
index 0000000..9bcdc87
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/importer/SimpleImport.java
@@ -0,0 +1,184 @@
+/*
+ * 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.test.composite.importer;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class SimpleImport extends OSGiTestCase {
+
+ ComponentInstance import1;
+ Factory fooProvider;
+
+ public void setUp() {
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check fooProvider availability", fooProvider);
+
+ Properties p = new Properties();
+ p.put("name", "importer");
+ Factory compFact = Utils.getFactoryByName(context, "composite.requires.1");
+ try {
+ import1 = compFact.createComponentInstance(p);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("Cannot instantiate the component : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ import1.dispose();
+ import1 = null;
+ }
+
+ public void testSimple() {
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 0 ("+import1.getState()+")", import1.getState() == ComponentInstance.INVALID);
+
+ ComponentInstance foo = null;
+ Properties p = new Properties();
+ p.put("name", "foo");
+ try {
+ foo = fooProvider.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo component " + e.getMessage());
+ }
+
+ ComponentInstance foo2 = null;
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo2 component " + e.getMessage());
+ }
+
+ // The foo service is available => import1 must be valid
+ assertTrue("Test component validity - 1", import1.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import1);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the second provider
+ foo2.dispose();
+ assertTrue("Test component validity - 2", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 2", refs);
+ assertEquals("Test foo availability inside the composite - 2.1 ("+refs.length+")", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // stop the foo provider
+ foo.stop();
+
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 2", import1.getState() == ComponentInstance.INVALID);
+
+ foo.start();
+ assertTrue("Test component validity - 3", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo.dispose();
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 3", import1.getState() == ComponentInstance.INVALID);
+ }
+
+ public void testSimple2() {
+ // No provider -> Invalid
+ assertTrue("Test component invalidity", import1.getState() == ComponentInstance.INVALID);
+
+ ComponentInstance foo1 = null;
+ Properties p = new Properties();
+ p.put("name", "foo");
+ try {
+ foo1 = fooProvider.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo component " + e.getMessage());
+ }
+
+ ComponentInstance foo2 = null;
+ Properties p2 = new Properties();
+ p2.put("name", "foo2");
+ try {
+ foo2 = fooProvider.createComponentInstance(p2);
+ } catch(Exception e) {
+ fail("Fail to instantiate the foo2 component " + e.getMessage());
+ }
+
+ // The foo service is available => import1 must be valid
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(import1);
+ ServiceReference[] refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 1", refs);
+ assertEquals("Test foo availability inside the composite - 1.2", refs.length, 1);
+ FooService fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // Stop the first provider
+ foo1.stop();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 2", refs);
+ assertEquals("Test foo availability inside the composite - 2.1 ("+refs.length+")", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ // stop the second foo provider
+ foo2.dispose();
+
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 2", import1.getState() == ComponentInstance.INVALID);
+
+ foo1.start();
+ assertTrue("Test component validity", import1.getState() == ComponentInstance.VALID);
+ sc = Utils.getServiceContext(import1);
+ refs = Utils.getServiceReferences(sc, FooService.class.getName(), null);
+ assertNotNull("Test foo availability inside the composite - 3", refs);
+ assertEquals("Test foo availability inside the composite - 3.1", refs.length, 1);
+ fs = (FooService) sc.getService(refs[0]);
+ assertTrue("Test foo invocation", fs.foo());
+ sc.ungetService(refs[0]);
+
+ foo1.dispose();
+ // No provider -> Invalid
+ assertTrue("Test component invalidity - 3", import1.getState() == ComponentInstance.INVALID);
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/EmptyCompositeTest.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/EmptyCompositeTest.java
new file mode 100644
index 0000000..a729b33
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/EmptyCompositeTest.java
@@ -0,0 +1,222 @@
+/*
+ * 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.test.composite.infrastructure;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.composite.CompositeManager;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.InvalidSyntaxException;
+
+public class EmptyCompositeTest extends OSGiTestCase {
+
+ public void testEmptyCompositeCreation() {
+ Factory factory = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty");
+
+ ComponentInstance ci = null;
+ try {
+ ci = factory.createComponentInstance(props);
+ } catch (Exception e) {
+ e.printStackTrace();
+ fail("Unacceptable configuration : " + e.getMessage());
+ }
+
+ ComponentTypeDescription cd = ci.getFactory().getComponentDescription();
+ assertEquals("Check component type name", cd.getName(), "composite.empty");
+// assertEquals("Check class name (" + cd.getClassName() + ")", cd.getClassName(), "composite");
+ assertEquals("Check offered service", cd.getprovidedServiceSpecification().length, 0);
+ assertEquals("Check configurable properties", cd.getProperties().length, 0);
+
+ InstanceDescription id = ci.getInstanceDescription();
+ assertEquals("Check composite instance name", id.getName(), "empty");
+ assertEquals("Check composite instance state (" + id.getState() + ")", id.getState(), ComponentInstance.VALID);
+
+ assertEquals("Check contained instance", id.getContainedInstances().length, 0);
+
+ assertTrue("Check composite manager", ci instanceof CompositeManager);
+ CompositeManager cm = (CompositeManager) ci;
+ ServiceContext sc = cm.getServiceContext();
+ try {
+ assertEquals("Check number of factories imported", sc.getServiceReferences(Factory.class.getName(), null).length, context.getServiceReferences(Factory.class.getName(), null).length);
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e.getMessage());
+ }
+ ci.dispose();
+ }
+
+ public void testInstanceCreation1() {
+ Factory factory = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty");
+
+ ComponentInstance ci = null;
+ try {
+ ci = factory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("Unacceptable configuration : " + e.getMessage());
+ }
+
+ assertTrue("Check composite manager", ci instanceof CompositeManager);
+ CompositeManager cm = (CompositeManager) ci;
+ ServiceContext sc = cm.getServiceContext();
+ try {
+ assertEquals("Check number of factories imported", sc.getServiceReferences(Factory.class.getName(), null).length, context.getServiceReferences(Factory.class.getName(), null).length);
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e.getMessage());
+ }
+
+ Properties props2 = new Properties();
+ props2.put("name", "empty2");
+ ComponentInstance ci2 = null;
+ try {
+ ci2 = factory.createComponentInstance(props2, sc);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("Unacceptable configuration : " + e.getMessage());
+ }
+
+ InstanceDescription id = ci.getInstanceDescription();
+ assertEquals("Check composite instance name", id.getName(), "empty");
+ assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
+ assertEquals("Check contained instance", id.getContainedInstances().length, 1);
+ InstanceDescription id2 = id.getContainedInstances()[0];
+ assertEquals("Check composite instance name", id2.getName(), "empty2");
+ assertEquals("Check composite instance state", id2.getState(), ComponentInstance.VALID);
+ assertEquals("Check contained instance", id2.getContainedInstances().length, 0);
+
+ ci2.dispose();
+ id = ci.getInstanceDescription();
+ assertEquals("Check composite instance name", id.getName(), "empty");
+ assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
+ assertEquals("Check contained instance", id.getContainedInstances().length, 0);
+
+ ci.dispose();
+ }
+
+ public void testInstanceCreation2() {
+ Factory factory = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty");
+
+ ComponentInstance ci = null;
+ try {
+ ci = factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Unacceptable configuration : " + e.getMessage());
+ }
+
+ assertTrue("Check composite manager", ci instanceof CompositeManager);
+ CompositeManager cm = (CompositeManager) ci;
+ ServiceContext sc = cm.getServiceContext();
+ try {
+ assertEquals("Check number of factories imported", sc.getServiceReferences(Factory.class.getName(), null).length, context.getServiceReferences(Factory.class.getName(), null).length);
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e.getMessage());
+ }
+
+ Factory factory2 = Utils.getFactoryByName(sc, "composite.empty");
+ assertNotNull("Check factory2 not null", factory2);
+ Properties props2 = new Properties();
+ props2.put("name", "empty2");
+ ComponentInstance ci2 = null;
+ try {
+ ci2 = factory2.createComponentInstance(props2);
+ } catch(Exception e) {
+ fail("Unacceptable configuration : " + e.getMessage());
+ }
+
+ InstanceDescription id = ci.getInstanceDescription();
+ assertEquals("Check composite instance name", id.getName(), "empty");
+ assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
+ assertEquals("Check contained instance", id.getContainedInstances().length, 1);
+ InstanceDescription id2 = id.getContainedInstances()[0];
+ assertEquals("Check composite instance name", id2.getName(), "empty2");
+ assertEquals("Check composite instance state", id2.getState(), ComponentInstance.VALID);
+ assertEquals("Check contained instance", id2.getContainedInstances().length, 0);
+
+ ci2.dispose();
+ id = ci.getInstanceDescription();
+ assertEquals("Check composite instance name", id.getName(), "empty");
+ assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
+ assertEquals("Check contained instance", id.getContainedInstances().length, 0);
+
+ ci.dispose();
+ }
+
+ public void testInstanceCreation3() {
+ Factory factory = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty");
+
+ ComponentInstance ci = null;
+ try {
+ ci = factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Unacceptable configuration : " + e.getMessage());
+ }
+
+ assertTrue("Check composite manager", ci instanceof CompositeManager);
+ CompositeManager cm = (CompositeManager) ci;
+ ServiceContext sc = cm.getServiceContext();
+ try {
+ assertEquals("Check number of factories imported", sc.getServiceReferences(Factory.class.getName(), null).length, context.getServiceReferences(Factory.class.getName(), null).length);
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e.getMessage());
+ }
+
+ Factory factory2 = Utils.getFactoryByName(sc, "composite.empty");
+ assertNotNull("Check factory2 not null", factory2);
+ Properties props2 = new Properties();
+ props2.put("name", "empty2");
+ ComponentInstance ci2 = null;
+ try {
+ ci2 = factory2.createComponentInstance(props2, sc);
+ } catch(Exception e) {
+ fail("Unacceptable configuration : " + e.getMessage());
+ }
+
+ InstanceDescription id = ci.getInstanceDescription();
+ assertEquals("Check composite instance name", id.getName(), "empty");
+ assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
+ assertEquals("Check contained instance", id.getContainedInstances().length, 1);
+ InstanceDescription id2 = id.getContainedInstances()[0];
+ assertEquals("Check composite instance name", id2.getName(), "empty2");
+ assertEquals("Check composite instance state", id2.getState(), ComponentInstance.VALID);
+ assertEquals("Check contained instance", id2.getContainedInstances().length, 0);
+
+ ci2.dispose();
+ id = ci.getInstanceDescription();
+ assertEquals("Check composite instance name", id.getName(), "empty");
+ assertEquals("Check composite instance state", id.getState(), ComponentInstance.VALID);
+ assertEquals("Check contained instance", id.getContainedInstances().length, 0);
+
+ ci.dispose();
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/FactoryManagementTest.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/FactoryManagementTest.java
new file mode 100644
index 0000000..8e238a3
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/FactoryManagementTest.java
@@ -0,0 +1,263 @@
+/*
+ * 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.test.composite.infrastructure;
+
+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.FactoryStateListener;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+public class FactoryManagementTest extends OSGiTestCase {
+
+ private FakeFactory fake1 = new FakeFactory("fake");
+ private FakeFactory fake2 = new FakeFactory("fake2");
+
+ private Factory emptyFactory;
+ private ComponentInstance empty;
+
+ private class FakeFactory implements Factory {
+
+ private String m_name;
+ public FakeFactory(String name) { m_name = name; }
+
+ public ComponentInstance createComponentInstance(Dictionary arg0) throws UnacceptableConfiguration { return null; }
+ public ComponentInstance createComponentInstance(Dictionary arg0, ServiceContext arg1) throws UnacceptableConfiguration { return null; }
+ public Element getDescription() { return null; }
+ public String getName() { return m_name; }
+ public boolean isAcceptable(Dictionary arg0) { return false; }
+ public void reconfigure(Dictionary arg0) throws UnacceptableConfiguration { }
+ public void addFactoryStateListener(FactoryStateListener arg0) { }
+ public List getMissingHandlers() { return null; }
+ public List getRequiredHandlers() { return null; }
+ public void removeFactoryStateListener(FactoryStateListener arg0) { }
+ public ComponentTypeDescription getComponentDescription() { return null; }
+ public String getClassName() { return ""; }
+ public int getState() { return Factory.VALID; }
+ public BundleContext getBundleContext() { return context; }
+
+ }
+
+ public void setUp() {
+ emptyFactory = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty-1");
+ try {
+ empty = emptyFactory.createComponentInstance(props);
+ } catch (Exception e) { fail("Cannot create empty instance " + e.getMessage()); }
+ }
+
+ public void tearDown() {
+ empty.dispose();
+ empty = null;
+ }
+
+ public void testOneLevelExposition() {
+ ServiceReference[] parentsFactoryReferences = Utils.getServiceReferences(context, Factory.class.getName(), null);
+ ServiceContext sc = Utils.getServiceContext(empty);
+ ServiceReference[] internalFactoryReferences = Utils.getServiceReferences(sc, Factory.class.getName(), null);
+
+ assertEquals("Check the number of available factories", parentsFactoryReferences.length, internalFactoryReferences.length);
+
+ for(int i = 0; i < parentsFactoryReferences.length; i++) {
+ Factory factory = (Factory) context.getService(parentsFactoryReferences[i]);
+ assertTrue("Check the avaibility of " + factory.getName(), isExposed(factory, internalFactoryReferences, sc));
+ }
+ }
+
+ public void testTwoLevelExposition() {
+ ServiceReference[] parentsFactoryReferences = Utils.getServiceReferences(context, Factory.class.getName(), null);
+ ServiceContext sc1 = Utils.getServiceContext(empty);
+ ServiceReference[] Level1FactoryReferences = Utils.getServiceReferences(sc1, Factory.class.getName(), null);
+
+ Factory fact = Utils.getFactoryByName(sc1, "composite.empty");
+ Properties p = new Properties();
+ p.put("name", "empty2");
+ ComponentInstance empty2 = null;
+ try {
+ empty2 = fact.createComponentInstance(p);
+ } catch (Exception e) {
+ fail("Cannot instantiate empty2 instance : " + e.getMessage());
+ }
+
+ ServiceContext sc2 = Utils.getServiceContext(empty2);
+ ServiceReference[] Level2FactoryReferences = Utils.getServiceReferences(sc2, Factory.class.getName(), null);
+
+ assertEquals("Check the number of available factories - 1", parentsFactoryReferences.length, Level1FactoryReferences.length);
+ assertEquals("Check the number of available factories - 2", parentsFactoryReferences.length, Level2FactoryReferences.length);
+ assertEquals("Check the number of available factories - 3", Level1FactoryReferences.length, Level2FactoryReferences.length);
+
+ for(int i = 0; i < Level1FactoryReferences.length; i++) {
+ Factory factory = (Factory) context.getService(parentsFactoryReferences[i]);
+ assertTrue("Check the avaibility of " + factory.getName(), isExposed(factory, Level2FactoryReferences, sc2));
+ }
+
+ empty2.dispose();
+ }
+
+ public void testDynamism() {
+ ServiceReference[] parentsFactoryReferences = Utils.getServiceReferences(context, Factory.class.getName(), null);
+ ServiceContext sc1 = Utils.getServiceContext(empty);
+ ServiceReference[] Level1FactoryReferences = Utils.getServiceReferences(sc1, Factory.class.getName(), null);
+
+ Factory fact = Utils.getFactoryByName(sc1, "composite.empty");
+ Properties p = new Properties();
+ p.put("name", "empty2");
+ ComponentInstance empty2 = null;
+ try {
+ empty2 = fact.createComponentInstance(p);
+ } catch (Exception e) {
+ fail("Cannot instantiate empty2 instance : " + e.getMessage());
+ }
+
+ ServiceContext sc2 = Utils.getServiceContext(empty2);
+ ServiceReference[] Level2FactoryReferences = Utils.getServiceReferences(sc2, Factory.class.getName(), null);
+
+ assertEquals("Check the number of available factories - 1", parentsFactoryReferences.length, Level1FactoryReferences.length);
+ assertEquals("Check the number of available factories - 2", parentsFactoryReferences.length, Level2FactoryReferences.length);
+ assertEquals("Check the number of available factories - 3", Level1FactoryReferences.length, Level2FactoryReferences.length);
+
+ for(int i = 0; i < Level1FactoryReferences.length; i++) {
+ Factory factory = (Factory) context.getService(parentsFactoryReferences[i]);
+ assertTrue("Check the avaibility of " + factory.getName(), isExposed(factory, Level2FactoryReferences, sc2));
+ }
+
+ // Publish fake1
+ ServiceRegistration reg1 = context.registerService(Factory.class.getName(), fake1, null);
+
+ parentsFactoryReferences = Utils.getServiceReferences(context, Factory.class.getName(), null);
+ sc1 = Utils.getServiceContext(empty);
+ Level1FactoryReferences = Utils.getServiceReferences(sc1, Factory.class.getName(), null);
+ sc2 = Utils.getServiceContext(empty2);
+ Level2FactoryReferences = Utils.getServiceReferences(sc2, Factory.class.getName(), null);
+
+ assertEquals("Check the number of available factories - 1.1", parentsFactoryReferences.length, Level1FactoryReferences.length);
+ assertEquals("Check the number of available factories - 1.2", parentsFactoryReferences.length, Level2FactoryReferences.length);
+ assertEquals("Check the number of available factories - 1.3", Level1FactoryReferences.length, Level2FactoryReferences.length);
+
+ // Publish fake2
+ ServiceRegistration reg2 = context.registerService(Factory.class.getName(), fake2, null);
+
+ parentsFactoryReferences = Utils.getServiceReferences(context, Factory.class.getName(), null);
+ sc1 = Utils.getServiceContext(empty);
+ Level1FactoryReferences = Utils.getServiceReferences(sc1, Factory.class.getName(), null);
+ sc2 = Utils.getServiceContext(empty2);
+ Level2FactoryReferences = Utils.getServiceReferences(sc2, Factory.class.getName(), null);
+
+ assertEquals("Check the number of available factories - 1.1", parentsFactoryReferences.length, Level1FactoryReferences.length);
+ assertEquals("Check the number of available factories - 1.2", parentsFactoryReferences.length, Level2FactoryReferences.length);
+ assertEquals("Check the number of available factories - 1.3", Level1FactoryReferences.length, Level2FactoryReferences.length);
+
+ reg1.unregister();
+
+ parentsFactoryReferences = Utils.getServiceReferences(context, Factory.class.getName(), null);
+ sc1 = Utils.getServiceContext(empty);
+ Level1FactoryReferences = Utils.getServiceReferences(sc1, Factory.class.getName(), null);
+ sc2 = Utils.getServiceContext(empty2);
+ Level2FactoryReferences = Utils.getServiceReferences(sc2, Factory.class.getName(), null);
+
+ assertEquals("Check the number of available factories - 1.1", parentsFactoryReferences.length, Level1FactoryReferences.length);
+ assertEquals("Check the number of available factories - 1.2", parentsFactoryReferences.length, Level2FactoryReferences.length);
+ assertEquals("Check the number of available factories - 1.3", Level1FactoryReferences.length, Level2FactoryReferences.length);
+
+ reg2.unregister();
+
+ parentsFactoryReferences = Utils.getServiceReferences(context, Factory.class.getName(), null);
+ sc1 = Utils.getServiceContext(empty);
+ Level1FactoryReferences = Utils.getServiceReferences(sc1, Factory.class.getName(), null);
+ sc2 = Utils.getServiceContext(empty2);
+ Level2FactoryReferences = Utils.getServiceReferences(sc2, Factory.class.getName(), null);
+
+ assertEquals("Check the number of available factories - 1.1", parentsFactoryReferences.length, Level1FactoryReferences.length);
+ assertEquals("Check the number of available factories - 1.2", parentsFactoryReferences.length, Level2FactoryReferences.length);
+ assertEquals("Check the number of available factories - 1.3", Level1FactoryReferences.length, Level2FactoryReferences.length);
+
+ empty2.dispose();
+ }
+
+ public void testInvocation() {
+ ServiceContext sc1 = Utils.getServiceContext(empty);
+ Factory fact = Utils.getFactoryByName(sc1, "composite.empty");
+ Properties p = new Properties();
+ p.put("name", "empty2");
+ ComponentInstance empty2 = null;
+ try {
+ empty2 = fact.createComponentInstance(p);
+ } catch (Exception e) {
+ fail("Cannot instantiate empty2 instance : " + e.getMessage());
+ }
+
+ ServiceContext sc2 = Utils.getServiceContext(empty2);
+
+ Factory fact1 = Utils.getFactoryByName(sc2, "SimpleCheckServiceProvider");
+ Properties props = new Properties();
+ props.put("name", "client");
+ ComponentInstance client = null;
+ try {
+ client = fact1.createComponentInstance(props);
+ } catch (Exception e) { e.printStackTrace(); fail("Cannot instantiate the client : " + e.getMessage()); }
+
+ Factory fact2 = Utils.getFactoryByName(sc2, "FooProviderType-1");
+ Properties props2 = new Properties();
+ props2.put("name", "provider");
+ ComponentInstance provider = null;
+ try {
+ provider = fact2.createComponentInstance(props2);
+ } catch (Exception e) {
+ fail("Cannot instantiate the provider : " + e.getMessage());
+ }
+
+ ServiceReference ref = sc2.getServiceReference(CheckService.class.getName());
+ assertNotNull("Check ref existency", ref);
+ CheckService check = (CheckService) sc2.getService(ref);
+
+ assertTrue("Check invocation", check.check());
+ client.dispose();
+ provider.dispose();
+ empty2.dispose();
+ }
+
+
+
+
+ private boolean isExposed(Factory fact, ServiceReference[] refs, ServiceContext sc) {
+ for(int i = 0; i < refs.length; i++) {
+ Factory f = (Factory) sc.getService(refs[i]);
+ if(fact.getName().equals(f.getName())) {
+ sc.ungetService(refs[i]);
+ return true;
+ }
+ sc.ungetService(refs[i]);
+ }
+ return false;
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/InfrastructureTestSuite.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/InfrastructureTestSuite.java
new file mode 100644
index 0000000..051ba7b
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/InfrastructureTestSuite.java
@@ -0,0 +1,37 @@
+/*
+ * 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.test.composite.infrastructure;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class InfrastructureTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Service Context Infrastructure Test", bc);
+ ots.addTestSuite(ServiceRegistryTest.class);
+ ots.addTestSuite(EmptyCompositeTest.class);
+ ots.addTestSuite(FactoryManagementTest.class);
+ ots.addTestSuite(ServiceRangeTest.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/ServiceRangeTest.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/ServiceRangeTest.java
new file mode 100644
index 0000000..740f129
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/ServiceRangeTest.java
@@ -0,0 +1,482 @@
+/*
+ * 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.test.composite.infrastructure;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class ServiceRangeTest extends OSGiTestCase {
+
+ private Factory emptyFactory;
+ private ComponentInstance empty;
+
+
+ public void setUp() {
+ emptyFactory = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty-1");
+ try {
+ empty = emptyFactory.createComponentInstance(props);
+ } catch(Exception e) { fail("Cannot create empty instance " + e.getMessage()); }
+ }
+
+ public void tearDown() {
+ empty.dispose();
+ empty = null;
+ }
+
+ public void testLevelOne1() {
+ ServiceContext sc2 = Utils.getServiceContext(empty);
+
+ Factory fact1 = Utils.getFactoryByName(sc2, "SimpleCheckServiceProvider");
+ Properties props = new Properties();
+ props.put("name", "client");
+ ComponentInstance client = null;
+ try {
+ client = fact1.createComponentInstance(props);
+ } catch(Exception e) { fail("Cannot instantiate the client : " + e.getMessage()); }
+
+ Factory fact2 = Utils.getFactoryByName(sc2, "FooProviderType-1");
+ Properties props2 = new Properties();
+ props2.put("name", "provider");
+ ComponentInstance provider = null;
+ try {
+ provider = fact2.createComponentInstance(props2);
+ } catch(Exception e) {
+ fail("Cannot instantiate the provider : " + e.getMessage());
+ }
+
+ ServiceReference ref = sc2.getServiceReference(CheckService.class.getName());
+ CheckService check = (CheckService) sc2.getService(ref);
+
+ assertTrue("Check invocation", check.check());
+
+ sc2.ungetService(ref);
+
+ // Check visibility
+ assertNotNull("Check foo service visible inside the composite", sc2.getServiceReference(FooService.class.getName()));
+ assertNotNull("Check check service visible inside the composite", sc2.getServiceReference(CheckService.class.getName()));
+ // Check invisibilty
+ assertNull("Check foo service invisible inside the context", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+
+ provider.dispose();
+ client.dispose();
+
+ assertNull("Check foo service invisible inside the composite", sc2.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service invisible inside the composite", sc2.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible from the context", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+ }
+
+ public void testLevelOne2() {
+ ServiceContext sc2 = Utils.getServiceContext(empty);
+
+ Factory fact1 = Utils.getFactoryByName(sc2, "SimpleCheckServiceProvider");
+ Properties props = new Properties();
+ props.put("name", "client");
+ ComponentInstance client = null;
+ try {
+ client = fact1.createComponentInstance(props, sc2);
+ } catch(Exception e) { fail("Cannot instantiate the client : " + e.getMessage()); }
+
+ Factory fact2 = Utils.getFactoryByName(sc2, "FooProviderType-1");
+ Properties props2 = new Properties();
+ props2.put("name", "provider");
+ ComponentInstance provider = null;
+ try {
+ provider = fact2.createComponentInstance(props2, sc2);
+ } catch(Exception e) {
+ fail("Cannot instantiate the provider : " + e.getMessage());
+ }
+
+ ServiceReference ref = sc2.getServiceReference(CheckService.class.getName());
+ CheckService check = (CheckService) sc2.getService(ref);
+
+ assertTrue("Check invocation", check.check());
+
+ sc2.ungetService(ref);
+
+ // Check visibility
+ assertNotNull("Check foo service visible inside the composite", sc2.getServiceReference(FooService.class.getName()));
+ assertNotNull("Check check service visible inside the composite", sc2.getServiceReference(CheckService.class.getName()));
+ // Check invisibilty
+ assertNull("Check foo service invisible inside the context", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+
+ client.dispose();
+ provider.dispose();
+
+ assertNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+ }
+
+ public void testLevelOne3() {
+ ServiceContext sc2 = Utils.getServiceContext(empty);
+
+ Factory fact1 = Utils.getFactoryByName(context, "SimpleCheckServiceProvider");
+ Properties props = new Properties();
+ props.put("name", "client");
+ ComponentInstance client = null;
+ try {
+ client = fact1.createComponentInstance(props, sc2);
+ } catch(Exception e) { fail("Cannot instantiate the client : " + e.getMessage()); }
+
+ Factory fact2 = Utils.getFactoryByName(context, "FooProviderType-1");
+ Properties props2 = new Properties();
+ props2.put("name", "provider");
+ ComponentInstance provider = null;
+ try {
+ provider = fact2.createComponentInstance(props2, sc2);
+ } catch(Exception e) {
+ fail("Cannot instantiate the provider : " + e.getMessage());
+ }
+
+ ServiceReference ref = sc2.getServiceReference(CheckService.class.getName());
+ CheckService check = (CheckService) sc2.getService(ref);
+
+ assertTrue("Check invocation", check.check());
+
+ sc2.ungetService(ref);
+
+ // Check visibility
+ assertNotNull("Check foo service visible inside the composite", sc2.getServiceReference(FooService.class.getName()));
+ assertNotNull("Check check service visible inside the composite", sc2.getServiceReference(CheckService.class.getName()));
+ // Check invisibilty
+ assertNull("Check foo service invisible inside the context", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+
+ client.dispose();
+ provider.dispose();
+
+ assertNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+ }
+
+ public void testLevelTwo1() {
+ ServiceContext sc1 = Utils.getServiceContext(empty);
+ Factory fact = Utils.getFactoryByName(sc1, "composite.empty");
+ Properties p = new Properties();
+ p.put("name", "empty2");
+ ComponentInstance empty2 = null;
+ try {
+ empty2 = fact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate empty2 instance : " + e.getMessage());
+ }
+
+ ServiceContext sc2 = Utils.getServiceContext(empty2);
+
+ Factory fact1 = Utils.getFactoryByName(sc2, "SimpleCheckServiceProvider");
+ Properties props = new Properties();
+ props.put("name", "client");
+ ComponentInstance client = null;
+ try {
+ client = fact1.createComponentInstance(props);
+ } catch(Exception e) { fail("Cannot instantiate the client : " + e.getMessage()); }
+
+ Factory fact2 = Utils.getFactoryByName(sc2, "FooProviderType-1");
+ Properties props2 = new Properties();
+ props2.put("name", "provider");
+ ComponentInstance provider = null;
+ try {
+ provider = fact2.createComponentInstance(props2);
+ } catch(Exception e) {
+ fail("Cannot instantiate the provider : " + e.getMessage());
+ }
+
+ ServiceReference ref = sc2.getServiceReference(CheckService.class.getName());
+ CheckService check = (CheckService) sc2.getService(ref);
+
+ assertTrue("Check invocation", check.check());
+
+ sc2.ungetService(ref);
+
+ // Check visibility
+ assertNotNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNotNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ // Check invisibilty
+ assertNull("Check foo service invisible inside the composite 1", sc1.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service invisible inside the composite 1", sc1.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+
+ client.dispose();
+ provider.dispose();
+
+ assertNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the composite 1", sc1.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service invisible inside the composite 1", sc1.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+ empty2.dispose();
+ }
+
+ public void testLevelTwo2() {
+ ServiceContext sc1 = Utils.getServiceContext(empty);
+ Factory fact = Utils.getFactoryByName(sc1, "composite.empty");
+ Properties p = new Properties();
+ p.put("name", "empty2");
+ ComponentInstance empty2 = null;
+ try {
+ empty2 = fact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate empty2 instance : " + e.getMessage());
+ }
+
+ ServiceContext sc2 = Utils.getServiceContext(empty2);
+
+ Factory fact1 = Utils.getFactoryByName(sc1, "SimpleCheckServiceProvider");
+ Properties props = new Properties();
+ props.put("name", "client");
+ ComponentInstance client = null;
+ try {
+ client = fact1.createComponentInstance(props, sc2);
+ } catch(Exception e) { fail("Cannot instantiate the client : " + e.getMessage()); }
+
+ Factory fact2 = Utils.getFactoryByName(sc1, "FooProviderType-1");
+ Properties props2 = new Properties();
+ props2.put("name", "provider");
+ ComponentInstance provider = null;
+ try {
+ provider = fact2.createComponentInstance(props2, sc2);
+ } catch(Exception e) {
+ fail("Cannot instantiate the provider : " + e.getMessage());
+ }
+
+ ServiceReference ref = sc2.getServiceReference(CheckService.class.getName());
+ CheckService check = (CheckService) sc2.getService(ref);
+
+ assertTrue("Check invocation", check.check());
+
+ sc2.ungetService(ref);
+
+ // Check visibility
+ assertNotNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNotNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ // Check invisibilty
+ assertNull("Check foo service invisible inside the composite 1", sc1.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service invisible inside the composite 1", sc1.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+
+ client.dispose();
+ provider.dispose();
+
+ assertNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the composite 1", sc1.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service invisible inside the composite 1", sc1.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+ empty2.dispose();
+ }
+
+ public void testLevelTwo3() {
+ ServiceContext sc1 = Utils.getServiceContext(empty);
+ Factory fact = Utils.getFactoryByName(sc1, "composite.empty");
+ Properties p = new Properties();
+ p.put("name", "empty2");
+ ComponentInstance empty2 = null;
+ try {
+ empty2 = fact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate empty2 instance : " + e.getMessage());
+ }
+
+ ServiceContext sc2 = Utils.getServiceContext(empty2);
+
+ Factory fact1 = Utils.getFactoryByName(context, "SimpleCheckServiceProvider");
+ Properties props = new Properties();
+ props.put("name", "client");
+ ComponentInstance client = null;
+ try {
+ client = fact1.createComponentInstance(props, sc2);
+ } catch(Exception e) { fail("Cannot instantiate the client : " + e.getMessage()); }
+
+ Factory fact2 = Utils.getFactoryByName(context, "FooProviderType-1");
+ Properties props2 = new Properties();
+ props2.put("name", "provider");
+ ComponentInstance provider = null;
+ try {
+ provider = fact2.createComponentInstance(props2, sc2);
+ } catch(Exception e) {
+ fail("Cannot instantiate the provider : " + e.getMessage());
+ }
+
+ ServiceReference ref = sc2.getServiceReference(CheckService.class.getName());
+ CheckService check = (CheckService) sc2.getService(ref);
+
+ assertTrue("Check invocation", check.check());
+
+ sc2.ungetService(ref);
+
+ // Check visibility
+ assertNotNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNotNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ // Check invisibilty
+ assertNull("Check foo service invisible inside the composite 1", sc1.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service invisible inside the composite 1", sc1.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+
+ client.dispose();
+ provider.dispose();
+
+ assertNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the composite 1", sc1.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service invisible inside the composite 1", sc1.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+ empty2.dispose();
+ }
+
+ public void testLevelTwo4() {
+ ServiceContext sc1 = Utils.getServiceContext(empty);
+ Factory fact = Utils.getFactoryByName(sc1, "composite.empty");
+ Properties p = new Properties();
+ p.put("name", "empty2");
+ ComponentInstance empty2 = null;
+ try {
+ empty2 = fact.createComponentInstance(p);
+ } catch(Exception e) {
+ fail("Cannot instantiate empty2 instance : " + e.getMessage());
+ }
+
+ ServiceContext sc2 = Utils.getServiceContext(empty2);
+
+ Factory fact1 = Utils.getFactoryByName(sc2, "SimpleCheckServiceProvider");
+ Properties props = new Properties();
+ props.put("name", "client");
+ ComponentInstance client = null;
+ try {
+ client = fact1.createComponentInstance(props, sc2);
+ } catch(Exception e) { fail("Cannot instantiate the client : " + e.getMessage()); }
+
+ Factory fact2 = Utils.getFactoryByName(sc2, "FooProviderType-1");
+ Properties props2 = new Properties();
+ props2.put("name", "provider");
+ ComponentInstance provider = null;
+ try {
+ provider = fact2.createComponentInstance(props2, sc2);
+ } catch(Exception e) {
+ fail("Cannot instantiate the provider : " + e.getMessage());
+ }
+
+ ServiceReference ref = sc2.getServiceReference(CheckService.class.getName());
+ CheckService check = (CheckService) sc2.getService(ref);
+
+ assertTrue("Check invocation", check.check());
+
+ sc2.ungetService(ref);
+
+ // Check visibility
+ assertNotNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNotNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ // Check invisibilty
+ assertNull("Check foo service invisible inside the composite 1", sc1.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service invisible inside the composite 1", sc1.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+
+ client.dispose();
+ provider.dispose();
+
+ assertNull("Check foo service visible inside the composite 2", sc2.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service visible inside the composite 2", sc2.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the composite 1", sc1.getServiceReference(FooService.class.getName()));
+ assertNull("Check check service invisible inside the composite 1", sc1.getServiceReference(CheckService.class.getName()));
+ assertNull("Check foo service invisible inside the global", context.getServiceReference(FooService.class.getName()));
+ try {
+ assertNull("Check check service invisible inside the context", context.getServiceReferences(CheckService.class.getName(), "(instance.name=client)"));
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e);
+ }
+ empty2.dispose();
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/ServiceRegistryTest.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/ServiceRegistryTest.java
new file mode 100644
index 0000000..0b76bcb
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/infrastructure/ServiceRegistryTest.java
@@ -0,0 +1,245 @@
+/*
+ * 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.test.composite.infrastructure;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.InstanceStateListener;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.context.ServiceRegistry;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceEvent;
+import org.osgi.framework.ServiceListener;
+import org.osgi.framework.ServiceReference;
+import org.osgi.framework.ServiceRegistration;
+
+public class ServiceRegistryTest extends OSGiTestCase {
+
+ private class svcListener implements ServiceListener {
+ public int registration = 0;
+ public int unregistration = 0;
+ public int modification = 0;
+ public void serviceChanged(ServiceEvent ev) {
+ if(ev.getType() == ServiceEvent.REGISTERED) { registration++; }
+ if(ev.getType() == ServiceEvent.UNREGISTERING) { unregistration++; }
+ if(ev.getType() == ServiceEvent.MODIFIED) { modification++; }
+ }
+ }
+
+ private class barProvider implements BarService {
+
+ public boolean bar() { return true; }
+
+ public Properties getProps() { return null; }
+
+ }
+
+ private class FakeComponent implements ComponentInstance {
+
+ public ComponentTypeDescription getComponentDescription() {
+ return null;
+ }
+
+ public BundleContext getContext() {
+ return null;
+ }
+
+ public ComponentFactory getFactory() {
+ return null;
+ }
+
+ public InstanceDescription getInstanceDescription() {
+ return null;
+ }
+
+ public String getInstanceName() {
+ return null;
+ }
+
+ public int getState() {
+ return 0;
+ }
+
+ public boolean isStarted() {
+ return false;
+ }
+
+ public void reconfigure(Dictionary dictionary) { }
+
+ public void start() { }
+
+ public void stop() { }
+
+ public void dispose() { }
+
+ public void addInstanceStateListener(InstanceStateListener arg0) { }
+
+ public void removeInstanceStateListener(InstanceStateListener arg0) { }
+
+ }
+
+ public void testRegistrationAndListener() {
+ ComponentInstance im = new FakeComponent();
+ ComponentInstance im2 = new FakeComponent();
+ ServiceRegistry registry = new ServiceRegistry(context);
+ assertNotNull("Assert registry not null", registry);
+ svcListener all = new svcListener();
+ try {
+ assertNull("Check that there is no available service", registry.getServiceReferences(null, null));
+ } catch (InvalidSyntaxException e) { fail("Cannot query the registry : " + e.getMessage()); }
+ registry.addServiceListener(all);
+
+ ServiceRegistration reg1 = registry.registerService(im, BarService.class.getName(), new barProvider(), null);
+
+ try {
+ assertEquals("Check number of registred service", 1, registry.getServiceReferences(null, null).length);
+ } catch (InvalidSyntaxException e) { fail("Cannot query the registry : " + e.getMessage());
+ }
+
+ ServiceRegistration reg2 = registry.registerService(im2, BarService.class.getName(), new barProvider(), null);
+
+ try {
+ assertEquals("Check number of registred service", 2, registry.getServiceReferences(null, null).length);
+ } catch (InvalidSyntaxException e) { fail("Cannot query the registry : " + e.getMessage()); }
+
+ assertEquals("Check the number of registration", 2, all.registration);
+
+ Properties props = new Properties();
+ props.put("foo", "bar");
+ reg1.setProperties(props);
+ assertEquals("Check the number of modification", 1, all.modification);
+
+ reg1.unregister();
+ assertEquals("Check the number of unregistration", 1, all.unregistration);
+
+ reg2.setProperties(props);
+ assertEquals("Check the number of modification", 2, all.modification);
+
+ reg2.unregister();
+ assertEquals("Check the number of unregistration", 2, all.unregistration);
+
+ registry.removeServiceListener(all);
+ }
+
+ public void testRegistrationAndFilter() {
+ ComponentInstance im = new FakeComponent();
+ ComponentInstance im2 = new FakeComponent();
+ ServiceRegistry registry = new ServiceRegistry(context);
+ svcListener filtered = new svcListener();
+
+ try {
+ assertNull("Check that there is no available service", registry.getServiceReferences(null, null));
+ } catch (InvalidSyntaxException e) { fail("Cannot query the registry : " + e.getMessage()); }
+
+ registry.addServiceListener(filtered, "(foo=bar)");
+
+ Properties props = new Properties();
+ props.put("foo", "bar");
+ ServiceRegistration reg1 = registry.registerService(im, BarService.class.getName(), new barProvider(), props);
+
+ try {
+ assertEquals("Check number of registred service", 1, registry.getServiceReferences(null, null).length);
+ } catch (InvalidSyntaxException e) { fail("Cannot query the registry : " + e.getMessage()); }
+
+ ServiceRegistration reg2 = registry.registerService(im2, BarService.class.getName(), new barProvider(), null);
+
+ try {
+ assertEquals("Check number of registred service", 2, registry.getServiceReferences(null, null).length);
+ } catch (InvalidSyntaxException e) { fail("Cannot query the registry : " + e.getMessage()); }
+
+ assertEquals("Check the number of registration", 1, filtered.registration);
+
+ reg2.setProperties(props);
+ assertEquals("Check the number of modification", 1, filtered.modification);
+ // Follow the OSGi semantics of filters
+
+ reg1.unregister();
+ reg2.unregister();
+ assertEquals("Check the number of unregistration", 2, filtered.unregistration);
+ registry.removeServiceListener(filtered);
+ }
+
+ public void testGetService() {
+ ComponentInstance im = new FakeComponent();
+ ComponentInstance im2 = new FakeComponent();
+ ServiceRegistry registry = new ServiceRegistry(context);
+
+ try {
+ assertNull("Check that there is no available service", registry.getServiceReferences(null, null));
+ } catch (InvalidSyntaxException e) { fail("Cannot query the registry : " + e.getMessage()); }
+
+ Properties props = new Properties();
+ props.put("foo", "bar");
+ ServiceRegistration reg1 = registry.registerService(im, BarService.class.getName(), new barProvider(), props);
+
+ ServiceReference ref = registry.getServiceReference(BarService.class.getName());
+ assertNotNull("Check ref not null", ref);
+ assertEquals("Test property", ref.getProperty("foo"), "bar");
+ BarService bar = (BarService) registry.getService(im2, ref);
+ assertTrue("Test invocation", bar.bar());
+
+ reg1.unregister();
+ ref = registry.getServiceReference(BarService.class.getName());
+ assertNull("Check ref null", ref);
+ }
+
+ public void testGetFilteredService() {
+ ComponentInstance im = new FakeComponent();
+ ComponentInstance im2 = new FakeComponent();
+ ServiceRegistry registry = new ServiceRegistry(context);
+
+ try {
+ assertNull("Check that there is no available service", registry.getServiceReferences(null, null));
+ } catch (InvalidSyntaxException e) { fail("Cannot query the registry : " + e.getMessage()); }
+
+ Properties props = new Properties();
+ props.put("foo", "bar");
+ ServiceRegistration reg1 = registry.registerService(im, BarService.class.getName(), new barProvider(), props);
+ ServiceRegistration reg2 = registry.registerService(im2, BarService.class.getName(), new barProvider(), null);
+
+ ServiceReference[] ref = null;
+ try {
+ ref = registry.getServiceReferences(BarService.class.getName(), "(foo=bar)");
+ } catch (InvalidSyntaxException e) { fail("Registry query fail : " + e.getMessage()); }
+ assertNotNull("Check ref not null", ref);
+ assertEquals("Check ref count", ref.length, 1);
+ assertEquals("Test property", ref[0].getProperty("foo"), "bar");
+ BarService bar = (BarService) registry.getService(im2, ref[0]);
+ assertTrue("Test invocation", bar.bar());
+
+ ref = null;
+ reg1.unregister();
+ try {
+ ref = registry.getServiceReferences(BarService.class.getName(), "(bar=foo)");
+ } catch (InvalidSyntaxException e) { fail("Registry query fail : " + e.getMessage()); }
+ assertNull("Check ref null", ref);
+
+ reg2.unregister();
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instance/SimpleInstance.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instance/SimpleInstance.java
new file mode 100644
index 0000000..433f62f
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instance/SimpleInstance.java
@@ -0,0 +1,267 @@
+/*
+ * 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.test.composite.instance;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class SimpleInstance extends OSGiTestCase {
+
+ private ComponentFactory fooFactory1, fooFactory2;
+ private ComponentFactory compoFactory;
+ private ComponentInstance empty;
+
+
+ public void setUp() {
+ fooFactory1 = (ComponentFactory) Utils.getFactoryByName(context, "FooProviderType-1");
+ fooFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "FooProviderType-Dyn2");
+ compoFactory = (ComponentFactory) Utils.getFactoryByName(context, "composite.inst.1");
+ Factory fact = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty-X");
+ try {
+ empty = fact.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot create the empty composite : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ empty.dispose();
+ empty = null;
+ }
+
+ public void testCreation() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = compoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("Cannot instantiate under from " + compoFactory.getName() + " -> " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailability() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = compoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(under);
+
+ assertNotNull("Check service availability", sc.getServiceReference(FooService.class.getName()));
+ assertEquals("Check service provider", Utils.getServiceReferences(sc, FooService.class.getName(), null).length, 2);
+
+ under.dispose();
+ }
+
+ public void testCreationLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = compoFactory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailabilityLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under-X");
+ ComponentInstance under = null;
+ try {
+ under = compoFactory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc2 = Utils.getServiceContext(under);
+
+ assertNotNull("Check service availability", sc2.getServiceReference(FooService.class.getName()));
+ assertEquals("Check service providers", Utils.getServiceReferences(sc2, FooService.class.getName(), null).length, 2);
+
+ under.dispose();
+ }
+
+ public void testFactoryManagement() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = compoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+
+ fooFactory1.stop();
+ assertTrue("Check instance invalidity - 2", under.getState() == ComponentInstance.INVALID);
+
+ fooFactory1.start();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+
+ fooFactory2.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.INVALID);
+
+ fooFactory2.start();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+
+ under.dispose();
+ fooFactory1.start();
+ fooFactory2.start();
+ }
+
+ public void testFactoryManagementLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = compoFactory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+
+ fooFactory1.stop();
+ assertTrue("Check instance invalidity - 2", under.getState() == ComponentInstance.INVALID);
+
+ fooFactory1.start();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+
+ fooFactory2.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.INVALID);
+
+ fooFactory2.start();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+
+ under.dispose();
+ fooFactory1.start();
+ fooFactory2.start();
+ }
+
+ public void atestArchitecture() { //TODO : to reactive
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = compoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ ServiceReference ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ Architecture arch = (Architecture) context.getService(ref);
+ InstanceDescription id = arch.getInstanceDescription();
+
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ InstanceDescription[] contained = id.getContainedInstances();
+ assertEquals("Check contained instances count (" + contained.length + ")", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ fact3.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.INVALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.INVALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 0);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ fact1.start();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurableInstantiation.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurableInstantiation.java
new file mode 100644
index 0000000..a7de283
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/ConfigurableInstantiation.java
@@ -0,0 +1,101 @@
+/*
+ * 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.test.composite.instantiator;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class ConfigurableInstantiation extends OSGiTestCase {
+
+ private ComponentFactory acceptF;
+ private ComponentFactory refuse1F;
+ private ComponentFactory refuse2F;
+
+ public void setUp() {
+ acceptF = (ComponentFactory) Utils.getFactoryByName(context, "composite.bar.5-accept");
+ refuse1F = (ComponentFactory) Utils.getFactoryByName(context, "composite.bar.5-refuse1");
+ refuse2F = (ComponentFactory) Utils.getFactoryByName(context, "composite.bar.5-refuse2");
+
+ }
+
+ public void tearDown() { }
+
+ public void testAccept() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = acceptF.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(under);
+ ServiceReference ref = sc.getServiceReference(FooService.class.getName());
+ assertNotNull("Check refs not null", ref);
+ FooService foo = (FooService) sc.getService(ref);
+ Properties p = foo.fooProps();
+ boolean b = ((Boolean) p.get("boolProp")).booleanValue();
+ String s = (String) p.get("strProp");
+ int i = ( (Integer) p.get("intProp")).intValue();
+ assertTrue("Test boolean", b);
+ assertEquals("Test string", s, "foo");
+
+ assertEquals("Test int", i, 5); // The code fix to 5.
+ under.dispose();
+ }
+
+ public void testRefuse1() {
+ Properties props = new Properties();
+ props.put("name", "under-ref1");
+ ComponentInstance under = null;
+ try {
+ under = refuse1F.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+
+ assertTrue("Check that under is not valid", under.getState() == ComponentInstance.INVALID);
+
+ under.dispose();
+ }
+
+ public void testRefuse2() {
+ Properties props = new Properties();
+ props.put("name", "under-ref2");
+ ComponentInstance under = null;
+ try {
+ under = refuse2F.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+
+ assertTrue("Check that under is not valid", under.getState() == ComponentInstance.INVALID);
+
+ under.dispose();
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java
new file mode 100644
index 0000000..7497b3a
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/InstantiatorTestSuite.java
@@ -0,0 +1,38 @@
+/*
+ * 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.test.composite.instantiator;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class InstantiatorTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Composite Service Instantiation Test Suite", bc);
+ ots.addTestSuite(SimpleInstantiation.class);
+ ots.addTestSuite(OptionalInstantiation.class);
+ ots.addTestSuite(MultipleInstantiation.class);
+ ots.addTestSuite(OptionalMultipleInstantiation.class);
+ ots.addTestSuite(ConfigurableInstantiation.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/MultipleInstantiation.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/MultipleInstantiation.java
new file mode 100644
index 0000000..066f29d
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/MultipleInstantiation.java
@@ -0,0 +1,288 @@
+/*
+ * 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.test.composite.instantiator;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.osgi.framework.ServiceReference;
+
+public class MultipleInstantiation extends OSGiTestCase {
+
+ private ComponentFactory bar2Factory;
+ private ComponentInstance empty;
+
+ public void setUp() {
+ bar2Factory = (ComponentFactory) Utils.getFactoryByName(context, "composite.bar.2");
+ Factory fact = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty");
+ try {
+ empty = fact.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot create the empty composite : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ empty.dispose();
+ empty = null;
+ }
+
+ public void testCreation() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailability() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(under);
+ assertNotNull("Check service availability", sc.getServiceReference(BarService.class.getName()));
+ int count = Utils.getServiceReferences(sc, BarService.class.getName(), null).length;
+ assertEquals("Check service provider number : " + count, count, 3);
+
+ under.dispose();
+ }
+
+ public void testCreationLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailabilityLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc2 = Utils.getServiceContext(under);
+ assertNotNull("Check service availability", sc2.getServiceReference(BarService.class.getName()));
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 3);
+
+ under.dispose();
+ }
+
+ public void testFactoryManagement() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ ServiceContext sc = Utils.getServiceContext(under);
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc, BarService.class.getName(), null).length, 2);
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc, BarService.class.getName(), null).length, 1);
+
+ fact3.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.INVALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc, BarService.class.getName(), null).length, 0);
+
+ fact1.start();
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc, BarService.class.getName(), null).length, 1);
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+ public void testFactoryManagementLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc2 = Utils.getServiceContext(under);
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 2);
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 1);
+
+ fact3.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.INVALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 0);
+
+ fact1.start();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 1);
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+ public void testArchitecture() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ ServiceReference ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ Architecture arch = (Architecture) context.getService(ref);
+ InstanceDescription id = arch.getInstanceDescription();
+
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ InstanceDescription[] contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 3);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 2);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
+
+ fact3.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.INVALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.INVALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 0);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
+
+ fact1.start();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.2");
+
+ context.ungetService(ref);
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalInstantiation.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalInstantiation.java
new file mode 100644
index 0000000..64f80f9
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalInstantiation.java
@@ -0,0 +1,279 @@
+/*
+ * 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.test.composite.instantiator;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalInstantiation extends OSGiTestCase {
+
+ private ComponentFactory bar1Factory;
+ private ComponentInstance empty;
+
+ public void setUp() {
+ bar1Factory = (ComponentFactory) Utils.getFactoryByName(context, "composite.bar.3");
+ Factory fact = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty");
+ try {
+ empty = fact.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot create the empty composite : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ empty.dispose();
+ empty = null;
+ }
+
+ public void testCreation() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailability() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(under);
+ assertNotNull("Check service availability", sc.getServiceReference(BarService.class.getName()));
+
+ under.dispose();
+ }
+
+ public void testCreationLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailabilityLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc2 = Utils.getServiceContext(under);
+ assertNotNull("Check service availability", sc2.getServiceReference(BarService.class.getName()));
+
+ under.dispose();
+ }
+
+ public void testFactoryManagement() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+
+ fact3.stop();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(under);
+ assertNull("Check that no Bar Service is available", sc.getServiceReference(BarService.class.getName()));
+
+ fact1.start();
+ assertTrue("Check instance validity - 5", under.getState() == ComponentInstance.VALID);
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+ public void testFactoryManagementLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+
+ fact3.stop();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+
+ fact1.start();
+ assertTrue("Check instance validity - 5", under.getState() == ComponentInstance.VALID);
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+ public void testArchitecture() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+
+ ServiceReference ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ Architecture arch = (Architecture) context.getService(ref);
+ assertNotNull("Check architecture", arch);
+ InstanceDescription id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ InstanceDescription[] contained = id.getContainedInstances();
+ assertNotNull("Check contained not null", contained);
+ assertEquals("Check contained instances count ("+contained.length+") - 1", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
+
+ fact3.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 0);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
+
+ fact1.start();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.3");
+
+ context.ungetService(ref);
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalMultipleInstantiation.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalMultipleInstantiation.java
new file mode 100644
index 0000000..19984d0
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/OptionalMultipleInstantiation.java
@@ -0,0 +1,203 @@
+/*
+ * 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.test.composite.instantiator;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+
+public class OptionalMultipleInstantiation extends OSGiTestCase {
+
+ private ComponentFactory bar2Factory;
+ private ComponentInstance empty;
+
+ public void setUp() {
+ bar2Factory = (ComponentFactory) Utils.getFactoryByName(context, "composite.bar.4");
+ assertNotNull("Check bar2factory availability", bar2Factory);
+
+ Factory fact = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty");
+ try {
+ empty = fact.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot create the empty composite : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ empty.dispose();
+ empty = null;
+ }
+
+ public void testCreation() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailability() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(under);
+ assertNotNull("Check service availability", sc.getServiceReference(BarService.class.getName()));
+ int count = Utils.getServiceReferences(sc, BarService.class.getName(), null).length;
+ assertEquals("Check service provider number : " + count, count, 3);
+
+ under.dispose();
+ }
+
+ public void testCreationLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailabilityLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc2 = Utils.getServiceContext(under);
+ assertNotNull("Check service availability", sc2.getServiceReference(BarService.class.getName()));
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 3);
+
+ under.dispose();
+ }
+
+ public void testFactoryManagement() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ ServiceContext sc = Utils.getServiceContext(under);
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc, BarService.class.getName(), null).length, 2);
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc, BarService.class.getName(), null).length, 1);
+
+ fact3.stop();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc, BarService.class.getName(), null).length, 0);
+
+ fact1.start();
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc, BarService.class.getName(), null).length, 1);
+ assertTrue("Check instance validity - 5", under.getState() == ComponentInstance.VALID);
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+ public void testFactoryManagementLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar2Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc2 = Utils.getServiceContext(under);
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 2);
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 1);
+
+ fact3.stop();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 0);
+
+ fact1.start();
+ assertTrue("Check instance validity - 5", under.getState() == ComponentInstance.VALID);
+ assertEquals("Check service provider number", Utils.getServiceReferences(sc2, BarService.class.getName(), null).length, 1);
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/SimpleInstantiation.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/SimpleInstantiation.java
new file mode 100644
index 0000000..14b1e1d
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/instantiator/SimpleInstantiation.java
@@ -0,0 +1,265 @@
+/*
+ * 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.test.composite.instantiator;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.osgi.framework.ServiceReference;
+
+public class SimpleInstantiation extends OSGiTestCase {
+
+ private ComponentFactory bar1Factory;
+ private ComponentInstance empty;
+
+ public void setUp() {
+ bar1Factory = (ComponentFactory) Utils.getFactoryByName(context, "composite.bar.1");
+ Factory fact = Utils.getFactoryByName(context, "composite.empty");
+ Properties props = new Properties();
+ props.put("name", "empty-X");
+ try {
+ empty = fact.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot create the empty composite : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ empty.dispose();
+ empty = null;
+ }
+
+ public void testCreation() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailability() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc = Utils.getServiceContext(under);
+ assertNotNull("Check service availability", sc.getServiceReference(BarService.class.getName()));
+
+ under.dispose();
+ }
+
+ public void testCreationLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ under.dispose();
+ }
+
+ public void testServiceAvailabilityLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under-X");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity", under.getState() == ComponentInstance.VALID);
+ ServiceContext sc2 = Utils.getServiceContext(under);
+ assertNotNull("Check service availability", sc2.getServiceReference(BarService.class.getName()));
+
+ under.dispose();
+ }
+
+ public void testFactoryManagement() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+
+ fact3.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.INVALID);
+
+ fact1.start();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+ public void testFactoryManagementLevel2() {
+ ServiceContext sc = Utils.getServiceContext(empty);
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props, sc);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ assertTrue("Check instance validity - 1", under.getState() == ComponentInstance.VALID);
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+
+ fact3.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.INVALID);
+
+ fact1.start();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+ public void testArchitecture() {
+ Properties props = new Properties();
+ props.put("name", "under");
+ ComponentInstance under = null;
+ try {
+ under = bar1Factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate under : " + e.getMessage());
+ }
+ ServiceReference ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ Architecture arch = (Architecture) context.getService(ref);
+ InstanceDescription id = arch.getInstanceDescription();
+
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ InstanceDescription[] contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ ComponentFactory fact1 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-1");
+ ComponentFactory fact2 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-2");
+ ComponentFactory fact3 = (ComponentFactory) Utils.getFactoryByName(context, "FooBarProviderType-3");
+
+ fact1.stop();
+ assertTrue("Check instance validity - 2", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ fact2.stop();
+ assertTrue("Check instance validity - 3", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ fact3.stop();
+ assertTrue("Check instance invalidity", under.getState() == ComponentInstance.INVALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.INVALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 0);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ fact1.start();
+ assertTrue("Check instance validity - 4", under.getState() == ComponentInstance.VALID);
+ ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "under");
+ assertNotNull("Check architecture availability", ref);
+ arch = (Architecture) context.getService(ref);
+ id = arch.getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ contained = id.getContainedInstances();
+ assertEquals("Check contained instances count", contained.length, 1);
+ assertEquals("Check that no object are created" , id.getCreatedObjects().length, 0);
+ assertEquals("Check instance name" , id.getName(), "under");
+ assertEquals("Check component type name" , id.getComponentDescription().getName(), "composite.bar.1");
+
+ under.dispose();
+ fact2.start();
+ fact3.start();
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/ProvidesTestSuite.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/ProvidesTestSuite.java
new file mode 100644
index 0000000..413ff58
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/ProvidesTestSuite.java
@@ -0,0 +1,43 @@
+/*
+ * 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.test.composite.provides;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class ProvidesTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Composite Service Providing Test Suite", bc);
+ ots.addTestSuite(TestComp0.class);
+ ots.addTestSuite(TestComp1.class);
+ ots.addTestSuite(TestComp2.class);
+ ots.addTestSuite(TestComp3.class);
+ ots.addTestSuite(TestComp4.class);
+ ots.addTestSuite(TestComp5.class);
+ ots.addTestSuite(TestComp6.class);
+ ots.addTestSuite(TestComp7.class);
+ ots.addTestSuite(TestComp8.class);
+
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp0.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp0.java
new file mode 100644
index 0000000..6d5458d
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp0.java
@@ -0,0 +1,338 @@
+/*
+ * 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.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.service.Toto;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp0 extends OSGiTestCase {
+
+ private ComponentFactory tataFactory;
+ private ComponentFactory totoFactory;
+ private ComponentFactory tataFactory2;
+
+ private ComponentInstance totoProv, totoProv2;
+ private ComponentInstance under;
+
+ public void setUp() {
+ tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+ totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+ tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+ tataFactory2.stop();
+ tataFactory.stop();
+
+ Properties props = new Properties();
+ props.put("name", "toto provider");
+ try {
+ totoProv = totoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot create an instance : " + e.getMessage());
+ }
+
+ Properties props3 = new Properties();
+ props3.put("name", "toto provider 2");
+ try {
+ totoProv2 = totoFactory.createComponentInstance(props3);
+ } catch(Exception e) {
+ fail("Cannot create an instance : " + e.getMessage());
+ }
+
+ totoProv.stop();
+ totoProv2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "comp-0");
+ Properties props2 = new Properties();
+ props2.put("name", "ff");
+ try {
+ under = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ fail("Cannot create an instance : " + e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ tataFactory.start();
+ totoProv.dispose();
+ totoProv = null;
+ totoProv2.dispose();
+ totoProv2 = null;
+ tataFactory2.start();
+
+ // Reset counters
+ TotoProvider.toto = 0;
+ TotoProvider.toto_2 = 0;
+ TotoProvider.toto_3 = 0;
+ TotoProvider.toto_4 = 0;
+ TotoProvider.toto1 = 0;
+ }
+
+ public void testSimple() {
+ // Neither factory nor instance
+ assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+
+ // Start the importer
+ totoProv.start();
+ assertNotNull("Assert toto service - 1", context.getServiceReference(Toto.class.getName()));
+ assertTrue("Assert under state - 2", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+
+ // Start the factory
+ tataFactory.start();
+ assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+ ServiceReference ref = context.getServiceReference(Tota.class.getName());
+ Tota tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ Properties props = tota.getProps();
+ Integer toto = (Integer) props.get("toto");
+ Integer toto_2 = (Integer) props.get("toto_2");
+ Integer toto_3 = (Integer) props.get("toto_3");
+ Integer toto_4 = (Integer) props.get("toto_4");
+ assertEquals("Assert toto - 3", toto.intValue(), 1);
+ assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+ assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+ assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ Integer tata = (Integer) props.get("tata");
+ Integer tataStr = (Integer) props.get("tataStr");
+ Integer tataStrs = (Integer) props.get("tataStrs");
+ Integer tata_2 = (Integer) props.get("tata_2");
+ Integer tata_3 = (Integer) props.get("tata_3");
+ Integer tata1 = (Integer) props.get("tata1");
+ Integer tata1_1 = (Integer) props.get("tata1_1");
+ Integer tata5 = (Integer) props.get("tata5");
+ Integer tata5_1 = (Integer) props.get("tata5_1");
+ Integer tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 3", tata.intValue(), 1);
+ assertEquals("Assert tataStr - 3", tataStr.intValue(), 1);
+ assertEquals("Assert tataStrs - 3", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 3", tata_2.intValue(), 1);
+ assertEquals("Assert tata_3 - 3", tata_3.intValue(), 1);
+ assertEquals("Assert tata1 - 3", tata1.intValue(), 1);
+ assertEquals("Assert tata1_1 - 3", tata1_1.intValue(), 1);
+ assertEquals("Assert tata5 - 3", tata5.intValue(), 1);
+ assertEquals("Assert tata5_1 - 3", tata5_1.intValue(), 1);
+ assertEquals("Assert tata5_2 - 3", tata5_2.intValue(), 1);
+
+ context.ungetService(ref);
+ tota = null;
+
+ // Start a second import
+ totoProv2.start();
+ assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ assertEquals("Assert toto - 4", toto.intValue(), 2);
+ assertEquals("Assert toto_2 - 4", toto_2.intValue(), 2);
+ assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+ assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ tataStr = (Integer) props.get("tataStr");
+ tataStrs = (Integer) props.get("tataStrs");
+ tata_2 = (Integer) props.get("tata_2");
+ tata_3 = (Integer) props.get("tata_3");
+ tata1 = (Integer) props.get("tata1");
+ tata1_1 = (Integer) props.get("tata1_1");
+ tata5 = (Integer) props.get("tata5");
+ tata5_1 = (Integer) props.get("tata5_1");
+ tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 4", tata.intValue(), 2);
+ assertEquals("Assert tataStr - 4", tataStr.intValue(), 2);
+ assertEquals("Assert tataStrs - 4", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 4", tata_2.intValue(), 2);
+ assertEquals("Assert tata_3 - 4", tata_3.intValue(), 2);
+ assertEquals("Assert tata1 - 4", tata1.intValue(), 2);
+ assertEquals("Assert tata1_1 - 4", tata1_1.intValue(), 2);
+ assertEquals("Assert tata5 - 4", tata5.intValue(), 2);
+ assertEquals("Assert tata5_1 - 4", tata5_1.intValue(), 2);
+ assertEquals("Assert tata5_2 - 4", tata5_2.intValue(), 2);
+
+ context.ungetService(ref);
+ tota = null;
+
+ tataFactory.stop();
+ assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+
+ totoProv2.stop();
+ tataFactory.start();
+ assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ assertEquals("Assert toto - 6", toto.intValue(), 3);
+ assertEquals("Assert toto_2 - 6", toto_2.intValue(), 3);
+ assertEquals("Assert toto_3 - 6", toto_3.intValue(), 3);
+ assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ tataStr = (Integer) props.get("tataStr");
+ tataStrs = (Integer) props.get("tataStrs");
+ tata_2 = (Integer) props.get("tata_2");
+ tata_3 = (Integer) props.get("tata_3");
+ tata1 = (Integer) props.get("tata1");
+ tata1_1 = (Integer) props.get("tata1_1");
+ tata5 = (Integer) props.get("tata5");
+ tata5_1 = (Integer) props.get("tata5_1");
+ tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 6", tata.intValue(), 1);
+ assertEquals("Assert tataStr - 6", tataStr.intValue(), 1);
+ assertEquals("Assert tataStrs - 6", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 6", tata_2.intValue(), 1);
+ assertEquals("Assert tata_3 - 6", tata_3.intValue(), 1);
+ assertEquals("Assert tata1 - 6", tata1.intValue(), 1);
+ assertEquals("Assert tata1_1 - 6", tata1_1.intValue(), 1);
+ assertEquals("Assert tata5 - 6", tata5.intValue(), 1);
+ assertEquals("Assert tata5_1 - 6", tata5_1.intValue(), 1);
+ assertEquals("Assert tata5_2 - 6", tata5_2.intValue(), 1);
+
+ context.ungetService(ref);
+ tota = null;
+
+ // Is arch exposed
+ assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+
+ totoProv.stop();
+
+ assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+ assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+ assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+
+ under.dispose();
+ under = null;
+ }
+
+
+
+ private void invoke(Tota tota) {
+ tota.tata();
+
+ assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+ assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+ assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+ assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+ assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+ assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+ assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+ assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+
+ }
+
+ private void invokeArrays(Tota tota) {
+
+ int[] a = new int[] {1,2,3};
+ assertEquals("Assert invoke tataint[]", tota.tataInts(a), a);
+
+ long[] b = new long[] {1,2,3};
+ assertEquals("Assert invoke tataLong[]", tota.tataLongs(b), b);
+
+ double[] c = new double[] {1,2,3};
+ assertEquals("Assert invoke tataDouble[]", tota.tataDoubles(c), c);
+
+ char[] d = new char[] {'a','b', 'c'};
+ assertEquals("Assert invoke tataChar[]", tota.tataChars(d), d);
+
+ boolean[] e = new boolean[] {true, false};
+ assertEquals("Assert invoke tataBoolean[]", tota.tataBooleans(e), e);
+
+ byte[] f = new byte[] {(byte) 1};
+ assertEquals("Assert invoke tataByte[]", tota.tataBytes(f), f);
+
+ short[] g = new short[] {(short) 1};
+ assertEquals("Assert invoke tataShort[]", tota.tataShorts(g), g);
+
+ float[] h = new float[] {5,6,7};
+ assertEquals("Assert invoke tataFloat[]", tota.tataFloats(h), h);
+
+ }
+
+ private void invokeStr(Tota tota) {
+ tota.tataStr();
+ }
+
+ private void invokeTata(Tota tota) {
+ tota.tata(1,2);
+ tota.tata("tototototo");
+ }
+
+ private void invokeTata1(Tota tota) {
+ assertEquals("Assert tata1", tota.tata1("foo"), "foo");
+ assertEquals("Assert tata1 - 2", tota.tata1(new char[] {'a','b','c'}), "abc");
+ }
+
+ private void invokeTata5(Tota tota) {
+ assertEquals("Assert tata5 -1", tota.tata5("foo",1), "foo"+1);
+ assertEquals("Assert tata5 - 2", tota.tata5(new String[] {"a","b","c"}, 1), "31");
+ assertEquals("Assert tata5 - 3", tota.tata5("foo", new int[] {1,2,3}), "foo3");
+ }
+
+ private void invokeAdd(Tota tota) {
+ assertEquals("Assert add", tota.add(1,1,1), 3);
+ }
+
+ private void invokeToto(Tota tota) {
+ tota.toto();
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ tota.toto(1,2);
+ }
+
+ private void invokeAll(Tota tota) {
+ invoke(tota);
+ invokeArrays(tota);
+ invokeStr(tota);
+ invokeTata(tota);
+ invokeTata1(tota);
+ invokeTata5(tota);
+ invokeAdd(tota);
+ invokeToto(tota);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp1.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp1.java
new file mode 100644
index 0000000..95d64be
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp1.java
@@ -0,0 +1,337 @@
+/*
+ * 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.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp1 extends OSGiTestCase {
+
+ private ComponentFactory tataFactory;
+ private ComponentFactory totoFactory;
+
+ private ComponentInstance totoProv, totoProv2;
+ private ComponentInstance under;
+ private ComponentFactory tataFactory2;
+
+ public void setUp() {
+ tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+ totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+ tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+ tataFactory2.stop();
+
+ tataFactory.stop();
+
+ Properties props = new Properties();
+ props.put("name", "toto provider");
+ try {
+ totoProv = totoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ Properties props3 = new Properties();
+ props3.put("name", "toto provider 2");
+ try {
+ totoProv2 = totoFactory.createComponentInstance(props3);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ totoProv.stop();
+ totoProv2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "comp-1");
+ Properties props2 = new Properties();
+ try {
+ under = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ fail("Cannot create the instance : " + e.getMessage());
+ }
+
+ }
+
+ public void tearDown() {
+ tataFactory.start();
+ totoProv.dispose();
+ totoProv = null;
+ totoProv2.dispose();
+ totoProv2 = null;
+ tataFactory2.start();
+
+ // Reset counters
+ TotoProvider.toto = 0;
+ TotoProvider.toto_2 = 0;
+ TotoProvider.toto_3 = 0;
+ TotoProvider.toto_4 = 0;
+ TotoProvider.toto1 = 0;
+ }
+
+ public void testSimple() {
+ // Neither factory nor instance
+ assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+
+ // Start the importer
+ totoProv.start();
+ assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+
+ // Start the factory
+ tataFactory.start();
+ assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+ ServiceReference ref = context.getServiceReference(Tota.class.getName());
+ Tota tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ Properties props = tota.getProps();
+ Integer toto = (Integer) props.get("toto");
+ Integer toto_2 = (Integer) props.get("toto_2");
+ Integer toto_3 = (Integer) props.get("toto_3");
+ Integer toto_4 = (Integer) props.get("toto_4");
+ assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+ assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+ assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+ assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ Integer tata = (Integer) props.get("tata");
+ Integer tataStr = (Integer) props.get("tataStr");
+ Integer tataStrs = (Integer) props.get("tataStrs");
+ Integer tata_2 = (Integer) props.get("tata_2");
+ Integer tata_3 = (Integer) props.get("tata_3");
+ Integer tata1 = (Integer) props.get("tata1");
+ Integer tata1_1 = (Integer) props.get("tata1_1");
+ Integer tata5 = (Integer) props.get("tata5");
+ Integer tata5_1 = (Integer) props.get("tata5_1");
+ Integer tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 3", tata.intValue(), 1);
+ assertEquals("Assert tataStr - 3", tataStr.intValue(), 1);
+ assertEquals("Assert tataStrs - 3", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 3", tata_2.intValue(), 1);
+ assertEquals("Assert tata_3 - 3", tata_3.intValue(), 1);
+ assertEquals("Assert tata1 - 3", tata1.intValue(), 1);
+ assertEquals("Assert tata1_1 - 3", tata1_1.intValue(), 1);
+ assertEquals("Assert tata5 - 3", tata5.intValue(), 1);
+ assertEquals("Assert tata5_1 - 3", tata5_1.intValue(), 1);
+ assertEquals("Assert tata5_2 - 3", tata5_2.intValue(), 1);
+
+ context.ungetService(ref);
+ tota = null;
+
+ // Start a second import
+ totoProv2.start();
+ assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ assertEquals("Assert toto - 4", toto.intValue(), 2);
+ assertEquals("Assert toto_2 - 4", toto_2.intValue(), 2);
+ assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+ assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ tataStr = (Integer) props.get("tataStr");
+ tataStrs = (Integer) props.get("tataStrs");
+ tata_2 = (Integer) props.get("tata_2");
+ tata_3 = (Integer) props.get("tata_3");
+ tata1 = (Integer) props.get("tata1");
+ tata1_1 = (Integer) props.get("tata1_1");
+ tata5 = (Integer) props.get("tata5");
+ tata5_1 = (Integer) props.get("tata5_1");
+ tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 4", tata.intValue(), 2);
+ assertEquals("Assert tataStr - 4", tataStr.intValue(), 2);
+ assertEquals("Assert tataStrs - 4", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 4", tata_2.intValue(), 2);
+ assertEquals("Assert tata_3 - 4", tata_3.intValue(), 2);
+ assertEquals("Assert tata1 - 4", tata1.intValue(), 2);
+ assertEquals("Assert tata1_1 - 4", tata1_1.intValue(), 2);
+ assertEquals("Assert tata5 - 4", tata5.intValue(), 2);
+ assertEquals("Assert tata5_1 - 4", tata5_1.intValue(), 2);
+ assertEquals("Assert tata5_2 - 4", tata5_2.intValue(), 2);
+
+ context.ungetService(ref);
+ tota = null;
+
+ tataFactory.stop();
+ assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+
+ totoProv2.stop();
+ tataFactory.start();
+ assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ assertEquals("Assert toto - 6", toto.intValue(), 3);
+ assertEquals("Assert toto_2 - 6", toto_2.intValue(), 3);
+ assertEquals("Assert toto_3 - 6", toto_3.intValue(), 3);
+ assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ tataStr = (Integer) props.get("tataStr");
+ tataStrs = (Integer) props.get("tataStrs");
+ tata_2 = (Integer) props.get("tata_2");
+ tata_3 = (Integer) props.get("tata_3");
+ tata1 = (Integer) props.get("tata1");
+ tata1_1 = (Integer) props.get("tata1_1");
+ tata5 = (Integer) props.get("tata5");
+ tata5_1 = (Integer) props.get("tata5_1");
+ tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 6", tata.intValue(), 1);
+ assertEquals("Assert tataStr - 6", tataStr.intValue(), 1);
+ assertEquals("Assert tataStrs - 6", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 6", tata_2.intValue(), 1);
+ assertEquals("Assert tata_3 - 6", tata_3.intValue(), 1);
+ assertEquals("Assert tata1 - 6", tata1.intValue(), 1);
+ assertEquals("Assert tata1_1 - 6", tata1_1.intValue(), 1);
+ assertEquals("Assert tata5 - 6", tata5.intValue(), 1);
+ assertEquals("Assert tata5_1 - 6", tata5_1.intValue(), 1);
+ assertEquals("Assert tata5_2 - 6", tata5_2.intValue(), 1);
+
+ context.ungetService(ref);
+ tota = null;
+
+ // Is arch exposed
+ assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), under.getInstanceName()));
+
+ totoProv.stop();
+
+ assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+ assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), under.getInstanceName()));
+ assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+
+ under.dispose();
+ under = null;
+ }
+
+
+
+ private void invoke(Tota tota) {
+ tota.tata();
+
+ assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+ assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+ assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+ assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+ assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+ assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+ assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+ assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+
+ }
+
+ private void invokeArrays(Tota tota) {
+
+ int[] a = new int[] {1,2,3};
+ assertEquals("Assert invoke tataint[]", tota.tataInts(a), a);
+
+ long[] b = new long[] {1,2,3};
+ assertEquals("Assert invoke tataLong[]", tota.tataLongs(b), b);
+
+ double[] c = new double[] {1,2,3};
+ assertEquals("Assert invoke tataDouble[]", tota.tataDoubles(c), c);
+
+ char[] d = new char[] {'a','b', 'c'};
+ assertEquals("Assert invoke tataChar[]", tota.tataChars(d), d);
+
+ boolean[] e = new boolean[] {true, false};
+ assertEquals("Assert invoke tataBoolean[]", tota.tataBooleans(e), e);
+
+ byte[] f = new byte[] {(byte) 1};
+ assertEquals("Assert invoke tataByte[]", tota.tataBytes(f), f);
+
+ short[] g = new short[] {(short) 1};
+ assertEquals("Assert invoke tataShort[]", tota.tataShorts(g), g);
+
+ float[] h = new float[] {5,6,7};
+ assertEquals("Assert invoke tataFloat[]", tota.tataFloats(h), h);
+
+ }
+
+ private void invokeStr(Tota tota) {
+ tota.tataStr();
+ }
+
+ private void invokeTata(Tota tota) {
+ tota.tata(1,2);
+ tota.tata("tototototo");
+ }
+
+ private void invokeTata1(Tota tota) {
+ assertEquals("Assert tata1", tota.tata1("foo"), "foo");
+ assertEquals("Assert tata1 - 2", tota.tata1(new char[] {'a','b','c'}), "abc");
+ }
+
+ private void invokeTata5(Tota tota) {
+ assertEquals("Assert tata5 -1", tota.tata5("foo",1), "foo"+1);
+ assertEquals("Assert tata5 - 2", tota.tata5(new String[] {"a","b","c"}, 1), "31");
+ assertEquals("Assert tata5 - 3", tota.tata5("foo", new int[] {1,2,3}), "foo3");
+ }
+
+ private void invokeAdd(Tota tota) {
+ assertEquals("Assert add", tota.add(1,1,1), 3);
+ }
+
+ private void invokeToto(Tota tota) {
+ tota.toto();
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ tota.toto(1,2);
+ }
+
+ private void invokeAll(Tota tota) {
+ invoke(tota);
+ invokeArrays(tota);
+ invokeStr(tota);
+ invokeTata(tota);
+ invokeTata1(tota);
+ invokeTata5(tota);
+ invokeAdd(tota);
+ invokeToto(tota);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp2.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp2.java
new file mode 100644
index 0000000..763080f
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp2.java
@@ -0,0 +1,232 @@
+/*
+ * 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.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp2 extends OSGiTestCase {
+
+ private ComponentFactory tataFactory;
+ private ComponentFactory totoFactory;
+
+ private ComponentInstance totoProv, totoProv2;
+ private ComponentInstance under;
+ private ComponentFactory tataFactory2;
+
+ public void setUp() {
+ tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+ totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+ tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+ tataFactory2.stop();
+ tataFactory.stop();
+
+ Properties props = new Properties();
+ props.put("name", "toto provider");
+ try {
+ totoProv = totoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ Properties props3 = new Properties();
+ props3.put("name", "toto provider 2");
+ try {
+ totoProv2 = totoFactory.createComponentInstance(props3);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ totoProv.stop();
+ totoProv2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "comp-2");
+ Properties props2 = new Properties();
+ props2.put("name", "ff");
+ try {
+ under = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public void tearDown() {
+ tataFactory.start();
+ totoProv.dispose();
+ totoProv = null;
+ totoProv2.dispose();
+ totoProv2 = null;
+ tataFactory2.start();
+
+ // Reset counters
+ TotoProvider.toto = 0;
+ TotoProvider.toto_2 = 0;
+ TotoProvider.toto_3 = 0;
+ TotoProvider.toto_4 = 0;
+ TotoProvider.toto1 = 0;
+ }
+
+ public void testSimple() {
+ // Neither factory nor instance
+ assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+
+ // Start the importer
+ totoProv.start();
+ assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+
+ // Start the factory
+ tataFactory.start();
+ assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+ ServiceReference ref = context.getServiceReference(Tota.class.getName());
+ Tota tota = (Tota) context.getService(ref);
+
+ invokeAll(tota);
+
+ // Check toto
+ Properties props = tota.getProps();
+ Integer toto = (Integer) props.get("toto");
+ Integer toto_2 = (Integer) props.get("toto_2");
+ Integer toto_3 = (Integer) props.get("toto_3");
+ Integer toto_4 = (Integer) props.get("toto_4");
+ Integer toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+ assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+ assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+ assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+ //Check tata
+ props = tota.getPropsTata();
+ Integer tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 3", tata.intValue(), 1);
+
+ context.ungetService(ref);
+ tota = null;
+
+ // Start a second import
+ totoProv2.start();
+ assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 4 ("+toto.intValue()+")", toto.intValue(), 2);
+ assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+ assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+ assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 4", toto_1.intValue(), 3);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 4", tata.intValue(), 2);
+
+ context.ungetService(ref);
+ tota = null;
+
+ tataFactory.stop();
+ assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+
+ totoProv2.stop();
+ tataFactory.start();
+ assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 6 ("+toto.intValue()+")", toto.intValue(), 3);
+ assertEquals("Assert toto_2 - 6 ("+toto_2.intValue()+")", toto_2.intValue(), 3);
+ assertEquals("Assert toto_3 - 6", toto_3.intValue(), 3);
+ assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 6", toto_1.intValue(), 4);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 6", tata.intValue(), 1);
+
+ context.ungetService(ref);
+ tota = null;
+
+ // Is arch exposed
+ assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+
+ totoProv.stop();
+
+ assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+ assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+ assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+
+ under.dispose();
+ under = null;
+ }
+
+ private void invoke(Tota tota) {
+ tota.tata();
+
+ assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+ assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+ assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+ assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+ assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+ assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+ assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+ assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+
+ }
+
+ private void invokeToto(Tota tota) {
+ tota.toto();
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ tota.toto(1,2);
+ tota.toto1("foo2");
+ }
+
+ private void invokeAll(Tota tota) {
+ invoke(tota);
+ invokeToto(tota);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp3.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp3.java
new file mode 100644
index 0000000..07ac5d3
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp3.java
@@ -0,0 +1,262 @@
+/*
+ * 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.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp3 extends OSGiTestCase {
+
+ private ComponentFactory tataFactory;
+ private ComponentFactory totoFactory;
+
+ private ComponentInstance totoProv, totoProv2;
+ private ComponentInstance under;
+ private ComponentFactory tataFactory2;
+
+ public void setUp() {
+ tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+ totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+ tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+ tataFactory2.stop();
+ tataFactory.stop();
+
+ Properties props = new Properties();
+ props.put("name", "toto provider");
+ try {
+ totoProv = totoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ Properties props3 = new Properties();
+ props3.put("name", "toto provider 2");
+ try {
+ totoProv2 = totoFactory.createComponentInstance(props3);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ totoProv.stop();
+ totoProv2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "comp-3");
+ Properties props2 = new Properties();
+ props2.put("name", "ff");
+ try {
+ under = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public void tearDown() {
+ tataFactory.start();
+ totoProv.dispose();
+ totoProv = null;
+ totoProv2.dispose();
+ totoProv2 = null;
+ tataFactory2.start();
+
+ // Reset counters
+ TotoProvider.toto = 0;
+ TotoProvider.toto_2 = 0;
+ TotoProvider.toto_3 = 0;
+ TotoProvider.toto_4 = 0;
+ TotoProvider.toto1 = 0;
+ }
+
+ public void testSimple() {
+ // Neither factory nor instance
+ assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+
+ // Start the importer
+ totoProv.start();
+ assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+
+ // Start the factory
+ tataFactory.start();
+ assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+ ServiceReference ref = context.getServiceReference(Tota.class.getName());
+ Tota tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ Properties props = tota.getProps();
+ Integer toto = (Integer) props.get("toto");
+ Integer toto_2 = (Integer) props.get("toto_2");
+ Integer toto_3 = (Integer) props.get("toto_3");
+ Integer toto_4 = (Integer) props.get("toto_4");
+ Integer toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+ assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+ assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+ assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+ //Check tata
+ props = tota.getPropsTata();
+ Integer tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 3", tata.intValue(), 1);
+
+ context.ungetService(ref);
+ tota = null;
+
+ // Start a second import
+ totoProv2.start();
+ assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 4 ("+toto.intValue()+")", toto.intValue(), 2);
+ assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+ assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+ assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 4", toto_1.intValue(), 2);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 4", tata.intValue(), 2);
+ context.ungetService(ref);
+ tota = null;
+
+ // Stop the factory
+ tataFactory.stop();
+ assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+
+ totoProv2.stop();
+ totoProv.stop();
+ tataFactory.start();
+ assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAllOpt(tota);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 4", tata.intValue(), 1);
+ context.ungetService(ref);
+ tota = null;
+
+ // Is arch exposed
+ assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+
+ tataFactory.stop();
+
+ assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+ assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+ assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+
+ under.dispose();
+ under = null;
+ }
+
+ private void invoke(Tota tota) {
+ tota.tata();
+
+ assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+ assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+ assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+ assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+ assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+ assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+ assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+ assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+
+ }
+
+
+ private void invokeStr(Tota tota) {
+ tota.tataStr();
+ }
+
+ private void invokeToto(Tota tota) {
+ tota.toto();
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ tota.toto(1,2);
+ tota.toto1("foo");
+ }
+
+ private void invokeAll(Tota tota) {
+ invoke(tota);
+ //invokeArrays(tota);
+ invokeStr(tota);
+ //invokeTata(tota);
+ //invokeTata1(tota);
+ //invokeTata5(tota);
+ //invokeAdd(tota);
+ invokeToto(tota);
+ }
+
+ private void invokeAllOpt(Tota tota) {
+ invoke(tota);
+ //invokeArrays(tota);
+ invokeStr(tota);
+ //invokeTata(tota);
+ //invokeTata1(tota);
+ //invokeTata5(tota);
+ //invokeAdd(tota);
+ invokeTotoOpt(tota);
+ }
+
+ private void invokeTotoOpt(Tota tota) {
+ try {
+ tota.toto();
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+ try {
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+
+ try {
+ tota.toto(1,2);
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+ try {
+ tota.toto1("foo");
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp4.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp4.java
new file mode 100644
index 0000000..0d0f36c
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp4.java
@@ -0,0 +1,261 @@
+/*
+ * 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.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp4 extends OSGiTestCase {
+
+ private ComponentFactory tataFactory;
+ private ComponentFactory totoFactory;
+
+ private ComponentInstance totoProv, totoProv2;
+ private ComponentInstance under;
+ private ComponentFactory tataFactory2;
+
+ public void setUp() {
+ tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+ totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+ tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+ tataFactory2.stop();
+ tataFactory.stop();
+
+ Properties props = new Properties();
+ props.put("name", "toto provider");
+ try {
+ totoProv = totoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ Properties props3 = new Properties();
+ props3.put("name", "toto provider 2");
+ try {
+ totoProv2 = totoFactory.createComponentInstance(props3);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ totoProv.stop();
+ totoProv2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "comp-4");
+ Properties props2 = new Properties();
+ props2.put("name", "ff");
+ try {
+ under = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public void tearDown() {
+ tataFactory2.start();
+ tataFactory.start();
+ totoProv.dispose();
+ totoProv = null;
+ totoProv2.dispose();
+ totoProv2 = null;
+
+ // Reset counters
+ TotoProvider.toto = 0;
+ TotoProvider.toto_2 = 0;
+ TotoProvider.toto_3 = 0;
+ TotoProvider.toto_4 = 0;
+ TotoProvider.toto1 = 0;
+ }
+
+ public void testSimple() {
+ // Neither factory nor instance
+ assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+
+ // Start the importer
+ totoProv.start();
+ assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+
+ // Start the factory
+ tataFactory.start();
+ assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+ ServiceReference ref = context.getServiceReference(Tota.class.getName());
+ Tota tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ Properties props = tota.getProps();
+ Integer toto = (Integer) props.get("toto");
+ Integer toto_2 = (Integer) props.get("toto_2");
+ Integer toto_3 = (Integer) props.get("toto_3");
+ Integer toto_4 = (Integer) props.get("toto_4");
+ Integer toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+ assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+ assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+ assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+ //Check tata
+ props = tota.getPropsTata();
+ Integer tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 3", tata.intValue(), 1);
+ context.ungetService(ref);
+ tota = null;
+
+ // Start a second import
+ totoProv2.start();
+ assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 4 ("+toto.intValue()+")", toto.intValue(), 2);
+ assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+ assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+ assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 4", toto_1.intValue(), 2);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 4", tata.intValue(), 2);
+ context.ungetService(ref);
+ tota = null;
+
+ // Stop the factory
+ tataFactory.stop();
+ assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+
+ totoProv2.stop();
+ totoProv.stop();
+ tataFactory.start();
+ assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAllOpt(tota);
+ // Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 6", tata.intValue(), 1);
+ context.ungetService(ref);
+ tota = null;
+
+ // Is arch exposed
+ assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+
+ tataFactory.stop();
+
+ assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+ assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+ assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+
+ under.dispose();
+ under = null;
+ }
+
+ private void invoke(Tota tota) {
+ tota.tata();
+
+ assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+ assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+ assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+ assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+ assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+ assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+ assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+ assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+
+ }
+
+
+ private void invokeStr(Tota tota) {
+ tota.tataStr();
+ }
+
+ private void invokeToto(Tota tota) {
+ tota.toto();
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ tota.toto(1,2);
+ tota.toto1("foo");
+ }
+
+ private void invokeAll(Tota tota) {
+ invoke(tota);
+ //invokeArrays(tota);
+ invokeStr(tota);
+ //invokeTata(tota);
+ //invokeTata1(tota);
+ //invokeTata5(tota);
+ //invokeAdd(tota);
+ invokeToto(tota);
+ }
+
+ private void invokeAllOpt(Tota tota) {
+ invoke(tota);
+ //invokeArrays(tota);
+ invokeStr(tota);
+ //invokeTata(tota);
+ //invokeTata1(tota);
+ //invokeTata5(tota);
+ //invokeAdd(tota);
+ invokeTotoOpt(tota);
+ }
+
+ private void invokeTotoOpt(Tota tota) {
+ try {
+ tota.toto();
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+ try {
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+
+ try {
+ tota.toto(1,2);
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+ try {
+ tota.toto1("foo");
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp5.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp5.java
new file mode 100644
index 0000000..7dd11f7
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp5.java
@@ -0,0 +1,265 @@
+/*
+ * 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.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp5 extends OSGiTestCase {
+
+ private ComponentFactory tataFactory;
+ private ComponentFactory totoFactory;
+
+ private ComponentInstance totoProv, totoProv2;
+ private ComponentInstance under;
+ private ComponentFactory tataFactory2;
+
+ public void setUp() {
+ tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+ totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+ tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+ tataFactory2.stop();
+ tataFactory.stop();
+
+ Properties props = new Properties();
+ props.put("name", "toto provider");
+ try {
+ totoProv = totoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ Properties props3 = new Properties();
+ props3.put("name", "toto provider 2");
+ try {
+ totoProv2 = totoFactory.createComponentInstance(props3);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ totoProv.stop();
+ totoProv2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "comp-5");
+ Properties props2 = new Properties();
+ props2.put("name", "ff");
+ try {
+ under = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("Cannot create an instance from comp-5 : " + e.getMessage());
+ }
+
+ }
+
+ public void tearDown() {
+ tataFactory2.start();
+ tataFactory.start();
+ totoProv.dispose();
+ totoProv = null;
+ totoProv2.dispose();
+ totoProv2 = null;
+
+ // Reset counters
+ TotoProvider.toto = 0;
+ TotoProvider.toto_2 = 0;
+ TotoProvider.toto_3 = 0;
+ TotoProvider.toto_4 = 0;
+ TotoProvider.toto1 = 0;
+ }
+
+ public void testSimple() {
+ // Neither factory nor instance
+ assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+
+ // Start the importer
+ totoProv.start();
+ assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+
+ // Start the factory
+ tataFactory.start();
+ assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+ ServiceReference ref = context.getServiceReference(Tota.class.getName());
+ Tota tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ Properties props = tota.getProps();
+ Integer toto = (Integer) props.get("toto");
+ Integer toto_2 = (Integer) props.get("toto_2");
+ Integer toto_3 = (Integer) props.get("toto_3");
+ Integer toto_4 = (Integer) props.get("toto_4");
+ Integer toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+ assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+ assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+ assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+ //Check tata
+ props = tota.getPropsTata();
+ Integer tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 3", tata.intValue(), 1);
+ context.ungetService(ref);
+ tota = null;
+
+ // Start a second import
+ totoProv2.start();
+ assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 4 ("+toto.intValue()+")", toto.intValue(), 2);
+ assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+ assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+ assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 4", toto_1.intValue(), 3);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 4", tata.intValue(), 2);
+ context.ungetService(ref);
+ tota = null;
+
+ // Stop the factory
+ tataFactory.stop();
+ assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+
+ totoProv2.stop();
+ totoProv.stop();
+ tataFactory.start();
+ assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAllOpt(tota);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ assertEquals("Assert tata - 6", tata.intValue(), 1);
+ context.ungetService(ref);
+ tota = null;
+
+ // Is arch exposed
+ assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+
+ tataFactory.stop();
+
+ assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+ assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+ assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+
+ under.dispose();
+ under = null;
+ }
+
+
+
+ private void invoke(Tota tota) {
+ tota.tata();
+
+ assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+ assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+ assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+ assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+ assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+ assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+ assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+ assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+
+ }
+
+
+ private void invokeStr(Tota tota) {
+ tota.tataStr();
+ }
+
+ private void invokeToto(Tota tota) {
+ tota.toto();
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ tota.toto(1,2);
+ tota.toto1("foo");
+ }
+
+ private void invokeAll(Tota tota) {
+ invoke(tota);
+ //invokeArrays(tota);
+ invokeStr(tota);
+ //invokeTata(tota);
+ //invokeTata1(tota);
+ //invokeTata5(tota);
+ //invokeAdd(tota);
+ invokeToto(tota);
+ }
+
+ private void invokeAllOpt(Tota tota) {
+ invoke(tota);
+ //invokeArrays(tota);
+ invokeStr(tota);
+ //invokeTata(tota);
+ //invokeTata1(tota);
+ //invokeTata5(tota);
+ //invokeAdd(tota);
+ invokeTotoOpt(tota);
+ }
+
+ private void invokeTotoOpt(Tota tota) {
+ try {
+ tota.toto();
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+ try {
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+
+ try {
+ tota.toto(1,2);
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+ try {
+ tota.toto1("foo");
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp6.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp6.java
new file mode 100644
index 0000000..609c23c
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp6.java
@@ -0,0 +1,284 @@
+/*
+ * 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.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tata;
+import org.apache.felix.ipojo.test.composite.service.Toto;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp6 extends OSGiTestCase {
+
+ private ComponentFactory tataFactory;
+ private ComponentFactory totoFactory;
+
+ private ComponentInstance totoProv, totoProv2;
+ private ComponentInstance under;
+
+ public void setUp() {
+ tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+ totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+
+ tataFactory.stop();
+
+ Properties props = new Properties();
+ props.put("name", "toto provider");
+ try {
+ totoProv = totoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ Properties props3 = new Properties();
+ props3.put("name", "toto provider 2");
+ try {
+ totoProv2 = totoFactory.createComponentInstance(props3);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ totoProv.stop();
+ totoProv2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "comp-6");
+ Properties props2 = new Properties();
+ props2.put("name", "ff");
+ try {
+ under = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ }
+
+ public void tearDown() {
+ tataFactory.start();
+ totoProv.dispose();
+ totoProv = null;
+ totoProv2.dispose();
+ totoProv2 = null;
+
+ // Reset counters
+ TotoProvider.toto = 0;
+ TotoProvider.toto_2 = 0;
+ TotoProvider.toto_3 = 0;
+ TotoProvider.toto_4 = 0;
+ TotoProvider.toto1 = 0;
+ }
+
+ public void testSimple() {
+ // Neither factory nor instance
+ assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+ ServiceReference refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+ ServiceReference refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+ assertNull("Assert no toto service - 1", refToto);
+ assertNull("Assert no tata service - 1", refTata);
+
+ // Start the importer
+ totoProv.start();
+ assertTrue("Assert under state - 2 ("+under.getState()+")", under.getState() == ComponentInstance.INVALID);
+ refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+ refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+ assertNull("Assert no toto service - 2", refToto);
+ assertNull("Assert no tata service - 2", refTata);
+
+ // Start the factory
+ tataFactory.start();
+ assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+ refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+ refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+ assertNotNull("Assert toto service - 3", refToto);
+ assertNotNull("Assert tata service - 3", refTata);
+ Toto toto = (Toto) context.getService(refToto);
+ Tata tata = (Tata) context.getService(refTata);
+
+ invokeAll(tata);
+ invokeToto(toto);
+
+ // Check toto
+ Properties props = toto.getProps();
+ Integer toto_0 = (Integer) props.get("toto");
+ Integer toto_2 = (Integer) props.get("toto_2");
+ Integer toto_3 = (Integer) props.get("toto_3");
+ Integer toto_4 = (Integer) props.get("toto_4");
+ Integer toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 3 ("+toto_0.intValue()+")", toto_0.intValue(), 1);
+ assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+ assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+ assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 3 (" + toto_1.intValue() + ")", toto_1.intValue(), 1);
+ //Check tata
+ props = tata.getPropsTata();
+ Integer tata_0 = (Integer) props.get("tata");
+ assertEquals("Assert tata - 3", tata_0.intValue(), 1);
+
+ context.ungetService(refToto);
+ context.ungetService(refTata);
+ toto = null;
+ tata = null;
+
+ // Start a second import
+ totoProv2.start();
+ assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+ refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+ refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+ assertNotNull("Assert toto service - 4", refToto);
+ assertNotNull("Assert tata service - 4", refTata);
+
+ toto = (Toto) context.getService(refToto);
+ tata = (Tata) context.getService(refTata);
+ invokeAll(tata);
+ invokeToto(toto);
+
+ // Check toto
+ props = toto.getProps();
+ toto_0 = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ toto_1 = (Integer) props.get("toto1");
+ assertEquals("Assert toto - 4 ("+toto_0.intValue()+")", toto_0.intValue(), 2);
+ assertEquals("Assert toto_2 - 4 ("+toto_2.intValue()+")", toto_2.intValue(), 2);
+ assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+ assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+ assertEquals("Assert toto1 - 4", toto_1.intValue(), 3);
+ //Check tata
+ props = tata.getPropsTata();
+ tata_0 = (Integer) props.get("tata");
+ assertEquals("Assert tata - 4", tata_0.intValue(), 2);
+ context.ungetService(refToto);
+ context.ungetService(refTata);
+ toto = null;
+ tata = null;
+
+ // Stop the factory
+ tataFactory.stop();
+ assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+ refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+ refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+ assertNull("Assert no toto service - 5", refToto);
+ assertNull("Assert no tata service - 5", refTata);
+
+ totoProv2.stop();
+ totoProv.stop();
+ tataFactory.start();
+ assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+ refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+ refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+ assertNotNull("Assert toto service - 6", refToto);
+ assertNotNull("Assert tata service - 6", refTata);
+ toto = (Toto) context.getService(refToto);
+ tata = (Tata) context.getService(refTata);
+
+ invokeAll(tata);
+ invokeTotoOpt(toto);
+ // Check tata
+ props = tata.getPropsTata();
+ tata_0 = (Integer) props.get("tata");
+ assertEquals("Assert tata - 6", tata_0.intValue(), 1);
+ context.ungetService(refToto);
+ context.ungetService(refTata);
+ toto = null;
+ tata = null;
+
+ // Is arch exposed
+ assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+
+ tataFactory.stop();
+
+ assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+ assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+ refToto = Utils.getServiceReferenceByName(context, Toto.class.getName(), "ff");
+ refTata = Utils.getServiceReferenceByName(context, Tata.class.getName(), "ff");
+ assertNull("Assert no toto service - 7", refToto);
+ assertNull("Assert no tata service - 7", refTata);
+
+ under.dispose();
+ under = null;
+ }
+
+ private void invoke(Tata tota) {
+ tota.tata();
+
+ assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+ assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+ assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+ assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+ assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+ assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+ assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+ assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+
+ }
+
+
+ private void invokeStr(Tata tota) {
+ tota.tataStr();
+ }
+
+ private void invokeToto(Toto tota) {
+ tota.toto();
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ tota.toto(1,2);
+ tota.toto1("foo");
+ }
+
+ private void invokeAll(Tata tota) {
+ invoke(tota);
+ //invokeArrays(tota);
+ invokeStr(tota);
+ //invokeTata(tota);
+ //invokeTata1(tota);
+ //invokeTata5(tota);
+ //invokeAdd(tota);
+ }
+
+ private void invokeTotoOpt(Toto tota) {
+ try {
+ tota.toto();
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+ try {
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+
+ try {
+ tota.toto(1,2);
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+
+ try {
+ tota.toto1("foo");
+ fail("UnsupportedOperationException expected");
+ } catch(UnsupportedOperationException e) { }
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp7.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp7.java
new file mode 100644
index 0000000..67a6c19
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp7.java
@@ -0,0 +1,333 @@
+/*
+ * 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.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp7 extends OSGiTestCase {
+
+ private ComponentFactory tataFactory;
+ private ComponentFactory totoFactory;
+ private ComponentFactory tataFactory2;
+
+ private ComponentInstance totoProv, totoProv2;
+ private ComponentInstance under;
+
+ public void setUp() {
+ tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+ totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+ tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+ tataFactory2.stop();
+
+ Properties props = new Properties();
+ props.put("name", "toto provider");
+ try {
+ totoProv = totoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ Properties props3 = new Properties();
+ props3.put("name", "toto provider 2");
+ try {
+ totoProv2 = totoFactory.createComponentInstance(props3);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ totoProv.stop();
+ totoProv2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "comp-7");
+ Properties props2 = new Properties();
+ props2.put("name", "ff");
+ try {
+ under = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ tataFactory.stop();
+
+ }
+
+ public void tearDown() {
+ tataFactory.start();
+ totoProv.dispose();
+ totoProv = null;
+ totoProv2.dispose();
+ totoProv2 = null;
+ tataFactory2.start();
+
+ // Reset counters
+ TotoProvider.toto = 0;
+ TotoProvider.toto_2 = 0;
+ TotoProvider.toto_3 = 0;
+ TotoProvider.toto_4 = 0;
+ TotoProvider.toto1 = 0;
+ }
+
+ public void testSimple() {
+ // Neither factory nor instance
+ assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+
+ // Start the importer
+ totoProv.start();
+ assertTrue("Assert under state - 2", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+
+ // Start the factory
+ tataFactory.start();
+ assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+ ServiceReference ref = context.getServiceReference(Tota.class.getName());
+ Tota tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ Properties props = tota.getProps();
+ Integer toto = (Integer) props.get("toto");
+ Integer toto_2 = (Integer) props.get("toto_2");
+ Integer toto_3 = (Integer) props.get("toto_3");
+ Integer toto_4 = (Integer) props.get("toto_4");
+ assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+ assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+ assertEquals("Assert toto_3 - 3", toto_3.intValue(), 1);
+ assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ Integer tata = (Integer) props.get("tata");
+ Integer tataStr = (Integer) props.get("tataStr");
+ Integer tataStrs = (Integer) props.get("tataStrs");
+ Integer tata_2 = (Integer) props.get("tata_2");
+ Integer tata_3 = (Integer) props.get("tata_3");
+ Integer tata1 = (Integer) props.get("tata1");
+ Integer tata1_1 = (Integer) props.get("tata1_1");
+ Integer tata5 = (Integer) props.get("tata5");
+ Integer tata5_1 = (Integer) props.get("tata5_1");
+ Integer tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 3", tata.intValue(), 1);
+ assertEquals("Assert tataStr - 3", tataStr.intValue(), 1);
+ assertEquals("Assert tataStrs - 3", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 3", tata_2.intValue(), 1);
+ assertEquals("Assert tata_3 - 3", tata_3.intValue(), 1);
+ assertEquals("Assert tata1 - 3", tata1.intValue(), 1);
+ assertEquals("Assert tata1_1 - 3", tata1_1.intValue(), 1);
+ assertEquals("Assert tata5 - 3", tata5.intValue(), 1);
+ assertEquals("Assert tata5_1 - 3", tata5_1.intValue(), 1);
+ assertEquals("Assert tata5_2 - 3", tata5_2.intValue(), 1);
+ context.ungetService(ref);
+ tota = null;
+
+ // Start a second import
+ totoProv2.start();
+ assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ assertEquals("Assert toto - 4", toto.intValue(), 2);
+ assertEquals("Assert toto_2 - 4", toto_2.intValue(), 2);
+ assertEquals("Assert toto_3 - 4", toto_3.intValue(), 2);
+ assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ tataStr = (Integer) props.get("tataStr");
+ tataStrs = (Integer) props.get("tataStrs");
+ tata_2 = (Integer) props.get("tata_2");
+ tata_3 = (Integer) props.get("tata_3");
+ tata1 = (Integer) props.get("tata1");
+ tata1_1 = (Integer) props.get("tata1_1");
+ tata5 = (Integer) props.get("tata5");
+ tata5_1 = (Integer) props.get("tata5_1");
+ tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 4", tata.intValue(), 2);
+ assertEquals("Assert tataStr - 4", tataStr.intValue(), 2);
+ assertEquals("Assert tataStrs - 4", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 4", tata_2.intValue(), 2);
+ assertEquals("Assert tata_3 - 4", tata_3.intValue(), 2);
+ assertEquals("Assert tata1 - 4", tata1.intValue(), 2);
+ assertEquals("Assert tata1_1 - 4", tata1_1.intValue(), 2);
+ assertEquals("Assert tata5 - 4", tata5.intValue(), 2);
+ assertEquals("Assert tata5_1 - 4", tata5_1.intValue(), 2);
+ assertEquals("Assert tata5_2 - 4", tata5_2.intValue(), 2);
+
+ context.ungetService(ref);
+ tota = null;
+
+ tataFactory.stop();
+ assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+
+ totoProv2.stop();
+ tataFactory.start();
+ assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ assertEquals("Assert toto - 6", toto.intValue(), 3);
+ assertEquals("Assert toto_2 - 6", toto_2.intValue(), 3);
+ assertEquals("Assert toto_3 - 6", toto_3.intValue(), 3);
+ assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ tataStr = (Integer) props.get("tataStr");
+ tataStrs = (Integer) props.get("tataStrs");
+ tata_2 = (Integer) props.get("tata_2");
+ tata_3 = (Integer) props.get("tata_3");
+ tata1 = (Integer) props.get("tata1");
+ tata1_1 = (Integer) props.get("tata1_1");
+ tata5 = (Integer) props.get("tata5");
+ tata5_1 = (Integer) props.get("tata5_1");
+ tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 6", 1, tata.intValue());
+ assertEquals("Assert tataStr - 6", tataStr.intValue(), 1);
+ assertEquals("Assert tataStrs - 6", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 6", tata_2.intValue(), 1);
+ assertEquals("Assert tata_3 - 6", tata_3.intValue(), 1);
+ assertEquals("Assert tata1 - 6", tata1.intValue(), 1);
+ assertEquals("Assert tata1_1 - 6", tata1_1.intValue(), 1);
+ assertEquals("Assert tata5 - 6", tata5.intValue(), 1);
+ assertEquals("Assert tata5_1 - 6", tata5_1.intValue(), 1);
+ assertEquals("Assert tata5_2 - 6", tata5_2.intValue(), 1);
+ context.ungetService(ref);
+ tota = null;
+
+ // Is arch exposed
+ assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+
+ totoProv.stop();
+
+ assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+ assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+ assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+
+ under.dispose();
+ under = null;
+ }
+
+ private void invoke(Tota tota) {
+ tota.tata();
+
+ assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+ assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+ assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+ assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+ assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+ assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+ assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+ assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+
+ }
+
+ private void invokeArrays(Tota tota) {
+
+ int[] a = new int[] {1,2,3};
+ assertEquals("Assert invoke tataint[]", tota.tataInts(a), a);
+
+ long[] b = new long[] {1,2,3};
+ assertEquals("Assert invoke tataLong[]", tota.tataLongs(b), b);
+
+ double[] c = new double[] {1,2,3};
+ assertEquals("Assert invoke tataDouble[]", tota.tataDoubles(c), c);
+
+ char[] d = new char[] {'a','b', 'c'};
+ assertEquals("Assert invoke tataChar[]", tota.tataChars(d), d);
+
+ boolean[] e = new boolean[] {true, false};
+ assertEquals("Assert invoke tataBoolean[]", tota.tataBooleans(e), e);
+
+ byte[] f = new byte[] {(byte) 1};
+ assertEquals("Assert invoke tataByte[]", tota.tataBytes(f), f);
+
+ short[] g = new short[] {(short) 1};
+ assertEquals("Assert invoke tataShort[]", tota.tataShorts(g), g);
+
+ float[] h = new float[] {5,6,7};
+ assertEquals("Assert invoke tataFloat[]", tota.tataFloats(h), h);
+
+ }
+
+ private void invokeStr(Tota tota) {
+ tota.tataStr();
+ }
+
+ private void invokeTata(Tota tota) {
+ tota.tata(1,2);
+ tota.tata("tototototo");
+ }
+
+ private void invokeTata1(Tota tota) {
+ assertEquals("Assert tata1", tota.tata1("foo"), "foo");
+ assertEquals("Assert tata1 - 2", tota.tata1(new char[] {'a','b','c'}), "abc");
+ }
+
+ private void invokeTata5(Tota tota) {
+ assertEquals("Assert tata5 -1", tota.tata5("foo",1), "foo"+1);
+ assertEquals("Assert tata5 - 2", tota.tata5(new String[] {"a","b","c"}, 1), "31");
+ assertEquals("Assert tata5 - 3", tota.tata5("foo", new int[] {1,2,3}), "foo3");
+ }
+
+ private void invokeAdd(Tota tota) {
+ assertEquals("Assert add", tota.add(1,1,1), 3);
+ }
+
+ private void invokeToto(Tota tota) {
+ tota.toto();
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ tota.toto(1,2);
+ }
+
+ private void invokeAll(Tota tota) {
+ invoke(tota);
+ invokeArrays(tota);
+ invokeStr(tota);
+ invokeTata(tota);
+ invokeTata1(tota);
+ invokeTata5(tota);
+ invokeAdd(tota);
+ invokeToto(tota);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp8.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp8.java
new file mode 100644
index 0000000..f9ceb09
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/provides/TestComp8.java
@@ -0,0 +1,365 @@
+/*
+ * 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.test.composite.provides;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.component.TotoProvider;
+import org.apache.felix.ipojo.test.composite.component.TotoProviderGlue;
+import org.apache.felix.ipojo.test.composite.service.Tota;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestComp8 extends OSGiTestCase {
+
+ private ComponentFactory tataFactory;
+ private ComponentFactory totoFactory;
+ private ComponentFactory tataFactory2;
+
+ private ComponentInstance totoProv, totoProv2;
+ private ComponentInstance under;
+
+ public void setUp() {
+ tataFactory = (ComponentFactory) Utils.getFactoryByName(context, "tata");
+ totoFactory = (ComponentFactory) Utils.getFactoryByName(context, "toto");
+ tataFactory2 = (ComponentFactory) Utils.getFactoryByName(context, "comp-6");
+ tataFactory2.stop();
+
+ Properties props = new Properties();
+ props.put("name", "toto provider");
+ try {
+ totoProv = totoFactory.createComponentInstance(props);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ Properties props3 = new Properties();
+ props3.put("name", "toto provider 2");
+ try {
+ totoProv2 = totoFactory.createComponentInstance(props3);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ totoProv.stop();
+ totoProv2.stop();
+
+ Factory factory = Utils.getFactoryByName(context, "comp-8");
+ Properties props2 = new Properties();
+ props2.put("name", "ff");
+ try {
+ under = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+ tataFactory.stop();
+
+ }
+
+ public void tearDown() {
+ tataFactory.start();
+ totoProv.dispose();
+ totoProv = null;
+ totoProv2.dispose();
+ totoProv2 = null;
+ tataFactory2.start();
+
+ // Reset counters
+ TotoProvider.toto = 0;
+ TotoProvider.toto_2 = 0;
+ TotoProvider.toto_3 = 0;
+ TotoProvider.toto_4 = 0;
+ TotoProvider.toto1 = 0;
+ TotoProviderGlue.toto = 0;
+ TotoProviderGlue.toto_2 = 0;
+ TotoProviderGlue.toto_3 = 0;
+ TotoProviderGlue.toto_4 = 0;
+ TotoProviderGlue.toto1 = 0;
+ }
+
+ public void testSimple() {
+ // Neither factory nor instance
+ assertTrue("Assert under state - 1", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 1", context.getServiceReference(Tota.class.getName()));
+
+ // Start the importer
+ totoProv.start();
+ assertTrue("Assert under state - 2", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 2", context.getServiceReference(Tota.class.getName()));
+
+ // Start the factory
+ tataFactory.start();
+ assertTrue("Assert under state - 3", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 3", context.getServiceReference(Tota.class.getName()));
+ ServiceReference ref = context.getServiceReference(Tota.class.getName());
+ Tota tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ Properties props = tota.getProps();
+ Integer toto = (Integer) props.get("toto");
+ Integer toto_2 = (Integer) props.get("toto_2");
+ Integer toto_3 = (Integer) props.get("toto_3");
+ Integer toto_4 = (Integer) props.get("toto_4");
+ Integer gtoto = (Integer) props.get("gtoto");
+ Integer gtoto_2 = (Integer) props.get("gtoto_2");
+ Integer gtoto_3 = (Integer) props.get("gtoto_3");
+ Integer gtoto_4 = (Integer) props.get("gtoto_4");
+ assertEquals("Assert toto - 3 ("+toto.intValue()+")", toto.intValue(), 1);
+ assertEquals("Assert toto_2 - 3", toto_2.intValue(), 1);
+ assertEquals("Assert toto_3 - 3", toto_3.intValue(), 0);
+ assertEquals("Assert toto_4 - 3", toto_4.intValue(), 0);
+ assertEquals("Assert gtoto - 3 ("+gtoto.intValue()+")", gtoto.intValue(), 1);
+ assertEquals("Assert gtoto_2 - 3", gtoto_2.intValue(), 1);
+ assertEquals("Assert gtoto_3 - 3", gtoto_3.intValue(), 1);
+ assertEquals("Assert gtoto_4 - 3", gtoto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ Integer tata = (Integer) props.get("tata");
+ Integer tataStr = (Integer) props.get("tataStr");
+ Integer tataStrs = (Integer) props.get("tataStrs");
+ Integer tata_2 = (Integer) props.get("tata_2");
+ Integer tata_3 = (Integer) props.get("tata_3");
+ Integer tata1 = (Integer) props.get("tata1");
+ Integer tata1_1 = (Integer) props.get("tata1_1");
+ Integer tata5 = (Integer) props.get("tata5");
+ Integer tata5_1 = (Integer) props.get("tata5_1");
+ Integer tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 3", tata.intValue(), 1);
+ assertEquals("Assert tataStr - 3", tataStr.intValue(), 1);
+ assertEquals("Assert tataStrs - 3", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 3", tata_2.intValue(), 1);
+ assertEquals("Assert tata_3 - 3", tata_3.intValue(), 1);
+ assertEquals("Assert tata1 - 3", tata1.intValue(), 1);
+ assertEquals("Assert tata1_1 - 3", tata1_1.intValue(), 1);
+ assertEquals("Assert tata5 - 3", tata5.intValue(), 1);
+ assertEquals("Assert tata5_1 - 3", tata5_1.intValue(), 1);
+ assertEquals("Assert tata5_2 - 3", tata5_2.intValue(), 1);
+ context.ungetService(ref);
+ tota = null;
+
+ // Start a second import
+ totoProv2.start();
+ assertTrue("Assert under state - 4", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 4", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ gtoto = (Integer) props.get("gtoto");
+ gtoto_2 = (Integer) props.get("gtoto_2");
+ gtoto_3 = (Integer) props.get("gtoto_3");
+ gtoto_4 = (Integer) props.get("gtoto_4");
+ assertEquals("Assert toto - 4", toto.intValue(), 2);
+ assertEquals("Assert toto_2 - 4", toto_2.intValue(), 2);
+ assertEquals("Assert toto_3 - 4", toto_3.intValue(), 0);
+ assertEquals("Assert toto_4 - 4", toto_4.intValue(), 0);
+ assertEquals("Assert gtoto - 4 ("+gtoto.intValue()+")", gtoto.intValue(), 2);
+ assertEquals("Assert gtoto_2 - 4", gtoto_2.intValue(), 2);
+ assertEquals("Assert gtoto_3 - 4", gtoto_3.intValue(), 2);
+ assertEquals("Assert gtoto_4 - 4", gtoto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ tataStr = (Integer) props.get("tataStr");
+ tataStrs = (Integer) props.get("tataStrs");
+ tata_2 = (Integer) props.get("tata_2");
+ tata_3 = (Integer) props.get("tata_3");
+ tata1 = (Integer) props.get("tata1");
+ tata1_1 = (Integer) props.get("tata1_1");
+ tata5 = (Integer) props.get("tata5");
+ tata5_1 = (Integer) props.get("tata5_1");
+ tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 4", tata.intValue(), 2);
+ assertEquals("Assert tataStr - 4", tataStr.intValue(), 2);
+ assertEquals("Assert tataStrs - 4", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 4", tata_2.intValue(), 2);
+ assertEquals("Assert tata_3 - 4", tata_3.intValue(), 2);
+ assertEquals("Assert tata1 - 4", tata1.intValue(), 2);
+ assertEquals("Assert tata1_1 - 4", tata1_1.intValue(), 2);
+ assertEquals("Assert tata5 - 4", tata5.intValue(), 2);
+ assertEquals("Assert tata5_1 - 4", tata5_1.intValue(), 2);
+ assertEquals("Assert tata5_2 - 4", tata5_2.intValue(), 2);
+
+ context.ungetService(ref);
+ tota = null;
+
+ tataFactory.stop();
+ assertTrue("Assert under state - 5", under.getState() == ComponentInstance.INVALID);
+ assertNull("Assert no tota service - 5", context.getServiceReference(Tota.class.getName()));
+
+ totoProv2.stop();
+ tataFactory.start();
+ assertTrue("Assert under state - 6", under.getState() == ComponentInstance.VALID);
+ assertNotNull("Assert tota service - 6", context.getServiceReference(Tota.class.getName()));
+ ref = context.getServiceReference(Tota.class.getName());
+ tota = (Tota) context.getService(ref);
+ invokeAll(tota);
+ // Check toto
+ props = tota.getProps();
+ toto = (Integer) props.get("toto");
+ toto_2 = (Integer) props.get("toto_2");
+ toto_3 = (Integer) props.get("toto_3");
+ toto_4 = (Integer) props.get("toto_4");
+ gtoto = (Integer) props.get("gtoto");
+ gtoto_2 = (Integer) props.get("gtoto_2");
+ gtoto_3 = (Integer) props.get("gtoto_3");
+ gtoto_4 = (Integer) props.get("gtoto_4");
+ assertEquals("Assert toto - 6", toto.intValue(), 3);
+ assertEquals("Assert toto_2 - 6", toto_2.intValue(), 3);
+ assertEquals("Assert toto_3 - 6", toto_3.intValue(), 0);
+ assertEquals("Assert toto_4 - 6", toto_4.intValue(), 0);
+ assertEquals("Assert gtoto - 6 ("+gtoto.intValue()+")", gtoto.intValue(), 3);
+ assertEquals("Assert gtoto_2 - 6", gtoto_2.intValue(), 3);
+ assertEquals("Assert gtoto_3 - 6", gtoto_3.intValue(), 3);
+ assertEquals("Assert gtoto_4 - 6", gtoto_4.intValue(), 0);
+ //Check tata
+ props = tota.getPropsTata();
+ tata = (Integer) props.get("tata");
+ tataStr = (Integer) props.get("tataStr");
+ tataStrs = (Integer) props.get("tataStrs");
+ tata_2 = (Integer) props.get("tata_2");
+ tata_3 = (Integer) props.get("tata_3");
+ tata1 = (Integer) props.get("tata1");
+ tata1_1 = (Integer) props.get("tata1_1");
+ tata5 = (Integer) props.get("tata5");
+ tata5_1 = (Integer) props.get("tata5_1");
+ tata5_2 = (Integer) props.get("tata5_2");
+ assertEquals("Assert tata - 6", tata.intValue(), 1);
+ assertEquals("Assert tataStr - 6", tataStr.intValue(), 1);
+ assertEquals("Assert tataStrs - 6", tataStrs.intValue(), 0);
+ assertEquals("Assert tata_2 - 6", tata_2.intValue(), 1);
+ assertEquals("Assert tata_3 - 6", tata_3.intValue(), 1);
+ assertEquals("Assert tata1 - 6", tata1.intValue(), 1);
+ assertEquals("Assert tata1_1 - 6", tata1_1.intValue(), 1);
+ assertEquals("Assert tata5 - 6", tata5.intValue(), 1);
+ assertEquals("Assert tata5_1 - 6", tata5_1.intValue(), 1);
+ assertEquals("Assert tata5_2 - 6", tata5_2.intValue(), 1);
+ context.ungetService(ref);
+ tota = null;
+
+ // Is arch exposed
+ assertNotNull("Test arch", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+
+ totoProv.stop();
+
+ assertTrue("Assert under state - 7", under.getState() == ComponentInstance.INVALID);
+ assertNotNull("Test arch-2", Utils.getServiceReferenceByName(context, Architecture.class.getName(), "ff"));
+ assertNull("Assert no tota service - 7", context.getServiceReference(Tota.class.getName()));
+
+ under.dispose();
+ under = null;
+ }
+
+
+
+ private void invoke(Tota tota) {
+ tota.tata();
+
+ assertEquals("Assert invoke tataint", tota.tataInt(2), 2);
+ assertEquals("Assert invoke tataLong", tota.tataLong(2), 2);
+ assertEquals("Assert invoke tataDouble", tota.tataDouble(2), 2);
+ assertEquals("Assert invoke tataChar", tota.tataChar('a'), 'a');
+ assertTrue("Assert invoke tataBoolean", tota.tataBoolean(true));
+ assertEquals("Assert invoke tataByte", tota.tataByte((byte)2), 2);
+ assertEquals("Assert invoke tataShort", tota.tataShort((short)5), 5);
+ assertEquals("Assert invoke tataFloat", tota.tataFloat(5), 5);
+
+ }
+
+ private void invokeArrays(Tota tota) {
+
+ int[] a = new int[] {1,2,3};
+ assertEquals("Assert invoke tataint[]", tota.tataInts(a), a);
+
+ long[] b = new long[] {1,2,3};
+ assertEquals("Assert invoke tataLong[]", tota.tataLongs(b), b);
+
+ double[] c = new double[] {1,2,3};
+ assertEquals("Assert invoke tataDouble[]", tota.tataDoubles(c), c);
+
+ char[] d = new char[] {'a','b', 'c'};
+ assertEquals("Assert invoke tataChar[]", tota.tataChars(d), d);
+
+ boolean[] e = new boolean[] {true, false};
+ assertEquals("Assert invoke tataBoolean[]", tota.tataBooleans(e), e);
+
+ byte[] f = new byte[] {(byte) 1};
+ assertEquals("Assert invoke tataByte[]", tota.tataBytes(f), f);
+
+ short[] g = new short[] {(short) 1};
+ assertEquals("Assert invoke tataShort[]", tota.tataShorts(g), g);
+
+ float[] h = new float[] {5,6,7};
+ assertEquals("Assert invoke tataFloat[]", tota.tataFloats(h), h);
+
+ }
+
+ private void invokeStr(Tota tota) {
+ tota.tataStr();
+ }
+
+ private void invokeTata(Tota tota) {
+ tota.tata(1,2);
+ tota.tata("tototototo");
+ }
+
+ private void invokeTata1(Tota tota) {
+ assertEquals("Assert tata1", tota.tata1("foo"), "foo");
+ assertEquals("Assert tata1 - 2", tota.tata1(new char[] {'a','b','c'}), "abc");
+ }
+
+ private void invokeTata5(Tota tota) {
+ assertEquals("Assert tata5 -1", tota.tata5("foo",1), "foo"+1);
+ assertEquals("Assert tata5 - 2", tota.tata5(new String[] {"a","b","c"}, 1), "31");
+ assertEquals("Assert tata5 - 3", tota.tata5("foo", new int[] {1,2,3}), "foo3");
+ }
+
+ private void invokeAdd(Tota tota) {
+ assertEquals("Assert add", tota.add(1,1,1), 3);
+ }
+
+ private void invokeToto(Tota tota) {
+ tota.toto();
+ assertEquals("Assert toto", tota.toto("foo"), "foo");
+ tota.toto(1,2);
+ }
+
+ private void invokeAll(Tota tota) {
+ invoke(tota);
+ invokeArrays(tota);
+ invokeStr(tota);
+ invokeTata(tota);
+ invokeTata1(tota);
+ invokeTata5(tota);
+ invokeAdd(tota);
+ invokeToto(tota);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/A123/CheckService2.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/A123/CheckService2.java
new file mode 100644
index 0000000..1a745a9
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/A123/CheckService2.java
@@ -0,0 +1,25 @@
+/*
+ * 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.test.composite.service.A123;
+
+public interface CheckService2 {
+
+ public boolean check();
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/Tata.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/Tata.java
new file mode 100644
index 0000000..04fe33d
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/Tata.java
@@ -0,0 +1,62 @@
+/*
+ * 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.test.composite.service;
+
+import java.util.Properties;
+
+public interface Tata {
+
+ public Properties getPropsTata();
+
+ public void tata();
+
+ public int tataInt(int i);
+ public long tataLong(long l);
+ public double tataDouble(double d);
+ public char tataChar(char c);
+ public boolean tataBoolean(boolean b);
+ public short tataShort(short s);
+ public float tataFloat(float f);
+ public byte tataByte(byte b);
+
+ public int[] tataInts(int[] its);
+ public long[] tataLongs(long[] l);
+ public double[] tataDoubles(double[] d);
+ public char[] tataChars(char[] c);
+ public boolean[] tataBooleans(boolean[] b);
+ public short[] tataShorts(short[] s);
+ public float[] tataFloats(float[] f);
+ public byte[] tataBytes(byte[] b);
+
+ public String tataStr();
+ public String[] tataStrs();
+
+ public void tata(int i, int j);
+ public void tata(String s);
+
+ public String tata1(String a);
+ public String tata1(char[] a);
+
+ public String tata5(String a, int i);
+ public String tata5(String[] a, int i);
+ public String tata5(String a, int[] i);
+
+ public long add(int i, int j, int k);
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/Tota.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/Tota.java
new file mode 100644
index 0000000..f7481a4
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/Tota.java
@@ -0,0 +1,78 @@
+/*
+ * 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.test.composite.service;
+
+import java.util.Properties;
+
+public interface Tota {
+
+ public static final String specification="specification { " +
+ "requires { " +
+ "$specification=\"org.apache.felix.ipojo.test.composite.service.Toto\" " +
+ "$optional=\"true\" " +
+ "$aggregate=\"true\" " +
+ "$type=\"service\" " +
+ "} }";
+
+ public Properties getProps() throws UnsupportedOperationException;;
+ public Properties getPropsTata();
+
+ public void tata();
+
+ public int tataInt(int i);
+ public long tataLong(long l);
+ public double tataDouble(double d);
+ public char tataChar(char c);
+ public boolean tataBoolean(boolean b);
+ public short tataShort(short s);
+ public float tataFloat(float f);
+ public byte tataByte(byte b);
+
+ public int[] tataInts(int[] its);
+ public long[] tataLongs(long[] l);
+ public double[] tataDoubles(double[] d);
+ public char[] tataChars(char[] c);
+ public boolean[] tataBooleans(boolean[] b);
+ public short[] tataShorts(short[] s);
+ public float[] tataFloats(float[] f);
+ public byte[] tataBytes(byte[] b);
+
+ public String tataStr();
+ public String[] tataStrs();
+
+ public void tata(int i, int j);
+ public void tata(String s);
+
+ public String tata1(String a);
+ public String tata1(char[] a);
+
+ public String tata5(String a, int i);
+ public String tata5(String[] a, int i);
+ public String tata5(String a, int[] i);
+
+ public long add(int i, int j, int k);
+
+ public void toto() throws UnsupportedOperationException;
+ public void toto(int i, int j) throws UnsupportedOperationException;
+ public String toto(String a) throws UnsupportedOperationException;
+
+ public void toto1(String j) throws UnsupportedOperationException;
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/Toto.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/Toto.java
new file mode 100644
index 0000000..edf6c10
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/service/Toto.java
@@ -0,0 +1,37 @@
+/*
+ * 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.test.composite.service;
+
+import java.util.Properties;
+
+public interface Toto {
+
+ public Properties getProps();
+
+ public void toto();
+ public void toto(int i, int j);
+ public String toto(String a);
+ public String toto(String[] a);
+
+ public void toto1(String j);
+
+ public int count();
+
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/test/CompositeTest.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/test/CompositeTest.java
new file mode 100644
index 0000000..9f7c6c4
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/test/CompositeTest.java
@@ -0,0 +1,180 @@
+/*
+ * 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.test.composite.test;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.ServiceContext;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.composite.util.Utils;
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class CompositeTest extends OSGiTestCase {
+
+ public void testAPI() {
+ Factory fact1 = Utils.getFactoryByName(context, "composite.empty");
+ Properties p = new Properties();
+ p.put("name", "empty-1");
+ ComponentInstance empty = null;
+ try {
+ empty = fact1.createComponentInstance(p);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+
+ ServiceContext sc = Utils.getServiceContext(empty);
+
+ Factory fact2 = Utils.getFactoryByName(context, "composite.test.2");
+ Properties props2 = new Properties();
+ props2.put("name", "2"); // 2
+ Factory fact3 = Utils.getFactoryByName(context, "composite.test.3");
+ Properties props3 = new Properties();
+ props3.put("name", "3");
+ ComponentInstance comp2 = null;
+ ComponentInstance comp3 = null;
+ try {
+ comp2 = fact2.createComponentInstance(props2, sc);
+ comp3 = fact3.createComponentInstance(props3, sc);
+ } catch(Throwable e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+
+ assertTrue("Test comp3", comp3.getState() == ComponentInstance.VALID);
+ assertTrue("Test comp2", comp2.getState() == ComponentInstance.VALID);
+
+ ServiceReference ref = null;
+
+ ref = Utils.getServiceReferenceByName(sc, CheckService.class.getName(), "2"); // 2
+
+ assertNotNull("Check ref", ref);
+ CheckService cs = (CheckService) sc.getService(ref);
+ assertTrue("Check invoke", cs.check());
+
+ comp3.dispose();
+ comp2.dispose();
+ empty.dispose();
+ }
+
+ public void testInstantiator() {
+ String type = "composite.instantiator";
+ Factory fact = Utils.getFactoryByName(context, type);
+ ComponentInstance ci = null;
+ Properties p = new Properties();
+ p.put("name", "mon_coeur");
+ try {
+ ci = fact.createComponentInstance(p);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ assertTrue("Check ci", ci.getState() == ComponentInstance.VALID);
+ ServiceReference ref = Utils.getServiceReferenceByName(context, BazService.class.getName(), "mon_coeur");
+ assertNotNull("Check ref",ref);
+ BazService bs = (BazService) context.getService(ref);
+ assertTrue("Check invocation", bs.foo());
+ context.ungetService(ref);
+ ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "mon_coeur");
+ assertNotNull("Check ref 2 ",ref);
+ FooService fs = (FooService) context.getService(ref);
+ assertTrue("Check invocation", fs.foo());
+ context.ungetService(ref);
+ ci.dispose();
+ }
+
+ public void testAPI2() {
+ Factory fact1 = Utils.getFactoryByName(context, "composite.empty");
+ Properties p = new Properties();
+ p.put("name", "empty-2");
+ ComponentInstance empty = null;
+ try {
+ empty = fact1.createComponentInstance(p);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ ServiceContext sc = Utils.getServiceContext(empty);
+
+ Factory fact2 = Utils.getFactoryByName(sc, "composite.test.2");
+ Properties props2 = new Properties();
+ props2.put("name", "4");
+ Factory fact3 = Utils.getFactoryByName(sc, "composite.test.3");
+ Properties props3 = new Properties();
+ props3.put("name", "5");
+ ComponentInstance comp2 = null;
+ ComponentInstance comp3 = null;
+ try {
+ comp2 = fact2.createComponentInstance(props2, sc);
+ comp3 = fact3.createComponentInstance(props3, sc);
+ } catch(Exception e) {
+ e.printStackTrace();
+ }
+
+ assertTrue("Test comp3", comp3.getState() == ComponentInstance.VALID);
+ assertTrue("Test comp2", comp2.getState() == ComponentInstance.VALID);
+
+ ServiceReference ref = null;
+
+ ref = Utils.getServiceReferenceByName(sc, CheckService.class.getName(), "4");
+
+ assertNotNull("Check ref", ref);
+ CheckService cs = (CheckService) sc.getService(ref);
+ assertTrue("Check invoke", cs.check());
+
+ comp3.dispose();
+ comp2.dispose();
+ empty.dispose();
+ }
+
+
+ public void testApplication() {
+ Factory factory = Utils.getFactoryByName(context, "composite.test.1");
+ ComponentInstance ci = null;
+ Properties props = new Properties();
+ props.put("name", "Test");
+ try {
+ ci = factory.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot instantiate Test " + e.getMessage());
+ }
+
+ assertTrue("Check ci state", ci.getState() == ComponentInstance.VALID );
+
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(CheckService.class.getName(), "(instance.name=Test)");
+ } catch (InvalidSyntaxException e) {
+ fail("Invalid filter : " + e.getMessage());
+ }
+ assertNotNull("Check refs not null", refs);
+ CheckService cs = (CheckService) context.getService(refs[0]);
+
+ assertTrue("Check invocation", cs.check());
+ ci.dispose();
+
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/util/Utils.java b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/util/Utils.java
new file mode 100644
index 0000000..ea67fee
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/java/org/apache/felix/ipojo/test/composite/util/Utils.java
@@ -0,0 +1,288 @@
+/*
+ * 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.test.composite.util;
+
+import java.util.Dictionary;
+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.composite.CompositeManager;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+public class Utils {
+
+ public static Factory getFactoryByName(BundleContext bc, String factoryName) {
+ ServiceReference[] refs;
+ try {
+ refs = bc.getServiceReferences(Factory.class.getName(), "(factory.name=" + factoryName + ")");
+ if (refs == null) {
+ System.err.println("Cannot get the factory " + factoryName);
+ return null;
+ }
+ return ((Factory) bc.getService(refs[0]));
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Cannot get the factory " + factoryName + " : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static HandlerFactory getHandlerFactoryByName(BundleContext bc, String factoryName) {
+ ServiceReference[] refs;
+ try {
+ refs = bc.getServiceReferences(Factory.class.getName(), "(" + Handler.HANDLER_NAME_PROPERTY + "=" + factoryName + ")");
+ if (refs == null) {
+ System.err.println("Cannot get the factory " + factoryName);
+ return null;
+ }
+ return (HandlerFactory) bc.getService(refs[0]);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Cannot get the factory " + factoryName + " : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static ComponentInstance getComponentInstance(BundleContext bc, String factoryName, Dictionary configuration) {
+ Factory fact = getFactoryByName(bc, factoryName);
+
+ if (fact == null) {
+ System.err.println("Factory " + factoryName + " not found");
+ return null;
+ }
+
+ // if(fact.isAcceptable(configuration)) {
+ try {
+ return fact.createComponentInstance(configuration);
+ } catch (Exception e) {
+ System.err.println("Cannot create the instance from " + factoryName + " : " + e.getMessage());
+ e.printStackTrace();
+ return null;
+ }
+ // }
+ // else {
+ // System.err.println("Configuration not accepted by : " + factoryName);
+ // return null;
+ // }
+ }
+
+ public static ComponentInstance getComponentInstanceByName(BundleContext bc, String factoryName, String name) {
+ Factory fact = getFactoryByName(bc, factoryName);
+
+ if (fact == null) {
+ System.err.println("Factory " + factoryName + " not found");
+ return null;
+ }
+
+ try {
+ Properties props = new Properties();
+ props.put("name", name);
+ return fact.createComponentInstance(props);
+ } catch (Exception e) {
+ System.err.println("Cannot create the instance from " + factoryName + " : " + e.getMessage());
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public static ServiceReference[] getServiceReferences(BundleContext bc, String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return new ServiceReference[0];
+ } else {
+ return refs;
+ }
+ }
+
+ public static ServiceReference getServiceReference(BundleContext bc, String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return null;
+ } else {
+ return refs[0];
+ }
+ }
+
+ public static ServiceReference getServiceReferenceByName(BundleContext bc, String itf, String name) {
+ ServiceReference[] refs = null;
+ String filter = null;
+ if (itf.equals(Factory.class.getName()) || itf.equals(ManagedServiceFactory.class.getName())) {
+ filter = "(" + "factory.name" + "=" + name + ")";
+ } else {
+ filter = "(" + "instance.name" + "=" + name + ")";
+ }
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return null;
+ } else {
+ return refs[0];
+ }
+ }
+
+ public static Object getServiceObject(BundleContext bc, String itf, String filter) {
+ ServiceReference ref = getServiceReference(bc, itf, filter);
+ if (ref != null) {
+ return bc.getService(ref);
+ } else {
+ return null;
+ }
+ }
+
+ public static Object[] getServiceObjects(BundleContext bc, String itf, String filter) {
+ ServiceReference[] refs = getServiceReferences(bc, itf, filter);
+ if (refs != null) {
+ Object[] list = new Object[refs.length];
+ for (int i = 0; i < refs.length; i++) {
+ list[i] = bc.getService(refs[i]);
+ }
+ return list;
+ } else {
+ return new Object[0];
+ }
+ }
+
+ public static ServiceContext getServiceContext(ComponentInstance ci) {
+ if (ci instanceof CompositeManager) {
+ return ((CompositeManager) ci).getServiceContext();
+ } else {
+ throw new RuntimeException("Cannot get the service context from a non composite instance");
+ }
+ }
+
+ public static Factory getFactoryByName(ServiceContext bc, String factoryName) {
+ ServiceReference[] refs;
+ try {
+ refs = bc.getServiceReferences(Factory.class.getName(), "(factory.name=" + factoryName + ")");
+ if (refs == null) { return null; }
+ return ((Factory) bc.getService(refs[0]));
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Cannot get the factory " + factoryName + " : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static ComponentInstance getComponentInstance(ServiceContext bc, String factoryName, Dictionary configuration) {
+ Factory fact = getFactoryByName(bc, factoryName);
+
+ if (fact == null) { return null; }
+
+ if (fact.isAcceptable(configuration)) {
+ try {
+ return fact.createComponentInstance(configuration);
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ e.printStackTrace();
+ return null;
+ }
+ } else {
+ System.err.println("Configuration not accepted by : " + factoryName);
+ return null;
+ }
+ }
+
+ public static ServiceReference[] getServiceReferences(ServiceContext bc, String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return new ServiceReference[0];
+ } else {
+ return refs;
+ }
+ }
+
+ public static ServiceReference getServiceReference(ServiceContext bc, String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return null;
+ } else {
+ return refs[0];
+ }
+ }
+
+ public static ServiceReference getServiceReferenceByName(ServiceContext bc, String itf, String name) {
+ ServiceReference[] refs = null;
+ String filter = null;
+ if (itf.equals(Factory.class.getName()) || itf.equals(ManagedServiceFactory.class.getName())) {
+ filter = "(" + "factory.name" + "=" + name + ")";
+ } else {
+ filter = "(" + "instance.name" + "=" + name + ")";
+ }
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return null;
+ } else {
+ return refs[0];
+ }
+ }
+
+ public static Object getServiceObject(ServiceContext bc, String itf, String filter) {
+ ServiceReference ref = getServiceReference(bc, itf, filter);
+ if (ref != null) {
+ return bc.getService(ref);
+ } else {
+ return null;
+ }
+ }
+
+ public static Object[] getServiceObjects(ServiceContext bc, String itf, String filter) {
+ ServiceReference[] refs = getServiceReferences(bc, itf, filter);
+ if (refs != null) {
+ Object[] list = new Object[refs.length];
+ for (int i = 0; i < refs.length; i++) {
+ list[i] = bc.getService(refs[i]);
+ }
+ return list;
+ } else {
+ return new Object[0];
+ }
+ }
+
+}
diff --git a/ipojo/tests/tests.composite/src/main/resources/metadata.xml b/ipojo/tests/tests.composite/src/main/resources/metadata.xml
new file mode 100644
index 0000000..2357580
--- /dev/null
+++ b/ipojo/tests/tests.composite/src/main/resources/metadata.xml
@@ -0,0 +1,221 @@
+<ipojo xmlns:cs="org.apache.felix.ipojo.test.composite.handler.CheckServiceHandler">
+ <!-- Composite -->
+ <composite name="composite.empty" factory="true" architecture="true">
+ </composite>
+
+ <composite name="composite.bar.1" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.BarService"/>
+ </composite>
+
+ <composite name="composite.bar.2" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.BarService" aggregate="true"/>
+ </composite>
+
+ <composite name="composite.bar.3" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.BarService" optional="true"/>
+ </composite>
+
+ <composite name="composite.bar.4" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.FooService" aggregate="true" optional="true"/>
+ </composite>
+
+ <composite name="composite.bar.5-accept" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.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>
+ </composite>
+
+ <composite name="composite.bar.5-refuse1" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.BarService">
+ <property name="foo" value="bar"/>
+ <property name="boolean" value="true"/>
+ <property name="string" value="foo"/>
+ <property name="strAprop" value="{foo, bar, baz}"/>
+ <property name="int" value="5"/>
+ </subservice>
+ </composite>
+
+ <composite name="composite.bar.5-refuse2" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.BarService">
+ <property name="string" value="foo"/>
+ <property name="strAprop" value="{foo, bar, baz}"/>
+ </subservice>
+ </composite>
+
+ <composite name="composite.inst.1" factory="true" architecture="true">
+ <instance component="FooProviderType-1" /> <!-- name="FooProv" -->
+ <instance component="FooProviderType-Dyn2">
+ <property name="boolean" value="true"/>
+ <property name="string" value="foo"/>
+ <property name="strAProp" value="{a,b,c}"/>
+ </instance>
+ </composite>
+
+ <composite name="composite.requires.1" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.FooService" scope="composite"/>
+ </composite>
+
+ <composite name="composite.requires.2" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.FooService" aggregate="true" scope="composite"/>
+ </composite>
+
+ <composite name="composite.requires.3" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.FooService" optional="true" scope="composite"/>
+ </composite>
+
+ <composite name="composite.requires.4" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.FooService" optional="true" aggregate="true" scope="composite"/>
+ </composite>
+
+ <composite name="composite.requires.5" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.FooService" filter="(&(int=2)(long=40))" scope="composite"/>
+ </composite>
+
+ <component className="org.apache.felix.ipojo.test.composite.component.BazProviderType1" factory="BazProviderType" scope="composite">
+ <provides/>
+ </component>
+
+ <composite name="composite.export.1" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" aggregate="true" optional="true" filter="(!(instance.name=export))" scope="composite"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.BazService"/>
+ </composite>
+
+ <composite name="composite.export.2" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" scope="composite" aggregate="true" optional="true" filter="(!(instance.name=export))"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" optional="true"/>
+ </composite>
+
+ <composite name="composite.export.3" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" scope="composite" aggregate="true" optional="true" filter="(!(instance.name=export))"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" aggregate="true"/>
+ </composite>
+
+ <composite name="composite.export.4" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" aggregate="true" optional="true" filter="(!(instance.name=export))" scope="composite"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" aggregate="true" optional="true"/>
+ </composite>
+
+ <composite name="composite.export.5" architecture="true">
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" aggregate="true" optional="true" filter="(!(instance.name=export))" scope="composite"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" filter="(instance.name=foo1)"/>
+ </composite>
+
+ <component className="org.apache.felix.ipojo.test.composite.component.Baz2CheckProvider" factory="Baz2CheckProvider" architecture="true">
+ <requires field="fs" scope="composite"/>
+ <provides/>
+ </component>
+
+ <composite name="composite.test.3" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" aggregate="true" filter="(factory.name=BazProviderType)"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.BazService"/>
+ </composite>
+
+ <composite name="composite.test.2" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.CheckService" filter="(factory.name=Baz2CheckProvider)"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.CheckService"/>
+ <subservice action="import" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" scope="composite"/>
+ </composite>
+
+ <composite name="composite.test.1" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" filter="(factory.name=composite.test.3)" />
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.CheckService" filter="(factory.name=composite.test.2)"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.CheckService"/>
+ </composite>
+
+ <composite name="composite.instantiator" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.BazService" filter="(factory.name=composite.test.3)"/>
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.scenarios.service.FooService"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.BazService"/>
+ <provides action="export" specification="org.apache.felix.ipojo.test.scenarios.service.FooService"/>
+ </composite>
+
+ <!-- Test composition provides -->
+ <component classname="org.apache.felix.ipojo.test.composite.component.TataProvider" factory="tata">
+ <provides/>
+ </component>
+
+ <component classname="org.apache.felix.ipojo.test.composite.component.TotoProvider" factory="toto" architecture="true">
+ <provides/>
+ </component>
+
+ <component classname="org.apache.felix.ipojo.test.composite.component.TotoProviderGlue" factory="totoglue">
+ <requires field="m_toto" scope="composite"/>
+ </component>
+
+ <composite name="comp-0" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.Tata"/>
+ <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto"/>
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Tota"/>
+ </composite>
+
+ <composite name="comp-1" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.Tata"/>
+ <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto"/>
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Tota">
+ <delegation method="tataInt" policy="One"/>
+ <delegation method="toto1" policy="All"/>
+ </provides>
+ </composite>
+
+ <composite name="comp-2" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.Tata" aggregate="true"/>
+ <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto" aggregate="true"/>
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Tota">
+ <delegation method="tataInt" policy="One"/>
+ <delegation method="toto1" policy="All"/>
+ </provides>
+ </composite>
+
+ <composite name="comp-3" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.Tata"/>
+ <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto" optional="true"/>
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Tota">
+ </provides>
+ </composite>
+
+ <composite name="comp-4" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.Tata"/>
+ <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto" optional="true"/>
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Tota">
+ <delegation method="tataInt" policy="One"/>
+ <delegation method="toto1" policy="All"/>
+ </provides>
+ </composite>
+
+ <composite name="comp-5" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.Tata" aggregate="true"/>
+ <!-- <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto" aggregate ="true" optional="true"/> -->
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Tota">
+ <delegation method="tataInt" policy="One"/>
+ <delegation method="toto1" policy="All"/>
+ </provides>
+ </composite>
+
+ <composite name="comp-6" architecture="true">
+ <subservice action="instantiate" specification="org.apache.felix.ipojo.test.composite.service.Tata" aggregate="true"/>
+ <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto" aggregate="true" optional="true"/>
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Toto">
+ <delegation method="toto1" policy="All"/>
+ </provides>
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Tata">
+ <delegation method="tataInt" policy="One"/>
+ </provides>
+ </composite>
+
+ <composite name="comp-7" architecture="true">
+ <instance component="tata"/>
+ <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto"/>
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Tota"/>
+ </composite>
+
+ <composite name="comp-8" architecture="true">
+ <instance component="tata"/>
+ <instance component="totoglue"/>
+ <subservice action="import" specification="org.apache.felix.ipojo.test.composite.service.Toto"/>
+ <provides action="implement" specification="org.apache.felix.ipojo.test.composite.service.Tota"/>
+ </composite>
+
+</ipojo>
diff --git a/ipojo/tests/tests.core/pom.xml b/ipojo/tests/tests.core/pom.xml
new file mode 100644
index 0000000..8b95285
--- /dev/null
+++ b/ipojo/tests/tests.core/pom.xml
@@ -0,0 +1,111 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <groupId>ipojo.tests</groupId>
+ <artifactId>ipojo.tests</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>iPOJO Test Suite</name>
+ <artifactId>tests.core</artifactId>
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.composite</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>3.8.1</version>
+ </dependency>
+ <dependency>
+ <groupId>ipojo.examples</groupId>
+ <artifactId>org.apache.felix.ipojo.junit4osgi</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ </dependency>
+ </dependencies>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <version>1.4.0</version>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Export-Package>
+ org.apache.felix.ipojo.test.scenarios.service
+ </Export-Package>
+ <Bundle-SymbolicName>
+ ${pom.artifactId}
+ </Bundle-SymbolicName>
+ <Private-Package>
+ org.apache.felix.ipojo.test*
+ </Private-Package>
+ <Test-Suite>
+ org.apache.felix.ipojo.test.IPOJOTestSuite
+ </Test-Suite>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>0.7.6-SNAPSHOT</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <ignoreAnnotations>true</ignoreAnnotations>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <configuration>
+ <source>1.5</source>
+ <target>1.5</target>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/IPOJOTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/IPOJOTestSuite.java
new file mode 100644
index 0000000..b9fbeb9
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/IPOJOTestSuite.java
@@ -0,0 +1,55 @@
+/*
+ * 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.test;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.apache.felix.ipojo.test.scenarios.architecture.ArchitectureTestSuite;
+import org.apache.felix.ipojo.test.scenarios.bad.BadTestSuite;
+import org.apache.felix.ipojo.test.scenarios.configuration.ConfigurationTestSuite;
+import org.apache.felix.ipojo.test.scenarios.controller.LifeCycleControllerTestSuite;
+import org.apache.felix.ipojo.test.scenarios.core.CoreTestSuite;
+import org.apache.felix.ipojo.test.scenarios.dependency.DependencyTestSuite;
+import org.apache.felix.ipojo.test.scenarios.factory.FactoryTestSuite;
+import org.apache.felix.ipojo.test.scenarios.handler.ExternalHandlerTestSuite;
+import org.apache.felix.ipojo.test.scenarios.lifecycle.LifeCycleCallbackTest;
+import org.apache.felix.ipojo.test.scenarios.manipulation.ManipulationTestSuite;
+import org.apache.felix.ipojo.test.scenarios.service.providing.ProvidedServiceTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class IPOJOTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("IPojo Core Test Suite", bc);
+ ots.addTest(ManipulationTestSuite.suite(bc));
+ ots.addTest(CoreTestSuite.suite(bc));
+ ots.addTest(FactoryTestSuite.suite(bc));
+ ots.addTest(ProvidedServiceTestSuite.suite(bc));
+ ots.addTest(LifeCycleControllerTestSuite.suite(bc));
+ ots.addTest(LifeCycleCallbackTest.suite(bc));
+ ots.addTest(DependencyTestSuite.suite(bc));
+ ots.addTest(ArchitectureTestSuite.suite(bc));
+ ots.addTest(ConfigurationTestSuite.suite(bc));
+ ots.addTest(ExternalHandlerTestSuite.suite(bc));
+ ots.addTest(BadTestSuite.suite(bc));
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/handler/CheckServiceHandler.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/handler/CheckServiceHandler.java
new file mode 100644
index 0000000..865234c
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/handler/CheckServiceHandler.java
@@ -0,0 +1,100 @@
+/*
+ * 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.test.handler;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.architecture.PropertyDescription;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.osgi.framework.ServiceRegistration;
+
+public class CheckServiceHandler extends PrimitiveHandler implements CheckService {
+
+ ServiceRegistration sr;
+ boolean isValid;
+ int changes = 0;
+ static final String NAMESPACE = org.apache.felix.ipojo.test.handler.CheckServiceHandler.class.getName();
+
+ Properties props = new Properties();
+
+ public void configure(Element metadata, Dictionary configuration) {
+ Element[] meta = metadata.getElements("Check", NAMESPACE);
+ if(meta.length == 0) { return; }
+ // Get handler props
+ props.put("instance.name", configuration.get("name"));
+ if(configuration.get("csh.simple") != null) { props.put("Simple", configuration.get("csh.simple")); }
+ if(configuration.get("csh.map") != null) {
+ Dictionary m = (Dictionary) configuration.get("csh.map");
+ props.put("Map1", m.get("a"));
+ props.put("Map2", m.get("b"));
+ props.put("Map3", m.get("c"));
+ }
+ props.put("changes", new Integer(changes));
+
+ }
+
+ public void initializeComponentFactory(ComponentTypeDescription cd, Element metadata) {
+ cd.addProperty(new PropertyDescription("csh.simple", "java.lang.String", null));
+ cd.addProperty(new PropertyDescription("csh.map", "java.util.Dictionary", null));
+ }
+
+ public void start() {
+ if(sr == null) {
+ sr = getInstanceManager().getContext().registerService(CheckService.class.getName(), this, props);
+ }
+ isValid = true;
+ }
+
+ public void stop() {
+ isValid = false;
+ synchronized(this) {
+ if(sr != null) { sr.unregister(); }
+ }
+ }
+
+ public boolean check() {
+ if(isValid) { isValid = false;}
+ else { isValid = true; }
+ return isValid;
+ }
+
+ public Properties getProps() {
+ return props;
+ }
+
+ public void stateChanged(int state) {
+ changes++;
+ props.put("changes", new Integer(changes));
+ sr.setProperties(props);
+ }
+
+ public String getName() {
+ return NAMESPACE;
+ }
+
+ public HandlerDescription getDescription() {
+ return new CheckServiceHandlerDescription(this);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/handler/CheckServiceHandlerDescription.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/handler/CheckServiceHandlerDescription.java
new file mode 100644
index 0000000..fb43042
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/handler/CheckServiceHandlerDescription.java
@@ -0,0 +1,38 @@
+/*
+ * 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.test.handler;
+
+import org.apache.felix.ipojo.Handler;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+
+public class CheckServiceHandlerDescription extends HandlerDescription {
+
+ public CheckServiceHandlerDescription(Handler h) {
+ super(h);
+ }
+
+ public Element getHandlerInfo() {
+ Element elem = super.getHandlerInfo();
+ elem.addAttribute(new Attribute("isValid", isValid()+""));
+ return elem;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/log/DefaultLogImpl.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/log/DefaultLogImpl.java
new file mode 100644
index 0000000..bbde9eb
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/log/DefaultLogImpl.java
@@ -0,0 +1,65 @@
+/*
+ * 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.test.log;
+
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogService;
+
+public class DefaultLogImpl implements LogService {
+
+
+ public void log(int arg0, String arg1) {
+ dispatch(arg0, arg1);
+ }
+
+ public void log(int arg0, String arg1, Throwable arg2) {
+ dispatch(arg0, arg1 + " (" + arg2.getMessage() + ")");
+ }
+
+ public void log(ServiceReference arg0, int arg1, String arg2) {
+ dispatch(arg1, arg2 + " (" + arg0.toString() + ")");
+ }
+
+ public void log(ServiceReference arg0, int arg1, String arg2, Throwable arg3) {
+ dispatch(arg1, arg2 + " (" + arg0.toString() + ")" + " (" + arg3.getMessage() + ")");
+ }
+
+
+ private void dispatch(int level, String message) {
+ switch (level) {
+ case LogService.LOG_DEBUG:
+ System.out.println("[DEBUG] " + message);
+ break;
+ case LogService.LOG_INFO:
+ System.out.println("[INFO] " + message);
+ break;
+ case LogService.LOG_WARNING:
+ System.out.println("[WARNING] " + message);
+ break;
+ case LogService.LOG_ERROR:
+ System.out.println("[ERROR] " + message);
+ break;
+ default:
+ System.out.println("[" + level + "] " + message);
+ break;
+ }
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/log/LogImpl.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/log/LogImpl.java
new file mode 100644
index 0000000..9f23faf
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/log/LogImpl.java
@@ -0,0 +1,131 @@
+/*
+ * 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.test.log;
+
+import java.util.Enumeration;
+import java.util.Vector;
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogListener;
+import org.osgi.service.log.LogReaderService;
+import org.osgi.service.log.LogService;
+
+public class LogImpl implements LogService, LogReaderService {
+
+ Vector m_messages = new Vector();
+
+ public void log(int arg0, String arg1) {
+ add(new LogEntryImpl(arg0, arg1, null, null));
+ }
+
+ public void log(final int arg0, final String arg1, final Throwable arg2) {
+ Runnable runnable = new Runnable() {
+ public void run() {
+ add(new LogEntryImpl(arg0, arg1, arg2, null));
+ }
+ };
+ Thread thread = new Thread(runnable);
+ thread.start();
+ }
+
+ public void log(final ServiceReference arg0, final int arg1, final String arg2) {
+ Runnable runnable = new Runnable() {
+ public void run() {
+ add(new LogEntryImpl(arg1, arg2, null, arg0));
+ }
+ };
+ Thread thread = new Thread(runnable);
+ thread.start();
+ }
+
+ public void log(final ServiceReference arg0, final int arg1, final String arg2, final Throwable arg3) {
+// Runnable runnable = new Runnable() {
+// public void run() {
+// add(new LogEntryImpl(arg1, arg2, arg3, arg0));
+// }
+// };
+// Thread thread = new Thread(runnable);
+// thread.start();
+ }
+
+ private void add(LogEntry entry) {
+ m_messages.add(entry);
+ }
+
+ public void addLogListener(LogListener arg0) {
+ throw new UnsupportedOperationException("Log Listener not supported");
+
+ }
+
+ public Enumeration getLog() {
+ return m_messages.elements();
+ }
+
+ public void removeLogListener(LogListener arg0) {
+ throw new UnsupportedOperationException("Log Listener not supported");
+
+ }
+
+ private class LogEntryImpl implements LogEntry {
+
+ private int level;
+ private String message;
+ private Throwable exception;
+ private ServiceReference reference;
+ private long time;
+
+
+ LogEntryImpl(int l, String m, Throwable e, ServiceReference ref) {
+ level = l;
+ message = m;
+ exception = e;
+ reference = ref;
+ time = System.currentTimeMillis();
+ }
+
+
+ public Bundle getBundle() {
+ return null;
+ }
+
+ public Throwable getException() {
+ return exception;
+ }
+
+ public int getLevel() {
+ return level;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public ServiceReference getServiceReference() {
+ return reference;
+ }
+
+ public long getTime() {
+ return time;
+ }
+
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/architecture/ArchitectureTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/architecture/ArchitectureTestSuite.java
new file mode 100644
index 0000000..ef287b6
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/architecture/ArchitectureTestSuite.java
@@ -0,0 +1,35 @@
+/*
+ * 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.test.scenarios.architecture;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class ArchitectureTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Architecture Test Suite", bc);
+ ots.addTestSuite(ProvidedServiceTest.class);
+ ots.addTestSuite(DependencyTest.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/architecture/DependencyTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/architecture/DependencyTest.java
new file mode 100644
index 0000000..102df0b
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/architecture/DependencyTest.java
@@ -0,0 +1,600 @@
+/*
+ * 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.test.scenarios.architecture;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.handlers.dependency.DependencyHandlerDescription;
+import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandlerDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class DependencyTest extends OSGiTestCase {
+
+ ComponentInstance fooProvider1, fooProvider2;
+
+ ComponentInstance instance1, instance2, instance3, instance4;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ fooProvider2.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "SimpleCheckServiceProvider").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Optional");
+ instance2 = Utils.getFactoryByName(context, "SimpleOptionalCheckServiceProvider").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Multiple");
+ instance3 = Utils.getFactoryByName(context, "SimpleMultipleCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "OptionalMultiple");
+ instance4 = Utils.getFactoryByName(context, "SimpleOptionalMultipleCheckServiceProvider").createComponentInstance(i4);
+ } catch(Exception e) {
+ throw new RuntimeException(e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ private DependencyHandlerDescription getDependencyDesc(InstanceDescription id) {
+ for(int i = 0; i < id.getHandlers().length; i++) {
+ if(id.getHandlers()[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.dependency.DependencyHandler")) {
+ return (DependencyHandlerDescription) id.getHandlers()[i];
+ }
+ }
+ fail("Dependency Handler not found");
+ return null;
+ }
+
+ private ProvidedServiceHandlerDescription getPSDesc(InstanceDescription id) {
+ for(int i = 0; i < id.getHandlers().length; i++) {
+ if(id.getHandlers()[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
+ return (ProvidedServiceHandlerDescription) id.getHandlers()[i];
+ }
+ }
+ fail("Provided Service Handler not found");
+ return null;
+ }
+
+ public void testSimpleDependency() {
+ ServiceReference arch_dep = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_dep);
+ InstanceDescription id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
+
+ // Check dependency handler invalidity
+ DependencyHandlerDescription dhd = getDependencyDesc(id_dep);
+ assertFalse("Check dependency handler invalidity", dhd.isValid());
+
+ // Check dependency metadata
+ assertEquals("Check dependency interface", dhd.getDependencies()[0].getInterface(), FooService.class.getName());
+ assertFalse("Check dependency cardinality", dhd.getDependencies()[0].isMultiple());
+ assertFalse("Check dependency optionality", dhd.getDependencies()[0].isOptional());
+ assertNull("Check dependency ref -1", dhd.getDependencies()[0].getServiceReferences());
+
+ fooProvider1.start();
+
+ ServiceReference arch_ps = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps);
+ InstanceDescription id_ps = ((Architecture) context.getService(arch_ps)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps.getState() == ComponentInstance.VALID);
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+ assertEquals("Check dependency ref - 2 ", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps = ((Architecture) context.getService(arch_ps)).getInstanceDescription();
+ ProvidedServiceHandlerDescription psh = getPSDesc(id_ps);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertEquals("Check POJO creation", id_ps.getCreatedObjects().length, 1);
+ assertTrue("Check service reference - 1", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+
+ fooProvider1.stop();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
+ dhd = getDependencyDesc(id_dep);
+ assertFalse("Check dependency handler invalidity", dhd.isValid());
+
+ fooProvider1.start();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ arch_ps = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps);
+ id_ps = ((Architecture) context.getService(arch_ps)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps.getState() == ComponentInstance.VALID);
+ psh = getPSDesc(id_ps);
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+
+ assertEquals("Check dependency ref -3", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps = ((Architecture) context.getService(arch_ps)).getInstanceDescription();
+ psh = getPSDesc(id_ps);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertTrue("Check service reference - 1", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+
+ fooProvider1.stop();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
+ dhd = getDependencyDesc(id_dep);
+ assertFalse("Check dependency handler invalidity", dhd.isValid());
+
+ id_dep = null;
+ cs = null;
+ context.ungetService(arch_dep);
+ context.ungetService(cs_ref);
+ }
+
+ public void testOptionalDependency() {
+ ServiceReference arch_dep = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_dep);
+ InstanceDescription id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check dependency handler invalidity
+ DependencyHandlerDescription dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler invalidity", dhd.isValid());
+
+ // Check dependency metadata
+ assertEquals("Check dependency interface", dhd.getDependencies()[0].getInterface(), FooService.class.getName());
+ assertFalse("Check dependency cardinality", dhd.getDependencies()[0].isMultiple());
+ assertTrue("Check dependency optionality", dhd.getDependencies()[0].isOptional());
+ assertNull("Check dependency ref -1", dhd.getDependencies()[0].getServiceReferences());
+
+ fooProvider1.start();
+
+ ServiceReference arch_ps = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps);
+ InstanceDescription id_ps = ((Architecture) context.getService(arch_ps)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps.getState() == ComponentInstance.VALID);
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+ assertEquals("Check dependency ref - 2 ", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps = ((Architecture) context.getService(arch_ps)).getInstanceDescription();
+ ProvidedServiceHandlerDescription psh = getPSDesc(id_ps);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertEquals("Check POJO creation", id_ps.getCreatedObjects().length, 1);
+ assertTrue("Check service reference - 1", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+
+ fooProvider1.stop();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler invalidity", dhd.isValid());
+
+ fooProvider1.start();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ arch_ps = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps);
+ id_ps = ((Architecture) context.getService(arch_ps)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps.getState() == ComponentInstance.VALID);
+ psh = getPSDesc(id_ps);
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+
+ assertEquals("Check dependency ref -3", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps = ((Architecture) context.getService(arch_ps)).getInstanceDescription();
+ psh = getPSDesc(id_ps);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertTrue("Check service reference - 1", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+
+ fooProvider1.stop();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler invalidity", dhd.isValid());
+
+ id_dep = null;
+ cs = null;
+ context.ungetService(arch_dep);
+ context.ungetService(cs_ref);
+ }
+
+ public void testMultipleDependency() {
+ ServiceReference arch_dep = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_dep);
+ InstanceDescription id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
+
+ // Check dependency handler invalidity
+ DependencyHandlerDescription dhd = getDependencyDesc(id_dep);
+ assertFalse("Check dependency handler invalidity", dhd.isValid());
+
+ // Check dependency metadata
+ assertEquals("Check dependency interface", dhd.getDependencies()[0].getInterface(), FooService.class.getName());
+ assertTrue("Check dependency cardinality", dhd.getDependencies()[0].isMultiple());
+ assertFalse("Check dependency optionality", dhd.getDependencies()[0].isOptional());
+ assertNull("Check dependency ref -1", dhd.getDependencies()[0].getServiceReferences());
+
+ fooProvider1.start();
+
+ ServiceReference arch_ps1 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps1);
+ InstanceDescription id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id_ps1.getState() == ComponentInstance.VALID);
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+ assertEquals("Check dependency ref - 2 ", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+ assertEquals("Check used ref - 1 (" + dhd.getDependencies()[0].getUsedServices().size() + ")", dhd.getDependencies()[0].getUsedServices().size(), 0);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ ProvidedServiceHandlerDescription psh = getPSDesc(id_ps1);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
+ assertTrue("Check service reference - 2", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+
+ // Start a second foo service provider
+ fooProvider2.start();
+
+ arch_ps1 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ ServiceReference arch_ps2 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps1);
+ assertNotNull("Check architecture 2 availability", arch_ps2);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ InstanceDescription id_ps2 = ((Architecture) context.getService(arch_ps2)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
+ assertTrue("Check instance 2 invalidity - 1", id_ps2.getState() == ComponentInstance.VALID);
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+ assertEquals("Check dependency ref - 3 ", dhd.getDependencies()[0].getServiceReferences().size(), 2);
+ assertEquals("Check used ref - 2 ", dhd.getDependencies()[0].getUsedServices().size(), 1); // provider 2 not already used
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ id_ps2 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ ProvidedServiceHandlerDescription psh1 = getPSDesc(id_ps1);
+ ProvidedServiceHandlerDescription psh2 = getPSDesc(id_ps2);
+ assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
+ assertEquals("Check POJO creation", id_ps2.getCreatedObjects().length, 1);
+ assertTrue("Check service reference - 3.1", dhd.getDependencies()[0].getUsedServices().contains(psh1.getProvidedServices()[0].getServiceReference()));
+ assertTrue("Check service reference - 3.2", dhd.getDependencies()[0].getUsedServices().contains(psh2.getProvidedServices()[0].getServiceReference()));
+ assertEquals("Check used ref - 3 ("+dhd.getDependencies()[0].getUsedServices().size()+")", dhd.getDependencies()[0].getUsedServices().size(), 2);
+
+ fooProvider2.stop();
+
+ arch_ps1 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps1);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id_ps1.getState() == ComponentInstance.VALID);
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+ assertEquals("Check dependency ref - 2 ", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+ assertEquals("Check used ref - 4 ", dhd.getDependencies()[0].getUsedServices().size(), 1);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ psh = getPSDesc(id_ps1);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
+ assertTrue("Check service reference - 1", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+ assertEquals("Check used ref - 5 ", dhd.getDependencies()[0].getUsedServices().size(), 1);
+
+ fooProvider1.stop();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertFalse("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertFalse("Check dependency handler invalidity", dhd.isValid());
+
+ fooProvider2.start();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ arch_ps1 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps1);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
+ psh = getPSDesc(id_ps1);
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+
+ assertEquals("Check dependency ref -3", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+ assertEquals("Check used ref - 6 ", dhd.getDependencies()[0].getUsedServices().size(), 0);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ psh = getPSDesc(id_ps1);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertTrue("Check service reference - 4", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+ assertEquals("Check used ref - 7 ", dhd.getDependencies()[0].getUsedServices().size(), 1);
+
+ fooProvider2.stop();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertFalse("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertFalse("Check dependency handler invalidity", dhd.isValid());
+
+ id_dep = null;
+ cs = null;
+ context.ungetService(arch_dep);
+ context.ungetService(cs_ref);
+ }
+
+ public void testMultipleOptionalDependency() {
+ ServiceReference arch_dep = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_dep);
+ InstanceDescription id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check dependency handler invalidity
+ DependencyHandlerDescription dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler invalidity", dhd.isValid());
+
+ // Check dependency metadata
+ assertEquals("Check dependency interface", dhd.getDependencies()[0].getInterface(), FooService.class.getName());
+ assertTrue("Check dependency cardinality", dhd.getDependencies()[0].isMultiple());
+ assertTrue("Check dependency optionality", dhd.getDependencies()[0].isOptional());
+ assertNull("Check dependency ref -1", dhd.getDependencies()[0].getServiceReferences());
+
+ fooProvider1.start();
+
+ ServiceReference arch_ps1 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps1);
+ InstanceDescription id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+ assertEquals("Check dependency ref - 2 ", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ ProvidedServiceHandlerDescription psh = getPSDesc(id_ps1);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
+ assertTrue("Check service reference - 1", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+
+ // Start a second foo service provider
+ fooProvider2.start();
+
+ arch_ps1 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ ServiceReference arch_ps2 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps1);
+ assertNotNull("Check architecture 2 availability", arch_ps2);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ InstanceDescription id_ps2 = ((Architecture) context.getService(arch_ps2)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
+ assertTrue("Check instance 2 invalidity - 1", id_ps2.getState() == ComponentInstance.VALID);
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+ assertEquals("Check dependency ref - 3 ", dhd.getDependencies()[0].getServiceReferences().size(), 2);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ id_ps2 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ ProvidedServiceHandlerDescription psh1 = getPSDesc(id_ps1);
+ ProvidedServiceHandlerDescription psh2 = getPSDesc(id_ps2);
+ assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
+ assertEquals("Check POJO creation", id_ps2.getCreatedObjects().length, 1);
+ assertTrue("Check service reference - 2.1", dhd.getDependencies()[0].getUsedServices().contains(psh1.getProvidedServices()[0].getServiceReference()));
+ assertTrue("Check service reference - 2.2", dhd.getDependencies()[0].getUsedServices().contains(psh2.getProvidedServices()[0].getServiceReference()));
+
+ fooProvider2.stop();
+
+ arch_ps1 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps1);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+ assertEquals("Check dependency ref - 2 ", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ psh = getPSDesc(id_ps1);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertEquals("Check POJO creation", id_ps1.getCreatedObjects().length, 1);
+ assertTrue("Check service reference - 3", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+
+ fooProvider1.stop();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler invalidity", dhd.isValid());
+
+ fooProvider2.start();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ arch_ps1 = Utils.getServiceReferenceByName(context, Architecture.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ps1);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_ps1.getState() == ComponentInstance.VALID);
+ psh = getPSDesc(id_ps1);
+ assertTrue("Check instance validity", id_dep.getState() == ComponentInstance.VALID);
+ assertTrue("Check dependency handler validity", dhd.isValid());
+
+ assertEquals("Check dependency ref -3", dhd.getDependencies()[0].getServiceReferences().size(), 1);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check object graph
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ dhd = getDependencyDesc(id_dep);
+ id_ps1 = ((Architecture) context.getService(arch_ps1)).getInstanceDescription();
+ psh = getPSDesc(id_ps1);
+ assertEquals("Check Service Reference equality", psh.getProvidedServices()[0].getServiceReference(), dhd.getDependencies()[0].getServiceReference());
+ assertTrue("Check service reference - 4", dhd.getDependencies()[0].getUsedServices().contains(psh.getProvidedServices()[0].getServiceReference()));
+
+ fooProvider2.stop();
+
+ id_dep = ((Architecture) context.getService(arch_dep)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.VALID);
+ dhd = getDependencyDesc(id_dep);
+ assertTrue("Check dependency handler invalidity", dhd.isValid());
+
+ id_dep = null;
+ cs = null;
+ context.ungetService(arch_dep);
+ context.ungetService(cs_ref);
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/architecture/ProvidedServiceTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/architecture/ProvidedServiceTest.java
new file mode 100644
index 0000000..efcd2da
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/architecture/ProvidedServiceTest.java
@@ -0,0 +1,199 @@
+/*
+ * 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.test.scenarios.architecture;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.HandlerDescription;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceDescription;
+import org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandlerDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class ProvidedServiceTest extends OSGiTestCase {
+
+
+ public void testExposition() {
+ String factName = "FooProviderType-1";
+ String compName = "FooProvider-1";
+
+ // Get the factory to create a component instance
+ Factory fact = Utils.getFactoryByName(context, factName);
+ assertNotNull("Cannot find the factory FooProvider-1", fact);
+
+ Properties props = new Properties();
+ props.put("name", compName);
+ ComponentInstance ci = null;
+ try {
+ ci = fact.createComponentInstance(props);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "FooProvider-1");
+ assertNotNull("Architecture not available", arch_ref);
+
+ Architecture arch = (Architecture) context.getService(arch_ref);
+ InstanceDescription id = arch.getInstanceDescription();
+
+ assertEquals("Check component instance name (" + id.getName() + ")", id.getName(), compName);
+ assertEquals("Check component type implementation class", id.getComponentDescription().getClassName(), "org.apache.felix.ipojo.test.scenarios.component.FooProviderType1");
+
+ HandlerDescription[] handlers = id.getHandlers();
+ assertEquals("Number of handlers", handlers.length, 2);
+
+ //Look for the ProvidedService Handler
+ ProvidedServiceHandlerDescription pshd = null;
+ for(int i = 0; i < handlers.length; i++) {
+ if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
+ pshd = (ProvidedServiceHandlerDescription) handlers[i];
+ }
+ }
+
+ assertNotNull("Check ProvidedServiceHandlerDescription", pshd);
+ ProvidedServiceDescription[] ps = pshd.getProvidedServices();
+
+ assertEquals("Check ProvidedService number", ps.length, 1);
+ assertEquals("Check Provided Service Specs - 1", ps[0].getServiceSpecification().length, 1);
+ assertEquals("Check Provided Service Specs - 2", ps[0].getServiceSpecification()[0], FooService.class.getName());
+ assertEquals("Check Provided Service availability", ps[0].getState(), ProvidedServiceDescription.REGISTERED);
+ Properties prop = ps[0].getProperties();
+ assertNotNull("Check Props", prop);
+ assertEquals("Check service properties number", prop.size(), 2);
+ assertEquals("Check instance.name property", prop.getProperty("instance.name"), compName);
+ assertEquals("Check factory.name property", prop.getProperty("factory.name"), factName);
+
+ ci.dispose();
+ }
+
+ public void testProps() {
+ String factName = "FooProviderType-3";
+ String compName = "FooProvider";
+
+ // Get the factory to create a component instance
+ Factory fact = Utils.getFactoryByName(context, factName);
+ assertNotNull("Cannot find the factory FooProvider", fact);
+
+ Properties props = new Properties();
+ props.put("name", compName);
+ props.put("foo", "foo");
+ props.put("bar", "2");
+ props.put("baz", "baz");
+ ComponentInstance ci = null;
+ try {
+ ci = fact.createComponentInstance(props);
+ } catch (Exception e) { fail(e.getMessage()); }
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), compName);
+ assertNotNull("Architecture not available", arch_ref);
+
+ Architecture arch = (Architecture) context.getService(arch_ref);
+ InstanceDescription id = arch.getInstanceDescription();
+
+ assertEquals("Check component instance name (" + id.getName() + ")", id.getName(), compName);
+ assertEquals("Check component type implementation class", id.getComponentDescription().getClassName(), "org.apache.felix.ipojo.test.scenarios.component.FooProviderType1");
+
+ HandlerDescription[] handlers = id.getHandlers();
+ assertEquals("Number of handlers", handlers.length, 3);
+
+ //Look for the ProvidedService Handler
+ ProvidedServiceHandlerDescription pshd = null;
+ for(int i = 0; i < handlers.length; i++) {
+ if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
+ pshd = (ProvidedServiceHandlerDescription) handlers[i];
+ }
+ }
+
+ assertNotNull("Check ProvidedServiceHandlerDescription", pshd);
+ ProvidedServiceDescription[] ps = pshd.getProvidedServices();
+
+ assertEquals("Check ProvidedService number", ps.length, 1);
+ assertEquals("Check Provided Service Specs - 1", ps[0].getServiceSpecification().length, 1);
+ assertEquals("Check Provided Service Specs - 2", ps[0].getServiceSpecification()[0], FooService.class.getName());
+ assertEquals("Check Provided Service availability", ps[0].getState(), ProvidedServiceDescription.REGISTERED);
+
+ Properties prop = ps[0].getProperties();
+ assertNotNull("Check Props", prop);
+ assertEquals("Check service properties number (#" + prop + "?=5)" , prop.size(), 5);
+ assertEquals("Check instance.name property", prop.getProperty("instance.name"), compName);
+ assertEquals("Check factory.name property", prop.getProperty("factory.name"), factName);
+ assertEquals("Check foo property", prop.getProperty("foo"), "foo");
+ assertEquals("Check bar property", prop.getProperty("bar"), "2");
+ assertEquals("Check baz property", prop.getProperty("baz"), "baz");
+
+ ci.dispose();
+ }
+
+ public void testDoubleProviding() {
+ String factName = "FooBarProviderType-1";
+ String compName = "FooProvider";
+
+ // Get the factory to create a component instance
+ Factory fact = Utils.getFactoryByName(context, factName);
+ assertNotNull("Cannot find the factory FooProvider", fact);
+
+ Properties props = new Properties();
+ props.put("name", compName);
+ ComponentInstance ci = null;
+ try {
+ ci = fact.createComponentInstance(props);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), compName);
+ assertNotNull("Architecture not available", arch_ref);
+
+ Architecture arch = (Architecture) context.getService(arch_ref);
+ InstanceDescription id = arch.getInstanceDescription();
+
+ assertEquals("Check component instance name (" + id.getName() + ")", id.getName(), compName);
+ assertEquals("Check component type implementation class", id.getComponentDescription().getClassName(), "org.apache.felix.ipojo.test.scenarios.component.FooBarProviderType1");
+
+ HandlerDescription[] handlers = id.getHandlers();
+ assertEquals("Number of handlers", handlers.length, 2);
+
+ //Look for the ProvidedService Handler
+ ProvidedServiceHandlerDescription pshd = null;
+ for(int i = 0; i < handlers.length; i++) {
+ if(handlers[i].getHandlerName().equals("org.apache.felix.ipojo.handlers.providedservice.ProvidedServiceHandler")) {
+ pshd = (ProvidedServiceHandlerDescription) handlers[i];
+ }
+ }
+
+ assertNotNull("Check ProvidedServiceHandlerDescription", pshd);
+ ProvidedServiceDescription[] ps = pshd.getProvidedServices();
+
+ assertEquals("Check ProvidedService number", ps.length, 1);
+ assertEquals("Check Provided Service Specs - 1", ps[0].getServiceSpecification().length, 2);
+ assertContains("Check provided service specs - 2", ps[0].getServiceSpecification(), FooService.class.getName());;
+ assertContains("Check provided service specs - 2", ps[0].getServiceSpecification(), BarService.class.getName());
+ assertEquals("Check Provided Service availability", ps[0].getState(), ProvidedServiceDescription.REGISTERED);
+
+ ci.dispose();
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadFactories.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadFactories.java
new file mode 100644
index 0000000..baa6fee
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadFactories.java
@@ -0,0 +1,77 @@
+/*
+ * 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.test.scenarios.bad;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.HandlerFactory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+
+public class BadFactories extends OSGiTestCase {
+
+ private Element getElementFactoryWithNoClassName() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("name", "noclassname"));
+ return elem;
+ }
+
+ private Element getElementHandlerFactoryWithNoClassName() {
+ Element elem = new Element("handler", "");
+ elem.addAttribute(new Attribute("name", "noclassname"));
+ return elem;
+ }
+
+ private Element getElementHandlerFactoryWithNoName() {
+ Element elem = new Element("handler", "");
+ elem.addAttribute(new Attribute("className", "noclassname"));
+ return elem;
+ }
+
+ public void testBadFactory() {
+ try {
+ new ComponentFactory(context, getElementFactoryWithNoClassName());
+ fail("A factory with no class name must be rejected");
+ } catch (ConfigurationException e) {
+ // OK.
+ }
+ }
+
+ public void testBadHandlerFactory1() {
+ try {
+ new HandlerFactory(context, getElementHandlerFactoryWithNoClassName());
+ fail("An handler factory with no class name must be rejected");
+ } catch (ConfigurationException e) {
+ // OK.
+ }
+ }
+
+ public void testBadHandlerFactory2() {
+ try {
+ new HandlerFactory(context, getElementHandlerFactoryWithNoName());
+ fail("An handler factory with no name must be rejected");
+ } catch (ConfigurationException e) {
+ // OK.
+ }
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadLFCCallback.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadLFCCallback.java
new file mode 100644
index 0000000..8be6ac4
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadLFCCallback.java
@@ -0,0 +1,254 @@
+/*
+ * 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.test.scenarios.bad;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+
+public class BadLFCCallback extends OSGiTestCase {
+
+ private String clazz = "org.apache.felix.ipojo.test.scenarios.component.CallbackCheckService";
+ private String type = "CallbackCheckService";
+ private Element manipulation;
+ private Properties props;
+
+ public void setUp() {
+ manipulation = getManipulationForComponent();
+ props = new Properties();
+ props.put("name", "BAD");
+ }
+
+
+ private Element getNothing() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("callback", "");
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getNoTransition() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("callback", "");
+ callback.addAttribute(new Attribute("method", "start"));
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getNoMethod() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("callback", "");
+ callback.addAttribute(new Attribute("transition", "validate"));
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getBadMethod() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("callback", "");
+ callback.addAttribute(new Attribute("transition", "validate"));
+ callback.addAttribute(new Attribute("method", "start_")); // Missing method.
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getBadMethod2() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("callback", "");
+ callback.addAttribute(new Attribute("transition", "invalidate"));
+ callback.addAttribute(new Attribute("method", "stop_")); // Missing method.
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getBadTransition() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("callback", "");
+ callback.addAttribute(new Attribute("method", "start"));
+ callback.addAttribute(new Attribute("transition", "validate_"));
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getManipulationForComponent() {
+ String header = (String) context.getBundle().getHeaders().get("iPOJO-Components");
+ Element elem = null;
+ try {
+ elem = ManifestMetadataParser.parse(header);
+ } catch (ParseException e) {
+ fail("Parse Exception when parsing iPOJO-Component");
+ }
+
+ assertNotNull("Check elem not null", elem);
+
+ Element manip = getManipulationForComponent(elem, type);
+ assertNotNull("Check manipulation metadata not null for " + type, manip);
+ return manip;
+ }
+
+ private Element getManipulationForComponent(Element metadata, String comp_name) {
+ Element[] comps = metadata.getElements("component");
+ for(int i = 0; i < comps.length; i++) {
+ if(comps[i].containsAttribute("factory") && comps[i].getAttribute("factory").equals(comp_name)) {
+ return comps[i].getElements("manipulation")[0];
+ }
+ if(comps[i].containsAttribute("name") && comps[i].getAttribute("name").equals(comp_name)) {
+ return comps[i].getElements("manipulation")[0];
+ }
+ }
+ return null;
+ }
+
+ public void testNothing() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getNothing());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.dispose();
+ cf.stop();
+ fail("A lifecycle callback with a missing method and transition must be rejected " + cf);
+ } catch (ConfigurationException e) {
+ // OK
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+ public void testNoTransition() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getNoTransition());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.dispose();
+ cf.stop();
+ fail("A lifecycle callback with a missing transition must be rejected " + cf);
+ } catch (ConfigurationException e) {
+ // OK
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+ public void testNoMethod() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getNoMethod());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.dispose();
+ cf.stop();
+ fail("A lifecycle callback with a missing method must be rejected " + cf);
+ }catch (ConfigurationException e) {
+ // OK
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+ public void testBadMethod() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getBadMethod());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ if (ci.isStarted()) {
+ fail("A lifecycle callback with a bad method must be rejected (instance stills valid)" + cf);
+ }
+ ci.dispose();
+ cf.stop();
+ } catch (ConfigurationException e) {
+ //The check does not happen in the configure method.
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+ public void testBadMethod2() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getBadMethod2());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.stop();
+ if (ci.isStarted()) {
+ fail("A lifecycle callback with a bad method must be rejected (instance stills valid)" + cf);
+ }
+ ci.dispose();
+ cf.stop();
+ } catch (ConfigurationException e) {
+ //The check does not happen in the configure method.
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+ public void testBadTransition() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getBadTransition());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.dispose();
+ cf.stop();
+ fail("A lifecycle callback with a bad transition must be rejected " + cf);
+ } catch (ConfigurationException e) {
+ // OK
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadLFCController.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadLFCController.java
new file mode 100644
index 0000000..8816530
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadLFCController.java
@@ -0,0 +1,103 @@
+/*
+ * 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.test.scenarios.bad;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+
+public class BadLFCController extends OSGiTestCase {
+
+ private String clazz = "org.apache.felix.ipojo.test.scenarios.component.LifecycleControllerTest";
+
+ private Element getNoFieldController() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element controller = new Element("controller", "");
+ elem.addElement(controller);
+ return elem;
+ }
+
+ private Element getBadFieldController() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element controller = new Element("controller", "");
+ controller.addAttribute(new Attribute("field", "controller")); // Missing field
+ elem.addElement(controller);
+ elem.addElement(getManipulationForComponent("lcTest"));
+ return elem;
+ }
+
+ private Element getManipulationForComponent(String comp_name) {
+ String header = (String) context.getBundle().getHeaders().get("iPOJO-Components");
+ Element elem = null;
+ try {
+ elem = ManifestMetadataParser.parse(header);
+ } catch (ParseException e) {
+ fail("Parse Exception when parsing iPOJO-Component");
+ }
+
+ assertNotNull("Check elem not null", elem);
+
+ Element manip = getManipulationForComponent(elem, comp_name);
+ assertNotNull("Check manipulation metadata not null for " + comp_name, manip);
+ return manip;
+ }
+
+ private Element getManipulationForComponent(Element metadata, String comp_name) {
+ Element[] comps = metadata.getElements("component");
+ for(int i = 0; i < comps.length; i++) {
+ if(comps[i].containsAttribute("factory") && comps[i].getAttribute("factory").equals(comp_name)) {
+ return comps[i].getElements("manipulation")[0];
+ }
+ if(comps[i].containsAttribute("name") && comps[i].getAttribute("name").equals(comp_name)) {
+ return comps[i].getElements("manipulation")[0];
+ }
+ }
+ return null;
+ }
+
+ public void testNoField() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getNoFieldController());
+ cf.start();
+ cf.stop();
+ fail("A lifecycle controller with a missing field must be rejected " + cf);
+ } catch (Exception e) {
+ // OK
+ }
+ }
+
+ public void testBadField() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getBadFieldController());
+ cf.start();
+ cf.stop();
+ fail("A lifecycle controller with a bad field must be rejected " + cf);
+ } catch (Exception e) {
+ // OK
+ }
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadServiceDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadServiceDependencies.java
new file mode 100644
index 0000000..5bd57c0
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadServiceDependencies.java
@@ -0,0 +1,231 @@
+/*
+ * 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.test.scenarios.bad;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.metadata.Attribute;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+
+public class BadServiceDependencies extends OSGiTestCase {
+
+ private String clazz = "org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider";
+ private String type = "BothCheckServiceProvider";
+ private Element manipulation;
+ private Properties props;
+
+ public void setUp() {
+ manipulation = getManipulationForComponent();
+ props = new Properties();
+ props.put("name", "BAD");
+ }
+
+
+ private Element getNothing() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("requires", "");
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getNoField() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("requires", "");
+ callback.addAttribute(new Attribute("filter", "(foo=bar)"));
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getBadField() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("requires", "");
+ callback.addAttribute(new Attribute("field", "BAD_FIELD")); // missing field.
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getBadFilter() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("requires", "");
+ callback.addAttribute(new Attribute("field", "fs"));
+ callback.addAttribute(new Attribute("filter", "(foo=bar)&(bar=foo)")); // Incorrect filter
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getBadType() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("requires", "");
+ callback.addAttribute(new Attribute("field", "fs"));
+ callback.addAttribute(new Attribute("interface", BarService.class.getName()));
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+ private Element getBadAggregate() {
+ Element elem = new Element("component", "");
+ elem.addAttribute(new Attribute("classname", clazz));
+
+ Element callback = new Element("requires", "");
+ callback.addAttribute(new Attribute("field", "fs"));
+ callback.addAttribute(new Attribute("aggregate", "true"));
+ elem.addElement(callback);
+ elem.addElement(manipulation);
+ return elem;
+ }
+
+
+ private Element getManipulationForComponent() {
+ String header = (String) context.getBundle().getHeaders().get("iPOJO-Components");
+ Element elem = null;
+ try {
+ elem = ManifestMetadataParser.parse(header);
+ } catch (ParseException e) {
+ fail("Parse Exception when parsing iPOJO-Component");
+ }
+
+ assertNotNull("Check elem not null", elem);
+
+ Element manip = getManipulationForComponent(elem, type);
+ assertNotNull("Check manipulation metadata not null for " + type, manip);
+ return manip;
+ }
+
+ private Element getManipulationForComponent(Element metadata, String comp_name) {
+ Element[] comps = metadata.getElements("component");
+ for(int i = 0; i < comps.length; i++) {
+ if(comps[i].containsAttribute("factory") && comps[i].getAttribute("factory").equals(comp_name)) {
+ return comps[i].getElements("manipulation")[0];
+ }
+ if(comps[i].containsAttribute("name") && comps[i].getAttribute("name").equals(comp_name)) {
+ return comps[i].getElements("manipulation")[0];
+ }
+ }
+ return null;
+ }
+
+ public void testNothing() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getNothing());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.dispose();
+ cf.stop();
+ fail("A service requirement with neither field and method must be rejected " + cf);
+ } catch (ConfigurationException e) {
+ // OK
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+ public void testNoField() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getNoField());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.dispose();
+ cf.stop();
+ fail("A service requirement with neither field and method must be rejected " + cf);
+ } catch (ConfigurationException e) {
+ // OK
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+ public void testBadField() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getBadField());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.dispose();
+ cf.stop();
+ fail("A service requirement with a bad field must be rejected " + cf);
+ }catch (ConfigurationException e) {
+ // OK
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+ public void testBadFilter() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getBadFilter());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.dispose();
+ cf.stop();
+ fail("A service requirement with a bad filter must be rejected " + cf);
+ }catch (ConfigurationException e) {
+ //OK
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+
+ public void testBadType() {
+ try {
+ ComponentFactory cf = new ComponentFactory(context, getBadType());
+ cf.start();
+ ComponentInstance ci = cf.createComponentInstance(props);
+ ci.dispose();
+ cf.stop();
+ fail("A service requirement with a bad type must be rejected " + cf);
+ }catch (ConfigurationException e) {
+ // OK
+ } catch (UnacceptableConfiguration e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ } catch (MissingHandlerException e) {
+ fail("Unexpected exception when creating an instance : " + e.getMessage());
+ }
+ }
+ }
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadTestSuite.java
new file mode 100644
index 0000000..71d7db0
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/bad/BadTestSuite.java
@@ -0,0 +1,37 @@
+/*
+ * 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.test.scenarios.bad;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class BadTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Bad configuration test suite", bc);
+ ots.addTestSuite(BadFactories.class);
+ ots.addTestSuite(BadLFCController.class);
+ ots.addTestSuite(BadLFCCallback.class);
+ ots.addTestSuite(BadServiceDependencies.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/A123/CheckService2Provider.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/A123/CheckService2Provider.java
new file mode 100644
index 0000000..9202b1d
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/A123/CheckService2Provider.java
@@ -0,0 +1,30 @@
+/*
+ * 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.test.scenarios.component.A123;
+
+import org.apache.felix.ipojo.test.scenarios.service.A123.CheckService2;
+
+public class CheckService2Provider implements CheckService2 {
+
+ public boolean check() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/A123/Manipulation23Tester.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/A123/Manipulation23Tester.java
new file mode 100644
index 0000000..fe17b96
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/A123/Manipulation23Tester.java
@@ -0,0 +1,124 @@
+/*
+ * 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.test.scenarios.component.A123;
+
+import org.apache.felix.ipojo.test.scenarios.service.PrimitiveManipulationTestService;
+
+
+public class Manipulation23Tester implements PrimitiveManipulationTestService {
+
+
+ // Integer types
+ byte b = 1;
+ short s = 1;
+ int i = 1;
+ long l = 1;
+
+ // Floatting types
+ double d = 1.1;
+ float f = 1.1f;
+
+ // Character
+ char c = 'a';
+
+ // Boolean
+ boolean bool = false;
+
+ // Integer arrays
+ byte[] bs = new byte[] {0,1,2};
+ short[] ss = new short[] {0,1,2};
+ int[] is = new int[] {0,1,2};
+ long[] ls = new long[] {0,1,2};
+
+ double[] ds = new double[] {0.0, 1.1, 2.2};
+ float[] fs = new float[] {0.0f, 1.1f, 2.2f};
+
+ char[] cs = new char[] {'a', 'b', 'c'};
+
+ boolean[] bools = new boolean[] {false, true, false};
+
+ public boolean getBoolean() { return bool; }
+
+ public boolean[] getBooleans() { return bools; }
+
+ public byte getByte() { return b; }
+
+ public byte[] getBytes() { return bs; }
+
+ public char getChar() { return c; }
+
+ public char[] getChars() { return cs; }
+
+ public double getDouble() { return d; }
+
+ public double[] getDoubles() { return ds; }
+
+ public float getFloat() { return f; }
+
+ public float[] getFloats() { return fs; }
+
+ public int getInt() { return i; }
+
+ public int[] getInts() { return is; }
+
+ public long getLong() { return l; }
+
+ public long[] getLongs() { return ls; }
+
+ public short getShort() { return s; }
+
+ public short[] getShorts() { return ss; }
+
+ public void setBoolean(boolean b) { this.bool = b; }
+
+ public void setBooleans(boolean[] bs) { this.bools = bs; }
+
+ public void setByte(byte b) { this.b = b; }
+
+ public void setBytes(byte[] bs) { this.bs = bs; }
+
+ public void setChar(char c) { this.c = c; }
+
+ public void setChars(char[] cs) { this.cs = cs; }
+
+ public void setDouble(double d) { this.d = d; }
+
+ public void setDoubles(double[] ds) { this.ds = ds; }
+
+ public void setFloat(float f) { this.f = f; }
+
+ public void setFloats(float[] fs) { this.fs = fs; }
+
+ public void setInt(int i) { this.i = i; }
+
+ public void setInts(int[] is) { this.is = is; }
+
+ public void setLong(long l) { this.l = l; }
+
+ public void setLongs(long[] ls) { this.ls = ls; }
+
+ public void setShort(short s) { this.s = s; }
+
+ public void setShorts(short[] ss) { this.ss = ss; }
+
+ public void setLong(long l, String s) {
+ this.l = l;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Baz2CheckProvider.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Baz2CheckProvider.java
new file mode 100644
index 0000000..1e7cb1d
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Baz2CheckProvider.java
@@ -0,0 +1,81 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class Baz2CheckProvider implements CheckService {
+
+ BazService fs;
+
+ int simpleB = 0;
+ int objectB = 0;
+ int refB = 0;
+ int simpleU = 0;
+ int objectU = 0;
+ int refU = 0;
+
+ public boolean check() {
+ return fs.foo();
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("result", new Boolean(fs.foo()));
+ props.put("voidB", new Integer(simpleB));
+ props.put("objectB", new Integer(objectB));
+ props.put("refB", new Integer(refB));
+ props.put("voidU", new Integer(simpleU));
+ props.put("objectU", new Integer(objectU));
+ props.put("refU", new Integer(refU));
+ props.put("boolean", new Boolean(fs.getBoolean()));
+ props.put("int", new Integer(fs.getInt()));
+ props.put("long", new Long(fs.getLong()));
+ props.put("double", new Double(fs.getDouble()));
+ if(fs.getObject() != null) { props.put("object", fs.getObject()); }
+
+ return props;
+ }
+
+ private void voidBind() {
+ simpleB++;
+ }
+ private void voidUnbind() {
+ simpleU++;
+ }
+
+ protected void objectBind(Object o) {
+ if(o != null && o instanceof FooService) { objectB++; }
+ }
+ protected void objectUnbind(Object o) {
+ if(o != null && o instanceof FooService) { objectU++; }
+ }
+
+ public void refBind(ServiceReference sr) {
+ if(sr != null) { refB++; }
+ }
+ public void refUnbind(ServiceReference sr) {
+ if(sr != null) { refU++; }
+ }
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/BazProviderType1.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/BazProviderType1.java
new file mode 100644
index 0000000..4d9a9bb
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/BazProviderType1.java
@@ -0,0 +1,51 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.BazService;
+
+public class BazProviderType1 implements BazService {
+
+ private int m_bar;
+ private String m_foo;
+
+ public boolean foo() {
+ return true;
+ }
+
+ public Properties fooProps() {
+ Properties p = new Properties();
+ p.put("bar", new Integer(m_bar));
+ p.put("foo", m_foo);
+ return p;
+ }
+
+ public boolean getBoolean() { return true; }
+
+ public double getDouble() { return 1.0; }
+
+ public int getInt() { return 1; }
+
+ public long getLong() { return 1; }
+
+ public Boolean getObject() { return new Boolean(true); }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CallbackCheckService.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CallbackCheckService.java
new file mode 100644
index 0000000..76176c8
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CallbackCheckService.java
@@ -0,0 +1,68 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class CallbackCheckService extends ParentClass implements CheckService {
+
+ int i = 0;
+
+ FooService fs;
+
+ public static CallbackCheckService singleton;
+
+ public static int count = 0;
+
+ private static CallbackCheckService singleton() {
+ if (singleton == null) {
+ count++;
+ singleton = new CallbackCheckService();
+ }
+ return singleton;
+ }
+
+ public static CallbackCheckService several() {
+ count++;
+ return new CallbackCheckService();
+ }
+
+ private void start() {
+ i++;
+ }
+
+ protected void stop() {
+ i++;
+ }
+
+ public boolean check() {
+ return fs.foo();
+ }
+
+ public Properties getProps() {
+ Properties p = new Properties();
+ p.put("int", new Integer(i));
+ p.put("count", new Integer(count));
+ return p;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckProviderParentClass.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckProviderParentClass.java
new file mode 100644
index 0000000..675fe41
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckProviderParentClass.java
@@ -0,0 +1,51 @@
+/*
+ * 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.test.scenarios.component;
+
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public abstract class CheckProviderParentClass {
+
+ int simpleU = 0;
+ int objectU = 0;
+ int refU = 0;
+ int bothU = 0;
+
+
+ public void bothUnbind(FooService o, ServiceReference sr) {
+ if(sr != null && o != null && o instanceof FooService) { bothU++; }
+ }
+
+ public void refUnbind(ServiceReference sr) {
+ if(sr != null) { refU++; }
+ }
+
+ public void objectUnbind(FooService o) {
+ if(o != null && o instanceof FooService) { objectU++; }
+ else {
+ System.err.println("Unbind null : " + o);
+ }
+ }
+
+ public void voidUnbind() {
+ simpleU++;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceProvider.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceProvider.java
new file mode 100644
index 0000000..ffaab9f
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/CheckServiceProvider.java
@@ -0,0 +1,81 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class CheckServiceProvider extends CheckProviderParentClass implements CheckService {
+
+ FooService fs;
+
+ int simpleB = 0;
+ int objectB = 0;
+ int refB = 0;
+ int bothB = 0;
+
+ public boolean check() {
+ return fs.foo();
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("result", new Boolean(fs.foo()));
+ props.put("voidB", new Integer(simpleB));
+ props.put("objectB", new Integer(objectB));
+ props.put("refB", new Integer(refB));
+ props.put("bothB", new Integer(bothB));
+ props.put("voidU", new Integer(simpleU));
+ props.put("objectU", new Integer(objectU));
+ props.put("refU", new Integer(refU));
+ props.put("bothU", new Integer(bothU));
+ props.put("boolean", new Boolean(fs.getBoolean()));
+ props.put("int", new Integer(fs.getInt()));
+ props.put("long", new Long(fs.getLong()));
+ props.put("double", new Double(fs.getDouble()));
+ props.put("static", CheckService.foo);
+ props.put("class", CheckService.class.getName());
+ if(fs.getObject() != null) { props.put("object", fs.getObject()); }
+ return props;
+ }
+
+ private void voidBind() {
+ simpleB++;
+ }
+
+ protected void objectBind(FooService o) {
+ if (o == null) {
+ System.err.println("Bind receive null !!! ");
+ return;
+ }
+ if(o != null && o instanceof FooService) { objectB++; }
+ }
+
+ public void refBind(ServiceReference sr) {
+ if(sr != null) { refB++; }
+ }
+
+ public void bothBind(FooService o, ServiceReference sr) {
+ if(sr != null && o != null && o instanceof FooService) { bothB++; }
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ConfigurableCheckServiceProvider.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ConfigurableCheckServiceProvider.java
new file mode 100644
index 0000000..5ae13cb
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ConfigurableCheckServiceProvider.java
@@ -0,0 +1,202 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+
+public class ConfigurableCheckServiceProvider implements CheckService {
+
+ // Integer types
+ byte b;
+ short s;
+ int i;
+ long l;
+
+ // Floatting types
+ double d;
+ float f;
+
+ // Character
+ char c;
+
+ // Boolean
+ boolean bool;
+
+ // Integer arrays
+ byte[] bs;
+ short[] ss;
+ int[] is;
+ long[] ls;
+
+ double[] ds;
+ float[] fs;
+
+ char[] cs;
+
+ boolean[] bools;
+
+ String string;
+ String[] strings;
+
+ int upB, upS, upI, upL, upD, upF, upC, upBool, upBs, upSs, upIs, upLs, upDs, upFs, upCs, upBools, upString, upStrings;
+
+
+ public boolean check() {
+ return true;
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("b", new Byte(b));
+ props.put("s", new Short(s));
+ props.put("i", new Integer(i));
+ props.put("l", new Long(l));
+ props.put("d", new Double(d));
+ props.put("f", new Float(f));
+ props.put("c", new Character(c));
+ props.put("bool", new Boolean(bool));
+
+ props.put("bs", bs);
+ props.put("ss", ss);
+ props.put("is", is);
+ props.put("ls", ls);
+ props.put("ds", ds);
+ props.put("fs", fs);
+ props.put("cs", cs);
+ props.put("bools", bools);
+
+ props.put("upb", new Integer(upB));
+ props.put("ups", new Integer(upS));
+ props.put("upi", new Integer(upI));
+ props.put("upl", new Integer(upL));
+ props.put("upd", new Integer(upD));
+ props.put("upf", new Integer(upF));
+ props.put("upc", new Integer(upC));
+ props.put("upbool", new Integer(upBool));
+
+ props.put("upbs", new Integer(upBs));
+ props.put("upss", new Integer(upSs));
+ props.put("upis", new Integer(upIs));
+ props.put("upls", new Integer(upLs));
+ props.put("upds", new Integer(upDs));
+ props.put("upfs", new Integer(upFs));
+ props.put("upcs", new Integer(upCs));
+ props.put("upbools", new Integer(upBools));
+
+ props.put("string", string);
+ props.put("strings", strings);
+ props.put("upstring", new Integer(upString));
+ props.put("upstrings", new Integer(upStrings));
+
+ return props;
+ }
+
+ public void updateB(byte bb) {
+ b = bb;
+ upB++;
+ }
+
+ public void updateS(short bb) {
+ s = bb;
+ upS++;
+ }
+
+ public void updateI(int bb) {
+ i = bb;
+ upI++;
+ }
+
+ public void updateL(long bb) {
+ l = bb;
+ upL++;
+ }
+
+ public void updateD(double bb) {
+ d = bb;
+ upD++;
+ }
+
+ public void updateF(float bb) {
+ f = bb;
+ upF++;
+ }
+
+ public void updateC(char bb) {
+ c = bb;
+ upC++;
+ }
+
+ public void updateBool(boolean bb) {
+ bool = bb;
+ upBool++;
+ }
+
+ public void updateBs(byte[] bb) {
+ bs = bb;
+ upBs++;
+ }
+
+ public void updateSs(short[] bb) {
+ ss = bb;
+ upSs++;
+ }
+
+ public void updateIs(int[] bb) {
+ is = bb;
+ upIs++;
+ }
+
+ public void updateLs(long[] bb) {
+ ls = bb;
+ upLs++;
+ }
+
+ public void updateDs(double[] bb) {
+ ds = bb;
+ upDs++;
+ }
+
+ public void updateFs(float[] bb) {
+ fs = bb;
+ upFs++;
+ }
+
+ public void updateCs(char[] bb) {
+ cs = bb;
+ upCs++;
+ }
+
+ public void updateBools(boolean[] bb) {
+ bools = bb;
+ upBools++;
+ }
+
+ public void updateStrings(String[] bb) {
+ strings = bb;
+ upStrings++;
+ }
+
+ public void updateString(String bb) {
+ string = bb;
+ upString++;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FilterCheckProvider.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FilterCheckProvider.java
new file mode 100644
index 0000000..c05090d
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FilterCheckProvider.java
@@ -0,0 +1,95 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class FilterCheckProvider implements CheckService, FooService {
+
+ private String m_toto;
+
+ private int bind;
+
+ private int unbind;
+
+ public FilterCheckProvider(){
+ m_toto = "A";
+ }
+
+ public boolean check() {
+ if (m_toto.equals("A")){
+ m_toto="B";
+ return true;
+ } else {
+ m_toto="A";
+ return false;
+ }
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("Bind", new Integer(bind-unbind));
+ return null;
+ }
+
+ private void Bind() {
+ bind++;
+ }
+ private void Unbind() {
+ unbind++;
+ }
+
+ public boolean foo() {
+ return true;
+ }
+
+ public Properties fooProps() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean getBoolean() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public double getDouble() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getInt() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public long getLong() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public Boolean getObject() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FilterCheckSubscriber.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FilterCheckSubscriber.java
new file mode 100644
index 0000000..2c25e8c
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FilterCheckSubscriber.java
@@ -0,0 +1,55 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.Nullable;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class FilterCheckSubscriber implements CheckService {
+
+ private FooService m_foo;
+
+ private int binded;
+
+ public FilterCheckSubscriber(){
+ }
+
+ public boolean check() {
+ m_foo.foo();
+ return true;
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("Bind", new Integer(binded));
+ props.put("Nullable", new Boolean(m_foo instanceof Nullable));
+ return props;
+ }
+
+ private void Bind() {
+ binded++;
+ }
+ private void Unbind() {
+ binded--;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooBarProviderType1.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooBarProviderType1.java
new file mode 100644
index 0000000..2b739b4
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooBarProviderType1.java
@@ -0,0 +1,54 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class FooBarProviderType1 implements FooService, BarService {
+
+ public boolean foo() {
+ return true;
+ }
+
+ public Properties fooProps() {
+ return new Properties();
+ }
+
+ public boolean bar() {
+ return true;
+ }
+
+ public Properties getProps() {
+ return new Properties();
+ }
+
+ public boolean getBoolean() { return true; }
+
+ public double getDouble() { return 1.0; }
+
+ public int getInt() { return 1; }
+
+ public long getLong() { return 1; }
+
+ public Boolean getObject() { return new Boolean(true); }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderType1.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderType1.java
new file mode 100644
index 0000000..3fe9bad
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderType1.java
@@ -0,0 +1,117 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.BundleContext;
+
+public class FooProviderType1 implements FooService {
+
+ private int m_bar;
+ private String m_foo;
+
+ private BundleContext m_context;
+
+ private static FooProviderType1 singleton;
+ private static int count = 0;
+
+ private static FooProviderType1 singleton(BundleContext bc) {
+ if (singleton == null) {
+ count++;
+ singleton = new FooProviderType1(bc);
+ }
+ return singleton;
+ }
+
+ public static FooProviderType1 several(BundleContext bc) {
+ count++;
+ return new FooProviderType1(bc);
+ }
+
+ public FooProviderType1(BundleContext bc) {
+ if (bc ==null) {
+ throw new RuntimeException("Injected bundle context null");
+ }
+ m_context = bc;
+ }
+
+ public boolean foo() {
+ return true;
+ }
+
+ public Properties fooProps() {
+ Properties p = new Properties();
+ p.put("bar", new Integer(m_bar));
+ if(m_foo != null) {
+ p.put("foo", m_foo);
+ }
+ p.put("context", m_context);
+
+ p.put("count", new Integer(count));
+ return p;
+ }
+
+ public void testException() throws Exception {
+ String a = "foobarbaz";
+ throw new Exception("foo"+a);
+ }
+
+ public void testTry() {
+ String a = "foo";
+ a.charAt(0);
+ }
+
+ public void testTry2(String s) {
+ String a = "foo";
+ a.charAt(0);
+ }
+
+ private void nexttry(String s) {
+ try {
+ s += "foo";
+ } catch(RuntimeException e) {
+
+ }
+ }
+
+ public boolean getBoolean() { return true; }
+
+ public double getDouble() { return 1.0; }
+
+ public int getInt() { return 1; }
+
+ public long getLong() { return 1; }
+
+ public Boolean getObject() { return new Boolean(true); }
+
+ /**
+ * Custom constructor.
+ * @param bar
+ * @param foo
+ * @param bc
+ */
+ public FooProviderType1(int bar, String foo, BundleContext bc) {
+ m_bar = bar;
+ m_foo = foo;
+ m_context = bc;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderTypeDyn.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderTypeDyn.java
new file mode 100644
index 0000000..39f3918
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderTypeDyn.java
@@ -0,0 +1,63 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class FooProviderTypeDyn implements FooService {
+
+ private int intProp;
+ private String strProp;
+ private String[] strAProp;
+ private int[] intAProp;
+ private boolean boolProp;
+
+ public boolean foo() {
+ intProp = 3;
+ boolProp = true;
+ if(strProp.equals("foo")) { strProp = "bar"; }
+ else { strProp = "foo"; }
+ strAProp = new String[] {"foo", "bar", "baz"};
+ intAProp = new int[] {3, 2, 1};
+ return true;
+ }
+
+ public Properties fooProps() {
+ Properties p = new Properties();
+ p.put("intProp", new Integer(intProp));
+ p.put("boolProp", new Boolean(boolProp));
+ p.put("strProp", strProp);
+ p.put("strAProp", strAProp);
+ p.put("intAProp", intAProp);
+ return p;
+ }
+
+ public boolean getBoolean() { return true; }
+
+ public double getDouble() { return 1.0; }
+
+ public int getInt() { return 1; }
+
+ public long getLong() { return 1; }
+
+ public Boolean getObject() { return new Boolean(true); }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderTypeDyn2.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderTypeDyn2.java
new file mode 100644
index 0000000..f5f233a
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderTypeDyn2.java
@@ -0,0 +1,58 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class FooProviderTypeDyn2 implements FooService {
+
+ private int intProp = 2;
+ private boolean boolProp = true;
+ private String strProp = "foo";
+ private String[] strAProp = new String[] {"foo", "bar"};
+ private int[] intAProp = new int[] {1, 2, 3};
+
+ public boolean foo() {
+ intAProp = null;
+ return true;
+ }
+
+ public Properties fooProps() {
+ Properties p = new Properties();
+ p.put("intProp", new Integer(intProp));
+ p.put("boolProp", new Boolean(boolProp));
+ p.put("strProp", strProp);
+ p.put("strAProp", strAProp);
+ p.put("intAProp", intAProp);
+ return p;
+ }
+
+ public boolean getBoolean() { return true; }
+
+ public double getDouble() { return 1.0; }
+
+ public int getInt() { return 1; }
+
+ public long getLong() { return 1; }
+
+ public Boolean getObject() { return new Boolean(true); }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooServiceDefaultImpl.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooServiceDefaultImpl.java
new file mode 100644
index 0000000..8455c23
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooServiceDefaultImpl.java
@@ -0,0 +1,55 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class FooServiceDefaultImpl implements FooService {
+
+ public boolean foo() {
+ return false;
+ }
+
+ public Properties fooProps() {
+ return null;
+ }
+
+ public boolean getBoolean() {
+ return false;
+ }
+
+ public double getDouble() {
+ return 5;
+ }
+
+ public int getInt() {
+ return 5;
+ }
+
+ public long getLong() {
+ return 5;
+ }
+
+ public Boolean getObject() {
+ return null;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/LifecycleControllerTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/LifecycleControllerTest.java
new file mode 100644
index 0000000..c69bad5
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/LifecycleControllerTest.java
@@ -0,0 +1,49 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+
+public class LifecycleControllerTest implements CheckService {
+
+ private boolean m_state = true;
+ private String m_conf;
+
+ public void setConf(String newConf) {
+ if (newConf.equals("foo")) {
+ m_state = true;
+ } else {
+ m_state = false;
+ }
+ }
+
+ public boolean check() {
+ return m_state;
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("conf", m_conf);
+ props.put("state", new Boolean(m_state));
+ return props;
+ }
+}
+
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Manipulation23Tester.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Manipulation23Tester.java
new file mode 100644
index 0000000..deff64e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Manipulation23Tester.java
@@ -0,0 +1,124 @@
+/*
+ * 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.test.scenarios.component;
+
+import org.apache.felix.ipojo.test.scenarios.service.PrimitiveManipulationTestService;
+
+
+public class Manipulation23Tester implements PrimitiveManipulationTestService {
+
+ // Integer types
+ byte b = 1;
+ short s = 1;
+ int i = 1;
+ long l = 1;
+
+ // Floatting types
+ double d = 1.1;
+ float f = 1.1f;
+
+ // Character
+ char c = 'a';
+
+ // Boolean
+ boolean bool = false;
+
+ // Integer arrays
+ byte[] bs = new byte[] {0,1,2};
+ short[] ss = new short[] {0,1,2};
+ int[] is = new int[] {0,1,2};
+ long[] ls = new long[] {0,1,2};
+
+ double[] ds = new double[] {0.0, 1.1, 2.2};
+ float[] fs = new float[] {0.0f, 1.1f, 2.2f};
+
+ char[] cs = new char[] {'a', 'b', 'c'};
+
+ boolean[] bools = new boolean[] {false, true, false};
+
+ public boolean getBoolean() { return bool; }
+
+ public boolean[] getBooleans() { return bools; }
+
+ public byte getByte() { return b; }
+
+ public byte[] getBytes() { return bs; }
+
+ public char getChar() { return c; }
+
+ public char[] getChars() { return cs; }
+
+ public double getDouble() { return d; }
+
+ public double[] getDoubles() { return ds; }
+
+ public float getFloat() { return f; }
+
+ public float[] getFloats() { return fs; }
+
+ public int getInt() { return i; }
+
+ public int[] getInts() { return is; }
+
+ public long getLong() { return l; }
+
+ public long[] getLongs() { return ls; }
+
+ public short getShort() { return s; }
+
+ public short[] getShorts() { return ss; }
+
+ public void setBoolean(boolean b) { this.bool = b; }
+
+ public void setBooleans(boolean[] bs) { this.bools = bs; }
+
+ public void setByte(byte b) { this.b = b; }
+
+ public void setBytes(byte[] bs) { this.bs = bs; }
+
+ public void setChar(char c) { this.c = c; }
+
+ public void setChars(char[] cs) { this.cs = cs; }
+
+ public void setDouble(double d) { this.d = d; }
+
+ public void setDoubles(double[] ds) { this.ds = ds; }
+
+ public void setFloat(float f) { this.f = f; }
+
+ public void setFloats(float[] fs) { this.fs = fs; }
+
+ public void setInt(int i) { this.i = i; }
+
+ public void setInts(int[] is) { this.is = is; }
+
+ public void setLong(long l) { this.l = l; }
+
+ public void setLongs(long[] ls) { this.ls = ls; }
+
+ public void setShort(short s) { this.s = s; }
+
+ public void setShorts(short[] ss) { this.ss = ss; }
+
+ // This method has been added to test an issue when autoboxing.
+ public void setLong(long l, String s) {
+ this.l = l;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MethodCheckServiceProvider.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MethodCheckServiceProvider.java
new file mode 100644
index 0000000..c069b09
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MethodCheckServiceProvider.java
@@ -0,0 +1,106 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public class MethodCheckServiceProvider implements CheckService {
+
+ FooService fs;
+
+ BundleContext context;
+
+ int simpleB = 0;
+ int objectB = 0;
+ int refB = 0;
+ int bothB = 0;
+ int simpleU = 0;
+ int objectU = 0;
+ int refU = 0;
+ int bothU = 0;
+
+
+ public MethodCheckServiceProvider(BundleContext bc) {
+ context = bc;
+ }
+
+ public boolean check() {
+ return fs.foo();
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ if(fs != null) {
+ props.put("result", new Boolean(fs.foo()));
+ props.put("boolean", new Boolean(fs.getBoolean()));
+ props.put("int", new Integer(fs.getInt()));
+ props.put("long", new Long(fs.getLong()));
+ props.put("double", new Double(fs.getDouble()));
+ } else {
+ props.put("result", new Boolean(false));
+ }
+ props.put("voidB", new Integer(simpleB));
+ props.put("objectB", new Integer(objectB));
+ props.put("refB", new Integer(refB));
+ props.put("bothB", new Integer(bothB));
+ props.put("voidU", new Integer(simpleU));
+ props.put("objectU", new Integer(objectU));
+ props.put("refU", new Integer(refU));
+ props.put("bothU", new Integer(bothU));
+
+ if(fs != null) {
+ if(fs.getObject() != null) { props.put("object", fs.getObject()); }
+ }
+
+ return props;
+ }
+
+ protected void objectBind(FooService o) {
+ if(o != null && o instanceof FooService) { objectB++; }
+ fs = o;
+ }
+ protected void objectUnbind(FooService o) {
+ if(o != null && o instanceof FooService) { objectU++; }
+ fs = null;
+ }
+
+ public void refBind(ServiceReference sr) {
+ if(sr != null) { refB++; }
+ fs = (FooService) context.getService(sr);
+ }
+ public void refUnbind(ServiceReference sr) {
+ if(sr != null) { refU++; }
+ context.ungetService(sr);
+ fs = null;
+ }
+
+ protected void bothBind(FooService o, ServiceReference ref) {
+ if(ref != null && o != null && o instanceof FooService) { bothB++; }
+ fs = o;
+ }
+ protected void bothUnbind(FooService o, ServiceReference ref) {
+ if(ref != null && o != null && o instanceof FooService) { bothU++; }
+ fs = null;
+ }
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MethodMultipleCheckService.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MethodMultipleCheckService.java
new file mode 100644
index 0000000..32d4b1d
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MethodMultipleCheckService.java
@@ -0,0 +1,153 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+
+public class MethodMultipleCheckService implements CheckService {
+
+ List fs = new ArrayList();
+ BundleContext context;
+
+ int simpleB = 0;
+
+ int objectB = 0;
+
+ int refB = 0;
+
+ int bothB = 0;
+
+ int simpleU = 0;
+
+ int objectU = 0;
+
+ int refU = 0;
+
+ int bothU = 0;
+
+ public MethodMultipleCheckService(BundleContext bc) {
+ context = bc;
+ }
+
+ public boolean check() {
+ boolean r = fs.size() != 0;
+ for(int i = 0; i < fs.size(); i++) {
+ r = r & ((FooService) fs.get(i)).foo();
+ }
+ return r;
+ }
+
+ private boolean getBoolean() {
+ return check();
+ }
+
+ private int getInt() {
+ int r = 0;
+ for(int i = 0; i < fs.size(); i++) {
+ r = r + ((FooService) fs.get(i)).getInt();
+ }
+ return r;
+ }
+
+ private long getLong() {
+ long r = 0;
+ for(int i = 0; i < fs.size(); i++) {
+ r = r + ((FooService) fs.get(i)).getLong();
+ }
+ return r;
+ }
+
+ private double getDouble() {
+ double r = 0.0;
+ for(int i = 0; i < fs.size(); i++) {
+ r = r + ((FooService) fs.get(i)).getInt();
+ }
+ return r;
+ }
+
+ protected Object doNothing(Object o, String s) { return null; }
+
+// private Object getObject() {
+// boolean r = true;
+// for(int i = 0; i < fs.length; i++) {
+// r = r && ((Boolean) fs[i].getObject()).booleanValue();
+// }
+// return new Boolean(r);
+// }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("result", new Boolean(check()));
+ props.put("voidB", new Integer(simpleB));
+ props.put("objectB", new Integer(objectB));
+ props.put("refB", new Integer(refB));
+ props.put("bothB", new Integer(bothB));
+ props.put("voidU", new Integer(simpleU));
+ props.put("objectU", new Integer(objectU));
+ props.put("refU", new Integer(refU));
+ props.put("bothU", new Integer(bothU));
+ props.put("boolean", new Boolean(getBoolean()));
+ props.put("int", new Integer(getInt()));
+ props.put("long", new Long(getLong()));
+ props.put("double", new Double(getDouble()));
+
+ return props;
+ }
+
+ public void objectBind(FooService o) {
+ if(o != null && o instanceof FooService) { objectB++; }
+ fs.add(o);
+ }
+ public void objectUnbind(FooService o) {
+ if(o != null && o instanceof FooService) { objectU++; }
+ fs.remove(o);
+ }
+
+ public void refBind(ServiceReference sr) {
+ if(sr != null) { refB++; }
+ fs.add(context.getService(sr));
+ }
+ public void refUnbind(ServiceReference sr) {
+ if(sr != null) { refU++; }
+ fs.remove(context.getService(sr));
+ context.ungetService(sr);
+ }
+
+ public void bothBind(FooService o, ServiceReference sr) {
+ if (o != null && o instanceof FooService && sr != null) {
+ fs.add(o);
+ bothB++;
+ }
+ }
+
+ public void bothUnbind(FooService o, ServiceReference sr) {
+ if (o != null && o instanceof FooService && sr != null) {
+ fs.remove(o);
+ bothU++;
+ }
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MultipleCheckService.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MultipleCheckService.java
new file mode 100644
index 0000000..efbc972
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MultipleCheckService.java
@@ -0,0 +1,158 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.osgi.framework.ServiceReference;
+
+public class MultipleCheckService implements CheckService {
+
+ FooService fs[];
+
+ int simpleB = 0;
+
+ int objectB = 0;
+
+ int refB = 0;
+
+ int bothB = 0;
+
+ int simpleU = 0;
+
+ int objectU = 0;
+
+ int refU = 0;
+
+ int bothU = 0;
+
+ public boolean check() {
+ boolean r = fs.length != 0;
+ for (int i = 0; i < fs.length; i++) {
+ r = r & fs[i].foo();
+ }
+ return r;
+ }
+
+ private boolean getBoolean() {
+ return check();
+ }
+
+ private int getInt() {
+ int r = 0;
+ for (int i = 0; i < fs.length; i++) {
+ r = r + fs[i].getInt();
+ }
+ return r;
+ }
+
+ private long getLong() {
+ long r = 0;
+ for (int i = 0; i < fs.length; i++) {
+ r = r + fs[i].getLong();
+ }
+ return r;
+ }
+
+ private double getDouble() {
+ double r = 0.0;
+ for (int i = 0; i < fs.length; i++) {
+ r = r + fs[i].getInt();
+ }
+ return r;
+ }
+
+ protected Object doNothing(Object o, String s) {
+ return null;
+ }
+
+ // private Object getObject() {
+ // boolean r = true;
+ // for(int i = 0; i < fs.length; i++) {
+ // r = r && ((Boolean) fs[i].getObject()).booleanValue();
+ // }
+ // return new Boolean(r);
+ // }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("result", new Boolean(check()));
+ props.put("voidB", new Integer(simpleB));
+ props.put("objectB", new Integer(objectB));
+ props.put("refB", new Integer(refB));
+ props.put("bothB", new Integer(bothB));
+ props.put("voidU", new Integer(simpleU));
+ props.put("objectU", new Integer(objectU));
+ props.put("refU", new Integer(refU));
+ props.put("bothU", new Integer(bothU));
+ props.put("boolean", new Boolean(getBoolean()));
+ props.put("int", new Integer(getInt()));
+ props.put("long", new Long(getLong()));
+ props.put("double", new Double(getDouble()));
+
+ return props;
+ }
+
+ public void voidBind() {
+ simpleB++;
+ }
+
+ public void voidUnbind() {
+ simpleU++;
+ }
+
+ public void objectBind(FooService o) {
+ if (o != null && o instanceof FooService) {
+ objectB++;
+ }
+ }
+
+ public void objectUnbind(FooService o) {
+ if (o != null && o instanceof FooService) {
+ objectU++;
+ }
+ }
+
+ public void refBind(ServiceReference sr) {
+ if (sr != null) {
+ refB++;
+ }
+ }
+
+ public void refUnbind(ServiceReference sr) {
+ if (sr != null) {
+ refU++;
+ }
+ }
+
+ public void bothBind(FooService o, ServiceReference sr) {
+ if (o != null && o instanceof FooService && sr != null) {
+ bothB++;
+ }
+ }
+
+ public void bothUnbind(FooService o, ServiceReference sr) {
+ if (o != null && o instanceof FooService && sr != null) {
+ bothU++;
+ }
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MultipleFilterCheckSubscriber.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MultipleFilterCheckSubscriber.java
new file mode 100644
index 0000000..6b7370e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MultipleFilterCheckSubscriber.java
@@ -0,0 +1,56 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class MultipleFilterCheckSubscriber implements CheckService {
+
+ private FooService[] m_foo;
+
+ private int binded;
+
+ public MultipleFilterCheckSubscriber(){
+ }
+
+ public boolean check() {
+ for (int i = 0; i < m_foo.length; i++) {
+ m_foo[i].foo();
+ }
+ return true;
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("Bind", new Integer(binded));
+ props.put("Size", new Integer(m_foo.length));
+ return props;
+ }
+
+ private void Bind() {
+ binded++;
+ }
+ private void Unbind() {
+ binded--;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ParentClass.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ParentClass.java
new file mode 100644
index 0000000..f7fb580
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ParentClass.java
@@ -0,0 +1,51 @@
+/*
+ * 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.test.scenarios.component;
+
+public class ParentClass {
+
+ public void parentStart() {
+
+ }
+
+ public void parentStop() {
+
+ }
+
+ protected String[] strings;
+
+ protected String string;
+
+ protected int upStrings;
+
+ protected int upString;
+
+ public void updateStrings(String[] bb) {
+ strings = bb;
+ upStrings++;
+ }
+
+ public void updateString(String bb) {
+ string = bb;
+ upString++;
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ParentConfigurableCheckServiceProvider.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ParentConfigurableCheckServiceProvider.java
new file mode 100644
index 0000000..304b83f
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/ParentConfigurableCheckServiceProvider.java
@@ -0,0 +1,194 @@
+/*
+ * 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.test.scenarios.component;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+
+public class ParentConfigurableCheckServiceProvider extends ParentClass implements CheckService {
+
+ // Integer types
+ byte b;
+ short s;
+ int i;
+ long l;
+
+ // Floatting types
+ double d;
+ float f;
+
+ // Character
+ char c;
+
+ // Boolean
+ boolean bool;
+
+ // Integer arrays
+ byte[] bs;
+ short[] ss;
+ int[] is;
+ long[] ls;
+
+ double[] ds;
+ float[] fs;
+
+ char[] cs;
+
+ boolean[] bools;
+
+ //String string;
+ //String[] strings;
+
+ int upB, upS, upI, upL, upD, upF, upC, upBool, upBs, upSs, upIs, upLs, upDs, upFs, upCs, upBools/*, upString, upStrings*/;
+
+
+ public boolean check() {
+ return true;
+ }
+
+ public Properties getProps() {
+ Properties props = new Properties();
+ props.put("b", new Byte(b));
+ props.put("s", new Short(s));
+ props.put("i", new Integer(i));
+ props.put("l", new Long(l));
+ props.put("d", new Double(d));
+ props.put("f", new Float(f));
+ props.put("c", new Character(c));
+ props.put("bool", new Boolean(bool));
+
+ props.put("bs", bs);
+ props.put("ss", ss);
+ props.put("is", is);
+ props.put("ls", ls);
+ props.put("ds", ds);
+ props.put("fs", fs);
+ props.put("cs", cs);
+ props.put("bools", bools);
+
+ props.put("upb", new Integer(upB));
+ props.put("ups", new Integer(upS));
+ props.put("upi", new Integer(upI));
+ props.put("upl", new Integer(upL));
+ props.put("upd", new Integer(upD));
+ props.put("upf", new Integer(upF));
+ props.put("upc", new Integer(upC));
+ props.put("upbool", new Integer(upBool));
+
+ props.put("upbs", new Integer(upBs));
+ props.put("upss", new Integer(upSs));
+ props.put("upis", new Integer(upIs));
+ props.put("upls", new Integer(upLs));
+ props.put("upds", new Integer(upDs));
+ props.put("upfs", new Integer(upFs));
+ props.put("upcs", new Integer(upCs));
+ props.put("upbools", new Integer(upBools));
+
+ props.put("string", string);
+ props.put("strings", strings);
+ props.put("upstring", new Integer(upString));
+ props.put("upstrings", new Integer(upStrings));
+
+ return props;
+ }
+
+ public void updateB(byte bb) {
+ b = bb;
+ upB++;
+ }
+
+ public void updateS(short bb) {
+ s = bb;
+ upS++;
+ }
+
+ public void updateI(int bb) {
+ i = bb;
+ upI++;
+ }
+
+ public void updateL(long bb) {
+ l = bb;
+ upL++;
+ }
+
+ public void updateD(double bb) {
+ d = bb;
+ upD++;
+ }
+
+ public void updateF(float bb) {
+ f = bb;
+ upF++;
+ }
+
+ public void updateC(char bb) {
+ c = bb;
+ upC++;
+ }
+
+ public void updateBool(boolean bb) {
+ bool = bb;
+ upBool++;
+ }
+
+ public void updateBs(byte[] bb) {
+ bs = bb;
+ upBs++;
+ }
+
+ public void updateSs(short[] bb) {
+ ss = bb;
+ upSs++;
+ }
+
+ public void updateIs(int[] bb) {
+ is = bb;
+ upIs++;
+ }
+
+ public void updateLs(long[] bb) {
+ ls = bb;
+ upLs++;
+ }
+
+ public void updateDs(double[] bb) {
+ ds = bb;
+ upDs++;
+ }
+
+ public void updateFs(float[] bb) {
+ fs = bb;
+ upFs++;
+ }
+
+ public void updateCs(char[] bb) {
+ cs = bb;
+ upCs++;
+ }
+
+ public void updateBools(boolean[] bb) {
+ bools = bb;
+ upBools++;
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessImplementation1.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessImplementation1.java
new file mode 100644
index 0000000..3ffab2f
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessImplementation1.java
@@ -0,0 +1,45 @@
+/*
+ * 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.test.scenarios.component.inherited;
+
+import org.apache.felix.ipojo.test.scenarios.service.ChildInterface;
+
+public class ProcessImplementation1 implements ChildInterface {
+
+ public void processChild() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParent1() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParentParent() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParent2() {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessImplementation2.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessImplementation2.java
new file mode 100644
index 0000000..49e9267
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessImplementation2.java
@@ -0,0 +1,44 @@
+/*
+ * 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.test.scenarios.component.inherited;
+
+
+public class ProcessImplementation2 extends ProcessParentImplementation {
+
+ public void processChild() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParent1() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParentParent() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParent2() {
+ // TODO Auto-generated method stub
+
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessImplementation3.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessImplementation3.java
new file mode 100644
index 0000000..cc576d8
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessImplementation3.java
@@ -0,0 +1,82 @@
+/*
+ * 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.test.scenarios.component.inherited;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class ProcessImplementation3 extends ProcessParentImplementation implements FooService {
+
+ public void processChild() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParent1() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParentParent() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParent2() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public boolean foo() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public Properties fooProps() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ public boolean getBoolean() {
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ public double getDouble() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public int getInt() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public long getLong() {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ public Boolean getObject() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessParentImplementation.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessParentImplementation.java
new file mode 100644
index 0000000..69ebace
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/component/inherited/ProcessParentImplementation.java
@@ -0,0 +1,46 @@
+/*
+ * 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.test.scenarios.component.inherited;
+
+import org.apache.felix.ipojo.test.scenarios.service.ChildInterface;
+
+public class ProcessParentImplementation implements ChildInterface {
+
+ public void processChild() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParent1() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParentParent() {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void processParent2() {
+ // TODO Auto-generated method stub
+
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/ConfigurationTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/ConfigurationTestSuite.java
new file mode 100644
index 0000000..012f642
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/ConfigurationTestSuite.java
@@ -0,0 +1,40 @@
+/*
+ * 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.test.scenarios.configuration;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class ConfigurationTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Configuration Test Suite", bc);
+ ots.addTestSuite(SimpleProperties.class);
+ ots.addTestSuite(DynamicallyConfigurableProperties.class);
+ ots.addTestSuite(TestFieldProperties.class);
+ ots.addTestSuite(TestMethodProperties.class);
+ ots.addTestSuite(TestBothProperties.class);
+ ots.addTestSuite(TestSuperMethodProperties.class);
+
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/DynamicallyConfigurableProperties.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/DynamicallyConfigurableProperties.java
new file mode 100644
index 0000000..204d1b4
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/DynamicallyConfigurableProperties.java
@@ -0,0 +1,228 @@
+/*
+ * 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.test.scenarios.configuration;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+public class DynamicallyConfigurableProperties extends OSGiTestCase {
+
+ ComponentInstance instance;
+
+ public void setUp() {
+ String type = "FooProviderType-3";
+
+ Properties p1 = new Properties();
+ p1.put("name", "instance");
+ p1.put("foo", "foo");
+ p1.put("bar", "2");
+ p1.put("baz", "baz");
+ instance = Utils.getComponentInstance(context, type, p1);
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ instance = null;
+ }
+
+ public void testStatic() {
+ ServiceReference fooRef = Utils.getServiceReferenceByName(context, FooService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check FS availability", fooRef);
+ String fooP = (String) fooRef.getProperty("foo");
+ Integer barP = (Integer) fooRef.getProperty("bar");
+ String bazP = (String) fooRef.getProperty("baz");
+ assertEquals("Check foo equality -1", fooP, "foo");
+ assertEquals("Check bar equality -1", barP, new Integer(2));
+ assertEquals("Check baz equality -1", bazP, "baz");
+
+ ServiceReference msRef = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName(), instance.getFactory().getName());
+ assertNotNull("Check ManagedServiceFactory availability", msRef);
+
+
+ // Configuration of baz
+ Properties conf = new Properties();
+ conf.put("baz", "zab");
+ conf.put("bar", new Integer(2));
+ conf.put("foo", "foo");
+ ManagedServiceFactory ms = (ManagedServiceFactory) context.getService(msRef);
+ try {
+ ms.updated(instance.getInstanceName(), conf);
+ } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }
+
+ // Recheck props
+ fooRef = Utils.getServiceReferenceByName(context, FooService.class.getName(), instance.getInstanceName());
+ fooP = (String) fooRef.getProperty("foo");
+ barP = (Integer) fooRef.getProperty("bar");
+ bazP = (String) fooRef.getProperty("baz");
+ assertEquals("Check foo equality -2", fooP, "foo");
+ assertEquals("Check bar equality -2", barP, new Integer(2));
+ assertEquals("Check baz equality -2", bazP, "zab");
+ context.ungetService(msRef);
+ }
+
+ public void testDynamic() {
+ ServiceReference fooRef = Utils.getServiceReferenceByName(context, FooService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check FS availability", fooRef);
+
+ String fooP = (String) fooRef.getProperty("foo");
+ Integer barP = (Integer) fooRef.getProperty("bar");
+ String bazP = (String) fooRef.getProperty("baz");
+
+ assertEquals("Check foo equality", fooP, "foo");
+ assertEquals("Check bar equality", barP, new Integer(2));
+ assertEquals("Check baz equality", bazP, "baz");
+
+ ServiceReference msRef = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName(), instance.getFactory().getName());
+ assertNotNull("Check ManagedServiceFactory availability", msRef);
+
+ // Configuration of baz
+ Properties conf = new Properties();
+ conf.put("baz", "zab");
+ conf.put("foo", "oof");
+ conf.put("bar", new Integer(0));
+ ManagedServiceFactory ms = (ManagedServiceFactory) context.getService(msRef);
+ try {
+ ms.updated(instance.getInstanceName(), conf);
+ } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }
+
+ // Recheck props
+ fooRef = Utils.getServiceReferenceByName(context, FooService.class.getName(), instance.getInstanceName());
+ fooP = (String) fooRef.getProperty("foo");
+ barP = (Integer) fooRef.getProperty("bar");
+ bazP = (String) fooRef.getProperty("baz");
+
+ assertEquals("Check foo equality", fooP, "oof");
+ assertEquals("Check bar equality", barP, new Integer(0));
+ assertEquals("Check baz equality", bazP, "zab");
+
+ // Check field value
+ FooService fs = (FooService) context.getService(fooRef);
+ Properties p = fs.fooProps();
+ fooP = (String) p.get("foo");
+ barP = (Integer) p.get("bar");
+
+ assertEquals("Check foo field equality", fooP, "oof");
+ assertEquals("Check bar field equality", barP, new Integer(0));
+
+ context.ungetService(fooRef);
+ context.ungetService(msRef);
+ }
+
+ public void testDynamicString() {
+ ServiceReference fooRef = Utils.getServiceReferenceByName(context, FooService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check FS availability", fooRef);
+
+ String fooP = (String) fooRef.getProperty("foo");
+ Integer barP = (Integer) fooRef.getProperty("bar");
+ String bazP = (String) fooRef.getProperty("baz");
+
+ assertEquals("Check foo equality", fooP, "foo");
+ assertEquals("Check bar equality", barP, new Integer(2));
+ assertEquals("Check baz equality", bazP, "baz");
+
+ ServiceReference msRef = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName(), instance.getFactory().getName());
+ assertNotNull("Check ManagedServiceFactory availability", msRef);
+
+ // Configuration of baz
+ Properties conf = new Properties();
+ conf.put("baz", "zab");
+ conf.put("foo", "oof");
+ conf.put("bar", "0");
+ ManagedServiceFactory ms = (ManagedServiceFactory) context.getService(msRef);
+ try {
+ ms.updated(instance.getInstanceName(), conf);
+ } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }
+
+ // Recheck props
+ fooRef = Utils.getServiceReferenceByName(context, FooService.class.getName(), instance.getInstanceName());
+ fooP = (String) fooRef.getProperty("foo");
+ barP = (Integer) fooRef.getProperty("bar");
+ bazP = (String) fooRef.getProperty("baz");
+
+ assertEquals("Check foo equality", fooP, "oof");
+ assertEquals("Check bar equality", barP, new Integer(0));
+ assertEquals("Check baz equality", bazP, "zab");
+
+ // Check field value
+ FooService fs = (FooService) context.getService(fooRef);
+ Properties p = fs.fooProps();
+ fooP = (String) p.get("foo");
+ barP = (Integer) p.get("bar");
+
+ assertEquals("Check foo field equality", fooP, "oof");
+ assertEquals("Check bar field equality", barP, new Integer(0));
+
+ context.ungetService(fooRef);
+ context.ungetService(msRef);
+ }
+
+ public void testPropagation() {
+ ServiceReference fooRef = Utils.getServiceReferenceByName(context, FooService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check FS availability", fooRef);
+
+ String fooP = (String) fooRef.getProperty("foo");
+ Integer barP = (Integer) fooRef.getProperty("bar");
+ String bazP = (String) fooRef.getProperty("baz");
+
+ assertEquals("Check foo equality", fooP, "foo");
+ assertEquals("Check bar equality", barP, new Integer(2));
+ assertEquals("Check baz equality", bazP, "baz");
+
+ ServiceReference msRef = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName(), instance.getFactory().getName());
+ assertNotNull("Check ManagedServiceFactory availability", msRef);
+
+ // Configuration of baz
+ Properties conf = new Properties();
+ conf.put("baz", "zab");
+ conf.put("foo", "foo");
+ conf.put("bar", new Integer(2));
+ conf.put("propagated1", "propagated");
+ conf.put("propagated2", new Integer(1));
+ ManagedServiceFactory ms = (ManagedServiceFactory) context.getService(msRef);
+ try {
+ ms.updated(instance.getInstanceName(), conf);
+ } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }
+
+ // Recheck props
+ fooRef = Utils.getServiceReferenceByName(context, FooService.class.getName(), instance.getInstanceName());
+ fooP = (String) fooRef.getProperty("foo");
+ barP = (Integer) fooRef.getProperty("bar");
+ bazP = (String) fooRef.getProperty("baz");
+ assertNotNull("Check the propagated1 existency", fooRef.getProperty("propagated1"));
+ String prop1 = (String) fooRef.getProperty("propagated1");
+ assertNotNull("Check the propagated2 existency", fooRef.getProperty("propagated2"));
+ Integer prop2 = (Integer) fooRef.getProperty("propagated2");
+
+ assertEquals("Check foo equality", fooP, "foo");
+ assertEquals("Check bar equality", barP, new Integer(2));
+ assertEquals("Check baz equality", bazP, "zab");
+ assertEquals("Check propagated1 equality", prop1, "propagated");
+ assertEquals("Check propagated2 equality", prop2, new Integer(1));
+
+ context.ungetService(msRef);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/SimpleProperties.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/SimpleProperties.java
new file mode 100644
index 0000000..318304e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/SimpleProperties.java
@@ -0,0 +1,171 @@
+/*
+ * 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.test.scenarios.configuration;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class SimpleProperties extends OSGiTestCase {
+
+ ComponentInstance fooProvider1;
+ ComponentInstance fooProvider2;
+
+ public void setUp() {
+ String type = "FooProviderType-Conf";
+
+ Properties p1 = new Properties();
+ p1.put("name", "FooProvider-1");
+ fooProvider1 = Utils.getComponentInstance(context, type, p1);
+
+ Properties p2 = new Properties();
+ p2.put("name", "FooProvider-2");
+ p2.put("int", new Integer(4));
+ p2.put("boolean", new Boolean(false));
+ p2.put("string", new String("bar"));
+ p2.put("strAProp", new String[] {"bar", "foo"});
+ p2.put("intAProp", new int[] {1, 2, 3});
+ fooProvider2 = Utils.getComponentInstance(context, type, p2);
+ }
+
+ public void tearDown() {
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testComponentTypeConfiguration() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check FooService availability", ref);
+ FooService fs = (FooService) context.getService(ref);
+ Properties toCheck = fs.fooProps();
+
+ Integer intProp = (Integer) toCheck.get("intProp");
+ Boolean boolProp = (Boolean) toCheck.get("boolProp");
+ String strProp = (String) toCheck.get("strProp");
+ String[] strAProp = (String[]) toCheck.get("strAProp");
+ int[] intAProp = (int[]) toCheck.get("intAProp");
+
+ assertEquals("Check intProp equality (1)", intProp, new Integer(2));
+ assertEquals("Check longProp equality (1)", boolProp, new Boolean(false));
+ assertEquals("Check strProp equality (1)", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity (1)", strAProp);
+ String[] v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality (1) : " + strAProp[i] + " != " + v[i]); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality (1) : " + intAProp[i] + " != " + v2[i]); }
+ }
+
+ // change the field value
+ assertTrue("Invoke the fs service", fs.foo());
+ toCheck = fs.fooProps();
+
+
+ // Re-check the property (change)
+ intProp = (Integer) toCheck.get("intProp");
+ boolProp = (Boolean) toCheck.get("boolProp");
+ strProp = (String) toCheck.get("strProp");
+ strAProp = (String[]) toCheck.get("strAProp");
+ intAProp = (int[]) toCheck.get("intAProp");
+
+ assertEquals("Check intProp equality (2) ("+intProp+")", intProp, new Integer(3));
+ assertEquals("Check longProp equality (2)", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality (2)", strProp, new String("bar"));
+ assertNotNull("Check strAProp not nullity (2)", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality (2)"); }
+ }
+ assertNotNull("Check intAProp not nullity (2)", intAProp);
+ v2 = new int[] {3, 2, 1};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality (2) : " + intAProp[i] + " != " + v2[i]); }
+ }
+
+ fs = null;
+ context.ungetService(ref);
+ }
+
+ public void testInstanceConfiguration() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-2");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ FooService fs = (FooService) context.getService(sr);
+ Properties toCheck = fs.fooProps();
+
+ // Check service properties
+ Integer intProp = (Integer) toCheck.get("intProp");
+ Boolean boolProp = (Boolean) toCheck.get("boolProp");
+ String strProp = (String) toCheck.get("strProp");
+ String[] strAProp = (String[]) toCheck.get("strAProp");
+ int[] intAProp = (int[]) toCheck.get("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(4));
+ assertEquals("Check longProp equality", boolProp, new Boolean(false));
+ assertEquals("Check strProp equality", strProp, new String("bar"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[] {"bar", "foo"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+
+ assertTrue("invoke fs", fs.foo());
+ toCheck = fs.fooProps();
+
+ // Re-check the property (change)
+ intProp = (Integer) toCheck.get("intProp");
+ boolProp = (Boolean) toCheck.get("boolProp");
+ strProp = (String) toCheck.get("strProp");
+ strAProp = (String[]) toCheck.get("strAProp");
+ intAProp = (int[]) toCheck.get("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(3));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] {3, 2, 1};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ fs = null;
+ context.ungetService(sr);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestBothProperties.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestBothProperties.java
new file mode 100644
index 0000000..695d61e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestBothProperties.java
@@ -0,0 +1,618 @@
+/*
+ * 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.test.scenarios.configuration;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestBothProperties extends OSGiTestCase {
+
+ ComponentInstance instance;
+
+
+ public void setUp() {
+ Factory fact = Utils.getFactoryByName(context, "BothConfigurableCheckService");
+ Properties props = new Properties();
+ props.put("name", "under-test");
+ props.put("b", "1");
+ props.put("s", "1");
+ props.put("i", "1");
+ props.put("l", "1");
+ props.put("d", "1");
+ props.put("f", "1");
+ props.put("c", "a");
+ props.put("bool", "true");
+ props.put("bs", "{1,2,3}");
+ props.put("ss", "{1,2,3}");
+ props.put("is", "{1,2,3}");
+ props.put("ls", "{1,2,3}");
+ props.put("ds", "{1,2,3}");
+ props.put("fs", "{1,2,3}");
+ props.put("cs", "{a,b,c}");
+ props.put("bools", "{true,true,true}");
+ props.put("string", "foo");
+ props.put("strings", "{foo, bar, baz}");
+
+ try {
+ instance = fact.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot create the under-test instance : " + e.getMessage());
+ }
+
+
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ instance = null;
+ }
+
+ public void testConfigurationPrimitive() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ Integer upb = (Integer) props.get("upb");
+ Integer ups = (Integer) props.get("ups");
+ Integer upi = (Integer) props.get("upi");
+ Integer upl = (Integer) props.get("upl");
+ Integer upd = (Integer) props.get("upd");
+ Integer upf = (Integer) props.get("upf");
+ Integer upc = (Integer) props.get("upc");
+ Integer upbool = (Integer) props.get("upbool");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigure();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b ("+b+")", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ upb = (Integer) props.get("upb");
+ ups = (Integer) props.get("ups");
+ upi = (Integer) props.get("upi");
+ upl = (Integer) props.get("upl");
+ upd = (Integer) props.get("upd");
+ upf = (Integer) props.get("upf");
+ upc = (Integer) props.get("upc");
+ upbool = (Integer) props.get("upbool");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ Integer upb = (Integer) props.get("upb");
+ Integer ups = (Integer) props.get("ups");
+ Integer upi = (Integer) props.get("upi");
+ Integer upl = (Integer) props.get("upl");
+ Integer upd = (Integer) props.get("upd");
+ Integer upf = (Integer) props.get("upf");
+ Integer upc = (Integer) props.get("upc");
+ Integer upbool = (Integer) props.get("upbool");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigureString();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b ("+b+")", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ upb = (Integer) props.get("upb");
+ ups = (Integer) props.get("ups");
+ upi = (Integer) props.get("upi");
+ upl = (Integer) props.get("upl");
+ upd = (Integer) props.get("upd");
+ upf = (Integer) props.get("upf");
+ upc = (Integer) props.get("upc");
+ upbool = (Integer) props.get("upbool");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveArrays() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ Integer upb = (Integer) props.get("upbs");
+ Integer ups = (Integer) props.get("upss");
+ Integer upi = (Integer) props.get("upis");
+ Integer upl = (Integer) props.get("upls");
+ Integer upd = (Integer) props.get("upds");
+ Integer upf = (Integer) props.get("upfs");
+ Integer upc = (Integer) props.get("upcs");
+ Integer upbool = (Integer) props.get("upbools");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigure();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ upb = (Integer) props.get("upbs");
+ ups = (Integer) props.get("upss");
+ upi = (Integer) props.get("upis");
+ upl = (Integer) props.get("upls");
+ upd = (Integer) props.get("upds");
+ upf = (Integer) props.get("upfs");
+ upc = (Integer) props.get("upcs");
+ upbool = (Integer) props.get("upbools");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveArraysString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ Integer upb = (Integer) props.get("upbs");
+ Integer ups = (Integer) props.get("upss");
+ Integer upi = (Integer) props.get("upis");
+ Integer upl = (Integer) props.get("upls");
+ Integer upd = (Integer) props.get("upds");
+ Integer upf = (Integer) props.get("upfs");
+ Integer upc = (Integer) props.get("upcs");
+ Integer upbool = (Integer) props.get("upbools");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigureString();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ upb = (Integer) props.get("upbs");
+ ups = (Integer) props.get("upss");
+ upi = (Integer) props.get("upis");
+ upl = (Integer) props.get("upls");
+ upd = (Integer) props.get("upds");
+ upf = (Integer) props.get("upfs");
+ upc = (Integer) props.get("upcs");
+ upbool = (Integer) props.get("upbools");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationObj() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ Integer upString = (Integer) props.get("upstring");
+ Integer upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("Check upString", upString, new Integer(1));
+ assertEquals("Check upStrings", upStrings, new Integer(1));
+
+ reconfigure();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+
+ upString = (Integer) props.get("upstring");
+ upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("2) Check upstring", upString, new Integer(2));
+ assertEquals("2) Check upstrings", upStrings, new Integer(2));
+ }
+
+ public void testConfigurationObjString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ Integer upString = (Integer) props.get("upstring");
+ Integer upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("Check upString", upString, new Integer(1));
+ assertEquals("Check upStrings", upStrings, new Integer(1));
+
+ reconfigureString();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+
+ upString = (Integer) props.get("upstring");
+ upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("2) Check upstring", upString, new Integer(2));
+ assertEquals("2) Check upstrings", upStrings, new Integer(2));
+ }
+
+ private void reconfigure() {
+ Properties props2 = new Properties();
+ props2.put("name", "under-test");
+ props2.put("b", new Byte("2"));
+ props2.put("s", new Short("2"));
+ props2.put("i", new Integer("2"));
+ props2.put("l", new Long("2"));
+ props2.put("d", new Double("2"));
+ props2.put("f", new Float("2"));
+ props2.put("c", new Character('b'));
+ props2.put("bool", new Boolean(false));
+ props2.put("bs", new byte[]{(byte)3,(byte)2,(byte)1});
+ props2.put("ss", new short[]{(short)3,(short)2,(short)1});
+ props2.put("is", new int[]{3,2,1});
+ props2.put("ls", new long[]{3,2,1});
+ props2.put("ds", new double[]{3,2,1});
+ props2.put("fs", new float[]{3,2,1});
+ props2.put("cs", new char[]{'c','b','a'});
+ props2.put("bools", new boolean[]{false,false,false});
+ props2.put("string", "bar");
+ props2.put("strings", new String[]{"baz", "bar", "foo"});
+
+ instance.reconfigure(props2);
+ }
+
+ private void reconfigureString() {
+ Properties props2 = new Properties();
+ props2.put("name", "under-test");
+ props2.put("b", "2");
+ props2.put("s", "2");
+ props2.put("i", "2");
+ props2.put("l", "2");
+ props2.put("d", "2");
+ props2.put("f", "2");
+ props2.put("c", "b");
+ props2.put("bool", "false");
+ props2.put("bs", "{3, 2,1}");
+ props2.put("ss", "{3, 2,1}");
+ props2.put("is", "{3, 2,1}");
+ props2.put("ls", "{3, 2,1}");
+ props2.put("ds", "{3, 2,1}");
+ props2.put("fs", "{3, 2,1}");
+ props2.put("cs", "{c, b , a}");
+ props2.put("bools", "{false,false,false}");
+ props2.put("string", "bar");
+ props2.put("strings", "{baz, bar, foo}");
+
+ instance.reconfigure(props2);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestFieldProperties.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestFieldProperties.java
new file mode 100644
index 0000000..b49c823
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestFieldProperties.java
@@ -0,0 +1,449 @@
+/*
+ * 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.test.scenarios.configuration;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestFieldProperties extends OSGiTestCase {
+
+ ComponentInstance instance;
+
+ public void setUp() {
+ Factory fact = Utils.getFactoryByName(context, "FieldConfigurableCheckService");
+ Properties props = new Properties();
+ props.put("name", "under-test");
+ props.put("b", "1");
+ props.put("s", "1");
+ props.put("i", "1");
+ props.put("l", "1");
+ props.put("d", "1");
+ props.put("f", "1");
+ props.put("c", "a");
+ props.put("bool", "true");
+ props.put("bs", "{1,2,3}");
+ props.put("ss", "{1,2,3}");
+ props.put("is", "{1,2,3}");
+ props.put("ls", "{1,2,3}");
+ props.put("ds", "{1,2,3}");
+ props.put("fs", "{1,2,3}");
+ props.put("cs", "{a,b,c}");
+ props.put("bools", "{true,true,true}");
+ props.put("string", "foo");
+ props.put("strings", "{foo, bar, baz}");
+
+ try {
+ instance = fact.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot create the under-test instance : " + e.getMessage());
+ }
+
+
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ instance = null;
+ }
+
+ public void testConfigurationPrimitive() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ reconfigure();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ }
+
+ public void testConfigurationPrimitiveString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ reconfigureString();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ }
+
+ public void testConfigurationPrimitiveArrays() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ reconfigure();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ }
+
+ public void testConfigurationPrimitiveArraysString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ reconfigureString();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ }
+
+ public void testConfigurationObj() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ reconfigure();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+ }
+
+ public void testConfigurationObjString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ reconfigureString();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+ }
+
+ private void reconfigure() {
+ Properties props2 = new Properties();
+ props2.put("name", "under-test");
+ props2.put("b", new Byte("2"));
+ props2.put("s", new Short("2"));
+ props2.put("i", new Integer("2"));
+ props2.put("l", new Long("2"));
+ props2.put("d", new Double("2"));
+ props2.put("f", new Float("2"));
+ props2.put("c", new Character('b'));
+ props2.put("bool", new Boolean(false));
+ props2.put("bs", new byte[]{(byte)3,(byte)2,(byte)1});
+ props2.put("ss", new short[]{(short)3,(short)2,(short)1});
+ props2.put("is", new int[]{3,2,1});
+ props2.put("ls", new long[]{3,2,1});
+ props2.put("ds", new double[]{3,2,1});
+ props2.put("fs", new float[]{3,2,1});
+ props2.put("cs", new char[]{'c','b','a'});
+ props2.put("bools", new boolean[]{false,false,false});
+ props2.put("string", "bar");
+ props2.put("strings", new String[]{"baz", "bar", "foo"});
+
+ instance.reconfigure(props2);
+ }
+
+ private void reconfigureString() {
+ Properties props2 = new Properties();
+ props2.put("name", "under-test");
+ props2.put("b", "2");
+ props2.put("s", "2");
+ props2.put("i", "2");
+ props2.put("l", "2");
+ props2.put("d", "2");
+ props2.put("f", "2");
+ props2.put("c", "b");
+ props2.put("bool", "false");
+ props2.put("bs", "{3, 2,1}");
+ props2.put("ss", "{3, 2,1}");
+ props2.put("is", "{3, 2,1}");
+ props2.put("ls", "{3, 2,1}");
+ props2.put("ds", "{3, 2,1}");
+ props2.put("fs", "{3, 2,1}");
+ props2.put("cs", "{c, b , a}");
+ props2.put("bools", "{false,false,false}");
+ props2.put("string", "bar");
+ props2.put("strings", "{baz, bar, foo}");
+
+ instance.reconfigure(props2);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestMethodProperties.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestMethodProperties.java
new file mode 100644
index 0000000..7e1dcea
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestMethodProperties.java
@@ -0,0 +1,1145 @@
+/*
+ * 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.test.scenarios.configuration;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestMethodProperties extends OSGiTestCase {
+
+ ComponentInstance instance;
+
+ ComponentInstance instance2;
+
+ public void setUp() {
+ Factory fact = Utils.getFactoryByName(context, "MethodConfigurableCheckService");
+ Properties props = new Properties();
+ props.put("name", "under-test");
+ props.put("b", "1");
+ props.put("s", "1");
+ props.put("i", "1");
+ props.put("l", "1");
+ props.put("d", "1");
+ props.put("f", "1");
+ props.put("c", "a");
+ props.put("bool", "true");
+ props.put("bs", "{1,2,3}");
+ props.put("ss", "{1,2,3}");
+ props.put("is", "{1,2,3}");
+ props.put("ls", "{1,2,3}");
+ props.put("ds", "{1,2,3}");
+ props.put("fs", "{1,2,3}");
+ props.put("cs", "{a,b,c}");
+ props.put("bools", "{true,true,true}");
+ props.put("string", "foo");
+ props.put("strings", "{foo, bar, baz}");
+
+ try {
+ instance = fact.createComponentInstance(props);
+ } catch(Exception e) {
+ fail("Cannot create the under-test instance : " + e.getMessage());
+ }
+
+ Properties props2 = new Properties();
+ props2.put("name", "under-test-2");
+ props2.put("b", new Byte("1"));
+ props2.put("s", new Short("1"));
+ props2.put("i", new Integer("1"));
+ props2.put("l", new Long("1"));
+ props2.put("d", new Double("1"));
+ props2.put("f", new Float("1"));
+ props2.put("c", new Character('a'));
+ props2.put("bool", new Boolean(true));
+ props2.put("bs", new byte[] {1,2,3});
+ props2.put("ss", new short[] {1,2,3});
+ props2.put("is", new int[] {1,2,3});
+ props2.put("ls", new long[] {1,2,3});
+ props2.put("ds", new double[] {1,2,3});
+ props2.put("fs", new float[] {1,2,3});
+ props2.put("cs", new char[] {'a','b','c'});
+ props2.put("bools", new boolean[] {true,true,true});
+ props2.put("string", "foo");
+ props2.put("strings", new String[] {"foo", "bar", "baz"});
+
+ try {
+ instance2 = fact.createComponentInstance(props2);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("Cannot create the under-test instance 2 : " + e.getMessage());
+ }
+
+
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ instance2.dispose();
+ instance = null;
+ instance2 = null;
+ }
+
+ public void testConfigurationPrimitive() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ Integer upb = (Integer) props.get("upb");
+ Integer ups = (Integer) props.get("ups");
+ Integer upi = (Integer) props.get("upi");
+ Integer upl = (Integer) props.get("upl");
+ Integer upd = (Integer) props.get("upd");
+ Integer upf = (Integer) props.get("upf");
+ Integer upc = (Integer) props.get("upc");
+ Integer upbool = (Integer) props.get("upbool");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigure(instance);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b ("+b+")", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ upb = (Integer) props.get("upb");
+ ups = (Integer) props.get("ups");
+ upi = (Integer) props.get("upi");
+ upl = (Integer) props.get("upl");
+ upd = (Integer) props.get("upd");
+ upf = (Integer) props.get("upf");
+ upc = (Integer) props.get("upc");
+ upbool = (Integer) props.get("upbool");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ Integer upb = (Integer) props.get("upb");
+ Integer ups = (Integer) props.get("ups");
+ Integer upi = (Integer) props.get("upi");
+ Integer upl = (Integer) props.get("upl");
+ Integer upd = (Integer) props.get("upd");
+ Integer upf = (Integer) props.get("upf");
+ Integer upc = (Integer) props.get("upc");
+ Integer upbool = (Integer) props.get("upbool");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigureString(instance);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b ("+b+")", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ upb = (Integer) props.get("upb");
+ ups = (Integer) props.get("ups");
+ upi = (Integer) props.get("upi");
+ upl = (Integer) props.get("upl");
+ upd = (Integer) props.get("upd");
+ upf = (Integer) props.get("upf");
+ upc = (Integer) props.get("upc");
+ upbool = (Integer) props.get("upbool");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveArrays() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ Integer upb = (Integer) props.get("upbs");
+ Integer ups = (Integer) props.get("upss");
+ Integer upi = (Integer) props.get("upis");
+ Integer upl = (Integer) props.get("upls");
+ Integer upd = (Integer) props.get("upds");
+ Integer upf = (Integer) props.get("upfs");
+ Integer upc = (Integer) props.get("upcs");
+ Integer upbool = (Integer) props.get("upbools");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigure(instance);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ upb = (Integer) props.get("upbs");
+ ups = (Integer) props.get("upss");
+ upi = (Integer) props.get("upis");
+ upl = (Integer) props.get("upls");
+ upd = (Integer) props.get("upds");
+ upf = (Integer) props.get("upfs");
+ upc = (Integer) props.get("upcs");
+ upbool = (Integer) props.get("upbools");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveArraysString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ Integer upb = (Integer) props.get("upbs");
+ Integer ups = (Integer) props.get("upss");
+ Integer upi = (Integer) props.get("upis");
+ Integer upl = (Integer) props.get("upls");
+ Integer upd = (Integer) props.get("upds");
+ Integer upf = (Integer) props.get("upfs");
+ Integer upc = (Integer) props.get("upcs");
+ Integer upbool = (Integer) props.get("upbools");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigureString(instance);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ upb = (Integer) props.get("upbs");
+ ups = (Integer) props.get("upss");
+ upi = (Integer) props.get("upis");
+ upl = (Integer) props.get("upls");
+ upd = (Integer) props.get("upds");
+ upf = (Integer) props.get("upfs");
+ upc = (Integer) props.get("upcs");
+ upbool = (Integer) props.get("upbools");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationObj() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ Integer upString = (Integer) props.get("upstring");
+ Integer upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("Check upString", upString, new Integer(1));
+ assertEquals("Check upStrings", upStrings, new Integer(1));
+
+ reconfigure(instance);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+
+ upString = (Integer) props.get("upstring");
+ upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("2) Check upString", upString, new Integer(2));
+ assertEquals("2) Check upStrings", upStrings, new Integer(2));
+ }
+
+ public void testConfigurationObjString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ Integer upString = (Integer) props.get("upstring");
+ Integer upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("Check upString", upString, new Integer(1));
+ assertEquals("Check upStrings", upStrings, new Integer(1));
+
+ reconfigureString(instance);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+
+ upString = (Integer) props.get("upstring");
+ upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("2) Check upString", upString, new Integer(2));
+ assertEquals("2) Check upStrings", upStrings, new Integer(2));
+ }
+
+ public void testConfigurationPrimitive2() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ Integer upb = (Integer) props.get("upb");
+ Integer ups = (Integer) props.get("ups");
+ Integer upi = (Integer) props.get("upi");
+ Integer upl = (Integer) props.get("upl");
+ Integer upd = (Integer) props.get("upd");
+ Integer upf = (Integer) props.get("upf");
+ Integer upc = (Integer) props.get("upc");
+ Integer upbool = (Integer) props.get("upbool");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigure(instance2);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b ("+b+")", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ upb = (Integer) props.get("upb");
+ ups = (Integer) props.get("ups");
+ upi = (Integer) props.get("upi");
+ upl = (Integer) props.get("upl");
+ upd = (Integer) props.get("upd");
+ upf = (Integer) props.get("upf");
+ upc = (Integer) props.get("upc");
+ upbool = (Integer) props.get("upbool");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitive2String() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ Integer upb = (Integer) props.get("upb");
+ Integer ups = (Integer) props.get("ups");
+ Integer upi = (Integer) props.get("upi");
+ Integer upl = (Integer) props.get("upl");
+ Integer upd = (Integer) props.get("upd");
+ Integer upf = (Integer) props.get("upf");
+ Integer upc = (Integer) props.get("upc");
+ Integer upbool = (Integer) props.get("upbool");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigureString(instance2);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b ("+b+")", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ upb = (Integer) props.get("upb");
+ ups = (Integer) props.get("ups");
+ upi = (Integer) props.get("upi");
+ upl = (Integer) props.get("upl");
+ upd = (Integer) props.get("upd");
+ upf = (Integer) props.get("upf");
+ upc = (Integer) props.get("upc");
+ upbool = (Integer) props.get("upbool");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveArrays2() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ Integer upb = (Integer) props.get("upbs");
+ Integer ups = (Integer) props.get("upss");
+ Integer upi = (Integer) props.get("upis");
+ Integer upl = (Integer) props.get("upls");
+ Integer upd = (Integer) props.get("upds");
+ Integer upf = (Integer) props.get("upfs");
+ Integer upc = (Integer) props.get("upcs");
+ Integer upbool = (Integer) props.get("upbools");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigure(instance2);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ upb = (Integer) props.get("upbs");
+ ups = (Integer) props.get("upss");
+ upi = (Integer) props.get("upis");
+ upl = (Integer) props.get("upls");
+ upd = (Integer) props.get("upds");
+ upf = (Integer) props.get("upfs");
+ upc = (Integer) props.get("upcs");
+ upbool = (Integer) props.get("upbools");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveArrays2String() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ Integer upb = (Integer) props.get("upbs");
+ Integer ups = (Integer) props.get("upss");
+ Integer upi = (Integer) props.get("upis");
+ Integer upl = (Integer) props.get("upls");
+ Integer upd = (Integer) props.get("upds");
+ Integer upf = (Integer) props.get("upfs");
+ Integer upc = (Integer) props.get("upcs");
+ Integer upbool = (Integer) props.get("upbools");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigureString(instance2);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ upb = (Integer) props.get("upbs");
+ ups = (Integer) props.get("upss");
+ upi = (Integer) props.get("upis");
+ upl = (Integer) props.get("upls");
+ upd = (Integer) props.get("upds");
+ upf = (Integer) props.get("upfs");
+ upc = (Integer) props.get("upcs");
+ upbool = (Integer) props.get("upbools");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationObj2() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ Integer upString = (Integer) props.get("upstring");
+ Integer upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("Check upString", upString, new Integer(1));
+ assertEquals("Check upStrings", upStrings, new Integer(1));
+
+ reconfigure(instance2);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+
+ upString = (Integer) props.get("upstring");
+ upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("2) Check upString", upString, new Integer(2));
+ assertEquals("2) Check upStrings", upStrings, new Integer(2));
+ }
+
+ public void testConfigurationObj2String() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ Integer upString = (Integer) props.get("upstring");
+ Integer upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("Check upString", upString, new Integer(1));
+ assertEquals("Check upStrings", upStrings, new Integer(1));
+
+ reconfigureString(instance2);
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+
+ upString = (Integer) props.get("upstring");
+ upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("2) Check upString", upString, new Integer(2));
+ assertEquals("2) Check upStrings", upStrings, new Integer(2));
+ }
+
+ private void reconfigure(ComponentInstance ci) {
+ Properties props2 = new Properties();
+ props2.put("name", "under-test");
+ props2.put("b", new Byte("2"));
+ props2.put("s", new Short("2"));
+ props2.put("i", new Integer("2"));
+ props2.put("l", new Long("2"));
+ props2.put("d", new Double("2"));
+ props2.put("f", new Float("2"));
+ props2.put("c", new Character('b'));
+ props2.put("bool", new Boolean(false));
+ props2.put("bs", new byte[]{(byte)3,(byte)2,(byte)1});
+ props2.put("ss", new short[]{(short)3,(short)2,(short)1});
+ props2.put("is", new int[]{3,2,1});
+ props2.put("ls", new long[]{3,2,1});
+ props2.put("ds", new double[]{3,2,1});
+ props2.put("fs", new float[]{3,2,1});
+ props2.put("cs", new char[]{'c','b','a'});
+ props2.put("bools", new boolean[]{false,false,false});
+ props2.put("string", "bar");
+ props2.put("strings", new String[]{"baz", "bar", "foo"});
+
+ ci.reconfigure(props2);
+ }
+
+ private void reconfigureString(ComponentInstance ci) {
+ Properties props2 = new Properties();
+ props2.put("name", "under-test");
+ props2.put("b", "2");
+ props2.put("s", "2");
+ props2.put("i", "2");
+ props2.put("l", "2");
+ props2.put("d", "2");
+ props2.put("f", "2");
+ props2.put("c", "b");
+ props2.put("bool", "false");
+ props2.put("bs", "{3, 2,1}");
+ props2.put("ss", "{3, 2,1}");
+ props2.put("is", "{3, 2,1}");
+ props2.put("ls", "{3, 2,1}");
+ props2.put("ds", "{3, 2,1}");
+ props2.put("fs", "{3, 2,1}");
+ props2.put("cs", "{c, b , a}");
+ props2.put("bools", "{false,false,false}");
+ props2.put("string", "bar");
+ props2.put("strings", "{baz, bar, foo}");
+
+ ci.reconfigure(props2);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestSuperMethodProperties.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestSuperMethodProperties.java
new file mode 100644
index 0000000..c7b322b
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/TestSuperMethodProperties.java
@@ -0,0 +1,617 @@
+/*
+ * 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.test.scenarios.configuration;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class TestSuperMethodProperties extends OSGiTestCase {
+
+ ComponentInstance instance;
+
+ public void setUp() {
+ Factory fact = Utils.getFactoryByName(context, "ParentMethodConfigurableCheckService");
+ Properties props = new Properties();
+ props.put("name", "under-test");
+ props.put("b", "1");
+ props.put("s", "1");
+ props.put("i", "1");
+ props.put("l", "1");
+ props.put("d", "1");
+ props.put("f", "1");
+ props.put("c", "a");
+ props.put("bool", "true");
+ props.put("bs", "{1,2,3}");
+ props.put("ss", "{1,2,3}");
+ props.put("is", "{1,2,3}");
+ props.put("ls", "{1,2,3}");
+ props.put("ds", "{1,2,3}");
+ props.put("fs", "{1,2,3}");
+ props.put("cs", "{a,b,c}");
+ props.put("bools", "{true,true,true}");
+ props.put("string", "foo");
+ props.put("strings", "{foo, bar, baz}");
+
+ try {
+ instance = fact.createComponentInstance(props);
+ } catch (Exception e) {
+ fail("Cannot create the under-test instance : " + e.getMessage());
+ }
+
+
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ instance = null;
+ }
+
+ public void testConfigurationPrimitive() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ Integer upb = (Integer) props.get("upb");
+ Integer ups = (Integer) props.get("ups");
+ Integer upi = (Integer) props.get("upi");
+ Integer upl = (Integer) props.get("upl");
+ Integer upd = (Integer) props.get("upd");
+ Integer upf = (Integer) props.get("upf");
+ Integer upc = (Integer) props.get("upc");
+ Integer upbool = (Integer) props.get("upbool");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigure();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b ("+b+")", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ upb = (Integer) props.get("upb");
+ ups = (Integer) props.get("ups");
+ upi = (Integer) props.get("upi");
+ upl = (Integer) props.get("upl");
+ upd = (Integer) props.get("upd");
+ upf = (Integer) props.get("upf");
+ upc = (Integer) props.get("upc");
+ upbool = (Integer) props.get("upbool");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ Byte b = (Byte) props.get("b");
+ Short s = (Short) props.get("s");
+ Integer i = (Integer) props.get("i");
+ Long l = (Long) props.get("l");
+ Double d = (Double) props.get("d");
+ Float f = (Float) props.get("f");
+ Character c = (Character) props.get("c");
+ Boolean bool = (Boolean) props.get("bool");
+
+ assertEquals("Check b", b, new Byte("1"));
+ assertEquals("Check s", s, new Short("1"));
+ assertEquals("Check i", i, new Integer("1"));
+ assertEquals("Check l", l, new Long("1"));
+ assertEquals("Check d", d, new Double("1"));
+ assertEquals("Check f", f, new Float("1"));
+ assertEquals("Check c", c, new Character('a'));
+ assertEquals("Check bool", bool, new Boolean("true"));
+
+ Integer upb = (Integer) props.get("upb");
+ Integer ups = (Integer) props.get("ups");
+ Integer upi = (Integer) props.get("upi");
+ Integer upl = (Integer) props.get("upl");
+ Integer upd = (Integer) props.get("upd");
+ Integer upf = (Integer) props.get("upf");
+ Integer upc = (Integer) props.get("upc");
+ Integer upbool = (Integer) props.get("upbool");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigureString();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (Byte) props.get("b");
+ s = (Short) props.get("s");
+ i = (Integer) props.get("i");
+ l = (Long) props.get("l");
+ d = (Double) props.get("d");
+ f = (Float) props.get("f");
+ c = (Character) props.get("c");
+ bool = (Boolean) props.get("bool");
+
+ assertEquals("2) Check b ("+b+")", b, new Byte("2"));
+ assertEquals("2) Check s", s, new Short("2"));
+ assertEquals("2) Check i", i, new Integer("2"));
+ assertEquals("2) Check l", l, new Long("2"));
+ assertEquals("2) Check d", d, new Double("2"));
+ assertEquals("2) Check f", f, new Float("2"));
+ assertEquals("2) Check c", c, new Character('b'));
+ assertEquals("2) Check bool", bool, new Boolean("false"));
+
+ upb = (Integer) props.get("upb");
+ ups = (Integer) props.get("ups");
+ upi = (Integer) props.get("upi");
+ upl = (Integer) props.get("upl");
+ upd = (Integer) props.get("upd");
+ upf = (Integer) props.get("upf");
+ upc = (Integer) props.get("upc");
+ upbool = (Integer) props.get("upbool");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveArrays() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ Integer upb = (Integer) props.get("upbs");
+ Integer ups = (Integer) props.get("upss");
+ Integer upi = (Integer) props.get("upis");
+ Integer upl = (Integer) props.get("upls");
+ Integer upd = (Integer) props.get("upds");
+ Integer upf = (Integer) props.get("upfs");
+ Integer upc = (Integer) props.get("upcs");
+ Integer upbool = (Integer) props.get("upbools");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigure();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ upb = (Integer) props.get("upbs");
+ ups = (Integer) props.get("upss");
+ upi = (Integer) props.get("upis");
+ upl = (Integer) props.get("upls");
+ upd = (Integer) props.get("upds");
+ upf = (Integer) props.get("upfs");
+ upc = (Integer) props.get("upcs");
+ upbool = (Integer) props.get("upbools");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationPrimitiveArraysString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ byte[] b = (byte[]) props.get("bs");
+ short[] s = (short[]) props.get("ss");
+ int[] i = (int[]) props.get("is");
+ long[] l = (long[]) props.get("ls");
+ double[] d = (double[]) props.get("ds");
+ float[] f = (float[]) props.get("fs");
+ char[] c = (char[]) props.get("cs");
+ boolean[] bool = (boolean[]) props.get("bools");
+
+ assertEquals("Check b 0", b[0], 1);
+ assertEquals("Check b 1", b[1], 2);
+ assertEquals("Check b 2", b[2], 3);
+ assertEquals("Check s 0", s[0], 1);
+ assertEquals("Check s 1", s[1], 2);
+ assertEquals("Check s 2", s[2], 3);
+ assertEquals("Check i 0", i[0], 1);
+ assertEquals("Check i 1", i[1], 2);
+ assertEquals("Check i 2", i[2], 3);
+ assertEquals("Check l 0", l[0], 1);
+ assertEquals("Check l 1", l[1], 2);
+ assertEquals("Check l 2", l[2], 3);
+ assertEquals("Check d 0", d[0], 1);
+ assertEquals("Check d 1", d[1], 2);
+ assertEquals("Check d 2", d[2], 3);
+ assertEquals("Check f 0", f[0], 1);
+ assertEquals("Check f 1", f[1], 2);
+ assertEquals("Check f 2", f[2], 3);
+ assertEquals("Check c 0", c[0], 'a');
+ assertEquals("Check c 1", c[1], 'b');
+ assertEquals("Check c 2", c[2], 'c');
+ assertTrue("Check bool 0", bool[0]);
+ assertTrue("Check bool 1", bool[0]);
+ assertTrue("Check bool 2", bool[0]);
+
+ Integer upb = (Integer) props.get("upbs");
+ Integer ups = (Integer) props.get("upss");
+ Integer upi = (Integer) props.get("upis");
+ Integer upl = (Integer) props.get("upls");
+ Integer upd = (Integer) props.get("upds");
+ Integer upf = (Integer) props.get("upfs");
+ Integer upc = (Integer) props.get("upcs");
+ Integer upbool = (Integer) props.get("upbools");
+
+ assertEquals("Check upb", upb, new Integer(1));
+ assertEquals("Check ups", ups, new Integer(1));
+ assertEquals("Check upi", upi, new Integer(1));
+ assertEquals("Check upl", upl, new Integer(1));
+ assertEquals("Check upd", upd, new Integer(1));
+ assertEquals("Check upf", upf, new Integer(1));
+ assertEquals("Check upc", upc, new Integer(1));
+ assertEquals("Check upbool", upbool, new Integer(1));
+
+ reconfigureString();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ b = (byte[]) props.get("bs");
+ s = (short[]) props.get("ss");
+ i = (int[]) props.get("is");
+ l = (long[]) props.get("ls");
+ d = (double[]) props.get("ds");
+ f = (float[]) props.get("fs");
+ c = (char[]) props.get("cs");
+ bool = (boolean[]) props.get("bools");
+
+ assertEquals("2) Check b 0", b[0], 3);
+ assertEquals("2) Check b 1", b[1], 2);
+ assertEquals("2) Check b 2", b[2], 1);
+ assertEquals("2) Check s 0", s[0], 3);
+ assertEquals("2) Check s 1", s[1], 2);
+ assertEquals("2) Check s 2", s[2], 1);
+ assertEquals("2) Check i 0", i[0], 3);
+ assertEquals("2) Check i 1", i[1], 2);
+ assertEquals("2) Check i 2", i[2], 1);
+ assertEquals("2) Check l 0", l[0], 3);
+ assertEquals("2) Check l 1", l[1], 2);
+ assertEquals("2) Check l 2", l[2], 1);
+ assertEquals("2) Check d 0", d[0], 3);
+ assertEquals("2) Check d 1", d[1], 2);
+ assertEquals("2) Check d 2", d[2], 1);
+ assertEquals("2) Check f 0", f[0], 3);
+ assertEquals("2) Check f 1", f[1], 2);
+ assertEquals("2) Check f 2", f[2], 1);
+ assertEquals("2) Check c 0", c[0], 'c');
+ assertEquals("2) Check c 1", c[1], 'b');
+ assertEquals("2) Check c 2", c[2], 'a');
+ assertFalse("2) Check bool 0", bool[0]);
+ assertFalse("2) Check bool 1", bool[0]);
+ assertFalse("2) Check bool 2", bool[0]);
+
+ upb = (Integer) props.get("upbs");
+ ups = (Integer) props.get("upss");
+ upi = (Integer) props.get("upis");
+ upl = (Integer) props.get("upls");
+ upd = (Integer) props.get("upds");
+ upf = (Integer) props.get("upfs");
+ upc = (Integer) props.get("upcs");
+ upbool = (Integer) props.get("upbools");
+
+ assertEquals("2) Check upb", upb, new Integer(2));
+ assertEquals("2) Check ups", ups, new Integer(2));
+ assertEquals("2) Check upi", upi, new Integer(2));
+ assertEquals("2) Check upl", upl, new Integer(2));
+ assertEquals("2) Check upd", upd, new Integer(2));
+ assertEquals("2) Check upf", upf, new Integer(2));
+ assertEquals("2) Check upc", upc, new Integer(2));
+ assertEquals("2) Check upbool", upbool, new Integer(2));
+
+ }
+
+ public void testConfigurationObj() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ Integer upString = (Integer) props.get("upstring");
+ Integer upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("Check upString", upString, new Integer(1));
+ assertEquals("Check upStrings", upStrings, new Integer(1));
+
+ reconfigure();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+
+ upString = (Integer) props.get("upstring");
+ upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("2) Check upString", upString, new Integer(2));
+ assertEquals("2) Check upStrings", upStrings, new Integer(2));
+ }
+
+ public void testConfigurationObjString() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ CheckService check = (CheckService) context.getService(ref);
+ Properties props = check.getProps();
+
+ String s = (String) props.get("string");
+ String[] ss = (String[]) props.get("strings");
+
+ assertEquals("Check string", s, "foo");
+ assertEquals("Check strings 0", ss[0], "foo");
+ assertEquals("Check strings 1", ss[1], "bar");
+ assertEquals("Check strings 2", ss[2], "baz");
+
+ Integer upString = (Integer) props.get("upstring");
+ Integer upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("Check upString", upString, new Integer(1));
+ assertEquals("Check upStrings", upStrings, new Integer(1));
+
+ reconfigureString();
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Test check service availability", ref);
+ check = (CheckService) context.getService(ref);
+ props = check.getProps();
+
+ s = (String) props.get("string");
+ ss = (String[]) props.get("strings");
+
+ assertEquals("2) Check string", s, "bar");
+ assertEquals("2) Check strings 0", ss[0], "baz");
+ assertEquals("2) Check strings 1", ss[1], "bar");
+ assertEquals("2) Check strings 2", ss[2], "foo");
+
+ upString = (Integer) props.get("upstring");
+ upStrings = (Integer) props.get("upstrings");
+
+ assertEquals("2) Check upString", upString, new Integer(2));
+ assertEquals("2) Check upStrings", upStrings, new Integer(2));
+ }
+
+ private void reconfigure() {
+ Properties props2 = new Properties();
+ props2.put("name", "under-test");
+ props2.put("b", new Byte("2"));
+ props2.put("s", new Short("2"));
+ props2.put("i", new Integer("2"));
+ props2.put("l", new Long("2"));
+ props2.put("d", new Double("2"));
+ props2.put("f", new Float("2"));
+ props2.put("c", new Character('b'));
+ props2.put("bool", new Boolean(false));
+ props2.put("bs", new byte[]{(byte)3,(byte)2,(byte)1});
+ props2.put("ss", new short[]{(short)3,(short)2,(short)1});
+ props2.put("is", new int[]{3,2,1});
+ props2.put("ls", new long[]{3,2,1});
+ props2.put("ds", new double[]{3,2,1});
+ props2.put("fs", new float[]{3,2,1});
+ props2.put("cs", new char[]{'c','b','a'});
+ props2.put("bools", new boolean[]{false,false,false});
+ props2.put("string", "bar");
+ props2.put("strings", new String[]{"baz", "bar", "foo"});
+
+ instance.reconfigure(props2);
+ }
+
+ private void reconfigureString() {
+ Properties props2 = new Properties();
+ props2.put("name", "under-test");
+ props2.put("b", "2");
+ props2.put("s", "2");
+ props2.put("i", "2");
+ props2.put("l", "2");
+ props2.put("d", "2");
+ props2.put("f", "2");
+ props2.put("c", "b");
+ props2.put("bool", "false");
+ props2.put("bs", "{3, 2,1}");
+ props2.put("ss", "{3, 2,1}");
+ props2.put("is", "{3, 2,1}");
+ props2.put("ls", "{3, 2,1}");
+ props2.put("ds", "{3, 2,1}");
+ props2.put("fs", "{3, 2,1}");
+ props2.put("cs", "{c, b , a}");
+ props2.put("bools", "{false,false,false}");
+ props2.put("string", "bar");
+ props2.put("strings", "{baz, bar, foo}");
+
+ instance.reconfigure(props2);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/controller/ImmediateLifeCycleControllerTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/controller/ImmediateLifeCycleControllerTest.java
new file mode 100644
index 0000000..c5f5e20
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/controller/ImmediateLifeCycleControllerTest.java
@@ -0,0 +1,115 @@
+/*
+ * 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.test.scenarios.controller;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class ImmediateLifeCycleControllerTest extends OSGiTestCase {
+
+ private ComponentInstance under;
+ private Factory factory;
+
+ public void setUp() {
+ factory = Utils.getFactoryByName(context, "lcTest2");
+ }
+
+ public void testOne() {
+ Properties props = new Properties();
+ props.put("conf", "foo");
+ props.put("name", "under");
+ under = Utils.getComponentInstance(context, "lcTest2", props);
+
+ // The conf is correct, the PS must be provided
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNotNull("Check service availability -1", ref);
+ CheckService cs = (CheckService) context.getService(ref);
+ assertTrue("Check state 1", cs.check());
+ context.ungetService(ref);
+ cs = null;
+
+ // Reconfigure the instance with a bad configuration
+ props.put("conf", "bar"); // Bar is a bad conf
+ try {
+ factory.reconfigure(props);
+ } catch(Exception e) {
+ fail("The reconfiguration is not unacceptable and seems unacceptable : " + props);
+ }
+
+ // The instance should now be invalid
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNull("Check service availability -2", ref);
+
+ // Reconfigure the instance with a valid configuration
+ props.put("conf", "foo"); // Bar is a bad conf
+ try {
+ factory.reconfigure(props);
+ } catch(Exception e) {
+ fail("The reconfiguration is not unacceptable and seems unacceptable (2) : " + props);
+ }
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNotNull("Check service availability -3", ref);
+ cs = (CheckService) context.getService(ref);
+ assertTrue("Check state 2", cs.check());
+ context.ungetService(ref);
+ cs = null;
+
+ under.dispose();
+ }
+
+ public void testTwo() {
+ Properties props = new Properties();
+ props.put("conf", "bar");
+ props.put("name", "under");
+ under = Utils.getComponentInstance(context, "lcTest2", props);
+
+ assertEquals("check under state", under.getState(), ComponentInstance.INVALID);
+
+ // The conf is incorrect, the PS must not be provided
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNull("Check service availability -1", ref);
+
+ // Reconfigure the instance with a correct configuration
+ props.put("conf", "foo");
+ try {
+ factory.reconfigure(props);
+ } catch(Exception e) {
+ fail("The reconfiguration is not unacceptable and seems unacceptable : " + props);
+ }
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNotNull("Check service availability -2", ref);
+ CheckService cs = (CheckService) context.getService(ref);
+ assertTrue("Check state ", cs.check());
+ context.ungetService(ref);
+ cs = null;
+
+ under.dispose();
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/controller/LifeCycleControllerTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/controller/LifeCycleControllerTest.java
new file mode 100644
index 0000000..d86b997
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/controller/LifeCycleControllerTest.java
@@ -0,0 +1,134 @@
+/*
+ * 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.test.scenarios.controller;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * @author clement
+ *
+ */
+public class LifeCycleControllerTest extends OSGiTestCase {
+
+ private ComponentInstance under;
+
+ private Factory factory;
+
+ public void setUp() {
+ factory = Utils.getFactoryByName(context, "lcTest");
+ }
+
+ public void testOne() {
+ Properties props = new Properties();
+ props.put("conf", "foo");
+ props.put("name", "under");
+ under = Utils.getComponentInstance(context, "lcTest", props);
+
+ // The conf is correct, the PS must be provided
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNotNull("Check service availability -1", ref);
+ CheckService cs = (CheckService) context.getService(ref);
+ assertTrue("Check state 1", cs.check());
+ context.ungetService(ref);
+ cs = null;
+
+ // Reconfigure the instance with a bad configuration
+ props.put("conf", "bar"); // Bar is a bad conf
+ try {
+ factory.reconfigure(props);
+ } catch (Exception e) {
+ fail("The reconfiguration is not unacceptable and seems unacceptable : " + props);
+ }
+
+ // The instance should now be invalid
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNull("Check service availability -2", ref);
+
+ // Reconfigure the instance with a valid configuration
+ props.put("conf", "foo"); // Bar is a bad conf
+ try {
+ factory.reconfigure(props);
+ } catch (Exception e) {
+ fail("The reconfiguration is not unacceptable and seems unacceptable (2) : " + props);
+ }
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNotNull("Check service availability -3", ref);
+ cs = (CheckService) context.getService(ref);
+ assertTrue("Check state 2", cs.check());
+ context.ungetService(ref);
+ cs = null;
+
+ under.dispose();
+ }
+
+ /**
+ * This test must be removed as it is not compliant with OSGi. It unregisters a service during the creation of the
+ * service instance, so the returned object is null.
+ */
+ public void notestTwo() {
+ Properties props = new Properties();
+ props.put("conf", "bar");
+ props.put("name", "under");
+ under = Utils.getComponentInstance(context, "lcTest", props);
+
+ // The conf is incorrect, but the test can appears only when the object is created : the PS must be provided
+ ServiceReference ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNotNull("Check service availability -1", ref);
+
+ System.out.println("CS received : " + context.getService(ref));
+ CheckService cs = (CheckService) context.getService(ref);
+ assertNotNull("Assert CS not null", cs);
+ try {
+ assertFalse("Check state (false)", cs.check());
+ } catch (Throwable e) {
+ e.printStackTrace();
+ fail(e.getMessage());
+ }
+
+ // As soon as the instance is created, the service has to disappear :
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNull("Check service availability -2", ref);
+
+ // Reconfigure the instance with a correct configuration
+ props.put("conf", "foo");
+ try {
+ factory.reconfigure(props);
+ } catch (Exception e) {
+ fail("The reconfiguration is not unacceptable and seems unacceptable : " + props);
+ }
+
+ ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "under");
+ assertNotNull("Check service availability -3", ref);
+ cs = (CheckService) context.getService(ref);
+ assertTrue("Check state ", cs.check());
+ context.ungetService(ref);
+ cs = null;
+
+ under.dispose();
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/controller/LifeCycleControllerTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/controller/LifeCycleControllerTestSuite.java
new file mode 100644
index 0000000..423088f
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/controller/LifeCycleControllerTestSuite.java
@@ -0,0 +1,36 @@
+/*
+ * 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.test.scenarios.controller;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class LifeCycleControllerTestSuite {
+
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Lifecycle Controller Test Suite", bc);
+ ots.addTestSuite( LifeCycleControllerTest.class);
+ ots.addTestSuite( ImmediateLifeCycleControllerTest.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/core/ComponentDesc.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/core/ComponentDesc.java
new file mode 100644
index 0000000..df3d25a
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/core/ComponentDesc.java
@@ -0,0 +1,336 @@
+/*
+ * 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.test.scenarios.core;
+
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.ComponentTypeDescription;
+import org.apache.felix.ipojo.architecture.PropertyDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class ComponentDesc extends OSGiTestCase {
+
+ ServiceReference sr_fooProvider1;
+ ServiceReference sr_fooProvider2;
+ ServiceReference sr_fooProviderDyn2;
+ ServiceReference sr_fooProvider3;
+ ServiceReference sr_foobarProvider;
+// ServiceReference sr_simple;
+// ServiceReference sr_optional;
+// ServiceReference sr_multiple;
+// ServiceReference sr_multiple_optional;
+
+ Factory fooProvider1;
+ Factory fooProvider2;
+ Factory fooProviderDyn2;
+ Factory fooProvider3;
+ Factory foobarProvider;
+// Factory simple;
+// Factory optional;
+// Factory multiple;
+// Factory multiple_optional;
+
+ public void setUp() {
+ sr_fooProvider1 = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooProviderType-1");
+ sr_fooProvider2 = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooProviderType-2");
+ sr_fooProviderDyn2 = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooProviderType-Dyn2");
+ sr_fooProvider3 = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooProviderType-3");
+ sr_foobarProvider = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooBarProviderType-1");
+// sr_simple = Utils.getServiceReferenceByName(context, Factory.class.getName(), "SimpleCheckServiceProvider");
+// sr_optional = Utils.getServiceReferenceByName(context, Factory.class.getName(), "SimpleOptionalCheckServiceProvider");
+// sr_multiple = Utils.getServiceReferenceByName(context, Factory.class.getName(), "SimpleMultipleCheckServiceProvider");
+// sr_multiple_optional = Utils.getServiceReferenceByName(context, Factory.class.getName(), "SimpleOptionalMultipleCheckServiceProvider");
+
+ fooProvider1 = (Factory) context.getService(sr_fooProvider1);
+ fooProvider2 = (Factory) context.getService(sr_fooProvider2);
+ fooProviderDyn2 = (Factory) context.getService(sr_fooProviderDyn2);
+ fooProvider3 = (Factory) context.getService(sr_fooProvider3);
+ foobarProvider = (Factory) context.getService(sr_foobarProvider);
+// simple = (Factory) context.getService(sr_simple);
+// optional = (Factory) context.getService(sr_optional);
+// multiple = (Factory) context.getService(sr_multiple);
+// multiple_optional = (Factory) context.getService(sr_multiple_optional);
+
+ }
+
+ public void tearDown() {
+ fooProvider1 = null;
+ fooProvider2 = null;
+ fooProviderDyn2 = null;
+ fooProvider3 = null;
+ foobarProvider = null;
+// simple = null;
+// multiple = null;
+// optional = null;
+// multiple_optional = null;
+
+ context.ungetService(sr_fooProvider1);
+ context.ungetService(sr_fooProvider2);
+ context.ungetService(sr_fooProviderDyn2);
+ context.ungetService(sr_fooProvider3);
+ context.ungetService(sr_foobarProvider);
+// context.ungetService(sr_simple);
+// context.ungetService(sr_optional);
+// context.ungetService(sr_multiple);
+// context.ungetService(sr_multiple_optional);
+ }
+
+ public void testFooProvider1() {
+ // Test SR properties
+// String impl = (String) sr_fooProvider1.getProperty("component.class");
+// assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooProviderType1");
+
+ String[] specs = (String[]) sr_fooProvider1.getProperty("component.providedServiceSpecifications");
+ assertEquals("Check component.providedServiceSpecifications length", specs.length, 1);
+ assertEquals("Check component.providedServiceSpecifications", FooService.class.getName(), specs[0]);
+
+ PropertyDescription[] pd = (PropertyDescription[]) sr_fooProvider1.getProperty("component.properties");
+ assertEquals("Check component.properties length", pd.length, 0);
+
+ // Test factory
+ assertEquals("Check factory name", fooProvider1.getName(), "FooProviderType-1");
+ Element cd = fooProvider1.getDescription();
+
+// assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl);
+
+ Element[] specs2 = cd.getElements("provides");
+ assertEquals("Check specs length", specs2.length, 1);
+ assertEquals("Check specs", FooService.class.getName(), specs2[0].getAttribute("specification"));
+
+ Element[] pd2 = cd.getElements("property");
+ assertNull("Check props null", pd2);
+
+ // Check Description equality
+ ComponentTypeDescription desc = (ComponentTypeDescription) sr_fooProvider1.getProperty("component.description");
+ assertNotNull("check description equality", desc);
+ }
+
+ public void testFooProvider2() {
+ // Test SR properties
+// String impl = (String) sr_fooProvider2.getProperty("component.class");
+// assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooProviderType1");
+
+ String[] specs = (String[]) sr_fooProvider2.getProperty("component.providedServiceSpecifications");
+ assertEquals("Check component.providedServiceSpecifications length", specs.length, 1);
+ assertEquals("Check component.providedServiceSpecifications", FooService.class.getName(), specs[0]);
+
+ PropertyDescription[] pd = (PropertyDescription[]) sr_fooProvider2.getProperty("component.properties");
+ assertEquals("Check component.properties length", pd.length, 5);
+
+ assertEquals("Check component.properties name [" + 0 + "]", "int", pd[0].getName());
+ assertEquals("Check component.properties type [" + 0 + "]", "int", pd[0].getType());
+ assertEquals("Check component.properties value [" + 0 + "]", "2", pd[0].getValue());
+
+ assertEquals("Check component.properties name [" + 1 + "]", "long", pd[1].getName());
+ assertEquals("Check component.properties type [" + 1 + "]", "long", pd[1].getType());
+ assertEquals("Check component.properties value [" + 1 + "]", "40", pd[1].getValue());
+
+ assertEquals("Check component.properties name [" + 2 + "]", "string", pd[2].getName());
+ assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd[2].getType());
+ assertEquals("Check component.properties value [" + 2 + "]", "foo", pd[2].getValue());
+
+ assertEquals("Check component.properties name [" + 3 + "]", "strAProp", pd[3].getName());
+ assertEquals("Check component.properties type [" + 3 + "]", "java.lang.String[]", pd[3].getType());
+
+ assertEquals("Check component.properties name [" + 4 + "]", "intAProp", pd[4].getName());
+ assertEquals("Check component.properties type [" + 4 + "]", "int[]", pd[4].getType());
+
+ // Test factory
+ assertEquals("Check factory name", fooProvider2.getName(), "FooProviderType-2");
+ Element cd = fooProvider2.getDescription();
+
+// assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl);
+
+ Element[] specs2 = cd.getElements("provides");
+ assertEquals("Check specs length", specs2.length, 1);
+ assertEquals("Check specs", FooService.class.getName(), specs2[0].getAttribute("specification"));
+
+ Element[] pd2 = cd.getElements("property");
+ assertEquals("Check props length", pd2.length, 5);
+
+ assertEquals("Check component.properties name [" + 0 + "]", "int", pd2[0].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 0 + "]", "int", pd2[0].getAttribute("type"));
+ assertEquals("Check component.properties value [" + 0 + "]", "2", pd2[0].getAttribute("value"));
+
+ assertEquals("Check component.properties name [" + 1 + "]", "long", pd2[1].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 1 + "]", "long", pd2[1].getAttribute("type"));
+ assertEquals("Check component.properties value [" + 1 + "]", "40", pd2[1].getAttribute("value"));
+
+ assertEquals("Check component.properties name [" + 2 + "]", "string", pd2[2].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd2[2].getAttribute("type"));
+ assertEquals("Check component.properties value [" + 2 + "]", "foo", pd2[2].getAttribute("value"));
+
+ assertEquals("Check component.properties name [" + 3 + "]", "strAProp", pd2[3].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 3 + "]", "java.lang.String[]", pd2[3].getAttribute("type"));
+
+ assertEquals("Check component.properties name [" + 4 + "]", "intAProp", pd2[4].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 4 + "]", "int[]", pd2[4].getAttribute("type"));
+
+ // Check Description equality
+ ComponentTypeDescription desc = (ComponentTypeDescription) sr_fooProvider2.getProperty("component.description");
+ assertNotNull("check description equality", desc);
+ }
+
+ public void testFooProviderDyn2() {
+ // Test SR properties
+// String impl = (String) sr_fooProviderDyn2.getProperty("component.class");
+// assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooProviderTypeDyn2");
+
+ String[] specs = (String[]) sr_fooProviderDyn2.getProperty("component.providedServiceSpecifications");
+ assertEquals("Check component.providedServiceSpecifications length", specs.length, 1);
+ assertEquals("Check component.providedServiceSpecifications", FooService.class.getName(), specs[0]);
+
+ PropertyDescription[] pd = (PropertyDescription[]) sr_fooProviderDyn2.getProperty("component.properties");
+ assertEquals("Check component.properties length", pd.length, 5);
+
+ assertEquals("Check component.properties name [" + 0 + "]", "int", pd[0].getName());
+ assertEquals("Check component.properties type [" + 0 + "]", "int", pd[0].getType());
+ assertEquals("Check component.properties value [" + 0 + "]", "4", pd[0].getValue());
+
+ assertEquals("Check component.properties name [" + 1 + "]", "boolean", pd[1].getName());
+ assertEquals("Check component.properties type [" + 1 + "]", "boolean", pd[1].getType());
+
+ assertEquals("Check component.properties name [" + 2 + "]", "string", pd[2].getName());
+ assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd[2].getType());
+
+ assertEquals("Check component.properties name [" + 3 + "]", "strAProp", pd[3].getName());
+ assertEquals("Check component.properties type [" + 3 + "]", "java.lang.String[]", pd[3].getType());
+
+ assertEquals("Check component.properties name [" + 4 + "]", "intAProp", pd[4].getName());
+ assertEquals("Check component.properties type [" + 4 + "]", "int[]", pd[4].getType());
+
+ // Test factory
+ assertEquals("Check factory name", fooProviderDyn2.getName(), "FooProviderType-Dyn2");
+ Element cd = fooProviderDyn2.getDescription();
+
+// assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl);
+
+ Element[] specs2 = cd.getElements("provides");
+ assertEquals("Check specs length", specs2.length, 1);
+ assertEquals("Check specs", FooService.class.getName(), specs2[0].getAttribute("specification"));
+
+ Element[] pd2 = cd.getElements("property");
+ assertEquals("Check props length", pd2.length, 5);
+
+ assertEquals("Check component.properties name [" + 0 + "]", "int", pd2[0].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 0 + "]", "int", pd2[0].getAttribute("type"));
+ assertEquals("Check component.properties value [" + 0 + "]", "4", pd2[0].getAttribute("value"));
+
+ assertEquals("Check component.properties name [" + 1 + "]", "boolean", pd2[1].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 1 + "]", "boolean", pd2[1].getAttribute("type"));
+
+ assertEquals("Check component.properties name [" + 2 + "]", "string", pd2[2].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd2[2].getAttribute("type"));
+
+ assertEquals("Check component.properties name [" + 3 + "]", "strAProp", pd2[3].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 3 + "]", "java.lang.String[]", pd2[3].getAttribute("type"));
+
+ assertEquals("Check component.properties name [" + 4 + "]", "intAProp", pd2[4].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 4 + "]", "int[]", pd2[4].getAttribute("type"));
+
+ // Check Description equality
+ ComponentTypeDescription desc = (ComponentTypeDescription) sr_fooProviderDyn2.getProperty("component.description");
+ assertNotNull("check description equality", desc);
+ }
+
+ public void testFooProvider3() {
+ // Test SR properties
+// String impl = (String) sr_fooProvider3.getProperty("component.class");
+// assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooProviderType1");
+
+ String[] specs = (String[]) sr_fooProvider3.getProperty("component.providedServiceSpecifications");
+ assertEquals("Check component.providedServiceSpecifications length", specs.length, 1);
+ assertEquals("Check component.providedServiceSpecifications", FooService.class.getName(), specs[0]);
+
+ PropertyDescription[] pd = (PropertyDescription[]) sr_fooProvider3.getProperty("component.properties");
+ assertEquals("Check component.properties length (" + pd.length +")", pd.length, 3);
+
+ assertEquals("Check component.properties name [" + 0 + "]", "foo", pd[0].getName());
+
+ assertEquals("Check component.properties name [" + 1 + "]", "bar", pd[1].getName());
+
+ assertEquals("Check component.properties name [" + 2 + "]", "baz", pd[2].getName());
+ assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd[2].getType());
+
+ // Test factory
+ assertEquals("Check factory name", fooProvider3.getName(), "FooProviderType-3");
+ Element cd = fooProvider3.getDescription();
+
+// assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl);
+
+ Element[] specs2 = cd.getElements("provides");
+ assertEquals("Check specs length", specs2.length, 1);
+ assertEquals("Check specs", FooService.class.getName(), specs2[0].getAttribute("specification"));
+
+ Element[] pd2 = cd.getElements("property");
+ assertEquals("Check props length", pd2.length, 3);
+
+ assertEquals("Check component.properties name [" + 0 + "]", "foo", pd2[0].getAttribute("name"));
+
+ assertEquals("Check component.properties name [" + 1 + "]", "bar", pd2[1].getAttribute("name"));
+
+ assertEquals("Check component.properties name [" + 2 + "]", "baz", pd2[2].getAttribute("name"));
+ assertEquals("Check component.properties type [" + 2 + "]", "java.lang.String", pd2[2].getAttribute("type"));
+
+ // Check Description equality
+ ComponentTypeDescription desc = (ComponentTypeDescription) sr_fooProvider3.getProperty("component.description");
+ assertNotNull("check description equality", desc);
+ }
+
+ public void testFooBar() {
+ // Test SR properties
+// String impl = (String) sr_foobarProvider.getProperty("component.class");
+// assertEquals("Check component.class", impl, "org.apache.felix.ipojo.test.scenarios.component.FooBarProviderType1");
+
+ String[] specs = (String[]) sr_foobarProvider.getProperty("component.providedServiceSpecifications");
+ assertEquals("Check component.providedServiceSpecifications length", specs.length, 2);
+ assertEquals("Check component.providedServiceSpecifications 1", FooService.class.getName(), specs[1]);
+ assertEquals("Check component.providedServiceSpecifications 2", BarService.class.getName(), specs[0]);
+
+ PropertyDescription[] pd = (PropertyDescription[]) sr_foobarProvider.getProperty("component.properties");
+ assertEquals("Check component.properties length", pd.length, 0);
+
+ // Test factory
+ assertEquals("Check factory name", foobarProvider.getName(), "FooBarProviderType-1");
+ Element cd = foobarProvider.getDescription();
+
+// assertEquals("Check implementation class ", cd.getAttribute("implementation-class"), impl);
+
+ Element[] specs2 = cd.getElements("provides");
+ assertEquals("Check specs length", specs2.length, 2);
+ assertEquals("Check specs", FooService.class.getName(), specs2[1].getAttribute("specification"));
+ assertEquals("Check specs", BarService.class.getName(), specs2[0].getAttribute("specification"));
+
+ Element[] pd2 = cd.getElements("property");
+ assertNull("Check props null", pd2);
+
+ // Check Description equality
+ ComponentTypeDescription desc = (ComponentTypeDescription) sr_foobarProvider.getProperty("component.description");
+ assertNotNull("check description equality", desc);
+
+ }
+
+
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/core/CoreTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/core/CoreTestSuite.java
new file mode 100644
index 0000000..bc87ae4
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/core/CoreTestSuite.java
@@ -0,0 +1,37 @@
+/*
+ * 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.test.scenarios.core;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class CoreTestSuite extends TestSuite {
+
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Contre Test Suite", bc);
+ ots.addTestSuite(POJOCreation.class);
+ ots.addTestSuite(ComponentDesc.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/core/POJOCreation.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/core/POJOCreation.java
new file mode 100644
index 0000000..7c76bbf
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/core/POJOCreation.java
@@ -0,0 +1,264 @@
+/*
+ * 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.test.scenarios.core;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.component.FooProviderType1;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class POJOCreation extends OSGiTestCase {
+
+ private ComponentInstance ci_lazzy;
+ private ComponentInstance ci_immediate;
+ private ComponentInstance ci_immediate_singleton;
+
+ private Architecture lazzyArch;
+ private Architecture immeArch;
+ private Architecture immeArchSing;
+
+ private ServiceReference lazzyRef;
+ private ServiceReference immRef;
+ private ServiceReference immRefSing;
+ private ComponentInstance ci_lazzy_sing;
+ private ComponentInstance ci_lazzy_sev;
+ private ServiceReference lazzyRefSing;
+ private ServiceReference lazzyRefSev;
+ private Architecture lazzyArchSing;
+ private Architecture lazzyArchSev;
+ private ComponentInstance ci_lazzy_singM;
+ private ComponentInstance ci_lazzy_sevM;
+ private ServiceReference lazzyRefSingM;
+ private ServiceReference lazzyRefSevM;
+ private Architecture lazzyArchSingM;
+ private Architecture lazzyArchSevM;
+
+ public void setUp() {
+ String factName = "FooProviderType-1";
+ String compName = "FooProvider-1";
+ Properties p = new Properties();
+ p.put("name", compName);
+ ci_lazzy = Utils.getComponentInstance(context, factName ,p);
+
+ String factName2 = "ImmediateFooProviderType";
+ String compName2 = "FooProvider-2";
+ Properties p2 = new Properties();
+ p2.put("name", compName2);
+ ci_immediate = Utils.getComponentInstance(context, factName2, p2);
+
+ String factName3 = "ImmediateFooProviderTypeSingleton";
+ String compName3 = "FooProvider-3";
+ Properties p3 = new Properties();
+ p3.put("name", compName3);
+ ci_immediate_singleton = Utils.getComponentInstance(context, factName3, p3);
+
+ String factName4 = "FooProviderType-1-Sing";
+ String compName4 = "FooProvider-1-Sing";
+ Properties p4 = new Properties();
+ p4.put("name", compName4);
+ ci_lazzy_sing = Utils.getComponentInstance(context, factName4 ,p4);
+
+ String factName5 = "FooProviderType-1-Sev";
+ String compName5 = "FooProvider-1-Sev";
+ Properties p5 = new Properties();
+ p5.put("name", compName5);
+ ci_lazzy_sev = Utils.getComponentInstance(context, factName5 ,p5);
+
+ String factName6 = "FooProviderType-1-SingM";
+ String compName6 = "FooProvider-1-SingM";
+ Properties p6 = new Properties();
+ p6.put("name", compName6);
+ ci_lazzy_singM = Utils.getComponentInstance(context, factName6 ,p6);
+
+ String factName7 = "FooProviderType-1-SevM";
+ String compName7 = "FooProvider-1-SevM";
+ Properties p7 = new Properties();
+ p7.put("name", compName7);
+ ci_lazzy_sevM = Utils.getComponentInstance(context, factName7 ,p7);
+
+ lazzyRef = Utils.getServiceReference(context, Architecture.class.getName(), "(instance.name="+compName+")");
+ immRef = Utils.getServiceReference(context, Architecture.class.getName(), "(instance.name="+compName2+")");
+ immRefSing = Utils.getServiceReference(context, Architecture.class.getName(), "(instance.name="+compName3+")");
+ lazzyRefSing = Utils.getServiceReference(context, Architecture.class.getName(), "(instance.name="+compName4+")");
+ lazzyRefSev = Utils.getServiceReference(context, Architecture.class.getName(), "(instance.name="+compName5+")");
+ lazzyRefSingM = Utils.getServiceReference(context, Architecture.class.getName(), "(instance.name="+compName6+")");
+ lazzyRefSevM = Utils.getServiceReference(context, Architecture.class.getName(), "(instance.name="+compName7+")");
+
+ lazzyArch = (Architecture) context.getService(lazzyRef);
+ immeArch = (Architecture) context.getService(immRef);
+ immeArchSing = (Architecture) context.getService(immRefSing);
+ lazzyArchSing = (Architecture) context.getService(lazzyRefSing);
+ lazzyArchSev = (Architecture) context.getService(lazzyRefSev);
+ lazzyArchSingM = (Architecture) context.getService(lazzyRefSingM);
+ lazzyArchSevM = (Architecture) context.getService(lazzyRefSevM);
+ }
+
+ public void tearDown() {
+ context.ungetService(lazzyRef);
+ context.ungetService(immRef);
+ context.ungetService(immRefSing);
+ context.ungetService(lazzyRefSing);
+ context.ungetService(lazzyRefSev);
+ context.ungetService(lazzyRefSingM);
+ context.ungetService(lazzyRefSevM);
+ lazzyArch = null;
+ immeArch = null;
+ immeArchSing = null;
+ lazzyArchSing = null;
+ lazzyArchSev = null;
+ lazzyArchSingM = null;
+ lazzyArchSevM = null;
+ ci_lazzy.dispose();
+ ci_immediate.dispose();
+ ci_immediate_singleton.dispose();
+ ci_lazzy_sing.dispose();
+ ci_lazzy_sev.dispose();
+ ci_lazzy_singM.dispose();
+ ci_lazzy_sevM.dispose();
+ }
+
+ public void testLazyCreation() {
+ assertEquals("Check that no objects are created ", 0, lazzyArch.getInstanceDescription().getCreatedObjects().length);
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_lazzy.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_lazzy.getInstanceName() + " is available",refs);
+ FooService fs = (FooService) context.getService(refs[0]);
+ assertTrue("Check the FooService invocation", fs.foo());
+ assertEquals("Check the creation of 1 object",1, lazzyArch.getInstanceDescription().getCreatedObjects().length);
+ context.ungetService(refs[0]);
+ }
+
+ public void testLazyCreationSingleton() {
+ assertEquals("Check that no objects are created ", 0, lazzyArchSing.getInstanceDescription().getCreatedObjects().length);
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_lazzy_sing.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_lazzy_sing.getInstanceName() + " is available",refs);
+ FooService fs = (FooService) context.getService(refs[0]);
+ assertTrue("Check the FooService invocation", fs.foo());
+ assertEquals("Check the creation of 1 object",1, lazzyArchSing.getInstanceDescription().getCreatedObjects().length);
+ context.ungetService(refs[0]);
+ }
+
+ public void testLazyCreationSeveral() {
+ assertEquals("Check that no objects are created ", 0, lazzyArchSev.getInstanceDescription().getCreatedObjects().length);
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_lazzy_sev.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_lazzy_sev.getInstanceName() + " is available",refs);
+ FooService fs = (FooService) context.getService(refs[0]);
+ FooService fs2 = (FooService) context.getService(refs[0]);
+ assertTrue("Check the FooService invocation", fs.foo());
+ assertTrue("Check the FooService invocation-2", fs2.foo());
+ assertEquals("Check the creation of 1 object",1, lazzyArchSev.getInstanceDescription().getCreatedObjects().length);
+ context.ungetService(refs[0]);
+ }
+
+ public void testImmediateCreation() {
+ assertEquals("Check that one object is created ", 1, immeArch.getInstanceDescription().getCreatedObjects().length);
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_immediate.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_immediate.getInstanceName() + " is available",refs);
+ FooService fs = (FooService) context.getService(refs[0]);
+ assertTrue("Check the FooService invocation", fs.foo());
+ assertEquals("Check the creation of 1 object", 1, immeArch.getInstanceDescription().getCreatedObjects().length);
+ context.ungetService(refs[0]);
+ }
+
+ public void testBundleContext() {
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_lazzy.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_lazzy.getInstanceName() + " is available",refs);
+ FooService fs = (FooService) context.getService(refs[0]);
+ Properties p = fs.fooProps();
+ assertNotNull("Check the bundle context", p.get("context"));
+ assertEquals("Check the creation of 1 object",1, lazzyArch.getInstanceDescription().getCreatedObjects().length);
+ context.ungetService(refs[0]);
+ }
+
+ public void testImmediateSingletonCreation() {
+ assertEquals("Check that one object is created ", 1, immeArchSing.getInstanceDescription().getCreatedObjects().length);
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_immediate_singleton.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_immediate_singleton.getInstanceName() + " is available",refs);
+ FooService fs = (FooService) context.getService(refs[0]);
+ assertTrue("Check the FooService invocation", fs.foo());
+ assertEquals("Check the creation of 1 object", 1, immeArchSing.getInstanceDescription().getCreatedObjects().length);
+ context.ungetService(refs[0]);
+ }
+
+ public void testLazyCreationSingletonM() {
+ assertEquals("Check that no objects are created ", 0, lazzyArchSingM.getInstanceDescription().getCreatedObjects().length);
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_lazzy_singM.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_lazzy_singM.getInstanceName() + " is available",refs);
+ FooService fs = (FooService) context.getService(refs[0]);
+ FooService fs2 = (FooService) context.getService(refs[0]);
+ assertTrue("Check the FooService invocation", fs.foo());
+ assertTrue("Check the FooService invocation", fs2.foo());
+ assertEquals("Check the creation of 1 object",1, lazzyArchSingM.getInstanceDescription().getCreatedObjects().length);
+ context.ungetService(refs[0]);
+ }
+
+ public void testLazyCreationSeveralM() {
+ assertEquals("Check that no objects are created ", 0, lazzyArchSevM.getInstanceDescription().getCreatedObjects().length);
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_lazzy_sevM.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_lazzy_sevM.getInstanceName() + " is available",refs);
+ FooService fs = (FooService) context.getService(refs[0]);
+ assertTrue("Check the FooService invocation", fs.foo());
+ assertEquals("Check the creation of 1 object",1, lazzyArchSevM.getInstanceDescription().getCreatedObjects().length);
+ FooService fs2 = (FooService) context.getService(refs[0]);
+ assertTrue("Check the FooService invocation-2", fs2.foo());
+ // Only one object as the getService method is called only once (service factory) despite the policy="method".
+ assertEquals("Check the creation of 1 object",1, lazzyArchSevM.getInstanceDescription().getCreatedObjects().length);
+ context.ungetService(refs[0]);
+ }
+
+ public void testCustomConstuctor() {
+ FooService fs = new FooProviderType1(0, "foo", context);
+ Properties props = fs.fooProps();
+ assertEquals("Check bar", 0, ((Integer) props.get("bar")).intValue());
+ assertEquals("Check foo", "foo", props.get("foo"));
+ assertEquals("Check context", context, props.get("context"));
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedMultipleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedMultipleDependencies.java
new file mode 100644
index 0000000..edc0b2f
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedMultipleDependencies.java
@@ -0,0 +1,368 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedMultipleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4, instance5;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "SimpleMultipleCheckServiceProvider").createComponentInstance(i1);
+ instance1.stop();
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "VoidMultipleCheckServiceProvider").createComponentInstance(i2);
+ instance2.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "ObjectMultipleCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "RefMultipleCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "BothMultipleCheckServiceProvider").createComponentInstance(i5);
+ instance5.stop();
+
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ } catch(Exception e) { fail(e.getMessage()); }
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testSimple() {
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 2.0, 0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 1.0, 0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance1.stop();
+ }
+
+ public void testVoid() {
+ instance2.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 2.0, 0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 1);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0, 0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance2.stop();
+ }
+
+ public void testObject() {
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 2.0, 0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0, 0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 2.0, 0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0, 0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ instance4.stop();
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ instance5.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer)props.get("bothB")).intValue(), 2);
+ assertEquals("check both unbind callback invocation - 1", ((Integer)props.get("bothU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 2.0, 0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 3", ((Integer)props.get("bothB")).intValue(), 2);
+ assertEquals("check both unbind callback invocation - 3", ((Integer)props.get("bothU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0, 0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ instance5.stop();
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedOptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedOptionalDependencies.java
new file mode 100644
index 0000000..763ebca
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedOptionalDependencies.java
@@ -0,0 +1,353 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedOptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4, instance5;
+
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "SimpleOptionalCheckServiceProvider").createComponentInstance(i1);
+ instance1.stop();
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "VoidOptionalCheckServiceProvider").createComponentInstance(i2);
+ instance2.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "ObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "RefOptionalCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "BothOptionalCheckServiceProvider").createComponentInstance(i5);
+ instance5.stop();
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testSimple() {
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ // Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 1", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation - 2", ((Boolean) props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer) props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 2", ((Long) props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 2", ((Double) props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance1.stop();
+ }
+
+ public void testVoid() {
+ instance2.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 1", ((Integer) props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation - 1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 1", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 1);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer) props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 2", ((Long) props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 2", ((Double) props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance2.stop();
+ }
+
+ public void testObject() {
+ instance3.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 1);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+ public void testBoth() {
+ instance5.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedOptionalMultipleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedOptionalMultipleDependencies.java
new file mode 100644
index 0000000..2546039
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedOptionalMultipleDependencies.java
@@ -0,0 +1,356 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedOptionalMultipleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "SimpleOptionalMultipleCheckServiceProvider").createComponentInstance(i1);
+ instance1.stop();
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "VoidOptionalMultipleCheckServiceProvider").createComponentInstance(i2);
+ instance2.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "ObjectOptionalMultipleCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "RefOptionalMultipleCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ } catch(Exception e) { fail(e.getMessage()); }
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testSimple() {
+ instance1.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, it still one provider.
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 4", ((Boolean)props.get("result")).booleanValue()); // False, no more provider.
+ assertEquals("check void bind invocation - 4", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 4", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 4", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 4", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 4", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 4", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 4", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 4", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 4", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance1.stop();
+ }
+
+ public void testVoid() {
+ instance2.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 1);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 4", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 4", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 4", ((Integer)props.get("voidU")).intValue(), 2);
+ assertEquals("check object bind callback invocation - 4", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 4", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 4", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 4", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 4", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 4", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 4", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance2.stop();
+ }
+
+ public void testObject() {
+ instance3.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 2);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 2);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance4.stop();
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedSimpleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedSimpleDependencies.java
new file mode 100644
index 0000000..489c161
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DelayedSimpleDependencies.java
@@ -0,0 +1,262 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedSimpleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4, instance5;
+ ComponentInstance fooProvider;
+
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "SimpleCheckServiceProvider").createComponentInstance(i1);
+ instance1.stop();
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "VoidCheckServiceProvider").createComponentInstance(i2);
+ instance2.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "ObjectCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "RefCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "BothCheckServiceProvider").createComponentInstance(i5);
+ instance5.stop();
+ } catch(Exception e) { fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testSimple() {
+ instance1.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+ fooProvider.stop();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+ fooProvider.start();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+ fooProvider.stop();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance1.stop();
+ }
+
+ public void testVoid() {
+ instance2.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance2.stop();
+ }
+
+ public void testObject() {
+ instance3.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+ public void testBoth() {
+ instance5.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance5.stop();
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DependencyTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DependencyTestSuite.java
new file mode 100644
index 0000000..8943880
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/DependencyTestSuite.java
@@ -0,0 +1,57 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.apache.felix.ipojo.test.scenarios.dependency.di.DefaultImplementationTestSuite;
+import org.apache.felix.ipojo.test.scenarios.dependency.statics.StaticDependencyTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class DependencyTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Service Dependencies Test Suite", bc);
+ ots.addTestSuite(SimpleDependencies.class);
+ ots.addTestSuite(OptionalDependencies.class);
+ ots.addTestSuite(MultipleDependencies.class);
+ ots.addTestSuite(OptionalMultipleDependencies.class);
+ ots.addTestSuite(DelayedSimpleDependencies.class);
+ ots.addTestSuite(DelayedOptionalDependencies.class);
+ ots.addTestSuite(DelayedMultipleDependencies.class);
+ ots.addTestSuite(DelayedOptionalMultipleDependencies.class);
+ ots.addTestSuite(MethodSimpleDependencies.class);
+ ots.addTestSuite(MethodOptionalDependencies.class);
+ ots.addTestSuite(MethodMultipleDependencies.class);
+ ots.addTestSuite(MethodOptionalMultipleDependencies.class);
+ ots.addTestSuite(MethodDelayedSimpleDependencies.class);
+ ots.addTestSuite(MethodDelayedOptionalDependencies.class);
+ ots.addTestSuite(MethodDelayedMultipleDependencies.class);
+ ots.addTestSuite(MethodDelayedOptionalMultipleDependencies.class);
+ ots.addTestSuite(SimpleFilterDependencies.class);
+ ots.addTestSuite(OptionalSimpleFilterDependencies.class);
+ ots.addTestSuite(MultipleFilterDependencies.class);
+ ots.addTestSuite(OptionalMultipleFilterDependencies.class);
+ ots.addTest(StaticDependencyTestSuite.suite(bc));
+ ots.addTest(DefaultImplementationTestSuite.suite(bc));
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedMultipleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedMultipleDependencies.java
new file mode 100644
index 0000000..822be4b
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedMultipleDependencies.java
@@ -0,0 +1,244 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodDelayedMultipleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "MObjectMultipleCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "MRefMultipleCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "MBothMultipleCheckServiceProvider").createComponentInstance(i5);
+ instance5.stop();
+
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ } catch(Exception e) { fail(e.getMessage()); }
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testObject() {
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ instance4.stop();
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ instance5.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer)props.get("bothB")).intValue(), 2);
+ assertEquals("check both unbind callback invocation - 1", ((Integer)props.get("bothU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 3", ((Integer)props.get("bothB")).intValue(), 2);
+ assertEquals("check both unbind callback invocation - 3", ((Integer)props.get("bothU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ instance5.stop();
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedOptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedOptionalDependencies.java
new file mode 100644
index 0000000..72f9271
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedOptionalDependencies.java
@@ -0,0 +1,225 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodDelayedOptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "MObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "MRefOptionalCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "MBothOptionalCheckServiceProvider").createComponentInstance(i5);
+ instance5.stop();
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testObject() {
+ instance3.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 1);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+ public void testBoth() {
+ instance5.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedOptionalMultipleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedOptionalMultipleDependencies.java
new file mode 100644
index 0000000..f08366b
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedOptionalMultipleDependencies.java
@@ -0,0 +1,207 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodDelayedOptionalMultipleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4;
+ ComponentInstance fooProvider1, fooProvider2;
+
+
+ public void setUp() {
+ try {
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "MObjectOptionalMultipleCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "MRefOptionalMultipleCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ } catch(Exception e) { fail(e.getMessage()); }
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance3 = null;
+ instance4 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testObject() {
+ instance3.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 2);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 2);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ instance4.stop();
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedSimpleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedSimpleDependencies.java
new file mode 100644
index 0000000..bc7af12
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodDelayedSimpleDependencies.java
@@ -0,0 +1,182 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodDelayedSimpleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+ ComponentInstance fooProvider;
+
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "MObjectCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "MRefCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "MBothCheckServiceProvider").createComponentInstance(i5);
+ instance5.stop();
+ } catch(Exception e) { fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testObject() {
+ instance3.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+ public void testBoth() {
+ instance5.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodMultipleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodMultipleDependencies.java
new file mode 100644
index 0000000..20cca5b
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodMultipleDependencies.java
@@ -0,0 +1,305 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodMultipleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ fooProvider2.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "MObjectMultipleCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "MRefMultipleCheckServiceProvider").createComponentInstance(i4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "MBothMultipleCheckServiceProvider").createComponentInstance(i5);
+ } catch(Exception e) { fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation - 1", ((Integer)props.get("bothU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 2", ((Integer)props.get("bothB")).intValue(), 2);
+ assertEquals("check both unbind callback invocation - 2", ((Integer)props.get("bothU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 3", ((Integer)props.get("bothB")).intValue(), 2);
+ assertEquals("check both unbind callback invocation - 3", ((Integer)props.get("bothU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodOptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodOptionalDependencies.java
new file mode 100644
index 0000000..e7e075f
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodOptionalDependencies.java
@@ -0,0 +1,266 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodOptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "MObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "MRefOptionalCheckServiceProvider").createComponentInstance(i4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "MBothOptionalCheckServiceProvider").createComponentInstance(i5);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testObject() {
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+
+ Properties props = cs.getProps();
+
+ // Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -3", ((Integer) props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation -3", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -3", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -3", ((Integer) props.get("refU")).intValue(), 1);
+ assertEquals("check both bind callback invocation -3", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -3", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -3", ((Integer) props.get("bothU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodOptionalMultipleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodOptionalMultipleDependencies.java
new file mode 100644
index 0000000..fa571eb
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodOptionalMultipleDependencies.java
@@ -0,0 +1,279 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodOptionalMultipleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ fooProvider2.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "MObjectOptionalMultipleCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "MRefOptionalMultipleCheckServiceProvider").createComponentInstance(i4);
+ } catch(Exception e) { fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance3 = null;
+ instance4 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 2);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 2);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodSimpleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodSimpleDependencies.java
new file mode 100644
index 0000000..bf314a4
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MethodSimpleDependencies.java
@@ -0,0 +1,184 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodSimpleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "MObjectCheckServiceProvider").createComponentInstance(i3);
+ assertNotNull("check instance 3", instance3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "MRefCheckServiceProvider").createComponentInstance(i4);
+ assertNotNull("check instance 4", instance4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "MBothCheckServiceProvider").createComponentInstance(i5);
+ assertNotNull("check instance 5", instance5);
+ } catch(Exception e) { fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MultipleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MultipleDependencies.java
new file mode 100644
index 0000000..aaa401c
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MultipleDependencies.java
@@ -0,0 +1,385 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MultipleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ fooProvider2.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "SimpleMultipleCheckServiceProvider").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "VoidMultipleCheckServiceProvider").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "ObjectMultipleCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "RefMultipleCheckServiceProvider").createComponentInstance(i4);
+ } catch(Exception e) { fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testSimple() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testVoid() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 1);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MultipleFilterDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MultipleFilterDependencies.java
new file mode 100644
index 0000000..8c55bb1
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/MultipleFilterDependencies.java
@@ -0,0 +1,570 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MultipleFilterDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceProvider").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ prov = new Properties();
+ prov.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceProvider").createComponentInstance(prov);
+ fooProvider2.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Subscriber1");
+ instance1 = Utils.getFactoryByName(context, "MultipleFilterCheckServiceSubscriber").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Subscriber2");
+ Properties ii2 = new Properties();
+ ii2.put("id2", "(toto=A)");
+ i2.put("requires.filters", ii2);
+ instance2 = Utils.getFactoryByName(context, "MultipleFilterCheckServiceSubscriber2").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Subscriber3");
+ Properties ii3 = new Properties();
+ ii3.put("id1", "(toto=A)");
+ i3.put("requires.filters", ii3);
+ instance3 = Utils.getFactoryByName(context, "MultipleFilterCheckServiceSubscriber").createComponentInstance(i3);
+
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testMultipleNotMatch() {
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 3", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ fooProvider2.start();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+ CheckService cs2 = (CheckService) context.getService(cs_ref2);
+ // change the value of the property toto
+ cs2.check();
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 6", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 7", id.getState() == ComponentInstance.INVALID);
+
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 8", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service Binding - 8", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 8", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 9", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ cs2 = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleMatch() {
+
+ fooProvider1.start();
+ fooProvider2.start();
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+ CheckService cs2 = (CheckService) context.getService(cs_ref2);
+ // change the value of the property toto
+ cs2.check();
+
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 2", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 3", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ id = null;
+ cs = null;
+ cs2 = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleNotMatchInstance() {
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+
+ fooProvider1.start();
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.start();
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+ CheckService cs2 = (CheckService) context.getService(cs_ref2);
+ // change the value of the property toto
+ cs2.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ // change the value of the property toto
+ cs2.check();
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 6", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 7", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 8", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 8", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 8", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 9", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ cs2 = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleMatchInstance() {
+
+ fooProvider1.start();
+ fooProvider2.start();
+ instance3.start();
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 2", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 3", id.getState() == ComponentInstance.INVALID);
+
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleNotMatchInstanceWithoutFilter() {
+ instance2.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+
+ fooProvider1.start();
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.start();
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+ CheckService cs2 = (CheckService) context.getService(cs_ref2);
+ // change the value of the property toto
+ cs2.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ // change the value of the property toto
+ cs2.check();
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 6", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 7", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 8", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 8", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 8", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 9", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ cs2 = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleMatchInstanceWithoutFilter() {
+ fooProvider1.start();
+ fooProvider2.start();
+ instance2.start();
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 2", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 3", id.getState() == ComponentInstance.INVALID);
+
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalDependencies.java
new file mode 100644
index 0000000..773ea6c
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalDependencies.java
@@ -0,0 +1,386 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4, instance5;
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "SimpleOptionalCheckServiceProvider").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "VoidOptionalCheckServiceProvider").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "ObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "RefOptionalCheckServiceProvider").createComponentInstance(i4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "BothOptionalCheckServiceProvider").createComponentInstance(i5);
+ } catch(Exception e) { fail(e.getMessage()); }
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testSimple() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ //Check properties
+ assertFalse("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 1 ("+props.get("object")+")", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, a provider is there
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testVoid() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 1", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation -3 ("+((Integer)props.get("voidU")) + ")", ((Integer)props.get("voidU")).intValue(), 1);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 3", props.get("object"));
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2 (" + ((Integer)props.get("objectB")).intValue() + ")", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue()); // Nullable object.
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -2", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -3", ((Integer)props.get("bothU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalMultipleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalMultipleDependencies.java
new file mode 100644
index 0000000..91e222d
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalMultipleDependencies.java
@@ -0,0 +1,499 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalMultipleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ fooProvider2.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "SimpleOptionalMultipleCheckServiceProvider").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "VoidOptionalMultipleCheckServiceProvider").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "ObjectOptionalMultipleCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "RefOptionalMultipleCheckServiceProvider").createComponentInstance(i4);
+ } catch(Exception e) { fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testSimple() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, it still one provider.
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 4", ((Boolean)props.get("result")).booleanValue()); // False, no more provider.
+ assertEquals("check void bind invocation - 4", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 4", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 4", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 4", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 4", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 4", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 4", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 4", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 4", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testVoid() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 1);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 4", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 4", ((Integer)props.get("voidB")).intValue(), 2);
+ assertEquals("check void unbind callback invocation - 4", ((Integer)props.get("voidU")).intValue(), 2);
+ assertEquals("check object bind callback invocation - 4", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 4", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 4", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 4", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 4", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 4", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 4", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 2);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 2);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 2);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 2);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 2.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 3", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 3", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 3", ((Integer)props.get("refU")).intValue(), 1);
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 0", ((Boolean)props.get("result")).booleanValue()); // False : no provider
+ assertEquals("check void bind invocation - 0", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 0", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 0", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 0", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 0", ((Integer)props.get("refB")).intValue(), 2);
+ assertEquals("check ref unbind callback invocation - 0", ((Integer)props.get("refU")).intValue(), 2);
+ assertEquals("Check FS invocation (int) - 0", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 0", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 0", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalMultipleFilterDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalMultipleFilterDependencies.java
new file mode 100644
index 0000000..5d0ae74
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalMultipleFilterDependencies.java
@@ -0,0 +1,592 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalMultipleFilterDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceProvider").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ prov = new Properties();
+ prov.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceProvider").createComponentInstance(prov);
+ fooProvider2.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Subscriber1");
+ instance1 = Utils.getFactoryByName(context, "OptionalMultipleFilterCheckServiceSubscriber").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Subscriber2");
+ Properties ii2 = new Properties();
+ ii2.put("id2", "(toto=A)");
+ i2.put("requires.filters", ii2);
+ instance2 = Utils.getFactoryByName(context, "OptionalMultipleFilterCheckServiceSubscriber2").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Subscriber3");
+ Properties ii3 = new Properties();
+ ii3.put("id1", "(toto=A)");
+ i3.put("requires.filters", ii3);
+ instance3 = Utils.getFactoryByName(context, "OptionalMultipleFilterCheckServiceSubscriber").createComponentInstance(i3);
+
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testMultipleNotMatch() {
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 2", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 3", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ fooProvider2.start();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+ CheckService cs2 = (CheckService) context.getService(cs_ref2);
+ // change the value of the property toto
+ cs2.check();
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 6", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 7", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 7", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 7", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 8", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 8", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 8", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 9", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 9", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 9", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ id = null;
+ cs = null;
+ cs2 = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleMatch() {
+
+ fooProvider1.start();
+ fooProvider2.start();
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+ CheckService cs2 = (CheckService) context.getService(cs_ref2);
+ // change the value of the property toto
+ cs2.check();
+
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 2", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 3", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ id = null;
+ cs = null;
+ cs2 = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleNotMatchInstance() {
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ fooProvider1.start();
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 2", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 3", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ fooProvider2.start();
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+ CheckService cs2 = (CheckService) context.getService(cs_ref2);
+ // change the value of the property toto
+ cs2.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ // change the value of the property toto
+ cs2.check();
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 6", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 7", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 7", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 7", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 8", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 8", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 8", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 9", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 9", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 9", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ id = null;
+ cs = null;
+ cs2 = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleMatchInstance() {
+
+ fooProvider1.start();
+ fooProvider2.start();
+ instance3.start();
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 2", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 3", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleNotMatchInstanceWithoutFilter() {
+ instance2.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ fooProvider1.start();
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 2", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 3", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ fooProvider2.start();
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+ CheckService cs2 = (CheckService) context.getService(cs_ref2);
+ // change the value of the property toto
+ cs2.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+
+ // change the value of the property toto
+ cs2.check();
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 6", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 7", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 7", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 7", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 8", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 8", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 8", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 9", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 9", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 9", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ id = null;
+ cs = null;
+ cs2 = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+ public void testMultipleMatchInstanceWithoutFilter() {
+
+
+ fooProvider1.start();
+ fooProvider2.start();
+ instance2.start();
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+
+ ServiceReference cs_ref2 = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref2);
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 1", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 2", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ fooProvider2.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Array size - 3", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(0)));
+
+ fooProvider2.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertTrue("Check Array size - 4", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(1)));
+
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(2)));
+ assertTrue("Check Array size - 5", ((Integer)cs_instance.getProps().get("Size")).equals(new Integer(2)));
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ context.ungetService(cs_ref2);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalSimpleFilterDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalSimpleFilterDependencies.java
new file mode 100644
index 0000000..061d08e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/OptionalSimpleFilterDependencies.java
@@ -0,0 +1,558 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalSimpleFilterDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceProvider").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ prov = new Properties();
+ prov.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceProvider").createComponentInstance(prov);
+ fooProvider2.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Subscriber1");
+ instance1 = Utils.getFactoryByName(context, "OptionalSimpleFilterCheckServiceSubscriber").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Subscriber2");
+ Properties ii2 = new Properties();
+ ii2.put("id2", "(toto=A)");
+ i2.put("requires.filters", ii2);
+ instance2 = Utils.getFactoryByName(context, "OptionalSimpleFilterCheckServiceSubscriber2").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Subscriber3");
+ Properties ii3 = new Properties();
+ ii3.put("id1", "(toto=A)");
+ i3.put("requires.filters", ii3);
+ instance3 = Utils.getFactoryByName(context, "OptionalSimpleFilterCheckServiceSubscriber").createComponentInstance(i3);
+
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testSimpleNotMatch() {
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 1", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 2", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertFalse("Check Nullable - 3", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 4", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 5", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 6", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+ assertTrue("Check service Binding - 7", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 7", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service Binding - 8", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 8", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleMatch() {
+
+ fooProvider1.start();
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 1", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 2", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 3", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 4", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 5", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 6", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleNotMatchInstance() {
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 1", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.start();
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 2", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 3", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 4", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 5", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 6", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 7", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 7", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 7", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 8", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 8", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 8", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleMatchInstance() {
+
+ fooProvider1.start();
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 1", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 2", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 3", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 4", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 5", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 6", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleNotMatchInstanceWithoutFilter() {
+ instance2.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 1", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.start();
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 2", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 3", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 4", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 5", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 6", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 7", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 7", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 7", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 8", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 8", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 8", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleMatchInstanceWithoutFilter() {
+
+ fooProvider1.start();
+ instance2.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 1", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 1", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 2", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 2", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 3", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 3", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 4", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 4", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 4", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 5", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(1)));
+ assertFalse("Check Nullable - 5", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 6", id.getState() == ComponentInstance.VALID);
+ assertTrue("Check service invocation", cs_instance.check());
+ assertTrue("Check service Binding - 6", ((Integer)cs_instance.getProps().get("Bind")).equals(new Integer(0)));
+ assertTrue("Check Nullable - 6", ((Boolean)cs_instance.getProps().get("Nullable")).booleanValue());
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/SimpleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/SimpleDependencies.java
new file mode 100644
index 0000000..ad02a8f
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/SimpleDependencies.java
@@ -0,0 +1,319 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class SimpleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4, instance5, instance6;
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "SimpleCheckServiceProvider").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "VoidCheckServiceProvider").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "ObjectCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "RefCheckServiceProvider").createComponentInstance(i4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "BothCheckServiceProvider").createComponentInstance(i5);
+
+ Properties i6 = new Properties();
+ i6.put("name", "Double");
+ instance6 = Utils.getFactoryByName(context, "DoubleCheckServiceProvider").createComponentInstance(i6);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ instance6.dispose();
+ fooProvider.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ instance6 = null;
+ fooProvider = null;
+ }
+
+ public void testSimple() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testVoid() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ Object o = context.getService(cs_ref);
+ CheckService cs = (CheckService) o;
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1 ("+((Integer)props.get("voidB")).intValue()+")", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testDouble() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance6.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance6.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertNotNull("Check cs", cs);
+ cs.check();
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/SimpleFilterDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/SimpleFilterDependencies.java
new file mode 100644
index 0000000..c6a2333
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/SimpleFilterDependencies.java
@@ -0,0 +1,498 @@
+/*
+ * 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.test.scenarios.dependency;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class SimpleFilterDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceProvider").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ prov = new Properties();
+ prov.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceProvider").createComponentInstance(prov);
+ fooProvider2.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Subscriber1");
+ instance1 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceSubscriber").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Subscriber2");
+ Properties ii2 = new Properties();
+ ii2.put("id2", "(toto=A)");
+ i2.put("requires.filters", ii2);
+ instance2 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceSubscriber2").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Subscriber3");
+ Properties ii3 = new Properties();
+ ii3.put("id1", "(toto=A)");
+ i3.put("requires.filters", ii3);
+ instance3 = Utils.getFactoryByName(context, "SimpleFilterCheckServiceSubscriber").createComponentInstance(i3);
+
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testSimpleNotMatch() {
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 3", id.getState() == ComponentInstance.INVALID);
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 4", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleMatch() {
+
+ fooProvider1.start();
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 3", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleNotMatchInstance() {
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 3", id.getState() == ComponentInstance.INVALID);
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 4", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleMatchInstance() {
+
+ fooProvider1.start();
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 3", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleNotMatchInstanceWithoutFilter() {
+ instance2.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 3", id.getState() == ComponentInstance.INVALID);
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 4", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testSimpleMatchInstanceWithoutFilter() {
+
+ fooProvider1.start();
+ instance2.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ CheckService cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("Check service invocation", cs_instance.check());
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), fooProvider1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ // change the value of the property toto
+ cs.check();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider1.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs_instance_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_instance_ref);
+ cs_instance = (CheckService) context.getService(cs_instance_ref);
+ assertTrue("check CheckService invocation", cs_instance.check());
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 3", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ cs_instance = null;
+ context.ungetService(cs_instance_ref);
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/DefaultImplementationTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/DefaultImplementationTestSuite.java
new file mode 100644
index 0000000..fa045d7
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/DefaultImplementationTestSuite.java
@@ -0,0 +1,37 @@
+/*
+ * 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.test.scenarios.dependency.di;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class DefaultImplementationTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Default Implementation Test Suite", bc);
+ ots.addTestSuite( OptionalDependencies.class);
+ ots.addTestSuite( MethodOptionalDependencies.class);
+ ots.addTestSuite( DelayedOptionalDependencies.class);
+ ots.addTestSuite( MethodDelayedOptionalDependencies.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/DelayedOptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/DelayedOptionalDependencies.java
new file mode 100644
index 0000000..29a3efe
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/DelayedOptionalDependencies.java
@@ -0,0 +1,353 @@
+/*
+ * 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.test.scenarios.dependency.di;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class DelayedOptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4, instance5;
+
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "DISimpleOptionalCheckServiceProvider").createComponentInstance(i1);
+ instance1.stop();
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "DIVoidOptionalCheckServiceProvider").createComponentInstance(i2);
+ instance2.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "DIObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "DIRefOptionalCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "DIBothOptionalCheckServiceProvider").createComponentInstance(i5);
+ instance5.stop();
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testSimple() {
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ // Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 1", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation - 2", ((Boolean) props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer) props.get("int")).intValue(), 5);
+ assertEquals("Check FS invocation (long) - 2", ((Long) props.get("long")).longValue(), 5);
+ assertEquals("Check FS invocation (double) - 2", ((Double) props.get("double")).doubleValue(), 5.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance1.stop();
+ }
+
+ public void testVoid() {
+ instance2.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation - 1", ((Integer) props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation - 1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 1", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 1);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer) props.get("int")).intValue(), 5);
+ assertEquals("Check FS invocation (long) - 2", ((Long) props.get("long")).longValue(), 5);
+ assertEquals("Check FS invocation (double) - 2", ((Double) props.get("double")).doubleValue(), 5.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance2.stop();
+ }
+
+ public void testObject() {
+ instance3.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 1);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+ public void testBoth() {
+ instance5.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 1", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation - 1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation - 2", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation - 2", ((Integer) props.get("bothU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/MethodDelayedOptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/MethodDelayedOptionalDependencies.java
new file mode 100644
index 0000000..4d404c7
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/MethodDelayedOptionalDependencies.java
@@ -0,0 +1,225 @@
+/*
+ * 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.test.scenarios.dependency.di;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodDelayedOptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "DIMObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+ instance3.stop();
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "DIMRefOptionalCheckServiceProvider").createComponentInstance(i4);
+ instance4.stop();
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "DIMBothOptionalCheckServiceProvider").createComponentInstance(i5);
+ instance5.stop();
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testObject() {
+ instance3.start();
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance3.stop();
+ }
+
+ public void testRef() {
+ instance4.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 1);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+ public void testBoth() {
+ instance5.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+
+ instance4.stop();
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/MethodOptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/MethodOptionalDependencies.java
new file mode 100644
index 0000000..2713fbe
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/MethodOptionalDependencies.java
@@ -0,0 +1,266 @@
+/*
+ * 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.test.scenarios.dependency.di;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodOptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "DIMObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "DIMRefOptionalCheckServiceProvider").createComponentInstance(i4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "DIMBothOptionalCheckServiceProvider").createComponentInstance(i5);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testObject() {
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+
+ Properties props = cs.getProps();
+
+ // Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -3", ((Integer) props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation -3", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -3", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -3", ((Integer) props.get("refU")).intValue(), 1);
+ assertEquals("check both bind callback invocation -3", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -3", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer) props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -3", ((Integer) props.get("bothU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/OptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/OptionalDependencies.java
new file mode 100644
index 0000000..1a1d359
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/di/OptionalDependencies.java
@@ -0,0 +1,386 @@
+/*
+ * 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.test.scenarios.dependency.di;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4, instance5;
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "DISimpleOptionalCheckServiceProvider").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "DIVoidOptionalCheckServiceProvider").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "DIObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "DIRefOptionalCheckServiceProvider").createComponentInstance(i4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "DIBothOptionalCheckServiceProvider").createComponentInstance(i5);
+ } catch(Exception e) { fail(e.getMessage()); }
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testSimple() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ //Check properties
+ assertFalse("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 1", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 5);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 5);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 5.0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, a provider is there
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testVoid() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 1", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 5);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 5);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 5.0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation -3 ("+((Integer)props.get("voidU")) + ")", ((Integer)props.get("voidU")).intValue(), 1);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 3", props.get("object"));
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 5);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 5);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 5.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2 (" + ((Integer)props.get("objectB")).intValue() + ")", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 1);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -2", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -3", ((Integer)props.get("bothU")).intValue(), 1);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/MethodOptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/MethodOptionalDependencies.java
new file mode 100644
index 0000000..310f131
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/MethodOptionalDependencies.java
@@ -0,0 +1,266 @@
+/*
+ * 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.test.scenarios.dependency.statics;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodOptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "StaticMObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "StaticMRefOptionalCheckServiceProvider").createComponentInstance(i4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "StaticMBothOptionalCheckServiceProvider").createComponentInstance(i5);
+ } catch (Exception e) {
+ fail(e.getMessage());
+ }
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testObject() {
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+
+ Properties props = cs.getProps();
+
+ // Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -3", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -3", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean) props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer) props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean) props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer) props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -3", ((Integer) props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/MethodSimpleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/MethodSimpleDependencies.java
new file mode 100644
index 0000000..70fef81
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/MethodSimpleDependencies.java
@@ -0,0 +1,184 @@
+/*
+ * 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.test.scenarios.dependency.statics;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MethodSimpleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance3, instance4, instance5;
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "StaticMObjectCheckServiceProvider").createComponentInstance(i3);
+ assertNotNull("check instance 3", instance3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "StaticMRefCheckServiceProvider").createComponentInstance(i4);
+ assertNotNull("check instance 4", instance4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "StaticMBothCheckServiceProvider").createComponentInstance(i5);
+ assertNotNull("check instance 5", instance5);
+ } catch(Exception e) { fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/MultipleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/MultipleDependencies.java
new file mode 100644
index 0000000..251adc7
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/MultipleDependencies.java
@@ -0,0 +1,307 @@
+/*
+ * 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.test.scenarios.dependency.statics;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class MultipleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4;
+ ComponentInstance fooProvider1, fooProvider2;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider1");
+ fooProvider1 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider1.stop();
+
+ Properties prov2 = new Properties();
+ prov2.put("name", "FooProvider2");
+ fooProvider2 = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov2);
+ fooProvider2.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "StaticSimpleMultipleCheckServiceProvider").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "StaticVoidMultipleCheckServiceProvider").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "StaticObjectMultipleCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "StaticRefMultipleCheckServiceProvider").createComponentInstance(i4);
+ } catch(Exception e) { fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ fooProvider1.dispose();
+ fooProvider2.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ fooProvider1 = null;
+ fooProvider2 = null;
+ }
+
+ public void testSimple() {
+ instance1.stop();
+ fooProvider1.start();
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testVoid() {
+ instance2.stop();
+ fooProvider1.start();
+ instance2.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ // Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean) props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer) props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation - 1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean) props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer) props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation - 2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testObject() {
+ instance3.stop();
+ fooProvider1.start();
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ // Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean) props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation - 1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ // Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean) props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer) props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation - 2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer) props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testRef() {
+ instance4.stop();
+ fooProvider1.start();
+ instance4.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ //Check properties
+ assertTrue("check CheckService invocation - 1", ((Boolean) props.get("result")).booleanValue()); // True, a provider is here
+ assertEquals("check void bind invocation - 1", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 1", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 1", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 1", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider2.start();
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean) props.get("result")).booleanValue()); // True, two providers are here
+ assertEquals("check void bind invocation - 2", ((Integer) props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer) props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer) props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer) props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer) props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer) props.get("refU")).intValue(), 0);
+ assertEquals("Check FS invocation (int) - 2", ((Integer) props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long) props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double) props.get("double")).doubleValue(), 1.0);
+
+ fooProvider1.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 5", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/OptionalDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/OptionalDependencies.java
new file mode 100644
index 0000000..601cd08
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/OptionalDependencies.java
@@ -0,0 +1,506 @@
+/*
+ * 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.test.scenarios.dependency.statics;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.MissingHandlerException;
+import org.apache.felix.ipojo.UnacceptableConfiguration;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class OptionalDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4, instance5;
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "StaticSimpleOptionalCheckServiceProvider").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "StaticVoidOptionalCheckServiceProvider").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "StaticObjectOptionalCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "StaticRefOptionalCheckServiceProvider").createComponentInstance(i4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "StaticBothOptionalCheckServiceProvider").createComponentInstance(i5);
+ } catch(Exception e) { fail(e.getMessage()); }
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void atestSimple() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ //Check properties
+ assertFalse("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 1", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+
+ //Check properties
+ assertFalse("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // False, the provider was not bound
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void atestDelayedSimple() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ instance1.stop();
+ fooProvider.start();
+ instance1.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, the provider was bound
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.INVALID); // Dependency broken
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void atestVoid() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation - 1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation - 1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 1", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 1", props.get("object"));
+ assertEquals("Check FS invocation (int) - 1", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 1", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 1", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3 ("+((Integer)props.get("voidU")) + ")", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+ assertNull("Check FS invocation (object) - 3", props.get("object"));
+ assertEquals("Check FS invocation (int) - 3", ((Integer)props.get("int")).intValue(), 0);
+ assertEquals("Check FS invocation (long) - 3", ((Long)props.get("long")).longValue(), 0);
+ assertEquals("Check FS invocation (double) - 3", ((Double)props.get("double")).doubleValue(), 0.0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void testDelayedVoid() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ instance2.stop();
+ fooProvider.start();
+ instance2.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, the provider was bound
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3 (" + id.getState() + ")", id.getState() == ComponentInstance.INVALID); // Dependency broken
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void atestObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2 (" + ((Integer)props.get("objectB")).intValue() + ")", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void atestDelayedObject() throws UnacceptableConfiguration, MissingHandlerException, ConfigurationException {
+ instance3.stop();
+ fooProvider.start();
+ instance3.start();
+
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+
+ //Check properties
+ assertTrue("check CheckService invocation - 2", ((Boolean)props.get("result")).booleanValue()); // True, the provider was bound
+ assertEquals("check void bind invocation - 2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation - 2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation - 2", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation - 2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation - 2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation - 2", ((Integer)props.get("refU")).intValue(), 0);
+ assertNotNull("Check FS invocation (object) - 2", props.get("object"));
+ assertEquals("Check FS invocation (int) - 2", ((Integer)props.get("int")).intValue(), 1);
+ assertEquals("Check FS invocation (long) - 2", ((Long)props.get("long")).longValue(), 1);
+ assertEquals("Check FS invocation (double) - 2", ((Double)props.get("double")).doubleValue(), 1.0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.INVALID); // Dependency broken
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void atestRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+ public void atestBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue()); // False is returned (nullable)
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -2", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -2", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -2", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -2", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -2", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -2", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -2", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -2", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -2", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 3 (" + id.getState() + ")", id.getState() == ComponentInstance.VALID);
+
+ cs = (CheckService) context.getService(cs_ref);
+ props = cs.getProps();
+ //Check properties
+ assertFalse("check CheckService invocation -3", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -3", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -3", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -3", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -3", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -3", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -3", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -3", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -3", ((Integer)props.get("bothU")).intValue(), 0);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/SimpleDependencies.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/SimpleDependencies.java
new file mode 100644
index 0000000..8623784
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/SimpleDependencies.java
@@ -0,0 +1,319 @@
+/*
+ * 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.test.scenarios.dependency.statics;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class SimpleDependencies extends OSGiTestCase {
+
+ ComponentInstance instance1, instance2, instance3, instance4, instance5;
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ try {
+ Properties prov = new Properties();
+ prov.put("name", "FooProvider");
+ fooProvider = Utils.getFactoryByName(context, "FooProviderType-1").createComponentInstance(prov);
+ fooProvider.stop();
+
+ Properties i1 = new Properties();
+ i1.put("name", "Simple");
+ instance1 = Utils.getFactoryByName(context, "StaticSimpleCheckServiceProvider").createComponentInstance(i1);
+
+ Properties i2 = new Properties();
+ i2.put("name", "Void");
+ instance2 = Utils.getFactoryByName(context, "StaticVoidCheckServiceProvider").createComponentInstance(i2);
+
+ Properties i3 = new Properties();
+ i3.put("name", "Object");
+ instance3 = Utils.getFactoryByName(context, "StaticObjectCheckServiceProvider").createComponentInstance(i3);
+
+ Properties i4 = new Properties();
+ i4.put("name", "Ref");
+ instance4 = Utils.getFactoryByName(context, "StaticRefCheckServiceProvider").createComponentInstance(i4);
+
+ Properties i5 = new Properties();
+ i5.put("name", "Both");
+ instance5 = Utils.getFactoryByName(context, "StaticBothCheckServiceProvider").createComponentInstance(i5);
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail(e.getMessage()); }
+
+ }
+
+ public void tearDown() {
+ instance1.dispose();
+ instance2.dispose();
+ instance3.dispose();
+ instance4.dispose();
+ instance5.dispose();
+ fooProvider.dispose();
+ instance1 = null;
+ instance2 = null;
+ instance3 = null;
+ instance4 = null;
+ instance5 = null;
+ fooProvider = null;
+ }
+
+ public void testSimple() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.INVALID);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance1.getInstanceName());
+ assertNull("Check CheckService availability", cs_ref);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ }
+
+ public void testVoid() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ Object o = context.getService(cs_ref);
+ CheckService cs = (CheckService) o;
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1 ("+((Integer)props.get("voidB")).intValue()+")", ((Integer)props.get("voidB")).intValue(), 1);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.INVALID);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance2.getInstanceName());
+ assertNull("Check CheckService availability - 2", cs_ref);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ }
+
+ public void testObject() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 1);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.INVALID);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance3.getInstanceName());
+ assertNull("Check CheckService availability - 2", cs_ref);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ }
+
+ public void testRef() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 1);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 0);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.INVALID);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance4.getInstanceName());
+ assertNull("Check CheckService availability - 2", cs_ref);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ }
+
+ public void testBoth() {
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity", id.getState() == ComponentInstance.VALID);
+
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ Properties props = cs.getProps();
+ //Check properties
+ assertTrue("check CheckService invocation -1", ((Boolean)props.get("result")).booleanValue());
+ assertEquals("check void bind invocation -1", ((Integer)props.get("voidB")).intValue(), 0);
+ assertEquals("check void unbind callback invocation -1", ((Integer)props.get("voidU")).intValue(), 0);
+ assertEquals("check object bind callback invocation -1", ((Integer)props.get("objectB")).intValue(), 0);
+ assertEquals("check object unbind callback invocation -1", ((Integer)props.get("objectU")).intValue(), 0);
+ assertEquals("check ref bind callback invocation -1", ((Integer)props.get("refB")).intValue(), 0);
+ assertEquals("check ref unbind callback invocation -1", ((Integer)props.get("refU")).intValue(), 0);
+ assertEquals("check both bind callback invocation -1", ((Integer)props.get("bothB")).intValue(), 1);
+ assertEquals("check both unbind callback invocation -1", ((Integer)props.get("bothU")).intValue(), 0);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id.getState() == ComponentInstance.INVALID);
+
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance5.getInstanceName());
+ assertNull("Check CheckService availability - 2", cs_ref);
+
+ fooProvider.stop();
+
+ id = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id.getState() == ComponentInstance.INVALID);
+
+ id = null;
+ cs = null;
+ context.ungetService(arch_ref);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/StaticDependencyTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/StaticDependencyTestSuite.java
new file mode 100644
index 0000000..656c635
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/dependency/statics/StaticDependencyTestSuite.java
@@ -0,0 +1,38 @@
+/*
+ * 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.test.scenarios.dependency.statics;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class StaticDependencyTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Static Dependency Test Suite", bc);
+ ots.addTestSuite( SimpleDependencies.class);
+ ots.addTestSuite( OptionalDependencies.class);
+ ots.addTestSuite( MultipleDependencies.class);
+ ots.addTestSuite( MethodSimpleDependencies.class);
+ ots.addTestSuite( MethodOptionalDependencies.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/ConfigAdminTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/ConfigAdminTest.java
new file mode 100644
index 0000000..34f5b5d
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/ConfigAdminTest.java
@@ -0,0 +1,143 @@
+/*
+ * 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.test.scenarios.factory;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+public class ConfigAdminTest extends OSGiTestCase {
+
+ private ManagedServiceFactory getFactoryByName(String pid) {
+ ServiceReference[] refs;
+ try {
+ refs = context.getServiceReferences(ManagedServiceFactory.class.getName(), "(service.pid="+pid+")");
+ if(refs == null) { return null; }
+ return ((org.osgi.service.cm.ManagedServiceFactory) context.getService(refs[0]));
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Cannot get the factory " + pid + " : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public void testCreation() {
+ ManagedServiceFactory f = getFactoryByName("FooProviderType-2");
+
+ Properties p = new Properties();
+ p.put("int", new Integer(3));
+ p.put("long", new Long(42));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+
+ try {
+ f.updated("ok2", p);
+ ServiceReference ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "ok2");
+ assertNotNull("Check instance creation", ref);
+ f.deleted("ok2");
+ ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "ok2");
+ assertNull("Check instance deletion", ref);
+ } catch (ConfigurationException e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testCreationString() {
+ ManagedServiceFactory f = getFactoryByName("FooProviderType-2");
+
+ Properties p = new Properties();
+ p.put("int", "3");
+ p.put("long", "42");
+ p.put("string", "absdir");
+ p.put("strAProp", "{a}");
+ p.put("intAProp", "{1,2}");
+
+ try {
+ f.updated("ok2", p);
+ ServiceReference ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "ok2");
+ assertNotNull("Check instance creation", ref);
+ f.deleted("ok2");
+ ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "ok2");
+ assertNull("Check instance deletion", ref);
+ } catch (ConfigurationException e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testUpdate() {
+ ManagedServiceFactory f = getFactoryByName("FooProviderType-2");
+
+ Properties p = new Properties();
+ p.put("int", new Integer(3));
+ p.put("long", new Long(42));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+
+ try {
+ f.updated("okkkk", p);
+ ServiceReference ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "okkkk");
+ assertNotNull("Check instance creation", ref);
+ p.put("int", new Integer("4"));
+ f.updated("okkkk", p);
+ ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "okkkk");
+ Integer test = (Integer) ref.getProperty("int");
+ assertEquals("Check instance modification", 4, test.intValue());
+ f.deleted("okkkk");
+ ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "okkkk");
+ assertNull("Check instance deletion", ref);
+ } catch (ConfigurationException e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testUpdateString() {
+ ManagedServiceFactory f = getFactoryByName("FooProviderType-2");
+
+ Properties p = new Properties();
+ p.put("int", "3");
+ p.put("long", "42");
+ p.put("string", "absdir");
+ p.put("strAProp", "{a}");
+ p.put("intAProp", "{1,2}");
+
+ try {
+ f.updated("okkkk", p);
+ ServiceReference ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "okkkk");
+ assertNotNull("Check instance creation", ref);
+ p.put("int", new Integer("4"));
+ f.updated("okkkk", p);
+ ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "okkkk");
+ Integer test = (Integer) ref.getProperty("int");
+ assertEquals("Check instance modification", 4, test.intValue());
+ f.deleted("okkkk");
+ ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), "okkkk");
+ assertNull("Check instance deletion", ref);
+ } catch (ConfigurationException e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/FactoryTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/FactoryTestSuite.java
new file mode 100644
index 0000000..4c45c4c
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/FactoryTestSuite.java
@@ -0,0 +1,38 @@
+/*
+ * 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.test.scenarios.factory;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class FactoryTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Factories Test Suite", bc);
+
+ ots.addTestSuite( UnacceptableConfigurationTest.class);
+ ots.addTestSuite( ConfigAdminTest.class);
+ ots.addTestSuite( ObedienceTest.class);
+
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/ObedienceTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/ObedienceTest.java
new file mode 100644
index 0000000..da818e4
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/ObedienceTest.java
@@ -0,0 +1,66 @@
+/*
+ * 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.test.scenarios.factory;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentFactory;
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+
+public class ObedienceTest extends OSGiTestCase {
+
+ public void testObedience1() {
+ assertNull("Check no foo service", context.getServiceReference(FooService.class.getName()));
+ ComponentFactory factory = (ComponentFactory) Utils.getFactoryByName(context, "FooProviderType-1");
+ assertNotNull("Check factory existing", factory);
+
+ Properties props1 = new Properties();
+ props1.put("name", "foo1");
+ Properties props2 = new Properties();
+ props2.put("name", "foo2");
+
+ ComponentInstance ci1 = null, ci2 = null;
+ try {
+ ci1 = factory.createComponentInstance(props1);
+ ci2 = factory.createComponentInstance(props2);
+ } catch(Exception e) {
+ fail("Cannot instantiate foo providers : " + e.getMessage());
+ }
+
+ assertTrue("Check foo1 validity", ci1.getState() == ComponentInstance.VALID);
+ assertTrue("Check foo2 validity", ci2.getState() == ComponentInstance.VALID);
+
+ assertNotNull("Check foo service", context.getServiceReference(FooService.class.getName()));
+ assertEquals("Check the number of Foo", Utils.getServiceReferences(context, FooService.class.getName(), null).length, 2);
+
+ factory.stop();
+
+ assertTrue("Check foo1 invalidity ("+ci1.getState()+")", ci1.getState() == ComponentInstance.DISPOSED);
+ assertTrue("Check foo2 invalidity ("+ci1.getState()+")", ci2.getState() == ComponentInstance.DISPOSED);
+
+ assertNull("Check no foo service", context.getServiceReference(FooService.class.getName()));
+
+ factory.start();
+ assertNull("Check no foo service", context.getServiceReference(FooService.class.getName()));
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/UnacceptableConfigurationTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/UnacceptableConfigurationTest.java
new file mode 100644
index 0000000..797b5db
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/factory/UnacceptableConfigurationTest.java
@@ -0,0 +1,364 @@
+/*
+ * 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.test.scenarios.factory;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+
+public class UnacceptableConfigurationTest extends OSGiTestCase {
+
+ public void testWithoutName() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-2");
+
+ Properties p = new Properties();
+ p.put("int", new Integer(3));
+ p.put("long", new Long(42));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) { fail("an acceptable configuration is refused : " + e.getMessage()); }
+
+ }
+
+ public void testEmptyConfiguration() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-2");
+ Properties p = new Properties();
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) { fail("An acceptable configuration is refused"); }
+ }
+
+ public void testEmptyConfiguration2() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn2");
+ Properties p = new Properties();
+ p.put("name", "ko");
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) { return; }
+
+ fail("An unacceptable configuration is accepted");
+ }
+
+ public void testNull() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-2");
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(null);
+ ci.dispose();
+ } catch(Exception e) { fail("An acceptable configuration is refused"); }
+ }
+
+ public void testNull2() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn2");
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(null);
+ ci.dispose();
+ } catch(Exception e) { return; }
+
+ fail("An unacceptable configuration is accepted");
+ }
+
+ public void testStaticOK() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-2");
+
+ Properties p = new Properties();
+ p.put("name", "ok");
+ p.put("int", new Integer(3));
+ p.put("long", new Long(42));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testDynamicOK() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn");
+
+ Properties p = new Properties();
+ p.put("name", "ok");
+ p.put("int", new Integer(3));
+ p.put("boolean", new Boolean(true));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) {
+ e.printStackTrace();
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testDynamicBadType() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn");
+
+ Properties p = new Properties();
+ p.put("name", "ok");
+ p.put("int", new Integer(3));
+ p.put("long", new Long(42));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testDynamicComplete() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn2");
+
+ Properties p = new Properties();
+ p.put("name", "ok");
+ p.put("int", new Integer(3));
+ p.put("boolean", new Boolean(true));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testDynamicJustEnough() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn2");
+
+ Properties p = new Properties();
+ p.put("name", "ok");
+ p.put("boolean", new Boolean(true));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testDynamicMix() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn2");
+
+ Properties p = new Properties();
+ p.put("name", "ok");
+ p.put("boolean", new Boolean(true));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testDynamicUncomplete() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn2");
+
+ Properties p = new Properties();
+ p.put("name", "ok");
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) { return; }
+
+ fail("An unacceptable configuration is accepted");
+ }
+
+ public void testDynamicMore() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn2");
+
+ Properties p = new Properties();
+ p.put("name", "ok");
+ p.put("int", new Integer(3));
+ p.put("boolean", new Boolean(true));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+ p.put("tralala", "foo");
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testDoubleProps() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-Dyn2");
+
+ Properties p = new Properties();
+ p.put("name", "ok");
+ p.put("int", new Integer(3));
+ p.put("boolean", new Boolean(true));
+ p.put("string", "absdir");
+ p.put("strAProp", new String[] {"a"});
+ p.put("intAProp", new int[] {1,2});
+ p.put("boolean", new Boolean(false));
+ p.put("string", "toto");
+
+ ComponentInstance ci = null;
+ try {
+ ci = f.createComponentInstance(p);
+ ci.dispose();
+ } catch(Exception e) {
+ fail("An acceptable configuration is rejected : " + e.getMessage());
+ }
+ }
+
+ public void testUnicity1() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-2");
+
+ ComponentInstance ci1,ci2, ci3 = null;
+ try {
+ ci1 = f.createComponentInstance(null);
+ ci2 = f.createComponentInstance(null);
+ ci3 = f.createComponentInstance(null);
+ assertNotEquals("Check name ci1, ci2", ci1.getInstanceName(), ci2.getInstanceName());
+ assertNotEquals("Check name ci1, ci3", ci1.getInstanceName(), ci3.getInstanceName());
+ assertNotEquals("Check name ci3, ci2", ci3.getInstanceName(), ci2.getInstanceName());
+ ci1.dispose();
+ ci2.dispose();
+ ci3.dispose();
+ } catch(Exception e) { fail("An acceptable configuration is refused"); }
+ }
+
+ public void testUnicity2() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-2");
+
+ ComponentInstance ci1,ci2, ci3 = null;
+ try {
+ Properties p1 = new Properties();
+ p1.put("name", "name1");
+ ci1 = f.createComponentInstance(p1);
+ Properties p2 = new Properties();
+ p2.put("name", "name2");
+ ci2 = f.createComponentInstance(p2);
+ Properties p3 = new Properties();
+ p3.put("name", "name3");
+ ci3 = f.createComponentInstance(p3);
+ assertNotEquals("Check name ci1, ci2", ci1.getInstanceName(), ci2.getInstanceName());
+ assertNotEquals("Check name ci1, ci3", ci1.getInstanceName(), ci3.getInstanceName());
+ assertNotEquals("Check name ci3, ci2", ci3.getInstanceName(), ci2.getInstanceName());
+ ci1.dispose();
+ ci2.dispose();
+ ci3.dispose();
+ } catch(Exception e) { fail("An acceptable configuration is refused"); }
+ }
+
+ public void testUnicity3() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-2");
+
+ ComponentInstance ci1 = null,ci2 = null, ci3 = null;
+ try {
+ Properties p1 = new Properties();
+ p1.put("name", "name1");
+ ci1 = f.createComponentInstance(p1);
+ Properties p2 = new Properties();
+ p2.put("name", "name1");
+ ci2 = f.createComponentInstance(p2);
+ assertNotEquals("Check name ci1, ci2", ci1.getInstanceName(), ci2.getInstanceName());
+ assertNotEquals("Check name ci1, ci3", ci1.getInstanceName(), ci3.getInstanceName());
+ assertNotEquals("Check name ci3, ci2", ci3.getInstanceName(), ci3.getInstanceName());
+ ci1.dispose();
+ ci2.dispose();
+ ci3.dispose();
+ } catch(Exception e) {
+ ci1.dispose();
+ return; }
+
+ fail("An unacceptable configuration is acceptable");
+ }
+
+ public void testUnicity4() {
+ Factory f = Utils.getFactoryByName(context, "FooProviderType-2");
+ Factory f2 = Utils.getFactoryByName(context, "FooProviderType-1");
+
+ ComponentInstance ci1 = null,ci2 = null, ci3 = null;
+ try {
+ Properties p1 = new Properties();
+ p1.put("name", "name1");
+ ci1 = f.createComponentInstance(p1);
+ Properties p2 = new Properties();
+ p2.put("name", "name1");
+ ci2 = f2.createComponentInstance(p2);
+ System.err.println("==== " + ci1.getInstanceName() + " === " + ci2.getInstanceName());
+ assertNotEquals("Check name ci1, ci2", ci1.getInstanceName(), ci2.getInstanceName());
+ assertNotEquals("Check name ci1, ci3", ci1.getInstanceName(), ci3.getInstanceName());
+ assertNotEquals("Check name ci3, ci2", ci3.getInstanceName(), ci3.getInstanceName());
+ ci1.dispose();
+ ci2.dispose();
+ ci3.dispose();
+ } catch(Exception e) {
+ ci1.dispose();
+ return; }
+
+ fail("An unacceptable configuration is acceptable");
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/handler/ExternalHandlerTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/handler/ExternalHandlerTestSuite.java
new file mode 100644
index 0000000..f37d2ec
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/handler/ExternalHandlerTestSuite.java
@@ -0,0 +1,35 @@
+/*
+ * 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.test.scenarios.handler;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class ExternalHandlerTestSuite extends TestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("External Handler Test Suite", bc);
+ ots.addTestSuite(HandlerTest.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/handler/HandlerTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/handler/HandlerTest.java
new file mode 100644
index 0000000..a9d2718
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/handler/HandlerTest.java
@@ -0,0 +1,191 @@
+/*
+ * 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.test.scenarios.handler;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.HandlerFactory;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class HandlerTest extends OSGiTestCase {
+
+ ComponentInstance instance;
+
+ public void setUp() {
+ Properties props = new Properties();
+ props.put("name", "HandlerTest-1");
+ props.put("csh.simple", "simple");
+ Properties p = new Properties();
+ p.put("a", "a");
+ p.put("b", "b");
+ p.put("c", "c");
+ props.put("csh.map", p);
+ instance = Utils.getComponentInstance(context, "HandlerTester", props);
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ instance = null;
+ }
+
+ public void testConfiguration1() {
+ // Check the availability of CheckService
+ String name = "HandlerTest-1";
+ ServiceReference sr = null;
+ ServiceReference[] refs = null;
+ String filter = "("+"instance.name"+"="+name+")";
+ try {
+ refs = context.getServiceReferences(CheckService.class.getName(), filter);
+ } catch (InvalidSyntaxException e) { System.err.println("Invalid Filter : " + filter);}
+ if(refs != null) { sr = refs[0]; }
+
+ assertNotNull("Check the check service availability", sr);
+
+ CheckService cs = (CheckService) context.getService(sr);
+ Properties p = cs.getProps();
+ assertEquals("Assert 'simple' equality", p.get("Simple"), "simple");
+ assertEquals("Assert 'a' equality", p.get("Map1"), "a");
+ assertEquals("Assert 'b' equality", p.get("Map2"), "b");
+ assertEquals("Assert 'c' equality", p.get("Map3"), "c");
+
+ cs = null;
+ context.ungetService(sr);
+ }
+
+ public void testConfiguration2() {
+ // Check the availability of CheckService
+ String name = "HandlerTest-2";
+ ServiceReference sr = null;
+ ServiceReference[] refs = null;
+ String filter = "("+"instance.name"+"="+name+")";
+ try {
+ refs = context.getServiceReferences(CheckService.class.getName(), filter);
+ } catch (InvalidSyntaxException e) { System.err.println("Invalid Filter : " + filter);}
+ if(refs != null) { sr = refs[0]; }
+ assertNotNull("Check the check service availability", sr);
+
+ CheckService cs = (CheckService) context.getService(sr);
+ Properties p = cs.getProps();
+ assertEquals("Assert 'simple' equality", p.get("Simple"), "Simple");
+ assertEquals("Assert 'a' equality", p.get("Map1"), "a");
+ assertEquals("Assert 'b' equality", p.get("Map2"), "b");
+ assertEquals("Assert 'c' equality", p.get("Map3"), "c");
+
+ cs = null;
+ context.ungetService(sr);
+ }
+
+ public void testLifecycle() {
+ // Check the availability of CheckService
+ String name = "HandlerTest-1";
+ ServiceReference sr = null;
+ ServiceReference[] refs = null;
+ String filter = "("+"instance.name"+"="+name+")";
+ try {
+ refs = context.getServiceReferences(CheckService.class.getName(), filter);
+ } catch (InvalidSyntaxException e) { System.err.println("Invalid Filter : " + filter);}
+ if(refs != null) { sr = refs[0]; }
+ assertNotNull("Check the check service availability", sr);
+
+ ServiceReference sr_arch = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "HandlerTest-1");
+ Architecture arch = (Architecture) context.getService(sr_arch);
+
+ assertEquals("Check instance validity - 0", arch.getInstanceDescription().getState(), ComponentInstance.VALID);
+
+ CheckService cs = (CheckService) context.getService(sr);
+ Properties p = cs.getProps();
+ Integer changes = (Integer) p.get("changes");
+ assertNotNull("Check changes no null", changes);
+ assertEquals("Changes changes 1 ("+changes+")", changes.intValue(), 1);
+ assertEquals("Check instance validity - 1", arch.getInstanceDescription().getState(), ComponentInstance.VALID);
+ cs.check();
+ p = cs.getProps();
+ changes = (Integer) p.get("changes");
+ assertEquals("Changes changes 2 ("+changes+")", changes.intValue(), 2);
+ assertEquals("Check instance validity - 2", arch.getInstanceDescription().getState(), ComponentInstance.INVALID);
+ cs.check();
+ p = cs.getProps();
+ changes = (Integer) p.get("changes");
+ assertEquals("Changes changes 3 ("+changes+")", changes.intValue(), 3);
+ assertEquals("Check instance validity - 3", arch.getInstanceDescription().getState(), ComponentInstance.VALID);
+ cs.check();
+ p = cs.getProps();
+ changes = (Integer) p.get("changes");
+ assertEquals("Changes changes 4 ("+changes+")", changes.intValue(), 4);
+ assertEquals("Check instance validity - 4", arch.getInstanceDescription().getState(), ComponentInstance.INVALID);
+
+ cs = null;
+ arch = null;
+ context.ungetService(sr_arch);
+ context.ungetService(sr);
+ }
+
+ public void testAvailability() {
+ String name = "HandlerTest-1";
+ ServiceReference sr = null;
+ ServiceReference[] refs = null;
+ String filter = "("+"instance.name"+"="+name+")";
+ try {
+ refs = context.getServiceReferences(CheckService.class.getName(), filter);
+ } catch (InvalidSyntaxException e) { System.err.println("Invalid Filter : " + filter);}
+ if(refs != null) { sr = refs[0]; }
+ assertNotNull("Check the check service availability", sr);
+
+ ServiceReference sr_arch = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "HandlerTest-1");
+ Architecture arch = (Architecture) context.getService(sr_arch);
+ assertEquals("Check validity", arch.getInstanceDescription().getState(), ComponentInstance.VALID);
+
+ // Kill the handler factory
+ HandlerFactory f = (HandlerFactory) Utils.getHandlerFactoryByName(context, "check");
+ f.stop();
+
+ sr = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "HandlerTest-1");
+ assertNull("Check the check service unavailability", sr);
+
+ sr_arch = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "HandlerTest-1");
+ assertNull("Check the architecture unavailability", sr_arch);
+
+ // The instance is disposed, restart the handler
+ f.start();
+
+ Properties props = new Properties();
+ props.put("name", "HandlerTest-1");
+ props.put("csh.simple", "simple");
+ Properties p = new Properties();
+ p.put("a", "a");
+ p.put("b", "b");
+ p.put("c", "c");
+ props.put("csh.map", p);
+ instance = Utils.getComponentInstance(context, "HandlerTester", props);
+
+ sr = Utils.getServiceReferenceByName(context, CheckService.class.getName(), "HandlerTest-1");
+ assertNotNull("Check the check service availability - 2", sr);
+
+ sr_arch = Utils.getServiceReferenceByName(context, Architecture.class.getName(), "HandlerTest-1");
+ arch = (Architecture) context.getService(sr_arch);
+ assertEquals("Check validity - 2", arch.getInstanceDescription().getState(), ComponentInstance.VALID);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/CallbackTestCase.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/CallbackTestCase.java
new file mode 100644
index 0000000..019bec5
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/CallbackTestCase.java
@@ -0,0 +1,115 @@
+/*
+ * 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.test.scenarios.lifecycle;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class CallbackTestCase extends OSGiTestCase {
+
+ ComponentInstance instance; // Instance under test
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ Properties p2 = new Properties();
+ p2.put("name", "fooProvider");
+ fooProvider = Utils.getComponentInstance(context, "FooProviderType-1", p2);
+ fooProvider.stop();
+
+ Properties p1 = new Properties();
+ p1.put("name", "callback");
+ instance = Utils.getComponentInstance(context, "CallbackCheckService", p1);
+
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ fooProvider.dispose();
+ instance= null;
+ fooProvider = null;
+ }
+
+ public void testCallback() {
+ // Check instance is invalid
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
+ assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0);
+
+ // Start fooprovider
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check int property
+ Integer index = (Integer) (cs.getProps().get("int"));
+ assertEquals("Check int property - 1", index.intValue(), 1);
+
+ assertEquals("Check pojo count - 2", id_dep.getCreatedObjects().length, 1);
+
+ fooProvider.stop();
+
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
+
+ assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1);
+
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check int property
+ index = (Integer) (cs.getProps().get("int"));
+ assertEquals("Check int property - 2 ("+index.intValue()+")", index.intValue(), 3);
+
+ assertEquals("Check pojo count - 4 ", id_dep.getCreatedObjects().length, 1);
+
+ // Clean up
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ cs = null;
+ id_dep = null;
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ImmediateCallbackSeveralFactoryTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ImmediateCallbackSeveralFactoryTest.java
new file mode 100644
index 0000000..19b7df9
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ImmediateCallbackSeveralFactoryTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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.test.scenarios.lifecycle;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.component.CallbackCheckService;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class ImmediateCallbackSeveralFactoryTest extends OSGiTestCase {
+
+ ComponentInstance instance; // Instance under test
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ Properties p2 = new Properties();
+ p2.put("name", "fooProvider");
+ fooProvider = Utils.getComponentInstance(context, "FooProviderType-1", p2);
+ fooProvider.stop();
+
+ Properties p1 = new Properties();
+ p1.put("name", "callback");
+ instance = Utils.getComponentInstance(context, "ImmediateCallbackCheckServiceSeveral", p1);
+
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ fooProvider.dispose();
+ instance= null;
+ fooProvider = null;
+ CallbackCheckService.count = 0;
+ }
+
+ public void testCallback() {
+ // Check instance is invalid
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
+ assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0);
+
+ // Start fooprovider
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ assertEquals("Check pojo count - 2", id_dep.getCreatedObjects().length, 1);
+ // Check int property
+ Integer index = (Integer) (cs.getProps().get("int"));
+ Integer count = (Integer) (cs.getProps().get("count"));
+ assertEquals("Check int property - 1 (" + index.intValue() +")", index.intValue(), 1);
+ assertEquals("Check count property - 1 (" + count.intValue() +")", count.intValue(), 1);
+
+ fooProvider.stop();
+
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
+
+ assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1);
+
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check int property
+ index = (Integer) (cs.getProps().get("int"));
+ count = (Integer) (cs.getProps().get("count"));
+ assertEquals("Check int property - 2 ("+index.intValue()+")", index.intValue(), 3);
+ assertEquals("Check count property - 2 ("+count.intValue()+")", count.intValue(), 1);
+
+ assertEquals("Check pojo count - 4 ", id_dep.getCreatedObjects().length, 1);
+
+ // Clean up
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ cs = null;
+ id_dep = null;
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ImmediateCallbackSingletonFactoryTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ImmediateCallbackSingletonFactoryTest.java
new file mode 100644
index 0000000..a86911f
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ImmediateCallbackSingletonFactoryTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.test.scenarios.lifecycle;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.component.CallbackCheckService;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class ImmediateCallbackSingletonFactoryTest extends OSGiTestCase {
+
+ ComponentInstance instance; // Instance under test
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ Properties p2 = new Properties();
+ p2.put("name", "fooProvider");
+ fooProvider = Utils.getComponentInstance(context, "FooProviderType-1", p2);
+ fooProvider.stop();
+
+ Properties p1 = new Properties();
+ p1.put("name", "callback");
+ instance = Utils.getComponentInstance(context, "ImmediateCallbackCheckServiceSingleton", p1);
+
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ fooProvider.dispose();
+ instance= null;
+ fooProvider = null;
+ CallbackCheckService.count = 0;
+ CallbackCheckService.singleton = null;
+ }
+
+ public void testCallback() {
+ // Check instance is invalid
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
+ assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0);
+
+ // Start fooprovider
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ assertEquals("Check pojo count - 2", id_dep.getCreatedObjects().length, 1);
+ // Check int property
+ Integer index = (Integer) (cs.getProps().get("int"));
+ assertEquals("Check int property - 1 (" + index.intValue() +")", index.intValue(), 1);
+
+ fooProvider.stop();
+
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
+
+ assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1);
+
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check int property
+ index = (Integer) (cs.getProps().get("int"));
+ assertEquals("Check int property - 2 ("+index.intValue()+")", index.intValue(), 3);
+
+ assertEquals("Check pojo count - 4 ", id_dep.getCreatedObjects().length, 1);
+
+ // Clean up
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ cs = null;
+ id_dep = null;
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ImmediateCallbackTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ImmediateCallbackTest.java
new file mode 100644
index 0000000..dad0c1d
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ImmediateCallbackTest.java
@@ -0,0 +1,114 @@
+/*
+ * 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.test.scenarios.lifecycle;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class ImmediateCallbackTest extends OSGiTestCase {
+
+ ComponentInstance instance; // Instance under test
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ Properties p2 = new Properties();
+ p2.put("name", "fooProvider");
+ fooProvider = Utils.getComponentInstance(context, "FooProviderType-1", p2);
+ fooProvider.stop();
+
+ Properties p1 = new Properties();
+ p1.put("name", "callback");
+ instance = Utils.getComponentInstance(context, "ImmediateCallbackCheckService", p1);
+
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ fooProvider.dispose();
+ instance= null;
+ fooProvider = null;
+ }
+
+ public void testCallback() {
+ // Check instance is invalid
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
+ assertEquals("Check pojo count - 1", id_dep.getCreatedObjects().length, 0);
+
+ // Start fooprovider
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ assertEquals("Check pojo count - 2", id_dep.getCreatedObjects().length, 1);
+ // Check int property
+ Integer index = (Integer) (cs.getProps().get("int"));
+ assertEquals("Check int property - 1 (" + index.intValue() +")", index.intValue(), 1);
+
+ fooProvider.stop();
+
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
+
+ assertEquals("Check pojo count - 3", id_dep.getCreatedObjects().length, 1);
+
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Check int property
+ index = (Integer) (cs.getProps().get("int"));
+ assertEquals("Check int property - 2 ("+index.intValue()+")", index.intValue(), 3);
+
+ assertEquals("Check pojo count - 4 ", id_dep.getCreatedObjects().length, 1);
+
+ // Clean up
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ cs = null;
+ id_dep = null;
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/LifeCycleCallbackTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/LifeCycleCallbackTest.java
new file mode 100644
index 0000000..69b171a
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/LifeCycleCallbackTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.test.scenarios.lifecycle;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class LifeCycleCallbackTest extends TestSuite {
+
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Lifecycle callbacks Test Suite", bc);
+ ots.addTestSuite(CallbackTestCase.class);
+ ots.addTestSuite(ParentCallbackTestCase.class);
+ ots.addTestSuite(ImmediateCallbackTest.class);
+ ots.addTestSuite(ImmediateCallbackSingletonFactoryTest.class);
+ ots.addTestSuite(ImmediateCallbackSeveralFactoryTest.class);
+ return ots;
+ }
+
+}
+
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ParentCallbackTestCase.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ParentCallbackTestCase.java
new file mode 100644
index 0000000..1f4901c
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/lifecycle/ParentCallbackTestCase.java
@@ -0,0 +1,102 @@
+/*
+ * 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.test.scenarios.lifecycle;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.CheckService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class ParentCallbackTestCase extends OSGiTestCase {
+
+ ComponentInstance instance; // Instance under test
+ ComponentInstance fooProvider;
+
+ public void setUp() {
+ Properties p2 = new Properties();
+ p2.put("name", "fooProvider");
+ fooProvider = Utils.getComponentInstance(context, "FooProviderType-1", p2);
+ fooProvider.stop();
+
+ Properties p1 = new Properties();
+ p1.put("name", "callback");
+ instance = Utils.getComponentInstance(context, "ParentCallbackCheckService", p1);
+
+ }
+
+ public void tearDown() {
+ instance.dispose();
+ fooProvider.dispose();
+ instance= null;
+ fooProvider = null;
+ }
+
+ public void testCallback() {
+ // Check instance is invalid
+ ServiceReference arch_ref = Utils.getServiceReferenceByName(context, Architecture.class.getName(), instance.getInstanceName());
+ assertNotNull("Check architecture availability", arch_ref);
+ InstanceDescription id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 1", id_dep.getState() == ComponentInstance.INVALID);
+
+ // Start fooprovider
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 1", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ ServiceReference cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ CheckService cs = (CheckService) context.getService(cs_ref);
+
+ // Check int property
+ assertEquals("Check pojo count - 2", id_dep.getCreatedObjects().length, 1);
+
+ fooProvider.stop();
+
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance invalidity - 2", id_dep.getState() == ComponentInstance.INVALID);
+
+ fooProvider.start();
+
+ // Check instance validity
+ id_dep = ((Architecture) context.getService(arch_ref)).getInstanceDescription();
+ assertTrue("Check instance validity - 2", id_dep.getState() == ComponentInstance.VALID);
+
+ // Check service providing
+ cs_ref = Utils.getServiceReferenceByName(context, CheckService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check CheckService availability", cs_ref);
+ cs = (CheckService) context.getService(cs_ref);
+ assertTrue("check CheckService invocation", cs.check());
+
+ // Clean up
+ context.ungetService(arch_ref);
+ context.ungetService(cs_ref);
+ cs = null;
+ id_dep = null;
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ExceptionTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ExceptionTest.java
new file mode 100644
index 0000000..975e2a6
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ExceptionTest.java
@@ -0,0 +1,101 @@
+/*
+ * 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.test.scenarios.manipulation;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.architecture.Architecture;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.component.FooProviderType1;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class ExceptionTest extends OSGiTestCase {
+
+ private ComponentInstance ci_lazzy;
+ private ComponentInstance ci_immediate;
+
+ private ServiceReference lazzyRef;
+ private ServiceReference immRef;
+
+ public void setUp() {
+ String factName = "FooProviderType-1";
+ String compName = "FooProvider-1";
+
+ Properties p = new Properties();
+ p.put("name", compName);
+ ci_lazzy = Utils.getComponentInstance(context, factName, p);
+
+ String factName2 = "ImmediateFooProviderType";
+ String compName2 = "FooProvider-2";
+
+ Properties p2 = new Properties();
+ p2.put("name", compName2);
+ ci_immediate = Utils.getComponentInstance(context, factName2, p2);
+
+ lazzyRef = Utils.getServiceReference(context, Architecture.class.getName(), "(instance.name="+compName+")");
+ immRef = Utils.getServiceReference(context, Architecture.class.getName(), "(instance.name="+compName2+")");
+ assertNotNull("LazzyRef", lazzyRef);
+ assertNotNull("ImmRef", immRef);
+ }
+
+ public void tearDown() {
+ context.ungetService(lazzyRef);
+ context.ungetService(immRef);
+ ci_lazzy.dispose();
+ ci_immediate.dispose();
+ }
+
+
+ public void testException() {
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_lazzy.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_lazzy.getInstanceName() + " is available",refs);
+ FooProviderType1 fs = (FooProviderType1) context.getService(refs[0]);
+ try {
+ fs.testException();
+ context.ungetService(refs[0]);
+ fail("The method must returns an exception");
+ } catch(Exception e) {
+ context.ungetService(refs[0]);
+ }
+ }
+
+ public void testTry() {
+ ServiceReference[] refs = null;
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name="+ci_lazzy.getInstanceName()+")");
+ } catch (InvalidSyntaxException e) { e.printStackTrace(); }
+ assertNotNull("Check that a FooService from " + ci_lazzy.getInstanceName() + " is available",refs);
+ FooProviderType1 fs = (FooProviderType1) context.getService(refs[0]);
+ try {
+ fs.testTry();
+ context.ungetService(refs[0]);
+ } catch(Exception e) {
+ context.ungetService(refs[0]);
+ fail("The method has returned an exception");
+ }
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/GetComponentInstanceTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/GetComponentInstanceTest.java
new file mode 100644
index 0000000..e82a011
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/GetComponentInstanceTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.test.scenarios.manipulation;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.Pojo;
+import org.apache.felix.ipojo.architecture.InstanceDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class GetComponentInstanceTest extends OSGiTestCase {
+
+ public void testGetComponentInstance() {
+ String factName = "FooProviderType-1";
+ String compName = "FooProvider-1";
+ ServiceReference[] refs = null;
+
+ // Get the facotry to create a component instance
+ Factory fact = Utils.getFactoryByName(context, factName);
+ assertNotNull("Cannot find the factory FooProvider-1", fact);
+
+ Properties props = new Properties();
+ props.put("name", compName);
+ ComponentInstance ci = null;
+ try {
+ ci = fact.createComponentInstance(props);
+ } catch (Exception e1) { fail(e1.getMessage()); }
+
+ // Get a FooService provider
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(instance.name=" + compName + ")");
+ } catch (InvalidSyntaxException e) { fail("Service query failed (2) " + e); }
+
+ assertNotNull("FS not available", refs);
+
+ // Get foo object
+ FooService fs = (FooService) context.getService(refs[0]);
+
+ // Cast to POJO
+ Pojo pojo = (Pojo) fs;
+
+ // GetComponentInstance
+ ComponentInstance instance = pojo.getComponentInstance();
+ assertEquals("Check component instance name", instance.getInstanceName(), compName);
+ assertEquals("Check component factory name", instance.getFactory().getName(), factName);
+ assertNotNull("Instance description not null", instance.getInstanceDescription());
+ InstanceDescription id = instance.getInstanceDescription();
+ assertTrue("Check instance state", id.getState() == ComponentInstance.VALID);
+ assertEquals("Check created pojo count", id.getCreatedObjects().length, 1);
+ assertEquals("Check instance description name", id.getName(), compName);
+
+ // Unget the service
+ context.ungetService(refs[0]);
+
+ ci.dispose();
+
+ // Check that there is no more FooService
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), null);
+ } catch (InvalidSyntaxException e) { fail("Service query failed (3) : " + e.getMessage()); }
+
+ assertNull("FS available, but component instance stopped", refs);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadata.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadata.java
new file mode 100644
index 0000000..69c788e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadata.java
@@ -0,0 +1,237 @@
+/*
+ * 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.test.scenarios.manipulation;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.ParseException;
+import org.apache.felix.ipojo.parser.ParseUtils;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class ManipulationMetadata extends OSGiTestCase {
+
+ public void testGetMetadata() {
+ String header = (String) context.getBundle().getHeaders().get("iPOJO-Components");
+ Element elem = null;
+ try {
+ elem = ManifestMetadataParser.parse(header);
+ } catch (ParseException e) {
+ fail("Parse Exception when parsing iPOJO-Component");
+ }
+
+ assertNotNull("Check elem not null", elem);
+
+ Element manip = getManipulationForComponent(elem, "FooProviderType-1");
+ assertNotNull("Check manipulation metadata not null for " + "FooProviderType-1", manip);
+ }
+
+ public void testInterface() {
+ String comp_name = "FooProviderType-1";
+ Element manip = getManipulationForComponent(comp_name);
+ Element[] itf = manip.getElements("Interface");
+ assertEquals("Check interfaces number", itf.length, 1);
+ assertEquals("Check itf name", itf[0].getAttribute("name"), FooService.class.getName());
+ }
+
+ public void testInterfaces() {
+ String comp_name = "FooBarProviderType-1";
+ Element manip = getManipulationForComponent(comp_name);
+ Element[] itf = manip.getElements("Interface");
+ assertEquals("Check interfaces number", itf.length, 2);
+ assertEquals("Check itf name", itf[0].getAttribute("name"), FooService.class.getName());
+ assertEquals("Check itf name", itf[1].getAttribute("name"), BarService.class.getName());
+ }
+
+ public void testFields() {
+ String comp_name = "FooProviderType-Dyn";
+ Element manip = getManipulationForComponent(comp_name);
+ Element[] fields = manip.getElements("field");
+ assertEquals("Check field count " + fields.length, fields.length, 5);
+ /*
+ private int intProp;
+ private String strProp;
+ private String[] strAProp;
+ private int[] intAProp;
+ private boolean boolProp;
+ */
+
+ Element field;
+
+ field = getFieldFromName(manip, "intProp");
+ assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "intProp");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "int");
+
+ field = getFieldFromName(manip, "strProp");
+ assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "strProp");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "java.lang.String");
+
+ field = getFieldFromName(manip, "strAProp");
+ assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "strAProp");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "java.lang.String[]");
+
+ field = getFieldFromName(manip, "intAProp");
+ assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "intAProp");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "int[]");
+
+ field = getFieldFromName(manip, "boolProp");
+ assertEquals("Check field name : " + field.getAttribute("name"), field.getAttribute("name"), "boolProp");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "boolean");
+ }
+
+ public void testPrimitivesFields() {
+ String comp_name = "PrimitiveManipulationTester";
+ Element manip = getManipulationForComponent(comp_name);
+ Element[] fields = manip.getElements("Field");
+ assertEquals("Check field count", fields.length, 16);
+ /*
+ byte b = 1;
+ short s = 1;
+ int i = 1;
+ long l = 1;
+ double d = 1.1;
+ float f = 1.1f;
+ char c = 'a';
+ boolean bool = false;
+ byte[] bs = new byte[] {0,1,2};
+ short[] ss = new short[] {0,1,2};
+ int[] is = new int[] {0,1,2};
+ long[] ls = new long[] {0,1,2};
+ double[] ds = new double[] {0.0, 1.1, 2.2};
+ float[] fs = new float[] {0.0f, 1.1f, 2.2f};
+ char[] cs = new char[] {'a', 'b', 'c'};
+ boolean[] bools = new boolean[] {false, true, false};
+ */
+ Element field;
+
+ field = getFieldFromName(manip, "b");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "byte");
+ field = getFieldFromName(manip, "s");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "short");
+ field = getFieldFromName(manip, "i");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "int");
+ field = getFieldFromName(manip, "l");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "long");
+ field = getFieldFromName(manip, "d");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "double");
+ field = getFieldFromName(manip, "f");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "float");
+ field = getFieldFromName(manip, "c");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "char");
+ field = getFieldFromName(manip, "bool");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "boolean");
+
+ field = getFieldFromName(manip, "bs");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "byte[]");
+ field = getFieldFromName(manip, "ss");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "short[]");
+ field = getFieldFromName(manip, "is");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "int[]");
+ field = getFieldFromName(manip, "ls");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "long[]");
+ field = getFieldFromName(manip, "ds");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "double[]");
+ field = getFieldFromName(manip, "fs");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "float[]");
+ field = getFieldFromName(manip, "cs");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "char[]");
+ field = getFieldFromName(manip, "bools");
+ assertEquals("Check field type : " + field.getAttribute("name"), field.getAttribute("type"), "boolean[]");
+ }
+
+ public void testNoArgMethod() {
+ String comp_name = "SimpleMultipleCheckServiceProvider";
+ Element manip = getManipulationForComponent(comp_name);
+ Element method = getMethodFromName(manip, "check");
+ assertFalse("Check no args", method.containsAttribute("arguments"));
+ assertEquals("Check return", method.getAttribute("return"), "boolean");
+ }
+
+ public void testOneArgsMethod() {
+ String comp_name = "SimpleMultipleCheckServiceProvider";
+ Element manip = getManipulationForComponent(comp_name);
+ Element method = getMethodFromName(manip, "refBind");
+ assertEquals("Check args", method.getAttribute("arguments"), "{org.osgi.framework.ServiceReference}");
+ assertEquals("Check args count", 1, ParseUtils.parseArrays("{org.osgi.framework.ServiceReference}").length);
+ assertFalse("Check return", method.containsAttribute("return"));
+ }
+
+ public void testTwoArgsMethod() {
+ String comp_name = "SimpleMultipleCheckServiceProvider";
+ Element manip = getManipulationForComponent(comp_name);
+ Element method = getMethodFromName(manip, "doNothing");
+ assertEquals("Check args", method.getAttribute("arguments"), "{java.lang.Object,java.lang.String}");
+ assertEquals("Check args count", 2, ParseUtils.parseArrays("{java.lang.Object,java.lang.String}").length);
+ assertEquals("Check return", method.getAttribute("return"), "java.lang.Object");
+ }
+
+ private Element getManipulationForComponent(Element metadata, String comp_name) {
+ Element[] comps = metadata.getElements("component");
+ for(int i = 0; i < comps.length; i++) {
+ if(comps[i].containsAttribute("factory") && comps[i].getAttribute("factory").equals(comp_name)) {
+ return comps[i].getElements("manipulation")[0];
+ }
+ if(comps[i].containsAttribute("name") && comps[i].getAttribute("name").equals(comp_name)) {
+ return comps[i].getElements("manipulation")[0];
+ }
+ }
+ return null;
+ }
+
+ private Element getManipulationForComponent(String comp_name) {
+ String header = (String) context.getBundle().getHeaders().get("iPOJO-Components");
+ Element elem = null;
+ try {
+ elem = ManifestMetadataParser.parse(header);
+ } catch (ParseException e) {
+ fail("Parse Exception when parsing iPOJO-Component");
+ }
+
+ assertNotNull("Check elem not null", elem);
+
+ Element manip = getManipulationForComponent(elem, comp_name);
+ assertNotNull("Check manipulation metadata not null for " + comp_name, manip);
+ return manip;
+ }
+
+ private Element getMethodFromName(Element manip, String name) {
+ Element methods[] = manip.getElements("Method");
+ for(int i = 0; i < methods.length; i++) {
+ if(methods[i].containsAttribute("name") && methods[i].getAttribute("name").equals(name)) {
+ return methods[i];
+ }
+ }
+ fail("Method " + name + " not found");
+ return null;
+ }
+
+ private Element getFieldFromName(Element manip, String name) {
+ Element fields[] = manip.getElements("Field");
+ for(int i = 0; i < fields.length; i++) {
+ if(fields[i].containsAttribute("name") && fields[i].getAttribute("name").equals(name)) {
+ return fields[i];
+ }
+ }
+ fail("Field " + name + " not found");
+ return null;
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadataAPI.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadataAPI.java
new file mode 100644
index 0000000..598267e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadataAPI.java
@@ -0,0 +1,278 @@
+/*
+ * 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.test.scenarios.manipulation;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.metadata.Element;
+import org.apache.felix.ipojo.parser.FieldMetadata;
+import org.apache.felix.ipojo.parser.ManifestMetadataParser;
+import org.apache.felix.ipojo.parser.MethodMetadata;
+import org.apache.felix.ipojo.parser.ParseException;
+import org.apache.felix.ipojo.parser.PojoMetadata;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+
+public class ManipulationMetadataAPI extends OSGiTestCase {
+
+ PojoMetadata FooProviderType1, FooBarProviderType1, FooProviderTypeDyn, PrimitiveManipulationTester, SimpleMultipleCheckServiceProvider;
+
+ public void setUp() {
+ String comp_name = "FooProviderType-1";
+ FooProviderType1 = getManipulationMetadataForComponent(comp_name);
+
+ comp_name = "FooBarProviderType-1";
+ FooBarProviderType1 = getManipulationMetadataForComponent(comp_name);
+
+ comp_name = "FooProviderType-Dyn";
+ FooProviderTypeDyn = getManipulationMetadataForComponent(comp_name);
+
+ comp_name = "PrimitiveManipulationTester";
+ PrimitiveManipulationTester = getManipulationMetadataForComponent(comp_name);
+
+ comp_name = "SimpleMultipleCheckServiceProvider";
+ SimpleMultipleCheckServiceProvider = getManipulationMetadataForComponent(comp_name);
+ }
+
+ public void testGetMetadata() {
+ String header = (String) context.getBundle().getHeaders().get("iPOJO-Components");
+ Element elem = null;
+ try {
+ elem = ManifestMetadataParser.parse(header);
+ } catch (ParseException e) {
+ fail("Parse Exception when parsing iPOJO-Component");
+ }
+
+ assertNotNull("Check elem not null", elem);
+
+ Element manip = getMetadataForComponent(elem, "FooProviderType-1");
+ assertNotNull("Check manipulation metadata not null for " + "FooProviderType-1", manip);
+ PojoMetadata mm = new PojoMetadata(manip);
+ assertNotNull("Check mm not null", mm);
+ }
+
+ public void testInterface() {
+ PojoMetadata manip = FooProviderType1;
+
+ String[] itf = manip.getInterfaces();
+ assertEquals("Check interfaces number", itf.length, 1);
+ assertEquals("Check itf name", itf[0], FooService.class.getName());
+
+ assertTrue("Check Foo Service implementation", manip.isInterfaceImplemented(FooService.class.getName()));
+ assertFalse("Check Bar Service implementation", manip.isInterfaceImplemented(BarService.class.getName()));
+ }
+
+ public void testInterfaces() {
+ PojoMetadata manip = FooBarProviderType1;
+ String[] itf = manip.getInterfaces();
+ assertEquals("Check interfaces number", itf.length, 2);
+ assertEquals("Check itf name", itf[0], FooService.class.getName());
+ assertEquals("Check itf name", itf[1], BarService.class.getName());
+
+ assertTrue("Check Foo Service implementation", manip.isInterfaceImplemented(FooService.class.getName()));
+ assertTrue("Check Bar Service implementation", manip.isInterfaceImplemented(BarService.class.getName()));
+ }
+
+ public void testFields() {
+ PojoMetadata manip = FooProviderTypeDyn;
+
+ FieldMetadata[] fields = manip.getFields();
+ assertEquals("Check field count + " + fields.length, fields.length, 5);
+ /*
+ private int intProp;
+ private String strProp;
+ private String[] strAProp;
+ private int[] intAProp;
+ private boolean boolProp;
+ */
+
+ FieldMetadata field;
+
+ field = manip.getField("intProp");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "intProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int");
+ assertEquals("Check field reflective type : " + field.getFieldName(), FieldMetadata.getReflectionType(field.getFieldType()), "int");
+
+ field = manip.getField("intProp", "int");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "intProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int");
+
+ field = manip.getField("intProp", "long");
+ assertNull("Check bad field", field);
+
+ field = manip.getField("strProp");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "strProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "java.lang.String");
+ assertEquals("Check field reflective type : " + field.getFieldName(), FieldMetadata.getReflectionType(field.getFieldType()), "java.lang.String");
+
+ field = manip.getField("strProp", "String");
+ assertNull("Check bad field", field);
+
+ field = manip.getField("strProp", "java.lang.String");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "strProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "java.lang.String");
+
+ field = manip.getField("strAProp");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "strAProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "java.lang.String[]");
+ assertEquals("Check field reflective type : " + field.getFieldName() + " -> " + FieldMetadata.getReflectionType(field.getFieldType()), FieldMetadata.getReflectionType(field.getFieldType()), "[Ljava.lang.String;");
+
+ field = manip.getField("strAProp", "java.lang.String[]");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "strAProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "java.lang.String[]");
+
+ field = manip.getField("strAProp", "String[]");
+ assertNull("Check bad field", field);
+
+ field = manip.getField("intAProp");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "intAProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int[]");
+ assertEquals("Check field reflective type : " + field.getFieldName() + " -> " + FieldMetadata.getReflectionType(field.getFieldType()), FieldMetadata.getReflectionType(field.getFieldType()), "[I");
+
+ field = manip.getField("intAProp", "int[]");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "intAProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int[]");
+
+ field = manip.getField("intAProp", "String[]");
+ assertNull("Check bad field", field);
+
+ field = manip.getField("boolProp");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "boolProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "boolean");
+ assertEquals("Check field reflective type : " + field.getFieldName(), FieldMetadata.getReflectionType(field.getFieldType()), "boolean");
+
+ field = manip.getField("boolProp", "boolean");
+ assertEquals("Check field name : " + field.getFieldName(), field.getFieldName(), "boolProp");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "boolean");
+
+ field = manip.getField("boolProp", "bool");
+ assertNull("Check bad field", field);
+ }
+
+ public void testPrimitivesFields() {
+ PojoMetadata manip = PrimitiveManipulationTester;
+ FieldMetadata[] fields = manip.getFields();
+ assertEquals("Check field count", fields.length, 16);
+
+ FieldMetadata field;
+
+ field = manip.getField("b");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "byte");
+ field = manip.getField("s");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "short");
+ field = manip.getField("i");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int");
+ field = manip.getField("l");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "long");
+ field = manip.getField("d");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "double");
+ field = manip.getField("f");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "float");
+ field = manip.getField("c");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "char");
+ field = manip.getField("bool");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "boolean");
+
+ field = manip.getField("bs");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "byte[]");
+ field = manip.getField("ss");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "short[]");
+ field = manip.getField("is");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "int[]");
+ field = manip.getField("ls");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "long[]");
+ field = manip.getField("ds");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "double[]");
+ field = manip.getField("fs");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "float[]");
+ field = manip.getField("cs");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "char[]");
+ field = manip.getField("bools");
+ assertEquals("Check field type : " + field.getFieldName(), field.getFieldType(), "boolean[]");
+ }
+
+ public void testNoArgMethod() {
+ PojoMetadata manip = SimpleMultipleCheckServiceProvider;
+ MethodMetadata method = manip.getMethod("check");
+ assertEquals("Check no args", method.getMethodArguments().length, 0);
+ assertEquals("Check return", method.getMethodReturn(), "boolean");
+
+ method = manip.getMethod("check", new String[0]);
+ assertEquals("Check no args", method.getMethodArguments().length, 0);
+ assertEquals("Check return", method.getMethodReturn(), "boolean");
+ }
+
+ public void testOneArgsMethod() {
+ PojoMetadata manip = SimpleMultipleCheckServiceProvider;
+ MethodMetadata method = manip.getMethods("refBind")[0];
+ assertEquals("Check args count", method.getMethodArguments().length, 1);
+ assertEquals("Check args", method.getMethodArguments()[0], "org.osgi.framework.ServiceReference");
+ assertEquals("Check return", method.getMethodReturn(), "void");
+
+ method = manip.getMethod("refBind", new String[] {"org.osgi.framework.ServiceReference"});
+ assertEquals("Check args count", method.getMethodArguments().length, 1);
+ assertEquals("Check args", method.getMethodArguments()[0], "org.osgi.framework.ServiceReference");
+ assertEquals("Check return", method.getMethodReturn(), "void");
+ }
+
+ public void testTwoArgsMethod() {
+ PojoMetadata manip = SimpleMultipleCheckServiceProvider;
+ MethodMetadata method = manip.getMethods("doNothing")[0];
+ assertEquals("Check args count", 2, method.getMethodArguments().length);
+ assertEquals("Check args - 1", method.getMethodArguments()[0], "java.lang.Object");
+ assertEquals("Check args - 2", method.getMethodArguments()[1], "java.lang.String");
+ assertEquals("Check return", method.getMethodReturn(), "java.lang.Object");
+
+ method = manip.getMethod("doNothing", new String[] {"java.lang.Object", "java.lang.String"});
+ assertEquals("Check args count", 2, method.getMethodArguments().length);
+ assertEquals("Check args - 1", method.getMethodArguments()[0], "java.lang.Object");
+ assertEquals("Check args - 2", method.getMethodArguments()[1], "java.lang.String");
+ assertEquals("Check return", method.getMethodReturn(), "java.lang.Object");
+ }
+
+ private Element getMetadataForComponent(Element metadata, String comp_name) {
+ Element[] comps = metadata.getElements("component");
+ for(int i = 0; i < comps.length; i++) {
+ if(comps[i].containsAttribute("factory") && comps[i].getAttribute("factory").equals(comp_name)) {
+ return comps[i];
+ }
+ if(comps[i].containsAttribute("name") && comps[i].getAttribute("name").equals(comp_name)) {
+ return comps[i];
+ }
+ }
+ return null;
+ }
+
+
+ private PojoMetadata getManipulationMetadataForComponent(String comp_name) {
+ String header = (String) context.getBundle().getHeaders().get("iPOJO-Components");
+ Element elem = null;
+ try {
+ elem = ManifestMetadataParser.parse(header);
+ } catch (ParseException e) {
+ fail("Parse Exception when parsing iPOJO-Component");
+ }
+
+ assertNotNull("Check elem not null", elem);
+
+ Element manip = getMetadataForComponent(elem, comp_name);
+ assertNotNull("Check manipulation metadata not null for " + comp_name, manip);
+ return new PojoMetadata(manip);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationTestSuite.java
new file mode 100644
index 0000000..7bae413
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationTestSuite.java
@@ -0,0 +1,39 @@
+/*
+ * 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.test.scenarios.manipulation;
+
+import junit.framework.Test;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.osgi.framework.BundleContext;
+
+public class ManipulationTestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Manipulation Test Suite", bc);
+ ots.addTestSuite(ManipulationMetadata.class);
+ ots.addTestSuite(PrimitiveTypeTest.class);
+ ots.addTestSuite(PrimitiveTypeTest2.class);
+ ots.addTestSuite(GetComponentInstanceTest.class);
+ ots.addTestSuite(ManipulationMetadataAPI.class);
+ ots.addTestSuite(ExceptionTest.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/PrimitiveTypeTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/PrimitiveTypeTest.java
new file mode 100644
index 0000000..defd46e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/PrimitiveTypeTest.java
@@ -0,0 +1,101 @@
+/*
+ * 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.test.scenarios.manipulation;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.PrimitiveManipulationTestService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class PrimitiveTypeTest extends OSGiTestCase {
+
+ ComponentInstance instance; // Instance under test
+ PrimitiveManipulationTestService prim;
+ ServiceReference prim_ref;
+
+ public void setUp() {
+ Properties p1 = new Properties();
+ p1.put("name", "primitives");
+ instance = Utils.getComponentInstance(context, "PrimitiveManipulationTester", p1);
+ assertTrue("check instance state", instance.getState() == ComponentInstance.VALID);
+ prim_ref = Utils.getServiceReferenceByName(context, PrimitiveManipulationTestService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check prim availability", prim_ref);
+ prim = (PrimitiveManipulationTestService) context.getService(prim_ref);
+ }
+
+ public void tearDown() {
+ context.ungetService(prim_ref);
+ prim = null;
+ instance.dispose();
+ instance = null;
+ }
+
+ public void testByte() {
+ assertEquals("Check - 1", prim.getByte(), 1);
+ prim.setByte((byte) 2);
+ assertEquals("Check - 2", prim.getByte(), 2);
+ }
+
+ public void testShort() {
+ assertEquals("Check - 1", prim.getShort(), 1);
+ prim.setShort((short) 2);
+ assertEquals("Check - 2", prim.getShort(), 2);
+ }
+
+ public void testInt() {
+ assertEquals("Check - 1", prim.getInt(), 1);
+ prim.setInt((int) 2);
+ assertEquals("Check - 2", prim.getInt(), 2);
+ }
+
+ public void testLong() {
+ assertEquals("Check - 1", prim.getLong(), 1);
+ prim.setLong((long) 2);
+ assertEquals("Check - 2", prim.getLong(), 2);
+ }
+
+ public void testFloat() {
+ assertEquals("Check - 1", prim.getFloat(), 1.1f);
+ prim.setFloat(2.2f);
+ assertEquals("Check - 2", prim.getFloat(), 2.2f);
+ }
+
+ public void testDouble() {
+ assertEquals("Check - 1", prim.getDouble(), 1.1);
+ prim.setDouble(2.2);
+ assertEquals("Check - 2", prim.getDouble(), 2.2);
+ }
+
+ public void testBoolean() {
+ assertFalse("Check - 1", prim.getBoolean());
+ prim.setBoolean(true);
+ assertTrue("Check - 2", prim.getBoolean());
+ }
+
+ public void testChar() {
+ assertEquals("Check - 1", prim.getChar(), 'a');
+ prim.setChar('b');
+ assertEquals("Check - 2", prim.getChar(), 'b');
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/PrimitiveTypeTest2.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/PrimitiveTypeTest2.java
new file mode 100644
index 0000000..a3e7dd3
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/PrimitiveTypeTest2.java
@@ -0,0 +1,122 @@
+/*
+ * 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.test.scenarios.manipulation;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.PrimitiveManipulationTestService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class PrimitiveTypeTest2 extends OSGiTestCase {
+
+ ComponentInstance instance; // Instance under test
+
+ PrimitiveManipulationTestService prim;
+
+ ServiceReference prim_ref;
+
+ public void setUp() {
+ Properties p1 = new Properties();
+ p1.put("name", "primitives");
+ instance = Utils.getComponentInstance(context, "PrimitiveManipulationTesterA", p1);
+ assertTrue("check instance state", instance.getState() == ComponentInstance.VALID);
+ prim_ref = Utils.getServiceReferenceByName(context, PrimitiveManipulationTestService.class.getName(), instance.getInstanceName());
+ assertNotNull("Check prim availability", prim_ref);
+ prim = (PrimitiveManipulationTestService) context.getService(prim_ref);
+ }
+
+ public void tearDown() {
+ context.ungetService(prim_ref);
+ prim = null;
+ instance.dispose();
+ instance = null;
+ }
+
+ public void testByte() {
+ assertEquals("Check - 1", prim.getByte(), 1);
+ prim.setByte((byte) 2);
+ assertEquals("Check - 2", prim.getByte(), 2);
+ }
+
+ public void testShort() {
+ assertEquals("Check - 1", prim.getShort(), 1);
+ prim.setShort((short) 2);
+ assertEquals("Check - 2", prim.getShort(), 2);
+ }
+
+ public void testInt() {
+ assertEquals("Check - 1", prim.getInt(), 1);
+ prim.setInt((int) 2);
+ assertEquals("Check - 2", prim.getInt(), 2);
+ }
+
+ public void testLong() {
+ assertEquals("Check - 1", prim.getLong(), 1);
+ prim.setLong((long) 2);
+ assertEquals("Check - 2", prim.getLong(), 2);
+ }
+
+ public void testLong2() {
+ assertEquals("Check - 1", prim.getLong(), 1);
+ prim.setLong(2, "ss");
+ assertEquals("Check - 2", prim.getLong(), 2);
+ }
+
+ public void testLongFromObject() {
+ assertEquals("Check - 1", prim.getLong(), 1);
+ Long l = new Long(2);
+ prim.setLong(l);
+ assertEquals("Check - 2", prim.getLong(), 2);
+ }
+
+ public void testLongFromObject2() {
+ assertEquals("Check - 1", prim.getLong(), 1);
+ Long l = new Long(2);
+ prim.setLong(l, "ss");
+ assertEquals("Check - 2", prim.getLong(), 2);
+ }
+
+ public void testFloat() {
+ assertEquals("Check - 1", prim.getFloat(), 1.1f);
+ prim.setFloat(2.2f);
+ assertEquals("Check - 2", prim.getFloat(), 2.2f);
+ }
+
+ public void testDouble() {
+ assertEquals("Check - 1", prim.getDouble(), 1.1);
+ prim.setDouble(2.2);
+ assertEquals("Check - 2", prim.getDouble(), 2.2);
+ }
+
+ public void testBoolean() {
+ assertFalse("Check - 1", prim.getBoolean());
+ prim.setBoolean(true);
+ assertTrue("Check - 2", prim.getBoolean());
+ }
+
+ public void testChar() {
+ assertEquals("Check - 1", prim.getChar(), 'a');
+ prim.setChar('b');
+ assertEquals("Check - 2", prim.getChar(), 'b');
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/A123/CheckService2.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/A123/CheckService2.java
new file mode 100644
index 0000000..6b0aafc
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/A123/CheckService2.java
@@ -0,0 +1,25 @@
+/*
+ * 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.test.scenarios.service.A123;
+
+public interface CheckService2 {
+
+ public boolean check();
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/BarService.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/BarService.java
new file mode 100644
index 0000000..727e845
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/BarService.java
@@ -0,0 +1,29 @@
+/*
+ * 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.test.scenarios.service;
+
+import java.util.Properties;
+
+public interface BarService {
+
+ public boolean bar();
+
+ public Properties getProps();
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/BazService.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/BazService.java
new file mode 100644
index 0000000..115b5de
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/BazService.java
@@ -0,0 +1,39 @@
+/*
+ * 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.test.scenarios.service;
+
+import java.util.Properties;
+
+public interface BazService {
+
+ boolean foo();
+
+ Properties fooProps();
+
+ Boolean getObject();
+
+ boolean getBoolean();
+
+ int getInt();
+
+ long getLong();
+
+ double getDouble();
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/CheckService.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/CheckService.java
new file mode 100644
index 0000000..62f254c
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/CheckService.java
@@ -0,0 +1,31 @@
+/*
+ * 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.test.scenarios.service;
+
+import java.util.Properties;
+
+public interface CheckService {
+
+ public static final String foo = "foo";
+
+ public boolean check();
+
+ public Properties getProps();
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ChildInterface.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ChildInterface.java
new file mode 100644
index 0000000..cb7c6c1
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ChildInterface.java
@@ -0,0 +1,25 @@
+/*
+ * 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.test.scenarios.service;
+
+public interface ChildInterface extends ParentInterface1, ParentInterface2 {
+
+ public void processChild();
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/FooService.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/FooService.java
new file mode 100644
index 0000000..78693cf
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/FooService.java
@@ -0,0 +1,39 @@
+/*
+ * 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.test.scenarios.service;
+
+import java.util.Properties;
+
+public interface FooService {
+
+ boolean foo();
+
+ Properties fooProps();
+
+ Boolean getObject();
+
+ boolean getBoolean();
+
+ int getInt();
+
+ long getLong();
+
+ double getDouble();
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ParentInterface1.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ParentInterface1.java
new file mode 100644
index 0000000..f70daf3
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ParentInterface1.java
@@ -0,0 +1,25 @@
+/*
+ * 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.test.scenarios.service;
+
+public interface ParentInterface1 extends ParentParentInterface {
+
+ public void processParent1();
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ParentInterface2.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ParentInterface2.java
new file mode 100644
index 0000000..78c3d35
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ParentInterface2.java
@@ -0,0 +1,25 @@
+/*
+ * 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.test.scenarios.service;
+
+public interface ParentInterface2 {
+
+ public void processParent2();
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ParentParentInterface.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ParentParentInterface.java
new file mode 100644
index 0000000..29767d4
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/ParentParentInterface.java
@@ -0,0 +1,25 @@
+/*
+ * 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.test.scenarios.service;
+
+public interface ParentParentInterface {
+
+ public void processParentParent();
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/PrimitiveManipulationTestService.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/PrimitiveManipulationTestService.java
new file mode 100644
index 0000000..d87118b
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/PrimitiveManipulationTestService.java
@@ -0,0 +1,75 @@
+/*
+ * 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.test.scenarios.service;
+
+public interface PrimitiveManipulationTestService {
+
+ byte getByte();
+ void setByte(byte b);
+
+ short getShort();
+ void setShort(short s);
+
+ int getInt();
+ void setInt(int i);
+
+ long getLong();
+ void setLong(long l);
+
+ float getFloat();
+ void setFloat(float f);
+
+ double getDouble();
+ void setDouble(double d);
+
+ char getChar();
+ void setChar(char c);
+
+ boolean getBoolean();
+ void setBoolean(boolean b);
+
+ // Array types
+ byte[] getBytes();
+ void setBytes(byte[] bs);
+
+ short[] getShorts();
+ void setShorts(short[] ss);
+
+ int[] getInts();
+ void setInts(int is[]);
+
+ long[] getLongs();
+ void setLongs(long[] ls);
+
+ float[] getFloats();
+ void setFloats(float[] fs);
+
+ double[] getDoubles();
+ void setDoubles(double[] ds);
+
+ char[] getChars();
+ void setChars(char[] cs);
+
+ boolean[] getBooleans();
+ void setBooleans(boolean[] bs);
+
+ // This method has been added to test an issue when autoboxing.
+ void setLong(long l, String s);
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/DynamicProps.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/DynamicProps.java
new file mode 100644
index 0000000..6f615ae
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/DynamicProps.java
@@ -0,0 +1,231 @@
+/*
+ * 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.test.scenarios.service.providing;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class DynamicProps extends OSGiTestCase {
+
+ ComponentInstance fooProvider1;
+ ComponentInstance fooProvider2;
+ ComponentInstance fooProvider3;
+
+ public void setUp() {
+ String type = "FooProviderType-Dyn";
+
+ Properties p1 = new Properties();
+ p1.put("name", "FooProvider-1");
+ fooProvider1 = Utils.getComponentInstance(context, type, p1);
+
+ Properties p2 = new Properties();
+ p2.put("name", "FooProvider-2");
+ p2.put("int", new Integer(4));
+ p2.put("boolean", new Boolean(false));
+ p2.put("string", new String("bar"));
+ p2.put("strAProp", new String[] {"bar", "foo"});
+ p2.put("intAProp", new int[] {1, 2, 3});
+ fooProvider2 = Utils.getComponentInstance(context, type, p2);
+
+ String type2 = "FooProviderType-Dyn2";
+ Properties p3 = new Properties();
+ p3.put("name", "FooProvider-3");
+ p3.put("int", new Integer(0));
+ p3.put("boolean", new Boolean(true));
+ p3.put("string", new String(""));
+ p3.put("strAProp", new String[0]);
+ p3.put("intAProp", new int[0]);
+ fooProvider3 = Utils.getComponentInstance(context, type2, p3);
+
+ }
+
+ public void tearDown() {
+ fooProvider1.dispose();
+ fooProvider1 = null;
+ fooProvider2.dispose();
+ fooProvider2 = null;
+ fooProvider3.dispose();
+ fooProvider3 = null;
+ }
+
+ public void testProperties1() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-1");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Boolean boolProp = (Boolean) sr.getProperty("boolean");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality (1)", intProp, new Integer(2));
+ assertEquals("Check longProp equality (1)", boolProp, new Boolean(false));
+ assertEquals("Check strProp equality (1)", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity (1)", strAProp);
+ String[] v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality (1)"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality (1)"); }
+ }
+
+ // Invoke
+ FooService fs = (FooService) context.getService(sr);
+ assertTrue("invoke fs", fs.foo());
+
+ // Re-check the property (change)
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality (2)", intProp, new Integer(3));
+ assertEquals("Check longProp equality (2)", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality (2)", strProp, new String("bar"));
+ assertNotNull("Check strAProp not nullity (2)", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality (2)"); }
+ }
+ assertNotNull("Check intAProp not nullity (2)", intAProp);
+ v2 = new int[] {3, 2, 1};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality (2)"); }
+ }
+
+ fs = null;
+ context.ungetService(sr);
+ }
+
+ public void testProperties2() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-2");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Boolean boolProp = (Boolean) sr.getProperty("boolean");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(4));
+ assertEquals("Check longProp equality", boolProp, new Boolean(false));
+ assertEquals("Check strProp equality", strProp, new String("bar"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[] {"bar", "foo"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Invoke
+ FooService fs = (FooService) context.getService(sr);
+ assertTrue("invoke fs", fs.foo());
+
+ // Re-check the property (change)
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(3));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] {3, 2, 1};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ fs = null;
+ context.ungetService(sr);
+ }
+
+ public void testProperties3() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Boolean boolProp = (Boolean) sr.getProperty("boolean");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(0));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String(""));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[0];
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[0];
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Invoke
+ FooService fs = (FooService) context.getService(sr);
+ assertTrue("invoke fs", fs.foo());
+
+ // Re-check the property (change)
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(2));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNull("Check intAProp hidding (no value)", intAProp);
+
+ fs = null;
+ context.ungetService(sr);
+
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/DynamicPropsReconfiguration.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/DynamicPropsReconfiguration.java
new file mode 100644
index 0000000..baeaa9d
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/DynamicPropsReconfiguration.java
@@ -0,0 +1,577 @@
+/*
+ * 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.test.scenarios.service.providing;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+public class DynamicPropsReconfiguration extends OSGiTestCase {
+ ComponentInstance fooProvider3;
+
+ public void setUp() {
+ String type2 = "FooProviderType-Dyn2";
+ Properties p3 = new Properties();
+ p3.put("name", "FooProvider-3");
+ p3.put("int", new Integer(0));
+ p3.put("boolean", new Boolean(true));
+ p3.put("string", new String(""));
+ p3.put("strAProp", new String[0]);
+ p3.put("intAProp", new int[0]);
+ fooProvider3 = Utils.getComponentInstance(context, type2, p3);
+ }
+
+ public void tearDown() {
+ fooProvider3.dispose();
+ fooProvider3 = null;
+ }
+
+ public void testFactoryReconf() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Boolean boolProp = (Boolean) sr.getProperty("boolean");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(0));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String(""));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[0];
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[0];
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Reconfiguration
+ ServiceReference fact_ref = Utils.getServiceReferenceByName(context, Factory.class.getName() , "FooProviderType-Dyn2");
+ Factory fact = (Factory) context.getService(fact_ref);
+ Properties p3 = new Properties();
+ p3.put("name", "FooProvider-3");
+ p3.put("int", new Integer(1));
+ p3.put("boolean", new Boolean(true));
+ p3.put("string", new String("foo"));
+ p3.put("strAProp", new String[] {"foo", "bar", "baz"});
+ p3.put("intAProp", new int[] { 1, 2, 3});
+ try {
+ fact.reconfigure(p3);
+ } catch(Exception e) {
+ fail("Unable to reconfigure the instance with : " + p3);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(1));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] { 1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Invoke
+ FooService fs = (FooService) context.getService(sr);
+ assertTrue("invoke fs", fs.foo());
+
+ // Re-check the property (change)
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(2));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNull("Check intAProp hidding (no value)", intAProp);
+
+ // Reconfiguration
+ fact_ref = Utils.getServiceReferenceByName(context, Factory.class.getName() , "FooProviderType-Dyn2");
+ fact = (Factory) context.getService(fact_ref);
+ p3 = new Properties();
+ p3.put("name", "FooProvider-3");
+ p3.put("int", new Integer(1));
+ p3.put("boolean", new Boolean(true));
+ p3.put("string", new String("foo"));
+ p3.put("strAProp", new String[] {"foo", "bar", "baz"});
+ p3.put("intAProp", new int[] { 1, 2, 3});
+ try {
+ fact.reconfigure(p3);
+ } catch(Exception e) {
+ fail("Unable to reconfigure the instance with : " + p3);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(1));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] { 1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ fact = null;
+ context.ungetService(fact_ref);
+ fs = null;
+ context.ungetService(sr);
+ }
+
+ public void testFactoryReconfString() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Boolean boolProp = (Boolean) sr.getProperty("boolean");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(0));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String(""));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[0];
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[0];
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Reconfiguration
+ ServiceReference fact_ref = Utils.getServiceReferenceByName(context, Factory.class.getName() , "FooProviderType-Dyn2");
+ Factory fact = (Factory) context.getService(fact_ref);
+ Properties p3 = new Properties();
+ p3.put("name", "FooProvider-3");
+ p3.put("int", "1");
+ p3.put("boolean", "true");
+ p3.put("string", "foo");
+ p3.put("strAProp", "{foo, bar, baz}");
+ p3.put("intAProp", "{1, 2, 3}");
+ try {
+ fact.reconfigure(p3);
+ } catch(Exception e) {
+ fail("Unable to reconfigure the instance with : " + p3);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(1));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] { 1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Invoke
+ FooService fs = (FooService) context.getService(sr);
+ assertTrue("invoke fs", fs.foo());
+
+ // Re-check the property (change)
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(2));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNull("Check intAProp hidding (no value)", intAProp);
+
+ // Reconfiguration
+ fact_ref = Utils.getServiceReferenceByName(context, Factory.class.getName() , "FooProviderType-Dyn2");
+ fact = (Factory) context.getService(fact_ref);
+ p3 = new Properties();
+ p3.put("name", "FooProvider-3");
+ p3.put("int", "1");
+ p3.put("boolean", "true");
+ p3.put("string", "foo");
+ p3.put("strAProp", "{foo, bar, baz}");
+ p3.put("intAProp", "{ 1, 2, 3}");
+ try {
+ fact.reconfigure(p3);
+ } catch(Exception e) {
+ fail("Unable to reconfigure the instance with : " + p3);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(1));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] { 1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ fact = null;
+ context.ungetService(fact_ref);
+ fs = null;
+ context.ungetService(sr);
+ }
+
+ public void testMSFReconf() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Boolean boolProp = (Boolean) sr.getProperty("boolean");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(0));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String(""));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[0];
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[0];
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Reconfiguration
+ ServiceReference fact_ref = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName() , "FooProviderType-Dyn2");
+ ManagedServiceFactory fact = (ManagedServiceFactory) context.getService(fact_ref);
+ Properties p3 = new Properties();
+ p3.put("int", new Integer(1));
+ p3.put("boolean", new Boolean(true));
+ p3.put("string", new String("foo"));
+ p3.put("strAProp", new String[] {"foo", "bar", "baz"});
+ p3.put("intAProp", new int[] { 1, 2, 3});
+ try {
+ fact.updated("FooProvider-3", p3);
+ } catch (ConfigurationException e) {
+ fail("Unable to reconfigure the instance with : " + p3);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(1));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] { 1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Invoke
+ FooService fs = (FooService) context.getService(sr);
+ assertTrue("invoke fs", fs.foo());
+
+ // Re-check the property (change)
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(2));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNull("Check intAProp hidding (no value)", intAProp);
+
+ // Reconfiguration
+ fact_ref = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName() , "FooProviderType-Dyn2");
+ fact = (ManagedServiceFactory) context.getService(fact_ref);
+ p3 = new Properties();
+ p3.put("int", new Integer(1));
+ p3.put("boolean", new Boolean(true));
+ p3.put("string", new String("foo"));
+ p3.put("strAProp", new String[] {"foo", "bar", "baz"});
+ p3.put("intAProp", new int[] { 1, 2, 3});
+ try {
+ fact.updated("FooProvider-3", p3);
+ } catch (ConfigurationException e) {
+ fail("Unable to reconfigure the instance with : " + p3);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(1));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] { 1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ fact = null;
+ context.ungetService(fact_ref);
+ fs = null;
+ context.ungetService(sr);
+ }
+
+ public void testMSFReconfString() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Boolean boolProp = (Boolean) sr.getProperty("boolean");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(0));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String(""));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[0];
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[0];
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Reconfiguration
+ ServiceReference fact_ref = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName() , "FooProviderType-Dyn2");
+ ManagedServiceFactory fact = (ManagedServiceFactory) context.getService(fact_ref);
+ Properties p3 = new Properties();
+ p3.put("int", "1");
+ p3.put("boolean", "true");
+ p3.put("string", "foo");
+ p3.put("strAProp", "{foo, bar, baz}");
+ p3.put("intAProp", "{ 1, 2, 3}");
+ try {
+ fact.updated("FooProvider-3", p3);
+ } catch (ConfigurationException e) {
+ fail("Unable to reconfigure the instance with : " + p3);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(1));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] { 1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Invoke
+ FooService fs = (FooService) context.getService(sr);
+ assertTrue("invoke fs", fs.foo());
+
+ // Re-check the property (change)
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(2));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNull("Check intAProp hidding (no value)", intAProp);
+
+ // Reconfiguration
+ fact_ref = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName() , "FooProviderType-Dyn2");
+ fact = (ManagedServiceFactory) context.getService(fact_ref);
+ p3 = new Properties();
+ p3.put("int", "1");
+ p3.put("boolean", "true");
+ p3.put("string", "foo");
+ p3.put("strAProp", "{foo, bar, baz}");
+ p3.put("intAProp", "{ 1, 2, 3}");
+ try {
+ fact.updated("FooProvider-3", p3);
+ } catch (ConfigurationException e) {
+ fail("Unable to reconfigure the instance with : " + p3);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-3");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ intProp = (Integer) sr.getProperty("int");
+ boolProp = (Boolean) sr.getProperty("boolean");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(1));
+ assertEquals("Check longProp equality", boolProp, new Boolean(true));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ v = new String[] {"foo", "bar", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] { 1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ fact = null;
+ context.ungetService(fact_ref);
+ fs = null;
+ context.ungetService(sr);
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/Exposition.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/Exposition.java
new file mode 100644
index 0000000..ee7aca2
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/Exposition.java
@@ -0,0 +1,193 @@
+/*
+ * 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.test.scenarios.service.providing;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class Exposition extends OSGiTestCase {
+
+ private ComponentInstance fooProviderSimple;
+ private ComponentInstance fooProviderItf;
+ private ComponentInstance fooBarProvider;
+ private ComponentInstance fooBarProvider2;
+ private ComponentInstance fooBarProvider3;
+
+ public void setUp(){
+ Properties p1 = new Properties();
+ p1.put("name", "fooProviderSimple");
+ fooProviderSimple = Utils.getComponentInstance(context, "FooProviderType-1", p1);
+
+ Properties p2 = new Properties();
+ p2.put("name", "fooProviderItf");
+ fooProviderItf = Utils.getComponentInstance(context, "FooProviderType-itf", p2);
+
+ Properties p3 = new Properties();
+ p3.put("name", "fooProviderItfs");
+ fooBarProvider = Utils.getComponentInstance(context, "FooBarProviderType-1", p3);
+
+ Properties p4 = new Properties();
+ p4.put("name", "fooProviderItfs2");
+ fooBarProvider2 = Utils.getComponentInstance(context, "FooBarProviderType-2", p4);
+
+ Properties p5 = new Properties();
+ p5.put("name", "fooProviderItfs3");
+ fooBarProvider3 = Utils.getComponentInstance(context, "FooBarProviderType-3", p5);
+
+ assertNotNull("Check the instance creation of fooProviderSimple", fooProviderSimple);
+ assertNotNull("Check the instance creation of fooProviderItf", fooProviderItf);
+ assertNotNull("Check the instance creation of fooProviderItfs", fooBarProvider);
+ assertNotNull("Check the instance creation of fooProviderItfs2", fooBarProvider2);
+ assertNotNull("Check the instance creation of fooProviderItfs3", fooBarProvider3);
+
+ }
+
+ public void tearDown() {
+ fooProviderSimple.dispose();
+ fooProviderItf.dispose();
+ fooBarProvider.dispose();
+ fooBarProvider2.dispose();
+ fooBarProvider3.dispose();
+ fooProviderSimple = null;
+ fooProviderItf = null;
+ fooBarProvider = null;
+ fooBarProvider2 = null;
+ fooBarProvider3 = null;
+ }
+
+ public void testSimpleExposition() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooProviderSimple.getInstanceName());
+ assertNotNull("Check the availability of the FS from "+fooProviderSimple.getInstanceName(), ref);
+ FooService fs = (FooService) context.getService(ref);
+ assertTrue("Check fs invocation", fs.foo());
+ fs = null;
+ context.ungetService(ref);
+ fooProviderSimple.stop();
+ ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooProviderSimple.getInstanceName());
+ assertNull("Check the absence of the FS from "+fooProviderSimple.getInstanceName(), ref);
+
+ }
+
+ public void testItfExposition() {
+ ServiceReference ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooProviderItf.getInstanceName());
+ assertNotNull("Check the availability of the FS from "+fooProviderItf.getInstanceName(), ref);
+ FooService fs = (FooService) context.getService(ref);
+ assertTrue("Check fs invocation", fs.foo());
+ fs = null;
+ context.ungetService(ref);
+ fooProviderItf.stop();
+
+ ref = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooProviderItf.getInstanceName());
+ assertNull("Check the absence of the FS from "+fooProviderItf.getInstanceName(), ref);
+ }
+
+ public void testItfsExposition() {
+ ServiceReference refFoo = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooBarProvider.getInstanceName());
+ assertNotNull("Check the availability of the FS from "+fooBarProvider.getInstanceName(), refFoo);
+ ServiceReference refBar = Utils.getServiceReferenceByName(context, BarService.class.getName(), fooBarProvider.getInstanceName());
+ assertNotNull("Check the availability of the BS from "+fooBarProvider.getInstanceName(), refBar);
+
+ assertSame("Check service reference equality", refFoo, refBar);
+
+ FooService fs = (FooService) context.getService(refFoo);
+ assertTrue("Check fs invocation", fs.foo());
+ fs = null;
+ context.ungetService(refFoo);
+
+ BarService bs = (BarService) context.getService(refBar);
+ assertTrue("Check bs invocation", bs.bar());
+ bs = null;
+ context.ungetService(refBar);
+
+ fooBarProvider.stop();
+
+ refFoo = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooBarProvider.getInstanceName());
+ refBar = Utils.getServiceReferenceByName(context, BarService.class.getName(), fooBarProvider.getInstanceName());
+ assertNull("Check the absence of the FS from "+fooBarProvider.getInstanceName(), refFoo);
+ assertNull("Check the absence of the BS from "+fooBarProvider.getInstanceName(), refBar);
+ }
+
+ public void testItfsExposition2() {
+ ServiceReference refFoo = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooBarProvider2.getInstanceName());
+ assertNotNull("Check the availability of the FS from "+fooBarProvider2.getInstanceName(), refFoo);
+ ServiceReference refBar = Utils.getServiceReferenceByName(context, BarService.class.getName(), fooBarProvider2.getInstanceName());
+ assertNotNull("Check the availability of the BS from "+fooBarProvider2.getInstanceName(), refBar);
+
+ assertSame("Check service reference equality", refFoo, refBar);
+
+ FooService fs = (FooService) context.getService(refFoo);
+ assertTrue("Check fs invocation", fs.foo());
+ fs = null;
+ context.ungetService(refFoo);
+
+ BarService bs = (BarService) context.getService(refBar);
+ assertTrue("Check bs invocation", bs.bar());
+ bs = null;
+ context.ungetService(refBar);
+
+ fooBarProvider2.stop();
+
+ refFoo = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooBarProvider2.getInstanceName());
+ refBar = Utils.getServiceReferenceByName(context, BarService.class.getName(), fooBarProvider2.getInstanceName());
+ assertNull("Check the absence of the FS from "+fooBarProvider.getInstanceName(), refFoo);
+ assertNull("Check the absence of the BS from "+fooBarProvider.getInstanceName(), refBar);
+ }
+
+ public void testItfsExposition3() {
+ ServiceReference refFoo = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooBarProvider3.getInstanceName());
+ assertNotNull("Check the availability of the FS from "+fooBarProvider3.getInstanceName(), refFoo);
+ ServiceReference refBar = Utils.getServiceReferenceByName(context, BarService.class.getName(), fooBarProvider3.getInstanceName());
+ assertNotNull("Check the availability of the BS from "+fooBarProvider3.getInstanceName(), refBar);
+
+ assertNotSame("Check service reference inequality", refFoo, refBar);
+
+ FooService fs = (FooService) context.getService(refFoo);
+ assertTrue("Check fs invocation", fs.foo());
+ fs = null;
+ context.ungetService(refFoo);
+
+ BarService bs = (BarService) context.getService(refBar);
+ assertTrue("Check bs invocation", bs.bar());
+ bs = null;
+ context.ungetService(refBar);
+
+ // Check properties
+ String baz1 = (String) refFoo.getProperty("baz");
+ String baz2 = (String) refBar.getProperty("baz");
+
+ assertEquals("Check Baz Property 1", baz1, "foo");
+ assertEquals("Check Baz Property 2", baz2, "bar");
+
+ fooBarProvider3.stop();
+
+ refFoo = Utils.getServiceReferenceByName(context, FooService.class.getName(), fooBarProvider3.getInstanceName());
+ refBar = Utils.getServiceReferenceByName(context, BarService.class.getName(), fooBarProvider3.getInstanceName());
+ assertNull("Check the absence of the FS from "+fooBarProvider.getInstanceName(), refFoo);
+ assertNull("Check the absence of the BS from "+fooBarProvider.getInstanceName(), refBar);
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/FactoryProps.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/FactoryProps.java
new file mode 100644
index 0000000..0be3205
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/FactoryProps.java
@@ -0,0 +1,87 @@
+/*
+ * 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.test.scenarios.service.providing;
+
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.architecture.PropertyDescription;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.BarService;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class FactoryProps extends OSGiTestCase {
+
+// public void testImplementationClass() {
+// ServiceReference ref1 = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooProviderType-1");
+// assertNotNull("The factory is available", ref1);
+// String clazz = (String) ref1.getProperty("component.class");
+// assertEquals("Check the implementation class", clazz, FooProviderType1.class.getName());
+// }
+
+ public void testSimpleExposition() {
+ ServiceReference ref1 = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooProviderType-1");
+ assertNotNull("The factory is available", ref1);
+ String[] spec = (String[]) ref1.getProperty("component.providedServiceSpecifications");
+ assertEquals("Check array length", spec.length, 1);
+ assertEquals("Check spec", spec[0], FooService.class.getName());
+ }
+
+ public void testDoubleExposition() {
+ ServiceReference ref1 = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooBarProviderType-1");
+ assertNotNull("The factory is available", ref1);
+ String[] spec = (String[]) ref1.getProperty("component.providedServiceSpecifications");
+ assertEquals("Check array length", spec.length, 2);
+ assertContains("Check spec 1", spec, FooService.class.getName());
+ assertContains("Check spec 2", spec, BarService.class.getName());
+ }
+
+ public void testProps() {
+ ServiceReference ref1 = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooProviderType-Dyn2");
+ assertNotNull("The factory is available", ref1);
+ PropertyDescription[] pd = (PropertyDescription[]) ref1.getProperty("component.properties");
+ assertEquals("Check property list size", pd.length, 5);
+
+ //P0
+ assertEquals("0) Check name", "int", pd[0].getName());
+ assertEquals("0) Check type", "int", pd[0].getType());
+ assertEquals("0) Check value", "4", pd[0].getValue());
+
+ //P1
+ assertEquals("1) Check name", "boolean", pd[1].getName());
+ assertEquals("1) Check type", "boolean", pd[1].getType());
+ assertNull("1) Check value", pd[1].getValue());
+
+ //P2
+ assertEquals("2) Check name", "string", pd[2].getName());
+ assertEquals("2) Check type", String.class.getName(), pd[2].getType());
+ assertNull("2) Check value", pd[2].getValue());
+
+ //P3
+ assertEquals("3) Check name", "strAProp", pd[3].getName());
+ assertEquals("3) Check type", "java.lang.String[]", pd[3].getType());
+ assertNull("3) Check value", pd[3].getValue());
+
+ //P4
+ assertEquals("4) Check name", "intAProp", pd[4].getName());
+ assertEquals("4) Check type", "int[]", pd[4].getType());
+ }
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/ProvidedServiceTestSuite.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/ProvidedServiceTestSuite.java
new file mode 100644
index 0000000..d12c206
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/ProvidedServiceTestSuite.java
@@ -0,0 +1,43 @@
+/*
+ * 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.test.scenarios.service.providing;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+import org.apache.felix.ipojo.junit4osgi.OSGiTestSuite;
+import org.apache.felix.ipojo.test.scenarios.service.providing.inherited.InheritedTest;
+import org.osgi.framework.BundleContext;
+
+public class ProvidedServiceTestSuite extends TestSuite {
+
+ public static Test suite(BundleContext bc) {
+ OSGiTestSuite ots = new OSGiTestSuite("Provided Service Test Suite", bc);
+ ots.addTestSuite(Exposition.class);
+ ots.addTestSuite(SimplePS.class);
+ ots.addTestSuite(StaticProps.class);
+ ots.addTestSuite(DynamicProps.class);
+ ots.addTestSuite(FactoryProps.class);
+ ots.addTestSuite(StaticPropsReconfiguration.class);
+ ots.addTestSuite(DynamicPropsReconfiguration.class);
+ ots.addTestSuite(InheritedTest.class);
+ return ots;
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/SimplePS.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/SimplePS.java
new file mode 100644
index 0000000..8e52b1c
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/SimplePS.java
@@ -0,0 +1,80 @@
+/*
+ * 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.test.scenarios.service.providing;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+
+public class SimplePS extends OSGiTestCase {
+
+ public void testPS() {
+ String factName = "FooProviderType-1";
+ String compName = "FooProvider-1";
+ ServiceReference[] refs = null;
+
+ // Check that no Foo Service are available
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), null);
+ } catch (InvalidSyntaxException e) { fail("Service query failed : " + e); }
+
+ assertNull("FS already available", refs);
+
+ // Get the factory to create a component instance
+ Factory fact = Utils.getFactoryByName(context, factName);
+ assertNotNull("Cannot find the factory FooProvider-1", fact);
+
+ Properties props = new Properties();
+ props.put("name", compName);
+ ComponentInstance ci = null;
+ try {
+ ci = fact.createComponentInstance(props);
+ } catch (Exception e1) { fail(e1.getMessage()); }
+
+ // Get a FooService provider
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), "(" + "instance.name" + "=" + compName + ")");
+ } catch (InvalidSyntaxException e) { fail("Service query failed (2) " + e); }
+
+ assertNotNull("FS not available", refs);
+
+ // Test foo invocation
+ FooService fs = (FooService) context.getService(refs[0]);
+ assertTrue("FooService invocation failed", fs.foo());
+
+ // Unget the service
+ context.ungetService(refs[0]);
+
+ ci.dispose();
+
+ // Check that there is no more FooService
+ try {
+ refs = context.getServiceReferences(FooService.class.getName(), null);
+ } catch (InvalidSyntaxException e) { fail("Service query failed (3) : " + e.getMessage()); }
+
+ assertNull("FS available, but component instance stopped", refs);
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/StaticProps.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/StaticProps.java
new file mode 100644
index 0000000..4894900
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/StaticProps.java
@@ -0,0 +1,112 @@
+/*
+ * 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.test.scenarios.service.providing;
+
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class StaticProps extends OSGiTestCase {
+
+ ComponentInstance fooProvider1;
+ ComponentInstance fooProvider2;
+
+ public void setUp() {
+ String type = "FooProviderType-2";
+
+ Properties p1 = new Properties();
+ p1.put("name", "FooProvider-1");
+ fooProvider1 = Utils.getComponentInstance(context, type, p1);
+
+ Properties p2 = new Properties();
+ p2.put("name", "FooProvider-2");
+ p2.put("int", new Integer(4));
+ p2.put("long", new Long(42));
+ p2.put("string", new String("bar"));
+ p2.put("strAProp", new String[] {"bar", "foo"});
+ p2.put("intAProp", new int[] {1, 2, 3});
+ fooProvider2 = Utils.getComponentInstance(context, type, p2);
+
+ }
+
+ public void tearDown() {
+ fooProvider1.dispose();
+ fooProvider1 = null;
+ fooProvider2.dispose();
+ fooProvider2 = null;
+ }
+
+ public void testProperties1() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-1");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Long longProp = (Long) sr.getProperty("long");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(2));
+ assertEquals("Check longProp equality", longProp, new Long(40));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ }
+
+ public void testProperties2() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-2");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Long longProp = (Long) sr.getProperty("long");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(4));
+ assertEquals("Check longProp equality", longProp, new Long(42));
+ assertEquals("Check strProp equality", strProp, new String("bar"));
+
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[] {"bar", "foo"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+ }
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/StaticPropsReconfiguration.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/StaticPropsReconfiguration.java
new file mode 100644
index 0000000..215d41e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/StaticPropsReconfiguration.java
@@ -0,0 +1,337 @@
+/*
+ * 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.test.scenarios.service.providing;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ConfigurationException;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+public class StaticPropsReconfiguration extends OSGiTestCase {
+
+ ComponentInstance fooProvider1;
+ ComponentInstance fooProvider2;
+
+ public void setUp() {
+ String type = "FooProviderType-2";
+
+ Properties p1 = new Properties();
+ p1.put("name", "FooProvider-1");
+ fooProvider1 = Utils.getComponentInstance(context, type, p1);
+
+ Properties p2 = new Properties();
+ p2.put("name", "FooProvider-2");
+ p2.put("int", new Integer(4));
+ p2.put("long", new Long(42));
+ p2.put("string", new String("bar"));
+ p2.put("strAProp", new String[] {"bar", "foo"});
+ p2.put("intAProp", new int[] {1, 2, 3});
+ fooProvider2 = Utils.getComponentInstance(context, type, p2);
+
+ }
+
+ public void tearDown() {
+ fooProvider1.dispose();
+ fooProvider1 = null;
+ fooProvider2.dispose();
+ fooProvider2 = null;
+ }
+
+ public void testReconfFactory1() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-1");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Long longProp = (Long) sr.getProperty("long");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(2));
+ assertEquals("Check longProp equality", longProp, new Long(40));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Reconfiguration
+ ServiceReference fact_ref = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooProviderType-2");
+ Dictionary reconf = new Properties();
+ reconf.put("name", "FooProvider-1");
+ reconf.put("int", new Integer(5));
+ reconf.put("long", new Long(43));
+ reconf.put("string", new String("toto"));
+ reconf.put("strAProp", new String[] {"foo", "baz"});
+ reconf.put("intAProp", new int[] {3, 2, 1});
+ Factory fact = (Factory) context.getService(fact_ref);
+ try {
+ fact.reconfigure(reconf);
+ } catch(Exception e) {
+ fail("Configuration non acceptable : " + reconf);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-1");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties after the reconfiguration
+ intProp = (Integer) sr.getProperty("int");
+ longProp = (Long) sr.getProperty("long");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality after reconfiguration", intProp, new Integer(5));
+ assertEquals("Check longProp equality after reconfiguration", longProp, new Long(43));
+ assertEquals("Check strProp equality after reconfiguration", strProp, new String("toto"));
+ assertNotNull("Check strAProp not nullity after reconfiguration", strAProp);
+ v = new String[] {"foo", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] {3, 2, 1};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ context.ungetService(fact_ref);
+ fact = null;
+
+ }
+
+ public void testReconfFactory2() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-2");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Long longProp = (Long) sr.getProperty("long");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(4));
+ assertEquals("Check longProp equality", longProp, new Long(42));
+ assertEquals("Check strProp equality", strProp, new String("bar"));
+
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[] {"bar", "foo"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Reconfiguration
+ ServiceReference fact_ref = Utils.getServiceReferenceByName(context, Factory.class.getName(), "FooProviderType-2");
+ Dictionary reconf = new Properties();
+ reconf.put("name", "FooProvider-2");
+ reconf.put("int", new Integer(5));
+ reconf.put("long", new Long(43));
+ reconf.put("string", new String("toto"));
+ reconf.put("strAProp", new String[] {"foo", "baz"});
+ reconf.put("intAProp", new int[] {3, 2, 1});
+ Factory fact = (Factory) context.getService(fact_ref);
+ try {
+ fact.reconfigure(reconf);
+ } catch(Exception e) {
+ fail("Configuration non acceptable : " + reconf);
+ }
+
+ // Check service properties after the reconfiguration
+ intProp = (Integer) sr.getProperty("int");
+ longProp = (Long) sr.getProperty("long");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality after reconfiguration", intProp, new Integer(5));
+ assertEquals("Check longProp equality after reconfiguration", longProp, new Long(43));
+ assertEquals("Check strProp equality after reconfiguration", strProp, new String("toto"));
+ assertNotNull("Check strAProp not nullity after reconfiguration", strAProp);
+ v = new String[] {"foo", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] {3, 2, 1};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ context.ungetService(fact_ref);
+ fact = null;
+ }
+
+ public void testMSFFactory1() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-1");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Long longProp = (Long) sr.getProperty("long");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(2));
+ assertEquals("Check longProp equality", longProp, new Long(40));
+ assertEquals("Check strProp equality", strProp, new String("foo"));
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[] {"foo", "bar"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Reconfiguration
+ ServiceReference fact_ref = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName(), "FooProviderType-2");
+ Dictionary reconf = new Properties();
+ reconf.put("int", new Integer(5));
+ reconf.put("long", new Long(43));
+ reconf.put("string", new String("toto"));
+ reconf.put("strAProp", new String[] {"foo", "baz"});
+ reconf.put("intAProp", new int[] {3, 2, 1});
+ ManagedServiceFactory fact = (ManagedServiceFactory) context.getService(fact_ref);
+ try {
+ fact.updated("FooProvider-1", reconf);
+ } catch (ConfigurationException e) {
+ fail("Configuration non acceptable : " + reconf);
+ }
+
+ sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-1");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties after the reconfiguration
+ intProp = (Integer) sr.getProperty("int");
+ longProp = (Long) sr.getProperty("long");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality after reconfiguration", intProp, new Integer(5));
+ assertEquals("Check longProp equality after reconfiguration", longProp, new Long(43));
+ assertEquals("Check strProp equality after reconfiguration", strProp, new String("toto"));
+ assertNotNull("Check strAProp not nullity after reconfiguration", strAProp);
+ v = new String[] {"foo", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] {3, 2, 1};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ context.ungetService(fact_ref);
+ fact = null;
+
+ }
+
+ public void testReconfMSF2() {
+ ServiceReference sr = Utils.getServiceReferenceByName(context, FooService.class.getName(), "FooProvider-2");
+ assertNotNull("Check the availability of the FS service", sr);
+
+ // Check service properties
+ Integer intProp = (Integer) sr.getProperty("int");
+ Long longProp = (Long) sr.getProperty("long");
+ String strProp = (String) sr.getProperty("string");
+ String[] strAProp = (String[]) sr.getProperty("strAProp");
+ int[] intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality", intProp, new Integer(4));
+ assertEquals("Check longProp equality", longProp, new Long(42));
+ assertEquals("Check strProp equality", strProp, new String("bar"));
+
+ assertNotNull("Check strAProp not nullity", strAProp);
+ String[] v = new String[] {"bar", "foo"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ int[] v2 = new int[] {1, 2, 3};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ // Reconfiguration
+ ServiceReference fact_ref = Utils.getServiceReferenceByName(context, ManagedServiceFactory.class.getName(), "FooProviderType-2");
+ Dictionary reconf = new Properties();
+ reconf.put("int", new Integer(5));
+ reconf.put("long", new Long(43));
+ reconf.put("string", new String("toto"));
+ reconf.put("strAProp", new String[] {"foo", "baz"});
+ reconf.put("intAProp", new int[] {3, 2, 1});
+ ManagedServiceFactory fact = (ManagedServiceFactory) context.getService(fact_ref);
+ try {
+ fact.updated("FooProvider-2", reconf);
+ } catch (ConfigurationException e) {
+ fail("Configuration non acceptable : " + reconf);
+ }
+
+ // Check service properties after the reconfiguration
+ intProp = (Integer) sr.getProperty("int");
+ longProp = (Long) sr.getProperty("long");
+ strProp = (String) sr.getProperty("string");
+ strAProp = (String[]) sr.getProperty("strAProp");
+ intAProp = (int[]) sr.getProperty("intAProp");
+
+ assertEquals("Check intProp equality after reconfiguration", intProp, new Integer(5));
+ assertEquals("Check longProp equality after reconfiguration", longProp, new Long(43));
+ assertEquals("Check strProp equality after reconfiguration", strProp, new String("toto"));
+ assertNotNull("Check strAProp not nullity after reconfiguration", strAProp);
+ v = new String[] {"foo", "baz"};
+ for (int i = 0; i < strAProp.length; i++) {
+ if(!strAProp[i].equals(v[i])) { fail("Check the strAProp Equality"); }
+ }
+ assertNotNull("Check intAProp not nullity", intAProp);
+ v2 = new int[] {3, 2, 1};
+ for (int i = 0; i < intAProp.length; i++) {
+ if(intAProp[i] != v2[i]) { fail("Check the intAProp Equality"); }
+ }
+
+ context.ungetService(fact_ref);
+ fact = null;
+ }
+
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/inherited/InheritedTest.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/inherited/InheritedTest.java
new file mode 100644
index 0000000..a2c52f3
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/service/providing/inherited/InheritedTest.java
@@ -0,0 +1,193 @@
+/*
+ * 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.test.scenarios.service.providing.inherited;
+
+import org.apache.felix.ipojo.ComponentInstance;
+import org.apache.felix.ipojo.Factory;
+import org.apache.felix.ipojo.junit4osgi.OSGiTestCase;
+import org.apache.felix.ipojo.test.scenarios.service.ChildInterface;
+import org.apache.felix.ipojo.test.scenarios.service.FooService;
+import org.apache.felix.ipojo.test.scenarios.service.ParentInterface1;
+import org.apache.felix.ipojo.test.scenarios.service.ParentInterface2;
+import org.apache.felix.ipojo.test.scenarios.service.ParentParentInterface;
+import org.apache.felix.ipojo.test.scenarios.util.Utils;
+import org.osgi.framework.ServiceReference;
+
+public class InheritedTest extends OSGiTestCase {
+
+ private Factory pi1, pi11, pi12, pi2, pi21, pi3;
+
+ public void setUp() {
+ pi1 = Utils.getFactoryByName(context, "PI1");
+ pi11 = Utils.getFactoryByName(context, "PI1-1");
+ pi12 = Utils.getFactoryByName(context, "PI1-2");
+
+ pi2 = Utils.getFactoryByName(context, "PI2");
+ pi21 = Utils.getFactoryByName(context, "PI2-1");
+
+ pi3 = Utils.getFactoryByName(context, "PI3");
+ }
+
+ private boolean contains(String[] arr, String txt) {
+ for (int i = 0; i < arr.length; i++) {
+ if (arr[i].equals(txt)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public void testPI1Factory() {
+ String[] specs = pi1.getComponentDescription().getprovidedServiceSpecification();
+ assertEquals("Check provides count", specs.length, 4);
+ assertTrue("Check Child", contains(specs, ChildInterface.class.getName()));
+ assertTrue("Check Parent1", contains(specs, ParentInterface1.class.getName()));
+ assertTrue("Check Parent2", contains(specs, ParentInterface2.class.getName()));
+ assertTrue("Check ParentParent", contains(specs, ParentParentInterface.class.getName()));
+ }
+
+ public void testPI11Factory() {
+ String[] specs = pi11.getComponentDescription().getprovidedServiceSpecification();
+ assertEquals("Check provides count", specs.length, 1);
+ assertTrue("Check ParentParent", contains(specs, ParentParentInterface.class.getName()));
+ }
+
+ public void testPI12Factory() {
+ String[] specs = pi12.getComponentDescription().getprovidedServiceSpecification();
+ assertEquals("Check provides count", specs.length, 2);
+ assertTrue("Check Parent2", contains(specs, ParentInterface2.class.getName()));
+ assertTrue("Check ParentParent", contains(specs, ParentParentInterface.class.getName()));
+ }
+
+ public void testPI2Factory() {
+ String[] specs = pi2.getComponentDescription().getprovidedServiceSpecification();
+ assertEquals("Check provides count ("+specs.length+")", specs.length, 4);
+ assertTrue("Check Child", contains(specs, ChildInterface.class.getName()));
+ assertTrue("Check Parent1", contains(specs, ParentInterface1.class.getName()));
+ assertTrue("Check Parent2", contains(specs, ParentInterface2.class.getName()));
+ assertTrue("Check ParentParent", contains(specs, ParentParentInterface.class.getName()));
+ }
+
+ public void testPI21Factory() {
+ String[] specs = pi21.getComponentDescription().getprovidedServiceSpecification();
+ assertEquals("Check provides count", specs.length, 1);
+ assertTrue("Check ParentParent", contains(specs, ParentParentInterface.class.getName()));
+ }
+
+ public void testPI3Factory() {
+ String[] specs = pi3.getComponentDescription().getprovidedServiceSpecification();
+ assertEquals("Check provides count", specs.length, 5);
+ assertTrue("Check Child", contains(specs, ChildInterface.class.getName()));
+ assertTrue("Check Parent1", contains(specs, ParentInterface1.class.getName()));
+ assertTrue("Check Parent2", contains(specs, ParentInterface2.class.getName()));
+ assertTrue("Check ParentParent", contains(specs, ParentParentInterface.class.getName()));
+ assertTrue("Check FS", contains(specs, FooService.class.getName()));
+ }
+
+ public void testIP1() {
+ ComponentInstance ci = Utils.getComponentInstanceByName(context, pi1.getName(), "ci");
+
+ ServiceReference ref1 = Utils.getServiceReferenceByName(context, ChildInterface.class.getName(), "ci");
+ assertNotNull("Check Child", ref1);
+
+ ServiceReference ref2 = Utils.getServiceReferenceByName(context, ParentInterface1.class.getName(), "ci");
+ assertNotNull("Check Parent1", ref2);
+
+ ServiceReference ref3 = Utils.getServiceReferenceByName(context, ParentInterface2.class.getName(), "ci");
+ assertNotNull("Check Parent2", ref3);
+
+ ServiceReference ref4 = Utils.getServiceReferenceByName(context, ParentParentInterface.class.getName(), "ci");
+ assertNotNull("Check PP", ref4);
+
+ ci.dispose();
+ }
+
+ public void testIP11() {
+ ComponentInstance ci = Utils.getComponentInstanceByName(context, pi11.getName(), "ci");
+
+ ServiceReference ref4 = Utils.getServiceReferenceByName(context, ParentParentInterface.class.getName(), "ci");
+ assertNotNull("Check PP", ref4);
+
+ ci.dispose();
+ }
+
+ public void testIP12() {
+ ComponentInstance ci = Utils.getComponentInstanceByName(context, pi12.getName(), "ci");
+
+ ServiceReference ref3 = Utils.getServiceReferenceByName(context, ParentInterface2.class.getName(), "ci");
+ assertNotNull("Check Parent2", ref3);
+
+ ServiceReference ref4 = Utils.getServiceReferenceByName(context, ParentParentInterface.class.getName(), "ci");
+ assertNotNull("Check PP", ref4);
+
+ ci.dispose();
+ }
+
+ public void testIP2() {
+ ComponentInstance ci = Utils.getComponentInstanceByName(context, pi2.getName(), "ci");
+
+ ServiceReference ref1 = Utils.getServiceReferenceByName(context, ChildInterface.class.getName(), "ci");
+ assertNotNull("Check Child", ref1);
+
+ ServiceReference ref2 = Utils.getServiceReferenceByName(context, ParentInterface1.class.getName(), "ci");
+ assertNotNull("Check Parent1", ref2);
+
+ ServiceReference ref3 = Utils.getServiceReferenceByName(context, ParentInterface2.class.getName(), "ci");
+ assertNotNull("Check Parent2", ref3);
+
+ ServiceReference ref4 = Utils.getServiceReferenceByName(context, ParentParentInterface.class.getName(), "ci");
+ assertNotNull("Check PP", ref4);
+
+ ci.dispose();
+ }
+
+ public void testIP21() {
+ ComponentInstance ci = Utils.getComponentInstanceByName(context, pi21.getName(), "ci");
+
+ ServiceReference ref4 = Utils.getServiceReferenceByName(context, ParentParentInterface.class.getName(), "ci");
+ assertNotNull("Check PP", ref4);
+
+ ci.dispose();
+ }
+
+ public void testIP3() {
+ ComponentInstance ci = Utils.getComponentInstanceByName(context, pi3.getName(), "ci");
+
+ ServiceReference ref1 = Utils.getServiceReferenceByName(context, ChildInterface.class.getName(), "ci");
+ assertNotNull("Check Child", ref1);
+
+ ServiceReference ref2 = Utils.getServiceReferenceByName(context, ParentInterface1.class.getName(), "ci");
+ assertNotNull("Check Parent1", ref2);
+
+ ServiceReference ref3 = Utils.getServiceReferenceByName(context, ParentInterface2.class.getName(), "ci");
+ assertNotNull("Check Parent2", ref3);
+
+ ServiceReference ref4 = Utils.getServiceReferenceByName(context, ParentParentInterface.class.getName(), "ci");
+ assertNotNull("Check PP", ref4);
+
+ ServiceReference ref5 = Utils.getServiceReferenceByName(context, FooService.class.getName(), "ci");
+ assertNotNull("Check FS", ref5);
+
+ ci.dispose();
+ }
+
+
+
+
+}
diff --git a/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
new file mode 100644
index 0000000..9b0b8db
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
@@ -0,0 +1,289 @@
+/*
+ * 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.test.scenarios.util;
+
+import java.util.Dictionary;
+import java.util.Properties;
+
+import junit.framework.Assert;
+
+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.composite.CompositeManager;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.framework.ServiceReference;
+import org.osgi.service.cm.ManagedServiceFactory;
+
+public class Utils {
+
+ public static Factory getFactoryByName(BundleContext bc, String factoryName) {
+ ServiceReference[] refs;
+ try {
+ refs = bc.getServiceReferences(Factory.class.getName(), "(factory.name=" + factoryName + ")");
+ if (refs == null) {
+ System.err.println("Cannot get the factory " + factoryName);
+ return null;
+ }
+ return ((Factory) bc.getService(refs[0]));
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Cannot get the factory " + factoryName + " : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static HandlerFactory getHandlerFactoryByName(BundleContext bc, String factoryName) {
+ ServiceReference[] refs;
+ try {
+ refs = bc.getServiceReferences(Factory.class.getName(), "(" + Handler.HANDLER_NAME_PROPERTY + "=" + factoryName + ")");
+ if (refs == null) {
+ System.err.println("Cannot get the factory " + factoryName);
+ return null;
+ }
+ return (HandlerFactory) bc.getService(refs[0]);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Cannot get the factory " + factoryName + " : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static ComponentInstance getComponentInstance(BundleContext bc, String factoryName, Dictionary configuration) {
+ Factory fact = getFactoryByName(bc, factoryName);
+
+ if (fact == null) {
+ System.err.println("Factory " + factoryName + " not found");
+ return null;
+ }
+
+ // if(fact.isAcceptable(configuration)) {
+ try {
+ return fact.createComponentInstance(configuration);
+ } catch (Exception e) {
+ Assert.fail("Cannot create the instance from " + factoryName + " : " + e.getMessage());
+ return null;
+ }
+ // }
+ // else {
+ // System.err.println("Configuration not accepted by : " + factoryName);
+ // return null;
+ // }
+ }
+
+ public static ComponentInstance getComponentInstanceByName(BundleContext bc, String factoryName, String name) {
+ Factory fact = getFactoryByName(bc, factoryName);
+
+ if (fact == null) {
+ System.err.println("Factory " + factoryName + " not found");
+ return null;
+ }
+
+ try {
+ Properties props = new Properties();
+ props.put("name", name);
+ return fact.createComponentInstance(props);
+ } catch (Exception e) {
+ System.err.println("Cannot create the instance from " + factoryName + " : " + e.getMessage());
+ e.printStackTrace();
+ return null;
+ }
+ }
+
+ public static ServiceReference[] getServiceReferences(BundleContext bc, String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return new ServiceReference[0];
+ } else {
+ return refs;
+ }
+ }
+
+ public static ServiceReference getServiceReference(BundleContext bc, String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return null;
+ } else {
+ return refs[0];
+ }
+ }
+
+ public static ServiceReference getServiceReferenceByName(BundleContext bc, String itf, String name) {
+ ServiceReference[] refs = null;
+ String filter = null;
+ if (itf.equals(Factory.class.getName()) || itf.equals(ManagedServiceFactory.class.getName())) {
+ filter = "(" + "factory.name" + "=" + name + ")";
+ } else {
+ filter = "(" + "instance.name" + "=" + name + ")";
+ }
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return null;
+ } else {
+ return refs[0];
+ }
+ }
+
+ public static Object getServiceObject(BundleContext bc, String itf, String filter) {
+ ServiceReference ref = getServiceReference(bc, itf, filter);
+ if (ref != null) {
+ return bc.getService(ref);
+ } else {
+ return null;
+ }
+ }
+
+ public static Object[] getServiceObjects(BundleContext bc, String itf, String filter) {
+ ServiceReference[] refs = getServiceReferences(bc, itf, filter);
+ if (refs != null) {
+ Object[] list = new Object[refs.length];
+ for (int i = 0; i < refs.length; i++) {
+ list[i] = bc.getService(refs[i]);
+ }
+ return list;
+ } else {
+ return new Object[0];
+ }
+ }
+
+// public static ServiceContext getServiceContext(ComponentInstance ci) {
+// if (ci instanceof CompositeManager) {
+// return ((CompositeManager) ci).getServiceContext();
+// } else {
+// throw new RuntimeException("Cannot get the service context form an non composite instance");
+// }
+// }
+
+ public static Factory getFactoryByName(ServiceContext bc, String factoryName) {
+ ServiceReference[] refs;
+ try {
+ refs = bc.getServiceReferences(Factory.class.getName(), "(factory.name=" + factoryName + ")");
+ if (refs == null) { return null; }
+ return ((Factory) bc.getService(refs[0]));
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Cannot get the factory " + factoryName + " : " + e.getMessage());
+ return null;
+ }
+ }
+
+ public static ComponentInstance getComponentInstance(ServiceContext bc, String factoryName, Dictionary configuration) {
+ Factory fact = getFactoryByName(bc, factoryName);
+
+ if (fact == null) { return null; }
+
+ if (fact.isAcceptable(configuration)) {
+ try {
+ return fact.createComponentInstance(configuration);
+ } catch (Exception e) {
+ System.err.println(e.getMessage());
+ e.printStackTrace();
+ return null;
+ }
+ } else {
+ System.err.println("Configuration not accepted by : " + factoryName);
+ return null;
+ }
+ }
+
+ public static ServiceReference[] getServiceReferences(ServiceContext bc, String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return new ServiceReference[0];
+ } else {
+ return refs;
+ }
+ }
+
+ public static ServiceReference getServiceReference(ServiceContext bc, String itf, String filter) {
+ ServiceReference[] refs = null;
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return null;
+ } else {
+ return refs[0];
+ }
+ }
+
+ public static ServiceReference getServiceReferenceByName(ServiceContext bc, String itf, String name) {
+ ServiceReference[] refs = null;
+ String filter = null;
+ if (itf.equals(Factory.class.getName()) || itf.equals(ManagedServiceFactory.class.getName())) {
+ filter = "(" + "factory.name" + "=" + name + ")";
+ } else {
+ filter = "(" + "instance.name" + "=" + name + ")";
+ }
+ try {
+ refs = bc.getServiceReferences(itf, filter);
+ } catch (InvalidSyntaxException e) {
+ System.err.println("Invalid Filter : " + filter);
+ }
+ if (refs == null) {
+ return null;
+ } else {
+ return refs[0];
+ }
+ }
+
+ public static Object getServiceObject(ServiceContext bc, String itf, String filter) {
+ ServiceReference ref = getServiceReference(bc, itf, filter);
+ if (ref != null) {
+ return bc.getService(ref);
+ } else {
+ return null;
+ }
+ }
+
+ public static Object[] getServiceObjects(ServiceContext bc, String itf, String filter) {
+ ServiceReference[] refs = getServiceReferences(bc, itf, filter);
+ if (refs != null) {
+ Object[] list = new Object[refs.length];
+ for (int i = 0; i < refs.length; i++) {
+ list[i] = bc.getService(refs[i]);
+ }
+ return list;
+ } else {
+ return new Object[0];
+ }
+ }
+
+}
diff --git a/ipojo/tests/tests.core/src/main/resources/metadata.xml b/ipojo/tests/tests.core/src/main/resources/metadata.xml
new file mode 100644
index 0000000..4d6ff5e
--- /dev/null
+++ b/ipojo/tests/tests.core/src/main/resources/metadata.xml
@@ -0,0 +1,1105 @@
+<ipojo
+ xmlns:cs="org.apache.felix.ipojo.test.handler.CheckServiceHandler">
+ <component classname="org.apache.felix.ipojo.test.log.LogImpl"
+ factory="true" name="log">
+ <provides />
+ </component>
+
+ <!-- Component Types used inside tests -->
+ <!-- Service Providing -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="FooProviderType-1" architecture="true">
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="FooProviderType-1-Sing" factory-method="singleton"
+ architecture="true">
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="FooProviderType-1-Sev" factory-method="several"
+ architecture="true">
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="FooProviderType-1-SingM" factory-method="singleton"
+ architecture="true">
+ <provides factory="method" />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="FooProviderType-1-SevM" factory-method="several"
+ architecture="true">
+ <provides factory="method" />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ name="FooProviderType-2" architecture="true">
+ <provides>
+ <property name="int" type="int" value="2" />
+ <property name="long" type="long" value="40" />
+ <property name="string" type="java.lang.String" value="foo" />
+ <property name="strAProp" type="java.lang.String[]"
+ value="{foo, bar}" />
+ <property name="intAProp" type="int[]" value="{1,2,3}" />
+ </provides>
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderTypeDyn"
+ name="FooProviderType-Dyn" architecture="true">
+ <provides>
+ <property name="int" field="intProp" value="2" />
+ <property name="boolean" field="boolProp" value="false" />
+ <property name="string" field="strProp" value="foo" />
+ <property name="strAProp" field="strAProp"
+ value="{foo, bar}" />
+ <property name="intAProp" field="intAProp" value="{ 1,2,3}" />
+ </provides>
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderTypeDyn2"
+ name="FooProviderType-Dyn2" factory="true" architecture="true">
+ <provides>
+ <property name="int" field="intProp" value="4" />
+ <property name="boolean" field="boolProp" />
+ <property name="string" field="strProp" />
+ <property name="strAProp" field="strAProp" />
+ <property name="intAProp" field="intAProp"
+ value="{1, 2,3 }" />
+ </provides>
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderTypeDyn"
+ factory="FooProviderType-Conf" architecture="true">
+ <provides />
+ <properties propagation="false">
+ <property name="int" field="intProp" value="2" />
+ <property name="boolean" field="boolProp" value="false" />
+ <property name="string" field="strProp" value="foo" />
+ <property name="strAProp" field="strAProp"
+ value="{foo, bar}" />
+ <property name="intAProp" field="intAProp" value="{1,2, 3}" />
+ </properties>
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="FooProviderType-3" architecture="true">
+ <provides>
+ <property name="foo" field="m_foo" />
+ <property name="bar" field="m_bar" />
+ <property name="baz" type="java.lang.String" />
+ </provides>
+ <properties propagation="true">
+ <property name="foo" field="m_foo" />
+ <property name="bar" field="m_bar" />
+ </properties>
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="FooProviderType-itf" architecture="true">
+ <provides
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService" />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooBarProviderType1"
+ factory="FooBarProviderType-1" architecture="true">
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooBarProviderType1"
+ factory="FooBarProviderType-2" architecture="true">
+ <provides
+ interface="{org.apache.felix.ipojo.test.scenarios.service.FooService, org.apache.felix.ipojo.test.scenarios.service.BarService }" />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooBarProviderType1"
+ factory="FooBarProviderType-3" architecture="true">
+ <provides
+ interface="{org.apache.felix.ipojo.test.scenarios.service.FooService}">
+ <property name="baz" type="java.lang.String" value="foo" />
+ </provides>
+ <provides
+ interface="{org.apache.felix.ipojo.test.scenarios.service.BarService}">
+ <property name="baz" type="java.lang.String" value="bar" />
+ </provides>
+ </component>
+
+ <!-- Immediate Component -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="ImmediateFooProviderType" immediate="true"
+ architecture="true">
+ <provides />
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="ImmediateFooProviderTypeSingleton" immediate="true"
+ factory-method="singleton" architecture="true">
+ <provides />
+ </component>
+
+ <!-- Simple Filter Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FilterCheckProvider"
+ factory="SimpleFilterCheckServiceProvider" architecture="true">
+ <provides>
+ <property field="m_toto" name="toto" value="A" />
+ </provides>
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FilterCheckSubscriber"
+ factory="SimpleFilterCheckServiceSubscriber" architecture="true">
+ <requires field="m_foo" filter="(toto=B)" id="id1">
+ <callback type="bind" method="Bind" />
+ <callback type="unbind" method="Unbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FilterCheckSubscriber"
+ factory="SimpleFilterCheckServiceSubscriber2" architecture="true">
+ <requires field="m_foo" id="id2">
+ <callback type="bind" method="Bind" />
+ <callback type="unbind" method="Unbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <!-- Optional Simple Filter Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FilterCheckSubscriber"
+ factory="OptionalSimpleFilterCheckServiceSubscriber"
+ architecture="true">
+ <requires field="m_foo" filter="(toto=B)" id="id1"
+ optional="true">
+ <callback type="bind" method="Bind" />
+ <callback type="unbind" method="Unbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FilterCheckSubscriber"
+ factory="OptionalSimpleFilterCheckServiceSubscriber2"
+ architecture="true">
+ <requires field="m_foo" id="id2" optional="true">
+ <callback type="bind" method="Bind" />
+ <callback type="unbind" method="Unbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <!-- Aggregate filter Dependencies-->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleFilterCheckSubscriber"
+ factory="MultipleFilterCheckServiceSubscriber" architecture="true">
+ <requires field="m_foo" filter="(toto=B)" id="id1">
+ <callback type="bind" method="Bind" />
+ <callback type="unbind" method="Unbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleFilterCheckSubscriber"
+ factory="MultipleFilterCheckServiceSubscriber2" architecture="true">
+ <requires field="m_foo" id="id2">
+ <callback type="bind" method="Bind" />
+ <callback type="unbind" method="Unbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <!-- Optional Aggregate Filter Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleFilterCheckSubscriber"
+ factory="OptionalMultipleFilterCheckServiceSubscriber"
+ architecture="true">
+ <requires field="m_foo" filter="(toto=B)" id="id1"
+ optional="true">
+ <callback type="bind" method="Bind" />
+ <callback type="unbind" method="Unbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleFilterCheckSubscriber"
+ factory="OptionalMultipleFilterCheckServiceSubscriber2"
+ architecture="true">
+ <requires field="m_foo" id="id2" optional="true">
+ <callback type="bind" method="Bind" />
+ <callback type="unbind" method="Unbind" />
+ </requires>
+ <provides />
+ </component>
+
+
+ <!-- Simple Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="SimpleCheckServiceProvider" architecture="true">
+ <requires field="fs" />
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="VoidCheckServiceProvider" architecture="true">
+ <requires field="fs">
+ <callback type="bind" method="voidBind" />
+ <callback type="unbind" method="voidUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="ObjectCheckServiceProvider" architecture="true">
+ <requires field="fs">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="RefCheckServiceProvider" architecture="true">
+ <requires field="fs">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="BothCheckServiceProvider" architecture="true">
+ <requires field="fs">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="DoubleCheckServiceProvider" architecture="true">
+ <requires>
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <requires field="fs" />
+ <provides />
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="MObjectCheckServiceProvider" architecture="true">
+ <requires>
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="MRefCheckServiceProvider" architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="MBothCheckServiceProvider" architecture="true">
+ <requires>
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <!-- Simple & Optional Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="SimpleOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true" />
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="VoidOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true">
+ <callback type="bind" method="voidBind" />
+ <callback type="unbind" method="voidUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="ObjectOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="RefOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="BothOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="MObjectOptionalCheckServiceProvider" architecture="true">
+ <requires optional="true">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="MRefOptionalCheckServiceProvider" architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ optional="true">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="MBothOptionalCheckServiceProvider" architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ optional="true">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <!-- Simple & Optional Dependencies with default-implementation -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="DISimpleOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true"
+ default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl" />
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="DIVoidOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true"
+ default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">
+ <callback type="bind" method="voidBind" />
+ <callback type="unbind" method="voidUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="DIObjectOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true"
+ default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="DIRefOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true"
+ default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="DIBothOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true"
+ default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="DIMObjectOptionalCheckServiceProvider" architecture="true">
+ <requires optional="true"
+ default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="DIMRefOptionalCheckServiceProvider" architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ optional="true"
+ default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="DIMBothOptionalCheckServiceProvider" architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ optional="true"
+ default-implementation="org.apache.felix.ipojo.test.scenarios.component.FooServiceDefaultImpl">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <!-- Multiple Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="SimpleMultipleCheckServiceProvider" architecture="true">
+ <requires field="fs" />
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="VoidMultipleCheckServiceProvider" architecture="true">
+ <requires field="fs">
+ <callback type="bind" method="voidBind" />
+ <callback type="unbind" method="voidUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="ObjectMultipleCheckServiceProvider" architecture="true">
+ <requires field="fs">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="RefMultipleCheckServiceProvider" architecture="true">
+ <requires field="fs">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="BothMultipleCheckServiceProvider" architecture="true">
+ <requires field="fs">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"
+ factory="MObjectMultipleCheckServiceProvider" architecture="true">
+ <requires aggregate="true">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"
+ factory="MRefMultipleCheckServiceProvider" architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ aggregate="true">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"
+ factory="MBothMultipleCheckServiceProvider" architecture="true">
+ <requires aggregate="true">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <!-- Multiple & Optional Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="SimpleOptionalMultipleCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" optional="true" />
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="VoidOptionalMultipleCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" optional="true">
+ <callback type="bind" method="voidBind" />
+ <callback type="unbind" method="voidUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="ObjectOptionalMultipleCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" optional="true">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="RefOptionalMultipleCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" optional="true">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"
+ factory="MObjectOptionalMultipleCheckServiceProvider"
+ architecture="true">
+ <requires aggregate="true" optional="true">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"
+ factory="MRefOptionalMultipleCheckServiceProvider"
+ architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ aggregate="true" optional="true">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <!-- Static Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticSimpleCheckServiceProvider" architecture="true">
+ <requires field="fs" policy="static" />
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticVoidCheckServiceProvider" architecture="true">
+ <requires field="fs" policy="static">
+ <callback type="bind" method="voidBind" />
+ <callback type="unbind" method="voidUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticObjectCheckServiceProvider" architecture="true">
+ <requires field="fs" policy="static">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticRefCheckServiceProvider" architecture="true">
+ <requires field="fs" policy="static">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticBothCheckServiceProvider" architecture="true">
+ <requires field="fs" policy="static">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="StaticMObjectCheckServiceProvider" architecture="true">
+ <requires policy="static">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="StaticMRefCheckServiceProvider" architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ policy="static">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="StaticMBothCheckServiceProvider" architecture="true">
+ <requires policy="static">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+
+ <!-- Static Simple & Optional Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticSimpleOptionalCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" optional="true" policy="static" />
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticVoidOptionalCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" optional="true" policy="static">
+ <callback type="bind" method="voidBind" />
+ <callback type="unbind" method="voidUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticObjectOptionalCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" optional="true" policy="static">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticRefOptionalCheckServiceProvider" architecture="true">
+ <requires field="fs" optional="true" policy="static">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CheckServiceProvider"
+ factory="StaticBothOptionalCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" optional="true" policy="static">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="StaticMObjectOptionalCheckServiceProvider"
+ architecture="true">
+ <requires optional="true" policy="static">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="StaticMRefOptionalCheckServiceProvider"
+ architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ optional="true" policy="static">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodCheckServiceProvider"
+ factory="StaticMBothOptionalCheckServiceProvider"
+ architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ optional="true" policy="static">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <!-- Static Multiple Dependencies -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="StaticSimpleMultipleCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" policy="static" />
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="StaticVoidMultipleCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" policy="static">
+ <callback type="bind" method="voidBind" />
+ <callback type="unbind" method="voidUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="StaticObjectMultipleCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" policy="static">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="StaticRefMultipleCheckServiceProvider" architecture="true">
+ <requires field="fs" policy="static">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"
+ factory="StaticBothMultipleCheckServiceProvider"
+ architecture="true">
+ <requires field="fs" policy="static">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"
+ factory="StaticMObjectMultipleCheckServiceProvider"
+ architecture="true">
+ <requires aggregate="true" policy="static">
+ <callback type="bind" method="objectBind" />
+ <callback type="unbind" method="objectUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"
+ factory="StaticMRefMultipleCheckServiceProvider"
+ architecture="true">
+ <requires
+ interface="org.apache.felix.ipojo.test.scenarios.service.FooService"
+ aggregate="true" policy="static">
+ <callback type="bind" method="refBind" />
+ <callback type="unbind" method="refUnbind" />
+ </requires>
+ <provides />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.MethodMultipleCheckService"
+ factory="StaticMBothMultipleCheckServiceProvider"
+ architecture="true">
+ <requires aggregate="true" policy="static">
+ <callback type="bind" method="bothBind" />
+ <callback type="unbind" method="bothUnbind" />
+ </requires>
+ <provides />
+ </component>
+
+
+ <!-- Lifecycle Callback -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CallbackCheckService"
+ factory="CallbackCheckService" architecture="true">
+ <requires field="fs" />
+ <provides />
+ <callback transition="validate" method="start" />
+ <callback transition="invalidate" method="stop" />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CallbackCheckService"
+ factory="ParentCallbackCheckService" architecture="true">
+ <requires field="fs" />
+ <provides />
+ <callback transition="validate" method="parentStart" />
+ <callback transition="invalidate" method="parentStop" />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CallbackCheckService"
+ immediate="true" factory="ImmediateCallbackCheckService"
+ architecture="true">
+ <requires field="fs" />
+ <provides />
+ <callback transition="validate" method="start" />
+ <callback transition="invalidate" method="stop" />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CallbackCheckService"
+ immediate="true" factory="ImmediateCallbackCheckServiceSingleton"
+ factory-method="singleton" architecture="true">
+ <requires field="fs" />
+ <provides />
+ <callback transition="validate" method="start" />
+ <callback transition="invalidate" method="stop" />
+ </component>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.CallbackCheckService"
+ immediate="true" factory="ImmediateCallbackCheckServiceSeveral"
+ factory-method="several" architecture="true">
+ <requires field="fs" />
+ <provides />
+ <callback transition="validate" method="start" />
+ <callback transition="invalidate" method="stop" />
+ </component>
+
+ <!-- Manipulation -->
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.Manipulation23Tester"
+ factory="PrimitiveManipulationTester" architecture="true">
+ <provides />
+ </component>
+
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.A123.Manipulation23Tester"
+ factory="PrimitiveManipulationTesterA" architecture="true">
+ <provides />
+ </component>
+
+ <!-- Configuration Management Test -->
+ <component factory="FieldConfigurableCheckService"
+ className="org.apache.felix.ipojo.test.scenarios.component.ConfigurableCheckServiceProvider"
+ architecture="true">
+ <provides />
+ <properties propagation="true">
+ <property field="b" />
+ <property field="s" />
+ <property field="i" />
+ <property field="l" />
+ <property field="d" />
+ <property field="f" />
+ <property field="c" />
+ <property field="bool" />
+ <property field="bs" />
+ <property field="ss" />
+ <property field="is" />
+ <property field="ls" />
+ <property field="ds" />
+ <property field="fs" />
+ <property field="cs" />
+ <property field="bools" />
+ <property field="string" />
+ <property field="strings" />
+ </properties>
+ </component>
+
+ <component factory="BothConfigurableCheckService"
+ className="org.apache.felix.ipojo.test.scenarios.component.ConfigurableCheckServiceProvider"
+ architecture="true">
+ <provides />
+ <properties propagation="true">
+ <property field="b" method="updateB" />
+ <property field="s" method="updateS" />
+ <property field="i" method="updateI" />
+ <property field="l" method="updateL" />
+ <property field="d" method="updateD" />
+ <property field="f" method="updateF" />
+ <property field="c" method="updateC" />
+ <property field="bool" method="updateBool" />
+ <property field="bs" method="updateBs" />
+ <property field="ss" method="updateSs" />
+ <property field="is" method="updateIs" />
+ <property field="ls" method="updateLs" />
+ <property field="ds" method="updateDs" />
+ <property field="fs" method="updateFs" />
+ <property field="cs" method="updateCs" />
+ <property field="bools" method="updateBools" />
+ <property field="string" method="updateString" />
+ <property field="strings" method="updateStrings" />
+ </properties>
+ </component>
+
+ <component factory="MethodConfigurableCheckService"
+ className="org.apache.felix.ipojo.test.scenarios.component.ConfigurableCheckServiceProvider"
+ architecture="true">
+ <provides />
+ <properties propagation="true">
+ <property method="updateB" name="b" />
+ <property method="updateS" name="s" />
+ <property method="updateI" name="i" />
+ <property method="updateL" name="l" />
+ <property method="updateD" name="d" />
+ <property method="updateF" name="f" />
+ <property method="updateC" name="c" />
+ <property method="updateBool" name="bool" />
+ <property method="updateBs" name="bs" />
+ <property method="updateSs" name="ss" />
+ <property method="updateIs" name="is" />
+ <property method="updateLs" name="ls" />
+ <property method="updateDs" name="ds" />
+ <property method="updateFs" name="fs" />
+ <property method="updateCs" name="cs" />
+ <property method="updateBools" name="bools" />
+ <property method="updateString" name="string" />
+ <property method="updateStrings" name="strings" />
+ </properties>
+ </component>
+
+ <component factory="ParentMethodConfigurableCheckService"
+ className="org.apache.felix.ipojo.test.scenarios.component.ParentConfigurableCheckServiceProvider"
+ architecture="true">
+ <provides />
+ <properties propagation="true">
+ <property method="updateB" name="b" />
+ <property method="updateS" name="s" />
+ <property method="updateI" name="i" />
+ <property method="updateL" name="l" />
+ <property method="updateD" name="d" />
+ <property method="updateF" name="f" />
+ <property method="updateC" name="c" />
+ <property method="updateBool" name="bool" />
+ <property method="updateBs" name="bs" />
+ <property method="updateSs" name="ss" />
+ <property method="updateIs" name="is" />
+ <property method="updateLs" name="ls" />
+ <property method="updateDs" name="ds" />
+ <property method="updateFs" name="fs" />
+ <property method="updateCs" name="cs" />
+ <property method="updateBools" name="bools" />
+ <property method="updateString" name="string" type="string" />
+ <property method="updateStrings" name="strings"
+ type="java.lang.String[]" />
+ </properties>
+ </component>
+
+ <!-- Handler test -->
+ <handler
+ classname="org.apache.felix.ipojo.test.handler.CheckServiceHandler"
+ name="check"
+ namespace="org.apache.felix.ipojo.test.handler.CheckServiceHandler"
+ architecture="false">
+ <controller field="isValid" />
+ </handler>
+ <component
+ className="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"
+ factory="HandlerTester" architecture="true">
+ <cs:check />
+ </component>
+ <instance name="HandlerTest-2" component="HandlerTester">
+ <property name="csh.simple" value="Simple" />
+ <property name="csh.map">
+ <property name="a" value="a" />
+ <property name="b" value="b" />
+ <property name="c" value="c" />
+ </property>
+ </instance>
+
+ <!-- Test lifecycle controller -->
+ <component
+ classname="org.apache.felix.ipojo.test.scenarios.component.LifecycleControllerTest"
+ name="lcTest">
+ <provides />
+ <controller field="m_state" />
+ <properties>
+ <property name="conf" field="m_conf" method="setConf" />
+ </properties>
+ </component>
+
+ <component
+ classname="org.apache.felix.ipojo.test.scenarios.component.LifecycleControllerTest"
+ name="lcTest2" immediate="true" architecture="true">
+ <provides />
+ <controller field="m_state" />
+ <properties>
+ <property name="conf" field="m_conf" method="setConf" />
+ </properties>
+ </component>
+
+ <!-- Inherited Provides -->
+ <component
+ classname="org.apache.felix.ipojo.test.scenarios.component.inherited.ProcessImplementation1"
+ name="PI1" architecture="true">
+ <provides />
+ </component>
+
+ <component
+ classname="org.apache.felix.ipojo.test.scenarios.component.inherited.ProcessImplementation1"
+ name="PI1-1" architecture="true">
+ <provides
+ interface="org.apache.felix.ipojo.test.scenarios.service.ParentParentInterface" />
+ </component>
+
+ <component
+ classname="org.apache.felix.ipojo.test.scenarios.component.inherited.ProcessImplementation1"
+ name="PI1-2" architecture="true">
+ <provides
+ interface="{org.apache.felix.ipojo.test.scenarios.service.ParentParentInterface, org.apache.felix.ipojo.test.scenarios.service.ParentInterface2}" />
+ </component>
+
+ <component
+ classname="org.apache.felix.ipojo.test.scenarios.component.inherited.ProcessImplementation2"
+ name="PI2" architecture="true">
+ <provides />
+ </component>
+
+ <component
+ classname="org.apache.felix.ipojo.test.scenarios.component.inherited.ProcessImplementation2"
+ name="PI2-1" architecture="true">
+ <provides
+ interface="org.apache.felix.ipojo.test.scenarios.service.ParentParentInterface" />
+ </component>
+
+ <component
+ classname="org.apache.felix.ipojo.test.scenarios.component.inherited.ProcessImplementation3"
+ name="PI3" architecture="true">
+ <provides />
+ </component>
+
+ <instance component="log" name="MyLogger" />
+</ipojo>
diff --git a/ipojo/white.board.pattern.handler/metadata.xml b/ipojo/white.board.pattern.handler/metadata.xml
new file mode 100644
index 0000000..75de2bb
--- /dev/null
+++ b/ipojo/white.board.pattern.handler/metadata.xml
@@ -0,0 +1,6 @@
+<ipojo>
+ <handler
+ classname="org.apache.felix.ipojo.handler.wbp.WhiteBoardPatternHandler"
+ name="wbp" namespace="org.apache.felix.ipojo.white-board-pattern">
+ </handler>
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/white.board.pattern.handler/pom.xml b/ipojo/white.board.pattern.handler/pom.xml
new file mode 100644
index 0000000..ccbe8ac
--- /dev/null
+++ b/ipojo/white.board.pattern.handler/pom.xml
@@ -0,0 +1,91 @@
+<!--
+ 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.
+-->
+<project>
+ <parent>
+ <artifactId>iPOJO</artifactId>
+ <groupId>org.apache.felix</groupId>
+ <version>0.7.6-SNAPSHOT</version>
+ <relativePath>../pom.xml</relativePath>
+ </parent>
+ <modelVersion>4.0.0</modelVersion>
+ <packaging>bundle</packaging>
+ <name>Apache Felix iPOJO White Board Pattern Handler</name>
+ <artifactId>
+ org.apache.felix.ipojo.handler.white.board.pattern
+ </artifactId>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+ <version>${pom.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.core</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>org.osgi.compendium</artifactId>
+ <version>1.0.0</version>
+ </dependency>
+ </dependencies>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <extensions>true</extensions>
+ <configuration>
+ <instructions>
+ <Private-Package>
+ org.apache.felix.ipojo.handler.wbp
+ </Private-Package>
+ <Bundle-Name>${pom.name}</Bundle-Name>
+ <Bundle-SymbolicName>
+ ipojo.event.admin.handler.wbp
+ </Bundle-SymbolicName>
+ </instructions>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-ipojo-plugin</artifactId>
+ <version>${pom.version}</version>
+ <executions>
+ <execution>
+ <goals>
+ <goal>ipojo-bundle</goal>
+ </goals>
+ <configuration>
+ <metadata>metadata.xml</metadata>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+</project>
diff --git a/ipojo/white.board.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java b/ipojo/white.board.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
new file mode 100644
index 0000000..d0206b5
--- /dev/null
+++ b/ipojo/white.board.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardManager.java
@@ -0,0 +1,173 @@
+/*
+ * 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.handler.wbp;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.util.Callback;
+import org.apache.felix.ipojo.util.Tracker;
+import org.apache.felix.ipojo.util.TrackerCustomizer;
+import org.osgi.framework.Filter;
+import org.osgi.framework.ServiceReference;
+
+/**
+ * Manage a white board pattern.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class WhiteBoardManager implements TrackerCustomizer {
+
+ /**
+ * monitored filter.
+ */
+ private Filter m_filter;
+
+ /**
+ * onArrival method.
+ */
+ private Callback m_onArrival;
+
+ /**
+ * onDeparture method.
+ */
+ private Callback m_onDeparture;
+
+ /**
+ * onModify method.
+ */
+ private Callback m_onModification;
+
+ /**
+ * Service Tracker.
+ */
+ private Tracker m_tracker;
+
+ /**
+ * Attached handler.
+ */
+ private PrimitiveHandler m_handler;
+
+ /**
+ * Constructor.
+ * @param handler : attached handler
+ * @param filter : monitored filter
+ * @param bind : onArrival method
+ * @param unbind : onDeparture method
+ * @param modification : onModify method
+ */
+ public WhiteBoardManager(WhiteBoardPatternHandler handler, Filter filter, String bind, String unbind, String modification) {
+ m_handler = handler;
+ m_onArrival = new Callback(bind, new Class[] {ServiceReference.class}, false, m_handler.getInstanceManager());
+ m_onDeparture = new Callback(unbind, new Class[] {ServiceReference.class}, false, m_handler.getInstanceManager());
+ if (modification != null) {
+ m_onModification = new Callback(modification, new Class[] {ServiceReference.class}, false, m_handler.getInstanceManager());
+ }
+ m_filter = filter;
+ m_tracker = new Tracker(handler.getInstanceManager().getContext(), m_filter, this);
+ }
+
+ /**
+ * Open the tracker.
+ */
+ public void start() {
+ m_tracker.open();
+ }
+
+ /**
+ * Close the tracker.
+ */
+ public void stop() {
+ m_tracker.close();
+ }
+
+ /**
+ * A new service was added to the tracker.
+ * @param arg0 : service reference.
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addedService(org.osgi.framework.ServiceReference)
+ */
+ public void addedService(ServiceReference arg0) {
+ try {
+ m_onArrival.call(new Object[] {arg0});
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The onArrival method " + m_onArrival.getMethod() + " does not exist in the class", e);
+ m_handler.getInstanceManager().stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The onArrival method " + m_onArrival.getMethod() + " cannot be invoked", e);
+ m_handler.getInstanceManager().stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The onArrival method " + m_onArrival.getMethod() + " has thrown an exception", e.getTargetException());
+ m_handler.getInstanceManager().stop();
+ }
+ }
+
+ /**
+ * A new service is detected.
+ * @param arg0 : service reference
+ * @return true to add the service
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#addingService(org.osgi.framework.ServiceReference)
+ */
+ public boolean addingService(ServiceReference arg0) {
+ return true;
+ }
+
+ /**
+ * An existing service was modified.
+ * @param arg0 : service reference
+ * @param arg1 : service object (if already get)
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#modifiedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void modifiedService(ServiceReference arg0, Object arg1) {
+ if (m_onModification != null) {
+ try {
+ m_onModification.call(new Object[] {arg0});
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The onModification method " + m_onModification.getMethod() + " does not exist in the class", e);
+ m_handler.getInstanceManager().stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The onModification method " + m_onModification.getMethod() + " cannot be invoked", e);
+ m_handler.getInstanceManager().stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The onModification method " + m_onModification.getMethod() + " has thrown an exception", e.getTargetException());
+ m_handler.getInstanceManager().stop();
+ }
+ }
+ }
+
+ /**
+ * A service disappears.
+ * @param arg0 : service reference
+ * @param arg1 : service object (if already get)
+ * @see org.apache.felix.ipojo.util.TrackerCustomizer#removedService(org.osgi.framework.ServiceReference, java.lang.Object)
+ */
+ public void removedService(ServiceReference arg0, Object arg1) {
+ try {
+ m_onDeparture.call(new Object[] {arg0});
+ } catch (NoSuchMethodException e) {
+ m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " does not exist in the class", e);
+ m_handler.getInstanceManager().stop();
+ } catch (IllegalAccessException e) {
+ m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " cannot be invoked", e);
+ m_handler.getInstanceManager().stop();
+ } catch (InvocationTargetException e) {
+ m_handler.error("The onDeparture method " + m_onDeparture.getMethod() + " has thrown an exception", e.getTargetException());
+ m_handler.getInstanceManager().stop();
+ }
+ }
+
+}
diff --git a/ipojo/white.board.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java b/ipojo/white.board.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
new file mode 100644
index 0000000..4fb735b
--- /dev/null
+++ b/ipojo/white.board.pattern.handler/src/main/java/org/apache/felix/ipojo/handler/wbp/WhiteBoardPatternHandler.java
@@ -0,0 +1,99 @@
+/*
+ * 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.handler.wbp;
+
+import java.util.ArrayList;
+import java.util.Dictionary;
+import java.util.List;
+
+import org.apache.felix.ipojo.ConfigurationException;
+import org.apache.felix.ipojo.PrimitiveHandler;
+import org.apache.felix.ipojo.metadata.Element;
+import org.osgi.framework.InvalidSyntaxException;
+
+/**
+ * White board pattern handler.
+ * This handler aims to automate white board patterns by invoking callback when needed.
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class WhiteBoardPatternHandler extends PrimitiveHandler {
+
+ /**
+ * Handler namespace.
+ */
+ public static final String NAMESPACE = "org.apache.felix.ipojo.white-board-pattern";
+
+ /**
+ * White board pattern to manage. By default just one.
+ */
+ private List m_managers = new ArrayList(1);
+
+ /**
+ * Configure method. It will parse metadata to analyze org.apache.felix.ipojo.white-board-pattern:wbp element.
+ * @param elem : component type description
+ * @param dict : instance description
+ * @throws ConfigurationException : occurs when the description is not valid.
+ * @see org.apache.felix.ipojo.Handler#configure(org.apache.felix.ipojo.metadata.Element, java.util.Dictionary)
+ */
+ public void configure(Element elem, Dictionary dict) throws ConfigurationException {
+ Element[] elems = elem.getElements("wbp", NAMESPACE);
+ for (int i = 0; i < elems.length; i++) {
+ String filter = elems[i].getAttribute("filter");
+ String onArrival = elems[i].getAttribute("onArrival");
+ String onDeparture = elems[i].getAttribute("onDeparture");
+ String onModification = elems[i].getAttribute("onModification");
+
+ if (filter == null) {
+ throw new ConfigurationException("The white board pattern element requires a filter attribute");
+ }
+ if (onArrival == null || onDeparture == null) {
+ throw new ConfigurationException("The white board pattern element requires the onArrival and onDeparture attributes");
+ }
+
+ try {
+ WhiteBoardManager wbm = new WhiteBoardManager(this, getInstanceManager().getContext().createFilter(filter), onArrival, onDeparture, onModification);
+ m_managers.add(wbm);
+ } catch (InvalidSyntaxException e) {
+ throw new ConfigurationException("The filter " + filter + " is invalid : " + e);
+ }
+ }
+
+ }
+
+ /**
+ * Start method : start managers.
+ * @see org.apache.felix.ipojo.Handler#start()
+ */
+ public void start() {
+ for (int i = 0; i < m_managers.size(); i++) {
+ ((WhiteBoardManager) m_managers.get(i)).start();
+ }
+ }
+
+ /**
+ * Stop method : stop managers.
+ * @see org.apache.felix.ipojo.Handler#stop()
+ */
+ public void stop() {
+ for (int i = 0; i < m_managers.size(); i++) {
+ ((WhiteBoardManager) m_managers.get(i)).stop();
+ }
+ }
+
+}