DM/ annotated component factory does not allow to provide a component instance 
explicitly
-----------------------------------------------------------------------------------------

                 Key: FELIX-2954
                 URL: https://issues.apache.org/jira/browse/FELIX-2954
             Project: Felix
          Issue Type: Improvement
          Components: Dependency Manager
            Reporter: Pierre De Rop
            Assignee: Pierre De Rop
            Priority: Minor


This change request concerns dependency manager annotations.

Currently, it is possible to trigger an instantiation of a given annotated 
dependency manager Component, using the "factorySet" attribute of the 
"@Component" annotation.
A "factory set" is similar to declarative service "component factory", except 
that a Set<Dictionary> is provided in the OSGi registry, instead of the
"org.osgi.service.component.ComponentFactory" SCR object.
This Set<Dicionary> acts as a factory API and can be considered as a repository 
of component instances configurations.
(there is one component created per each dictionary stored in the set).

For instance, in the following example, the component X is instantiated by the 
component Y, like this:

  @Component(factorySet="MyComponentFactory")
  class X implements Z {
        ...
  }

  @Component
  class Y {
      @ServiceDependency(filter="(dm.factory.name=MyComponentFactory)")
      Set<Dictionary> _XFactory; // This Set acts as a Factory API for creating 
X component instances.

      @Start
      void start() {
          // Instantiate a X component instance
          Dictionary x1 = new Hashtable() {{ put("foo", "bar"); }};
          _XFactory.add(x1); // create a new X component instance
      }
  }

In the above example, Y instantiates one X component, by passing an instance 
dictionary configuration into the set "_XFactory".
The X component is instantiated using the X default constructor, and currently, 
the Y component can not create itself the X component instance object.

The purpose of this change request is to allow the Y class to explicitly 
provide the X component instance, by passing a special
key in the component configuration (x1), whose value may contain the actual 
component instance object.

For instance:

  @Component
  class Y {
      @ServiceDependency(filter="(dm.factory.name=MyComponentFactory)")
      Set<Dictionary> _XFactory;

      @Start
      void start() {
          // Instantiate a X component instance, and pass the real component 
instance in the dictionary:
          Dictionary x1 = new Hashtable() {{ 
               put("foo", "bar"); 
               put("dm.factory.instance", new X(whatever params));
           }};
          _XFactory.add(x1); // create a new X dependency manager component 
instance, using the object instance passed to the "dm.factory.instance" key
      }
  }



--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to