Updates the test suite:
- the manipulation test suite was split into 4 bundles in order to reduce the bundle size (for the MIKA VM).
- a test suite for Java 5 was created. This test suite focus on Java 5 specific features (annotation, auto-boxing, new inheritance features ...)
- a temporal test suite was improved to assert waiting time
- the configuration admin test suite was improved to test the integration with Equinox Configuration Admin and KF2 Configuration Admin (as well as the Felix configuration admin)
Those tests contain test about the Felix-739 issue

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@701978 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/tests/manipulator/metadata/pom.xml b/ipojo/tests/manipulator/metadata/pom.xml
new file mode 100644
index 0000000..086ef47
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/pom.xml
@@ -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.

+-->

+<project>

+	<modelVersion>4.0.0</modelVersion>

+	<packaging>bundle</packaging>

+	<name>iPOJO Manipulation Metadata Test Suite</name>

+	<artifactId>tests.manipulation.metadata</artifactId>

+	<groupId>ipojo.tests</groupId>

+	<version>0.9.0-SNAPSHOT</version>

+	<dependencies>

+		<dependency>

+			<groupId>org.apache.felix</groupId>

+			<artifactId>org.apache.felix.ipojo</artifactId>

+			<version>0.9.0-SNAPSHOT</version>

+		</dependency>

+		<dependency>

+			<groupId>org.apache.felix</groupId>

+			<artifactId>org.apache.felix.ipojo.metadata</artifactId>

+			<version>0.9.0-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.9.0-SNAPSHOT</version>

+		</dependency>

+	</dependencies>

+	<build>

+		<plugins>

+			<plugin>

+				<groupId>org.apache.felix</groupId>

+				<artifactId>maven-bundle-plugin</artifactId>

+				<version>1.4.2</version>

+				<extensions>true</extensions>

+				<configuration>

+					<instructions>

+						<Export-Package>

+							org.apache.felix.ipojo.test.scenarios.manipulation.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.scenarios.manipulation.ManipulationTestSuite

+						</Test-Suite>

+					</instructions>

+				</configuration>

+			</plugin>

+			<plugin>

+				<groupId>org.apache.felix</groupId>

+				<artifactId>maven-ipojo-plugin</artifactId>

+				<version>0.9.0-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.4</source>

+					<target>1.4</target>

+				</configuration>

+			</plugin>

+		</plugins>

+	</build>

+</project>

diff --git a/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooBarProviderType1.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooBarProviderType1.java
new file mode 100644
index 0000000..e49ede4
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/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.manipulation.service.BarService;

+import org.apache.felix.ipojo.test.scenarios.manipulation.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/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderType1.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderType1.java
new file mode 100644
index 0000000..eec3052
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/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.manipulation.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/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderTypeDyn.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/FooProviderTypeDyn.java
new file mode 100644
index 0000000..d5a9c87
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/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.manipulation.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/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Manipulation23Tester.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/Manipulation23Tester.java
new file mode 100644
index 0000000..fb273c5
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/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.manipulation.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/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MultipleCheckService.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/component/MultipleCheckService.java
new file mode 100644
index 0000000..79dc2ef
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/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.manipulation.service.CheckService;

+import org.apache.felix.ipojo.test.scenarios.manipulation.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/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadata.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadata.java
new file mode 100644
index 0000000..f1a0e39
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadata.java
@@ -0,0 +1,239 @@
+/* 

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * 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.manipulation.service.BarService;

+import org.apache.felix.ipojo.test.scenarios.manipulation.service.FooService;

+

+/**

+ * Check manipulation metadata written in the manifest.

+ */

+public class ManipulationMetadata extends OSGiTestCase {

+

+	public void testGetMetadata() {

+		String header = (String) context.getBundle().getHeaders().get("iPOJO-Components");

+		Element elem = null;

+		try {

+			elem = ManifestMetadataParser.parseHeaderMetadata(header);

+		} catch (ParseException e) {

+			fail("Parse Exception when parsing iPOJO-Component");

+		}

+		

+		assertNotNull("Check elem not null", elem);

+		

+		Element manip = getManipulationForComponent(elem, "ManipulationMetadata-FooProviderType-1");

+		assertNotNull("Check manipulation metadata not null for " + "FooProviderType-1", manip);

+	}

+	

+	public void testInterface() {

+		String comp_name = "ManipulationMetadata-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 = "ManipulationMetadata-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 = "ManipulationMetadata-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 = "ManipulationMetadata-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 = "ManipulationMetadata-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 = "ManipulationMetadata-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 = "ManipulationMetadata-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.parseHeaderMetadata(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/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadataAPI.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadataAPI.java
new file mode 100644
index 0000000..cdb9c94
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationMetadataAPI.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.manipulation;

+

+import org.apache.felix.ipojo.ConfigurationException;

+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.manipulation.service.BarService;

+import org.apache.felix.ipojo.test.scenarios.manipulation.service.FooService;

+

+public class ManipulationMetadataAPI extends OSGiTestCase {

+    

+    PojoMetadata FooProviderType1, FooBarProviderType1, FooProviderTypeDyn, PrimitiveManipulationTester, SimpleMultipleCheckServiceProvider;

+

+	public void setUp() {

+        String comp_name = "ManipulationMetadata-FooProviderType-1";

+        FooProviderType1 = getManipulationMetadataForComponent(comp_name);

+        

+        comp_name = "ManipulationMetadata-FooBarProviderType-1";

+        FooBarProviderType1 = getManipulationMetadataForComponent(comp_name);

+        

+        comp_name = "ManipulationMetadata-FooProviderType-Dyn";

+        FooProviderTypeDyn = getManipulationMetadataForComponent(comp_name);

+

+        comp_name = "ManipulationMetadata-PrimitiveManipulationTester";

+        PrimitiveManipulationTester = getManipulationMetadataForComponent(comp_name);

+        

+        comp_name = "ManipulationMetadata-SimpleMultipleCheckServiceProvider";

+        SimpleMultipleCheckServiceProvider = getManipulationMetadataForComponent(comp_name);

+	}

+	

+	public void testGetMetadata() {

+		String header = (String) context.getBundle().getHeaders().get("iPOJO-Components");

+		Element elem = null;

+		try {

+			elem = ManifestMetadataParser.parseHeaderMetadata(header);

+		} catch (ParseException e) {

+			fail("Parse Exception when parsing iPOJO-Component");

+		}

+		

+		assertNotNull("Check elem not null", elem);

+		

+		Element manip = getMetadataForComponent(elem, "ManipulationMetadata-FooProviderType-1");

+        assertNotNull("Check manipulation metadata not null for " + "Manipulation-FooProviderType-1", manip);

+        PojoMetadata mm;

+        try {

+            mm = new PojoMetadata(manip);

+            assertNotNull("Check mm not null", mm);

+        } catch (ConfigurationException e) {

+            fail("The creation of pojo metadata has failed");

+        }

+	}

+	

+	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.parseHeaderMetadata(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);

+        try {

+            return new PojoMetadata(manip);

+        } catch (ConfigurationException e) {

+            fail("The creation of pojo metadata for " + comp_name + " has failed");

+            return null;

+        }

+    }	

+

+}

diff --git a/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationTestSuite.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationTestSuite.java
new file mode 100644
index 0000000..c782bbc
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/ManipulationTestSuite.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.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 Metadata Test Suite", bc);

+		ots.addTestSuite(ManipulationMetadata.class);

+        ots.addTestSuite(ManipulationMetadataAPI.class);

+		return ots;

+	}

+

+}

diff --git a/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/A123/CheckService2.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/A123/CheckService2.java
new file mode 100644
index 0000000..5f5b74b
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/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.manipulation.service.A123;

+

+public interface CheckService2 {

+	

+	public boolean check();

+

+}

diff --git a/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/BarService.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/BarService.java
new file mode 100644
index 0000000..dfe2b9c
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/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.manipulation.service;

+

+import java.util.Properties;

+

+public interface BarService {

+	

+	public boolean bar();

+	

+	public Properties getProps();

+

+}

diff --git a/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/CheckService.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/CheckService.java
new file mode 100644
index 0000000..ef7e1ee
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/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.manipulation.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/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/FooService.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/FooService.java
new file mode 100644
index 0000000..f1e8dc0
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/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.manipulation.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/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/Plop.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/Plop.java
new file mode 100644
index 0000000..1bb177c
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/Plop.java
@@ -0,0 +1,7 @@
+package org.apache.felix.ipojo.test.scenarios.manipulation.service;
+
+public interface Plop {
+    
+   Object getPlop();
+
+}
diff --git a/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/PrimitiveManipulationTestService.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/service/PrimitiveManipulationTestService.java
new file mode 100644
index 0000000..cd61e3b
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/manipulation/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.manipulation.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/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
new file mode 100644
index 0000000..bcec3d5
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/java/org/apache/felix/ipojo/test/scenarios/util/Utils.java
@@ -0,0 +1,329 @@
+/* 

+ * Licensed to the Apache Software Foundation (ASF) under one

+ * or more contributor license agreements.  See the NOTICE file

+ * distributed with this work for additional information

+ * regarding copyright ownership.  The ASF licenses this file

+ * to you under the Apache License, Version 2.0 (the

+ * "License"); you may not use this file except in compliance

+ * with the License.  You may obtain a copy of the License at

+ *

+ *   http://www.apache.org/licenses/LICENSE-2.0

+ *

+ * Unless required by applicable law or agreed to in writing,

+ * software distributed under the License is distributed on an

+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY

+ * 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.HandlerManagerFactory;

+import org.apache.felix.ipojo.ServiceContext;

+import org.apache.felix.ipojo.architecture.Architecture;

+//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 HandlerManagerFactory 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 (HandlerManagerFactory) 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) {

+            e.printStackTrace();

+            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("instance.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 if (itf.equals(Architecture.class.getName())) {

+            filter = "(" + "architecture.instance" + "=" + 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 ServiceReference getServiceReferenceByPID(BundleContext bc, String itf, String pid) {

+        ServiceReference[] refs = null;

+        String filter = "(" + "service.pid" + "=" + pid + ")";

+        try {

+            refs = bc.getServiceReferences(itf, filter);

+        } catch (InvalidSyntaxException e) {

+            System.err.println("Invalid Filter : " + filter);

+        }

+        if (refs == null) {

+            return null;

+        } else if (refs.length == 1) {

+            return refs[0];

+        } else {

+            Assert.fail("A service lookup by PID returned several providers (" + refs.length + ")" + " for " + itf + " with " + pid);

+            return null;

+        }

+    }

+

+    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];

+        }

+    }

+    

+    public static boolean contains(String string, String[] array) {

+        for (int i = 0; array != null && i < array.length; i++) {

+            if (array[i] != null  && array[i].equals(string)) {

+                return true;

+            }

+        }

+        return false;

+    }

+    

+    public static boolean contains(int value, int[] array) {

+        for (int i = 0; array != null && i < array.length; i++) {

+            if (array[i] == value) {

+                return true;

+            }

+        }

+        return false;

+    }

+

+}

diff --git a/ipojo/tests/manipulator/metadata/src/main/resources/metadata.xml b/ipojo/tests/manipulator/metadata/src/main/resources/metadata.xml
new file mode 100644
index 0000000..5653b3a
--- /dev/null
+++ b/ipojo/tests/manipulator/metadata/src/main/resources/metadata.xml
@@ -0,0 +1,48 @@
+<ipojo

+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

+    xsi:schemaLocation="org.apache.felix.ipojo http://people.apache.org/~clement/ipojo/schemas/core.xsd"

+    xmlns="org.apache.felix.ipojo"

+>

+	<!-- Simple provider  used for manipulation analysis -->

+	<component

+		classname="org.apache.felix.ipojo.test.scenarios.component.FooProviderType1"

+		name="ManipulationMetadata-FooProviderType-1" architecture="true">

+		<provides />

+	</component>

+	

+	<!-- Provider providing 2 services -->

+	<component

+		classname="org.apache.felix.ipojo.test.scenarios.component.FooBarProviderType1"

+		name="ManipulationMetadata-FooBarProviderType-1" architecture="true">

+		<provides />

+	</component>

+	

+	<!-- Provider with dynamic property -->

+	<component

+		classname="org.apache.felix.ipojo.test.scenarios.component.FooProviderTypeDyn"

+		name="ManipulationMetadata-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>

+	

+	<!-- Manipulation -->

+	<component

+		classname="org.apache.felix.ipojo.test.scenarios.component.Manipulation23Tester"

+		name="ManipulationMetadata-PrimitiveManipulationTester" architecture="true">

+		<provides />

+	</component>

+

+	

+	<component

+		classname="org.apache.felix.ipojo.test.scenarios.component.MultipleCheckService"

+		name="ManipulationMetadata-SimpleMultipleCheckServiceProvider" architecture="true">

+		<requires field="fs" />

+		<provides />

+	</component>

+</ipojo>