package org.ovirt.engine.ui.webadmin.place;
import java.util.logging.Logger;
import org.ovirt.engine.ui.webadmin.auth.CurrentUser;
import org.ovirt.engine.ui.webadmin.auth.UserLoginChangeEvent;
import org.ovirt.engine.ui.webadmin.auth.UserLoginChangeEvent.UserLoginChangeHandler;
import org.ovirt.engine.ui.webadmin.section.login.DefaultLoginSectionPlace;
import org.ovirt.engine.ui.webadmin.section.main.DefaultMainSectionPlace;
import com.google.gwt.event.shared.EventBus;
import com.google.inject.Inject;
import com.gwtplatform.mvp.client.proxy.PlaceManagerImpl;
import com.gwtplatform.mvp.client.proxy.PlaceRequest;
import com.gwtplatform.mvp.client.proxy.TokenFormatter;
/**
* Place manager that handles transitions between different places in the application.
*/
public class ApplicationPlaceManager extends PlaceManagerImpl implements UserLoginChangeHandler {
private static final Logger logger = Logger.getLogger(ApplicationPlaceManager.class.getName());
private final PlaceRequest defaultLoginSectionRequest;
private final PlaceRequest defaultMainSectionRequest;
private final CurrentUser user;
private PlaceRequest autoLoginRequest;
@Inject
public ApplicationPlaceManager(EventBus eventBus, TokenFormatter tokenFormatter,
@DefaultLoginSectionPlace String defaultLoginSectionPlace,
@DefaultMainSectionPlace String defaultMainSectionPlace,
CurrentUser user) {
super(eventBus, tokenFormatter);
this.defaultLoginSectionRequest = new PlaceRequest(defaultLoginSectionPlace);
this.defaultMainSectionRequest = new PlaceRequest(defaultMainSectionPlace);
this.user = user;
eventBus.addHandler(UserLoginChangeEvent.getType(), this);
}
@Override
public void revealDefaultPlace() {
revealPlace(getDefaultPlace());
}
PlaceRequest getDefaultPlace() {
return user.isLoggedIn() ? defaultMainSectionRequest : defaultLoginSectionRequest;
}
@Override
public void revealErrorPlace(String invalidHistoryToken) {
logger.warning("Invalid place request - no presenter proxy mapped to '" + invalidHistoryToken + "'");
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 '"
+ unauthorizedHistoryToken + "'");
revealDefaultPlace();
}
}
@Override
public void onUserLoginChange(UserLoginChangeEvent event) {
if (autoLoginRequest != null) {
revealPlace(autoLoginRequest);
// Once revealed, disable auto login for subsequent events
autoLoginRequest = null;
} else {
revealDefaultPlace();
}
}
}