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();