package org.ovirt.engine.ui.webadmin.widget.table.column;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.common.businessentities.VM;
import org.ovirt.engine.core.common.businessentities.VmType;
import org.ovirt.engine.ui.common.widget.table.column.AbstractSafeHtmlColumn;
import org.ovirt.engine.ui.webadmin.ApplicationConstants;
import org.ovirt.engine.ui.webadmin.ApplicationResources;
import org.ovirt.engine.ui.webadmin.gin.AssetProvider;
import com.google.gwt.resources.client.ImageResource;
import com.google.gwt.safehtml.shared.SafeHtml;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import com.google.gwt.user.client.ui.AbstractImagePrototype;
/**
* Image column that corresponds to XAML {@code VmTypeTemplate}.
*/
public class VmTypeColumn extends AbstractSafeHtmlColumn<VM> {
private static final ApplicationResources resources = AssetProvider.getResources();
private static final ApplicationConstants constants = AssetProvider.getConstants();
@Override
public SafeHtml getValue(VM vm) {
return getRenderedValue(vm);
}
private static ImageResource getPoolVmImageResource(VmType vmType, boolean nextRunConfigurationExists) {
switch (vmType) {
case Server:
return nextRunConfigurationExists ? resources.manyServersChangesImage() : resources.manyServersImage();
case Desktop:
default:
return nextRunConfigurationExists ? resources.manyDesktopsChangesImage() : resources.manyDesktopsImage();
}
}
@Override
public SafeHtml getTooltip(VM vm) {
Map<SafeHtml, String> imagesToText = getImagesToTooltipTextMap(vm);
return imagesToText.isEmpty() ? null : MultiImageColumnHelper.getTooltip(imagesToText);
}
private static SafeHtml getImageSafeHtml(ImageResource imageResource) {
return SafeHtmlUtils.fromTrustedString(AbstractImagePrototype.
create(imageResource).getHTML());
}
private Map<SafeHtml, String> getImagesToTooltipTextMap(VM vm) {
Map<SafeHtml, String> res = new LinkedHashMap<>();
if (vm.getVmPoolId() == null) {
VmTypeConfig config = VmTypeConfig.from(vm.getVmType(), vm.isStateless(), vm.isNextRunConfigurationExists());
res.put(getImageSafeHtml(config.getImageResource()), config.getTooltip());
} else {
ImageResource img = getPoolVmImageResource(vm.getVmType(), vm.isNextRunConfigurationExists());
res.put(getImageSafeHtml(img), getPoolVmTooltip(vm.getVmType()));
}
if (vm.isHostedEngine()) {
res.put(getImageSafeHtml(resources.mgmtNetwork()), constants.isHostedEngineVmTooltip());
}
return res;
}
private String getPoolVmTooltip(VmType vmType) {
switch (vmType) {
case Server:
return constants.pooledServer();
case Desktop:
return constants.pooledDesktop();
default:
return constants.pooledDesktop();
}
}
public static SafeHtml getRenderedValue(VM vm) {
List<SafeHtml> images = new ArrayList<>();
if (vm.getVmPoolId() == null) {
VmTypeConfig config = VmTypeConfig.from(vm.getVmType(), vm.isStateless(), vm.isNextRunConfigurationExists());
images.add(getImageSafeHtml(config.getImageResource()));
} else {
ImageResource img = getPoolVmImageResource(vm.getVmType(), vm.isNextRunConfigurationExists());
images.add(getImageSafeHtml(img));
}
if (vm.isHostedEngine()) {
images.add(getImageSafeHtml(resources.mgmtNetwork()));
}
return images.isEmpty() ? null : MultiImageColumnHelper.getValue(images);
}
}
enum VmTypeConfig {
DESKTOP_STATELESS(VmType.Desktop, true, false) {
@Override
public ImageResource getImageResource() {
return resources.desktopStateless();
}
@Override
public String getTooltip() {
return constants.statelessDesktop();
}
},
DESKTOP_STATEFUL(VmType.Desktop, false, false) {
@Override
public ImageResource getImageResource() {
return resources.desktopImage();
}
@Override
public String getTooltip() {
return constants.desktop();
}
},
SERVER_STATEFUL(VmType.Server, false, false) {
@Override
public ImageResource getImageResource() {
return resources.serverImage();
}
@Override
public String getTooltip() {
return constants.server();
}
},
SERVER_STATELESS(VmType.Server, true, false) {
@Override
public ImageResource getImageResource() {
return resources.serverStateless();
}
@Override
public String getTooltip() {
return constants.statelessServer();
}
},
DESKTOP_STATELESS_WITH_NEXT_RUN_CONFIG(VmType.Desktop, true, true) {
@Override
public ImageResource getImageResource() {
return resources.desktopStatelessChanges();
}
@Override
public String getTooltip() {
return constants.statelessDesktopChanges();
}
},
DESKTOP_STATEFUL_WITH_NEXT_RUN_CONFIG(VmType.Desktop, false, true) {
@Override
public ImageResource getImageResource() {
return resources.desktopChanges();
}
@Override
public String getTooltip() {
return constants.desktopChanges();
}
},
SERVER_STATEFUL_WITH_NEXT_RUN_CONFIG(VmType.Server, false, true) {
@Override
public ImageResource getImageResource() {
return resources.serverChanges();
}
@Override
public String getTooltip() {
return constants.serverChanges();
}
},
SERVER_STATELESS_WITH_NEXT_RUN_CONFIG(VmType.Server, true, true) {
@Override
public ImageResource getImageResource() {
return resources.serverStatelessChanges();
}
@Override
public String getTooltip() {
return constants.statelessServerChanges();
}
},
DEFAULT(null, false, false) {
@Override
public ImageResource getImageResource() {
return resources.manyDesktopsImage();
}
@Override
public String getTooltip() {
return ""; //$NON-NLS-1$
}
};
private final VmType vmType;
private final boolean stateless;
private final boolean nextRunConfigurationExists;
private static final ApplicationResources resources = AssetProvider.getResources();
private static final ApplicationConstants constants = AssetProvider.getConstants();
VmTypeConfig(VmType vmType, boolean stateless, boolean nextRunConfigurationExists) {
this.vmType = vmType;
this.stateless = stateless;
this.nextRunConfigurationExists = nextRunConfigurationExists;
}
public static VmTypeConfig from(VmType vmType, boolean stateless, boolean nextRunConfigurationExists) {
for (VmTypeConfig config : values()) {
if (config.stateless == stateless && config.vmType == vmType
&& config.nextRunConfigurationExists == nextRunConfigurationExists) {
return config;
}
}
return DEFAULT;
}
public abstract ImageResource getImageResource();
public abstract String getTooltip();
}