Re: History and server call.
Thanks Tristan for your comments. Your comments kicked my thoughts running again :). Let me explain how non readable code/decoupling view from presenter etc can make life easier in terms of designing.(for the Records, i always like Readable code) Currently our view and presenter are dependent on each other, although we use interfaces but still they are tightly bound that view know there is one presenter for him(implementation may be different by injection). I have seen the Contacts project code provided by Google and see presenter(via dispaly) and view(via presenter) call each other directly. Now lets say i am writing a wizard screen or my one click will update 2-3 view/panels in my screen. Ok i will take example where one click will update 2-3 section of whole page which are basically different view and each will have presenter. Say ViewA is header (PresenterA is its presenter) ViewB is left side panel,(PresenterB is its presenter) ViewC is Bottom Panel(PresenterC is its presenter) ViewD is right side Panel(PresenterD is its presenter) Now there is button/Link on ViewA which say clickMe. On clicking this ViewB should load some data from server and ViewC should hide some data, viewD also load some data. Now as per MVP/Contact project style. My ViewA should be injected with PresnterA,PresnterB,PresenterC and PresenterD And onClick event i will call methods of each presenter, which eventually raise the required events and which may create history and then do the server calls. Technically everything is ok(normal java inetrface/class calls tree), but problem occurs when something changes. Say now PresenterB doesnt need to update any thing when we click the same button. At that time you may want to remove PresnterB from ViewA as whole, you dont want to keep such code as it(PresenterB) will never be used in ViewA. Or say some new ViewE came up somewhere and you want to update this via PresenterE, so you need to inject presenterE dependency in ViewA so that ViewA can a make call like PresenterE.doSomethingForMe(). Lots of code changes which could be avoided by just using EventBus. Say OnClick we just raise an event HEY_BUTTON_CLICKED_ON_VIEW_A and presenterB,PresenterC,PresnterD will be interested in this event initially. Once PresenterE will come then PresnterE will be interested in that too.And when PresnterB says i dont need to update, it will just stop listening to that event. But i will never touch ViewA class or any other presenter at all. And also i looked into AppController class in Contacts project and it looks to be controller it self for views and presenter. I should say its not MVP but its MVPC Now with using EventBus for all Communcation i am just assesing the existance of presenter it self(just to make a go call ?). Why do i need presenter at first place. Just to be tight bound with View??. SO that if tommorow my site/application goes for mobile i write seprate presenter which will be bind to seprate view as per Mobile screen. Why not i just write seprate view and use EventBus. Basically with in Client(between UI events/activities and server calls at client side), i am trying to have RPC calls kind of style. UI request client side code with an event and get response with another event. I feel its just MVE (Model View Event), no controller and no presenter. Does it make sense? Ravi. -- 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.
Re: History and server call.
On 16 juin, 15:31, Tristan tristan.slomin...@gmail.com wrote: sounds like you're reinventing the place service, with event bus, with local cache rpc service, but doing it in a new, innovative, complex and if the code grows on you perhaps unintelligible way. if you're the only one who will support this ever, that may work. otherwise i would seriously look into a bunch of mvp-like frameworks out there and look at how place services/managers, local caches, and event buses are implemented. you don't need to use the framework, but the concepts are very helpful to organize the code. they're straightforward and most people understand the design. Sure Ravi is reinventing the place service here. Sure he should move its cache to a local cache rpc service. But the main issue with his code is that he has a synchronous method which has to do something asynchronous. Now, most place services MVP implementations I've seen don't use the switch view only when ready pattern. The activities coming into GWT 2.1 do that however. -- 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.
Re: History and server call.
Hi Thomas, I checked this URL http://code.google.com/webtoolkit/doc/latest/ReleaseNotes.html, for GWT 2.1 but didnt find much information about Activities. Is it explained somewhere else. Can you share such info/link so i can look into it dont reinvent everything. I am about to start implementing switch view only when ready pattern but if its present in 2.1 then i would love to use it instead of writing my own. Thanks, Ravi. On Jun 17, 10:59 am, Thomas Broyer t.bro...@gmail.com wrote: On 16 juin, 15:31, Tristan tristan.slomin...@gmail.com wrote: sounds like you're reinventing the place service, with event bus, with local cache rpc service, but doing it in a new, innovative, complex and if the code grows on you perhaps unintelligible way. if you're the only one who will support this ever, that may work. otherwise i would seriously look into a bunch of mvp-like frameworks out there and look at how place services/managers, local caches, and event buses are implemented. you don't need to use the framework, but the concepts are very helpful to organize the code. they're straightforward and most people understand the design. Sure Ravi is reinventing the place service here. Sure he should move its cache to a local cache rpc service. But the main issue with his code is that he has a synchronous method which has to do something asynchronous. Now, most place services MVP implementations I've seen don't use the switch view only when ready pattern. The activities coming into GWT 2.1 do that however. -- 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.
Re: History and server call.
I searched too but have found only this: http://code.google.com/p/google-web-toolkit/source/browse/branches/2.1/bikeshed/src/com/google/gwt/app/place/ http://code.google.com/p/google-web-toolkit/source/browse/branches/2.1/bikeshed/src/com/google/gwt/app/place/It seems to be missing in 2.1 m1 yet. On Thu, Jun 17, 2010 at 12:30 PM, Ravi Sharma ping2r...@gmail.com wrote: Hi Thomas, I checked this URL http://code.google.com/webtoolkit/doc/latest/ReleaseNotes.html, for GWT 2.1 but didnt find much information about Activities. Is it explained somewhere else. Can you share such info/link so i can look into it dont reinvent everything. I am about to start implementing switch view only when ready pattern but if its present in 2.1 then i would love to use it instead of writing my own. Thanks, Ravi. On Jun 17, 10:59 am, Thomas Broyer t.bro...@gmail.com wrote: On 16 juin, 15:31, Tristan tristan.slomin...@gmail.com wrote: sounds like you're reinventing the place service, with event bus, with local cache rpc service, but doing it in a new, innovative, complex and if the code grows on you perhaps unintelligible way. if you're the only one who will support this ever, that may work. otherwise i would seriously look into a bunch of mvp-like frameworks out there and look at how place services/managers, local caches, and event buses are implemented. you don't need to use the framework, but the concepts are very helpful to organize the code. they're straightforward and most people understand the design. Sure Ravi is reinventing the place service here. Sure he should move its cache to a local cache rpc service. But the main issue with his code is that he has a synchronous method which has to do something asynchronous. Now, most place services MVP implementations I've seen don't use the switch view only when ready pattern. The activities coming into GWT 2.1 do that however. -- 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.comgoogle-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. For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
Re: History and server call.
here's an example i wrote that walks through place service, hope that helps with place service concepts. note that I got feedback that two types of place events that i implemented here are not necessary and that one would be sufficient, but i haven't had the time to refactor yet. it should however capture the essence of what a place service does. I too am waiting for 2.1 to settle and see where Google wants to go with that, in the mean time this is a production system description: http://code.google.com/p/handlebars/wiki/PlaceServiceOverview 2010/6/17 Jaroslav Záruba jaroslav.zar...@gmail.com I searched too but have found only this: http://code.google.com/p/google-web-toolkit/source/browse/branches/2.1/bikeshed/src/com/google/gwt/app/place/ http://code.google.com/p/google-web-toolkit/source/browse/branches/2.1/bikeshed/src/com/google/gwt/app/place/It seems to be missing in 2.1 m1 yet. On Thu, Jun 17, 2010 at 12:30 PM, Ravi Sharma ping2r...@gmail.com wrote: Hi Thomas, I checked this URL http://code.google.com/webtoolkit/doc/latest/ReleaseNotes.html, for GWT 2.1 but didnt find much information about Activities. Is it explained somewhere else. Can you share such info/link so i can look into it dont reinvent everything. I am about to start implementing switch view only when ready pattern but if its present in 2.1 then i would love to use it instead of writing my own. Thanks, Ravi. On Jun 17, 10:59 am, Thomas Broyer t.bro...@gmail.com wrote: On 16 juin, 15:31, Tristan tristan.slomin...@gmail.com wrote: sounds like you're reinventing the place service, with event bus, with local cache rpc service, but doing it in a new, innovative, complex and if the code grows on you perhaps unintelligible way. if you're the only one who will support this ever, that may work. otherwise i would seriously look into a bunch of mvp-like frameworks out there and look at how place services/managers, local caches, and event buses are implemented. you don't need to use the framework, but the concepts are very helpful to organize the code. they're straightforward and most people understand the design. Sure Ravi is reinventing the place service here. Sure he should move its cache to a local cache rpc service. But the main issue with his code is that he has a synchronous method which has to do something asynchronous. Now, most place services MVP implementations I've seen don't use the switch view only when ready pattern. The activities coming into GWT 2.1 do that however. -- 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.comgoogle-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.comgoogle-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. For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.
Re: History and server call.
On 17 juin, 12:30, Ravi Sharma ping2r...@gmail.com wrote: Hi Thomas, I checked this URLhttp://code.google.com/webtoolkit/doc/latest/ReleaseNotes.html, for GWT 2.1 but didnt find much information about Activities. Is it explained somewhere else. Can you share such info/link so i can look into it dont reinvent everything. I am about to start implementing switch view only when ready pattern but if its present in 2.1 then i would love to use it instead of writing my own. Ray Ryan gave an overview of activities in his I/O session about Architecting GWT applications for production at Google: http://code.google.com/events/io/2010/sessions/architecting-production-gwt.html Maybe you can find some details in the session's waves or other GWT- related sessions. And of course, have a look at the JavaDoc, for instance: http://google-web-toolkit.googlecode.com/svn/javadoc/2.1/com/google/gwt/app/place/Activity.html#start(com.google.gwt.app.place.Activity.Display) -- 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.
Re: History and server call.
Hey guys, I have been thinking about all this MVP architect(i am new to it) and history management and show on ready pattern etc and came up with following design/idea. Lets see if it will work and feel free to comment on it. 1) Something happens on UI(Some User activity like mouse click, keyboard press etc) 2) Raise an EVENT with required data from UI. something like CLIENT_EVENT_% or VIEW_EVENT%(i.e.CLIENT_EVENT_PROFILE_LINK_CLICKED) , basically i want to have separate naming convention for all client/UI events. 3) Presenters will be listening to these events. On Getting a event presenter can do following things 3.1) Create a history token and in history handler raise event to get data from server SERVER_EVENT_GET_DATA (Optional, if you want to keep history) 3.2) or directly raise event (i.e.SERVER_EVENT_GET_DATA) to get data from server. (If You don't want to keep history) 4) Different Data Handlers or Presenter it self will be listening to these events SERVER_EVENT_% and make the server call. 5) once server call returns raise another event like DATA_MODEL_SUCCESS %/DATA_MODEL_ERROR% with data/error returned by Server. 6) Presenter or View(I will prefer it to go to View, although it may break classic MVP) will be listening to these events(DATA_MODEL%) and will display the view/error accordingly. Now if we want to use Client side cache in this flow then handlers of events(at step 4) like SERVER_EVENT_GET_DATA / SERVER_EVENT_% can first check in Cache, if found then raise the same event(DATA_MODEL_SUCCESS%) as it will be raised by server returned asyncallback functions. So what we will achieve here. Our server RPC call will stay independent of cache/view/presenter etc. Our View stay independent of cache or server calls even independent of presenter too.. I would make my view listen to events and show the data. Our Presenter dont need to know server call details, in case you are planning to implement the separate data handlers which can use cache as well as RPC. Downside 1) For one user action i will be raising 3 Events like CLIENT_EVENT_% and then SERVER_EVENT_% and then DATA_MODEL_SUCCESS%/DATA_MODEL_ERROR %. So need to do lots of efficiency check, but good things is how many clicks a user can click on an application on browser which is running on atleast P4 machine, 1GHZ. 2) At some point you may forget that who is handling these events and how the data is reaching from server to view etc, basically you wont be able to just Ctrl + click to traverse the code tree in eclipse or netbeans. Code reading may be bit difficult. If someone can write a plugin for such code readability like Spring plugin then it will be very nice. 3) One day you decide not to use cache, just remove it without affecting any other code. Basically everything in pluggable/ unpluggable 4) One day you feel like creating same application for Mobile or new web look create ur view again. This is what MVP gives. Basically i am quite excited about using this new MVP archt. and History and event bus(I Love Eventbus, it solves me lot of things and long chains of async calls and also it gives me opportunity to make client side calls asynch(i.e. if i find that data is present in cache then i raise the event and view/presenter handler will be called in async was as if server has returned) happy coding guys. Feel free to comment. Thanks, Ravi. On Jun 17, 1:45 pm, Tristan Slominski tristan.slomin...@gmail.com wrote: here's an example i wrote that walks through place service, hope that helps with place service concepts. note that I got feedback that two types of place events that i implemented here are not necessary and that one would be sufficient, but i haven't had the time to refactor yet. it should however capture the essence of what a place service does. I too am waiting for 2.1 to settle and see where Google wants to go with that, in the mean time this is a production system description: http://code.google.com/p/handlebars/wiki/PlaceServiceOverview 2010/6/17 Jaroslav Záruba jaroslav.zar...@gmail.com I searched too but have found only this: http://code.google.com/p/google-web-toolkit/source/browse/branches/2 http://code.google.com/p/google-web-toolkit/source/browse/branches/2It seems to be missing in 2.1 m1 yet. On Thu, Jun 17, 2010 at 12:30 PM, Ravi Sharma ping2r...@gmail.com wrote: Hi Thomas, I checked this URL http://code.google.com/webtoolkit/doc/latest/ReleaseNotes.html, for GWT 2.1 but didnt find much information about Activities. Is it explained somewhere else. Can you share such info/link so i can look into it dont reinvent everything. I am about to start implementing switch view only when ready pattern but if its present in 2.1 then i would love to use it instead of writing my own. Thanks, Ravi. On Jun 17, 10:59 am, Thomas Broyer t.bro...@gmail.com wrote: On 16 juin, 15:31, Tristan tristan.slomin...@gmail.com wrote: sounds like you're
Re: History and server call.
So I will just adress things you see as a benefit, ie decoupling of server calls from presenters / views and decoupling views from presenters. First, though, I think you shouldn't call it MVP. In my opinion it seems that what you're doing is MVC where the model is helped out by RPC. There is already so much variety in the meanings of this (MVP, MVC, etc...), especially with Activities and Request Factory coming into the picture that terminology is becoming important. Not because I don't know what you're describing, but because someone new to the frameworks will get thoroughly confused. As for the benefits of what you offer, i.e. the decoupling points. Multiple frameworks out there already accomplish decoupling. Combine the fact that those benefits already exist in frameworks out there today with the concern you raised: At some point you may forget that who is handling these vents and how the data is reaching from server to view etc, basically you wont be able to just Ctrl + click to traverse the code tree in eclipse or netbeans. Code reading may be bit difficult. If someone can write a plugin for such code readability like Spring plugin then it will be very nice. That fact alone would make me want to never ever learn what you have to offer. This is almost getting into the realm of product development :) ie. as a customer what benefits do I get from your framework? I think you have some interesting ideas about the richness of event interactions, but after reading your proposal I still don't feel a compelling reason to write yet another framework. Where do you feel is the crucial difference / benefit in comparison? I'm not familiar with all of these frameworks, but here are some to compare to: gwt-presenter: http://code.google.com/p/gwt-presenter/ gwt-dispatch: http://code.google.com/p/gwt-dispatch/ gwt-platform: http://code.google.com/p/gwt-platform/ handlebars: http://code.google.com/p/handlebars/ I'm sure there are a lot more, these are the ones that immediately come to mind. On Jun 17, 2010 12:03 PM, Ravi Sharma ping2r...@gmail.com wrote: Hey guys, I have been thinking about all this MVP architect(i am new to it) and history management and show on ready pattern etc and came up with following design/idea. Lets see if it will work and feel free to comment on it. 1) Something happens on UI(Some User activity like mouse click, keyboard press etc) 2) Raise an EVENT with required data from UI. something like CLIENT_EVENT_% or VIEW_EVENT%(i.e.CLIENT_EVENT_PROFILE_LINK_CLICKED) , basically i want to have separate naming convention for all client/UI events. 3) Presenters will be listening to these events. On Getting a event presenter can do following things 3.1) Create a history token and in history handler raise event to get data from server SERVER_EVENT_GET_DATA (Optional, if you want to keep history) 3.2) or directly raise event (i.e.SERVER_EVENT_GET_DATA) to get data from server. (If You don't want to keep history) 4) Different Data Handlers or Presenter it self will be listening to these events SERVER_EVENT_% and make the server call. 5) once server call returns raise another event like DATA_MODEL_SUCCESS %/DATA_MODEL_ERROR% with data/error returned by Server. 6) Presenter or View(I will prefer it to go to View, although it may break classic MVP) will be listening to these events(DATA_MODEL%) and will display the view/error accordingly. Now if we want to use Client side cache in this flow then handlers of events(at step 4) like SERVER_EVENT_GET_DATA / SERVER_EVENT_% can first check in Cache, if found then raise the same event(DATA_MODEL_SUCCESS%) as it will be raised by server returned asyncallback functions. So what we will achieve here. Our server RPC call will stay independent of cache/view/presenter etc. Our View stay independent of cache or server calls even independent of presenter too.. I would make my view listen to events and show the data. Our Presenter dont need to know server call details, in case you are planning to implement the separate data handlers which can use cache as well as RPC. Downside 1) For one user action i will be raising 3 Events like CLIENT_EVENT_% and then SERVER_EVENT_% and then DATA_MODEL_SUCCESS%/DATA_MODEL_ERROR %. So need to do lots of efficiency check, but good things is how many clicks a user can click on an application on browser which is running on atleast P4 machine, 1GHZ. 2) At some point you may forget that who is handling these events and how the data is reaching from server to view etc, basically you wont be able to just Ctrl + click to traverse the code tree in eclipse or netbeans. Code reading may be bit difficult. If someone can write a plugin for such code readability like Spring plugin then it will be very nice. 3) One day you decide not to use cache, just remove it without affecting any other code. Basically everything in pluggable/ unpluggable 4) One day you feel like creating same application for Mobile or new web look create ur
Re: History and server call.
On Jun 16, 3:52 am, Sky myonceinalifet...@gmail.com wrote: Well, I don't know about the event bus and I have yet to watch that GWT best practices video (but I really should!) and I haven't done MVP with GWT, BUT I'm super creative so here's what I would do with your situation! :D I would have an object that is rather more aware of the all recoverPanelFromHistory async actions going on. This object would store a copy of each other object that is performing the recoverPanelFromHistory for a specific panel. (in other words a list of objects that have the method(s) controlling all that async goodness) The code inside recoverPanelFromHistory() that does the async data retrieval from the server would talk back to this object, which is the owner. It tells the Owner that it's finished getting the data (even when it already had the data cached). Every time the owner gets told that one of it's subjects finished getting data it checks to see if that was the last subject to get it's data, and if so it talks to the mainContentPanel and gets it to do it's view change (clear and add). Inside the recoverPanelFromHistory code you can do your repeatedly trying to obtain the data and even if you don't get the data until a day later when the user finally reconnects your code will be able to continue on no prob. Did that make sense? It makes sense in my head, so if it doesn't make perfect sense to you ask me to clarify things and I'll do my best! Totally makes sense. In other words: make recoverPanelFromHistory async, with a callback passed as an argument rather than returning a value; and if data is cached, then just use the callback synchronously (of call it from a Scheduler.scheduleFinally if it makes you nervous to have your async call actually be synchronous) -- 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.
Re: History and server call.
sounds like you're reinventing the place service, with event bus, with local cache rpc service, but doing it in a new, innovative, complex and if the code grows on you perhaps unintelligible way. if you're the only one who will support this ever, that may work. otherwise i would seriously look into a bunch of mvp-like frameworks out there and look at how place services/managers, local caches, and event buses are implemented. you don't need to use the framework, but the concepts are very helpful to organize the code. they're straightforward and most people understand the design. On Jun 16, 5:46 am, Thomas Broyer t.bro...@gmail.com wrote: On Jun 16, 3:52 am, Sky myonceinalifet...@gmail.com wrote: Well, I don't know about the event bus and I have yet to watch that GWT best practices video (but I really should!) and I haven't done MVP with GWT, BUT I'm super creative so here's what I would do with your situation! :D I would have an object that is rather more aware of the all recoverPanelFromHistory async actions going on. This object would store a copy of each other object that is performing the recoverPanelFromHistory for a specific panel. (in other words a list of objects that have the method(s) controlling all that async goodness) The code inside recoverPanelFromHistory() that does the async data retrieval from the server would talk back to this object, which is the owner. It tells the Owner that it's finished getting the data (even when it already had the data cached). Every time the owner gets told that one of it's subjects finished getting data it checks to see if that was the last subject to get it's data, and if so it talks to the mainContentPanel and gets it to do it's view change (clear and add). Inside the recoverPanelFromHistory code you can do your repeatedly trying to obtain the data and even if you don't get the data until a day later when the user finally reconnects your code will be able to continue on no prob. Did that make sense? It makes sense in my head, so if it doesn't make perfect sense to you ask me to clarify things and I'll do my best! Totally makes sense. In other words: make recoverPanelFromHistory async, with a callback passed as an argument rather than returning a value; and if data is cached, then just use the callback synchronously (of call it from a Scheduler.scheduleFinally if it makes you nervous to have your async call actually be synchronous) -- 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.
Re: History and server call.
Event bus looks to be promising and can solve this problem. Will try it and see how much it can help. But first need to use MVP in my project Thanks Ravi. On Jun 16, 2:23 am, fmod francisco.mode...@gdsoft.eu wrote: Using the event bus may help there.http://code.google.com/events/io/2009/sessions/GoogleWebToolkitBestPr... and the two articleshttp://code.google.com/webtoolkit/articles/mvp-architecture.html On Jun 15, 9:14 am, ping2ravi ping2r...@gmail.com wrote: Hi Guys, I have just implemented a multipage(basically multi url) website using History. It works great using history token. But i need something else from GWT which i am not able to solve. Now when user clicks on something(link/button etc) i add the token to History and my history callbacks get called. Now in history value change handler i do something like this 1) FInd out what page need to be dispalyed(basically identify the panels etc). 2) now each of my panel which can have history implementing hasHistory(my own) interface, which has function recoverPanelFromHistory. 3) In this function, i check if i have client side data cahced for this panel, if yes then load it into panel and display it(basically add to main panel widget tree). 4) But if no cache data found then go to server and get data. one such implementation @Override public boolean recoverPanelFromHistory(MapString, String historyTokens) { String page = historyTokens.get(PAGE_PARAM); boolean returnValue = false; if(home.equalsIgnoreCase(page)) { returnValue = userHomePanel.recoverPanelFromHistory(historyTokens); //and this function will calls its child panels if they support history if(returnValue ) { mainContentPanel.clear(); //clearing the mainPanel view of client mainContentPanel.add(userHomePanel); //and adding the view according to history token value } else { //dont change the browser view and stay at current panel/view/page. This also means child panel can not be recovered and there must be some problem with history tokens provided. } } if(profile.equalsIgnoreCase(page)) { returnValue = prodilePanel.recoverPanelFromHistory(historyTokens); //and this function will calls its child panels if they support history if(returnValue ) { mainContentPanel.clear(); //clearing the mainPanel view of client mainContentPanel.add(profilePanel); //and adding the view according to history token value } else { //dont change the browser view and stay at current panel/view/page. This also means child panel can not be recovered and there must be some problem with history tokens provided. } } return returnValue; } So till now theoretically it sounds good and works good. Problem starts when lets say user lost his Internet connection or call fail at server because of any system level error.. userHomePanel.recoverPanelFromHistory(historyTokens); This function does following things. 1) get the data from cache for this panel 2) if found call loadDataIntoPanel(data) function and load it into panel and return true. 3) else call the server to get data. Now server call is async and I need to return some value from userHomePanel.recoverPanelFromHistory(historyTokens);, so if i return true and call fails at server because of some network problem then ideally i dont want to switch to new view as per this history action but my function has already returned true and mainPanle has already changed the view to new panel. Now i dont want child panels to call parentPanel's method to tell them later that server call was success or failure so that main parent panel can decide whethere i should switch panels/view or not. If child need to know parent then my all panels will be too much dependent on each other and they will be too much crossed chain to each other. If you see gmail it uses such features. If you have loaded ur inbox and then you lost ur internet connection and then u click on any email. Then gmail doesnt take you to single mail viewer page and then tell oh u lost ur connection but it just keep you on inbox view and keep trying and after some time stop trying. How can i achieve such functionality.? Are there any existing libraries to do that or
Re: History and server call.
Hey Tristan. I am somewhat familiar with MVP frameworks as I've worked on projects using MVP in IT but I've never dealt with place services/ managers, local caches or event buses. Caches and event buses I can at least imagine them cuz those words say a lot in themselves, but I have no idea what place services/managers are and I did a couple quick google searches for mvp place services, mvp place managers, mvp activity mangers and didn't find any useful guides. Is the GWT MVP guide sufficient to look into these things? Do you have any recommendations of some online info so I can learn more? Thanks ^_^ On Jun 16, 10:18 am, Ravi Sharma ping2r...@gmail.com wrote: Event bus looks to be promising and can solve this problem. Will try it and see how much it can help. But first need to use MVP in my project Thanks Ravi. On Jun 16, 2:23 am, fmod francisco.mode...@gdsoft.eu wrote: Using the event bus may help there.http://code.google.com/events/io/2009/sessions/GoogleWebToolkitBestPr... and the two articleshttp://code.google.com/webtoolkit/articles/mvp-architecture.html On Jun 15, 9:14 am, ping2ravi ping2r...@gmail.com wrote: Hi Guys, I have just implemented a multipage(basically multi url) website using History. It works great using history token. But i need something else from GWT which i am not able to solve. Now when user clicks on something(link/button etc) i add the token to History and my history callbacks get called. Now in history value change handler i do something like this 1) FInd out what page need to be dispalyed(basically identify the panels etc). 2) now each of my panel which can have history implementing hasHistory(my own) interface, which has function recoverPanelFromHistory. 3) In this function, i check if i have client side data cahced for this panel, if yes then load it into panel and display it(basically add to main panel widget tree). 4) But if no cache data found then go to server and get data. one such implementation @Override public boolean recoverPanelFromHistory(MapString, String historyTokens) { String page = historyTokens.get(PAGE_PARAM); boolean returnValue = false; if(home.equalsIgnoreCase(page)) { returnValue = userHomePanel.recoverPanelFromHistory(historyTokens); //and this function will calls its child panels if they support history if(returnValue ) { mainContentPanel.clear(); //clearing the mainPanel view of client mainContentPanel.add(userHomePanel); //and adding the view according to history token value } else { //dont change the browser view and stay at current panel/view/page. This also means child panel can not be recovered and there must be some problem with history tokens provided. } } if(profile.equalsIgnoreCase(page)) { returnValue = prodilePanel.recoverPanelFromHistory(historyTokens); //and this function will calls its child panels if they support history if(returnValue ) { mainContentPanel.clear(); //clearing the mainPanel view of client mainContentPanel.add(profilePanel); //and adding the view according to history token value } else { //dont change the browser view and stay at current panel/view/page. This also means child panel can not be recovered and there must be some problem with history tokens provided. } } return returnValue; } So till now theoretically it sounds good and works good. Problem starts when lets say user lost his Internet connection or call fail at server because of any system level error.. userHomePanel.recoverPanelFromHistory(historyTokens); This function does following things. 1) get the data from cache for this panel 2) if found call loadDataIntoPanel(data) function and load it into panel and return true. 3) else call the server to get data. Now server call is async and I need to return some value from userHomePanel.recoverPanelFromHistory(historyTokens);, so if i return true and call fails at server because of some network problem then ideally i dont want to switch to new view as per this history action but my function has already returned true and mainPanle has already changed the view to new panel. Now i
Re: History and server call.
Using the event bus may help there. http://code.google.com/events/io/2009/sessions/GoogleWebToolkitBestPractices.html and the two articles http://code.google.com/webtoolkit/articles/mvp-architecture.html On Jun 15, 9:14 am, ping2ravi ping2r...@gmail.com wrote: Hi Guys, I have just implemented a multipage(basically multi url) website using History. It works great using history token. But i need something else from GWT which i am not able to solve. Now when user clicks on something(link/button etc) i add the token to History and my history callbacks get called. Now in history value change handler i do something like this 1) FInd out what page need to be dispalyed(basically identify the panels etc). 2) now each of my panel which can have history implementing hasHistory(my own) interface, which has function recoverPanelFromHistory. 3) In this function, i check if i have client side data cahced for this panel, if yes then load it into panel and display it(basically add to main panel widget tree). 4) But if no cache data found then go to server and get data. one such implementation @Override public boolean recoverPanelFromHistory(MapString, String historyTokens) { String page = historyTokens.get(PAGE_PARAM); boolean returnValue = false; if(home.equalsIgnoreCase(page)) { returnValue = userHomePanel.recoverPanelFromHistory(historyTokens); //and this function will calls its child panels if they support history if(returnValue ) { mainContentPanel.clear(); //clearing the mainPanel view of client mainContentPanel.add(userHomePanel); //and adding the view according to history token value } else { //dont change the browser view and stay at current panel/view/page. This also means child panel can not be recovered and there must be some problem with history tokens provided. } } if(profile.equalsIgnoreCase(page)) { returnValue = prodilePanel.recoverPanelFromHistory(historyTokens); //and this function will calls its child panels if they support history if(returnValue ) { mainContentPanel.clear(); //clearing the mainPanel view of client mainContentPanel.add(profilePanel); //and adding the view according to history token value } else { //dont change the browser view and stay at current panel/view/page. This also means child panel can not be recovered and there must be some problem with history tokens provided. } } return returnValue; } So till now theoretically it sounds good and works good. Problem starts when lets say user lost his Internet connection or call fail at server because of any system level error.. userHomePanel.recoverPanelFromHistory(historyTokens); This function does following things. 1) get the data from cache for this panel 2) if found call loadDataIntoPanel(data) function and load it into panel and return true. 3) else call the server to get data. Now server call is async and I need to return some value from userHomePanel.recoverPanelFromHistory(historyTokens);, so if i return true and call fails at server because of some network problem then ideally i dont want to switch to new view as per this history action but my function has already returned true and mainPanle has already changed the view to new panel. Now i dont want child panels to call parentPanel's method to tell them later that server call was success or failure so that main parent panel can decide whethere i should switch panels/view or not. If child need to know parent then my all panels will be too much dependent on each other and they will be too much crossed chain to each other. If you see gmail it uses such features. If you have loaded ur inbox and then you lost ur internet connection and then u click on any email. Then gmail doesnt take you to single mail viewer page and then tell oh u lost ur connection but it just keep you on inbox view and keep trying and after some time stop trying. How can i achieve such functionality.? Are there any existing libraries to do that or any particular design pattern is there? Thanks, in advance Ravi. -- 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
Re: History and server call.
Well, I don't know about the event bus and I have yet to watch that GWT best practices video (but I really should!) and I haven't done MVP with GWT, BUT I'm super creative so here's what I would do with your situation! :D I would have an object that is rather more aware of the all recoverPanelFromHistory async actions going on. This object would store a copy of each other object that is performing the recoverPanelFromHistory for a specific panel. (in other words a list of objects that have the method(s) controlling all that async goodness) The code inside recoverPanelFromHistory() that does the async data retrieval from the server would talk back to this object, which is the owner. It tells the Owner that it's finished getting the data (even when it already had the data cached). Every time the owner gets told that one of it's subjects finished getting data it checks to see if that was the last subject to get it's data, and if so it talks to the mainContentPanel and gets it to do it's view change (clear and add). Inside the recoverPanelFromHistory code you can do your repeatedly trying to obtain the data and even if you don't get the data until a day later when the user finally reconnects your code will be able to continue on no prob. Did that make sense? It makes sense in my head, so if it doesn't make perfect sense to you ask me to clarify things and I'll do my best! You'll have to do some refactoring... the code inside recoverPanelFromHistory() that does the depth search through all children and fires recoverPanelFromHistory() on all children and their children you'll want to still happen at the place where you currently call recoverPanelFromHistory() from the top of the tree... BUT you'll want to refactor the code that does the data cache check and then calls the async-data-get out of that method. The depth search of all children will add each child (aka subject) to the Owner object. After the Owner knows about all of it's subjects it then loops through and calls the recoverPanelFromHistory() code which does the data cache check and asyn-data-get goodness. This way the owner doesn't think it's done loading just cuz the first subject added has it's data cached and immediately tells the owner before any other subjects have been added. did that make sense? btw, did I just invent an event bus? cheers! ^_^ On Jun 15, 8:23 pm, fmod francisco.mode...@gdsoft.eu wrote: Using the event bus may help there.http://code.google.com/events/io/2009/sessions/GoogleWebToolkitBestPr... and the two articleshttp://code.google.com/webtoolkit/articles/mvp-architecture.html On Jun 15, 9:14 am, ping2ravi ping2r...@gmail.com wrote: Hi Guys, I have just implemented a multipage(basically multi url) website using History. It works great using history token. But i need something else from GWT which i am not able to solve. Now when user clicks on something(link/button etc) i add the token to History and my history callbacks get called. Now in history value change handler i do something like this 1) FInd out what page need to be dispalyed(basically identify the panels etc). 2) now each of my panel which can have history implementing hasHistory(my own) interface, which has function recoverPanelFromHistory. 3) In this function, i check if i have client side data cahced for this panel, if yes then load it into panel and display it(basically add to main panel widget tree). 4) But if no cache data found then go to server and get data. one such implementation @Override public boolean recoverPanelFromHistory(MapString, String historyTokens) { String page = historyTokens.get(PAGE_PARAM); boolean returnValue = false; if(home.equalsIgnoreCase(page)) { returnValue = userHomePanel.recoverPanelFromHistory(historyTokens); //and this function will calls its child panels if they support history if(returnValue ) { mainContentPanel.clear(); //clearing the mainPanel view of client mainContentPanel.add(userHomePanel); //and adding the view according to history token value } else { //dont change the browser view and stay at current panel/view/page. This also means child panel can not be recovered and there must be some problem with history tokens provided. } } if(profile.equalsIgnoreCase(page)) { returnValue = prodilePanel.recoverPanelFromHistory(historyTokens); //and this function will calls its child panels if they support history if(returnValue ) {