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>