Author: fmeschbe
Date: Tue Nov 24 11:19:06 2009
New Revision: 883652

URL: http://svn.apache.org/viewvc?rev=883652&view=rev
Log:
FELIX-1841 Prevent updating the service registration if service properties did 
not change as of the configuration update (this may be the case if the 
configuration update only contains modified private properties not propagated 
to service registration properties) (Thanks Pierre de Rop for providing the 
patch)

Modified:
    
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java

Modified: 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java?rev=883652&r1=883651&r2=883652&view=diff
==============================================================================
--- 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
 (original)
+++ 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ImmediateComponentManager.java
 Tue Nov 24 11:19:06 2009
@@ -20,6 +20,7 @@
 
 
 import java.util.Dictionary;
+import java.util.Hashtable;
 import java.util.Iterator;
 import java.util.List;
 
@@ -468,8 +469,12 @@
         {
             try
             {
+                // Don't propagate if service properties did not change.
                 final Dictionary regProps = getServiceProperties();
-                sr.setProperties( regProps );
+                if ( !servicePropertiesMatches( sr, regProps ) )
+                {
+                    sr.setProperties( regProps );
+                }
             }
             catch ( IllegalStateException ise )
             {
@@ -491,4 +496,31 @@
         // 7. everything set and done, the component has been udpated
         return true;
     }
+
+
+    /**
+     * Checks if the given service registration properties matches another set
+     * of properties.
+     *
+     * @param reg the service registration whose service properties will be
+     *      compared to the props parameter
+     * @param props the properties to be compared with the registration
+     *      service properties.
+     * @return <code>true</code> if the registration service properties equals
+     *      the prop properties, false if not.
+     */
+    private boolean servicePropertiesMatches( ServiceRegistration reg, 
Dictionary props )
+    {
+        Dictionary regProps = new Hashtable();
+        String[] keys = reg.getReference().getPropertyKeys();
+        for ( int i = 0; keys != null && i < keys.length; i++ )
+        {
+            if ( !keys[i].equals( org.osgi.framework.Constants.OBJECTCLASS )
+                && !keys[i].equals( org.osgi.framework.Constants.SERVICE_ID ) )
+            {
+                regProps.put( keys[i], reg.getReference().getProperty( keys[i] 
) );
+            }
+        }
+        return regProps.equals( props );
+    }
 }


Reply via email to