Its pretty easy. If you have looked at the source code of 
CachingActivityMapper you see that it only calls place.equals(lastPlace) to 
check if it has to return the previous activity or has to create a new one. 
After construction of CachingActivityMapper both lastPlace and lastActivity 
are null and thus the first place.equals(lastPlace) will always return false 
and a new Activity for that requested place is created. Lets say the first 
place change has been done via placeController.goTo(new EntityPlace(1)) and 
now a second place change occur via placeController.goTo(new 
EntityPlace(2)).

The CachingActivityMapper will not return a cached activity if you do not 
have overwritten .equals() and .hashcode() in the EntityPlace class. If you 
do not overwrite both methods, the ones from Object will be used and 
.equals() in Object does a instance check (return this == other). But as you 
create new instances of EntityPlace the equals call in CachingActivityMapper 
will always be false.
So if you overwrite equals/hashcode you would normally check if the class 
types are the same and if all variables (= internal state) are the same. If 
both is true then both places are equal. But even with such an equals method 
in EntityPalce the CachingActivityMapper still does not work because now new 
EntityPlace(1).equals(new EntityPlace(2)) is still false as they do not have 
the same internal state.

Thats why you use a filter. In your Place filter(Place place) method you 
would do something like:

Place filter(Place place) {
  if(place instanceof EntityPlace) {
    return new EntityPlace(null);
  }
}

So you "nullify" that state of the place and now the CachingActivityMapper 
will always receive an EntityPlace without any state information and thus 
equals will return true and thus the cached activity for that place type 
will be reused. So thats the basic idea on how to make CachingActivityMapper 
work. By the way the PlaceController will of course always have the correct 
Place with the correct internal state if you call 
placeController.getWhere().

In my case I've done it in a slightly other way. So I have taken my 
MainActivityMapper of my application and in its getActivity method I do:

Activity getActivity(Place place) {
  if(place != null && this.lastPlace != null &&  place.getClass() == 
this.lastPlace.getClass()) {
    return this.lastActivity;
  }

  this.lastPlace = place;

  if(place instanceof XYZPlace) {
    return new XYZActivity(place);
  } else if(....) {.....} .....
}

That way I will always get a cached activity if two or more places in a row 
have the same type. So basically I integrated the caching into my normal 
MainActivityMapper and I do not need an extra Filter and do not need GWT's 
CachingActivityMapper. 
As every activity is now cached it has to implement PlaceChangeEvent.Handler 
to get notified on each place change. That way the activity can update its 
state based on the place although the activity is cached. In the way I did 
it I wouldn't need to implement .equals/hashcode in my places but I have 
done it because placeController will not fire a place change event if two 
places are equal (maybe you somehow accidentally called 
placeController.goTo(new EntityPlace(1)) twice in a row).

But keep in mind that I do it that way because I have only one 
ActivityMapper and one Activity for each Place. It was the easiest solution 
for me at the time being because I migrate the app to Activities and my 
activities deal with both list selection and loading of the selected object. 
But maybe my example shows you that its always a bit application dependent 
how to implement things. Once you got the basic idea how you can cache 
activities you can make it fit into your application.

-- J.

-- 
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/-/YFlNzNWgiTMJ.
To post to this group, send email to google-web-toolkit@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