Yes, that would solve this issue.

Kind regards,

        Peter Kriens


> On 20 Apr 2017, at 14:02, Tim Ward <[email protected]> wrote:
> 
> Peter - I assume that you mean that there will be no auto-generated 
> osgi.service capability. Couldn't that be fixed with an additional annotation 
> on the component type to add the Provide-Capability to the manifest?
> 
> Tim Ward
> 
> Sent from my iPhone
> 
>> On 20 Apr 2017, at 12:38, Peter Kriens <[email protected]> wrote:
>> 
>> But then you loose the DS dependency management on Foo … Since your 
>> FooServiceFactory no longer promises to provide a Foo service :-(
>> 
>> Kind regards,
>> 
>>   Peter Kriens
>> 
>> 
>>> On 20 Apr 2017, at 12:35, Timothy Ward <[email protected]> wrote:
>>> 
>>> DS isn’t intended to solve every single use case, rather to make common use 
>>> cases simple to write and understand. In this case what you want is more 
>>> advanced, and unlikely to make it into DS as a natively supported pattern. 
>>> Given that you’re already tied to the core OSGi API (ServiceFactory) then 
>>> registering the service programatically would still let DS help you with 
>>> config and service injection.
>>> 
>>> 
>>> @Component(
>>> // Do not let DS provide the service
>>> service = {},
>>> configurationPolicy = ConfigurationPolicy.REQUIRE
>>> )
>>> public class FooServiceFactory implements ServiceFactory<Foo> {
>>> 
>>> @Reference // provides FooBuilder instances that are pre-configured via OSGi
>>> private FooBuilderFactory fooBuilderFactory;
>>> 
>>> private ServiceRegistration<?> reg;
>>> 
>>> @Activate
>>> void start(BundleContext ctx, Map<String, Object> props, Config config) {
>>>    reg = ctx.registerService(Foo.class.getName(), this, props);
>>> }
>>> 
>>> @Deactivate
>>> void stop() {
>>>    reg.unregister();
>>> }
>>> 
>>> @Override
>>> public Foo getService() {
>>>     FooBuilder fooBuilder = fooBuilderFactory.builder();
>>>     applyConfiguration(fooBuilder);
>>>     return fooBuilder.build();
>>> }
>>> 
>>> private void applyConfiguration(FooBuilder fooBuilder) {
>>>     // apply OSGi configuration to FooBuilder object
>>> }
>>> 
>>> ... // ungetService omitted for brevity
>>> 
>>> }
>>> 
>>> 
>>> Regards,
>>> 
>>> Tim
>>> 
>>> 
>>>> On 20 Apr 2017, at 11:11, Julian Sedding <[email protected]> wrote:
>>>> 
>>>> Hi Timothy
>>>> 
>>>> Thanks for your reply. Using delegation works, I currently use it to
>>>> solve my use-case.
>>>> 
>>>> However, compared to implementing a ServiceFactory, delegation adds
>>>> some overhead:
>>>> 
>>>> - delegation needs to be implemented, which is trivial, but noisy if
>>>> there are lots of methods that need delegating
>>>> - by delegating, my implementation becomes a "provider" of Foo, rather
>>>> than a "consumer", making my bundle more susceptible to changes in
>>>> Foo's API
>>>> - also: delegation is not possible if Foo is a final class
>>>> 
>>>> I brought up this topic in order to (a) confirm that my desired
>>>> approach is indeed not possible at the moment and (b) to see if adding
>>>> support for registering custom ServiceFactory implementations via DS
>>>> could be a desirable enhancement for the spec.
>>>> 
>>>> Regards
>>>> Julian
>>>> 
>>>> 
>>>>> On Thu, Apr 20, 2017 at 11:22 AM, Timothy Ward <[email protected]> 
>>>>> wrote:
>>>>> Have you not considered the following:
>>>>> 
>>>>> 
>>>>> @Component(configurationPolicy = ConfigurationPolicy.REQUIRE,
>>>>> scope = ServiceScope.BUNDLE)
>>>>> public class FooImpl implements Foo {
>>>>> 
>>>>> public @interface Config {
>>>>>   // Config definition in here
>>>>> }
>>>>> 
>>>>> @Reference
>>>>> private FooBuilderFactory fooBuilderFactory;
>>>>> 
>>>>> private Foo delegate;
>>>>> 
>>>>> @Activate
>>>>> void start(Config config) {
>>>>>    FooBuilder fooBuilder = fooBuilderFactory.builder();
>>>>>    applyConfiguration(fooBuilder, config);
>>>>>    delegate = fooBuilder.build();
>>>>> }
>>>>> 
>>>>> // Deactivation and Foo delegation methods go here
>>>>> …
>>>>> }
>>>>> 
>>>>> Regards,
>>>>> 
>>>>> Tim
>>>>> 
>>>>>> On 20 Apr 2017, at 09:30, Julian Sedding <[email protected]> wrote:
>>>>>> 
>>>>>> Hi there
>>>>>> 
>>>>>> I have been trying to implement a use-case, but I seem to be running
>>>>>> into walls ;) (Disclaimer: I can see multiple ways to implement this,
>>>>>> but would like to re-use the dependency injection and lazy
>>>>>> instantiation of DS).
>>>>>> 
>>>>>> My aim is to create configured service objects in the way that is
>>>>>> normally achieved by using a DS factory component with
>>>>>> configuration-policy require.
>>>>>> 
>>>>>> The catch is that the implementation of the objects I want to
>>>>>> configure and register as a service is not under my control and is
>>>>>> instanciated via a builder obtained from a factory that is registered
>>>>>> as an OSGi-service. Sounds a bit complicated, maybe it's clearer in
>>>>>> code.
>>>>>> 
>>>>>> @Component(
>>>>>> service = Foo.class,
>>>>>> configurationPolicy = ConfigurationPolicy.REQUIRE
>>>>>> )
>>>>>> public class FooServiceFactory implements ServiceFactory<Foo> {
>>>>>> 
>>>>>> @Reference // provides FooBuilder instances that are pre-configured via 
>>>>>> OSGi
>>>>>> private FooBuilderFactory fooBuilderFactory;
>>>>>> 
>>>>>> @Override
>>>>>> public Foo getService() {
>>>>>>    FooBuilder fooBuilder = fooBuilderFactory.builder();
>>>>>>    applyConfiguration(fooBuilder);
>>>>>>    return fooBuilder.build();
>>>>>> }
>>>>>> 
>>>>>> private void applyConfiguration(FooBuilder fooBuilder) {
>>>>>>    // apply OSGi configuration to FooBuilder object
>>>>>> }
>>>>>> 
>>>>>> ... // ungetService omitted for brevity
>>>>>> 
>>>>>> }
>>>>>> 
>>>>>> As far as I understand, this is not currently possible. The bnd tool
>>>>>> shouts at the mismatch between the "service" attribute (Foo.class) and
>>>>>> the ServiceFactory interface and refuses to generate the SCR XML. With
>>>>>> a manually crafted XML, Apache Felix SCR ends up throwing exceptions.
>>>>>> And most likely both implementations are correct, as I could not find
>>>>>> anything supporting my use-case in the spec.
>>>>>> 
>>>>>> Can anyone on this list please confirm that this is not (currently) 
>>>>>> possible?
>>>>>> 
>>>>>> I think this use-case is relatively generic. It has two preconditions:
>>>>>> 
>>>>>> - the implementation of the service object (e.g. Foo) is out of my
>>>>>> control and can therefore not be enhanced with OSGi-specifics
>>>>>> - in order to be able to create the service object, dependencies on
>>>>>> other services are required
>>>>>> 
>>>>>> Does this sound like a possible addition to the Declarative Services
>>>>>> specification?
>>>>>> 
>>>>>> Regards
>>>>>> Julian
>>>>>> 
>>>>>> PS: For those curious on how this could be implemented today. One way
>>>>>> to implement this is to register the ServiceFactory (lazily) by hand.
>>>>>> Provided Foo is not a final class, another way is to create a wrapper
>>>>>> for Foo that delegates all calls to a "real" Foo instance. The
>>>>>> FooWrapper implementation is then under my control and can be enhanced
>>>>>> with DS annotations etc.
>>>>>> _______________________________________________
>>>>>> 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
>>>> _______________________________________________
>>>> 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
>> 
>> _______________________________________________
>> 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

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

Reply via email to