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

Pierre De Rop updated FELIX-4684:
---------------------------------
    Component/s:     (was: Dependency Manager)
                 Dependency Manager Runtime
                 Dependency Manager Annotations

> Replace DependencyManager Runtime "factorySet" by a cleaner API
> ---------------------------------------------------------------
>
>                 Key: FELIX-4684
>                 URL: https://issues.apache.org/jira/browse/FELIX-4684
>             Project: Felix
>          Issue Type: Wish
>          Components: Dependency Manager Annotations, Dependency Manager 
> Runtime
>    Affects Versions: dependencymanager.annotations-3.2.0, 
> dependencymanager.runtime-3.2.0
>            Reporter: Pierre De Rop
>            Assignee: Pierre De Rop
>            Priority: Minor
>             Fix For: org.apache.felix.dependencymanager-r1
>
>
> When using  DependencyManager annotations, there is the ability to create 
> component instances using "factory sets", which are similar to the 
> (beautiful) Declarative Service component factories, except that instead of 
> providing in the OSGI registry a clean interface like 
> org.osgi.service.component.ComponentFactory, a "java.util.Set" object is 
> registered and when you add a dictionary in the Set, a corresponding 
> component instance is created.
> whilst using a java.util.Set allows to prevent application to depend on a 
> specific API, it turns out that using a Set as a factory for objects is 
> counterintuitive , and when you read a code which depends on a java.util.Set 
> object, the code is difficult to understand. Moreover, you can't assign a 
> version to the java.util package.
> So, this issue is about to just simply replace the java.util.Set with a nice 
> and simple interface which would be exported by the DM runtime bundle. For 
> sake of clarity, we can use the same interface names as declarative service: 
> ComponentFactory with a nice "newInstance(Dictionary)" method which returns 
> some ComponentInstances.  
> And from the @Component annotation, a new "factorySet" attribute can be used 
> instead of the factorySet one;
> That would give:
> {code}
> @Component(factoryName = "Device", factoryConfigure = "configure")
> public class DeviceImpl implements Device {
>     int id;
>     void configure(Dictionary<String, Object> configuration) {
>         this.id = (Integer) configuration.get("device.id");
>     }
>     @Override
>     public int getDeviceId() {
>         return id;
>     }
> }
> {code}
> and the above component could then be instantiated multiple times like this:
> {code}
> @Component
> public class DeviceFactory {
>     @ServiceDependency(filter = "(" + Component.FACTORY_NAME + "=Device)")
>     volatile ComponentFactory m_deviceFactory;
>         
>     private ComponentInstance createDevice(int id) {
>         // create a Device service
>         Dictionary<String,Object> device = new Hashtable<>();
>         device.put("device.id", new Integer(id));
>         return m_deviceFactory.newInstance(device);    
>     }    
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to