package org.ovirt.engine.ui.webadmin.system;
import org.ovirt.engine.core.common.users.VdcUser;
import org.ovirt.engine.core.compat.Event;
import org.ovirt.engine.core.compat.EventArgs;
import org.ovirt.engine.core.compat.IEventListener;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.ITypeResolver;
import org.ovirt.engine.ui.uicommonweb.TypeResolver;
import org.ovirt.engine.ui.uicommonweb.models.LoginModel;
import org.ovirt.engine.ui.webadmin.auth.AutoLoginData;
import org.ovirt.engine.ui.webadmin.auth.CurrentUser;
import org.ovirt.engine.ui.webadmin.uicommon.FrontendEventsHandlerImpl;
import org.ovirt.engine.ui.webadmin.uicommon.FrontendFailureEventListener;
import com.google.gwt.core.client.Scheduler;
import com.google.gwt.core.client.Scheduler.ScheduledCommand;
import com.google.inject.Inject;
import com.google.inject.Provider;
/**
* Contains initialization logic that gets executed at application startup.
*/
public class ApplicationInit {
private final ITypeResolver typeResolver;
private final FrontendEventsHandlerImpl frontendEventsHandler;
private final FrontendFailureEventListener frontendFailureEventListener;
private final CurrentUser user;
// Using Provider because any UiCommon model will fail before TypeResolver is initialized
private final Provider<LoginModel> loginModelProvider;
@Inject
public ApplicationInit(ITypeResolver typeResolver,
FrontendEventsHandlerImpl frontendEventsHandler,
FrontendFailureEventListener frontendFailureEventListener,
CurrentUser user, Provider<LoginModel> loginModelProvider) {
this.typeResolver = typeResolver;
this.frontendEventsHandler = frontendEventsHandler;
this.frontendFailureEventListener = frontendFailureEventListener;
this.user = user;
this.loginModelProvider = loginModelProvider;
initUiCommon();
initFrontend();
handleAutoLogin();
}
void initUiCommon() {
// Set up UiCommon type resolver
TypeResolver.Initialize(typeResolver);
}
void initFrontend() {
// Set up Frontend event handlers
Frontend.initEventsHandler(frontendEventsHandler);
Frontend.getFrontendFailureEvent().addListener(frontendFailureEventListener);
Frontend.getFrontendNotLoggedInEvent().addListener(new IEventListener() {
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
user.logout();
}
});
}
/**
* When a user is already logged in on the server, the server provides user data within the host page.
*/
void handleAutoLogin() {
AutoLoginData autoLoginData = AutoLoginData.instance();
if (autoLoginData != null) {
final VdcUser vdcUser = autoLoginData.getVdcUser();
// Use deferred command because CommonModel change needs to happen
// after all model providers have been properly initialized
Scheduler.get().scheduleDeferred(new ScheduledCommand() {
@Override
public void execute() {
loginModelProvider.get().AutoLogin(vdcUser);
}
});
// Indicate that the user should be logged in automatically
user.setAutoLogin(true);
}
}
}