Fix FELIX-3192
Propagated service properties must be updated when propagated a second times


git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1195532 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
index 26bd0a7..b5659f2 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/configuration/ConfigurationHandler.java
@@ -434,14 +434,13 @@
             }
         }
 
-        // Every removed configurable propery gets reset to its default value
+        // Every removed configurable property gets reset to its default value
         for (int i = 0; i < m_configurableProperties.size(); i++) {
             Property prop = (Property) m_configurableProperties.get(i);
             if (configuration.get(prop.getName()) == null) {
                 reconfigureProperty(prop, prop.getDefaultValue());
             }
         }
-
         return toPropagate;
 
     }
diff --git a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
index 84c8f9f..36a17f3 100644
--- a/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
+++ b/ipojo/core/src/main/java/org/apache/felix/ipojo/handlers/providedservice/ProvidedService.java
@@ -538,6 +538,12 @@
             for (int i = 0; i < m_properties.length; i++) {
                 if (key.equals(m_properties[i].getName())) {
                     alreadyExisting = true;
+                    // Check whether the value changed.
+                    if (m_properties[i].getValue() == null
+                            || ! value.equals(m_properties[i].getValue())) {
+                        m_properties[i].setValue(value);
+                        updated = true;
+                    }
                 }
             }
 
@@ -553,7 +559,7 @@
         }
 
         if (updated) {
-            m_handler.info("Update trigged by adding properties " + props);
+            m_handler.info("Update triggered by adding properties " + props);
             update();
         }
     }
diff --git a/ipojo/tests/core/configuration/pom.xml b/ipojo/tests/core/configuration/pom.xml
index b13edfc..c7c1c22 100644
--- a/ipojo/tests/core/configuration/pom.xml
+++ b/ipojo/tests/core/configuration/pom.xml
@@ -18,12 +18,12 @@
 -->

 <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>ipojo.tests</groupId>
-    <artifactId>ipojo.tests</artifactId>
-    <version>1.5.0-SNAPSHOT</version>
-    <relativePath>../../pom.xml</relativePath>
-  </parent>
+  <parent>

+    <groupId>ipojo.tests</groupId>

+    <artifactId>ipojo.tests</artifactId>

+    <version>1.5.0-SNAPSHOT</version>

+    <relativePath>../../pom.xml</relativePath>

+  </parent>

 

   <modelVersion>4.0.0</modelVersion>

   <packaging>bundle</packaging>

@@ -35,6 +35,7 @@
     <dependency>

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

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

+	  <version>${ipojo.core.snapshot}</version>

     </dependency>

     <dependency>

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

@@ -45,10 +46,10 @@
       <artifactId>org.osgi.core</artifactId>

     </dependency>

     <dependency>

-    <groupId>org.osgi</groupId>
-    <artifactId>org.osgi.compendium</artifactId>
-    <version>4.0.0</version>
-  </dependency>
+    <groupId>org.osgi</groupId>

+    <artifactId>org.osgi.compendium</artifactId>

+    <version>4.0.0</version>

+  </dependency>

     <dependency>

       <groupId>junit</groupId>

       <artifactId>junit</artifactId>

diff --git a/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/ManagedServiceConfigurableProperties.java b/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/ManagedServiceConfigurableProperties.java
index 754d33a..92997b2 100644
--- a/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/ManagedServiceConfigurableProperties.java
+++ b/ipojo/tests/core/configuration/src/main/java/org/apache/felix/ipojo/test/scenarios/configuration/ManagedServiceConfigurableProperties.java
@@ -113,8 +113,8 @@
 		assertEquals("Check baz equality -2", bazP, "zab");

 		getContext().ungetService(msRef);

 	}

-	

-	public void testStaticInstance2() {

+

+    public void testStaticInstance2() {

         ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());

         assertNotNull("Check FS availability", fooRef);

         String fooP = (String) fooRef.getProperty("foo");

@@ -123,11 +123,11 @@
         assertEquals("Check foo equality -1", fooP, "foo");

         assertEquals("Check bar equality -1", barP, new Integer(2));

         assertEquals("Check baz equality -1", bazP, "baz");

-        

+

         ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "instance");

         assertNotNull("Check ManagedService availability", msRef);

-        

-        

+

+

         // Configuration of baz

         Properties conf = new Properties();

         conf.put("baz", "zab");

@@ -137,7 +137,7 @@
         try {

             ms.updated(conf);

         } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

-        

+

         // Recheck props

         fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());

         fooP = (String) fooRef.getProperty("foo");

@@ -149,7 +149,7 @@
         getContext().ungetService(fooRef);

         getContext().ungetService(msRef);

     }

-	

+

 	public void testStaticInstance3() {

         ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance3.getInstanceName());

         assertNotNull("Check FS availability", fooRef);

@@ -160,11 +160,11 @@
         assertEquals("Check foo equality -1", fooP, null);

         assertEquals("Check bar equality -1", barP, null);

         assertEquals("Check baz equality -1", bazP, null);

-        

+

         ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "instance-3");

         assertNotNull("Check ManagedService availability", msRef);

-        

-        

+

+

         // Configuration of baz

         Properties conf = new Properties();

         conf.put("baz", "zab");

@@ -174,7 +174,7 @@
         try {

             ms.updated(conf);

         } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

-        

+

         // Recheck props

         fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance3.getInstanceName());

         fooP = (String) fooRef.getProperty("foo");

@@ -186,22 +186,22 @@
         getContext().ungetService(fooRef);

         getContext().ungetService(msRef);

     }

-	

+

 	public void testDynamicInstance1() {

     	ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance1.getInstanceName());

     	assertNotNull("Check FS availability", fooRef);

-    	

+

     	String fooP = (String) fooRef.getProperty("foo");

     	Integer barP = (Integer) fooRef.getProperty("bar");

     	String bazP = (String) fooRef.getProperty("baz");

-    	

+

     	assertEquals("Check foo equality", fooP, "foo");

     	assertEquals("Check bar equality", barP, new Integer(2));

     	assertEquals("Check baz equality", bazP, "baz");

-    	

+

     	ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "FooProvider-3");

     	assertNotNull("Check ManagedServiceFactory availability", msRef);

-    	

+

     	// Configuration of baz

     	Properties conf = new Properties();

     	conf.put("baz", "zab");

@@ -211,45 +211,45 @@
     	try {

     		ms.updated(conf);

     	} catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

-    	

+

     	// Re-check props

     	fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance1.getInstanceName());

     	fooP = (String) fooRef.getProperty("foo");

     	barP = (Integer) fooRef.getProperty("bar");

     	bazP = (String) fooRef.getProperty("baz");

-    	

+

     	assertEquals("Check foo equality", fooP, "oof");

     	assertEquals("Check bar equality", barP, new Integer(0));

     	assertEquals("Check baz equality", bazP, "zab");

-    	

+

     	// Check field value

     	FooService fs = (FooService) getContext().getService(fooRef);

     	Properties p = fs.fooProps();

     	fooP = (String) p.get("foo");

     	barP = (Integer) p.get("bar");

-    	

+

     	assertEquals("Check foo field equality", fooP, "oof");

     	assertEquals("Check bar field equality", barP, new Integer(0));

-    	

+

     	getContext().ungetService(fooRef);

     	getContext().ungetService(msRef);

     }

-	

+

 	public void testDynamicInstance2() {

         ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());

         assertNotNull("Check FS availability", fooRef);

-        

+

         String fooP = (String) fooRef.getProperty("foo");

         Integer barP = (Integer) fooRef.getProperty("bar");

         String bazP = (String) fooRef.getProperty("baz");

-        

+

         assertEquals("Check foo equality", fooP, "foo");

         assertEquals("Check bar equality", barP, new Integer(2));

         assertEquals("Check baz equality", bazP, "baz");

-        

+

         ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "instance");

         assertNotNull("Check ManagedServiceFactory availability", msRef);

-        

+

         // Configuration of baz

         Properties conf = new Properties();

         conf.put("baz", "zab");

@@ -259,34 +259,34 @@
         try {

             ms.updated(conf);

         } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

-        

+

         // Recheck props

         fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());

         fooP = (String) fooRef.getProperty("foo");

         barP = (Integer) fooRef.getProperty("bar");

         bazP = (String) fooRef.getProperty("baz");

-        

+

         assertEquals("Check foo equality", fooP, "oof");

         assertEquals("Check bar equality", barP, new Integer(0));

         assertEquals("Check baz equality", bazP, "zab");

-        

+

         // Check field value

         FooService fs = (FooService) getContext().getService(fooRef);

         Properties p = fs.fooProps();

         fooP = (String) p.get("foo");

         barP = (Integer) p.get("bar");

-        

+

         assertEquals("Check foo field equality", fooP, "oof");

         assertEquals("Check bar field equality", barP, new Integer(0));

-        

+

         getContext().ungetService(fooRef);

         getContext().ungetService(msRef);

     }

-	

+

 	public void testDynamicInstance3() {

         ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance3.getInstanceName());

         assertNotNull("Check FS availability", fooRef);

-        

+

         Object fooP = fooRef.getProperty("foo");

         Object barP =  fooRef.getProperty("bar");

         Object bazP =  fooRef.getProperty("baz");

@@ -294,10 +294,10 @@
         assertEquals("Check foo equality", fooP, null);

         assertEquals("Check bar equality", barP, null);

         assertEquals("Check baz equality", bazP, null);

-        

+

         ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "instance-3");

         assertNotNull("Check ManagedServiceFactory availability", msRef);

-        

+

         // Configuration of baz

         Properties conf = new Properties();

         conf.put("baz", "zab");

@@ -307,26 +307,26 @@
         try {

             ms.updated(conf);

         } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

-        

+

         // Recheck props

         fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance3.getInstanceName());

         fooP = (String) fooRef.getProperty("foo");

         barP = (Integer) fooRef.getProperty("bar");

         bazP = (String) fooRef.getProperty("baz");

-        

+

         assertEquals("Check foo equality", fooP, "oof");

         assertEquals("Check bar equality", barP, new Integer(0));

         assertEquals("Check baz equality", bazP, "zab");

-        

+

         // Check field value

         FooService fs = (FooService) getContext().getService(fooRef);

         Properties p = fs.fooProps();

         fooP = (String) p.get("foo");

         barP = (Integer) p.get("bar");

-        

+

         assertEquals("Check foo field equality", fooP, "oof");

         assertEquals("Check bar field equality", barP, new Integer(0));

-        

+

         getContext().ungetService(fooRef);

         getContext().ungetService(msRef);

     }

@@ -335,18 +335,18 @@
         assertEquals("Check instance1 state", ComponentInstance.VALID,instance1.getState());

 		ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance1.getInstanceName());

 		assertNotNull("Check FS availability", fooRef);

-		

+

 		String fooP = (String) fooRef.getProperty("foo");

 		Integer barP = (Integer) fooRef.getProperty("bar");

 		String bazP = (String) fooRef.getProperty("baz");

-		

+

 		assertEquals("Check foo equality - 1", fooP, "foo");

 		assertEquals("Check bar equality - 1", barP, new Integer(2));

 		assertEquals("Check baz equality - 1", bazP, "baz");

-		

+

 		ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "FooProvider-3");

 		assertNotNull("Check ManagedService availability", msRef);

-		

+

 		// Configuration of baz

 		Properties conf = new Properties();

 		conf.put("baz", "zab");

@@ -354,53 +354,53 @@
 		conf.put("bar", "0");

         assertEquals("Check instance1 state (2)", ComponentInstance.VALID,instance1.getState());

 		ManagedService ms = (ManagedService) getContext().getService(msRef);

-		

+

 		PrimitiveHandler ph = (PrimitiveHandler) ms;

 		assertSame("Check the correct instance", ph.getInstanceManager(), instance1);

-		

+

 		try {

 			ms.updated(conf);

 		} catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

 		assertEquals("Check instance1 state (3)", ComponentInstance.VALID,instance1.getState());

-		

+

 		// Recheck props

 		fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance1.getInstanceName());

 		fooP = (String) fooRef.getProperty("foo");

 		barP = (Integer) fooRef.getProperty("bar");

 		bazP = (String) fooRef.getProperty("baz");

-		

+

 		assertEquals("Check foo equality - 2", fooP, "oof");

 		assertEquals("Check bar equality - 2", barP, new Integer(0));

 		assertEquals("Check baz equality - 2", bazP, "zab");

-		

+

 		// Check field value

 		FooService fs = (FooService) getContext().getService(fooRef);

 		Properties p = fs.fooProps();

 		fooP = (String) p.get("foo");

 		barP = (Integer) p.get("bar");

-		

+

 		assertEquals("Check foo field equality", fooP, "oof");

 		assertEquals("Check bar field equality", barP, new Integer(0));

-		

+

 		getContext().ungetService(fooRef);

 		getContext().ungetService(msRef);

 	}

-    

+

     public void testDynamicStringInstance2() {

         ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());

         assertNotNull("Check FS availability", fooRef);

-        

+

         String fooP = (String) fooRef.getProperty("foo");

         Integer barP = (Integer) fooRef.getProperty("bar");

         String bazP = (String) fooRef.getProperty("baz");

-        

+

         assertEquals("Check foo equality", fooP, "foo");

         assertEquals("Check bar equality", barP, new Integer(2));

         assertEquals("Check baz equality", bazP, "baz");

-        

+

         ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "instance");

         assertNotNull("Check ManagedService availability", msRef);

-        

+

         // Configuration of baz

         Properties conf = new Properties();

         conf.put("baz", "zab");

@@ -410,45 +410,45 @@
         try {

             ms.updated(conf);

         } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

-        

+

         // Recheck props

         fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());

         fooP = (String) fooRef.getProperty("foo");

         barP = (Integer) fooRef.getProperty("bar");

         bazP = (String) fooRef.getProperty("baz");

-        

+

         assertEquals("Check foo equality", fooP, "oof");

         assertEquals("Check bar equality", barP, new Integer(0));

         assertEquals("Check baz equality", bazP, "zab");

-        

+

         // Check field value

         FooService fs = (FooService) getContext().getService(fooRef);

         Properties p = fs.fooProps();

         fooP = (String) p.get("foo");

         barP = (Integer) p.get("bar");

-        

+

         assertEquals("Check foo field equality", fooP, "oof");

         assertEquals("Check bar field equality", barP, new Integer(0));

-        

+

         getContext().ungetService(fooRef);

         getContext().ungetService(msRef);

     }

-	

+

 	public void testPropagationInstance1() {

 		ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance1.getInstanceName());

 		assertNotNull("Check FS availability", fooRef);

-		

+

 		String fooP = (String) fooRef.getProperty("foo");

 		Integer barP = (Integer) fooRef.getProperty("bar");

 		String bazP = (String) fooRef.getProperty("baz");

-		

+

 		assertEquals("Check foo equality", fooP, "foo");

 		assertEquals("Check bar equality", barP, new Integer(2));

 		assertEquals("Check baz equality", bazP, "baz");

-		

+

 		ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "FooProvider-3");

 		assertNotNull("Check ManagedService availability", msRef);

-		

+

 		// Configuration of baz

 		Properties conf = new Properties();

 		conf.put("baz", "zab");

@@ -460,7 +460,7 @@
 		try {

 			ms.updated(conf);

 		} catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

-		

+

 		// Recheck props

 		fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance1.getInstanceName());

 		fooP = (String) fooRef.getProperty("foo");

@@ -470,31 +470,31 @@
 		String prop1 = (String) fooRef.getProperty("propagated1");

 		assertNotNull("Check the propagated2 existency", fooRef.getProperty("propagated2"));

 		Integer prop2 = (Integer) fooRef.getProperty("propagated2");

-		

+

 		assertEquals("Check foo equality", fooP, "foo");

 		assertEquals("Check bar equality", barP, new Integer(2));

 		assertEquals("Check baz equality", bazP, "zab");

 		assertEquals("Check propagated1 equality", prop1, "propagated");

 		assertEquals("Check propagated2 equality", prop2, new Integer(1));

-		

+

 		getContext().ungetService(msRef);

 	}

-	

+

 	public void testPropagationInstance2() {

         ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());

         assertNotNull("Check FS availability", fooRef);

-        

+

         String fooP = (String) fooRef.getProperty("foo");

         Integer barP = (Integer) fooRef.getProperty("bar");

         String bazP = (String) fooRef.getProperty("baz");

-        

+

         assertEquals("Check foo equality", fooP, "foo");

         assertEquals("Check bar equality", barP, new Integer(2));

         assertEquals("Check baz equality", bazP, "baz");

-        

+

         ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "instance");

         assertNotNull("Check ManagedService availability", msRef);

-        

+

         // Configuration of baz

         Properties conf = new Properties();

         conf.put("baz", "zab");

@@ -506,7 +506,7 @@
         try {

             ms.updated(conf);

         } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

-        

+

         // Recheck props

         fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance2.getInstanceName());

         fooP = (String) fooRef.getProperty("foo");

@@ -516,31 +516,31 @@
         String prop1 = (String) fooRef.getProperty("propagated1");

         assertNotNull("Check the propagated2 existency", fooRef.getProperty("propagated2"));

         Integer prop2 = (Integer) fooRef.getProperty("propagated2");

-        

+

         assertEquals("Check foo equality", fooP, "foo");

         assertEquals("Check bar equality", barP, new Integer(2));

         assertEquals("Check baz equality", bazP, "zab");

         assertEquals("Check propagated1 equality", prop1, "propagated");

         assertEquals("Check propagated2 equality", prop2, new Integer(1));

-        

+

         getContext().ungetService(msRef);

     }

-	

+

 	public void testPropagationInstance3() {

         ServiceReference fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance3.getInstanceName());

         assertNotNull("Check FS availability", fooRef);

-        

+

         Object fooP = fooRef.getProperty("foo");

         Object barP =  fooRef.getProperty("bar");

         Object bazP =  fooRef.getProperty("baz");

-        

+

         assertEquals("Check foo equality", fooP, null);

         assertEquals("Check bar equality", barP, null);

         assertEquals("Check baz equality", bazP, null);

-        

+

         ServiceReference msRef = Utils.getServiceReferenceByPID(getContext(), ManagedService.class.getName(), "instance-3");

         assertNotNull("Check ManagedService availability", msRef);

-        

+

         // Configuration of baz

         Properties conf = new Properties();

         conf.put("baz", "zab");

@@ -552,7 +552,7 @@
         try {

             ms.updated(conf);

         } catch (ConfigurationException e) { fail("Configuration Exception : " + e); }

-        

+

         // Recheck props

         fooRef = Utils.getServiceReferenceByName(getContext(), FooService.class.getName(), instance3.getInstanceName());

         fooP = (String) fooRef.getProperty("foo");

@@ -562,14 +562,16 @@
         String prop1 = (String) fooRef.getProperty("propagated1");

         assertNotNull("Check the propagated2 existency", fooRef.getProperty("propagated2"));

         Integer prop2 = (Integer) fooRef.getProperty("propagated2");

-        

+

         assertEquals("Check foo equality", fooP, "foo");

         assertEquals("Check bar equality", barP, new Integer(2));

         assertEquals("Check baz equality", bazP, "zab");

         assertEquals("Check propagated1 equality", prop1, "propagated");

         assertEquals("Check propagated2 equality", prop2, new Integer(1));

-        

+

         getContext().ungetService(msRef);

     }

+	

+

 

 }