I just want to answer some of your concern :D

1- We want to introduce and follow every release of Gwt. We already
introduced Gwt's evenbus instead of using ours and there's more changes on
the way. That's a long term engagement, even our contributor guideline
follows gwt.
2- You don't like the proxy's magic ? You can create them :D Proxy are used
for lasy instantiation of presenters and to facilitate code splitting while
keeping everything decoupled.
3- There's some way to do that with gwtp (PresenterWidget, proxy events).
But there's no reason  to only use Gwtp, even though we encourage it. I
think that activity manager can become handy for cases that we don't fully
support yet.

Cheers,

On Sun, Nov 7, 2010 at 6:49 AM, Nicolas Antoniazzi <
nicolas.antonia...@gmail.com> wrote:

> Hi Phillipe.
> i am going to try "ProviderBundle".
>
> I tried to migrate my application to gwtp just before the 2.1 release but I
> reverted my changes for 3 reasons :
>
> 1 - I prefer to not depend too much on an external framework. I love all
> new things that come in every new release of gwt and I am afraid that
> frameworks become unsupported or do not follow new features. I had the
> exemple of a friend who has prefered to use GXT instead of Pure GWT, and
> today, he cannot use UiBinder or the new Handler mechanism. He is still
> using the old listener way.
> Today, GWT has released the new Activity ~ MVP part, with their own Place
> system. At the moment, MVP of GWT seems less powerfull than the GWTP's one,
> but the syntax is different. And tomorrow, maybe that directions will be
> more different. So I prefer not taking the risk to have a situation like
> with GXT.
>
> 2 - Declaration of Presenter / View looks too much complicated to me (but
> it is a pure subjective vision :) ).
> All the generation of ProxyPlace are too magical for me or not enough... By
> instance, The automatic generation of a Place is something interesting, but
> in the same time, it is too complicated to generate. I do not like the fact
> to have to declare an interface which extends ProxyPlace, and references it
> in a type litteral. I would have prefered to just have something like :
>
> @Place("login");
> @RunAsync
> public class LoginActivity implement GwtpActivity<LoginActivity.Presenter>
>
> public inteface Presenter {
>  public void onLogin();
>  ...
> }
>
> or something similar.
> Today I prefer to stay on a manual code for this part instead of a "half
> generation" that is (in my opinion) too complicated to declare.
> Finally (for the code style part), I did not like the fact that we have to
> use a local Widget variable in View and returns it with a asWidget() method
> for UiBinder Views.
> Today with GWT 2.1, all widgets implements IsWidget and provides a
> asWidget(). But since we have to store a local instance of Widget inside of
> view for UiBinder, it cannot be done automatically, we have to override it.
> However, I understand that IsWidget was not ready when you first
> implemented it. But today, it does not solve the problem of the local Widget
> variable.
>
> 3 - My application has two top div. One called "root" for the main part of
> my application, and one called "overlay" for all elements that comes like a
> filter over my root elements (to display overlay help, ...). They have both
> some css declaration on them.
> I did not find any way to reuse this system with GWTP. GWTP come with a
> RootPresenter and I wanted to use a second RootPresenter plugged on overlay
> div but it is not possible.
> ActivityManager are more flexible for this, they have a setDisplay() method
> to setup the top element to use.
>
> Well, Phillipe, all those things are just my personal feelings for my
> specifical needs. I think that GWTP is a great framework for a lot of
> people.
> Unfortunatly, in my case, I had to fight against it (maybe that it was a
> design problem, but I am not sure), and there was all the more subjective
> aspects (abouts framework overlay and code style) that made me go away.
>
> In any case, Phillipe and Christian, thanks for your great work .
> I am going to try ProviderBundle, maybe that I will be more comfortable
> with it :)
>
> Nicolas.
>
>  2010/11/7 PhilBeaudoin <philippe.beaud...@gmail.com>
>
> Hi Nicolas,
>>
>> If you start using AsyncProvider, you might be interested in GWTP's
>> ProviderBundle at some point. The problem of AsyncProvider is that it
>> may introduce too many split points, and you will often want to do
>> some manual optimization and group a few things together behind the
>> same split point. ProviderBundle makes that really easy to do.
>>
>> ProviderBundle is totally usable without the rest of GWTP. (Although
>> I'd love to hear your reason for not using it. ;))
>>
>> Cheers,
>>
>>   Philippe
>>
>> On Nov 6, 4:40 pm, Nicolas Antoniazzi <nicolas.antonia...@gmail.com>
>> wrote:
>> > Thanks Thomas, I implemented something similar to what you said (I
>> think)
>> > and it works fine ! All my activities are code splitted "automatically"
>> now.
>> >
>> > I used the AsyncProvider<T>.
>> > I used a gin version compiled by gwtp team that include the AsyncProxy
>> > (althouth that I do not use gwtp for severals resons, thanks to gwtp dev
>> for
>> > this :) ) .
>> >
>> > @Ashton, you can get it from here :
>> http://code.google.com/p/gwt-platform/http://code.google.com/p/gwt-platform/downloads/detail?name=gin-r137.jar
>> >
>> > The usage of AsyncProvider<T> is very simple. It's exactly like a normal
>> > Provider<T> instead that you have to give an AsyncCallback to the get()
>> > method.
>> > example :
>> >
>> > @Inject
>> > Provider<MyClass> myProvider;
>> >
>> > @Inject
>> > AsyncProvider<MyClass> myAsyncProvider;
>> >
>> > private MyClass instance1;
>> > private MyClass instance2;
>> >
>> > public void myMethod() {
>> >   // To get an instance without code splitting
>> >   instance1 = myProvider.get();
>> >
>> >   // To get an instance with code splitting
>> >   myAsyncProvider.get(new AsyncCallback<MyClass>() {
>> >  @Override
>> > public void onSuccess(MyClass result) {
>> >      instance2 = result;
>> >   }
>> >  }
>> >  @Override
>> > public void onFailure(Throwable caught) {
>> >  }
>> >   }
>> >
>> > In the previous example, instance1 is instanciated without code
>> splitting,
>> > instance2 with code splitting.
>> > This is just a small example to show you the syntax. This example is
>> very
>> > stupid since if you declare a class with a class Provider<MyClass> in
>> the
>> > same file than an AsyncProvider<MyClass>, MyClass code will not be code
>> > splitted.
>> >
>> > Now, just for people who would like to know how to implement an
>> > ActivityAsyncProxy, my implementation looks like this : (And it might
>> really
>> > not be the best one. Thomas, maybe that you have a better code to share
>> ;) )
>> >
>> > public class ActivityAsyncProxy<T> implements Activity {
>> >
>> >  @Inject
>> > private AsyncProvider<T> provider;
>> >  private boolean canceled = false;
>> > private Activity impl;
>> >
>> > @Override
>> >  public String mayStop() {
>> > if (impl != null) return impl.mayStop();
>> >  return null;
>> >
>> > }
>> >
>> > @Override
>> >  public void onCancel() {
>> > if (impl != null) {
>> >  impl.onCancel();} else {
>> >  canceled = true;
>> > }
>> >
>> >  }
>> >
>> >  @Override
>> > public void onStop() {
>> >  if (impl != null) {
>> > impl.onStop();
>> >  } else {
>> > canceled = true;
>> >  }
>> >
>> > }
>> >
>> > @Override
>> >  public void start(final AcceptsOneWidget panel, final EventBus
>> eventBus) {
>> >  provider.get(new AsyncCallback<T>() {
>> >
>> >  @Override
>> > public void onSuccess(T result) {
>> >  // Do not starts loaded activity if it has been canceled
>> >  if (!canceled) {
>> > impl = (Activity) result;
>> >  impl.start(panel, eventBus);}
>> >
>> >  }
>> >
>> >  @Override
>> > public void onFailure(Throwable caught) {
>> >  // TODO : send error message
>> >
>> > }
>> >  });
>> > }
>> > }
>> >
>> > Now, in my ActivityMapper :
>> >
>> > public class RootActivityMapper implements ActivityMapper {
>> >
>> > @Inject
>> >  Provider<ActivityAsyncProxy<LoginActivity>> loginActivityProvider;
>> >
>> > @Inject
>> >  Provider<ActivityAsyncProxy<ProfileActivity>> profileActivityProvider;
>> >
>> > @Inject
>> >  Provider<ActivityAsyncProxy<PrivacyActivity>> privacyActivityProvider;
>> >
>> > @Override
>> >  public Activity getActivity(Place place) {
>> > if (place instanceof LoginPlace) return loginActivityProvider.get();
>> >  if (place instanceof ProfilePlace) return
>> profileActivityProvider.get();
>> >  if (place instanceof PrivacyPlace) return
>> privacyActivityProvider.get();
>> >
>> > return null;
>> >  }
>> >
>> > }
>> >
>> > And that's all.
>> >
>> > Well, Just for information, I created my custom provider for
>> > ActivityAsyncProxy :
>> >
>> > public class ActivityAsyncProxyProvider<T extends Activity> implements
>> > Provider<ActivityAsyncProxy<T>> {
>> >
>> > @Inject
>> >  Provider<ActivityProxy<T>> provider;
>> >
>> >  @Override
>> > public ActivityAsyncProxy<T> get() {
>> >  return provider.get();
>> >
>> > }
>> > }
>> >
>> > Now, in my ActivityMapper, injection are less verbose :
>> >
>> > @Inject
>> > ActivityAsyncProxyProvider<LoginActivity> loginActivityProvider;
>> >
>> > @Inject
>> > ActivityAsyncProxyProvider<ProfileActivity> profileActivityProvider;
>> >
>> > @Inject
>> > ActivityAsyncProxyProvider<PrivacyActivity> privacyActivityProvider;
>> >
>> > Thanks Thomas, you helped me a lot this week with all your tips ! :)
>> >
>> > Nicolas
>> >
>> > 2010/11/6 Ashton Thomas <attechserv...@gmail.com>
>> >
>> >
>> >
>> >
>> >
>> >
>> >
>> > > Does anyone have some words for implementing the AsyncProvider<T>
>> > > (Still in trunk as Thomas points out)??
>> >
>> > > I have not see any code showing how to implement this so I am a little
>> > > lost on where to start.
>> >
>> > > How do we need to use AsyncProvider and what else needs to be change /
>> > > restructure anything?
>> >
>> > > Is the AsyncProvider even usable right now if we compile from source?
>> >
>> > > On Nov 6, 9:27 am, Thomas Broyer <t.bro...@gmail.com> wrote:
>> > > > On 6 nov, 01:24, Nicolas Antoniazzi <nicolas.antonia...@gmail.com>
>> > > > wrote:
>> >
>> > > > > Hello,
>> >
>> > > > > I am trying to use CodeSplitting with Activites on 2.1.
>> > > > > I read this very interresting threadhttp://
>> > > code.google.com/p/google-web-toolkit/issues/detail?id=5129and
>> > > > > T.Broyer says that the best approach is to use an AsyncProxy for
>> > > Activities.
>> >
>> > > > I certainly didn't say it's the best approach (just that Jarod's
>> code
>> > > > wasn't adding anything to AsyncProxy).
>> >
>> > > > > It makes sense but I have problem with it since my "Activities"
>> are
>> > > binded
>> > > > > with Gin. AsyncProxy uses GWT.create() to instantiate the concrete
>> > > types and
>> > > > > all my @Inject in my Activities are thus not initialized.
>> >
>> > > > That's probably the reason why GIN added AsyncProvider<?>s
>> > > > (unfortunately not released yet)
>> >
>> > > > > Does anyone tried to mix new Activity concepts with "Code
>> Splitting" ?
>> > > And
>> > > > > do you know if it could be compatible with "Gin activities" ?
>> >
>> > > > I started coding the ActivityAsyncProxy I talked about in the issue
>> > > > tracker (i.e. don't even call start() on the activity if it's
>> > > > cancelled before being "downloaded"), but haven't yet tried it. I
>> > > > think (read: I *suppose*) that for it to work with GIN, your
>> concrete
>> > > > implementations would have to use GIN's AsyncProvider, or get the
>> > > > Activity from the Ginjector from within a GWT.runAsync.
>> >
>> > > --
>> > > You received this message because you are subscribed to the Google
>> Groups
>> > > "Google Web Toolkit" group.
>> > > To post to this group, send email to
>> google-web-tool...@googlegroups.com.
>> > > To unsubscribe from this group, send email to
>> > > google-web-toolkit+unsubscr...@googlegroups.com<google-web-toolkit%2bunsubscr...@googlegroups.com><google-web-toolkit%2Bunsubs
>> cr...@googlegroups.com>
>> > > .
>> > > For more options, visit this group at
>> > >http://groups.google.com/group/google-web-toolkit?hl=en.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Google Web Toolkit" group.
>> To post to this group, send email to google-web-tool...@googlegroups.com.
>> To unsubscribe from this group, send email to
>> google-web-toolkit+unsubscr...@googlegroups.com<google-web-toolkit%2bunsubscr...@googlegroups.com>
>> .
>> For more options, visit this group at
>> http://groups.google.com/group/google-web-toolkit?hl=en.
>>
>>
>  --
> You received this message because you are subscribed to the Google Groups
> "Google Web Toolkit" group.
> To post to this group, send email to google-web-tool...@googlegroups.com.
> To unsubscribe from this group, send email to
> google-web-toolkit+unsubscr...@googlegroups.com<google-web-toolkit%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/google-web-toolkit?hl=en.
>



-- 
Christian Goudreau
www.arcbees.com

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To post to this group, send email to google-web-tool...@googlegroups.com.
To unsubscribe from this group, send email to 
google-web-toolkit+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to