You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@shindig.apache.org by Kai Feng Zhang <kf...@gmail.com> on 2010/10/29 09:02:15 UTC

How to append custom rewriter for Shindig?

Hi,

I'd like to add a custom rewriter into Shindig, with requirement of no need
to change Shindig rendering gadget server side code directly. I want to add
it as a new feature in extras, so when this feature is required by gadget,
the custom rewriter will do some special work when rendering gadget at
server side.

But I checked Shindig code, RewriteModule @Provides all predefined rewriters
with @Named("shindig.rewriters.gadget") , and then GadgetRewritersProvider
will provide all rewriters as per the same @Name when rendering gadget.

If I create a new Module in shindig extras, and @Provides custom rewriter
with same @Name, and startup server, there will be error saying the same
@Name is configured already by RewriteModule.

Can anyone please help if there is some way to append such a rewriter
without touching any existing Shindig gadget rendering code? Or that is the
only way to extend a new rewriter for gadget rendering?

Thanks a lot!

Re: How to append custom rewriter for Shindig?

Posted by Kai Feng Zhang <kf...@gmail.com>.
Thank you Paul. I think you are right that we need to make rewriters
implement Comparable interface. See doc from Guice:

The set's iteration order is consistent with the binding order. This is
> convenient when multiple elements are contributed by the same module because
> that module can order its bindings appropriately. Avoid relying on the
> iteration order of elements contributed by different modules, since there is
> no equivalent mechanism to order modules.



Thanks,

Kevin Zhang (凯峰)
Gtalk:   kf.zhang@gmail.com
Blog:    http://www.zhangkf.com
Twitter: http://twitter.com/zhangkf


On Fri, Oct 29, 2010 at 8:22 PM, Paul Lindner <li...@inuus.com> wrote:

> I think this is a good idea, however I'm concerned that the ordering of
> Rewriters may be important.
>
> I'm guessing that we could make a SortedSet if we had a Comparable<>
> implementation of all rewriters.
>
> On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <kf...@gmail.com>
> wrote:
>
> > I found a possible solution to extend Shindig rewriter capability, using
> > multibinding in Guice.
> >
> > Please see:
> >
> >
> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
> >
> > I created a jira for this, see
> > https://issues.apache.org/jira/browse/SHINDIG-1456
> >
> >
> >
> > On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <kf...@gmail.com>
> > wrote:
> >
> > > Hi,
> > >
> > > I'd like to add a custom rewriter into Shindig, with requirement of no
> > need
> > > to change Shindig rendering gadget server side code directly. I want to
> > add
> > > it as a new feature in extras, so when this feature is required by
> > gadget,
> > > the custom rewriter will do some special work when rendering gadget at
> > > server side.
> > >
> > > But I checked Shindig code, RewriteModule @Provides all predefined
> > > rewriters with @Named("shindig.rewriters.gadget") , and
> > > then GadgetRewritersProvider will provide all rewriters as per the same
> > > @Name when rendering gadget.
> > >
> > > If I create a new Module in shindig extras, and @Provides custom
> rewriter
> > > with same @Name, and startup server, there will be error saying the
> same
> > > @Name is configured already by RewriteModule.
> > >
> > > Can anyone please help if there is some way to append such a rewriter
> > > without touching any existing Shindig gadget rendering code? Or that is
> > the
> > > only way to extend a new rewriter for gadget rendering?
> > >
> > > Thanks a lot!
> > >
> >
>
>
>
> --
> Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
>

Re: How to append custom rewriter for Shindig?

Posted by Kai Feng Zhang <kf...@gmail.com>.
Thank you guys for reviewing this, and thank you Paul for applying it into
code base.



On Fri, Nov 5, 2010 at 4:46 AM, Henry Saputra <he...@gmail.com>wrote:

> According to
>
> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
>
> the ordering is consistent with the binding ordering/sequence: "The
> set's iteration order is consistent with the binding order"
>
> so I guess the ordering issue shouldnt be a problem.
>
> - Henry
>
> On Thu, Nov 4, 2010 at 1:09 AM, Kai Feng Zhang <kf...@gmail.com> wrote:
> > hi Paul and Gagandeep,
> >
> > Seems we have no other options. Could I propose to code review my patch?
> > https://issues.apache.org/jira/browse/SHINDIG-1456
> >
> > If the new rewriter to be appended is simple enough ,it's does not matter
> on
> > the rewriters ordering issue I think. Otherwise we need to provide
> > Comparable implementation for rewriters.
> >
> >
> > On Tue, Nov 2, 2010 at 12:51 PM, Gagandeep singh <gagan.goku@gmail.com
> >wrote:
> >
> >> Hi Kai
> >>
> >> Thanks for finding this. Sad that the Modules.override approach had a
> bug
> >> :(
> >>
> >> On Tue, Nov 2, 2010 at 7:46 AM, Kai Feng Zhang <kf...@gmail.com>
> wrote:
> >>
> >>> Seems this is a known issue, I found this:
> >>> http://code.google.com/p/google-guice/issues/detail?id=263
> >>>
> >>> I am not sure if this fix has gone into Guice 2.0 which is in classpath
> of
> >>> Shindig. If it's not, then I think I still need to propose my patch,
> which
> >>> will provide capability of extending/appending rewriters for Shindig
> gadget
> >>> renderer.
> >>>
> >> Would it be possible to go through this codereview<
> http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java>(
> maybe patch it in your client and play with it ) to see if it solves your
> >> problem ?
> >>
> >>
> >>> https://issues.apache.org/jira/browse/SHINDIG-1456
> >>>
> >>> Any comments? Thanks.
> >>>
> >>>  <http://code.google.com/p/google-guice/issues/detail?id=263>
> >>> Thanks,
> >>>
> >>> Kevin Zhang (凯峰)
> >>> Gtalk:   kf.zhang@gmail.com
> >>> Blog:    http://www.zhangkf.com
> >>> Twitter: http://twitter.com/zhangkf
> >>>
> >>>
> >>> On Mon, Nov 1, 2010 at 11:50 AM, Kai Feng Zhang <kf.zhang@gmail.com
> >wrote:
> >>>
> >>>> Hi Gagandeep,
> >>>>
> >>>> Thank you for the detailed sample code.
> >>>>
> >>>> I tried with your module override code, but seems it does not work,
> there
> >>>> are binding exception if I replace the DefaultGuiceModule with my new
> >>>> CustomGuiceModule in web.xml.
> >>>>
> >>>> ============ Exception stack =================
> >>>> 2010-11-1 11:19:53 org.apache.catalina.core.StandardContext
> listenerStart
> >>>> com.google.inject.CreationException: Guice creation errors:
> >>>>
> >>>> 1) A binding to java.util.Set<java.lang.String> annotated with
> >>>>
> @com.google.inject.name.Named(value=org.apache.shindig.features-extended)
> >>>> was already configured at
> >>>>
> org.apache.shindig.gadgets.DefaultGuiceModule.registerFeatureHandlers(DefaultGuiceModule.java:124).
> >>>>   at
> >>>>
> org.apache.shindig.extras.ShindigExtrasGuiceModule.configureExtraFeatures(ShindigExtrasGuiceModule.java:41)
> >>>>
> >>>> 2) A binding to java.util.Set<java.lang.Object> annotated with
> >>>> @com.google.inject.name.Named(value=org.apache.shindig.handlers) was
> already
> >>>> configured at
> >>>>
> org.apache.shindig.gadgets.DefaultGuiceModule.registerGadgetHandlers(DefaultGuiceModule.java:105).
> >>>>   at
> >>>>
> org.apache.shindig.social.core.config.SocialApiGuiceModule.configure(SocialApiGuiceModule.java:76)
> >>>>
> >>>> 2 errors
> >>>> at
> >>>>
> com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:354)
> >>>>  at
> >>>>
> com.google.inject.InjectorBuilder.initializeStatically(InjectorBuilder.java:152)
> >>>> at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:105)
> >>>>  at com.google.inject.Guice.createInjector(Guice.java:92)
> >>>> at
> >>>>
> org.apache.shindig.common.servlet.GuiceServletContextListener.contextInitialized(GuiceServletContextListener.java:73)
> >>>>  at
> >>>>
> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
> >>>> at
> >>>>
> org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
> >>>>  at
> >>>> org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
> >>>> at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
> >>>>  at
> >>>> org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
> >>>> at
> org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
> >>>>  at
> >>>>
> org.apache.catalina.core.StandardService.start(StandardService.java:519)
> >>>> at
> org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
> >>>>  at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
> >>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> >>>>  at
> >>>>
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> >>>> at
> >>>>
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
> >>>>  at java.lang.reflect.Method.invoke(Method.java:592)
> >>>> at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
> >>>>  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
> >>>> 2010-11-1 11:19:53 org.apache.catalina.core.StandardContext start
> >>>>
> >>>> ==================CustomGuiceModule=======================
> >>>>
> >>>> protected void configure() {
> >>>>     install(Modules.override(new DefaultGuiceModule()).with(new
> >>>> AbstractModule() {
> >>>>
> >>>>       @Override
> >>>>       protected void configure() {
> >>>>         // TODO Auto-generated method stub
> >>>>       }
> >>>>
> >>>>       @Provides
> >>>>       @Singleton
> >>>>       @Named("shindig.rewriters.gadget")
> >>>>       protected List<GadgetRewriter> provideGadgetRewriters(
> >>>>           PipelineDataGadgetRewriter pipelineRewriter,
> >>>>           TemplateRewriter templateRewriter,
> >>>>           AbsolutePathReferenceRewriter absolutePathRewriter,
> >>>>           StyleTagExtractorContentRewriter styleTagExtractorRewriter,
> >>>>           StyleAdjacencyContentRewriter styleAdjacencyRewriter,
> >>>>           ProxyingContentRewriter proxyingRewriter,
> >>>>           CajaContentRewriter cajaRewriter,
> >>>>           SanitizingGadgetRewriter sanitizedRewriter,
> >>>>           RenderingGadgetRewriter renderingRewriter,
> >>>>           OpenSocialI18NGadgetRewriter i18nRewriter,
> >>>>           CustomGadgetRewriter customGadgetRewriter) {
> >>>>         return ImmutableList.of(pipelineRewriter, templateRewriter,
> >>>>             absolutePathRewriter, styleTagExtractorRewriter,
> >>>> styleAdjacencyRewriter, proxyingRewriter,
> >>>>             cajaRewriter, sanitizedRewriter, renderingRewriter,
> >>>> i18nRewriter, customGadgetRewriter);
> >>>>       }
> >>>>
> >>>>     }));
> >>>>
> >>>>   }
> >>>>
> >>>> ================web.xml=====================
> >>>>   <context-param>
> >>>>     <param-name>guice-modules</param-name>
> >>>>     <param-value>
> >>>>       org.apache.shindig.common.PropertiesModule:
> >>>>       org.apache.shindig.extras.CustomGuiceModule:
> >>>>       org.apache.shindig.social.core.config.SocialApiGuiceModule:
> >>>>       org.apache.shindig.social.sample.SampleModule:
> >>>>       org.apache.shindig.gadgets.oauth.OAuthModule:
> >>>>       org.apache.shindig.common.cache.ehcache.EhCacheModule:
> >>>>       org.apache.shindig.sample.shiro.ShiroGuiceModule:
> >>>>       org.apache.shindig.sample.container.SampleContainerGuiceModule:
> >>>>       org.apache.shindig.extras.ShindigExtrasGuiceModule:
> >>>>       org.apache.shindig.extras.as.ActivityStreamsGuiceModule
> >>>>     </param-value>
> >>>>   </context-param>
> >>>>
> >>>> ==================================
> >>>> From the exception, it says 2 binding are already configured in
> >>>> DefaultGuiceModule, then they should not be configured again in other
> >>>> modules, but these 2 binding are multibinding. I am curious why this
> would
> >>>> happen.
> >>>>
> >>>> If this kind of override module way works, it does be helpful for my
> >>>> case, since I even do not need to change any code of existing Shindig
> >>>> code(any modules).   Thanks.
> >>>>
> >>>>
> >>>> Thanks,
> >>>>
> >>>> Kevin Zhang (凯峰)
> >>>> Gtalk:   kf.zhang@gmail.com
> >>>> Blog:    http://www.zhangkf.com
> >>>> Twitter: http://twitter.com/zhangkf
> >>>>
> >>>>
> >>>> On Mon, Nov 1, 2010 at 12:31 AM, Gagandeep Singh <
> gagan.goku@gmail.com>wrote:
> >>>>
> >>>>> Hi Kai
> >>>>>
> >>>>>
> >>>>> On Sun, Oct 31, 2010 at 5:38 PM, Kai Feng Zhang <kf.zhang@gmail.com
> >wrote:
> >>>>>
> >>>>>> Hey Gagandeep,
> >>>>>>
> >>>>>> Thank you, it seems your solution is cool thing with more
> flexibility.
> >>>>>>
> >>>>>> What I am asking is to *append* a rewriter to current rewriters list
> >>>>>> from DefaultGuiceModule, b/c I think the existing rewriters are good
> enough
> >>>>>> for my case. And as I know, DefaultGuiceModule does a lot of things
> >>>>>> (installing different modules etc), but not only install
> RewriterModule for
> >>>>>> binding rewiters.
> >>>>>>
> >>>>>
> >>>>> Your module (say MyGuiceModule) would look like:
> >>>>> class MyGuiceModule extends AbstractModule {
> >>>>>   public void configure() {
> >>>>>     install(Modules.override(new DefaultGuiceModule()).with(new
> >>>>> MySpecialModule()));
> >>>>>   }
> >>>>> }
> >>>>>
> >>>>> This will provide everything that DefaultGuiceModule already does. In
> >>>>> addition, it will provide the bindings you specifically provided in
> >>>>> MySpecialModule and override these when they conflict with ones
> provided
> >>>>> by DefaultGuiceModule.
> >>>>> Take a look at Modules.override<
> http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/util/Modules.html#override(com.google.inject.Module...)
> >documentation.
> >>>>>
> >>>>>  As far as appending a rewriter to existing list is concerned, can't
> >>>>> help you much there.
> >>>>> This sample code:
> >>>>>     class T {
> >>>>>       public final String name;
> >>>>>       public T(String name) {
> >>>>>         this.name = name;
> >>>>>       }
> >>>>>     }
> >>>>>
> >>>>>     class A extends AbstractModule {
> >>>>>       @Override
> >>>>>       protected void configure() {
> >>>>>
> bind(T.class).annotatedWith(Names.named("hello")).toInstance(new
> >>>>> T("hello"));
> >>>>>       }
> >>>>>     }
> >>>>>     class B extends AbstractModule {
> >>>>>       @Override
> >>>>>       protected void configure() {
> >>>>>       }
> >>>>>
> >>>>>       @Provides @Named("hello") @Inject
> >>>>>       public T provideBuffalo(@Named("hello") T helloT) {
> >>>>>         return new T("buffalo");
> >>>>>       }
> >>>>>     }
> >>>>>
> >>>>>     Injector injector = Guice.createInjector(Modules.override(new
> >>>>> A()).with(new B()));
> >>>>>     T h = injector.getInstance(Key.get(T.class,
> Names.named("hello")));
> >>>>>     assertEquals("buffalo", h.name);
> >>>>>
> >>>>> throws StackOverflowException, because guice is trying to access the
> >>>>> same @Named("hello")that its trying to provide.
> >>>>> So you'l have to enumerate the rewriters you need to append your
> >>>>> rewriter to again in your module.
> >>>>>
> >>>>>
> >>>>>> So I think replace DefaultGuiceModule with custom module class in
> >>>>>> web.xml maybe not enough, you still need to do other same work as
> >>>>>> DefaultGuiceModule in your module.Please note that RewriterModule
> installed
> >>>>>> in DefaultGuiceModule is not configured in web.xml.
> >>>>>>
> >>>>>> Any comments? Thanks a lot.
> >>>>>>
> >>>>>> Thanks,
> >>>>>>
> >>>>>> Kevin Zhang (凯峰)
> >>>>>> Gtalk:   kf.zhang@gmail.com
> >>>>>> Blog:    http://www.zhangkf.com
> >>>>>> Twitter: http://twitter.com/zhangkf
> >>>>>>
> >>>>>>
> >>>>>> On Sat, Oct 30, 2010 at 10:28 AM, Gagandeep singh <
> >>>>>> gagan.goku@gmail.com> wrote:
> >>>>>>
> >>>>>>> Hi Kai, Paul
> >>>>>>>
> >>>>>>> You are both right :) The order of rewriters matters.
> >>>>>>>
> >>>>>>> I have a patch<
> >>>>>>>
> http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
> >>>>>>> >
> >>>>>>>
> >>>>>>> (which
> >>>>>>> JohnH has been reviewing and providing ideas for) which does
> something
> >>>>>>> similar. The idea is, we create a map binder from container + flow
> id
> >>>>>>> -> *
> >>>>>>> provider* of list of rewriters.
> >>>>>>> And we provide the list of rewriters similarly to how we providing
> >>>>>>> currently. Since we add provider of rewriter list, we can provide a
> >>>>>>> different list without having to add it to the map binder
> separately
> >>>>>>> (map
> >>>>>>> binder will cry if you add same key twice).
> >>>>>>> Any new binding can be added to map binder in the custom module.
> >>>>>>>
> >>>>>>> The way ppl can override this is, in your new module, you again
> >>>>>>> provide a
> >>>>>>> new list of rewriters. And then you override the DefaultGuiceModule
> >>>>>>> with
> >>>>>>> your module.
> >>>>>>>
> >>>>>>> Say you were providing a default list of GadgetRewriters in
> >>>>>>> DefaultGuiceModule:
> >>>>>>> @Named("gadget.rewriters") List<GadgetRewriter>
> provideDef(Rewriter1
> >>>>>>> r1) {
> >>>>>>> }
> >>>>>>>
> >>>>>>> and you want to change this list of provide Rewriter2 as well. You
> >>>>>>> create
> >>>>>>> your module called MyModule and provide:
> >>>>>>> @Named("gadget.rewriters") List<GadgetRewriter>
> provideDef(Rewriter1
> >>>>>>> r1,
> >>>>>>> Rewriter2 r2) {
> >>>>>>> }
> >>>>>>>
> >>>>>>> And then early on in the code, you override default guice module
> with
> >>>>>>> your
> >>>>>>> module:
> >>>>>>> Modules.override(new GuiceModule()).with(new MyModule());
> >>>>>>>
> >>>>>>> I think your facing the problem because maybe web.xml does not
> allow
> >>>>>>> you to
> >>>>>>> override a module with a new one. And when 2 modules provide same
> >>>>>>> binding,
> >>>>>>> guice dies.
> >>>>>>> A quick solution for your case would be to change web.xml to
> provide
> >>>>>>> your
> >>>>>>> module in place of DefaultGuiceModule, and change your module to
> >>>>>>> install DefaultGuiceModule after overriding it with your rewriter
> >>>>>>> list.
> >>>>>>> Something like:
> >>>>>>>
> >>>>>>> web.xml:
> >>>>>>>  <context-param>
> >>>>>>>    <param-name>guice-modules</param-name>
> >>>>>>>    <param-value>
> >>>>>>>      org.apache.shindig.common.PropertiesModule:
> >>>>>>>      org.apache.shindig.gadgets.*MyGuiceModule*:
> >>>>>>>      org.apache.shindig.social.core.config.SocialApiGuiceModule:
> >>>>>>> ......
> >>>>>>>
> >>>>>>> MyGuiceModule.java:
> >>>>>>> protected void configure() {
> >>>>>>>  Modules.override(new DefaultGuiceModule()).with(new
> AbstractModule()
> >>>>>>> {
> >>>>>>>    protected void configure() {
> >>>>>>>    }
> >>>>>>>    @Provides @Named("gadget.rewriters") List<GadgetRewriter>
> >>>>>>>     ....
> >>>>>>>  }
> >>>>>>> }
> >>>>>>>
> >>>>>>> I hope im making sense.
> >>>>>>>
> >>>>>>> On Fri, Oct 29, 2010 at 5:52 PM, Paul Lindner <li...@inuus.com>
> >>>>>>> wrote:
> >>>>>>>
> >>>>>>> > I think this is a good idea, however I'm concerned that the
> ordering
> >>>>>>> of
> >>>>>>> > Rewriters may be important.
> >>>>>>> >
> >>>>>>> > I'm guessing that we could make a SortedSet if we had a
> Comparable<>
> >>>>>>> > implementation of all rewriters.
> >>>>>>> >
> >>>>>>> > On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <
> kf.zhang@gmail.com
> >>>>>>> >
> >>>>>>> > wrote:
> >>>>>>> >
> >>>>>>> > > I found a possible solution to extend Shindig rewriter
> capability,
> >>>>>>> using
> >>>>>>> > > multibinding in Guice.
> >>>>>>> > >
> >>>>>>> > > Please see:
> >>>>>>> > >
> >>>>>>> > >
> >>>>>>> >
> >>>>>>>
> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
> >>>>>>> > >
> >>>>>>> > > I created a jira for this, see
> >>>>>>> > > https://issues.apache.org/jira/browse/SHINDIG-1456
> >>>>>>> > >
> >>>>>>> > >
> >>>>>>> > >
> >>>>>>> > > On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <
> >>>>>>> kf.zhang@gmail.com>
> >>>>>>> > > wrote:
> >>>>>>> > >
> >>>>>>> > > > Hi,
> >>>>>>> > > >
> >>>>>>> > > > I'd like to add a custom rewriter into Shindig, with
> requirement
> >>>>>>> of no
> >>>>>>> > > need
> >>>>>>> > > > to change Shindig rendering gadget server side code directly.
> I
> >>>>>>> want to
> >>>>>>> > > add
> >>>>>>> > > > it as a new feature in extras, so when this feature is
> required
> >>>>>>> by
> >>>>>>> > > gadget,
> >>>>>>> > > > the custom rewriter will do some special work when rendering
> >>>>>>> gadget at
> >>>>>>> > > > server side.
> >>>>>>> > > >
> >>>>>>> > > > But I checked Shindig code, RewriteModule @Provides all
> >>>>>>> predefined
> >>>>>>> > > > rewriters with @Named("shindig.rewriters.gadget") , and
> >>>>>>> > > > then GadgetRewritersProvider will provide all rewriters as
> per
> >>>>>>> the same
> >>>>>>> > > > @Name when rendering gadget.
> >>>>>>> > > >
> >>>>>>> > > > If I create a new Module in shindig extras, and @Provides
> custom
> >>>>>>> > rewriter
> >>>>>>> > > > with same @Name, and startup server, there will be error
> saying
> >>>>>>> the
> >>>>>>> > same
> >>>>>>> > > > @Name is configured already by RewriteModule.
> >>>>>>> > > >
> >>>>>>> > > > Can anyone please help if there is some way to append such a
> >>>>>>> rewriter
> >>>>>>> > > > without touching any existing Shindig gadget rendering code?
> Or
> >>>>>>> that is
> >>>>>>> > > the
> >>>>>>> > > > only way to extend a new rewriter for gadget rendering?
> >>>>>>> > > >
> >>>>>>> > > > Thanks a lot!
> >>>>>>> > > >
> >>>>>>> > >
> >>>>>>> >
> >>>>>>> >
> >>>>>>> >
> >>>>>>> > --
> >>>>>>> > Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
> >>>>>>> >
> >>>>>>>
> >>>>>>
> >>>>>>
> >>>>>
> >>>>
> >>>
> >>
> >
>
>
>
> --
> Thanks,
> Henry
>

Re: How to append custom rewriter for Shindig?

Posted by Henry Saputra <he...@gmail.com>.
According to
http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html

the ordering is consistent with the binding ordering/sequence: "The
set's iteration order is consistent with the binding order"

so I guess the ordering issue shouldnt be a problem.

- Henry

On Thu, Nov 4, 2010 at 1:09 AM, Kai Feng Zhang <kf...@gmail.com> wrote:
> hi Paul and Gagandeep,
>
> Seems we have no other options. Could I propose to code review my patch?
> https://issues.apache.org/jira/browse/SHINDIG-1456
>
> If the new rewriter to be appended is simple enough ,it's does not matter on
> the rewriters ordering issue I think. Otherwise we need to provide
> Comparable implementation for rewriters.
>
>
> On Tue, Nov 2, 2010 at 12:51 PM, Gagandeep singh <ga...@gmail.com>wrote:
>
>> Hi Kai
>>
>> Thanks for finding this. Sad that the Modules.override approach had a bug
>> :(
>>
>> On Tue, Nov 2, 2010 at 7:46 AM, Kai Feng Zhang <kf...@gmail.com> wrote:
>>
>>> Seems this is a known issue, I found this:
>>> http://code.google.com/p/google-guice/issues/detail?id=263
>>>
>>> I am not sure if this fix has gone into Guice 2.0 which is in classpath of
>>> Shindig. If it's not, then I think I still need to propose my patch, which
>>> will provide capability of extending/appending rewriters for Shindig gadget
>>> renderer.
>>>
>> Would it be possible to go through this codereview<http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java>( maybe patch it in your client and play with it ) to see if it solves your
>> problem ?
>>
>>
>>> https://issues.apache.org/jira/browse/SHINDIG-1456
>>>
>>> Any comments? Thanks.
>>>
>>>  <http://code.google.com/p/google-guice/issues/detail?id=263>
>>> Thanks,
>>>
>>> Kevin Zhang (凯峰)
>>> Gtalk:   kf.zhang@gmail.com
>>> Blog:    http://www.zhangkf.com
>>> Twitter: http://twitter.com/zhangkf
>>>
>>>
>>> On Mon, Nov 1, 2010 at 11:50 AM, Kai Feng Zhang <kf...@gmail.com>wrote:
>>>
>>>> Hi Gagandeep,
>>>>
>>>> Thank you for the detailed sample code.
>>>>
>>>> I tried with your module override code, but seems it does not work, there
>>>> are binding exception if I replace the DefaultGuiceModule with my new
>>>> CustomGuiceModule in web.xml.
>>>>
>>>> ============ Exception stack =================
>>>> 2010-11-1 11:19:53 org.apache.catalina.core.StandardContext listenerStart
>>>> com.google.inject.CreationException: Guice creation errors:
>>>>
>>>> 1) A binding to java.util.Set<java.lang.String> annotated with
>>>> @com.google.inject.name.Named(value=org.apache.shindig.features-extended)
>>>> was already configured at
>>>> org.apache.shindig.gadgets.DefaultGuiceModule.registerFeatureHandlers(DefaultGuiceModule.java:124).
>>>>   at
>>>> org.apache.shindig.extras.ShindigExtrasGuiceModule.configureExtraFeatures(ShindigExtrasGuiceModule.java:41)
>>>>
>>>> 2) A binding to java.util.Set<java.lang.Object> annotated with
>>>> @com.google.inject.name.Named(value=org.apache.shindig.handlers) was already
>>>> configured at
>>>> org.apache.shindig.gadgets.DefaultGuiceModule.registerGadgetHandlers(DefaultGuiceModule.java:105).
>>>>   at
>>>> org.apache.shindig.social.core.config.SocialApiGuiceModule.configure(SocialApiGuiceModule.java:76)
>>>>
>>>> 2 errors
>>>> at
>>>> com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:354)
>>>>  at
>>>> com.google.inject.InjectorBuilder.initializeStatically(InjectorBuilder.java:152)
>>>> at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:105)
>>>>  at com.google.inject.Guice.createInjector(Guice.java:92)
>>>> at
>>>> org.apache.shindig.common.servlet.GuiceServletContextListener.contextInitialized(GuiceServletContextListener.java:73)
>>>>  at
>>>> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
>>>> at
>>>> org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
>>>>  at
>>>> org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
>>>> at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
>>>>  at
>>>> org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
>>>> at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
>>>>  at
>>>> org.apache.catalina.core.StandardService.start(StandardService.java:519)
>>>> at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
>>>>  at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
>>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>>  at
>>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>>> at
>>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>>  at java.lang.reflect.Method.invoke(Method.java:592)
>>>> at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
>>>>  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
>>>> 2010-11-1 11:19:53 org.apache.catalina.core.StandardContext start
>>>>
>>>> ==================CustomGuiceModule=======================
>>>>
>>>> protected void configure() {
>>>>     install(Modules.override(new DefaultGuiceModule()).with(new
>>>> AbstractModule() {
>>>>
>>>>       @Override
>>>>       protected void configure() {
>>>>         // TODO Auto-generated method stub
>>>>       }
>>>>
>>>>       @Provides
>>>>       @Singleton
>>>>       @Named("shindig.rewriters.gadget")
>>>>       protected List<GadgetRewriter> provideGadgetRewriters(
>>>>           PipelineDataGadgetRewriter pipelineRewriter,
>>>>           TemplateRewriter templateRewriter,
>>>>           AbsolutePathReferenceRewriter absolutePathRewriter,
>>>>           StyleTagExtractorContentRewriter styleTagExtractorRewriter,
>>>>           StyleAdjacencyContentRewriter styleAdjacencyRewriter,
>>>>           ProxyingContentRewriter proxyingRewriter,
>>>>           CajaContentRewriter cajaRewriter,
>>>>           SanitizingGadgetRewriter sanitizedRewriter,
>>>>           RenderingGadgetRewriter renderingRewriter,
>>>>           OpenSocialI18NGadgetRewriter i18nRewriter,
>>>>           CustomGadgetRewriter customGadgetRewriter) {
>>>>         return ImmutableList.of(pipelineRewriter, templateRewriter,
>>>>             absolutePathRewriter, styleTagExtractorRewriter,
>>>> styleAdjacencyRewriter, proxyingRewriter,
>>>>             cajaRewriter, sanitizedRewriter, renderingRewriter,
>>>> i18nRewriter, customGadgetRewriter);
>>>>       }
>>>>
>>>>     }));
>>>>
>>>>   }
>>>>
>>>> ================web.xml=====================
>>>>   <context-param>
>>>>     <param-name>guice-modules</param-name>
>>>>     <param-value>
>>>>       org.apache.shindig.common.PropertiesModule:
>>>>       org.apache.shindig.extras.CustomGuiceModule:
>>>>       org.apache.shindig.social.core.config.SocialApiGuiceModule:
>>>>       org.apache.shindig.social.sample.SampleModule:
>>>>       org.apache.shindig.gadgets.oauth.OAuthModule:
>>>>       org.apache.shindig.common.cache.ehcache.EhCacheModule:
>>>>       org.apache.shindig.sample.shiro.ShiroGuiceModule:
>>>>       org.apache.shindig.sample.container.SampleContainerGuiceModule:
>>>>       org.apache.shindig.extras.ShindigExtrasGuiceModule:
>>>>       org.apache.shindig.extras.as.ActivityStreamsGuiceModule
>>>>     </param-value>
>>>>   </context-param>
>>>>
>>>> ==================================
>>>> From the exception, it says 2 binding are already configured in
>>>> DefaultGuiceModule, then they should not be configured again in other
>>>> modules, but these 2 binding are multibinding. I am curious why this would
>>>> happen.
>>>>
>>>> If this kind of override module way works, it does be helpful for my
>>>> case, since I even do not need to change any code of existing Shindig
>>>> code(any modules).   Thanks.
>>>>
>>>>
>>>> Thanks,
>>>>
>>>> Kevin Zhang (凯峰)
>>>> Gtalk:   kf.zhang@gmail.com
>>>> Blog:    http://www.zhangkf.com
>>>> Twitter: http://twitter.com/zhangkf
>>>>
>>>>
>>>> On Mon, Nov 1, 2010 at 12:31 AM, Gagandeep Singh <ga...@gmail.com>wrote:
>>>>
>>>>> Hi Kai
>>>>>
>>>>>
>>>>> On Sun, Oct 31, 2010 at 5:38 PM, Kai Feng Zhang <kf...@gmail.com>wrote:
>>>>>
>>>>>> Hey Gagandeep,
>>>>>>
>>>>>> Thank you, it seems your solution is cool thing with more flexibility.
>>>>>>
>>>>>> What I am asking is to *append* a rewriter to current rewriters list
>>>>>> from DefaultGuiceModule, b/c I think the existing rewriters are good enough
>>>>>> for my case. And as I know, DefaultGuiceModule does a lot of things
>>>>>> (installing different modules etc), but not only install RewriterModule for
>>>>>> binding rewiters.
>>>>>>
>>>>>
>>>>> Your module (say MyGuiceModule) would look like:
>>>>> class MyGuiceModule extends AbstractModule {
>>>>>   public void configure() {
>>>>>     install(Modules.override(new DefaultGuiceModule()).with(new
>>>>> MySpecialModule()));
>>>>>   }
>>>>> }
>>>>>
>>>>> This will provide everything that DefaultGuiceModule already does. In
>>>>> addition, it will provide the bindings you specifically provided in
>>>>> MySpecialModule and override these when they conflict with ones provided
>>>>> by DefaultGuiceModule.
>>>>> Take a look at Modules.override<http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/util/Modules.html#override(com.google.inject.Module...)>documentation.
>>>>>
>>>>>  As far as appending a rewriter to existing list is concerned, can't
>>>>> help you much there.
>>>>> This sample code:
>>>>>     class T {
>>>>>       public final String name;
>>>>>       public T(String name) {
>>>>>         this.name = name;
>>>>>       }
>>>>>     }
>>>>>
>>>>>     class A extends AbstractModule {
>>>>>       @Override
>>>>>       protected void configure() {
>>>>>         bind(T.class).annotatedWith(Names.named("hello")).toInstance(new
>>>>> T("hello"));
>>>>>       }
>>>>>     }
>>>>>     class B extends AbstractModule {
>>>>>       @Override
>>>>>       protected void configure() {
>>>>>       }
>>>>>
>>>>>       @Provides @Named("hello") @Inject
>>>>>       public T provideBuffalo(@Named("hello") T helloT) {
>>>>>         return new T("buffalo");
>>>>>       }
>>>>>     }
>>>>>
>>>>>     Injector injector = Guice.createInjector(Modules.override(new
>>>>> A()).with(new B()));
>>>>>     T h = injector.getInstance(Key.get(T.class, Names.named("hello")));
>>>>>     assertEquals("buffalo", h.name);
>>>>>
>>>>> throws StackOverflowException, because guice is trying to access the
>>>>> same @Named("hello")that its trying to provide.
>>>>> So you'l have to enumerate the rewriters you need to append your
>>>>> rewriter to again in your module.
>>>>>
>>>>>
>>>>>> So I think replace DefaultGuiceModule with custom module class in
>>>>>> web.xml maybe not enough, you still need to do other same work as
>>>>>> DefaultGuiceModule in your module.Please note that RewriterModule installed
>>>>>> in DefaultGuiceModule is not configured in web.xml.
>>>>>>
>>>>>> Any comments? Thanks a lot.
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> Kevin Zhang (凯峰)
>>>>>> Gtalk:   kf.zhang@gmail.com
>>>>>> Blog:    http://www.zhangkf.com
>>>>>> Twitter: http://twitter.com/zhangkf
>>>>>>
>>>>>>
>>>>>> On Sat, Oct 30, 2010 at 10:28 AM, Gagandeep singh <
>>>>>> gagan.goku@gmail.com> wrote:
>>>>>>
>>>>>>> Hi Kai, Paul
>>>>>>>
>>>>>>> You are both right :) The order of rewriters matters.
>>>>>>>
>>>>>>> I have a patch<
>>>>>>> http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
>>>>>>> >
>>>>>>>
>>>>>>> (which
>>>>>>> JohnH has been reviewing and providing ideas for) which does something
>>>>>>> similar. The idea is, we create a map binder from container + flow id
>>>>>>> -> *
>>>>>>> provider* of list of rewriters.
>>>>>>> And we provide the list of rewriters similarly to how we providing
>>>>>>> currently. Since we add provider of rewriter list, we can provide a
>>>>>>> different list without having to add it to the map binder separately
>>>>>>> (map
>>>>>>> binder will cry if you add same key twice).
>>>>>>> Any new binding can be added to map binder in the custom module.
>>>>>>>
>>>>>>> The way ppl can override this is, in your new module, you again
>>>>>>> provide a
>>>>>>> new list of rewriters. And then you override the DefaultGuiceModule
>>>>>>> with
>>>>>>> your module.
>>>>>>>
>>>>>>> Say you were providing a default list of GadgetRewriters in
>>>>>>> DefaultGuiceModule:
>>>>>>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1
>>>>>>> r1) {
>>>>>>> }
>>>>>>>
>>>>>>> and you want to change this list of provide Rewriter2 as well. You
>>>>>>> create
>>>>>>> your module called MyModule and provide:
>>>>>>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1
>>>>>>> r1,
>>>>>>> Rewriter2 r2) {
>>>>>>> }
>>>>>>>
>>>>>>> And then early on in the code, you override default guice module with
>>>>>>> your
>>>>>>> module:
>>>>>>> Modules.override(new GuiceModule()).with(new MyModule());
>>>>>>>
>>>>>>> I think your facing the problem because maybe web.xml does not allow
>>>>>>> you to
>>>>>>> override a module with a new one. And when 2 modules provide same
>>>>>>> binding,
>>>>>>> guice dies.
>>>>>>> A quick solution for your case would be to change web.xml to provide
>>>>>>> your
>>>>>>> module in place of DefaultGuiceModule, and change your module to
>>>>>>> install DefaultGuiceModule after overriding it with your rewriter
>>>>>>> list.
>>>>>>> Something like:
>>>>>>>
>>>>>>> web.xml:
>>>>>>>  <context-param>
>>>>>>>    <param-name>guice-modules</param-name>
>>>>>>>    <param-value>
>>>>>>>      org.apache.shindig.common.PropertiesModule:
>>>>>>>      org.apache.shindig.gadgets.*MyGuiceModule*:
>>>>>>>      org.apache.shindig.social.core.config.SocialApiGuiceModule:
>>>>>>> ......
>>>>>>>
>>>>>>> MyGuiceModule.java:
>>>>>>> protected void configure() {
>>>>>>>  Modules.override(new DefaultGuiceModule()).with(new AbstractModule()
>>>>>>> {
>>>>>>>    protected void configure() {
>>>>>>>    }
>>>>>>>    @Provides @Named("gadget.rewriters") List<GadgetRewriter>
>>>>>>>     ....
>>>>>>>  }
>>>>>>> }
>>>>>>>
>>>>>>> I hope im making sense.
>>>>>>>
>>>>>>> On Fri, Oct 29, 2010 at 5:52 PM, Paul Lindner <li...@inuus.com>
>>>>>>> wrote:
>>>>>>>
>>>>>>> > I think this is a good idea, however I'm concerned that the ordering
>>>>>>> of
>>>>>>> > Rewriters may be important.
>>>>>>> >
>>>>>>> > I'm guessing that we could make a SortedSet if we had a Comparable<>
>>>>>>> > implementation of all rewriters.
>>>>>>> >
>>>>>>> > On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <kf.zhang@gmail.com
>>>>>>> >
>>>>>>> > wrote:
>>>>>>> >
>>>>>>> > > I found a possible solution to extend Shindig rewriter capability,
>>>>>>> using
>>>>>>> > > multibinding in Guice.
>>>>>>> > >
>>>>>>> > > Please see:
>>>>>>> > >
>>>>>>> > >
>>>>>>> >
>>>>>>> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
>>>>>>> > >
>>>>>>> > > I created a jira for this, see
>>>>>>> > > https://issues.apache.org/jira/browse/SHINDIG-1456
>>>>>>> > >
>>>>>>> > >
>>>>>>> > >
>>>>>>> > > On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <
>>>>>>> kf.zhang@gmail.com>
>>>>>>> > > wrote:
>>>>>>> > >
>>>>>>> > > > Hi,
>>>>>>> > > >
>>>>>>> > > > I'd like to add a custom rewriter into Shindig, with requirement
>>>>>>> of no
>>>>>>> > > need
>>>>>>> > > > to change Shindig rendering gadget server side code directly. I
>>>>>>> want to
>>>>>>> > > add
>>>>>>> > > > it as a new feature in extras, so when this feature is required
>>>>>>> by
>>>>>>> > > gadget,
>>>>>>> > > > the custom rewriter will do some special work when rendering
>>>>>>> gadget at
>>>>>>> > > > server side.
>>>>>>> > > >
>>>>>>> > > > But I checked Shindig code, RewriteModule @Provides all
>>>>>>> predefined
>>>>>>> > > > rewriters with @Named("shindig.rewriters.gadget") , and
>>>>>>> > > > then GadgetRewritersProvider will provide all rewriters as per
>>>>>>> the same
>>>>>>> > > > @Name when rendering gadget.
>>>>>>> > > >
>>>>>>> > > > If I create a new Module in shindig extras, and @Provides custom
>>>>>>> > rewriter
>>>>>>> > > > with same @Name, and startup server, there will be error saying
>>>>>>> the
>>>>>>> > same
>>>>>>> > > > @Name is configured already by RewriteModule.
>>>>>>> > > >
>>>>>>> > > > Can anyone please help if there is some way to append such a
>>>>>>> rewriter
>>>>>>> > > > without touching any existing Shindig gadget rendering code? Or
>>>>>>> that is
>>>>>>> > > the
>>>>>>> > > > only way to extend a new rewriter for gadget rendering?
>>>>>>> > > >
>>>>>>> > > > Thanks a lot!
>>>>>>> > > >
>>>>>>> > >
>>>>>>> >
>>>>>>> >
>>>>>>> >
>>>>>>> > --
>>>>>>> > Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
>>>>>>> >
>>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>
>>>
>>
>



-- 
Thanks,
Henry

Re: How to append custom rewriter for Shindig?

Posted by Kai Feng Zhang <kf...@gmail.com>.
hi Paul and Gagandeep,

Seems we have no other options. Could I propose to code review my patch?
https://issues.apache.org/jira/browse/SHINDIG-1456

If the new rewriter to be appended is simple enough ,it's does not matter on
the rewriters ordering issue I think. Otherwise we need to provide
Comparable implementation for rewriters.


On Tue, Nov 2, 2010 at 12:51 PM, Gagandeep singh <ga...@gmail.com>wrote:

> Hi Kai
>
> Thanks for finding this. Sad that the Modules.override approach had a bug
> :(
>
> On Tue, Nov 2, 2010 at 7:46 AM, Kai Feng Zhang <kf...@gmail.com> wrote:
>
>> Seems this is a known issue, I found this:
>> http://code.google.com/p/google-guice/issues/detail?id=263
>>
>> I am not sure if this fix has gone into Guice 2.0 which is in classpath of
>> Shindig. If it's not, then I think I still need to propose my patch, which
>> will provide capability of extending/appending rewriters for Shindig gadget
>> renderer.
>>
> Would it be possible to go through this codereview<http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java>( maybe patch it in your client and play with it ) to see if it solves your
> problem ?
>
>
>> https://issues.apache.org/jira/browse/SHINDIG-1456
>>
>> Any comments? Thanks.
>>
>>  <http://code.google.com/p/google-guice/issues/detail?id=263>
>> Thanks,
>>
>> Kevin Zhang (凯峰)
>> Gtalk:   kf.zhang@gmail.com
>> Blog:    http://www.zhangkf.com
>> Twitter: http://twitter.com/zhangkf
>>
>>
>> On Mon, Nov 1, 2010 at 11:50 AM, Kai Feng Zhang <kf...@gmail.com>wrote:
>>
>>> Hi Gagandeep,
>>>
>>> Thank you for the detailed sample code.
>>>
>>> I tried with your module override code, but seems it does not work, there
>>> are binding exception if I replace the DefaultGuiceModule with my new
>>> CustomGuiceModule in web.xml.
>>>
>>> ============ Exception stack =================
>>> 2010-11-1 11:19:53 org.apache.catalina.core.StandardContext listenerStart
>>> com.google.inject.CreationException: Guice creation errors:
>>>
>>> 1) A binding to java.util.Set<java.lang.String> annotated with
>>> @com.google.inject.name.Named(value=org.apache.shindig.features-extended)
>>> was already configured at
>>> org.apache.shindig.gadgets.DefaultGuiceModule.registerFeatureHandlers(DefaultGuiceModule.java:124).
>>>   at
>>> org.apache.shindig.extras.ShindigExtrasGuiceModule.configureExtraFeatures(ShindigExtrasGuiceModule.java:41)
>>>
>>> 2) A binding to java.util.Set<java.lang.Object> annotated with
>>> @com.google.inject.name.Named(value=org.apache.shindig.handlers) was already
>>> configured at
>>> org.apache.shindig.gadgets.DefaultGuiceModule.registerGadgetHandlers(DefaultGuiceModule.java:105).
>>>   at
>>> org.apache.shindig.social.core.config.SocialApiGuiceModule.configure(SocialApiGuiceModule.java:76)
>>>
>>> 2 errors
>>> at
>>> com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:354)
>>>  at
>>> com.google.inject.InjectorBuilder.initializeStatically(InjectorBuilder.java:152)
>>> at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:105)
>>>  at com.google.inject.Guice.createInjector(Guice.java:92)
>>> at
>>> org.apache.shindig.common.servlet.GuiceServletContextListener.contextInitialized(GuiceServletContextListener.java:73)
>>>  at
>>> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
>>> at
>>> org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
>>>  at
>>> org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
>>> at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
>>>  at
>>> org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
>>> at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
>>>  at
>>> org.apache.catalina.core.StandardService.start(StandardService.java:519)
>>> at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
>>>  at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
>>> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>>>  at
>>> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>>> at
>>> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>>>  at java.lang.reflect.Method.invoke(Method.java:592)
>>> at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
>>>  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
>>> 2010-11-1 11:19:53 org.apache.catalina.core.StandardContext start
>>>
>>> ==================CustomGuiceModule=======================
>>>
>>> protected void configure() {
>>>     install(Modules.override(new DefaultGuiceModule()).with(new
>>> AbstractModule() {
>>>
>>>       @Override
>>>       protected void configure() {
>>>         // TODO Auto-generated method stub
>>>       }
>>>
>>>       @Provides
>>>       @Singleton
>>>       @Named("shindig.rewriters.gadget")
>>>       protected List<GadgetRewriter> provideGadgetRewriters(
>>>           PipelineDataGadgetRewriter pipelineRewriter,
>>>           TemplateRewriter templateRewriter,
>>>           AbsolutePathReferenceRewriter absolutePathRewriter,
>>>           StyleTagExtractorContentRewriter styleTagExtractorRewriter,
>>>           StyleAdjacencyContentRewriter styleAdjacencyRewriter,
>>>           ProxyingContentRewriter proxyingRewriter,
>>>           CajaContentRewriter cajaRewriter,
>>>           SanitizingGadgetRewriter sanitizedRewriter,
>>>           RenderingGadgetRewriter renderingRewriter,
>>>           OpenSocialI18NGadgetRewriter i18nRewriter,
>>>           CustomGadgetRewriter customGadgetRewriter) {
>>>         return ImmutableList.of(pipelineRewriter, templateRewriter,
>>>             absolutePathRewriter, styleTagExtractorRewriter,
>>> styleAdjacencyRewriter, proxyingRewriter,
>>>             cajaRewriter, sanitizedRewriter, renderingRewriter,
>>> i18nRewriter, customGadgetRewriter);
>>>       }
>>>
>>>     }));
>>>
>>>   }
>>>
>>> ================web.xml=====================
>>>   <context-param>
>>>     <param-name>guice-modules</param-name>
>>>     <param-value>
>>>       org.apache.shindig.common.PropertiesModule:
>>>       org.apache.shindig.extras.CustomGuiceModule:
>>>       org.apache.shindig.social.core.config.SocialApiGuiceModule:
>>>       org.apache.shindig.social.sample.SampleModule:
>>>       org.apache.shindig.gadgets.oauth.OAuthModule:
>>>       org.apache.shindig.common.cache.ehcache.EhCacheModule:
>>>       org.apache.shindig.sample.shiro.ShiroGuiceModule:
>>>       org.apache.shindig.sample.container.SampleContainerGuiceModule:
>>>       org.apache.shindig.extras.ShindigExtrasGuiceModule:
>>>       org.apache.shindig.extras.as.ActivityStreamsGuiceModule
>>>     </param-value>
>>>   </context-param>
>>>
>>> ==================================
>>> From the exception, it says 2 binding are already configured in
>>> DefaultGuiceModule, then they should not be configured again in other
>>> modules, but these 2 binding are multibinding. I am curious why this would
>>> happen.
>>>
>>> If this kind of override module way works, it does be helpful for my
>>> case, since I even do not need to change any code of existing Shindig
>>> code(any modules).   Thanks.
>>>
>>>
>>> Thanks,
>>>
>>> Kevin Zhang (凯峰)
>>> Gtalk:   kf.zhang@gmail.com
>>> Blog:    http://www.zhangkf.com
>>> Twitter: http://twitter.com/zhangkf
>>>
>>>
>>> On Mon, Nov 1, 2010 at 12:31 AM, Gagandeep Singh <ga...@gmail.com>wrote:
>>>
>>>> Hi Kai
>>>>
>>>>
>>>> On Sun, Oct 31, 2010 at 5:38 PM, Kai Feng Zhang <kf...@gmail.com>wrote:
>>>>
>>>>> Hey Gagandeep,
>>>>>
>>>>> Thank you, it seems your solution is cool thing with more flexibility.
>>>>>
>>>>> What I am asking is to *append* a rewriter to current rewriters list
>>>>> from DefaultGuiceModule, b/c I think the existing rewriters are good enough
>>>>> for my case. And as I know, DefaultGuiceModule does a lot of things
>>>>> (installing different modules etc), but not only install RewriterModule for
>>>>> binding rewiters.
>>>>>
>>>>
>>>> Your module (say MyGuiceModule) would look like:
>>>> class MyGuiceModule extends AbstractModule {
>>>>   public void configure() {
>>>>     install(Modules.override(new DefaultGuiceModule()).with(new
>>>> MySpecialModule()));
>>>>   }
>>>> }
>>>>
>>>> This will provide everything that DefaultGuiceModule already does. In
>>>> addition, it will provide the bindings you specifically provided in
>>>> MySpecialModule and override these when they conflict with ones provided
>>>> by DefaultGuiceModule.
>>>> Take a look at Modules.override<http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/util/Modules.html#override(com.google.inject.Module...)>documentation.
>>>>
>>>>  As far as appending a rewriter to existing list is concerned, can't
>>>> help you much there.
>>>> This sample code:
>>>>     class T {
>>>>       public final String name;
>>>>       public T(String name) {
>>>>         this.name = name;
>>>>       }
>>>>     }
>>>>
>>>>     class A extends AbstractModule {
>>>>       @Override
>>>>       protected void configure() {
>>>>         bind(T.class).annotatedWith(Names.named("hello")).toInstance(new
>>>> T("hello"));
>>>>       }
>>>>     }
>>>>     class B extends AbstractModule {
>>>>       @Override
>>>>       protected void configure() {
>>>>       }
>>>>
>>>>       @Provides @Named("hello") @Inject
>>>>       public T provideBuffalo(@Named("hello") T helloT) {
>>>>         return new T("buffalo");
>>>>       }
>>>>     }
>>>>
>>>>     Injector injector = Guice.createInjector(Modules.override(new
>>>> A()).with(new B()));
>>>>     T h = injector.getInstance(Key.get(T.class, Names.named("hello")));
>>>>     assertEquals("buffalo", h.name);
>>>>
>>>> throws StackOverflowException, because guice is trying to access the
>>>> same @Named("hello")that its trying to provide.
>>>> So you'l have to enumerate the rewriters you need to append your
>>>> rewriter to again in your module.
>>>>
>>>>
>>>>> So I think replace DefaultGuiceModule with custom module class in
>>>>> web.xml maybe not enough, you still need to do other same work as
>>>>> DefaultGuiceModule in your module.Please note that RewriterModule installed
>>>>> in DefaultGuiceModule is not configured in web.xml.
>>>>>
>>>>> Any comments? Thanks a lot.
>>>>>
>>>>> Thanks,
>>>>>
>>>>> Kevin Zhang (凯峰)
>>>>> Gtalk:   kf.zhang@gmail.com
>>>>> Blog:    http://www.zhangkf.com
>>>>> Twitter: http://twitter.com/zhangkf
>>>>>
>>>>>
>>>>> On Sat, Oct 30, 2010 at 10:28 AM, Gagandeep singh <
>>>>> gagan.goku@gmail.com> wrote:
>>>>>
>>>>>> Hi Kai, Paul
>>>>>>
>>>>>> You are both right :) The order of rewriters matters.
>>>>>>
>>>>>> I have a patch<
>>>>>> http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
>>>>>> >
>>>>>>
>>>>>> (which
>>>>>> JohnH has been reviewing and providing ideas for) which does something
>>>>>> similar. The idea is, we create a map binder from container + flow id
>>>>>> -> *
>>>>>> provider* of list of rewriters.
>>>>>> And we provide the list of rewriters similarly to how we providing
>>>>>> currently. Since we add provider of rewriter list, we can provide a
>>>>>> different list without having to add it to the map binder separately
>>>>>> (map
>>>>>> binder will cry if you add same key twice).
>>>>>> Any new binding can be added to map binder in the custom module.
>>>>>>
>>>>>> The way ppl can override this is, in your new module, you again
>>>>>> provide a
>>>>>> new list of rewriters. And then you override the DefaultGuiceModule
>>>>>> with
>>>>>> your module.
>>>>>>
>>>>>> Say you were providing a default list of GadgetRewriters in
>>>>>> DefaultGuiceModule:
>>>>>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1
>>>>>> r1) {
>>>>>> }
>>>>>>
>>>>>> and you want to change this list of provide Rewriter2 as well. You
>>>>>> create
>>>>>> your module called MyModule and provide:
>>>>>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1
>>>>>> r1,
>>>>>> Rewriter2 r2) {
>>>>>> }
>>>>>>
>>>>>> And then early on in the code, you override default guice module with
>>>>>> your
>>>>>> module:
>>>>>> Modules.override(new GuiceModule()).with(new MyModule());
>>>>>>
>>>>>> I think your facing the problem because maybe web.xml does not allow
>>>>>> you to
>>>>>> override a module with a new one. And when 2 modules provide same
>>>>>> binding,
>>>>>> guice dies.
>>>>>> A quick solution for your case would be to change web.xml to provide
>>>>>> your
>>>>>> module in place of DefaultGuiceModule, and change your module to
>>>>>> install DefaultGuiceModule after overriding it with your rewriter
>>>>>> list.
>>>>>> Something like:
>>>>>>
>>>>>> web.xml:
>>>>>>  <context-param>
>>>>>>    <param-name>guice-modules</param-name>
>>>>>>    <param-value>
>>>>>>      org.apache.shindig.common.PropertiesModule:
>>>>>>      org.apache.shindig.gadgets.*MyGuiceModule*:
>>>>>>      org.apache.shindig.social.core.config.SocialApiGuiceModule:
>>>>>> ......
>>>>>>
>>>>>> MyGuiceModule.java:
>>>>>> protected void configure() {
>>>>>>  Modules.override(new DefaultGuiceModule()).with(new AbstractModule()
>>>>>> {
>>>>>>    protected void configure() {
>>>>>>    }
>>>>>>    @Provides @Named("gadget.rewriters") List<GadgetRewriter>
>>>>>>     ....
>>>>>>  }
>>>>>> }
>>>>>>
>>>>>> I hope im making sense.
>>>>>>
>>>>>> On Fri, Oct 29, 2010 at 5:52 PM, Paul Lindner <li...@inuus.com>
>>>>>> wrote:
>>>>>>
>>>>>> > I think this is a good idea, however I'm concerned that the ordering
>>>>>> of
>>>>>> > Rewriters may be important.
>>>>>> >
>>>>>> > I'm guessing that we could make a SortedSet if we had a Comparable<>
>>>>>> > implementation of all rewriters.
>>>>>> >
>>>>>> > On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <kf.zhang@gmail.com
>>>>>> >
>>>>>> > wrote:
>>>>>> >
>>>>>> > > I found a possible solution to extend Shindig rewriter capability,
>>>>>> using
>>>>>> > > multibinding in Guice.
>>>>>> > >
>>>>>> > > Please see:
>>>>>> > >
>>>>>> > >
>>>>>> >
>>>>>> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
>>>>>> > >
>>>>>> > > I created a jira for this, see
>>>>>> > > https://issues.apache.org/jira/browse/SHINDIG-1456
>>>>>> > >
>>>>>> > >
>>>>>> > >
>>>>>> > > On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <
>>>>>> kf.zhang@gmail.com>
>>>>>> > > wrote:
>>>>>> > >
>>>>>> > > > Hi,
>>>>>> > > >
>>>>>> > > > I'd like to add a custom rewriter into Shindig, with requirement
>>>>>> of no
>>>>>> > > need
>>>>>> > > > to change Shindig rendering gadget server side code directly. I
>>>>>> want to
>>>>>> > > add
>>>>>> > > > it as a new feature in extras, so when this feature is required
>>>>>> by
>>>>>> > > gadget,
>>>>>> > > > the custom rewriter will do some special work when rendering
>>>>>> gadget at
>>>>>> > > > server side.
>>>>>> > > >
>>>>>> > > > But I checked Shindig code, RewriteModule @Provides all
>>>>>> predefined
>>>>>> > > > rewriters with @Named("shindig.rewriters.gadget") , and
>>>>>> > > > then GadgetRewritersProvider will provide all rewriters as per
>>>>>> the same
>>>>>> > > > @Name when rendering gadget.
>>>>>> > > >
>>>>>> > > > If I create a new Module in shindig extras, and @Provides custom
>>>>>> > rewriter
>>>>>> > > > with same @Name, and startup server, there will be error saying
>>>>>> the
>>>>>> > same
>>>>>> > > > @Name is configured already by RewriteModule.
>>>>>> > > >
>>>>>> > > > Can anyone please help if there is some way to append such a
>>>>>> rewriter
>>>>>> > > > without touching any existing Shindig gadget rendering code? Or
>>>>>> that is
>>>>>> > > the
>>>>>> > > > only way to extend a new rewriter for gadget rendering?
>>>>>> > > >
>>>>>> > > > Thanks a lot!
>>>>>> > > >
>>>>>> > >
>>>>>> >
>>>>>> >
>>>>>> >
>>>>>> > --
>>>>>> > Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
>>>>>> >
>>>>>>
>>>>>
>>>>>
>>>>
>>>
>>
>

Re: How to append custom rewriter for Shindig?

Posted by Kai Feng Zhang <kf...@gmail.com>.
Seems this is a known issue, I found this:
http://code.google.com/p/google-guice/issues/detail?id=263

I am not sure if this fix has gone into Guice 2.0 which is in classpath of
Shindig. If it's not, then I think I still need to propose my patch, which
will provide capability of extending/appending rewriters for Shindig gadget
renderer.

https://issues.apache.org/jira/browse/SHINDIG-1456

Any comments? Thanks.

<http://code.google.com/p/google-guice/issues/detail?id=263>
Thanks,

Kevin Zhang (凯峰)
Gtalk:   kf.zhang@gmail.com
Blog:    http://www.zhangkf.com
Twitter: http://twitter.com/zhangkf


On Mon, Nov 1, 2010 at 11:50 AM, Kai Feng Zhang <kf...@gmail.com> wrote:

> Hi Gagandeep,
>
> Thank you for the detailed sample code.
>
> I tried with your module override code, but seems it does not work, there
> are binding exception if I replace the DefaultGuiceModule with my new
> CustomGuiceModule in web.xml.
>
> ============ Exception stack =================
> 2010-11-1 11:19:53 org.apache.catalina.core.StandardContext listenerStart
> com.google.inject.CreationException: Guice creation errors:
>
> 1) A binding to java.util.Set<java.lang.String> annotated with
> @com.google.inject.name.Named(value=org.apache.shindig.features-extended)
> was already configured at
> org.apache.shindig.gadgets.DefaultGuiceModule.registerFeatureHandlers(DefaultGuiceModule.java:124).
>   at
> org.apache.shindig.extras.ShindigExtrasGuiceModule.configureExtraFeatures(ShindigExtrasGuiceModule.java:41)
>
> 2) A binding to java.util.Set<java.lang.Object> annotated with
> @com.google.inject.name.Named(value=org.apache.shindig.handlers) was already
> configured at
> org.apache.shindig.gadgets.DefaultGuiceModule.registerGadgetHandlers(DefaultGuiceModule.java:105).
>   at
> org.apache.shindig.social.core.config.SocialApiGuiceModule.configure(SocialApiGuiceModule.java:76)
>
> 2 errors
> at
> com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:354)
>  at
> com.google.inject.InjectorBuilder.initializeStatically(InjectorBuilder.java:152)
> at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:105)
>  at com.google.inject.Guice.createInjector(Guice.java:92)
> at
> org.apache.shindig.common.servlet.GuiceServletContextListener.contextInitialized(GuiceServletContextListener.java:73)
>  at
> org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
> at
> org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
>  at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
> at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
>  at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
> at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
>  at
> org.apache.catalina.core.StandardService.start(StandardService.java:519)
> at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
>  at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
> at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>  at
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
> at
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>  at java.lang.reflect.Method.invoke(Method.java:592)
> at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
>  at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
> 2010-11-1 11:19:53 org.apache.catalina.core.StandardContext start
>
> ==================CustomGuiceModule=======================
>
> protected void configure() {
>     install(Modules.override(new DefaultGuiceModule()).with(new
> AbstractModule() {
>
>       @Override
>       protected void configure() {
>         // TODO Auto-generated method stub
>       }
>
>       @Provides
>       @Singleton
>       @Named("shindig.rewriters.gadget")
>       protected List<GadgetRewriter> provideGadgetRewriters(
>           PipelineDataGadgetRewriter pipelineRewriter,
>           TemplateRewriter templateRewriter,
>           AbsolutePathReferenceRewriter absolutePathRewriter,
>           StyleTagExtractorContentRewriter styleTagExtractorRewriter,
>           StyleAdjacencyContentRewriter styleAdjacencyRewriter,
>           ProxyingContentRewriter proxyingRewriter,
>           CajaContentRewriter cajaRewriter,
>           SanitizingGadgetRewriter sanitizedRewriter,
>           RenderingGadgetRewriter renderingRewriter,
>           OpenSocialI18NGadgetRewriter i18nRewriter,
>           CustomGadgetRewriter customGadgetRewriter) {
>         return ImmutableList.of(pipelineRewriter, templateRewriter,
>             absolutePathRewriter, styleTagExtractorRewriter,
> styleAdjacencyRewriter, proxyingRewriter,
>             cajaRewriter, sanitizedRewriter, renderingRewriter,
> i18nRewriter, customGadgetRewriter);
>       }
>
>     }));
>
>   }
>
> ================web.xml=====================
>   <context-param>
>     <param-name>guice-modules</param-name>
>     <param-value>
>       org.apache.shindig.common.PropertiesModule:
>       org.apache.shindig.extras.CustomGuiceModule:
>       org.apache.shindig.social.core.config.SocialApiGuiceModule:
>       org.apache.shindig.social.sample.SampleModule:
>       org.apache.shindig.gadgets.oauth.OAuthModule:
>       org.apache.shindig.common.cache.ehcache.EhCacheModule:
>       org.apache.shindig.sample.shiro.ShiroGuiceModule:
>       org.apache.shindig.sample.container.SampleContainerGuiceModule:
>       org.apache.shindig.extras.ShindigExtrasGuiceModule:
>       org.apache.shindig.extras.as.ActivityStreamsGuiceModule
>     </param-value>
>   </context-param>
>
> ==================================
> From the exception, it says 2 binding are already configured in
> DefaultGuiceModule, then they should not be configured again in other
> modules, but these 2 binding are multibinding. I am curious why this would
> happen.
>
> If this kind of override module way works, it does be helpful for my case,
> since I even do not need to change any code of existing Shindig code(any
> modules).   Thanks.
>
>
> Thanks,
>
> Kevin Zhang (凯峰)
> Gtalk:   kf.zhang@gmail.com
> Blog:    http://www.zhangkf.com
> Twitter: http://twitter.com/zhangkf
>
>
> On Mon, Nov 1, 2010 at 12:31 AM, Gagandeep Singh <ga...@gmail.com>wrote:
>
>> Hi Kai
>>
>>
>> On Sun, Oct 31, 2010 at 5:38 PM, Kai Feng Zhang <kf...@gmail.com>wrote:
>>
>>> Hey Gagandeep,
>>>
>>> Thank you, it seems your solution is cool thing with more flexibility.
>>>
>>> What I am asking is to *append* a rewriter to current rewriters list from
>>> DefaultGuiceModule, b/c I think the existing rewriters are good enough for
>>> my case. And as I know, DefaultGuiceModule does a lot of things (installing
>>> different modules etc), but not only install RewriterModule for binding
>>> rewiters.
>>>
>>
>> Your module (say MyGuiceModule) would look like:
>> class MyGuiceModule extends AbstractModule {
>>   public void configure() {
>>     install(Modules.override(new DefaultGuiceModule()).with(new
>> MySpecialModule()));
>>   }
>> }
>>
>> This will provide everything that DefaultGuiceModule already does. In
>> addition, it will provide the bindings you specifically provided in
>> MySpecialModule and override these when they conflict with ones provided
>> by DefaultGuiceModule.
>> Take a look at Modules.override<http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/util/Modules.html#override(com.google.inject.Module...)>documentation.
>>
>>  As far as appending a rewriter to existing list is concerned, can't help
>> you much there.
>> This sample code:
>>     class T {
>>       public final String name;
>>       public T(String name) {
>>         this.name = name;
>>       }
>>     }
>>
>>     class A extends AbstractModule {
>>       @Override
>>       protected void configure() {
>>         bind(T.class).annotatedWith(Names.named("hello")).toInstance(new
>> T("hello"));
>>       }
>>     }
>>     class B extends AbstractModule {
>>       @Override
>>       protected void configure() {
>>       }
>>
>>       @Provides @Named("hello") @Inject
>>       public T provideBuffalo(@Named("hello") T helloT) {
>>         return new T("buffalo");
>>       }
>>     }
>>
>>     Injector injector = Guice.createInjector(Modules.override(new
>> A()).with(new B()));
>>     T h = injector.getInstance(Key.get(T.class, Names.named("hello")));
>>     assertEquals("buffalo", h.name);
>>
>> throws StackOverflowException, because guice is trying to access the same
>> @Named("hello")that its trying to provide.
>> So you'l have to enumerate the rewriters you need to append your rewriter
>> to again in your module.
>>
>>
>>> So I think replace DefaultGuiceModule with custom module class in web.xml
>>> maybe not enough, you still need to do other same work as DefaultGuiceModule
>>> in your module.Please note that RewriterModule installed in
>>> DefaultGuiceModule is not configured in web.xml.
>>>
>>> Any comments? Thanks a lot.
>>>
>>> Thanks,
>>>
>>> Kevin Zhang (凯峰)
>>> Gtalk:   kf.zhang@gmail.com
>>> Blog:    http://www.zhangkf.com
>>> Twitter: http://twitter.com/zhangkf
>>>
>>>
>>> On Sat, Oct 30, 2010 at 10:28 AM, Gagandeep singh <ga...@gmail.com>wrote:
>>>
>>>> Hi Kai, Paul
>>>>
>>>> You are both right :) The order of rewriters matters.
>>>>
>>>> I have a patch<
>>>> http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
>>>> >
>>>>
>>>> (which
>>>> JohnH has been reviewing and providing ideas for) which does something
>>>> similar. The idea is, we create a map binder from container + flow id ->
>>>> *
>>>> provider* of list of rewriters.
>>>> And we provide the list of rewriters similarly to how we providing
>>>> currently. Since we add provider of rewriter list, we can provide a
>>>> different list without having to add it to the map binder separately
>>>> (map
>>>> binder will cry if you add same key twice).
>>>> Any new binding can be added to map binder in the custom module.
>>>>
>>>> The way ppl can override this is, in your new module, you again provide
>>>> a
>>>> new list of rewriters. And then you override the DefaultGuiceModule with
>>>> your module.
>>>>
>>>> Say you were providing a default list of GadgetRewriters in
>>>> DefaultGuiceModule:
>>>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1)
>>>> {
>>>> }
>>>>
>>>> and you want to change this list of provide Rewriter2 as well. You
>>>> create
>>>> your module called MyModule and provide:
>>>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1,
>>>> Rewriter2 r2) {
>>>> }
>>>>
>>>> And then early on in the code, you override default guice module with
>>>> your
>>>> module:
>>>> Modules.override(new GuiceModule()).with(new MyModule());
>>>>
>>>> I think your facing the problem because maybe web.xml does not allow you
>>>> to
>>>> override a module with a new one. And when 2 modules provide same
>>>> binding,
>>>> guice dies.
>>>> A quick solution for your case would be to change web.xml to provide
>>>> your
>>>> module in place of DefaultGuiceModule, and change your module to
>>>> install DefaultGuiceModule after overriding it with your rewriter list.
>>>> Something like:
>>>>
>>>> web.xml:
>>>>  <context-param>
>>>>    <param-name>guice-modules</param-name>
>>>>    <param-value>
>>>>      org.apache.shindig.common.PropertiesModule:
>>>>      org.apache.shindig.gadgets.*MyGuiceModule*:
>>>>      org.apache.shindig.social.core.config.SocialApiGuiceModule:
>>>> ......
>>>>
>>>> MyGuiceModule.java:
>>>> protected void configure() {
>>>>  Modules.override(new DefaultGuiceModule()).with(new AbstractModule() {
>>>>    protected void configure() {
>>>>    }
>>>>    @Provides @Named("gadget.rewriters") List<GadgetRewriter>
>>>>     ....
>>>>  }
>>>> }
>>>>
>>>> I hope im making sense.
>>>>
>>>> On Fri, Oct 29, 2010 at 5:52 PM, Paul Lindner <li...@inuus.com>
>>>> wrote:
>>>>
>>>> > I think this is a good idea, however I'm concerned that the ordering
>>>> of
>>>> > Rewriters may be important.
>>>> >
>>>> > I'm guessing that we could make a SortedSet if we had a Comparable<>
>>>> > implementation of all rewriters.
>>>> >
>>>> > On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <kf...@gmail.com>
>>>> > wrote:
>>>> >
>>>> > > I found a possible solution to extend Shindig rewriter capability,
>>>> using
>>>> > > multibinding in Guice.
>>>> > >
>>>> > > Please see:
>>>> > >
>>>> > >
>>>> >
>>>> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
>>>> > >
>>>> > > I created a jira for this, see
>>>> > > https://issues.apache.org/jira/browse/SHINDIG-1456
>>>> > >
>>>> > >
>>>> > >
>>>> > > On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <kf.zhang@gmail.com
>>>> >
>>>> > > wrote:
>>>> > >
>>>> > > > Hi,
>>>> > > >
>>>> > > > I'd like to add a custom rewriter into Shindig, with requirement
>>>> of no
>>>> > > need
>>>> > > > to change Shindig rendering gadget server side code directly. I
>>>> want to
>>>> > > add
>>>> > > > it as a new feature in extras, so when this feature is required by
>>>> > > gadget,
>>>> > > > the custom rewriter will do some special work when rendering
>>>> gadget at
>>>> > > > server side.
>>>> > > >
>>>> > > > But I checked Shindig code, RewriteModule @Provides all predefined
>>>> > > > rewriters with @Named("shindig.rewriters.gadget") , and
>>>> > > > then GadgetRewritersProvider will provide all rewriters as per the
>>>> same
>>>> > > > @Name when rendering gadget.
>>>> > > >
>>>> > > > If I create a new Module in shindig extras, and @Provides custom
>>>> > rewriter
>>>> > > > with same @Name, and startup server, there will be error saying
>>>> the
>>>> > same
>>>> > > > @Name is configured already by RewriteModule.
>>>> > > >
>>>> > > > Can anyone please help if there is some way to append such a
>>>> rewriter
>>>> > > > without touching any existing Shindig gadget rendering code? Or
>>>> that is
>>>> > > the
>>>> > > > only way to extend a new rewriter for gadget rendering?
>>>> > > >
>>>> > > > Thanks a lot!
>>>> > > >
>>>> > >
>>>> >
>>>> >
>>>> >
>>>> > --
>>>> > Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
>>>> >
>>>>
>>>
>>>
>>
>

Re: How to append custom rewriter for Shindig?

Posted by Kai Feng Zhang <kf...@gmail.com>.
Hi Gagandeep,

Thank you for the detailed sample code.

I tried with your module override code, but seems it does not work, there
are binding exception if I replace the DefaultGuiceModule with my new
CustomGuiceModule in web.xml.

============ Exception stack =================
2010-11-1 11:19:53 org.apache.catalina.core.StandardContext listenerStart
com.google.inject.CreationException: Guice creation errors:

1) A binding to java.util.Set<java.lang.String> annotated with
@com.google.inject.name.Named(value=org.apache.shindig.features-extended)
was already configured at
org.apache.shindig.gadgets.DefaultGuiceModule.registerFeatureHandlers(DefaultGuiceModule.java:124).
  at
org.apache.shindig.extras.ShindigExtrasGuiceModule.configureExtraFeatures(ShindigExtrasGuiceModule.java:41)

2) A binding to java.util.Set<java.lang.Object> annotated with
@com.google.inject.name.Named(value=org.apache.shindig.handlers) was already
configured at
org.apache.shindig.gadgets.DefaultGuiceModule.registerGadgetHandlers(DefaultGuiceModule.java:105).
  at
org.apache.shindig.social.core.config.SocialApiGuiceModule.configure(SocialApiGuiceModule.java:76)

2 errors
at
com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:354)
 at
com.google.inject.InjectorBuilder.initializeStatically(InjectorBuilder.java:152)
at com.google.inject.InjectorBuilder.build(InjectorBuilder.java:105)
 at com.google.inject.Guice.createInjector(Guice.java:92)
at
org.apache.shindig.common.servlet.GuiceServletContextListener.contextInitialized(GuiceServletContextListener.java:73)
 at
org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3972)
at org.apache.catalina.core.StandardContext.start(StandardContext.java:4467)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardHost.start(StandardHost.java:785)
 at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
 at org.apache.catalina.core.StandardService.start(StandardService.java:519)
at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
 at org.apache.catalina.startup.Catalina.start(Catalina.java:581)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:592)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:289)
 at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:414)
2010-11-1 11:19:53 org.apache.catalina.core.StandardContext start

==================CustomGuiceModule=======================

protected void configure() {
    install(Modules.override(new DefaultGuiceModule()).with(new
AbstractModule() {

      @Override
      protected void configure() {
        // TODO Auto-generated method stub
      }

      @Provides
      @Singleton
      @Named("shindig.rewriters.gadget")
      protected List<GadgetRewriter> provideGadgetRewriters(
          PipelineDataGadgetRewriter pipelineRewriter,
          TemplateRewriter templateRewriter,
          AbsolutePathReferenceRewriter absolutePathRewriter,
          StyleTagExtractorContentRewriter styleTagExtractorRewriter,
          StyleAdjacencyContentRewriter styleAdjacencyRewriter,
          ProxyingContentRewriter proxyingRewriter,
          CajaContentRewriter cajaRewriter,
          SanitizingGadgetRewriter sanitizedRewriter,
          RenderingGadgetRewriter renderingRewriter,
          OpenSocialI18NGadgetRewriter i18nRewriter,
          CustomGadgetRewriter customGadgetRewriter) {
        return ImmutableList.of(pipelineRewriter, templateRewriter,
            absolutePathRewriter, styleTagExtractorRewriter,
styleAdjacencyRewriter, proxyingRewriter,
            cajaRewriter, sanitizedRewriter, renderingRewriter,
i18nRewriter, customGadgetRewriter);
      }

    }));

  }

================web.xml=====================
  <context-param>
    <param-name>guice-modules</param-name>
    <param-value>
      org.apache.shindig.common.PropertiesModule:
      org.apache.shindig.extras.CustomGuiceModule:
      org.apache.shindig.social.core.config.SocialApiGuiceModule:
      org.apache.shindig.social.sample.SampleModule:
      org.apache.shindig.gadgets.oauth.OAuthModule:
      org.apache.shindig.common.cache.ehcache.EhCacheModule:
      org.apache.shindig.sample.shiro.ShiroGuiceModule:
      org.apache.shindig.sample.container.SampleContainerGuiceModule:
      org.apache.shindig.extras.ShindigExtrasGuiceModule:
      org.apache.shindig.extras.as.ActivityStreamsGuiceModule
    </param-value>
  </context-param>

==================================
>From the exception, it says 2 binding are already configured in
DefaultGuiceModule, then they should not be configured again in other
modules, but these 2 binding are multibinding. I am curious why this would
happen.

If this kind of override module way works, it does be helpful for my case,
since I even do not need to change any code of existing Shindig code(any
modules).   Thanks.


Thanks,

Kevin Zhang (凯峰)
Gtalk:   kf.zhang@gmail.com
Blog:    http://www.zhangkf.com
Twitter: http://twitter.com/zhangkf


On Mon, Nov 1, 2010 at 12:31 AM, Gagandeep Singh <ga...@gmail.com>wrote:

> Hi Kai
>
>
> On Sun, Oct 31, 2010 at 5:38 PM, Kai Feng Zhang <kf...@gmail.com>wrote:
>
>> Hey Gagandeep,
>>
>> Thank you, it seems your solution is cool thing with more flexibility.
>>
>> What I am asking is to *append* a rewriter to current rewriters list from
>> DefaultGuiceModule, b/c I think the existing rewriters are good enough for
>> my case. And as I know, DefaultGuiceModule does a lot of things (installing
>> different modules etc), but not only install RewriterModule for binding
>> rewiters.
>>
>
> Your module (say MyGuiceModule) would look like:
> class MyGuiceModule extends AbstractModule {
>   public void configure() {
>     install(Modules.override(new DefaultGuiceModule()).with(new
> MySpecialModule()));
>   }
> }
>
> This will provide everything that DefaultGuiceModule already does. In
> addition, it will provide the bindings you specifically provided in
> MySpecialModule and override these when they conflict with ones provided
> by DefaultGuiceModule.
> Take a look at Modules.override<http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/util/Modules.html#override(com.google.inject.Module...)>documentation.
>
>  As far as appending a rewriter to existing list is concerned, can't help
> you much there.
> This sample code:
>     class T {
>       public final String name;
>       public T(String name) {
>         this.name = name;
>       }
>     }
>
>     class A extends AbstractModule {
>       @Override
>       protected void configure() {
>         bind(T.class).annotatedWith(Names.named("hello")).toInstance(new
> T("hello"));
>       }
>     }
>     class B extends AbstractModule {
>       @Override
>       protected void configure() {
>       }
>
>       @Provides @Named("hello") @Inject
>       public T provideBuffalo(@Named("hello") T helloT) {
>         return new T("buffalo");
>       }
>     }
>
>     Injector injector = Guice.createInjector(Modules.override(new
> A()).with(new B()));
>     T h = injector.getInstance(Key.get(T.class, Names.named("hello")));
>     assertEquals("buffalo", h.name);
>
> throws StackOverflowException, because guice is trying to access the same
> @Named("hello")that its trying to provide.
> So you'l have to enumerate the rewriters you need to append your rewriter
> to again in your module.
>
>
>> So I think replace DefaultGuiceModule with custom module class in web.xml
>> maybe not enough, you still need to do other same work as DefaultGuiceModule
>> in your module.Please note that RewriterModule installed in
>> DefaultGuiceModule is not configured in web.xml.
>>
>> Any comments? Thanks a lot.
>>
>> Thanks,
>>
>> Kevin Zhang (凯峰)
>> Gtalk:   kf.zhang@gmail.com
>> Blog:    http://www.zhangkf.com
>> Twitter: http://twitter.com/zhangkf
>>
>>
>> On Sat, Oct 30, 2010 at 10:28 AM, Gagandeep singh <ga...@gmail.com>wrote:
>>
>>> Hi Kai, Paul
>>>
>>> You are both right :) The order of rewriters matters.
>>>
>>> I have a patch<
>>> http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
>>> >
>>>
>>> (which
>>> JohnH has been reviewing and providing ideas for) which does something
>>> similar. The idea is, we create a map binder from container + flow id ->
>>> *
>>> provider* of list of rewriters.
>>> And we provide the list of rewriters similarly to how we providing
>>> currently. Since we add provider of rewriter list, we can provide a
>>> different list without having to add it to the map binder separately (map
>>> binder will cry if you add same key twice).
>>> Any new binding can be added to map binder in the custom module.
>>>
>>> The way ppl can override this is, in your new module, you again provide a
>>> new list of rewriters. And then you override the DefaultGuiceModule with
>>> your module.
>>>
>>> Say you were providing a default list of GadgetRewriters in
>>> DefaultGuiceModule:
>>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1)
>>> {
>>> }
>>>
>>> and you want to change this list of provide Rewriter2 as well. You create
>>> your module called MyModule and provide:
>>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1,
>>> Rewriter2 r2) {
>>> }
>>>
>>> And then early on in the code, you override default guice module with
>>> your
>>> module:
>>> Modules.override(new GuiceModule()).with(new MyModule());
>>>
>>> I think your facing the problem because maybe web.xml does not allow you
>>> to
>>> override a module with a new one. And when 2 modules provide same
>>> binding,
>>> guice dies.
>>> A quick solution for your case would be to change web.xml to provide your
>>> module in place of DefaultGuiceModule, and change your module to
>>> install DefaultGuiceModule after overriding it with your rewriter list.
>>> Something like:
>>>
>>> web.xml:
>>>  <context-param>
>>>    <param-name>guice-modules</param-name>
>>>    <param-value>
>>>      org.apache.shindig.common.PropertiesModule:
>>>      org.apache.shindig.gadgets.*MyGuiceModule*:
>>>      org.apache.shindig.social.core.config.SocialApiGuiceModule:
>>> ......
>>>
>>> MyGuiceModule.java:
>>> protected void configure() {
>>>  Modules.override(new DefaultGuiceModule()).with(new AbstractModule() {
>>>    protected void configure() {
>>>    }
>>>    @Provides @Named("gadget.rewriters") List<GadgetRewriter>
>>>     ....
>>>  }
>>> }
>>>
>>> I hope im making sense.
>>>
>>> On Fri, Oct 29, 2010 at 5:52 PM, Paul Lindner <li...@inuus.com> wrote:
>>>
>>> > I think this is a good idea, however I'm concerned that the ordering of
>>> > Rewriters may be important.
>>> >
>>> > I'm guessing that we could make a SortedSet if we had a Comparable<>
>>> > implementation of all rewriters.
>>> >
>>> > On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <kf...@gmail.com>
>>> > wrote:
>>> >
>>> > > I found a possible solution to extend Shindig rewriter capability,
>>> using
>>> > > multibinding in Guice.
>>> > >
>>> > > Please see:
>>> > >
>>> > >
>>> >
>>> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
>>> > >
>>> > > I created a jira for this, see
>>> > > https://issues.apache.org/jira/browse/SHINDIG-1456
>>> > >
>>> > >
>>> > >
>>> > > On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <kf...@gmail.com>
>>> > > wrote:
>>> > >
>>> > > > Hi,
>>> > > >
>>> > > > I'd like to add a custom rewriter into Shindig, with requirement of
>>> no
>>> > > need
>>> > > > to change Shindig rendering gadget server side code directly. I
>>> want to
>>> > > add
>>> > > > it as a new feature in extras, so when this feature is required by
>>> > > gadget,
>>> > > > the custom rewriter will do some special work when rendering gadget
>>> at
>>> > > > server side.
>>> > > >
>>> > > > But I checked Shindig code, RewriteModule @Provides all predefined
>>> > > > rewriters with @Named("shindig.rewriters.gadget") , and
>>> > > > then GadgetRewritersProvider will provide all rewriters as per the
>>> same
>>> > > > @Name when rendering gadget.
>>> > > >
>>> > > > If I create a new Module in shindig extras, and @Provides custom
>>> > rewriter
>>> > > > with same @Name, and startup server, there will be error saying the
>>> > same
>>> > > > @Name is configured already by RewriteModule.
>>> > > >
>>> > > > Can anyone please help if there is some way to append such a
>>> rewriter
>>> > > > without touching any existing Shindig gadget rendering code? Or
>>> that is
>>> > > the
>>> > > > only way to extend a new rewriter for gadget rendering?
>>> > > >
>>> > > > Thanks a lot!
>>> > > >
>>> > >
>>> >
>>> >
>>> >
>>> > --
>>> > Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
>>> >
>>>
>>
>>
>

Re: How to append custom rewriter for Shindig?

Posted by Gagandeep Singh <ga...@gmail.com>.
Hi Kai


On Sun, Oct 31, 2010 at 5:38 PM, Kai Feng Zhang <kf...@gmail.com> wrote:

> Hey Gagandeep,
>
> Thank you, it seems your solution is cool thing with more flexibility.
>
> What I am asking is to *append* a rewriter to current rewriters list from
> DefaultGuiceModule, b/c I think the existing rewriters are good enough for
> my case. And as I know, DefaultGuiceModule does a lot of things (installing
> different modules etc), but not only install RewriterModule for binding
> rewiters.
>

Your module (say MyGuiceModule) would look like:
class MyGuiceModule extends AbstractModule {
  public void configure() {
    install(Modules.override(new DefaultGuiceModule()).with(new
MySpecialModule()));
  }
}

This will provide everything that DefaultGuiceModule already does. In
addition, it will provide the bindings you specifically provided in
MySpecialModule and override these when they conflict with ones provided
by DefaultGuiceModule.
Take a look at Modules.override<http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/util/Modules.html#override(com.google.inject.Module...)>documentation.

As far as appending a rewriter to existing list is concerned, can't help you
much there.
This sample code:
    class T {
      public final String name;
      public T(String name) {
        this.name = name;
      }
    }

    class A extends AbstractModule {
      @Override
      protected void configure() {
        bind(T.class).annotatedWith(Names.named("hello")).toInstance(new
T("hello"));
      }
    }
    class B extends AbstractModule {
      @Override
      protected void configure() {
      }

      @Provides @Named("hello") @Inject
      public T provideBuffalo(@Named("hello") T helloT) {
        return new T("buffalo");
      }
    }

    Injector injector = Guice.createInjector(Modules.override(new
A()).with(new B()));
    T h = injector.getInstance(Key.get(T.class, Names.named("hello")));
    assertEquals("buffalo", h.name);

throws StackOverflowException, because guice is trying to access the same
@Named("hello")that its trying to provide.
So you'l have to enumerate the rewriters you need to append your rewriter to
again in your module.


> So I think replace DefaultGuiceModule with custom module class in web.xml
> maybe not enough, you still need to do other same work as DefaultGuiceModule
> in your module.Please note that RewriterModule installed in
> DefaultGuiceModule is not configured in web.xml.
>
> Any comments? Thanks a lot.
>
> Thanks,
>
> Kevin Zhang (凯峰)
> Gtalk:   kf.zhang@gmail.com
> Blog:    http://www.zhangkf.com
> Twitter: http://twitter.com/zhangkf
>
>
> On Sat, Oct 30, 2010 at 10:28 AM, Gagandeep singh <ga...@gmail.com>wrote:
>
>> Hi Kai, Paul
>>
>> You are both right :) The order of rewriters matters.
>>
>> I have a patch<
>> http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
>> >
>>
>> (which
>> JohnH has been reviewing and providing ideas for) which does something
>> similar. The idea is, we create a map binder from container + flow id -> *
>> provider* of list of rewriters.
>> And we provide the list of rewriters similarly to how we providing
>> currently. Since we add provider of rewriter list, we can provide a
>> different list without having to add it to the map binder separately (map
>> binder will cry if you add same key twice).
>> Any new binding can be added to map binder in the custom module.
>>
>> The way ppl can override this is, in your new module, you again provide a
>> new list of rewriters. And then you override the DefaultGuiceModule with
>> your module.
>>
>> Say you were providing a default list of GadgetRewriters in
>> DefaultGuiceModule:
>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1) {
>> }
>>
>> and you want to change this list of provide Rewriter2 as well. You create
>> your module called MyModule and provide:
>> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1,
>> Rewriter2 r2) {
>> }
>>
>> And then early on in the code, you override default guice module with your
>> module:
>> Modules.override(new GuiceModule()).with(new MyModule());
>>
>> I think your facing the problem because maybe web.xml does not allow you
>> to
>> override a module with a new one. And when 2 modules provide same binding,
>> guice dies.
>> A quick solution for your case would be to change web.xml to provide your
>> module in place of DefaultGuiceModule, and change your module to
>> install DefaultGuiceModule after overriding it with your rewriter list.
>> Something like:
>>
>> web.xml:
>>  <context-param>
>>    <param-name>guice-modules</param-name>
>>    <param-value>
>>      org.apache.shindig.common.PropertiesModule:
>>      org.apache.shindig.gadgets.*MyGuiceModule*:
>>      org.apache.shindig.social.core.config.SocialApiGuiceModule:
>> ......
>>
>> MyGuiceModule.java:
>> protected void configure() {
>>  Modules.override(new DefaultGuiceModule()).with(new AbstractModule() {
>>    protected void configure() {
>>    }
>>    @Provides @Named("gadget.rewriters") List<GadgetRewriter>
>>     ....
>>  }
>> }
>>
>> I hope im making sense.
>>
>> On Fri, Oct 29, 2010 at 5:52 PM, Paul Lindner <li...@inuus.com> wrote:
>>
>> > I think this is a good idea, however I'm concerned that the ordering of
>> > Rewriters may be important.
>> >
>> > I'm guessing that we could make a SortedSet if we had a Comparable<>
>> > implementation of all rewriters.
>> >
>> > On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <kf...@gmail.com>
>> > wrote:
>> >
>> > > I found a possible solution to extend Shindig rewriter capability,
>> using
>> > > multibinding in Guice.
>> > >
>> > > Please see:
>> > >
>> > >
>> >
>> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
>> > >
>> > > I created a jira for this, see
>> > > https://issues.apache.org/jira/browse/SHINDIG-1456
>> > >
>> > >
>> > >
>> > > On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <kf...@gmail.com>
>> > > wrote:
>> > >
>> > > > Hi,
>> > > >
>> > > > I'd like to add a custom rewriter into Shindig, with requirement of
>> no
>> > > need
>> > > > to change Shindig rendering gadget server side code directly. I want
>> to
>> > > add
>> > > > it as a new feature in extras, so when this feature is required by
>> > > gadget,
>> > > > the custom rewriter will do some special work when rendering gadget
>> at
>> > > > server side.
>> > > >
>> > > > But I checked Shindig code, RewriteModule @Provides all predefined
>> > > > rewriters with @Named("shindig.rewriters.gadget") , and
>> > > > then GadgetRewritersProvider will provide all rewriters as per the
>> same
>> > > > @Name when rendering gadget.
>> > > >
>> > > > If I create a new Module in shindig extras, and @Provides custom
>> > rewriter
>> > > > with same @Name, and startup server, there will be error saying the
>> > same
>> > > > @Name is configured already by RewriteModule.
>> > > >
>> > > > Can anyone please help if there is some way to append such a
>> rewriter
>> > > > without touching any existing Shindig gadget rendering code? Or that
>> is
>> > > the
>> > > > only way to extend a new rewriter for gadget rendering?
>> > > >
>> > > > Thanks a lot!
>> > > >
>> > >
>> >
>> >
>> >
>> > --
>> > Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
>> >
>>
>
>

Re: How to append custom rewriter for Shindig?

Posted by Kai Feng Zhang <kf...@gmail.com>.
Hey Gagandeep,

Thank you, it seems your solution is cool thing with more flexibility.

What I am asking is to *append* a rewriter to current rewriters list from
DefaultGuiceModule, b/c I think the existing rewriters are good enough for
my case. And as I know, DefaultGuiceModule does a lot of things (installing
different modules etc), but not only install RewriterModule for binding
rewiters.

So I think replace DefaultGuiceModule with custom module class in web.xml
maybe not enough, you still need to do other same work as DefaultGuiceModule
in your module.Please note that RewriterModule installed in
DefaultGuiceModule is not configured in web.xml.

Any comments? Thanks a lot.

Thanks,

Kevin Zhang (凯峰)
Gtalk:   kf.zhang@gmail.com
Blog:    http://www.zhangkf.com
Twitter: http://twitter.com/zhangkf


On Sat, Oct 30, 2010 at 10:28 AM, Gagandeep singh <ga...@gmail.com>wrote:

> Hi Kai, Paul
>
> You are both right :) The order of rewriters matters.
>
> I have a patch<
> http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java
> >
> (which
> JohnH has been reviewing and providing ideas for) which does something
> similar. The idea is, we create a map binder from container + flow id -> *
> provider* of list of rewriters.
> And we provide the list of rewriters similarly to how we providing
> currently. Since we add provider of rewriter list, we can provide a
> different list without having to add it to the map binder separately (map
> binder will cry if you add same key twice).
> Any new binding can be added to map binder in the custom module.
>
> The way ppl can override this is, in your new module, you again provide a
> new list of rewriters. And then you override the DefaultGuiceModule with
> your module.
>
> Say you were providing a default list of GadgetRewriters in
> DefaultGuiceModule:
> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1) {
> }
>
> and you want to change this list of provide Rewriter2 as well. You create
> your module called MyModule and provide:
> @Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1,
> Rewriter2 r2) {
> }
>
> And then early on in the code, you override default guice module with your
> module:
> Modules.override(new GuiceModule()).with(new MyModule());
>
> I think your facing the problem because maybe web.xml does not allow you to
> override a module with a new one. And when 2 modules provide same binding,
> guice dies.
> A quick solution for your case would be to change web.xml to provide your
> module in place of DefaultGuiceModule, and change your module to
> install DefaultGuiceModule after overriding it with your rewriter list.
> Something like:
>
> web.xml:
>  <context-param>
>    <param-name>guice-modules</param-name>
>    <param-value>
>      org.apache.shindig.common.PropertiesModule:
>      org.apache.shindig.gadgets.*MyGuiceModule*:
>      org.apache.shindig.social.core.config.SocialApiGuiceModule:
> ......
>
> MyGuiceModule.java:
> protected void configure() {
>  Modules.override(new DefaultGuiceModule()).with(new AbstractModule() {
>    protected void configure() {
>    }
>    @Provides @Named("gadget.rewriters") List<GadgetRewriter>
>     ....
>  }
> }
>
> I hope im making sense.
>
> On Fri, Oct 29, 2010 at 5:52 PM, Paul Lindner <li...@inuus.com> wrote:
>
> > I think this is a good idea, however I'm concerned that the ordering of
> > Rewriters may be important.
> >
> > I'm guessing that we could make a SortedSet if we had a Comparable<>
> > implementation of all rewriters.
> >
> > On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <kf...@gmail.com>
> > wrote:
> >
> > > I found a possible solution to extend Shindig rewriter capability,
> using
> > > multibinding in Guice.
> > >
> > > Please see:
> > >
> > >
> >
> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
> > >
> > > I created a jira for this, see
> > > https://issues.apache.org/jira/browse/SHINDIG-1456
> > >
> > >
> > >
> > > On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <kf...@gmail.com>
> > > wrote:
> > >
> > > > Hi,
> > > >
> > > > I'd like to add a custom rewriter into Shindig, with requirement of
> no
> > > need
> > > > to change Shindig rendering gadget server side code directly. I want
> to
> > > add
> > > > it as a new feature in extras, so when this feature is required by
> > > gadget,
> > > > the custom rewriter will do some special work when rendering gadget
> at
> > > > server side.
> > > >
> > > > But I checked Shindig code, RewriteModule @Provides all predefined
> > > > rewriters with @Named("shindig.rewriters.gadget") , and
> > > > then GadgetRewritersProvider will provide all rewriters as per the
> same
> > > > @Name when rendering gadget.
> > > >
> > > > If I create a new Module in shindig extras, and @Provides custom
> > rewriter
> > > > with same @Name, and startup server, there will be error saying the
> > same
> > > > @Name is configured already by RewriteModule.
> > > >
> > > > Can anyone please help if there is some way to append such a rewriter
> > > > without touching any existing Shindig gadget rendering code? Or that
> is
> > > the
> > > > only way to extend a new rewriter for gadget rendering?
> > > >
> > > > Thanks a lot!
> > > >
> > >
> >
> >
> >
> > --
> > Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
> >
>

Re: How to append custom rewriter for Shindig?

Posted by Gagandeep singh <ga...@gmail.com>.
Hi Kai, Paul

You are both right :) The order of rewriters matters.

I have a patch<http://codereview.appspot.com/2058042/diff/123001/java/gadgets/src/main/java/org/apache/shindig/gadgets/rewrite/RewriteModule.java>
(which
JohnH has been reviewing and providing ideas for) which does something
similar. The idea is, we create a map binder from container + flow id -> *
provider* of list of rewriters.
And we provide the list of rewriters similarly to how we providing
currently. Since we add provider of rewriter list, we can provide a
different list without having to add it to the map binder separately (map
binder will cry if you add same key twice).
Any new binding can be added to map binder in the custom module.

The way ppl can override this is, in your new module, you again provide a
new list of rewriters. And then you override the DefaultGuiceModule with
your module.

Say you were providing a default list of GadgetRewriters in
DefaultGuiceModule:
@Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1) {
}

and you want to change this list of provide Rewriter2 as well. You create
your module called MyModule and provide:
@Named("gadget.rewriters") List<GadgetRewriter> provideDef(Rewriter1 r1,
Rewriter2 r2) {
}

And then early on in the code, you override default guice module with your
module:
Modules.override(new GuiceModule()).with(new MyModule());

I think your facing the problem because maybe web.xml does not allow you to
override a module with a new one. And when 2 modules provide same binding,
guice dies.
A quick solution for your case would be to change web.xml to provide your
module in place of DefaultGuiceModule, and change your module to
install DefaultGuiceModule after overriding it with your rewriter list.
Something like:

web.xml:
  <context-param>
    <param-name>guice-modules</param-name>
    <param-value>
      org.apache.shindig.common.PropertiesModule:
      org.apache.shindig.gadgets.*MyGuiceModule*:
      org.apache.shindig.social.core.config.SocialApiGuiceModule:
......

MyGuiceModule.java:
protected void configure() {
  Modules.override(new DefaultGuiceModule()).with(new AbstractModule() {
    protected void configure() {
    }
    @Provides @Named("gadget.rewriters") List<GadgetRewriter>
     ....
  }
}

I hope im making sense.

On Fri, Oct 29, 2010 at 5:52 PM, Paul Lindner <li...@inuus.com> wrote:

> I think this is a good idea, however I'm concerned that the ordering of
> Rewriters may be important.
>
> I'm guessing that we could make a SortedSet if we had a Comparable<>
> implementation of all rewriters.
>
> On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <kf...@gmail.com>
> wrote:
>
> > I found a possible solution to extend Shindig rewriter capability, using
> > multibinding in Guice.
> >
> > Please see:
> >
> >
> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
> >
> > I created a jira for this, see
> > https://issues.apache.org/jira/browse/SHINDIG-1456
> >
> >
> >
> > On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <kf...@gmail.com>
> > wrote:
> >
> > > Hi,
> > >
> > > I'd like to add a custom rewriter into Shindig, with requirement of no
> > need
> > > to change Shindig rendering gadget server side code directly. I want to
> > add
> > > it as a new feature in extras, so when this feature is required by
> > gadget,
> > > the custom rewriter will do some special work when rendering gadget at
> > > server side.
> > >
> > > But I checked Shindig code, RewriteModule @Provides all predefined
> > > rewriters with @Named("shindig.rewriters.gadget") , and
> > > then GadgetRewritersProvider will provide all rewriters as per the same
> > > @Name when rendering gadget.
> > >
> > > If I create a new Module in shindig extras, and @Provides custom
> rewriter
> > > with same @Name, and startup server, there will be error saying the
> same
> > > @Name is configured already by RewriteModule.
> > >
> > > Can anyone please help if there is some way to append such a rewriter
> > > without touching any existing Shindig gadget rendering code? Or that is
> > the
> > > only way to extend a new rewriter for gadget rendering?
> > >
> > > Thanks a lot!
> > >
> >
>
>
>
> --
> Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner
>

Re: How to append custom rewriter for Shindig?

Posted by Paul Lindner <li...@inuus.com>.
I think this is a good idea, however I'm concerned that the ordering of
Rewriters may be important.

I'm guessing that we could make a SortedSet if we had a Comparable<>
implementation of all rewriters.

On Fri, Oct 29, 2010 at 1:23 AM, Kai Feng Zhang <kf...@gmail.com> wrote:

> I found a possible solution to extend Shindig rewriter capability, using
> multibinding in Guice.
>
> Please see:
>
> http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html
>
> I created a jira for this, see
> https://issues.apache.org/jira/browse/SHINDIG-1456
>
>
>
> On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <kf...@gmail.com>
> wrote:
>
> > Hi,
> >
> > I'd like to add a custom rewriter into Shindig, with requirement of no
> need
> > to change Shindig rendering gadget server side code directly. I want to
> add
> > it as a new feature in extras, so when this feature is required by
> gadget,
> > the custom rewriter will do some special work when rendering gadget at
> > server side.
> >
> > But I checked Shindig code, RewriteModule @Provides all predefined
> > rewriters with @Named("shindig.rewriters.gadget") , and
> > then GadgetRewritersProvider will provide all rewriters as per the same
> > @Name when rendering gadget.
> >
> > If I create a new Module in shindig extras, and @Provides custom rewriter
> > with same @Name, and startup server, there will be error saying the same
> > @Name is configured already by RewriteModule.
> >
> > Can anyone please help if there is some way to append such a rewriter
> > without touching any existing Shindig gadget rendering code? Or that is
> the
> > only way to extend a new rewriter for gadget rendering?
> >
> > Thanks a lot!
> >
>



-- 
Paul Lindner -- lindner@inuus.com -- linkedin.com/in/plindner

Re: How to append custom rewriter for Shindig?

Posted by Kai Feng Zhang <kf...@gmail.com>.
I found a possible solution to extend Shindig rewriter capability, using
multibinding in Guice.

Please see:
http://google-guice.googlecode.com/svn/trunk/latest-javadoc/com/google/inject/multibindings/Multibinder.html

I created a jira for this, see
https://issues.apache.org/jira/browse/SHINDIG-1456



On Fri, Oct 29, 2010 at 3:02 PM, Kai Feng Zhang <kf...@gmail.com> wrote:

> Hi,
>
> I'd like to add a custom rewriter into Shindig, with requirement of no need
> to change Shindig rendering gadget server side code directly. I want to add
> it as a new feature in extras, so when this feature is required by gadget,
> the custom rewriter will do some special work when rendering gadget at
> server side.
>
> But I checked Shindig code, RewriteModule @Provides all predefined
> rewriters with @Named("shindig.rewriters.gadget") , and
> then GadgetRewritersProvider will provide all rewriters as per the same
> @Name when rendering gadget.
>
> If I create a new Module in shindig extras, and @Provides custom rewriter
> with same @Name, and startup server, there will be error saying the same
> @Name is configured already by RewriteModule.
>
> Can anyone please help if there is some way to append such a rewriter
> without touching any existing Shindig gadget rendering code? Or that is the
> only way to extend a new rewriter for gadget rendering?
>
> Thanks a lot!
>