[ https://issues.apache.org/jira/browse/FELIX-3700?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Pierre De Rop reassigned FELIX-3700: ------------------------------------ Assignee: Pierre De Rop > DS Factory Components don't support configuration-policy = require > ------------------------------------------------------------------ > > Key: FELIX-3700 > URL: https://issues.apache.org/jira/browse/FELIX-3700 > Project: Felix > Issue Type: Bug > Components: Declarative Services (SCR) > Environment: linux, jdk1.6 > Reporter: Pierre De Rop > Assignee: Pierre De Rop > Attachments: ComponentFactoryTest.java, FELIX-37000.patch2, > FELIX-37000.patch3, FELIX-3700.patch > > > With scr 1.6.0 and also with scr from trunk, there is the following problem: > When a factory component (declared with a factory attribute in the Component > element), and when the Component is also defined with configuration-policy = > require, then the org.osgi.service.component.ComponentFactory associated to > the factory component is registered in the OSGi registry even if the > configuration for the component is not yet available. > This is a problem because when the > org.osgi.service.component.ComponentFactory is registered in the registry, > then another component using the ComponentFactory may call the newInstance > method and then instantiate the component without the required configuration. > For example, in the following code, Main is injected with the A > ComponentFactory and creates immediately one A instance: but at this point, > the Configuration for A has not yet been created (see in the Main.start > method, where a thread is started in order to create the A configuration > after 1 second ...). > I expect A ComponentFactory to be registered only after the A Configuration > is available from config admin, because the A configuration-policy has been > set to the "require" value. > Am I correct or does the spec forbid factory components to use the > configuration-policy = require ? > -> > @Component(name="A", factory = "A", configurationPolicy = > ConfigurationPolicy.require) > public class A { > @Activate > void start(Map<?, ?> config) { > System.out.println("A.start:" + config.get("foo"); > } > } > @Component > public class Main { > private ConfigurationAdmin _cm; > > @Reference(type = '*', target = "(component.factory=A)") > void bindCF(ComponentFactory cf) { // should only be called once A config > admin configuration is avail > System.out.println("Main.bindCF"); > cf.newInstance(null); > } > > @Reference > void bindCM(ConfigurationAdmin cm) { > _cm = cm; > } > > @Activate > void start() { > System.out.println("Main.start"); > > new Thread(new Runnable() { > public void run() { > try { > Thread.sleep(1000); > System.out.println("Configuring A"); > Configuration config = _cm.getConfiguration("A", null); > config.update(new Hashtable() { > { > put("foo", "bar"); > } > }); > } catch (Exception ioe) { > ioe.printStackTrace(); > } > } > }).start(); > } > } -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira