[ 
https://issues.apache.org/jira/browse/FELIX-3700?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Pierre De Rop updated FELIX-3700:
---------------------------------

    Attachment: FELIX-37000.patch3

thanks David,

I applied your suggestion and it seems to work. 
I joined the FELIX-37000.patch3 diff with the modifications you suggested.
(I don't commit for now because I prefer to test this patch during a couple of 
days, before committing).

I have one remaining question:

It looks like the super.updateTargets(Properties) method should be invoked 
while holding a lock. So, I'm using a read lock. Should I use a write lock 
instead of a read lock ?

thanks.

                
> 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
>         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

Reply via email to