Author: djencks
Date: Sat Feb 23 20:07:44 2013
New Revision: 1449401

URL: http://svn.apache.org/r1449401
Log:
FELIX-3915 Avoid possible double update of component on startup

Modified:
    
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ComponentHolder.java
    
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
    
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
    
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java

Modified: 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ComponentHolder.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ComponentHolder.java?rev=1449401&r1=1449400&r2=1449401&view=diff
==============================================================================
--- 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ComponentHolder.java
 (original)
+++ 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ComponentHolder.java
 Sat Feb 23 20:07:44 2013
@@ -69,6 +69,12 @@ public interface ComponentHolder
      * @param pid The PID of the configuration used to configure the component
      */
     void configurationUpdated( String pid, Dictionary<String, Object> props );
+    
+    /**
+     * Has this component holder ever been configured?  Used to avoid double 
update during startup
+     * @return true if configurationUpdated has ever been called on this 
holder.
+     */
+    boolean isConfigured();
 
     /**
      * Returns all <code>Component</code> instances held by this holder.

Modified: 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java?rev=1449401&r1=1449400&r2=1449401&view=diff
==============================================================================
--- 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
 (original)
+++ 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ConfigurationSupport.java
 Sat Feb 23 20:07:44 2013
@@ -74,7 +74,7 @@ public class ConfigurationSupport implem
     {
 
         // 112.7 configure unless configuration not required
-        if (!holder.getComponentMetadata().isConfigurationIgnored())
+        if (!holder.isConfigured() && 
!holder.getComponentMetadata().isConfigurationIgnored())
         {
             final BundleContext bundleContext = 
holder.getActivator().getBundleContext();
             final String bundleLocation = 
bundleContext.getBundle().getLocation();

Modified: 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java?rev=1449401&r1=1449400&r2=1449401&view=diff
==============================================================================
--- 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
 (original)
+++ 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/config/ImmediateComponentHolder.java
 Sat Feb 23 20:07:44 2013
@@ -105,6 +105,8 @@ public class ImmediateComponentHolder im
      */
     private volatile boolean m_enabled;
     private final ComponentMethods m_componentMethods;
+    
+    private volatile boolean m_configured;
 
 
     public ImmediateComponentHolder( final BundleComponentActivator activator, 
final ComponentMetadata metadata )
@@ -268,11 +270,12 @@ public class ImmediateComponentHolder im
      * this case a new component is created, configured and stored in the 
map</li>
      * </ul>
      */
-    public void configurationUpdated( final String pid, final Dictionary props 
)
+    public void configurationUpdated( final String pid, final 
Dictionary<String, Object> props )
     {
         log( LogService.LOG_DEBUG, "ImmediateComponentHolder configuration 
updated for pid {0} with properties {1}",
                 new Object[] {pid, props}, null);
 
+        m_configured = true;
         // component to update or create
         final ImmediateComponentManager icm;
         final String message;
@@ -356,6 +359,10 @@ public class ImmediateComponentHolder im
         }
     }
 
+    public boolean isConfigured()
+    {
+        return m_configured;
+    }
 
     public Component[] getComponents()
     {

Modified: 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
URL: 
http://svn.apache.org/viewvc/felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java?rev=1449401&r1=1449400&r2=1449401&view=diff
==============================================================================
--- 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
 (original)
+++ 
felix/trunk/scr/src/main/java/org/apache/felix/scr/impl/manager/ComponentFactoryImpl.java
 Sat Feb 23 20:07:44 2013
@@ -78,11 +78,16 @@ public class ComponentFactoryImpl<S> ext
     private volatile Dictionary<String, Object> m_configuration;
     
     /**
-     * Flag telling if our component factory is configured from config admin.
+     * Flag telling if our component factory is currently configured from 
config admin.
      * We are configured when configuration policy is required and we have 
received the
      * config admin properties, or when configuration policy is optional or 
ignored.
      */
-    public volatile boolean m_isConfigured;
+    private volatile boolean m_hasConfiguration;
+    
+    /**
+     * whether this holder has ever been configured.
+     */
+    private volatile boolean m_isConfigured;
 
     public ComponentFactoryImpl( BundleComponentActivator activator, 
ComponentMetadata metadata )
     {
@@ -202,7 +207,7 @@ public class ComponentFactoryImpl<S> ext
 
     public boolean hasConfiguration()
     {
-        return m_isConfigured;
+        return m_hasConfiguration;
     }
 
 
@@ -314,14 +319,14 @@ public class ComponentFactoryImpl<S> ext
             log( LogService.LOG_DEBUG, "Handling configuration removal", null 
);
 
             // nothing to do if there is no configuration currently known.
-            if ( !m_isConfigured )
+            if ( !m_hasConfiguration )
             {
                 log( LogService.LOG_DEBUG, "ignoring configuration removal: 
not currently configured", null );
                 return;
             }
 
             // So far, we were configured: clear the current configuration.
-            m_isConfigured = false;
+            m_hasConfiguration = false;
             m_configuration = new Hashtable();
 
             log( LogService.LOG_DEBUG, "Current component factory state={0}", 
new Object[] {getState()}, null );
@@ -343,6 +348,7 @@ public class ComponentFactoryImpl<S> ext
 
     public void configurationUpdated( String pid, Dictionary<String, Object> 
configuration )
     {
+        m_isConfigured = true;
         if ( pid.equals( getComponentMetadata().getConfigurationPid() ) )
         {
             log( LogService.LOG_INFO, "Configuration PID updated for Component 
Factory", null );
@@ -357,7 +363,7 @@ public class ComponentFactoryImpl<S> ext
             m_configuration = configuration;
 
             // We are now configured from config admin.
-            m_isConfigured = true;
+            m_hasConfiguration = true;
 
             log( LogService.LOG_INFO, "Current ComponentFactory state={0}", 
new Object[]
                     {getState()}, null );
@@ -398,6 +404,11 @@ public class ComponentFactoryImpl<S> ext
     }
 
 
+    public boolean isConfigured()
+    {
+        return m_isConfigured;
+    }
+    
     public Component[] getComponents()
     {
         List<AbstractComponentManager> cms = getComponentList();


Reply via email to