package org.ovirt.engine.ui.userportal.section.main.presenter.tab.basic; import java.util.HashMap; import java.util.Map; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.ui.common.presenter.popup.ConsoleModelChangedEvent; import org.ovirt.engine.ui.common.widget.HasEditorDriver; import org.ovirt.engine.ui.uicommonweb.DynamicMessages; import org.ovirt.engine.ui.uicommonweb.ErrorPopupManager; import org.ovirt.engine.ui.uicommonweb.models.ConsoleProtocol; import org.ovirt.engine.ui.uicommonweb.models.VmConsoles; import org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalBasicListModel; import org.ovirt.engine.ui.uicommonweb.models.userportal.UserPortalItemModel; import org.ovirt.engine.ui.uicommonweb.models.vms.SpiceConsoleModel; import org.ovirt.engine.ui.userportal.ApplicationConstants; import org.ovirt.engine.ui.userportal.ApplicationMessages; import org.ovirt.engine.ui.userportal.gin.AssetProvider; import org.ovirt.engine.ui.userportal.uicommon.model.UserPortalModelInitEvent; import org.ovirt.engine.ui.userportal.uicommon.model.basic.UserPortalBasicListProvider; import com.google.gwt.event.dom.client.HasClickHandlers; import com.google.gwt.event.shared.EventBus; import com.google.gwt.user.client.Window; import com.google.inject.Inject; import com.gwtplatform.mvp.client.PresenterWidget; import com.gwtplatform.mvp.client.View; public class MainTabBasicDetailsPresenterWidget extends PresenterWidget<MainTabBasicDetailsPresenterWidget.ViewDef> { public interface ViewDef extends View, HasEditorDriver<UserPortalBasicListModel> { void editDistItems(Iterable<DiskImage> diskImages); void setConsoleProtocolMessage(String protocol); void setConsoleConnectLinkEnabled(boolean enabled); void setEditConsoleEnabled(boolean enabled); HasClickHandlers getConsoleConnectAnchor(); HasClickHandlers getEditButton(); HasClickHandlers getConsoleClientResourcesAnchor(); void clear(); void displayVmOsImages(boolean dispaly); } private final DynamicMessages dynamicMessages; private final ErrorPopupManager errorPopupManager; private final Map<ConsoleProtocol, String> consoleTypeToName = new HashMap<>(); private static final ApplicationConstants constants = AssetProvider.getConstants(); private static final ApplicationMessages messages = AssetProvider.getMessages(); @Inject public MainTabBasicDetailsPresenterWidget(EventBus eventBus, ViewDef view, final UserPortalBasicListProvider modelProvider, final DynamicMessages dynamicMessages, final ErrorPopupManager errorPopupManager) { super(eventBus, view); this.dynamicMessages = dynamicMessages; this.errorPopupManager = errorPopupManager; initConsoleTypeToNameMap(); listenOnSelectedItemEvent(modelProvider); listenOnDiskModelChangeEvent(modelProvider); listenOnConsoleConnectAnchor(modelProvider); listenOnEditButton(modelProvider); listenOnConsoleClientResourcesAnchor(); listenOnConsoleModelChangeEvent(eventBus, modelProvider); getEventBus().addHandler(UserPortalModelInitEvent.getType(), event -> { listenOnSelectedItemEvent(modelProvider); listenOnDiskModelChangeEvent(modelProvider); }); } private void listenOnConsoleConnectAnchor(final UserPortalBasicListProvider modelProvider) { registerHandler(getView().getConsoleConnectAnchor().addClickHandler(event -> { try { VmConsoles vmConsoles = modelProvider.getModel().getSelectedItem().getVmConsoles(); if (vmConsoles.canConnectToConsole()) { vmConsoles.connect(); } } catch (VmConsoles.ConsoleConnectException e) { errorPopupManager.show(e.getLocalizedErrorMessage()); } })); } private void listenOnConsoleClientResourcesAnchor() { registerHandler(getView().getConsoleClientResourcesAnchor().addClickHandler(event -> { Window.open(dynamicMessages.consoleClientResourcesUrl(), "_blank", "resizable=yes,scrollbars=yes"); //$NON-NLS-1$ $NON-NLS-2$ })); } private void initConsoleTypeToNameMap() { consoleTypeToName.put(ConsoleProtocol.SPICE, constants.spice()); consoleTypeToName.put(ConsoleProtocol.RDP, constants.remoteDesktop()); consoleTypeToName.put(ConsoleProtocol.VNC, constants.vnc()); } protected void listenOnConsoleModelChangeEvent(EventBus eventBus, final UserPortalBasicListProvider modelProvider) { eventBus.addHandler(ConsoleModelChangedEvent.getType(), event -> { if (modelProvider.getModel().getSelectedItem() == null) { return; } setupConsole(modelProvider); }); } private void listenOnDiskModelChangeEvent(final UserPortalBasicListProvider modelProvider) { modelProvider.getModel().getVmBasicDiskListModel().getItemsChangedEvent().addListener((ev, sender, args) -> { if (modelProvider.getModel().getSelectedItem() == null) { return; } setupDisks(modelProvider); }); } private void listenOnSelectedItemEvent(final UserPortalBasicListProvider modelProvider) { modelProvider.getModel().getSelectedItemChangedEvent().addListener((ev, sender, args) -> { if (modelProvider.getModel().getSelectedItem() == null) { getView().clear(); return; } getView().edit(modelProvider.getModel()); getView().displayVmOsImages(true); setupDisks(modelProvider); setupConsole(modelProvider); }); } private void listenOnEditButton(final UserPortalBasicListProvider modelProvider) { registerHandler(getView().getEditButton().addClickHandler(event -> { if (!isEditConsoleEnabled(modelProvider.getModel().getSelectedItem())) { return; } modelProvider.getModel().getEditConsoleCommand().execute(); })); } private void setupDisks(final UserPortalBasicListProvider modelProvider) { @SuppressWarnings("unchecked") Iterable<DiskImage> diskImages = modelProvider.getModel().getVmBasicDiskListModel().getItems(); if (diskImages != null) { getView().editDistItems(diskImages); } } private void setupConsole(final UserPortalBasicListProvider modelProvider) { UserPortalItemModel item = modelProvider.getModel().getSelectedItem(); getView().setEditConsoleEnabled(isEditConsoleEnabled(item)); getView().setConsoleConnectLinkEnabled(canConnectToConsole(item)); getView().setConsoleProtocolMessage(determineProtocolMessage(item)); } private boolean canConnectToConsole(UserPortalItemModel item) { if (item == null) { return false; } return item.getVmConsoles().canConnectToConsole(); } private String determineProtocolMessage(UserPortalItemModel item) { VmConsoles vmConsoles = (item == null) ? null : item.getVmConsoles(); if (item == null || vmConsoles == null || !canConnectToConsole(item)) { return ""; } ConsoleProtocol selectedProcotol = vmConsoles.getSelectedProcotol(); boolean smartcardEnabled = selectedProcotol == ConsoleProtocol.SPICE && vmConsoles.getVm().isSmartcardEnabled(); boolean smartcardOverriden = vmConsoles.getConsoleModel(SpiceConsoleModel.class).getSpiceImpl().getOptions().isSmartcardEnabledOverridden(); if (smartcardEnabled && !smartcardOverriden) { return messages.consoleWithSmartcard(consoleTypeToName.get(selectedProcotol)); } return consoleTypeToName.get(selectedProcotol); } private boolean isEditConsoleEnabled(UserPortalItemModel item) { if (item == null) { return false; } return item.isPool() || (item.getVM() != null && item.getVM().isRunningOrPaused()); } }