package org.ovirt.engine.ui.common.place; import java.util.logging.Logger; import org.ovirt.engine.ui.common.auth.CurrentUser; import org.ovirt.engine.ui.common.auth.UserLoginChangeEvent; import org.ovirt.engine.ui.common.auth.UserLoginChangeEvent.UserLoginChangeHandler; import org.ovirt.engine.ui.common.uicommon.ClientAgentType; import org.ovirt.engine.ui.uicommonweb.models.MainModelSelectionChangeEvent; import org.ovirt.engine.ui.uicommonweb.models.MainModelSelectionChangeEvent.MainModelSelectionChangeHandler; import com.google.gwt.core.client.Scheduler; import com.google.gwt.dom.client.Node; import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.client.DOM; import com.gwtplatform.mvp.client.proxy.PlaceManagerImpl; import com.gwtplatform.mvp.shared.proxy.PlaceRequest; import com.gwtplatform.mvp.shared.proxy.TokenFormatter; /** * Place manager that handles transitions between different places in the application. */ public abstract class ApplicationPlaceManager extends PlaceManagerImpl implements UserLoginChangeHandler, MainModelSelectionChangeHandler { private static final Logger logger = Logger.getLogger(ApplicationPlaceManager.class.getName()); private final CurrentUser user; protected final ClientAgentType clientAgentType; private PlaceRequest autoLoginRequest; public ApplicationPlaceManager(EventBus eventBus, TokenFormatter tokenFormatter, CurrentUser user, ClientAgentType clientAgentType) { super(eventBus, tokenFormatter); this.user = user; this.clientAgentType = clientAgentType; eventBus.addHandler(UserLoginChangeEvent.getType(), this); eventBus.addHandler(MainModelSelectionChangeEvent.getType(), this); } /** * Work around Firefox bug * https://bugzilla.mozilla.org/show_bug.cgi?id=519028 * (change location.hash leads to location bar icon (favicon) disappearance). * Simply detach and re-attach the favicon link tag on hashchange. */ @Override public void onValueChange(ValueChangeEvent<String> event) { super.onValueChange(event); if (clientAgentType.isFirefox()) { Scheduler.get().scheduleDeferred(() -> { Node favicon = DOM.getElementById("id-link-favicon"); //$NON-NLS-1$ if (favicon != null) { Node parent = favicon.getParentNode(); favicon.removeFromParent(); parent.appendChild(favicon); } }); } } @Override public void revealDefaultPlace() { revealPlace(getDefaultPlace()); } protected PlaceRequest getDefaultPlace() { return getDefaultMainSectionPlace(); } /** * Returns the currently valid default "main" section place. */ protected abstract PlaceRequest getDefaultMainSectionPlace(); @Override public void revealErrorPlace(String invalidHistoryToken) { logger.warning("Invalid place request - no presenter proxy mapped to '" //$NON-NLS-1$ + invalidHistoryToken + "'"); //$NON-NLS-1$ revealDefaultPlace(); } @Override public void revealUnauthorizedPlace(String unauthorizedHistoryToken) { // Since auto login happens through deferred command, // the original place request might appear as unauthorized if (user.isAutoLogin()) { autoLoginRequest = getCurrentPlaceRequest(); // Disable auto login for subsequent place requests user.setAutoLogin(false); } else { logger.warning("Unauthorized place request - the user is not allowed to access '" //$NON-NLS-1$ + unauthorizedHistoryToken + "'"); //$NON-NLS-1$ revealDefaultPlace(); } } @Override public void onUserLoginChange(UserLoginChangeEvent event) { // Disable auto login for subsequent place requests user.setAutoLogin(false); if (autoLoginRequest != null) { revealPlace(autoLoginRequest); // Once revealed, disable auto login for subsequent events autoLoginRequest = null; } else { revealDefaultPlace(); } } @Override public void onMainModelSelectionChange(MainModelSelectionChangeEvent event) { String nameToken = event.getMainModel().getApplicationPlace(); PlaceRequest placeRequest; if (nameToken != null && event.getMainModel().getIsAvailable()) { placeRequest = PlaceRequestFactory.get(nameToken); } else { placeRequest = getDefaultPlace(); } revealPlace(placeRequest); } }