package org.ovirt.engine.ui.uicommonweb.models;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.ui.uicommonweb.ConsoleOptionsFrontendPersister;
import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.ConsoleModelErrorEventListener;
import org.ovirt.engine.ui.uicommonweb.models.vms.RdpConsoleModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.SpiceConsoleModel;
import org.ovirt.engine.ui.uicommonweb.models.vms.VncConsoleModel;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.UIConstants;
import org.ovirt.engine.ui.uicompat.UIMessages;
public abstract class ConsolesBase implements VmConsoles {
private ConsoleProtocol selectedProtocol;
protected final Map<ConsoleProtocol, ConsoleModel> consoleModels;
private static final Map<Class, ConsoleProtocol> modelTypeMapping;
private final ConsoleOptionsFrontendPersister.ConsoleContext myContext;
private final Model parentModel;
private VM vm;
protected static final UIMessages messages = ConstantsManager.getInstance().getMessages();
protected static final UIConstants constants = ConstantsManager.getInstance().getConstants();
static {
modelTypeMapping = new HashMap<>();
modelTypeMapping.put(SpiceConsoleModel.class, ConsoleProtocol.SPICE);
modelTypeMapping.put(VncConsoleModel.class, ConsoleProtocol.VNC);
modelTypeMapping.put(RdpConsoleModel.class, ConsoleProtocol.RDP);
}
public ConsolesBase(VM vm, Model parentModel, ConsoleOptionsFrontendPersister.ConsoleContext consoleContext) {
this.vm = vm;
this.parentModel = parentModel;
this.myContext = consoleContext;
this.consoleModels = new HashMap<>();
fillModels();
setDefaultSelectedProtocol();
}
private void fillModels() {
SpiceConsoleModel spiceConsoleModel = new SpiceConsoleModel(vm, parentModel);
spiceConsoleModel.getErrorEvent().addListener(new ConsoleModelErrorEventListener(parentModel));
spiceConsoleModel.setForceVmStatusUp(myContext == ConsoleOptionsFrontendPersister.ConsoleContext.UP_BASIC);
consoleModels.put(ConsoleProtocol.SPICE, spiceConsoleModel);
VncConsoleModel vncConsoleModel = new VncConsoleModel(vm, parentModel);
vncConsoleModel.setForceVmStatusUp(myContext == ConsoleOptionsFrontendPersister.ConsoleContext.UP_BASIC);
consoleModels.put(ConsoleProtocol.VNC, vncConsoleModel);
RdpConsoleModel rdpConsoleModel = new RdpConsoleModel(vm, parentModel);
rdpConsoleModel.getErrorEvent().addListener(new ConsoleModelErrorEventListener(parentModel));
rdpConsoleModel.setForceVmStatusUp(myContext == ConsoleOptionsFrontendPersister.ConsoleContext.UP_BASIC);
consoleModels.put(ConsoleProtocol.RDP, rdpConsoleModel);
}
protected void setDefaultSelectedProtocol() {
List<ConsoleProtocol> allProtocols = ConsoleProtocol.getProtocolsByPriority();
Collections.reverse(allProtocols);
if (selectedProtocol != null) { // if it's selected, it's prefered -> set it to the 1st position
allProtocols.remove(selectedProtocol);
allProtocols.add(0, selectedProtocol);
}
for (ConsoleProtocol protocol : allProtocols) {
if (canSelectProtocol(protocol)) {
selectProtocol(protocol);
break;
}
}
}
public boolean canSelectProtocol(ConsoleProtocol protocol) {
return (protocol == null)
? false
: consoleModels.get(protocol).canBeSelected();
}
public void selectProtocol(ConsoleProtocol protocol) throws IllegalArgumentException {
if (!canSelectProtocol(protocol)) {
throw new IllegalArgumentException("Cannot select " +protocol.toString() + " protocol for vm " + getVm().getName()); // $NON-NLS-1$ $NON-NLS-2$
}
this.selectedProtocol = protocol;
}
public ConsoleProtocol getSelectedProcotol() {
return selectedProtocol;
}
public <T extends ConsoleModel> T getConsoleModel(Class <T> type) {
return (T) consoleModels.get(modelTypeMapping.get(type));
}
public boolean canConnectToConsole() {
return (selectedProtocol == null)
? false
: consoleModels.get(selectedProtocol).canConnect();
}
public ConsoleOptionsFrontendPersister.ConsoleContext getConsoleContext() {
return myContext;
}
public VM getVm() {
return vm;
}
public void setVm(VM newVm) {
boolean graphicsTypeChanged = false;
if (!getVm().getGraphicsInfos().equals(newVm.getGraphicsInfos())) {
graphicsTypeChanged = true;
}
int oldOs = getVm().getOs();
this.vm = newVm;
for (ConsoleModel cModel : consoleModels.values()) { // update my console models too
cModel.setEntity(newVm);
}
// if display types changed, we'd like to update the default selected protocol as the old one may be invalid
if (graphicsTypeChanged || newVm.getOs() != oldOs) {
setDefaultSelectedProtocol();
}
}
}