Pawel,

I disagree, and I believe the OSGi specification disagrees with you.

Implementing an interface is a class-level concern. There are many reasons to 
implement an interface on a class that don’t imply any desire to communicate 
outside the module via that interface. For example, supporting callbacks.

Ultimately you can make this work either way, but OSGi has to pick a default, 
and (as we see with package exports) OSGi always chooses the default of hiding 
as much as possible within the bundle except where a developer makes an 
explicit choice to expose.

Regards,
Neil


> On 5 Feb 2015, at 18:06, Pawel Pogorzelski <pawel.pogorzels...@gmail.com> 
> wrote:
> 
> Alright, thanks Neil. I can see can see some corner cases where this
> behavior could would be desired. It's just the default that bothers me - I
> think by default a service should be registered under all the
> bundle-exported interfaces. After all, if you want to hide implementation
> you do it differently - by defining a public interface and hiding the rest
> in private packages. The same with lookups - if you want to get a specific
> instance then OSGi filters is the way to go. So, if you're relaying on not
> registering under all interfaces probably means there's something wrong in
> your design or the container you run in.
> 
> Paweł
> 
> On Thu, Feb 5, 2015 at 5:37 PM, Neil Bartlett <njbartl...@gmail.com> wrote:
> 
>> Services in OSGi are intended so that you can implement many interfaces
>> but publish under a subset. Therefore the set of published services must be
>> listed explicitly.
>> 
>> Neil
>> 
>> 
>> On Thursday, 5 February 2015 at 16:15, Pawel Pogorzelski wrote:
>> 
>>> Thanks Ferry, it indeed works. Is there any way of doing it without
>>> specifying all the object supertypes during the registration? Maybe using
>>> Felix SCR annotations instead of OSGi ones?
>>> 
>>> Cheers,
>>> Pawel
>>> 
>>> 
>>> 
>>> On Thu, Feb 5, 2015 at 5:02 PM, Ferry Huberts <maili...@hupie.com>
>> wrote:
>>> 
>>>> 
>>>> 
>>>> On 05/02/15 16:59, Pawel Pogorzelski wrote:
>>>> 
>>>>> Guys,
>>>>> I have a generic interface IRepository<T> extended by
>> IAppleRepository,
>>>>> IOrangeRepository and so on. Concrete implementations like
>> AppleRepository
>>>>> are registered in the container with non-generic interfaces like
>>>>> IAppleRepository. Is it possible to tell DS engine I need every
>> service
>>>>> sublassing IRepository? Corresponding line in my component.xml looks
>> like
>>>>> follows:
>>>>> 
>>>>> <reference name="Repository" cardinality="0..n" policy="dynamic"
>>>>> interface="com.Whatever.IRepository" bind="addRepository"
>>>>> unbind="removeRepository"/>
>>>>> 
>>>>> but it doesn't work. I'm on Felix 4.4.1.
>>>> 
>>>> 
>>>> Then the bundles don't advertise the IRepository interface but their
>>>> subclass(es).
>>>> 
>>>> Make the bundles advertise IRepository and it'll work.
>>>> 
>>>> ---------------------------------------------------------------------
>>>> To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
>>>> For additional commands, e-mail: users-h...@felix.apache.org
>>>> 
>>> 
>>> 
>>> 
>> 
>> 
>> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscr...@felix.apache.org
For additional commands, e-mail: users-h...@felix.apache.org

Reply via email to