You have 2 component factories with the exact same factory name: 
org.example.ds.iintegratedapplication.

You should use different factory names and incorporate the vendor 
information into that name. org.example.ds.iintegratedapplication.DLR for 
example.

Both services will have the same interface name (objectClass) but will 
have different component factory names distinguished by the vendor 
(component.factory).
-- 

BJ Hargrave
Senior Technical Staff Member, IBM
OSGi Fellow and CTO of the OSGi Alliance
[email protected]

office: +1 386 848 1781
mobile: +1 386 848 3788




From:
<[email protected]>
To:
<[email protected]>
Date:
2009/05/04 11:35
Subject:
[osgi-dev] ComponentFactory and Properties
Sent by:
[email protected]



Hi all,

We are designing some kind of registry for special kinds of applications, 
based on OSGi Services. This registry shall create instances of those 
applications on demand and as many instances as needed by the consumers. 
We found the ComponentFactory of the OSGi Declarative Services 
specification fitting those needs. Unfortunately we still see a small 
problem. The user shall be able to decide which application he wants to 
create, based on some kind of metadata. This metadata is provided by means 
of Properties, which can be declared in the service description XML file. 
Example of two applications, using the same component factory, with 
different property values for the “vendor” property:
<component factory="org.example.ds.iintegratedapplication" name="Test 
Application">
        <implementation class="org.example.ia.TestApplication"/>
        <service>
                <provide interface="org.example.ia.IIntegratedApplication"
/>
        </service>
      <property name=“vendor“ value=”Sistec”>
</component>
<component factory="org.example.ds.iintegratedapplication" name="Another 
Test Application">
        <implementation class="org.example.ia.AnotherTestApplication"/>
        <service>
                <provide interface="org.example.ia.IIntegratedApplication"
/>
        </service>
      <property name=“vendor“ value=”DLR”>
</component>
The Registry of the applications looks similar to this:
public class Registry {
        private List<ComponentFactory> apps = new 
ArrayList<ComponentFactory>();
 
        protected synchronized void addApplication(ComponentFactory c) {
                apps.add(c);
        }
        protected synchronized void removeApplication(ComponentFactory c) 
{
                apps.remove(c);
        }
}
Now we want to add a “getApplications” method, which returns a list of the 
names of the applications and its properties:
Name                                                    Vendor
org.example.ia.TestApplication          Sistec
org.example.ia.AnotherTestApplication   DLR
As far as we see, the properties can only be read after calling 
newInstance() of the ComponentFactory, since the Declarative Services 
specification states:
“The service properties of the Component Factory service must not include 
the component properties.”
But we would like to select which service to create based on that 
properties before initializing it. Is there any way to do that?

Regards,
Heinrich Wendel
-----------------------------------------------------
Dipl.-Ing. (BA) Heinrich Wendel
Deutsches Zentrum fuer Luft- und Raumfahrt e.V. (DLR)
Simulations- und Softwaretechnik (SISTEC) Koeln-Porz
Tel: (02203) 601-3305  http://www.dlr.de/sc
Fax: (02203) 601-3070  mailto:[email protected]
_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev

_______________________________________________
OSGi Developer Mail List
[email protected]
https://mail.osgi.org/mailman/listinfo/osgi-dev

Reply via email to