Author: pderop
Date: Tue May 24 10:05:44 2011
New Revision: 1126961
URL: http://svn.apache.org/viewvc?rev=1126961&view=rev
Log:
[FELIX-2970] - Factory Configuration Adapter Service does not copy adapter
dependencies.
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceClient.java
felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceProvider.java
felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/annotation/FactoryConfigurationAdapterAnnotationTest.java
Modified:
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java?rev=1126961&r1=1126960&r2=1126961&view=diff
==============================================================================
---
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
(original)
+++
felix/trunk/dependencymanager/core/src/main/java/org/apache/felix/dm/impl/FactoryConfigurationAdapterServiceImpl.java
Tue May 24 10:05:44 2011
@@ -27,6 +27,7 @@ import java.util.List;
import org.apache.felix.dm.Component;
import org.apache.felix.dm.ComponentStateListener;
+import org.apache.felix.dm.Dependency;
import org.apache.felix.dm.DependencyManager;
import org.apache.felix.dm.InvocationUtil;
import org.apache.felix.dm.PropertyMetaData;
@@ -126,17 +127,22 @@ public class FactoryConfigurationAdapter
}
// Merge adapter service properties, with CM settings
- Dictionary serviceProperties = m_propagate ?
mergeSettings(m_serviceProperties, settings) : m_serviceProperties;
+ Dictionary serviceProperties = getServiceProperties(settings);
newService.setInterface(m_serviceInterfaces, serviceProperties);
newService.setImplementation(impl);
- List dependencies = m_component.getDependencies();
- newService.add(dependencies); // TODO check if we should create a
copy of dependencies ?
newService.setComposition(m_compositionInstance,
m_compositionMethod); // if not set, no effect
newService.setCallbacks(m_callbackObject, m_init, m_start, m_stop,
m_destroy); // if not set, no effect
+ configureAutoConfigState(newService, m_component);
+
+ List dependencies = m_component.getDependencies();
+ for (int i = 0; i < dependencies.size(); i++) {
+ newService.add(((Dependency)
dependencies.get(i)).createCopy());
+ }
+
for (int i = 0; i < m_stateListeners.size(); i ++) {
newService.addStateListener((ComponentStateListener)
m_stateListeners.get(i));
}
- configureAutoConfigState(newService, m_component);
+
return newService;
}
@@ -145,17 +151,17 @@ public class FactoryConfigurationAdapter
* the configuration has changed.
*/
public void updateService(Object[] properties) {
- Dictionary settings = (Dictionary) properties[0];
+ Dictionary cmSettings = (Dictionary) properties[0];
Component service = (Component) properties[1];
Object impl = service.getService();
try {
InvocationUtil.invokeCallbackMethod(impl, m_update,
new Class[][] {{ Dictionary.class }, {}},
- new Object[][] {{ settings }, {}});
+ new Object[][] {{ cmSettings }, {}});
if (m_serviceInterfaces != null && m_propagate == true) {
- settings = mergeSettings(m_serviceProperties, settings);
- service.setServiceProperties(settings);
+ Dictionary serviceProperties =
getServiceProperties(cmSettings);
+ service.setServiceProperties(serviceProperties);
}
}
@@ -172,27 +178,34 @@ public class FactoryConfigurationAdapter
* @param settings
* @return
*/
- private Dictionary mergeSettings(Dictionary adapterProperties,
Dictionary settings) {
+ private Dictionary getServiceProperties(Dictionary settings) {
Dictionary props = new Hashtable();
- if (adapterProperties != null) {
- Enumeration keys = adapterProperties.keys();
+ // Add adapter Service Properties
+ if (m_serviceProperties != null) {
+ Enumeration keys = m_serviceProperties.keys();
while (keys.hasMoreElements()) {
Object key = keys.nextElement();
- Object val = adapterProperties.get(key);
+ Object val = m_serviceProperties.get(key);
props.put(key, val);
}
}
-
- Enumeration keys = settings.keys();
- while (keys.hasMoreElements()) {
- Object key = keys.nextElement();
- if (! key.toString().startsWith(".")) {
- // public properties are propagated
- Object val = settings.get(key);
- props.put(key, val);
+
+ if (m_propagate) {
+ // Add CM setting into adapter service properties.
+ // (CM setting will override existing adapter service
properties).
+ Enumeration keys = settings.keys();
+ while (keys.hasMoreElements()) {
+ Object key = keys.nextElement();
+ if (! key.toString().startsWith(".")) {
+ // public properties are propagated
+ Object val = settings.get(key);
+ props.put(key, val);
+ }
}
}
+
+
return props;
}
Modified:
felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceClient.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceClient.java?rev=1126961&r1=1126960&r2=1126961&view=diff
==============================================================================
---
felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceClient.java
(original)
+++
felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceClient.java
Tue May 24 10:05:44 2011
@@ -27,12 +27,30 @@ import org.apache.felix.dm.annotation.ap
public class ServiceClient
{
@ServiceDependency(changed="changeServiceProvider")
- void addServiceProvider(ServiceInterface si) {
+ void addServiceProvider(Map props, ServiceInterface si) {
+ // props should contain foo=bar, foo2=bar2
+ if (! "bar".equals(props.get("foo")))
+ {
+ throw new IllegalArgumentException("configuration does not contain
foo=bar: " + props);
+ }
+ if (! "bar2".equals(props.get("foo2")))
+ {
+ throw new IllegalArgumentException("configuration does not contain
foo2=bar2: " + props);
+ }
si.doService();
}
- void changeServiceProvider(Map serviceProperties, ServiceInterface si)
+ void changeServiceProvider(Map props, ServiceInterface si)
{
+ // props should contain foo=bar, foo2=bar2_modified
+ if (! "bar".equals(props.get("foo")))
+ {
+ throw new IllegalArgumentException("configuration does not contain
foo=bar: " + props);
+ }
+ if (! "bar2_modified".equals(props.get("foo2")))
+ {
+ throw new IllegalArgumentException("configuration does not contain
foo2=bar2: " + props);
+ }
si.doService();
}
}
Modified:
felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceProvider.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceProvider.java?rev=1126961&r1=1126960&r2=1126961&view=diff
==============================================================================
---
felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceProvider.java
(original)
+++
felix/trunk/dependencymanager/test/src/main/java/org/apache/felix/dm/test/bundle/annotation/factoryconfadapter/ServiceProvider.java
Tue May 24 10:05:44 2011
@@ -60,8 +60,21 @@ public class ServiceProvider implements
{
if (m_started)
{
+ // conf should contain foo2=bar2_modified
+ if (! "bar2_modified".equals(conf.get("foo2")))
+ {
+ m_sequencer.throwable(new Exception("configuration does not
contain foo=bar"));
+ }
m_sequencer.step(4);
}
+ else
+ {
+ // conf should contain foo2=bar2
+ if (! "bar2".equals(conf.get("foo2")))
+ {
+ throw new IllegalArgumentException("configuration does not
contain foo2=bar2: " + conf);
+ }
+ }
}
@Start
Modified:
felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/annotation/FactoryConfigurationAdapterAnnotationTest.java
URL:
http://svn.apache.org/viewvc/felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/annotation/FactoryConfigurationAdapterAnnotationTest.java?rev=1126961&r1=1126960&r2=1126961&view=diff
==============================================================================
---
felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/annotation/FactoryConfigurationAdapterAnnotationTest.java
(original)
+++
felix/trunk/dependencymanager/test/src/test/java/org/apache/felix/dm/test/annotation/FactoryConfigurationAdapterAnnotationTest.java
Tue May 24 10:05:44 2011
@@ -79,11 +79,11 @@ public class FactoryConfigurationAdapter
{
// Create a factory configuration in order to instantiate the
ServiceProvider
org.osgi.service.cm.Configuration cf =
cm.createFactoryConfiguration("FactoryPidTest", null);
- cf.update(new Hashtable() {{ put("foo", "bar"); }});
+ cf.update(new Hashtable() {{ put("foo2", "bar2"); }});
// Wait for the ServiceProvider activation.
m_ensure.waitForStep(2, 10000);
// Update conf
- cf.update(new Hashtable() {{ put("foo", "bar2"); }});
+ cf.update(new Hashtable() {{ put("foo2", "bar2_modified"); }});
// Wait for effective update
m_ensure.waitForStep(4, 10000);
// Remove configuration.