You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by Stanton Sievers <ss...@us.ibm.com> on 2011/10/31 13:11:49 UTC

Injecting global config contributors for the default config process

Hi everyone,

I've recently been looking at the ConfigContributor and ConfigProcessor 
code and the workflow for getting configuration code the JavaScript side 
of things.  In DefaultConfigProcessor there is a setGlobalContributors 
method that is injectable and takes a List<ConfigContributor> as a 
parameter.  How is this injectable via Guice?  I thought it could be done 
with Multibinder but that only seems to allow Set contributions.  What is 
the intended way to contribute a List<ConfigContributor> (or any List for 
that matter) with Guice?

I found this issue, however, the solution seems to be Multibinder. :) 
http://code.google.com/p/google-guice/issues/detail?id=37&can=2&q=

If there's no good way to do this, I propose changing 
setGlobalContributors to take a Set<ConfigContributor> so that Multibinder 
can be used.  I don't think order or duplicate entries really matter for 
this use case, so I don't see why a Set wouldn't work....

Thanks,
-Stanton


Re: Injecting global config contributors for the default config process

Posted by Stanton Sievers <ss...@us.ibm.com>.
Hi Henry,

I don't think I have a particular scenario for global contributors.  I was 
simply playing around with the code to further my understanding.  As part 
of that I ran into this problem.

Thanks,
-Stanton



From:   Henry Saputra <he...@gmail.com>
To:     dev@shindig.apache.org, 
Date:   11/02/2011 14:17
Subject:        Re: Injecting global config contributors for the default 
config process



Hi Stanton,

I dont think the order of the contributors is necessary here so change
it to Set should be fine. What scenario you have in mind to do this?

- Henry

On Wed, Nov 2, 2011 at 4:09 AM, Stanton Sievers <ss...@us.ibm.com> 
wrote:
> Thanks for finding that thread.  That is the exact problem I'm running
> into.  As the thread suggests and as I've confirmed with some simple
> testing, annotations solve the problem.
>
> -Stanton
>
>
>
> From:   "Ciancetta, Jesse E." <jc...@mitre.org>
> To:     "dev@shindig.apache.org" <de...@shindig.apache.org>,
> Date:   11/02/2011 01:04
> Subject:        RE: Injecting global config contributors for the default
> config process
>
>
>
>>-----Original Message-----
>>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>>Sent: Monday, October 31, 2011 2:26 PM
>>To: dev@shindig.apache.org
>>Subject: RE: Injecting global config contributors for the default config
> process
>>
>>I just noticed one caveat with using the Multibinder.  I'm doing this:
>>
>>    Multibinder<ConfigContributor> configBinder =
> Multibinder.newSetBinder
>>(binder(), ConfigContributor.class);
>>    configBinder.addBinding().to(GlobalConfigContributor.class);
>>
>>Now in DefaultConfigProcessor.setGlobalContributors, I'm getting the
>>GlobalConfigContributor class I've bound here as well as all of the
> values
>>of the MapBinder for String->ConfigContributor that is bound in the
>>DefaultConfigContributorModule.  I have to add an Annotation when I do
>>Multibinder.newSetBinder to keep that from happening.  This doesn't
> happen
>>when I remove my Multibinder and only have the MapBinder... odd.  It's
>>like the MapBinder values are getting added to the Multibinder config
>>automatically.
>
> It sounds like this might be a bug in Guice -- I found this thread on 
the
> Guice discussion board which sounds similar to what you're describing:
>
> 
http://groups.google.com/group/google-guice/browse_thread/thread/934e30b7ed0da98f

>
>
>>Maybe that's why the original code is a List instead of a Set that uses
>>Multibinder.
>>
>>-Stanton
>>
>>
>>
>>From:   "Ciancetta, Jesse E." <jc...@mitre.org>
>>To:     "dev@shindig.apache.org" <de...@shindig.apache.org>,
>>Date:   10/31/2011 12:30
>>Subject:        RE: Injecting global config contributors for the default
>>config process
>>
>>
>>
>>>-----Original Message-----
>>>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>>>Sent: Monday, October 31, 2011 8:12 AM
>>>To: dev@shindig.apache.org
>>>Subject: Injecting global config contributors for the default config
>>process
>>>
>>>Hi everyone,
>>>
>>>I've recently been looking at the ConfigContributor and ConfigProcessor
>>>code and the workflow for getting configuration code the JavaScript 
side
>>>of things.  In DefaultConfigProcessor there is a setGlobalContributors
>>>method that is injectable and takes a List<ConfigContributor> as a
>>>parameter.  How is this injectable via Guice?  I thought it could be
> done
>>>with Multibinder but that only seems to allow Set contributions.  What
> is
>>>the intended way to contribute a List<ConfigContributor> (or any List
> for
>>>that matter) with Guice?
>>
>>It looks like you can use a TypeLiteral to do this:
>>
>>http://code.google.com/p/google-guice/wiki/FrequentlyAskedQuestions
>>
>>And if you search the Shindig codebase for usages of TypeLiteral you'll
>>find a few examples of where it is indeed being used to setup List's for
>>Guice injection.
>>
>>However this doesn't seem as flexible as using a Multibinder with a Set
>>though since with Multibinder it seems you can append to the Set across
>>any number of different Guice modules, and with the TypeLiteral approach
> I
>>don't think that's possible.
>>
>>I'm far from a Guice expert though so if someone has a better solution
>>please chime in.
>>
>>>I found this issue, however, the solution seems to be Multibinder. :)
>>>http://code.google.com/p/google-guice/issues/detail?id=37&can=2&q=
>>>
>>>If there's no good way to do this, I propose changing
>>>setGlobalContributors to take a Set<ConfigContributor> so that
>>Multibinder
>>>can be used.  I don't think order or duplicate entries really matter 
for
>>>this use case, so I don't see why a Set wouldn't work....
>>
>>Even though there does seem to be a workaround available I don't see any
>>reason why this shouldn't be a Set -- and by making it a Set we can use
>>Multibinder and gain the additional flexibility that buys us in terms of
>>being able to add to the bindings across multiple Guice modules.
>>
>>>Thanks,
>>>-Stanton
>>
>>
>>
>
>
>
>
>





Re: Injecting global config contributors for the default config process

Posted by Henry Saputra <he...@gmail.com>.
Hi Stanton,

I dont think the order of the contributors is necessary here so change
it to Set should be fine. What scenario you have in mind to do this?

- Henry

On Wed, Nov 2, 2011 at 4:09 AM, Stanton Sievers <ss...@us.ibm.com> wrote:
> Thanks for finding that thread.  That is the exact problem I'm running
> into.  As the thread suggests and as I've confirmed with some simple
> testing, annotations solve the problem.
>
> -Stanton
>
>
>
> From:   "Ciancetta, Jesse E." <jc...@mitre.org>
> To:     "dev@shindig.apache.org" <de...@shindig.apache.org>,
> Date:   11/02/2011 01:04
> Subject:        RE: Injecting global config contributors for the default
> config process
>
>
>
>>-----Original Message-----
>>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>>Sent: Monday, October 31, 2011 2:26 PM
>>To: dev@shindig.apache.org
>>Subject: RE: Injecting global config contributors for the default config
> process
>>
>>I just noticed one caveat with using the Multibinder.  I'm doing this:
>>
>>    Multibinder<ConfigContributor> configBinder =
> Multibinder.newSetBinder
>>(binder(), ConfigContributor.class);
>>    configBinder.addBinding().to(GlobalConfigContributor.class);
>>
>>Now in DefaultConfigProcessor.setGlobalContributors, I'm getting the
>>GlobalConfigContributor class I've bound here as well as all of the
> values
>>of the MapBinder for String->ConfigContributor that is bound in the
>>DefaultConfigContributorModule.  I have to add an Annotation when I do
>>Multibinder.newSetBinder to keep that from happening.  This doesn't
> happen
>>when I remove my Multibinder and only have the MapBinder... odd.  It's
>>like the MapBinder values are getting added to the Multibinder config
>>automatically.
>
> It sounds like this might be a bug in Guice -- I found this thread on the
> Guice discussion board which sounds similar to what you're describing:
>
> http://groups.google.com/group/google-guice/browse_thread/thread/934e30b7ed0da98f
>
>
>>Maybe that's why the original code is a List instead of a Set that uses
>>Multibinder.
>>
>>-Stanton
>>
>>
>>
>>From:   "Ciancetta, Jesse E." <jc...@mitre.org>
>>To:     "dev@shindig.apache.org" <de...@shindig.apache.org>,
>>Date:   10/31/2011 12:30
>>Subject:        RE: Injecting global config contributors for the default
>>config process
>>
>>
>>
>>>-----Original Message-----
>>>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>>>Sent: Monday, October 31, 2011 8:12 AM
>>>To: dev@shindig.apache.org
>>>Subject: Injecting global config contributors for the default config
>>process
>>>
>>>Hi everyone,
>>>
>>>I've recently been looking at the ConfigContributor and ConfigProcessor
>>>code and the workflow for getting configuration code the JavaScript side
>>>of things.  In DefaultConfigProcessor there is a setGlobalContributors
>>>method that is injectable and takes a List<ConfigContributor> as a
>>>parameter.  How is this injectable via Guice?  I thought it could be
> done
>>>with Multibinder but that only seems to allow Set contributions.  What
> is
>>>the intended way to contribute a List<ConfigContributor> (or any List
> for
>>>that matter) with Guice?
>>
>>It looks like you can use a TypeLiteral to do this:
>>
>>http://code.google.com/p/google-guice/wiki/FrequentlyAskedQuestions
>>
>>And if you search the Shindig codebase for usages of TypeLiteral you'll
>>find a few examples of where it is indeed being used to setup List's for
>>Guice injection.
>>
>>However this doesn't seem as flexible as using a Multibinder with a Set
>>though since with Multibinder it seems you can append to the Set across
>>any number of different Guice modules, and with the TypeLiteral approach
> I
>>don't think that's possible.
>>
>>I'm far from a Guice expert though so if someone has a better solution
>>please chime in.
>>
>>>I found this issue, however, the solution seems to be Multibinder. :)
>>>http://code.google.com/p/google-guice/issues/detail?id=37&can=2&q=
>>>
>>>If there's no good way to do this, I propose changing
>>>setGlobalContributors to take a Set<ConfigContributor> so that
>>Multibinder
>>>can be used.  I don't think order or duplicate entries really matter for
>>>this use case, so I don't see why a Set wouldn't work....
>>
>>Even though there does seem to be a workaround available I don't see any
>>reason why this shouldn't be a Set -- and by making it a Set we can use
>>Multibinder and gain the additional flexibility that buys us in terms of
>>being able to add to the bindings across multiple Guice modules.
>>
>>>Thanks,
>>>-Stanton
>>
>>
>>
>
>
>
>
>

RE: Injecting global config contributors for the default config process

Posted by Stanton Sievers <ss...@us.ibm.com>.
Thanks for finding that thread.  That is the exact problem I'm running 
into.  As the thread suggests and as I've confirmed with some simple 
testing, annotations solve the problem.

-Stanton



From:   "Ciancetta, Jesse E." <jc...@mitre.org>
To:     "dev@shindig.apache.org" <de...@shindig.apache.org>, 
Date:   11/02/2011 01:04
Subject:        RE: Injecting global config contributors for the default 
config process



>-----Original Message-----
>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>Sent: Monday, October 31, 2011 2:26 PM
>To: dev@shindig.apache.org
>Subject: RE: Injecting global config contributors for the default config 
process
>
>I just noticed one caveat with using the Multibinder.  I'm doing this:
>
>    Multibinder<ConfigContributor> configBinder = 
Multibinder.newSetBinder
>(binder(), ConfigContributor.class);
>    configBinder.addBinding().to(GlobalConfigContributor.class);
>
>Now in DefaultConfigProcessor.setGlobalContributors, I'm getting the
>GlobalConfigContributor class I've bound here as well as all of the 
values
>of the MapBinder for String->ConfigContributor that is bound in the
>DefaultConfigContributorModule.  I have to add an Annotation when I do
>Multibinder.newSetBinder to keep that from happening.  This doesn't 
happen
>when I remove my Multibinder and only have the MapBinder... odd.  It's
>like the MapBinder values are getting added to the Multibinder config
>automatically.

It sounds like this might be a bug in Guice -- I found this thread on the 
Guice discussion board which sounds similar to what you're describing:

http://groups.google.com/group/google-guice/browse_thread/thread/934e30b7ed0da98f


>Maybe that's why the original code is a List instead of a Set that uses
>Multibinder.
>
>-Stanton
>
>
>
>From:   "Ciancetta, Jesse E." <jc...@mitre.org>
>To:     "dev@shindig.apache.org" <de...@shindig.apache.org>,
>Date:   10/31/2011 12:30
>Subject:        RE: Injecting global config contributors for the default
>config process
>
>
>
>>-----Original Message-----
>>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>>Sent: Monday, October 31, 2011 8:12 AM
>>To: dev@shindig.apache.org
>>Subject: Injecting global config contributors for the default config
>process
>>
>>Hi everyone,
>>
>>I've recently been looking at the ConfigContributor and ConfigProcessor
>>code and the workflow for getting configuration code the JavaScript side
>>of things.  In DefaultConfigProcessor there is a setGlobalContributors
>>method that is injectable and takes a List<ConfigContributor> as a
>>parameter.  How is this injectable via Guice?  I thought it could be 
done
>>with Multibinder but that only seems to allow Set contributions.  What 
is
>>the intended way to contribute a List<ConfigContributor> (or any List 
for
>>that matter) with Guice?
>
>It looks like you can use a TypeLiteral to do this:
>
>http://code.google.com/p/google-guice/wiki/FrequentlyAskedQuestions
>
>And if you search the Shindig codebase for usages of TypeLiteral you'll
>find a few examples of where it is indeed being used to setup List's for
>Guice injection.
>
>However this doesn't seem as flexible as using a Multibinder with a Set
>though since with Multibinder it seems you can append to the Set across
>any number of different Guice modules, and with the TypeLiteral approach 
I
>don't think that's possible.
>
>I'm far from a Guice expert though so if someone has a better solution
>please chime in.
>
>>I found this issue, however, the solution seems to be Multibinder. :)
>>http://code.google.com/p/google-guice/issues/detail?id=37&can=2&q=
>>
>>If there's no good way to do this, I propose changing
>>setGlobalContributors to take a Set<ConfigContributor> so that
>Multibinder
>>can be used.  I don't think order or duplicate entries really matter for
>>this use case, so I don't see why a Set wouldn't work....
>
>Even though there does seem to be a workaround available I don't see any
>reason why this shouldn't be a Set -- and by making it a Set we can use
>Multibinder and gain the additional flexibility that buys us in terms of
>being able to add to the bindings across multiple Guice modules.
>
>>Thanks,
>>-Stanton
>
>
>





RE: Injecting global config contributors for the default config process

Posted by "Ciancetta, Jesse E." <jc...@mitre.org>.
>-----Original Message-----
>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>Sent: Monday, October 31, 2011 2:26 PM
>To: dev@shindig.apache.org
>Subject: RE: Injecting global config contributors for the default config process
>
>I just noticed one caveat with using the Multibinder.  I'm doing this:
>
>    Multibinder<ConfigContributor> configBinder = Multibinder.newSetBinder
>(binder(), ConfigContributor.class);
>    configBinder.addBinding().to(GlobalConfigContributor.class);
>
>Now in DefaultConfigProcessor.setGlobalContributors, I'm getting the
>GlobalConfigContributor class I've bound here as well as all of the values
>of the MapBinder for String->ConfigContributor that is bound in the
>DefaultConfigContributorModule.  I have to add an Annotation when I do
>Multibinder.newSetBinder to keep that from happening.  This doesn't happen
>when I remove my Multibinder and only have the MapBinder... odd.  It's
>like the MapBinder values are getting added to the Multibinder config
>automatically.

It sounds like this might be a bug in Guice -- I found this thread on the Guice discussion board which sounds similar to what you're describing:

http://groups.google.com/group/google-guice/browse_thread/thread/934e30b7ed0da98f

>Maybe that's why the original code is a List instead of a Set that uses
>Multibinder.
>
>-Stanton
>
>
>
>From:   "Ciancetta, Jesse E." <jc...@mitre.org>
>To:     "dev@shindig.apache.org" <de...@shindig.apache.org>,
>Date:   10/31/2011 12:30
>Subject:        RE: Injecting global config contributors for the default
>config process
>
>
>
>>-----Original Message-----
>>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>>Sent: Monday, October 31, 2011 8:12 AM
>>To: dev@shindig.apache.org
>>Subject: Injecting global config contributors for the default config
>process
>>
>>Hi everyone,
>>
>>I've recently been looking at the ConfigContributor and ConfigProcessor
>>code and the workflow for getting configuration code the JavaScript side
>>of things.  In DefaultConfigProcessor there is a setGlobalContributors
>>method that is injectable and takes a List<ConfigContributor> as a
>>parameter.  How is this injectable via Guice?  I thought it could be done
>>with Multibinder but that only seems to allow Set contributions.  What is
>>the intended way to contribute a List<ConfigContributor> (or any List for
>>that matter) with Guice?
>
>It looks like you can use a TypeLiteral to do this:
>
>http://code.google.com/p/google-guice/wiki/FrequentlyAskedQuestions
>
>And if you search the Shindig codebase for usages of TypeLiteral you'll
>find a few examples of where it is indeed being used to setup List's for
>Guice injection.
>
>However this doesn't seem as flexible as using a Multibinder with a Set
>though since with Multibinder it seems you can append to the Set across
>any number of different Guice modules, and with the TypeLiteral approach I
>don't think that's possible.
>
>I'm far from a Guice expert though so if someone has a better solution
>please chime in.
>
>>I found this issue, however, the solution seems to be Multibinder. :)
>>http://code.google.com/p/google-guice/issues/detail?id=37&can=2&q=
>>
>>If there's no good way to do this, I propose changing
>>setGlobalContributors to take a Set<ConfigContributor> so that
>Multibinder
>>can be used.  I don't think order or duplicate entries really matter for
>>this use case, so I don't see why a Set wouldn't work....
>
>Even though there does seem to be a workaround available I don't see any
>reason why this shouldn't be a Set -- and by making it a Set we can use
>Multibinder and gain the additional flexibility that buys us in terms of
>being able to add to the bindings across multiple Guice modules.
>
>>Thanks,
>>-Stanton
>
>
>


RE: Injecting global config contributors for the default config process

Posted by Stanton Sievers <ss...@us.ibm.com>.
I just noticed one caveat with using the Multibinder.  I'm doing this:

    Multibinder<ConfigContributor> configBinder = Multibinder.newSetBinder
(binder(), ConfigContributor.class);
    configBinder.addBinding().to(GlobalConfigContributor.class);

Now in DefaultConfigProcessor.setGlobalContributors, I'm getting the 
GlobalConfigContributor class I've bound here as well as all of the values 
of the MapBinder for String->ConfigContributor that is bound in the 
DefaultConfigContributorModule.  I have to add an Annotation when I do 
Multibinder.newSetBinder to keep that from happening.  This doesn't happen 
when I remove my Multibinder and only have the MapBinder... odd.  It's 
like the MapBinder values are getting added to the Multibinder config 
automatically. 

Maybe that's why the original code is a List instead of a Set that uses 
Multibinder.

-Stanton



From:   "Ciancetta, Jesse E." <jc...@mitre.org>
To:     "dev@shindig.apache.org" <de...@shindig.apache.org>, 
Date:   10/31/2011 12:30
Subject:        RE: Injecting global config contributors for the default 
config process



>-----Original Message-----
>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>Sent: Monday, October 31, 2011 8:12 AM
>To: dev@shindig.apache.org
>Subject: Injecting global config contributors for the default config 
process
>
>Hi everyone,
>
>I've recently been looking at the ConfigContributor and ConfigProcessor
>code and the workflow for getting configuration code the JavaScript side
>of things.  In DefaultConfigProcessor there is a setGlobalContributors
>method that is injectable and takes a List<ConfigContributor> as a
>parameter.  How is this injectable via Guice?  I thought it could be done
>with Multibinder but that only seems to allow Set contributions.  What is
>the intended way to contribute a List<ConfigContributor> (or any List for
>that matter) with Guice?

It looks like you can use a TypeLiteral to do this:

http://code.google.com/p/google-guice/wiki/FrequentlyAskedQuestions

And if you search the Shindig codebase for usages of TypeLiteral you'll 
find a few examples of where it is indeed being used to setup List's for 
Guice injection.

However this doesn't seem as flexible as using a Multibinder with a Set 
though since with Multibinder it seems you can append to the Set across 
any number of different Guice modules, and with the TypeLiteral approach I 
don't think that's possible.

I'm far from a Guice expert though so if someone has a better solution 
please chime in.

>I found this issue, however, the solution seems to be Multibinder. :)
>http://code.google.com/p/google-guice/issues/detail?id=37&can=2&q=
>
>If there's no good way to do this, I propose changing
>setGlobalContributors to take a Set<ConfigContributor> so that 
Multibinder
>can be used.  I don't think order or duplicate entries really matter for
>this use case, so I don't see why a Set wouldn't work....

Even though there does seem to be a workaround available I don't see any 
reason why this shouldn't be a Set -- and by making it a Set we can use 
Multibinder and gain the additional flexibility that buys us in terms of 
being able to add to the bindings across multiple Guice modules.

>Thanks,
>-Stanton





RE: Injecting global config contributors for the default config process

Posted by "Ciancetta, Jesse E." <jc...@mitre.org>.
>-----Original Message-----
>From: Stanton Sievers [mailto:ssievers@us.ibm.com]
>Sent: Monday, October 31, 2011 8:12 AM
>To: dev@shindig.apache.org
>Subject: Injecting global config contributors for the default config process
>
>Hi everyone,
>
>I've recently been looking at the ConfigContributor and ConfigProcessor
>code and the workflow for getting configuration code the JavaScript side
>of things.  In DefaultConfigProcessor there is a setGlobalContributors
>method that is injectable and takes a List<ConfigContributor> as a
>parameter.  How is this injectable via Guice?  I thought it could be done
>with Multibinder but that only seems to allow Set contributions.  What is
>the intended way to contribute a List<ConfigContributor> (or any List for
>that matter) with Guice?

It looks like you can use a TypeLiteral to do this:

http://code.google.com/p/google-guice/wiki/FrequentlyAskedQuestions

And if you search the Shindig codebase for usages of TypeLiteral you'll find a few examples of where it is indeed being used to setup List's for Guice injection.

However this doesn't seem as flexible as using a Multibinder with a Set though since with Multibinder it seems you can append to the Set across any number of different Guice modules, and with the TypeLiteral approach I don't think that's possible.

I'm far from a Guice expert though so if someone has a better solution please chime in.

>I found this issue, however, the solution seems to be Multibinder. :)
>http://code.google.com/p/google-guice/issues/detail?id=37&can=2&q=
>
>If there's no good way to do this, I propose changing
>setGlobalContributors to take a Set<ConfigContributor> so that Multibinder
>can be used.  I don't think order or duplicate entries really matter for
>this use case, so I don't see why a Set wouldn't work....

Even though there does seem to be a workaround available I don't see any reason why this shouldn't be a Set -- and by making it a Set we can use Multibinder and gain the additional flexibility that buys us in terms of being able to add to the bindings across multiple Guice modules.

>Thanks,
>-Stanton