/******************************************************************************* * Copyright 2011 Adrian Cristian Ionescu * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. ******************************************************************************/ package ro.zg.opengroups.gwt.client.impl; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import ro.zg.opengroups.gwt.shared.constants.OpenGroupsParams; import ro.zg.webapp.core.shared.event.EventListener; import ro.zg.webapp.core.shared.event.UserEvent; import ro.zg.webapp.core.shared.views.UserEventsManager; import ro.zg.webapp.core.shared.views.ViewState; import ro.zg.webapp.core.shared.views.support.ViewStateChangedEvent; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.user.client.History; public class HistoryManager implements EventListener<ViewStateChangedEvent>, ValueChangeHandler<String> { public static final String URL_FRAGMENT_SEPARATOR = "*"; public static final String TAB_ACTION_SEPARATOR = "/"; public static final String URL_FRAGMENT_SEPARATOR_REGEX="\\"+URL_FRAGMENT_SEPARATOR; private UserEventsManager userEventsManager; /** * Called when the ViewState changed */ public void onEvent(ViewStateChangedEvent event) { System.out.println("view state changed: " + event.getViewState().getCachedParams()); updateUrlFragment(event.getViewState()); } private void updateUrlFragment(ViewState viewState) { String currentFragment = History.getToken(); String newFragment = encodeUrlFragment(viewState); if (!currentFragment.equals(newFragment)) { History.newItem(newFragment, false); } } private String encodeUrlFragment(ViewState viewState) { Integer entityId = (Integer) viewState.getCachedParam(OpenGroupsParams.ENTITY_ID); List<Integer> currentTabActionPath = (List<Integer>) viewState .getCachedParam(OpenGroupsParams.CURRENT_TAB_ACTION_PATH); String fragment = ""; if (entityId == null || currentTabActionPath == null || currentTabActionPath.size() == 0) { return fragment; } fragment += entityId; fragment += URL_FRAGMENT_SEPARATOR + encodeTabActionPath(currentTabActionPath); return fragment; } private String encodeTabActionPath(List<Integer> actionPath) { String path = actionPath.remove(0).toString(); for (Integer i : actionPath) { path += TAB_ACTION_SEPARATOR + i; } return path; } private Map<String, Object> decodeUrlFragment(String input) { Map<String, Object> params = new HashMap<String, Object>(); if (input == null || "".equals(input.trim())) { return params; } input = input.trim(); String tokens[] = input.split(URL_FRAGMENT_SEPARATOR_REGEX); int size=tokens.length; if(size > 0) { Integer entityId = decodeInteger(tokens[0]); if(entityId == null) { return params; } params.put(OpenGroupsParams.ENTITY_ID, entityId); } if(size > 1) { params.put(OpenGroupsParams.DESIRED_TAB_ACTION_PATH, decodeTabActionPath(tokens[1])); } return params; } private Integer decodeInteger(String input) { if(input == null) { return null; } input=input.trim(); try { Integer integer = new Integer(input); return integer; } catch (Exception e) { return null; } } private List<Integer> decodeTabActionPath(String input) { System.out.println("decode tab action path : "+input); if (input == null || "".equals(input.trim())) { return null; } input = input.trim(); List<Integer> path = new ArrayList<Integer>(); String[] pathArray = input.split(TAB_ACTION_SEPARATOR); for (String token : pathArray) { Integer actionIndex = decodeInteger(token); if(actionIndex == null) { return path; } path.add(actionIndex); } return path; } /** * Called when history (url fragment) is modified by user/browser */ public void onValueChange(ValueChangeEvent<String> event) { Map<String,Object> params = decodeUrlFragment(event.getValue()); System.out.println("history changed: " + event.getValue()+ "-> "+params); UserEvent userEvent = new UserEvent(); userEvent.setEventType(UserEvent.HISTORY_CHANGED); userEvent.setEventParams(params); /* pass the event to the UserEventsManager for handling */ userEventsManager.handleUserEvent(userEvent); } /** * @return the userEventsManager */ public UserEventsManager getUserEventsManager() { return userEventsManager; } /** * @param userEventsManager the userEventsManager to set */ public void setUserEventsManager(UserEventsManager userEventsManager) { this.userEventsManager = userEventsManager; } }