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