You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@onami.apache.org by Simone Tripodi <si...@apache.org> on 2013/01/13 17:08:51 UTC
[spi][RTC] smarter services binding
Hi all again,
I maybe found the solution to that issue and proposed a patch on ONAMI-51.
Please review, if there are no objections I intend to commit it.
I would like also to bump to a major release and break the binary
compatibility, since the previous version is quiet useless :)
Many thanks in advance, all the best!
-Simo
http://people.apache.org/~simonetripodi/
http://simonetripodi.livejournal.com/
http://twitter.com/simonetripodi
http://www.99soft.org/
On Thu, Jan 10, 2013 at 9:51 PM, Simone Tripodi
<si...@apache.org> wrote:
> Hi all guys,
>
> I think the main idea of services binding[1] in SPI is good but still
> a little far to be complete, because what they miss are *qualifiers*,
> I mean, Guice allows binding the same interface/service to multiple
> instances by qualifying them via annotations, i.e.
>
> bind(CreditCardProcessor.class).annotatedWith(Names.named("Visa")).to(VisaCreditCardProcessor.class);
> bind(CreditCardProcessor.class).annotatedWith(Names.named("Mastercard")).to(MastercardCreditCardProcessor.class);
>
> So users can require service injection depending on bound metadata,
> rather than requiring and explicit class implementation:
>
> @Inject
> @Named("Visa")
> CreditCardProcessor creditCardProcessor;
>
> Now, coming back to the current SPI implementation, it just allows
> doing silly bindings, such as bind the service to the first discovered
> implementation or getting all the discovered implementations, mainly
> because META-INF/services files just enlist service implementation,
> i.e.
>
> file META-INF/services/org.acme.CreditCardProcessor
> -----------------------------------------------------------------
> org.acme.VisaCreditCardProcessor
> org.acme.MastercardCreditCardProcessor
>
> There are not qualifiers :( While at the time of coding the first
> version of SPI it made me happy, now I am not longer satisfied.
>
> We can do something better, my proposal is:
>
> * allows specifying a set of metadata - please remind that qualifiers,
> binding annotations, can be more complex rather than just @Named - in
> META-INF/services files for each service, something like
>
> file META-INF/services/org.acme.CreditCardProcessor
> -----------------------------------------------------------------
> org.acme.VisaCreditCardProcessor; type=Visa; version=1.0.0;
> org.acme.MastercardCreditCardProcessor; type=Mastercard; version=1.5.0;
>
> * defining a new binding annotation, something like:
>
> @Documented
> @Retention( RetentionPolicy.RUNTIME )
> public @interface Property
> {
>
> String name();
>
> String value();
>
> @Documented
> @BindingAnnotation
> @Retention( RetentionPolicy.RUNTIME )
> @Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
> @interface List
> {
> Property[] value();
> }
>
> }
>
> in order users can request injections specifying injections like:
>
> @Inject
> @Property.List({
> @Property( name="type", value="Visa" ),
> @Property( name="version", value="1.0.0" )
> })
> CreditCardProcessor creditCardProcessor;
>
> WDYT? Do you have any idea?
> Many thanks in advance!
> -Simo
>
> [1] http://onami.incubator.apache.org/spi/services.html
>
> http://people.apache.org/~simonetripodi/
> http://simonetripodi.livejournal.com/
> http://twitter.com/simonetripodi
> http://www.99soft.org/
Re: [spi][RTC] smarter services binding
Posted by Simone Tripodi <si...@apache.org>.
Documentation[1] updated as well.
Please let me know if something is not clear!
Thanks,
-Simo
[1] http://onami.incubator.apache.org/spi/services.html
http://people.apache.org/~simonetripodi/
http://simonetripodi.livejournal.com/
http://twitter.com/simonetripodi
http://www.99soft.org/
On Tue, Jan 15, 2013 at 9:07 PM, Simone Tripodi
<si...@apache.org> wrote:
> Hi guys,
>
> no objections have been shown, I am going to checkin the proposed modifications.
>
> Thanks a lot for participating in the discussion!
> -Simo
>
> http://people.apache.org/~simonetripodi/
> http://simonetripodi.livejournal.com/
> http://twitter.com/simonetripodi
> http://www.99soft.org/
>
>
> On Sun, Jan 13, 2013 at 5:08 PM, Simone Tripodi
> <si...@apache.org> wrote:
>> Hi all again,
>>
>> I maybe found the solution to that issue and proposed a patch on ONAMI-51.
>> Please review, if there are no objections I intend to commit it.
>>
>> I would like also to bump to a major release and break the binary
>> compatibility, since the previous version is quiet useless :)
>>
>> Many thanks in advance, all the best!
>> -Simo
>>
>> http://people.apache.org/~simonetripodi/
>> http://simonetripodi.livejournal.com/
>> http://twitter.com/simonetripodi
>> http://www.99soft.org/
>>
>>
>> On Thu, Jan 10, 2013 at 9:51 PM, Simone Tripodi
>> <si...@apache.org> wrote:
>>> Hi all guys,
>>>
>>> I think the main idea of services binding[1] in SPI is good but still
>>> a little far to be complete, because what they miss are *qualifiers*,
>>> I mean, Guice allows binding the same interface/service to multiple
>>> instances by qualifying them via annotations, i.e.
>>>
>>> bind(CreditCardProcessor.class).annotatedWith(Names.named("Visa")).to(VisaCreditCardProcessor.class);
>>> bind(CreditCardProcessor.class).annotatedWith(Names.named("Mastercard")).to(MastercardCreditCardProcessor.class);
>>>
>>> So users can require service injection depending on bound metadata,
>>> rather than requiring and explicit class implementation:
>>>
>>> @Inject
>>> @Named("Visa")
>>> CreditCardProcessor creditCardProcessor;
>>>
>>> Now, coming back to the current SPI implementation, it just allows
>>> doing silly bindings, such as bind the service to the first discovered
>>> implementation or getting all the discovered implementations, mainly
>>> because META-INF/services files just enlist service implementation,
>>> i.e.
>>>
>>> file META-INF/services/org.acme.CreditCardProcessor
>>> -----------------------------------------------------------------
>>> org.acme.VisaCreditCardProcessor
>>> org.acme.MastercardCreditCardProcessor
>>>
>>> There are not qualifiers :( While at the time of coding the first
>>> version of SPI it made me happy, now I am not longer satisfied.
>>>
>>> We can do something better, my proposal is:
>>>
>>> * allows specifying a set of metadata - please remind that qualifiers,
>>> binding annotations, can be more complex rather than just @Named - in
>>> META-INF/services files for each service, something like
>>>
>>> file META-INF/services/org.acme.CreditCardProcessor
>>> -----------------------------------------------------------------
>>> org.acme.VisaCreditCardProcessor; type=Visa; version=1.0.0;
>>> org.acme.MastercardCreditCardProcessor; type=Mastercard; version=1.5.0;
>>>
>>> * defining a new binding annotation, something like:
>>>
>>> @Documented
>>> @Retention( RetentionPolicy.RUNTIME )
>>> public @interface Property
>>> {
>>>
>>> String name();
>>>
>>> String value();
>>>
>>> @Documented
>>> @BindingAnnotation
>>> @Retention( RetentionPolicy.RUNTIME )
>>> @Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
>>> @interface List
>>> {
>>> Property[] value();
>>> }
>>>
>>> }
>>>
>>> in order users can request injections specifying injections like:
>>>
>>> @Inject
>>> @Property.List({
>>> @Property( name="type", value="Visa" ),
>>> @Property( name="version", value="1.0.0" )
>>> })
>>> CreditCardProcessor creditCardProcessor;
>>>
>>> WDYT? Do you have any idea?
>>> Many thanks in advance!
>>> -Simo
>>>
>>> [1] http://onami.incubator.apache.org/spi/services.html
>>>
>>> http://people.apache.org/~simonetripodi/
>>> http://simonetripodi.livejournal.com/
>>> http://twitter.com/simonetripodi
>>> http://www.99soft.org/
Re: [spi][RTC] smarter services binding
Posted by Simone Tripodi <si...@apache.org>.
Hi guys,
no objections have been shown, I am going to checkin the proposed modifications.
Thanks a lot for participating in the discussion!
-Simo
http://people.apache.org/~simonetripodi/
http://simonetripodi.livejournal.com/
http://twitter.com/simonetripodi
http://www.99soft.org/
On Sun, Jan 13, 2013 at 5:08 PM, Simone Tripodi
<si...@apache.org> wrote:
> Hi all again,
>
> I maybe found the solution to that issue and proposed a patch on ONAMI-51.
> Please review, if there are no objections I intend to commit it.
>
> I would like also to bump to a major release and break the binary
> compatibility, since the previous version is quiet useless :)
>
> Many thanks in advance, all the best!
> -Simo
>
> http://people.apache.org/~simonetripodi/
> http://simonetripodi.livejournal.com/
> http://twitter.com/simonetripodi
> http://www.99soft.org/
>
>
> On Thu, Jan 10, 2013 at 9:51 PM, Simone Tripodi
> <si...@apache.org> wrote:
>> Hi all guys,
>>
>> I think the main idea of services binding[1] in SPI is good but still
>> a little far to be complete, because what they miss are *qualifiers*,
>> I mean, Guice allows binding the same interface/service to multiple
>> instances by qualifying them via annotations, i.e.
>>
>> bind(CreditCardProcessor.class).annotatedWith(Names.named("Visa")).to(VisaCreditCardProcessor.class);
>> bind(CreditCardProcessor.class).annotatedWith(Names.named("Mastercard")).to(MastercardCreditCardProcessor.class);
>>
>> So users can require service injection depending on bound metadata,
>> rather than requiring and explicit class implementation:
>>
>> @Inject
>> @Named("Visa")
>> CreditCardProcessor creditCardProcessor;
>>
>> Now, coming back to the current SPI implementation, it just allows
>> doing silly bindings, such as bind the service to the first discovered
>> implementation or getting all the discovered implementations, mainly
>> because META-INF/services files just enlist service implementation,
>> i.e.
>>
>> file META-INF/services/org.acme.CreditCardProcessor
>> -----------------------------------------------------------------
>> org.acme.VisaCreditCardProcessor
>> org.acme.MastercardCreditCardProcessor
>>
>> There are not qualifiers :( While at the time of coding the first
>> version of SPI it made me happy, now I am not longer satisfied.
>>
>> We can do something better, my proposal is:
>>
>> * allows specifying a set of metadata - please remind that qualifiers,
>> binding annotations, can be more complex rather than just @Named - in
>> META-INF/services files for each service, something like
>>
>> file META-INF/services/org.acme.CreditCardProcessor
>> -----------------------------------------------------------------
>> org.acme.VisaCreditCardProcessor; type=Visa; version=1.0.0;
>> org.acme.MastercardCreditCardProcessor; type=Mastercard; version=1.5.0;
>>
>> * defining a new binding annotation, something like:
>>
>> @Documented
>> @Retention( RetentionPolicy.RUNTIME )
>> public @interface Property
>> {
>>
>> String name();
>>
>> String value();
>>
>> @Documented
>> @BindingAnnotation
>> @Retention( RetentionPolicy.RUNTIME )
>> @Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
>> @interface List
>> {
>> Property[] value();
>> }
>>
>> }
>>
>> in order users can request injections specifying injections like:
>>
>> @Inject
>> @Property.List({
>> @Property( name="type", value="Visa" ),
>> @Property( name="version", value="1.0.0" )
>> })
>> CreditCardProcessor creditCardProcessor;
>>
>> WDYT? Do you have any idea?
>> Many thanks in advance!
>> -Simo
>>
>> [1] http://onami.incubator.apache.org/spi/services.html
>>
>> http://people.apache.org/~simonetripodi/
>> http://simonetripodi.livejournal.com/
>> http://twitter.com/simonetripodi
>> http://www.99soft.org/