Clement, thanks for responding. I'll go one better, I'll upload the system I am 
currently working on (don't worry, it's not much more than a test case at the 
moment as the project is VERY early in development). I'll get this done today 
and provide details when it's done.


On 4 Jul 2012, at 07:36, Clement Escoffier wrote:

> Hi,
> 
> I don't really see why all imported services are not injected correctly. They 
> are imported correctly, but it seems like the instance does not see all of 
> them. 
> Would you have a mean to provide me a 'test case' to let me check what's 
> going wrong here. 
> 
> Regards,
> 
> Clement
> 
> 
> On 03.07.2012, at 18:27, Mark Bools wrote:
> 
>> Still puzzled by this one. Any help appreciated.
>> 
>> I've continued to poke this one with a sharp stick, but I'm not making any 
>> progress.
>> 
>> I recently removed the (optional="true") requirement from the @Requires for 
>> the adapter array (everything else is as originally described, although I 
>> added one more Adapter implementation; MVNAdapter) and now I get one Adapter 
>> mapped into the adapter array and, as can be seen below, I get one Adapter 
>> satisfying the requires in the DataSourceManager instance. What I do not 
>> understand is why? The require is clearly aggregate="true" and I expected 
>> that all imported Adapter instances would be mapped in under those 
>> circumstances, am I wrong in thinking that?
>> 
>> All of the relevant services are being imported (or that's how I read this 
>> output), but only the first one seems to be dynamically mapped into the 
>> requires of the DataSourceManagerImpl-0 instance, and consequently  to the 
>> adapter array.
>> 
>> instance DataSourceManager
>> instance name="DataSourceManager" state="valid" bundle="39" 
>> component.type="DataSourceManager"
>>      handler name="org.apache.felix.ipojo:instance" state="valid"
>>              instance 
>> factory="com.itslm.omneity.data.service.DataSourceManagerImpl" 
>> name="com.itslm.omneity.data.service.DataSourceManagerImpl-0" state="valid"
>>      handler name="org.apache.felix.ipojo:provides" state="valid"
>>              exports 
>> specification="com.itslm.omneity.data.api.DataSourceManager" 
>> filter="(objectClass=com.itslm.omneity.data.api.DataSourceManager)" 
>> state="resolved"
>>      handler name="org.apache.felix.ipojo:subservice" state="valid"
>>              requires specification="com.itslm.omneity.adapter.api.Adapter" 
>> filter="(&(objectClass=com.itslm.omneity.adapter.api.Adapter)(!(instance.name=DataSourceManager)))"
>>  state="resolved"
>>                      provider 
>> name="com.itslm.omneity.adapter.obr.OBRAdapter-0"
>>                      provider 
>> name="com.itslm.omneity.adapter.obr.OBRAdapter-1"
>>                      provider 
>> name="com.itslm.omneity.adapter.mvn.MVNAdapter-0"
>>              requires specification="org.osgi.service.log.LogService" 
>> filter="(&(objectClass=org.osgi.service.log.LogService)(!(instance.name=DataSourceManager)))"
>>  state="resolved"
>>                      provider name="null"
>>      handler name="org.apache.felix.ipojo:architecture" state="valid"
>>      services
>>              service 
>> architecture.instance="com.itslm.omneity.data.service.DataSourceManagerImpl-0"
>>  factory.name="architecture" instance.name="architecture-7" 
>> objectclass="[org.apache.felix.ipojo.architecture.Architecture]" 
>> service.id="5"
>>              service factory.name="com.itslm.omneity.adapter.obr.OBRAdapter" 
>> instance.name="com.itslm.omneity.adapter.obr.OBRAdapter-0" 
>> objectclass="[com.itslm.omneity.adapter.api.Adapter]" scheme="obr" 
>> service.id="6"
>>              service 
>> factory.name="com.itslm.omneity.data.service.DataSourceManagerImpl" 
>> instance.name="com.itslm.omneity.data.service.DataSourceManagerImpl-0" 
>> objectclass="[com.itslm.omneity.data.api.DataSourceManager, 
>> com.tinkerpop.blueprints.TransactionalGraph, 
>> com.tinkerpop.blueprints.KeyIndexableGraph, 
>> com.tinkerpop.blueprints.IndexableGraph, com.tinkerpop.blueprints.Graph]" 
>> service.id="7"
>>              service factory.name="com.itslm.omneity.adapter.obr.OBRAdapter" 
>> instance.name="com.itslm.omneity.adapter.obr.OBRAdapter-1" 
>> objectclass="[com.itslm.omneity.adapter.api.Adapter]" scheme="obr" 
>> service.id="8"
>>              service factory.name="com.itslm.omneity.adapter.mvn.MVNAdapter" 
>> instance.name="com.itslm.omneity.adapter.mvn.MVNAdapter-0" 
>> objectclass="[com.itslm.omneity.adapter.api.Adapter]" scheme="mvn" 
>> service.id="9"
>>              service objectclass="[org.osgi.service.log.LogService]" 
>> service.id="10"
>>      containedinstances
>>              instance 
>> name="com.itslm.omneity.data.service.DataSourceManagerImpl-0" state="valid" 
>> bundle="37" 
>> component.type="com.itslm.omneity.data.service.DataSourceManagerImpl"
>>                      handler name="org.apache.felix.ipojo:requires" 
>> state="valid"
>>                              requires 
>> specification="com.itslm.omneity.adapter.api.Adapter" 
>> id="com.itslm.omneity.adapter.api.Adapter" optional="false" aggregate="true" 
>> proxy="false" binding-policy="dynamic" state="resolved"
>>                                      uses service.id="6" 
>> instance.name="com.itslm.omneity.adapter.obr.OBRAdapter-0"
>>                      handler name="org.apache.felix.ipojo:callback" 
>> state="valid"
>>                      handler name="org.apache.felix.ipojo:provides" 
>> state="valid"
>>                              provides 
>> specifications="[com.itslm.omneity.data.api.DataSourceManager,com.tinkerpop.blueprints.TransactionalGraph,com.tinkerpop.blueprints.KeyIndexableGraph,com.tinkerpop.blueprints.IndexableGraph,com.tinkerpop.blueprints.Graph]"
>>  state="registered" service.id="7"
>>                                      property name="factory.name" 
>> value="com.itslm.omneity.data.service.DataSourceManagerImpl"
>>                                      property name="instance.name" 
>> value="com.itslm.omneity.data.service.DataSourceManagerImpl-0"
>>                                      controller value="true"
>>                      handler name="org.apache.felix.ipojo:architecture" 
>> state="valid"
>>                      object 
>> name="com.itslm.omneity.data.service.DataSourceManagerImpl@5492de02"
>> g! 
>> 
>> 
>> 
>> 
>> 
>> 
>> If I remove the composite wrapper and instantiate directly, I get what I 
>> expected; all three Adapter services mapped in to the instance and the 
>> adapter array full populated with the three services.
>> 
>> g! instance com.itslm.omneity.data.service.DataSourceManagerImpl-0
>> instance name="com.itslm.omneity.data.service.DataSourceManagerImpl-0" 
>> state="valid" bundle="37" 
>> component.type="com.itslm.omneity.data.service.DataSourceManagerImpl"
>>      handler name="org.apache.felix.ipojo:requires" state="valid"
>>              requires specification="com.itslm.omneity.adapter.api.Adapter" 
>> id="com.itslm.omneity.adapter.api.Adapter" optional="false" aggregate="true" 
>> proxy="false" binding-policy="dynamic" state="resolved"
>>                      uses service.id="37" 
>> instance.name="com.itslm.omneity.adapter.obr.OBRAdapter-1"
>>                      uses service.id="40" 
>> instance.name="com.itslm.omneity.adapter.mvn.MVNAdapter-0"
>>                      uses service.id="35" 
>> instance.name="com.itslm.omneity.adapter.obr.OBRAdapter-0"
>>      handler name="org.apache.felix.ipojo:callback" state="valid"
>>      handler name="org.apache.felix.ipojo:provides" state="valid"
>>              provides 
>> specifications="[com.itslm.omneity.data.api.DataSourceManager,com.tinkerpop.blueprints.TransactionalGraph,com.tinkerpop.blueprints.KeyIndexableGraph,com.tinkerpop.blueprints.IndexableGraph,com.tinkerpop.blueprints.Graph]"
>>  state="registered" service.id="43"
>>                      property name="factory.name" 
>> value="com.itslm.omneity.data.service.DataSourceManagerImpl"
>>                      property name="instance.name" 
>> value="com.itslm.omneity.data.service.DataSourceManagerImpl-0"
>>                      controller value="true"
>>      handler name="org.apache.felix.ipojo:architecture" state="valid"
>>      object 
>> name="com.itslm.omneity.data.service.DataSourceManagerImpl@61ffbcb"
>> g! 
>> 
>> 
>> 
>> 
>> This is really baking my noodle.
>> 
>> Regards,
>> Mark
>> 
>> 
>> On 2 Jul 2012, at 16:07, Mark Bools wrote:
>> 
>>> I've been chasing this one around for a while, so I thought it time to ask. 
>>> :)
>>> 
>>> I have an Adapter service with one implementation OBRAdapter. I can create 
>>> instances of the OBRAdaptor without difficulty using the following 
>>> metadata.xml
>>> 
>>> <ipojo>
>>>     <instance component="com.itslm.omneity.adapter.obr.OBRAdapter">
>>>             <property name="scheme" value="obr1"/>
>>>     </instance>
>>>     <instance component="com.itslm.omneity.adapter.obr.OBRAdapter">
>>>             <property name="scheme" value="obr2"/>
>>>     </instance>
>>> </ipojo>
>>> 
>>> Now, although these are 'system supplied' Adapters I want to isolate  
>>> Adapters inside a data management component so that user supplied 'plugins' 
>>> (that will be picked up programmatically later) have limited access to the 
>>> rest of the system. So I created a composite using the following 
>>> metadata.xml on a substantially empty jar (with only bundle identity, 
>>> basically):
>>> 
>>> <ipojo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
>>>     xsi:schemaLocation="org.apache.felix.ipojo 
>>> http://felix.apache.org/ipojo/schemas/SNAPSHOT/core.xsd 
>>>         org.apache.felix.composite 
>>> http://felix.apache.org/ipojo/schemas/SNAPSHOT/composite.xsd";
>>>     xmlns="org.apache.felix.ipojo" 
>>> xmlns:comp="org.apache.felix.ipojo.composite">
>>> 
>>>     <comp:composite name="DataSourceManager">
>>>             <comp:instance 
>>> component="com.itslm.omneity.data.service.DataSourceManagerImpl" />
>>>             <comp:provides action="export"
>>>                     
>>> specification="com.itslm.omneity.data.api.DataSourceManager" />
>>> 
>>>             <!-- Will programmatically identify and load Adaptor plugins, 
>>> this next 
>>>                     entry imports Adapters in the global scope (so, only 
>>> those that are in the 
>>>                     main bundle directory) 
>>>                     -->
>>>             <comp:subservice action="import" aggregate="true"
>>>                     specification="com.itslm.omneity.adapter.api.Adapter" />
>>> 
>>>             <comp:subservice action="import"
>>>                     specification="org.osgi.service.log.LogService" />
>>> 
>>>     </comp:composite>
>>> 
>>>     <comp:instance component="DataSourceManager" name="DataSourceManager" />
>>> 
>>> </ipojo>
>>> 
>>> When I examine the running system I see the two Adapters apparently 
>>> instantiated and available inside the DataSourceManager component (as I 
>>> hoped).
>>> 
>>> g! instance DataSourceManager
>>> instance name="DataSourceManager" state="valid" bundle="38" 
>>> component.type="DataSourceManager"
>>>     handler name="org.apache.felix.ipojo:instance" state="valid"
>>>             instance 
>>> factory="com.itslm.omneity.data.service.DataSourceManagerImpl" 
>>> name="com.itslm.omneity.data.service.DataSourceManagerImpl-0" state="valid"
>>>     handler name="org.apache.felix.ipojo:provides" state="valid"
>>>             exports 
>>> specification="com.itslm.omneity.data.api.DataSourceManager" 
>>> filter="(objectClass=com.itslm.omneity.data.api.DataSourceManager)" 
>>> state="resolved"
>>>     handler name="org.apache.felix.ipojo:subservice" state="valid"
>>>             requires specification="com.itslm.omneity.adapter.api.Adapter" 
>>> filter="(&(objectClass=com.itslm.omneity.adapter.api.Adapter)(!(instance.name=DataSourceManager)))"
>>>  state="resolved"
>>>                     provider 
>>> name="com.itslm.omneity.adapter.obr.OBRAdapter-0"
>>>                     provider 
>>> name="com.itslm.omneity.adapter.obr.OBRAdapter-1"
>>>             requires specification="org.osgi.service.log.LogService" 
>>> filter="(&(objectClass=org.osgi.service.log.LogService)(!(instance.name=DataSourceManager)))"
>>>  state="resolved"
>>>                     provider name="null"
>>>     handler name="org.apache.felix.ipojo:architecture" state="valid"
>>>     services
>>>             service 
>>> architecture.instance="com.itslm.omneity.data.service.DataSourceManagerImpl-0"
>>>  factory.name="architecture" instance.name="architecture-6" 
>>> objectclass="[org.apache.felix.ipojo.architecture.Architecture]" 
>>> service.id="4"
>>>             service 
>>> factory.name="com.itslm.omneity.data.service.DataSourceManagerImpl" 
>>> instance.name="com.itslm.omneity.data.service.DataSourceManagerImpl-0" 
>>> objectclass="[com.itslm.omneity.data.api.DataSourceManager, 
>>> com.tinkerpop.blueprints.TransactionalGraph, 
>>> com.tinkerpop.blueprints.KeyIndexableGraph, 
>>> com.tinkerpop.blueprints.IndexableGraph, com.tinkerpop.blueprints.Graph]" 
>>> service.id="5"
>>>             service factory.name="com.itslm.omneity.adapter.obr.OBRAdapter" 
>>> instance.name="com.itslm.omneity.adapter.obr.OBRAdapter-0" 
>>> objectclass="[com.itslm.omneity.adapter.api.Adapter]" scheme="obr" 
>>> service.id="6"
>>>             service factory.name="com.itslm.omneity.adapter.obr.OBRAdapter" 
>>> instance.name="com.itslm.omneity.adapter.obr.OBRAdapter-1" 
>>> objectclass="[com.itslm.omneity.adapter.api.Adapter]" scheme="obr" 
>>> service.id="7"
>>>             service objectclass="[org.osgi.service.log.LogService]" 
>>> service.id="8"
>>>     containedinstances
>>>             instance 
>>> name="com.itslm.omneity.data.service.DataSourceManagerImpl-0" state="valid" 
>>> bundle="36" 
>>> component.type="com.itslm.omneity.data.service.DataSourceManagerImpl"
>>>                     handler name="org.apache.felix.ipojo:requires" 
>>> state="valid"
>>>                             requires 
>>> specification="com.itslm.omneity.adapter.api.Adapter" 
>>> id="com.itslm.omneity.adapter.api.Adapter" optional="true" nullable="true" 
>>> aggregate="true" proxy="false" binding-policy="dynamic" state="resolved"
>>>                     handler name="org.apache.felix.ipojo:callback" 
>>> state="valid"
>>>                     handler name="org.apache.felix.ipojo:provides" 
>>> state="valid"
>>>                             provides 
>>> specifications="[com.itslm.omneity.data.api.DataSourceManager,com.tinkerpop.blueprints.TransactionalGraph,com.tinkerpop.blueprints.KeyIndexableGraph,com.tinkerpop.blueprints.IndexableGraph,com.tinkerpop.blueprints.Graph]"
>>>  state="registered" service.id="5"
>>>                                     property name="factory.name" 
>>> value="com.itslm.omneity.data.service.DataSourceManagerImpl"
>>>                                     property name="instance.name" 
>>> value="com.itslm.omneity.data.service.DataSourceManagerImpl-0"
>>>                                     controller value="true"
>>>                     handler name="org.apache.felix.ipojo:architecture" 
>>> state="valid"
>>>                     object 
>>> name="com.itslm.omneity.data.service.DataSourceManagerImpl@7e266b44"
>>> g! 
>>> 
>>> However, inside the DataSourceManagerImpl I have a @Requires, e.g.
>>> 
>>>     /** All of the Adapter services currently available. */
>>>     @Requires(optional = true)
>>>     private Adapter[] adapters;
>>> 
>>> This does what I expect outside the composite (namely, dynamically tracks 
>>> the currently available adapters), but inside the composite this field is 
>>> not populated (at least not in the start() method where I do a simple 
>>> LOGGER.debug("Adapters found: " + adapters.length) as a test. This reports 
>>> '2' when running outside the composite, but '0' when running inside the 
>>> composite.
>>> 
>>> I know I'm missing (or misunderstanding) something. Can anyone help by 
>>> explaining where I'm going wrong? Thanks in advance.
>>> 
>>> Regards,
>>> Mark
>>> 
>>> 
>> 
> 

Attachment: signature.asc
Description: Message signed with OpenPGP using GPGMail

Reply via email to