On Friday, November 18, 2011 11:12:58 AM UTC+1, Andrew Uglev wrote:
>
> Hi! I read a lot about MVP, tokens, places but still newbie and need 
> an advise about complex token strategy. 
> For example I have a Book object (that has its activity, place, view). 
> The book can be shown, edited and commented by its ID. The token need 
> to be switched to smth like 
> #bookPlace:234/show 
> #bookPlace:234/edit 
> #bookPlace:234/comment 
>
> Switching to edit and add comment need to be done without reloading 
> object (I mean that something like  getPlaceController().goTo(new 
> BookPlace("edit")) will reload the object)
>

It only reloads the object if your code reloads the object. It depends 
whether you reuse activities and/or switch their state "on the go", and 
whether you use some kind of caching for your objects.
You could, for instance, return the very same activity instance but switch 
the activity to an "edit" (or "comment", or "view") state depending on the 
place. I wouldn't do that because it adds state to the activity, which can 
lead to complex activities that are hard to test and to maintain.
Or you could simply use some caching for your objects, so that even if you 
start a new EditBookActivity you can use the same Book instance as the one 
you used second before in the ViewBookActivity, without reaching the server.

For my part, I'd reload the object from the server (to have the freshest 
possible data), until it's proved to be a performance issue that needs 
solving; and then only add some caching or use more complex activities (how 
about a BookActivity that "wraps" the previous ViewBookActivity, 
EditBookActivity and CommentBookActivity, to switch them –mimicking an 
ActivityManager, re. activities' lifecycle– easily while providing them a 
cached Book entity?)

That's what we're doing ATM, and we haven't heard any negative feedback 
about performance (actually, even if that was the case, we couldn't do much 
about it, because going from "view" to "edit" in our case involves making a 
"checkout" and a lock on the server-side: the entity is either in "view" or 
"edit" mode, which drives the UI; it's not just a UI choice).
 

> To switch to "comment" state of book's view without reloading I'm 
> trying to use 
> History.newItem(History.getToken() + "/comment", false);  // token 
> goes to #bookPlace:234/comment, the view displays comment input form 
>
> To properly display  #bookPlace:234/comment token In the Book activity 
> constructor I need parse the token using something like: 
> String[] tokenPath = place.getPlaceName().split("/"); 
> this.bookID = tokenPath[0]; 
> this.action = tokenPath[1]; 
>
> Are there some helper classes to parse and map complex tokens?


No, but the parsing should be done in a PlaceTokenizer, not in activities. 
Your BookPlace should have two fields: bookId and action, and its 
PlaceTokenizer builds a <bookId>/<action> token and similarly parses it. 
You activities just see a BookPlace with two fields.
That way, you can easily change your tokens at any time (e.g. switch 
<bookId>;action=<action> or <bookId>:<action> for instance), without 
changing anything in your activities, only the PlaceTokenizer responsible 
for the BookPlace. Separation of concerns FTW!

Apart from that, no, there's no helper class in GWT: you're free to use any 
kind of token you want, and you're responsible for parsing and serializing 
them to/from places.
 

> Am I 
> right using  History.newItem(History.getToken() + "/comment", false); 
> to add "actions" to token?
>

No.

If you need to change place, use PlaceController.goTo.
If you don't want a new activity, have your ActivityManager return the very 
same instance; that way it won't be onStop()ed and start()ed again, but 
simply reused as is (it won't even be notified of the place change, listen 
to the PlaceChangeEvent from within your Activity if you need to).
If you don't want to reach your server to get an object from its ID, use a 
cache.

Using History.newItem that way, you're dependent upon your tokens' format, 
and if you have another ActivityManager that would need to be notified of 
the change (maybe you don' t have one right now, but you could have a need 
later on), it won't be.
PlaceController.goTo is the way to go here.

-- 
You received this message because you are subscribed to the Google Groups 
"Google Web Toolkit" group.
To view this discussion on the web visit 
https://groups.google.com/d/msg/google-web-toolkit/-/JJcClisInRoJ.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/google-web-toolkit?hl=en.

Reply via email to