package org.ovirt.engine.ui.common.gin;
import org.ovirt.engine.ui.common.CommonApplicationConstants;
import org.ovirt.engine.ui.common.CommonApplicationMessages;
import org.ovirt.engine.ui.common.CommonApplicationResources;
import org.ovirt.engine.ui.common.CommonApplicationTemplates;
import org.ovirt.engine.ui.common.auth.CurrentUser;
import org.ovirt.engine.ui.common.auth.LoggedInGatekeeper;
import org.ovirt.engine.ui.common.logging.ApplicationLogManager;
import org.ovirt.engine.ui.common.logging.ClientLogProvider;
import org.ovirt.engine.ui.common.logging.LocalStorageLogHandler;
import org.ovirt.engine.ui.common.system.ApplicationFocusManager;
import org.ovirt.engine.ui.common.system.AsyncCallFailureHandler;
import org.ovirt.engine.ui.common.system.BrowserHacks;
import org.ovirt.engine.ui.common.system.ClientStorage;
import org.ovirt.engine.ui.common.system.ClientStorageImpl;
import org.ovirt.engine.ui.common.system.ErrorPopupManagerImpl;
import org.ovirt.engine.ui.common.system.LockInteractionManager;
import org.ovirt.engine.ui.common.uicommon.ClientAgentType;
import org.ovirt.engine.ui.common.utils.ElementTooltipUtils;
import org.ovirt.engine.ui.common.widget.AlertManager;
import org.ovirt.engine.ui.frontend.AppErrors;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.frontend.VdsmErrors;
import org.ovirt.engine.ui.frontend.communication.CommunicationProvider;
import org.ovirt.engine.ui.frontend.communication.GWTRPCCommunicationProvider;
import org.ovirt.engine.ui.frontend.communication.OperationProcessor;
import org.ovirt.engine.ui.frontend.communication.VdcOperationManager;
import org.ovirt.engine.ui.frontend.communication.XsrfRpcRequestBuilder;
import org.ovirt.engine.ui.frontend.gwtservices.GenericApiGWTService;
import org.ovirt.engine.ui.frontend.gwtservices.GenericApiGWTServiceAsync;
import org.ovirt.engine.ui.uicommonweb.DynamicMessages;
import org.ovirt.engine.ui.uicommonweb.ErrorPopupManager;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.shared.SimpleEventBus;
import com.google.gwt.inject.client.AbstractGinModule;
import com.google.gwt.user.client.rpc.ServiceDefTarget;
import com.google.gwt.user.client.rpc.XsrfTokenService;
import com.google.gwt.user.client.rpc.XsrfTokenServiceAsync;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.gwtplatform.common.client.CommonGinModule;
import com.gwtplatform.mvp.client.RootPresenter;
import com.gwtplatform.mvp.client.proxy.PlaceManager;
import com.gwtplatform.mvp.shared.proxy.ParameterTokenFormatter;
import com.gwtplatform.mvp.shared.proxy.TokenFormatter;
/**
* GIN module containing common infrastructure and configuration bindings.
*/
public abstract class BaseSystemModule extends AbstractGinModule {
protected void bindCommonInfrastructure(Class<? extends PlaceManager> placeManager) {
install(new CommonGinModule());
bindEventBus();
bindFrontendInfrastructure();
bind(ApplicationLogManager.class).asEagerSingleton();
bind(TokenFormatter.class).to(ParameterTokenFormatter.class).in(Singleton.class);
bind(RootPresenter.class).asEagerSingleton();
bindTypeAndImplAsSingleton(PlaceManager.class, placeManager);
bind(CurrentUser.class).in(Singleton.class);
bind(LoggedInGatekeeper.class).in(Singleton.class);
bind(ErrorPopupManager.class).to(ErrorPopupManagerImpl.class).in(Singleton.class);
bind(AsyncCallFailureHandler.class).asEagerSingleton();
bind(ClientAgentType.class).in(Singleton.class);
bind(ClientStorage.class).to(ClientStorageImpl.class).in(Singleton.class);
bind(ApplicationFocusManager.class).asEagerSingleton();
bind(LockInteractionManager.class).asEagerSingleton();
bind(AlertManager.class).in(Singleton.class);
bindTypeAndImplAsSingleton(ClientLogProvider.class, LocalStorageLogHandler.class);
bind(BrowserHacks.class).asEagerSingleton();
bind(ElementTooltipUtils.CellWidgetTooltipReaper.class).asEagerSingleton();
bind(ElementTooltipUtils.TooltipHideOnRootPanelClick.class).asEagerSingleton();
requestStaticInjection(AssetProvider.class);
}
private void bindEventBus() {
// Bind actual (non-legacy) EventBus to its legacy interface
bind(com.google.web.bindery.event.shared.EventBus.class).to(com.google.gwt.event.shared.EventBus.class);
// Bind legacy EventBus interface to SimpleEventBus implementation
bind(com.google.gwt.event.shared.EventBus.class).to(SimpleEventBus.class).in(Singleton.class);
}
private void bindFrontendInfrastructure() {
bind(Frontend.class).in(Singleton.class);
requestStaticInjection(Frontend.InstanceHolder.class);
bind(VdcOperationManager.class).in(Singleton.class);
bind(OperationProcessor.class).in(Singleton.class);
bind(CommunicationProvider.class).to(GWTRPCCommunicationProvider.class).in(Singleton.class);
bind(XsrfRpcRequestBuilder.class).in(Singleton.class);
}
protected void bindResourceConfiguration(
Class<? extends CommonApplicationConstants> constants,
Class<? extends CommonApplicationMessages> messages,
Class<? extends CommonApplicationResources> resources,
Class<? extends CommonApplicationTemplates> templates,
Class<? extends DynamicMessages> dynamicMessages) {
bindTypeAndImplAsSingleton(CommonApplicationConstants.class, constants);
bindTypeAndImplAsSingleton(CommonApplicationMessages.class, messages);
bindTypeAndImplAsSingleton(CommonApplicationResources.class, resources);
bindTypeAndImplAsSingleton(CommonApplicationTemplates.class, templates);
bindTypeAndImplAsSingleton(DynamicMessages.class, dynamicMessages);
bind(AppErrors.class).in(Singleton.class);
bind(VdsmErrors.class).in(Singleton.class);
}
/**
* Binds {@code type} to its {@code impl} so that injecting any of these yields the singleton {@code impl} instance.
*/
protected <T> void bindTypeAndImplAsSingleton(Class<T> type, Class<? extends T> impl) {
bind(type).to(impl);
bind(impl).in(Singleton.class);
}
@Provides
@Singleton
public GenericApiGWTServiceAsync getGenericApiGWTService(final XsrfRpcRequestBuilder requestBuilder) {
// no need to use GenericApiGWTServiceAsync.Util as this is GIN-managed singleton anyway
GenericApiGWTServiceAsync service = GWT.create(GenericApiGWTService.class);
// cast to ServiceDefTarget and set RPC request builder as needed
((ServiceDefTarget) service).setRpcRequestBuilder(requestBuilder);
return service;
}
@Provides
@Singleton
public XsrfTokenServiceAsync getXsrfTokenService() {
XsrfTokenServiceAsync service = GWT.create(XsrfTokenService.class);
((ServiceDefTarget) service).setServiceEntryPoint(GWT.getModuleBaseURL() + XsrfRpcRequestBuilder.XSRF_PATH);
return service;
}
}