package org.ovirt.engine.ui.webadmin.gin.uicommon;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.AuditLog;
import org.ovirt.engine.core.common.businessentities.Permission;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmTemplate;
import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface;
import org.ovirt.engine.ui.common.presenter.AbstractModelBoundPopupPresenterWidget;
import org.ovirt.engine.ui.common.presenter.popup.DefaultConfirmationPopupPresenterWidget;
import org.ovirt.engine.ui.common.presenter.popup.RemoveConfirmationPopupPresenterWidget;
import org.ovirt.engine.ui.common.uicommon.model.DetailModelProvider;
import org.ovirt.engine.ui.common.uicommon.model.DetailTabModelProvider;
import org.ovirt.engine.ui.common.uicommon.model.MainModelProvider;
import org.ovirt.engine.ui.common.uicommon.model.MainTabModelProvider;
import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailModelProvider;
import org.ovirt.engine.ui.common.uicommon.model.SearchableDetailTabModelProvider;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.models.CommonModel;
import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
import org.ovirt.engine.ui.uicommonweb.models.Model;
import org.ovirt.engine.ui.uicommonweb.models.configure.PermissionListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateDiskListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateEventListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateGeneralModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateInterfaceListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateStorageListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.TemplateVmListModel;
import org.ovirt.engine.ui.uicommonweb.models.templates.VmBaseListModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.AttachDiskModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.DiskModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.EditDiskModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.NewDiskModel;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.event.EventPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.quota.ChangeQuotaPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.storage.DisksAllocationPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.template.TemplateEditPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.template.TemplateInterfacePopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.SingleSelectionVmDiskAttachPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmDiskPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmExportPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.popup.vm.VmPopupPresenterWidget;
import org.ovirt.engine.ui.webadmin.section.main.presenter.tab.template.TemplateMainTabSelectedItems;
import org.ovirt.engine.ui.webadmin.uicommon.model.PermissionModelProvider;
import com.google.gwt.event.shared.EventBus;
import com.google.gwt.inject.client.AbstractGinModule;
import com.google.inject.Provider;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.google.inject.TypeLiteral;
public class TemplateModule extends AbstractGinModule {
// Main List Model
@Provides
@Singleton
public MainModelProvider<VmTemplate, TemplateListModel> getTemplateListProvider(EventBus eventBus,
final Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider,
final Provider<TemplateEditPresenterWidget> popupProvider,
final Provider<VmExportPopupPresenterWidget> exportPopupProvider,
final Provider<VmPopupPresenterWidget> createVmPopupProvider,
final Provider<RemoveConfirmationPopupPresenterWidget> removeConfirmPopupProvider,
final Provider<TemplateListModel> modelProvider,
final Provider<VmDiskPopupPresenterWidget> newDiskPopupProvider,
final Provider<SingleSelectionVmDiskAttachPopupPresenterWidget> attachDiskPopupProvider,
final Provider<CommonModel> commonModelProvider) {
MainTabModelProvider<VmTemplate, TemplateListModel> result =
new MainTabModelProvider<VmTemplate, TemplateListModel>(eventBus, defaultConfirmPopupProvider,
commonModelProvider) {
@Override
public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(TemplateListModel source,
UICommand lastExecutedCommand, Model windowModel) {
TemplateListModel model = getModel();
if (lastExecutedCommand == model.getEditCommand()) {
return popupProvider.get();
} else if (lastExecutedCommand == getModel().getExportCommand()) {
return exportPopupProvider.get();
} else if (lastExecutedCommand == getModel().getCreateVmFromTemplateCommand()) {
if (windowModel instanceof AttachDiskModel) {
return attachDiskPopupProvider.get();
} else if ((windowModel instanceof NewDiskModel) || (windowModel instanceof EditDiskModel)) {
return newDiskPopupProvider.get();
} else {
return createVmPopupProvider.get();
}
} else {
return super.getModelPopup(source, lastExecutedCommand, windowModel);
}
}
@Override
public String[] getWindowPropertyNames() {
List<String> names = new ArrayList<>();
names.addAll(Arrays.asList(super.getWindowPropertyNames()));
names.add(VmBaseListModel.DISK_WINDOW);
return names.toArray(new String[names.size()]);
}
@Override
public Model getWindowModel(TemplateListModel source, String propertyName) {
if (VmBaseListModel.DISK_WINDOW.equals(propertyName)) {
return source.getDiskWindow();
}
return super.getWindowModel(source, propertyName);
}
@Override
public void clearWindowModel(TemplateListModel source, String propertyName) {
if (VmBaseListModel.DISK_WINDOW.equals(propertyName)) {
source.setDiskWindow(null);
} else {
super.clearWindowModel(source, propertyName);
}
}
@Override
public AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(TemplateListModel source,
UICommand lastExecutedCommand) {
if (lastExecutedCommand == getModel().getRemoveCommand()) {
return removeConfirmPopupProvider.get();
} else if ("OnSave".equals(lastExecutedCommand.getName())) { //$NON-NLS-1$
return defaultConfirmPopupProvider.get();
} else {
return super.getConfirmModelPopup(source, lastExecutedCommand);
}
}
};
result.setModelProvider(modelProvider);
return result;
}
// Searchable Detail Models
@Provides
@Singleton
public SearchableDetailModelProvider<DiskModel, TemplateListModel, TemplateDiskListModel> getTemplateDiskListProvider(EventBus eventBus,
Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider,
final Provider<DisksAllocationPopupPresenterWidget> copyPopupProvider,
final Provider<ChangeQuotaPopupPresenterWidget> changeQutoaPopupProvider,
final Provider<TemplateListModel> mainModelProvider,
final Provider<TemplateDiskListModel> modelProvider) {
SearchableDetailTabModelProvider<DiskModel, TemplateListModel, TemplateDiskListModel> result =
new SearchableDetailTabModelProvider<DiskModel, TemplateListModel, TemplateDiskListModel>(
eventBus, defaultConfirmPopupProvider) {
@Override
public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(TemplateDiskListModel source,
UICommand lastExecutedCommand,
Model windowModel) {
if (lastExecutedCommand == getModel().getCopyCommand()) {
return copyPopupProvider.get();
} else if (lastExecutedCommand == getModel().getChangeQuotaCommand()) {
return changeQutoaPopupProvider.get();
} else {
return super.getModelPopup(source, lastExecutedCommand, windowModel);
}
}
};
result.setMainModelProvider(mainModelProvider);
result.setModelProvider(modelProvider);
return result;
}
@Provides
@Singleton
public SearchableDetailModelProvider<VmNetworkInterface, TemplateListModel, TemplateInterfaceListModel> getTemplateInterfaceListProvider(EventBus eventBus,
Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider,
final Provider<TemplateInterfacePopupPresenterWidget> popupProvider,
final Provider<RemoveConfirmationPopupPresenterWidget> removeConfirmPopupProvider,
final Provider<TemplateListModel> mainModelProvider,
final Provider<TemplateInterfaceListModel> modelProvider) {
SearchableDetailTabModelProvider<VmNetworkInterface, TemplateListModel, TemplateInterfaceListModel> result =
new SearchableDetailTabModelProvider<VmNetworkInterface, TemplateListModel, TemplateInterfaceListModel>(
eventBus, defaultConfirmPopupProvider) {
@Override
public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(TemplateInterfaceListModel source,
UICommand lastExecutedCommand,
Model windowModel) {
if ((lastExecutedCommand == getModel().getNewCommand())
|| (lastExecutedCommand == getModel().getEditCommand())) {
return popupProvider.get();
} else {
return super.getModelPopup(source, lastExecutedCommand, windowModel);
}
}
@Override
public AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(TemplateInterfaceListModel source,
UICommand lastExecutedCommand) {
if (lastExecutedCommand == getModel().getRemoveCommand()) {
return removeConfirmPopupProvider.get();
} else {
return super.getConfirmModelPopup(source, lastExecutedCommand);
}
}
};
result.setMainModelProvider(mainModelProvider);
result.setModelProvider(modelProvider);
return result;
}
@Provides
@Singleton
public SearchableDetailModelProvider<StorageDomain, TemplateListModel, TemplateStorageListModel> getTemplateStorageListProvider(EventBus eventBus,
Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider,
final Provider<RemoveConfirmationPopupPresenterWidget> removeConfirmPopupProvider,
final Provider<TemplateListModel> mainModelProvider,
final Provider<TemplateStorageListModel> modelProvider) {
SearchableDetailTabModelProvider<StorageDomain, TemplateListModel, TemplateStorageListModel> result =
new SearchableDetailTabModelProvider<StorageDomain, TemplateListModel, TemplateStorageListModel>(
eventBus, defaultConfirmPopupProvider) {
@Override
public AbstractModelBoundPopupPresenterWidget<? extends ConfirmationModel, ?> getConfirmModelPopup(TemplateStorageListModel source,
UICommand lastExecutedCommand) {
if (lastExecutedCommand == getModel().getRemoveCommand()) {
return removeConfirmPopupProvider.get();
} else {
return super.getConfirmModelPopup(source, lastExecutedCommand);
}
}
};
result.setMainModelProvider(mainModelProvider);
result.setModelProvider(modelProvider);
return result;
}
@Provides
@Singleton
public SearchableDetailModelProvider<AuditLog, TemplateListModel, TemplateEventListModel> getTemplateEventListProvider(EventBus eventBus,
Provider<DefaultConfirmationPopupPresenterWidget> defaultConfirmPopupProvider,
final Provider<EventPopupPresenterWidget> eventPopupProvider,
final Provider<TemplateListModel> mainModelProvider,
final Provider<TemplateEventListModel> modelProvider) {
SearchableDetailTabModelProvider<AuditLog, TemplateListModel, TemplateEventListModel> result =
new SearchableDetailTabModelProvider<AuditLog, TemplateListModel, TemplateEventListModel>(
eventBus, defaultConfirmPopupProvider) {
@Override
public AbstractModelBoundPopupPresenterWidget<? extends Model, ?> getModelPopup(TemplateEventListModel source,
UICommand lastExecutedCommand,
Model windowModel) {
if (lastExecutedCommand.equals(getModel().getDetailsCommand())) {
return eventPopupProvider.get();
} else {
return super.getModelPopup(source, lastExecutedCommand, windowModel);
}
}
};
result.setMainModelProvider(mainModelProvider);
result.setModelProvider(modelProvider);
return result;
}
@Override
protected void configure() {
bind(TemplateListModel.class).in(Singleton.class);
bind(TemplateGeneralModel.class).in(Singleton.class);
bind(TemplateDiskListModel.class).in(Singleton.class);
bind(TemplateInterfaceListModel.class).in(Singleton.class);
bind(TemplateStorageListModel.class).in(Singleton.class);
bind(TemplateVmListModel.class).in(Singleton.class);
bind(TemplateEventListModel.class).in(Singleton.class);
bind(new TypeLiteral<PermissionListModel<VmTemplate>>(){}).in(Singleton.class);
bind(TemplateMainTabSelectedItems.class).asEagerSingleton();
// Form Detail Models
bind(new TypeLiteral<DetailModelProvider<TemplateListModel, TemplateGeneralModel>>(){})
.to(new TypeLiteral<DetailTabModelProvider<TemplateListModel, TemplateGeneralModel>>(){}).in(Singleton.class);
// Search-able Detail Models
bind(new TypeLiteral<SearchableDetailModelProvider<VM, TemplateListModel, TemplateVmListModel>>(){})
.to(new TypeLiteral<SearchableDetailTabModelProvider<VM, TemplateListModel, TemplateVmListModel>>(){})
.in(Singleton.class);
// Permission Detail Model
bind(new TypeLiteral<SearchableDetailModelProvider<Permission, TemplateListModel, PermissionListModel<VmTemplate>>>(){})
.to(new TypeLiteral<PermissionModelProvider<VmTemplate, TemplateListModel>>(){}).in(Singleton.class);
}
}