@Override
 public String buildRelativeHistoryToken(int level) {
   List<PlaceRequest> placeHierarchyCopy = truncatePlaceHierarchy(level);
   if (placeHierarchyCopy.size() == 0) {
     return "";
   }
   return tokenFormatter.toHistoryToken(placeHierarchyCopy);
 }
 @Override
 public void updateHistory(PlaceRequest request, boolean updateBrowserUrl) {
   try {
     // Make sure the request match
     assert request.hasSameNameToken(getCurrentPlaceRequest())
         : "Internal error, PlaceRequest passed to updateHistory doesn't match the tail of the place hierarchy.";
     placeHierarchy.set(placeHierarchy.size() - 1, request);
     if (updateBrowserUrl) {
       String historyToken = tokenFormatter.toHistoryToken(placeHierarchy);
       String browserHistoryToken = getBrowserHistoryToken();
       if (browserHistoryToken == null || !browserHistoryToken.equals(historyToken)) {
         setBrowserHistoryToken(historyToken, false);
       }
       saveHistoryToken(historyToken);
     }
   } catch (TokenFormatException e) {
     // Do nothing.
   }
 }
 @Override
 public String buildRelativeHistoryToken(PlaceRequest request, int level) {
   List<PlaceRequest> placeHierarchyCopy = truncatePlaceHierarchy(level);
   placeHierarchyCopy.add(request);
   return tokenFormatter.toHistoryToken(placeHierarchyCopy);
 }