FELIX-3976 - Move the online manipulator out of the core bundle
 
FELIX-3903 - Migrate tests to pax exam 3 : migrate the online-manipulator tests to pax exam 3



git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1458665 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/manipulator/manipulator-it/pom.xml b/ipojo/manipulator/manipulator-it/pom.xml
index 17dff4e..f0a7f4a 100644
--- a/ipojo/manipulator/manipulator-it/pom.xml
+++ b/ipojo/manipulator/manipulator-it/pom.xml
@@ -180,6 +180,12 @@
             <version>1.9.0-SNAPSHOT</version>
         </dependency>
 
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.ipojo.manipulator.online</artifactId>
+            <version>1.9.0-SNAPSHOT</version>
+        </dependency>
+
         <!-- End of tested version -->
 
         <dependency>
diff --git a/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/pom.xml b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/pom.xml
new file mode 100644
index 0000000..6b0e681
--- /dev/null
+++ b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/pom.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~ http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT 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>org.apache.felix.ipojo.manipulator.manipulator-it</artifactId>
+        <version>1.9.0-SNAPSHOT</version>
+        <relativePath>../../../pom.xml</relativePath>
+    </parent>
+
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>ipojo-online-manipulator-test</artifactId>
+
+    <name>${project.artifactId}</name>
+
+</project>
\ No newline at end of file
diff --git a/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/java/org/apache/felix/ipojo/test/online/components/Consumer.java b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/java/org/apache/felix/ipojo/test/online/components/Consumer.java
new file mode 100644
index 0000000..0549286
--- /dev/null
+++ b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/java/org/apache/felix/ipojo/test/online/components/Consumer.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.online.components;
+
+import org.apache.felix.ipojo.annotations.Component;
+import org.apache.felix.ipojo.annotations.Requires;
+import org.apache.felix.ipojo.test.online.services.Hello;
+
+@Component
+public class Consumer {
+    
+    @Requires
+    private Hello hello;
+    
+    public Consumer() {
+        System.out.println(hello.sayHello());
+    }
+
+}
diff --git a/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/java/org/apache/felix/ipojo/test/online/components/MyProvider.java b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/java/org/apache/felix/ipojo/test/online/components/MyProvider.java
new file mode 100644
index 0000000..d2ef530
--- /dev/null
+++ b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/java/org/apache/felix/ipojo/test/online/components/MyProvider.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.online.components;
+
+
+import org.apache.felix.ipojo.test.online.services.Hello;
+
+public class MyProvider implements Hello {
+    
+    public String sayHello() {
+        return "Hello";
+    }
+
+}
diff --git a/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/java/org/apache/felix/ipojo/test/online/services/Hello.java b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/java/org/apache/felix/ipojo/test/online/services/Hello.java
new file mode 100644
index 0000000..a58fb1f
--- /dev/null
+++ b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/java/org/apache/felix/ipojo/test/online/services/Hello.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * 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.online.services;
+
+public interface Hello {
+    
+    public String sayHello();
+
+}
diff --git a/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/resources/consumer.xml b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/resources/consumer.xml
new file mode 100644
index 0000000..a78ad3c
--- /dev/null
+++ b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/resources/consumer.xml
@@ -0,0 +1,22 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~ http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+
+<ipojo>
+<instance component="org.apache.felix.ipojo.test.online.components.Consumer"/>
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/resources/provider.xml b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/resources/provider.xml
new file mode 100644
index 0000000..593779f
--- /dev/null
+++ b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/main/resources/provider.xml
@@ -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.
+  -->
+
+<ipojo>
+<component classname="org.apache.felix.ipojo.test.online.components.MyProvider">
+	<provides/>
+</component>
+<instance component="org.apache.felix.ipojo.test.online.components.MyProvider"/>
+</ipojo>
\ No newline at end of file
diff --git a/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/test/java/org/apache/felix/ipojo/test/online/OnlineManipulatorTest.java b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/test/java/org/apache/felix/ipojo/test/online/OnlineManipulatorTest.java
new file mode 100644
index 0000000..2571269
--- /dev/null
+++ b/ipojo/manipulator/manipulator-it/src/it/online-manipulator-it/src/test/java/org/apache/felix/ipojo/test/online/OnlineManipulatorTest.java
@@ -0,0 +1,352 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * 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.online;
+
+
+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.test.online.components.Consumer;
+import org.apache.felix.ipojo.test.online.components.MyProvider;
+import org.apache.felix.ipojo.test.online.services.Hello;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.io.StreamUtils;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerMethod;
+import org.ops4j.pax.tinybundles.core.TinyBundles;
+import org.osgi.framework.*;
+import org.ow2.chameleon.testing.helpers.OSGiHelper;
+
+import javax.inject.Inject;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+import static org.ops4j.pax.exam.CoreOptions.*;
+import static org.ops4j.pax.exam.MavenUtils.asInProject;
+
+
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerMethod.class)
+public class OnlineManipulatorTest {
+
+
+    private static File TMP = new File("target/tmp-bundle");
+
+    @Inject
+    BundleContext context;
+
+    private OSGiHelper helper;
+
+
+    @Configuration
+    public Option[] configure() throws IOException {
+        String providerWithMetadata = providerWithMetadata();
+        String providerWithMetadataInMetaInf = providerWithMetadataInMetaInf();
+        String providerWithoutMetadata = providerWithoutMetadata();
+        String consumerWithMetadata = consumerWithMetadata();
+        String consumerWithoutMetadata = consumerWithoutMetadata();
+
+        return options(
+                cleanCaches(),
+                mavenBundle("org.apache.felix", "org.apache.felix.ipojo").versionAsInProject(),
+                mavenBundle("org.ow2.chameleon.testing", "osgi-helpers").versionAsInProject(),
+                mavenBundle("org.apache.felix","org.apache.felix.ipojo.manipulator.online").versionAsInProject(),
+                junitBundles(),
+
+                provision(
+                        TinyBundles.bundle()
+                                .add(Hello.class)
+                                .set(Constants.BUNDLE_SYMBOLICNAME, "ServiceInterface")
+                                .set(Constants.EXPORT_PACKAGE, "org.apache.felix.ipojo.test.online.services")
+                                .build()
+                ),
+
+                systemProperty("providerWithMetadata").value(providerWithMetadata),
+                systemProperty("providerWithMetadataInMetaInf").value(providerWithMetadataInMetaInf),
+                systemProperty("providerWithoutMetadata").value(providerWithoutMetadata),
+                systemProperty("consumerWithMetadata").value(consumerWithMetadata),
+                systemProperty("consumerWithoutMetadata").value(consumerWithoutMetadata)
+        );
+
+    }
+
+    @Before
+    public void before() {
+        helper = new OSGiHelper(context);
+    }
+
+    @After
+    public void after() {
+        helper.dispose();
+    }
+
+    private static File getTemporaryFile(String name) throws IOException {
+        if (!TMP.exists()) {
+            TMP.mkdirs();
+            TMP.deleteOnExit();
+        }
+        File file = File.createTempFile(name, ".jar", TMP);
+        //File file = new File(TMP, name + ".jar");
+        if (file.exists()) {
+            file.delete();
+        }
+        file.deleteOnExit();
+        return file;
+    }
+
+    @Test
+    public void installProviderWithMetadata1() throws BundleException, InvalidSyntaxException, Exception {
+        String url = context.getProperty("providerWithMetadata");
+        Assert.assertNotNull(url);
+        Bundle bundle = context.installBundle("ipojo:" + url);
+        bundle.start();
+
+        assertBundle("Provider");
+
+        helper.waitForService(Hello.class.getName(), null, 5000);
+        assertValidity();
+        Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
+    }
+
+
+    @Test
+    public void installProviderWithMetadata2() throws BundleException, InvalidSyntaxException, IOException {
+        String url = context.getProperty("providerWithMetadataInMetaInf");
+        Assert.assertNotNull(url);
+        context.installBundle("ipojo:" + url).start();
+        assertBundle("Provider");
+        helper.waitForService(Hello.class.getName(), null, 5000);
+        assertValidity();
+        Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
+    }
+
+    @Test
+    public void installProviderWithoutMetadata() throws BundleException, InvalidSyntaxException, IOException {
+        String url = context.getProperty("providerWithoutMetadata");
+        Assert.assertNotNull(url);
+        context.installBundle("ipojo:" + url).start();
+        assertBundle("Provider");
+        helper.waitForService(Hello.class.getName(), null, 5000);
+        assertValidity();
+        Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
+    }
+
+    @Test
+    public void installConsumerWithMetadata() throws BundleException, InvalidSyntaxException, IOException {
+        String url = context.getProperty("providerWithoutMetadata");
+        Assert.assertNotNull(url);
+        context.installBundle("ipojo:" + url).start();
+        assertBundle("Provider");
+
+        String url2 = context.getProperty("consumerWithMetadata");
+        Assert.assertNotNull(url);
+        context.installBundle("ipojo:" + url2).start();
+        assertBundle("Consumer");
+        helper.waitForService(Hello.class.getName(), null, 5000);
+        // Wait for activation.
+        try {
+            Thread.sleep(2000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        assertValidity();
+        Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
+    }
+
+    @Test
+    public void installConsumerWithoutMetadata() throws BundleException, InvalidSyntaxException, IOException {
+        String url = context.getProperty("providerWithMetadataInMetaInf");
+        Assert.assertNotNull(url);
+        context.installBundle("ipojo:" + url).start();
+        assertBundle("Provider");
+        helper.waitForService(Hello.class.getName(), null, 5000);
+
+        String url2 = context.getProperty("consumerWithoutMetadata");
+        Assert.assertNotNull(url);
+        context.installBundle("ipojo:" + url2).start();
+        assertBundle("Consumer");
+        // Wait for activation.
+        try {
+            Thread.sleep(2000);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        assertValidity();
+        Assert.assertNotNull(context.getServiceReference(Hello.class.getName()));
+    }
+
+    /**
+     * Gets a regular bundle containing metadata file
+     *
+     * @return the url of the bundle
+     * @throws java.io.IOException
+     */
+    public static String providerWithMetadata() throws IOException {
+        InputStream is = TinyBundles.bundle()
+                .add("metadata.xml", OnlineManipulatorTest.class.getClassLoader().getResource("provider.xml"))
+                .add(MyProvider.class)
+                .set(Constants.BUNDLE_SYMBOLICNAME, "Provider")
+                .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.test.online.services")
+                .build();
+
+        File out = getTemporaryFile("providerWithMetadata");
+        StreamUtils.copyStream(is, new FileOutputStream(out), true);
+        return out.toURI().toURL().toExternalForm();
+    }
+
+    /**
+     * Gets a regular bundle containing metadata file in the META-INF directory
+     *
+     * @return the url of the bundle
+     * @throws java.io.IOException
+     */
+    public static String providerWithMetadataInMetaInf() throws IOException {
+        InputStream is = TinyBundles.bundle()
+                .add("META-INF/metadata.xml", OnlineManipulatorTest.class.getClassLoader().getResource("provider.xml"))
+                .add(MyProvider.class)
+                .set(Constants.BUNDLE_SYMBOLICNAME, "Provider")
+                .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.test.online.services")
+                .build();
+
+        File out = getTemporaryFile("providerWithMetadataInMetaInf");
+        StreamUtils.copyStream(is, new FileOutputStream(out), true);
+        return out.toURI().toURL().toExternalForm();
+    }
+
+    /**
+     * Gets a provider bundle which does not contain the metadata file.
+     *
+     * @return the url of the bundle + metadata
+     * @throws java.io.IOException
+     */
+    public static String providerWithoutMetadata() throws IOException {
+        InputStream is = TinyBundles.bundle()
+                //.addResource("metadata.xml", this.getClass().getClassLoader().getResource("provider.xml"))
+                .add(MyProvider.class)
+                .set(Constants.BUNDLE_SYMBOLICNAME, "Provider")
+                .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.test.online.services")
+                .build();
+
+        File out = getTemporaryFile("providerWithoutMetadata");
+        StreamUtils.copyStream(is, new FileOutputStream(out), true);
+        String url = out.toURI().toURL().toExternalForm();
+
+        return url + "!" + OnlineManipulatorTest.class.getClassLoader().getResource("provider.xml");
+    }
+
+    /**
+     * Gets a consumer bundle using annotation containing the instance
+     * declaration in the metadata.
+     *
+     * @return the url of the bundle
+     * @throws java.io.IOException
+     */
+    public static String consumerWithMetadata() throws IOException {
+        InputStream is = TinyBundles.bundle()
+                .add("metadata.xml", OnlineManipulatorTest.class.getClassLoader().getResource("consumer.xml"))
+                .add(Consumer.class)
+                .set(Constants.BUNDLE_SYMBOLICNAME, "Consumer")
+                .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.test.online.services")
+                .build();
+
+        File out = getTemporaryFile("consumerWithMetadata");
+        StreamUtils.copyStream(is, new FileOutputStream(out), true);
+        return out.toURI().toURL().toExternalForm();
+    }
+
+    /**
+     * Gets a consumer bundle using annotation that does not contain
+     * metadata
+     *
+     * @return the url of the bundle + metadata
+     * @throws java.io.IOException
+     */
+    public static String consumerWithoutMetadata() throws IOException {
+        InputStream is = TinyBundles.bundle()
+                .add(Consumer.class)
+                .set(Constants.BUNDLE_SYMBOLICNAME, "Consumer")
+                .set(Constants.IMPORT_PACKAGE, "org.apache.felix.ipojo.test.online.services")
+                .build();
+
+        File out = getTemporaryFile("consumerWithoutMetadata");
+        StreamUtils.copyStream(is, new FileOutputStream(out), true);
+        String url = out.toURI().toURL().toExternalForm();
+
+        return url + "!" + OnlineManipulatorTest.class.getClassLoader().getResource("consumer.xml");
+    }
+
+
+    public void dumpServices() throws InvalidSyntaxException {
+        ServiceReference[] refs = context.getAllServiceReferences(null, null);
+        System.out.println(" === Services === ");
+        for (ServiceReference ref : refs) {
+            String[] itf = (String[]) ref.getProperty(Constants.OBJECTCLASS);
+            System.out.println(itf[0]);
+        }
+        System.out.println("====");
+    }
+
+    public void dumpBundles() throws InvalidSyntaxException {
+        Bundle[] bundles = context.getBundles();
+        System.out.println(" === Bundles === ");
+        for (Bundle bundle : bundles) {
+            String sn = bundle.getSymbolicName();
+            System.out.println(sn);
+        }
+        System.out.println("====");
+    }
+
+    private void assertBundle(String sn) {
+        for (Bundle bundle : context.getBundles()) {
+            if (bundle.getSymbolicName().equals(sn)
+                    && bundle.getState() == Bundle.ACTIVE) {
+                return;
+            }
+
+        }
+        Assert.fail("Cannot find the bundle " + sn);
+    }
+
+    private void assertValidity() {
+        try {
+            ServiceReference[] refs = context.getServiceReferences(Architecture.class.getName(), null);
+            Assert.assertNotNull(refs);
+            for (ServiceReference ref : refs) {
+                InstanceDescription id = ((Architecture) context.getService(ref)).getInstanceDescription();
+                int state = id.getState();
+                Assert.assertEquals("State of " + id.getName(), ComponentInstance.VALID, state);
+            }
+        } catch (InvalidSyntaxException e) {
+            Assert.fail(e.getMessage());
+        }
+
+    }
+
+
+}
diff --git a/ipojo/manipulator/online-manipulator/changelog.txt b/ipojo/manipulator/online-manipulator/changelog.txt
new file mode 100644
index 0000000..a4e730d
--- /dev/null
+++ b/ipojo/manipulator/online-manipulator/changelog.txt
@@ -0,0 +1,20 @@
+Changes from the 1.4.2 to 1.6.0

+-------------------------------

+** Improvement

+    * [FELIX-1427] - Service injection with Smart Proxies

+    * [FELIX-1906] - Allow calling a method when service properties of an already injected service are modified

+

+    

+Changes from the 1.4.0 to 1.4.2

+-------------------------------

+** Bug

+    * [FELIX-1518] - iPOJO manipulator is really slow even when annotation are ignored

+    

+

+Version 1.4.0

+-------------

+** Improvement

+    * Update parent pom

+    * Initial commit

+    

+   

diff --git a/ipojo/manipulator/online-manipulator/pom.xml b/ipojo/manipulator/online-manipulator/pom.xml
new file mode 100644
index 0000000..8bb540d
--- /dev/null
+++ b/ipojo/manipulator/online-manipulator/pom.xml
@@ -0,0 +1,179 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT 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/maven-v4_0_0.xsd">
+    <parent>
+        <groupId>org.apache.felix</groupId>
+        <artifactId>felix-parent</artifactId>
+        <version>2.1</version>
+        <relativePath>../../../pom/pom.xml</relativePath>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+    <packaging>bundle</packaging>
+    <name>Apache Felix iPOJO - Online Manipulator</name>
+    <artifactId>org.apache.felix.ipojo.manipulator.online</artifactId>
+    <version>1.9.0-SNAPSHOT</version>
+
+    <description>
+        iPOJO online manipulator allowing install time manipulation of iPOJO bundle.
+    </description>
+    <url>http://felix.apache.org/site/apache-felix-ipojo-online-manipulator.html</url>
+
+    <properties>
+        <ipojo.import.packages>[1.8.0,2.0.0)</ipojo.import.packages>
+        <ipojo.manipulator.version>${project.version}</ipojo.manipulator.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.core</artifactId>
+            <version>4.3.1</version>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.compendium</artifactId>
+            <version>4.0.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.ipojo.metadata</artifactId>
+            <version>1.6.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.felix</groupId>
+            <artifactId>org.apache.felix.ipojo.manipulator</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>asm</groupId>
+            <artifactId>asm-all</artifactId>
+            <version>3.3.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>asm</groupId>
+                    <artifactId>asm-tree</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.mockito</groupId>
+            <artifactId>mockito-all</artifactId>
+            <version>1.9.5</version>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+    <build>
+        <resources>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.0</version>
+                <configuration>
+                    <target>1.5</target>
+                    <source>1.5</source>
+                    <testTarget>1.5</testTarget>
+                    <testSource>1.5</testSource>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-bundle-plugin</artifactId>
+                <version>2.3.7</version>
+                <extensions>true</extensions>
+                <configuration>
+                    <instructions>
+                        <Bundle-SymbolicName>${pom.artifactId}</Bundle-SymbolicName>
+                        <Private-Package>org.apache.felix.ipojo.online.manipulator</Private-Package>
+                        <Bundle-DocURL>
+                            http://felix.apache.org/site/apache-felix-ipojo-online-manipulator.html
+                        </Bundle-DocURL>
+                        <Export-Package>
+                            org.apache.felix.ipojo.manipulation*; version="${ipojo.manipulator.version}",
+                            org.apache.felix.ipojo.xml.parser; version="${ipojo.manipulator.version}",
+                            org.apache.felix.ipojo.manipulator*; version="${ipojo.manipulator.version}",
+                            org.apache.felix.ipojo.annotations*; version="${ipojo.manipulator.version}",
+                        </Export-Package>
+                        <Private-Package>
+                            org.objectweb.asm,
+                            org.objectweb.asm.commons,
+                            org.objectweb.asm.signature,
+                            org.objectweb.asm.tree,
+                            org.apache.felix.ipojo.online.manipulator
+                        </Private-Package>
+                        <Import-Package>!sun.io, org.osgi.framework;version=1.3, *
+                        </Import-Package>
+                    </instructions>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.felix</groupId>
+                <artifactId>maven-ipojo-plugin</artifactId>
+                <version>1.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-checkstyle-plugin</artifactId>
+                <configuration>
+                    <enableRulesSummary>false</enableRulesSummary>
+                    <violationSeverity>warning</violationSeverity>
+                    <configLocation>http://felix.apache.org/ipojo/dev/checkstyle_ipojo.xml</configLocation>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.rat</groupId>
+                <artifactId>apache-rat-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>verify</phase>
+                        <goals>
+                            <goal>check</goal>
+                        </goals>
+                    </execution>
+                </executions>
+                <configuration>
+                    <!-- check src only (except remote resources additions) -->
+                    <includes>
+                        <include>src/**</include>
+                    </includes>
+                    <excludes>
+                        <exclude>src/main/appended-resources/**</exclude>
+                        <exclude>src/main/resources/META-INF/**</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>
diff --git a/ipojo/manipulator/online-manipulator/src/main/appended-resources/META-INF/DEPENDENCIES b/ipojo/manipulator/online-manipulator/src/main/appended-resources/META-INF/DEPENDENCIES
new file mode 100644
index 0000000..844c77e
--- /dev/null
+++ b/ipojo/manipulator/online-manipulator/src/main/appended-resources/META-INF/DEPENDENCIES
@@ -0,0 +1,21 @@
+I. Included Third-Party Software
+
+This product includes software developed at
+Copyright (c) 2000-2005 INRIA, France Telecom
+Licensed under BSD License.
+
+This product includes software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2007).
+Licensed under the Apache License 2.0.
+
+II. Used Third-Party Software
+
+This product uses software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2009).
+Licensed under the Apache License 2.0.
+
+III. Overall License Summary
+- Apache License 2.0
+- BSD License
diff --git a/ipojo/manipulator/online-manipulator/src/main/appended-resources/META-INF/LICENSE b/ipojo/manipulator/online-manipulator/src/main/appended-resources/META-INF/LICENSE
new file mode 100644
index 0000000..194131d
--- /dev/null
+++ b/ipojo/manipulator/online-manipulator/src/main/appended-resources/META-INF/LICENSE
@@ -0,0 +1,42 @@
+
+
+APACHE FELIX iPOJO Online Manipulator:
+
+The Apache Felix iPOJO Online Manipulator includes a number of subcomponents with
+separate copyright notices and license terms. Your use of the source
+code for the these subcomponents is subject to the terms and
+conditions of the following licenses. 
+
+
+For the ASM component:
+
+Copyright (c) 2000-2005 INRIA, France Telecom
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+   notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+   notice, this list of conditions and the following disclaimer in the
+   documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holders nor the names of its
+   contributors may be used to endorse or promote products derived from
+   this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+THE POSSIBILITY OF SUCH DAMAGE.
+
diff --git a/ipojo/manipulator/online-manipulator/src/main/appended-resources/META-INF/NOTICE b/ipojo/manipulator/online-manipulator/src/main/appended-resources/META-INF/NOTICE
new file mode 100644
index 0000000..4ae983c
--- /dev/null
+++ b/ipojo/manipulator/online-manipulator/src/main/appended-resources/META-INF/NOTICE
@@ -0,0 +1,8 @@
+This product includes software developed at
+The OSGi Alliance (http://www.osgi.org/).
+Copyright (c) OSGi Alliance (2000, 2009).
+Licensed under the Apache License 2.0.
+
+This product includes software developed at
+Copyright (c) 2000-2005 INRIA, France Telecom
+Licensed under BSD License.
diff --git a/ipojo/manipulator/online-manipulator/src/main/java/org/apache/felix/ipojo/online/manipulator/IPOJOURLHandler.java b/ipojo/manipulator/online-manipulator/src/main/java/org/apache/felix/ipojo/online/manipulator/IPOJOURLHandler.java
new file mode 100644
index 0000000..786c20b
--- /dev/null
+++ b/ipojo/manipulator/online-manipulator/src/main/java/org/apache/felix/ipojo/online/manipulator/IPOJOURLHandler.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.online.manipulator;
+
+import org.apache.felix.ipojo.manipulator.Pojoization;
+import org.osgi.framework.BundleContext;
+import org.osgi.service.url.URLStreamHandlerService;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
+
+/**
+ * iPOJO URL Handler allowing installation time manipulation.
+ * When a bundle is installed with the <code>ipojo:</code> URL
+ * prefix, the bundle is downloaded and manipulated by this
+ * handler.
+ * The metadata.xml file can either be provided inside the bundle (root,
+ * or in META-INF) or given in the URL:
+ * ipojo:URL_BUNDLE!URL_METADATA.
+ *
+ * @author <a href="mailto:dev@felix.apache.org">Felix Project Team</a>
+ */
+public class IPOJOURLHandler
+        extends org.osgi.service.url.AbstractURLStreamHandlerService implements URLStreamHandlerService {
+
+    /**
+     * The bundle context.
+     */
+    private BundleContext m_context;
+    /**
+     * The directory storing bundles.
+     */
+    private File m_temp;
+
+    /**
+     * Creates a IPOJOURLHandler.
+     * Gets the bundle context and create the working
+     * directory.
+     *
+     * @param bc the bundle context
+     */
+    public IPOJOURLHandler(BundleContext bc) {
+        m_context = bc;
+        m_temp = m_context.getDataFile("temp");
+        if (!m_temp.exists()) {
+            m_temp.mkdir();
+        }
+    }
+
+    /**
+     * Stops the URL handler:
+     * Deletes the working directory.
+     */
+    public void stop() {
+        File[] files = m_temp.listFiles();
+        if (files != null) {
+            for (int i = 0; i < files.length; i++) {
+                files[i].delete();
+            }
+        }
+        m_temp.delete();
+    }
+
+    /**
+     * Opens a connection using the ipojo url handler.
+     * This methods parses the URL and manipulate the given bundle.
+     *
+     * @param url the url.
+     * @return the URL connection on the manipulated bundle
+     * @throws java.io.IOException occurs when the bundle cannot be either downloaded, or manipulated or
+     *                             installed correctly.
+     * @see org.osgi.service.url.AbstractURLStreamHandlerService#openConnection(java.net.URL)
+     */
+    public URLConnection openConnection(URL url) throws IOException {
+        System.out.println("Processing URL : " + url);
+
+        // Parse the url:
+        String full = url.toExternalForm();
+        // Remote ipojo://
+        if (full.startsWith("ipojo:")) {
+            full = full.substring(6);
+        }
+        // Remove '/' or '//'
+        while (full.startsWith("/")) {
+            full = full.substring(1);
+        }
+
+        full = full.trim();
+
+        // Now full is like : URL,URL or URL
+        String[] urls = full.split("!");
+        URL bundleURL = null;
+        URL metadataURL = null;
+        if (urls.length == 1) {
+            // URL form
+            System.out.println("Extracted URL : " + urls[0]);
+            bundleURL = new URL(urls[0]);
+        } else if (urls.length == 2) {
+            // URL,URL form
+            bundleURL = new URL(urls[0]);
+            metadataURL = new URL(urls[1]);
+        } else {
+            throw new MalformedURLException("The iPOJO url is not formatted correctly, ipojo:bundle_url[!metadata_url] expected");
+        }
+
+        File bundle = File.createTempFile("ipojo_", ".jar", m_temp);
+        save(bundleURL, bundle);
+        File metadata = null;
+        if (metadataURL != null) {
+            metadata = File.createTempFile("ipojo_", ".xml", m_temp);
+            save(metadataURL, metadata);
+        } else {
+            // Check that the metadata are in the jar file
+            JarFile jar = new JarFile(bundle);
+            metadata = findMetadata(jar);
+        }
+
+        // Pojoization
+        Pojoization pojoizator = new Pojoization();
+        File out = new File(m_temp, bundle.getName() + "-ipojo.jar");
+        System.out.println("Pojoization " + bundle.exists() + " - " + metadata.exists());
+        try {
+            pojoizator.pojoization(bundle, out, metadata);
+        } catch (Exception e) {
+            if (!pojoizator.getErrors().isEmpty()) {
+                throw new IOException("Errors occured during the manipulation : " + pojoizator.getErrors());
+            }
+            e.printStackTrace();
+            throw new RuntimeException(e.getMessage());
+        }
+
+        if (!pojoizator.getErrors().isEmpty()) {
+            throw new IOException("Errors occured during the manipulation : " + pojoizator.getErrors());
+        }
+        if (!pojoizator.getWarnings().isEmpty()) {
+            System.err.println("Warnings occured during the manipulation : " + pojoizator.getWarnings());
+        }
+
+        System.out.println("Manipulation done : " + out.exists());
+
+        // Cleanup
+        bundle.delete();
+        if (metadata != null) {
+            metadata.delete();
+        }
+        out.deleteOnExit();
+        // Returns the URL Connection
+        return out.toURI().toURL().openConnection();
+
+
+    }
+
+    /**
+     * Downloads the content pointed by the given url to
+     * the given file.
+     *
+     * @param url  the url
+     * @param file the file
+     * @throws java.io.IOException occurs if the content cannot be read
+     *                             and save inside the file
+     */
+    private void save(URL url, File file) throws IOException {
+        InputStream is = url.openStream();
+        save(is, file);
+    }
+
+    /**
+     * Saves the content of the input stream to the given file.
+     *
+     * @param is   the input stream to read
+     * @param file the file
+     * @throws java.io.IOException occurs if the content cannot be read
+     *                             and save inside the file
+     */
+    private void save(InputStream is, File file) throws IOException {
+        FileOutputStream writer = new FileOutputStream(file);
+        int cc = 0;
+        do {
+            int i = is.read();
+            if (i == -1) {
+                break;
+            }
+            cc++;
+            writer.write(i);
+        } while (true);
+        System.out.println(cc + " bytes copied");
+        is.close();
+        writer.close();
+    }
+
+    /**
+     * Looks for the metadata.xml file in the jar file.
+     * Two locations are checked:
+     * <ol>
+     * <li>the root of the jar file</li>
+     * <li>the META-INF directory</li>
+     * </ol>
+     *
+     * @param jar the jar file
+     * @return the founded file or <code>null</code> if not found.
+     * @throws java.io.IOException occurs when the Jar file cannot be read.
+     */
+    private File findMetadata(JarFile jar) throws IOException {
+        JarEntry je = jar.getJarEntry("metadata.xml");
+        if (je == null) {
+            je = jar.getJarEntry("META-INF/metadata.xml");
+        }
+
+        if (je == null) {
+            System.out.println("Metadata file not found, use annotations only.");
+            return null; // Not Found, use annotation only
+        } else {
+            System.out.println("Metadata file found: " + je.getName());
+            File metadata = File.createTempFile("ipojo_", ".xml", m_temp);
+            save(jar.getInputStream(je), metadata);
+            System.out.println("Metadata file saved to " + metadata.getAbsolutePath());
+            return metadata;
+        }
+
+    }
+
+}
diff --git a/ipojo/manipulator/online-manipulator/src/main/resources/META-INF/constants.properties b/ipojo/manipulator/online-manipulator/src/main/resources/META-INF/constants.properties
new file mode 100644
index 0000000..d070319
--- /dev/null
+++ b/ipojo/manipulator/online-manipulator/src/main/resources/META-INF/constants.properties
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+# This file define the different constant we use in the manipulator. This file is filtered by Maven.
+manipulator.version=${project.version}
+ipojo.import.packages=${ipojo.import.packages}
\ No newline at end of file
diff --git a/ipojo/manipulator/online-manipulator/src/main/resources/META-INF/services/org.apache.felix.ipojo.manipulator.spi.Module b/ipojo/manipulator/online-manipulator/src/main/resources/META-INF/services/org.apache.felix.ipojo.manipulator.spi.Module
new file mode 100644
index 0000000..d3b15f9
--- /dev/null
+++ b/ipojo/manipulator/online-manipulator/src/main/resources/META-INF/services/org.apache.felix.ipojo.manipulator.spi.Module
@@ -0,0 +1 @@
+org.apache.felix.ipojo.manipulator.metadata.annotation.module.DefaultBindingModule
\ No newline at end of file
diff --git a/ipojo/manipulator/online-manipulator/src/main/resources/metadata.xml b/ipojo/manipulator/online-manipulator/src/main/resources/metadata.xml
new file mode 100644
index 0000000..771b2d5
--- /dev/null
+++ b/ipojo/manipulator/online-manipulator/src/main/resources/metadata.xml
@@ -0,0 +1,32 @@
+<!--

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

+	or more contributor license agreements.  See the NOTICE file

+	distributed with this work for additional information

+	regarding copyright ownership.  The ASF licenses this file

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

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

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

+	

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

+	

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

+	software distributed under the License is distributed on an

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

+	KIND, either express or implied.  See the License for the

+	specific language governing permissions and limitations

+	under the License.

+-->

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

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

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

+

+    <component classname="org.apache.felix.ipojo.online.manipulator.IPOJOURLHandler"

+               public="false"

+               immediate="true">

+        <provides>

+            <property name="url.handler.protocol" type="java.lang.String" value="ipojo"/>

+        </provides>

+        <callback transition="invalidate" method="stop"/>

+    </component>

+    <instance component="org.apache.felix.ipojo.online.manipulator.IPOJOURLHandler"/>

+</ipojo>
\ No newline at end of file
diff --git a/ipojo/manipulator/pom.xml b/ipojo/manipulator/pom.xml
index 1c4339a..62be39c 100644
--- a/ipojo/manipulator/pom.xml
+++ b/ipojo/manipulator/pom.xml
@@ -40,6 +40,7 @@
         <module>ipojo-ant-task</module>
         <module>maven-ipojo-plugin</module>
         <module>bnd-ipojo-plugin</module>
+        <module>online-manipulator</module>
     </modules>
 
 </project>