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/05 11:25:03 UTC

[jira] [Updated] (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 updated FELIX-3700:
---------------------------------

    Description: 
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();
  }
}


  was:
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(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();
  }
}


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