OK I will stick with setting
<SPI-Provider>*</SPI-Provider>
<SPI-Consumer>*</SPI-Consumer>
in bundle A and it works

I don't need any
<SPI-Consumer>*</SPI-Consumer>
in bundle B since all calls are done in neo4j API in bundle A.

I thought that spi-fly would supersede the ServiceLoader and use the OSGI
services exported to retrieve the service instance

g! inspect capability service 20
org.hug.simed.rdf.neo4j-api [20] provides:
------------------------------------------
..
service; org.neo4j.configuration.LoadableConfig with properties:
   .org.apache.aries.spifly.provider.implclass =
org.neo4j.graphdb.factory.GraphDatabaseSettings
   service.bundleid = 20
   service.id = 59
   service.scope = bundle
   serviceloader.mediator = 4
service; org.neo4j.configuration.LoadableConfig with properties:
   .org.apache.aries.spifly.provider.implclass =
org.neo4j.kernel.configuration.ssl.LegacySslPolicyConfig
   service.bundleid = 20
   service.id = 60
   service.scope = bundle
   serviceloader.mediator = 4
service; org.neo4j.configuration.LoadableConfig with properties:
   .org.apache.aries.spifly.provider.implclass =
org.neo4j.kernel.configuration.ssl.SslPolicyConfig
   service.bundleid = 20
   service.id = 61
   service.scope = bundle
   serviceloader.mediator = 4
service; org.neo4j.configuration.LoadableConfig with properties:
   .org.apache.aries.spifly.provider.implclass =
org.neo4j.kernel.impl.index.schema.config.SpatialIndexSettings
   service.bundleid = 20
   service.id = 62
   service.scope = bundle
   serviceloader.mediator = 4
service; org.neo4j.configuration.LoadableConfig with properties:
   .org.apache.aries.spifly.provider.implclass =
org.neo4j.kernel.configuration.ssl.SslSystemSettings
   service.bundleid = 20
   service.id = 63
   service.scope = bundle
   serviceloader.mediator = 4
..

Still confused how the mediator works internally

thanks

On Wed, Sep 18, 2019 at 5:02 PM David Bosschaert <david.bosscha...@gmail.com>
wrote:

> Hi Cyrille,
>
> Does the loadAllConfigClasses() method work properly if the the neo4j jar
> is not embedded but rather in a bundle by itself?
>
> Best regards,
>
> David
>
> On Wed, 18 Sep 2019 at 12:59, Cyrille Duret <cdu...@gmail.com> wrote:
>
>> Hello,
>> I want to embedd neo4j in a bundle A, and create an graph database in a
>> bundle B.
>>
>> Neo4j kernel artifact relies heavily on SPI mechanism for exposing config
>> properties so I use SPI Fly to mediate the java ServiceLoader :
>> <dependency>
>>   <groupId>org.apache.aries.spifly</groupId>
>>    <artifactId>org.apache.aries.spifly.dynamic.bundle</artifactId>
>>   <version>1.2.3</version>
>> </dependency>
>>
>>
>> My bundle A config :
>>
>> <Embedd-Dependency>
>> ..
>> *;groupId=org.neo4j;artifactId=neo4j-kernel;inline=META-INF/services/*,
>> ..
>> </Embedd-Dependency>
>> <SPI-Provider>*</SPI-Provider>
>> <Export-Package>
>> ..org.neo4j.configuration;version=${neo4j-version},
>> ..</Export-Package>
>>
>>
>> My bundle B config :
>>
>> <Import-Package>
>> ..
>> org.neo4j.configuration;version=${neo4j-version},
>> ..
>> </Import-Package>
>> <SPI-Consumer>*</SPI-Consumer>
>>
>>
>> In my B activator start method  :
>> import org.neo4j.configuration.LoadableConfig;
>> ..
>> ServiceLoader<LoadableConfig> serviceLoader =
>> ServiceLoader.load(LoadableConfig.class);
>> Iterator<LoadableConfig> it = serviceLoader.iterator();
>> // I can see all exposed config from bundle A
>> while( it.hasNext() ) {
>>   final LoadableConfig config = it.next();
>>   System.out.println("-> "+config);
>> }
>>
>> // The call from this static method does not return any config
>> List<LoadableConfig> configs = LoadableConfig.allConfigClasses();
>> System.out.println("configs from LoadableConfig => "+configs.size());
>>
>>
>> the org.neo4j.configuration.LoadableConfig.allConfigClasses method which
>> is embedded in A has the following implementation :
>> static List<LoadableConfig> allConfigClasses()
>> {
>>     return Iterators.stream( ServiceLoader.load( LoadableConfig.class
>> ).iterator() ).collect( Collectors.toList() );
>> }
>>
>> I do not understand why the allConfigClasses() method does not see the
>> exposed SPI services and why my ServiceLoader.load snippet code does.
>> I have noticed that if I added <SPI-Consumer>*</SPI-Consumer> to A, the
>> LoadableConfig.allConfigClasses does indeed work.
>>
>> Anyone can explain me why the static method does not work in the first
>> place and why it does when adding <SPI-Consumer>*</SPI-Consumer> to A ??
>>
>> thank you
>> Cyrille
>>
>>

Reply via email to