You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@felix.apache.org by "Pierre De Rop (JIRA)" <ji...@apache.org> on 2012/10/19 22:24:13 UTC
[jira] [Assigned] (FELIX-3700) DS Factory Components don't support
configuration-policy = require
[ 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