package org.ovirt.engine.ui.common.widget.uicommon.disks; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskInterface; import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; import org.ovirt.engine.core.common.businessentities.storage.LunDisk; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.core.common.utils.SizeConverter; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.StringFormat; import org.ovirt.engine.core.compat.StringHelper; 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.gin.AssetProvider; import org.ovirt.engine.ui.common.widget.table.cell.Cell; import org.ovirt.engine.ui.common.widget.table.cell.StatusCompositeCell; import org.ovirt.engine.ui.common.widget.table.column.AbstractColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractDiskSizeColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractEnumColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractFullDateTimeColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractImageResourceColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn; import org.ovirt.engine.ui.common.widget.table.column.DiskContainersColumn; import org.ovirt.engine.ui.common.widget.table.column.DiskProgressColumn; import org.ovirt.engine.ui.common.widget.table.column.DiskStatusColumn; import org.ovirt.engine.ui.common.widget.table.column.DiskUploadImageProgressColumn; import org.ovirt.engine.ui.common.widget.table.column.StorageDomainsColumn; import org.ovirt.engine.ui.uicompat.EnumTranslator; import com.google.gwt.cell.client.HasCell; import com.google.gwt.i18n.client.DateTimeFormat; import com.google.gwt.resources.client.ImageResource; import com.google.gwt.safehtml.shared.SafeHtml; import com.google.gwt.safehtml.shared.SafeHtmlUtils; public class DisksViewColumns { private static final CommonApplicationResources resources = AssetProvider.getResources(); private static final CommonApplicationConstants constants = AssetProvider.getConstants(); private static final CommonApplicationMessages messages = AssetProvider.getMessages(); public static AbstractTextColumn<Disk> getAliasColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return object.getDiskAlias(); } }; return makeSortable(column, sortBy); } public static AbstractTextColumn<Disk> getIdColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return object.getId().toString(); } }; return makeSortable(column, sortBy); } public static AbstractTextColumn<Disk> getQoutaColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { String value = ""; if (object.getDiskStorageType() == DiskStorageType.IMAGE) { DiskImage diskImage = (DiskImage) object; ArrayList<String> quotaNamesArr = diskImage.getQuotaNames(); if (quotaNamesArr != null) { value = StringHelper.join(", ", quotaNamesArr.toArray());//$NON-NLS-1$ } } return value; } }; return makeSortable(column, sortBy); } public static final AbstractImageResourceColumn<Disk> bootableDiskColumn = new AbstractImageResourceColumn<Disk>() { { setContextMenuTitle(constants.bootableDisk()); } @Override public ImageResource getValue(Disk object) { if (object.getDiskVmElements().size() == 1) { if (object.getDiskVmElements().iterator().next().isBoot()) { return getDefaultImage(); } } return null; } @Override public ImageResource getDefaultImage() { return resources.bootableDiskIcon(); } @Override public SafeHtml getTooltip(Disk object) { if (object.getDiskVmElements().size() == 1) { if (object.getDiskVmElements().iterator().next().isBoot()) { return SafeHtmlUtils.fromSafeConstant(constants.bootableDisk()); } } return null; } }; public static final AbstractImageResourceColumn<Disk> shareableDiskColumn = new AbstractImageResourceColumn<Disk>() { { setContextMenuTitle(constants.shareable()); } @Override public ImageResource getValue(Disk object) { return object.isShareable() ? getDefaultImage() : null; } @Override public ImageResource getDefaultImage() { return resources.shareableDiskIcon(); } @Override public SafeHtml getTooltip(Disk object) { if (object.isShareable()) { return SafeHtmlUtils.fromSafeConstant(constants.shareable()); } return null; } }; public static final AbstractImageResourceColumn<Disk> readOnlyDiskColumn = new AbstractImageResourceColumn<Disk>() { { setContextMenuTitle(constants.readOnly()); } @Override public ImageResource getValue(Disk object) { if (object.getDiskVmElements().size() == 1) { return object.getDiskVmElements().iterator().next().isReadOnly() ? getDefaultImage() : null; } return null; } @Override public ImageResource getDefaultImage() { return resources.readOnlyDiskIcon(); } @Override public SafeHtml getTooltip(Disk object) { if (object.getDiskVmElements().size() == 1) { return object.getDiskVmElements().iterator().next().isReadOnly() ? SafeHtmlUtils.fromSafeConstant(constants.readOnly()) : null; } return null; } }; public static final AbstractImageResourceColumn<Disk> diskContainersIconColumn = new AbstractImageResourceColumn<Disk>() { { setContextMenuTitle(constants.containersIconDisk()); } @Override public ImageResource getValue(Disk object) { if (object.getVmEntityType() == null) { return null; } return object.getVmEntityType().isVmType() ? resources.vmsImage() : object.getVmEntityType().isTemplateType() ? resources.templatesImage() : null; } @Override public SafeHtml getTooltip(Disk object) { if (object.getVmEntityType() == null) { return SafeHtmlUtils.fromSafeConstant(constants.unattachedDisk()); } else { String status = EnumTranslator.getInstance().translate(object.getVmEntityType()); return SafeHtmlUtils.fromString(status); } } }; public static final DiskStatusColumn diskStatusColumn = new DiskStatusColumn() { { setContextMenuTitle(constants.statusDisk()); } }; public static final DiskContainersColumn diskContainersColumn = new DiskContainersColumn(); public static final AbstractTextColumn<Disk> diskAlignmentColumn = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return object.getAlignment().toString(); } @Override public SafeHtml getTooltip(Disk object) { if (object.getLastAlignmentScan() != null) { String lastScanDate = DateTimeFormat .getFormat("yyyy-MM-dd, HH:mm").format(object.getLastAlignmentScan()); //$NON-NLS-1$ return SafeHtmlUtils.fromString(messages.lastDiskAlignment(lastScanDate)); } return null; } }; public static final StorageDomainsColumn storageDomainsColumn = new StorageDomainsColumn(); public static final AbstractTextColumn<Disk> storageTypeColumn = new AbstractEnumColumn<Disk, StorageType>() { @Override protected StorageType getRawValue(Disk object) { if (object.getDiskStorageType() != DiskStorageType.IMAGE && object.getDiskStorageType() != DiskStorageType.CINDER) { return null; } DiskImage disk = (DiskImage) object; return disk.getStorageTypes().isEmpty() ? null : disk.getStorageTypes().get(0); } }; public static final AbstractDiskSizeColumn<Disk> getSizeColumn(String sortBy) { AbstractDiskSizeColumn<Disk> column = new AbstractDiskSizeColumn<Disk>() { @Override protected Long getRawValue(Disk object) { switch (object.getDiskStorageType()) { case LUN: return (long) (((LunDisk) object).getLun().getDeviceSize() * Math.pow(1024, 3)); default: return object.getSize(); } } }; return makeSortable(column, sortBy); } public static final AbstractDiskSizeColumn<Disk> getActualSizeColumn(String sortBy) { AbstractDiskSizeColumn<Disk> column = new AbstractDiskSizeColumn<Disk>(SizeConverter.SizeUnit.GiB) { @Override protected Long getRawValue(Disk object) { return object.getDiskStorageType() == DiskStorageType.IMAGE || object.getDiskStorageType() == DiskStorageType.CINDER ? Math.round(((DiskImage) object).getActualDiskWithSnapshotsSize()) : (long) ((LunDisk) object).getLun().getDeviceSize(); } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getAllocationColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractEnumColumn<Disk, VolumeType>() { @Override protected VolumeType getRawValue(Disk object) { return object.getDiskStorageType() == DiskStorageType.IMAGE || object.getDiskStorageType() == DiskStorageType.CINDER ? ((DiskImage) object).getVolumeType() : null; } @Override public SafeHtml getTooltip(Disk object) { if (object.getDiskStorageType() != DiskStorageType.IMAGE && object.getDiskStorageType() != DiskStorageType.CINDER) { return null; } VolumeType originalVolumeType = null; for (DiskImage snapshot : ((DiskImage) object).getSnapshots()) { if (snapshot.getParentId() == null || snapshot.getParentId().equals(Guid.Empty)) { originalVolumeType = snapshot.getVolumeType(); break; } } if (originalVolumeType == null) { return null; } return SafeHtmlUtils.fromString( StringFormat.format("%s: %s", //$NON-NLS-1$ AssetProvider.getConstants().originalAllocationDisk(), EnumTranslator.getInstance().translate(originalVolumeType))); } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getInterfaceColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractEnumColumn<Disk, DiskInterface>() { @Override protected DiskInterface getRawValue(Disk object) { if (object.getDiskVmElements().size() == 1) { return object.getDiskVmElements().iterator().next().getDiskInterface(); } return null; } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getDateCreatedColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractFullDateTimeColumn<Disk>() { @Override protected Date getRawValue(Disk object) { return object.getDiskStorageType() == DiskStorageType.IMAGE || object.getDiskStorageType() == DiskStorageType.CINDER ? ((DiskImage) object).getCreationDate() : null; } }; return makeSortable(column, sortBy); } public static final AbstractColumn<Disk, Disk> getStatusColumn(String sortBy) { DiskUploadImageProgressColumn uploadImageProgressColumn = new DiskUploadImageProgressColumn(); DiskProgressColumn diskProgressColumn = new DiskProgressColumn(); List<HasCell<Disk, ?>> list = new ArrayList<>(); list.add(getStatusOnlyColumn(null)); list.add(uploadImageProgressColumn); list.add(diskProgressColumn); Cell<Disk> compositeCell = new StatusCompositeCell<>(list); AbstractColumn<Disk, Disk> column = new AbstractColumn<Disk, Disk>(compositeCell) { @Override public Disk getValue(Disk object) { return object; } }; if (sortBy != null) { column.makeSortable(sortBy); } return column; } public static final AbstractTextColumn<Disk> getStatusOnlyColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractEnumColumn<Disk, ImageStatus>() { @Override protected ImageStatus getRawValue(Disk object) { return object.getDiskStorageType() == DiskStorageType.IMAGE || object.getDiskStorageType() == DiskStorageType.CINDER ? ((DiskImage) object).getImageStatus() : null; } @Override public String getValue(Disk object) { if (object.getImageTransferPhase() != null) { // will be rendered by progress column return null; } return super.getValue(object); } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getDescriptionColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return object.getDiskDescription(); } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getLunIdColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return object.getDiskStorageType() == DiskStorageType.LUN ? ((LunDisk) object).getLun().getLUNId() : null; } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getLunVendorIdColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return object.getDiskStorageType() == DiskStorageType.LUN ? ((LunDisk) object).getLun().getVendorId() : null; } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getLunProductIdColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return object.getDiskStorageType() == DiskStorageType.LUN ? ((LunDisk) object).getLun().getProductId() : null; } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getLunSerialColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return object.getDiskStorageType() == DiskStorageType.LUN ? ((LunDisk) object).getLun().getSerial() : null; } }; return makeSortable(column, sortBy); } public static final AbstractDiskSizeColumn<Disk> getSnapshotSizeColumn(String sortBy) { AbstractDiskSizeColumn<Disk> column = new AbstractDiskSizeColumn<Disk>() { @Override protected Long getRawValue(Disk object) { return ((DiskImage) object).getActualSizeInBytes(); } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getSnapshotDescriptionColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return ((DiskImage) object).getVmSnapshotDescription(); } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getDiskSnapshotIDColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk disk) { return disk.getDiskStorageType() == DiskStorageType.IMAGE || disk.getDiskStorageType() == DiskStorageType.CINDER ? ((DiskImage) disk).getImageId().toString() : null; } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getDiskStorageTypeColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractEnumColumn<Disk, DiskStorageType>() { @Override protected DiskStorageType getRawValue(Disk object) { return object.getDiskStorageType(); } }; return makeSortable(column, sortBy); } public static final AbstractTextColumn<Disk> getCinderVolumeTypeColumn(String sortBy) { AbstractTextColumn<Disk> column = new AbstractTextColumn<Disk>() { @Override public String getValue(Disk object) { return object.getCinderVolumeType(); } }; return makeSortable(column, sortBy); } public static <C extends AbstractTextColumn<T>, T> C makeSortable(C column, String sortBy) { if (sortBy == null ) { // Client sorting column.makeSortable(); } else if (!sortBy.equals(constants.empty())) { // Server sorting column.makeSortable(sortBy); } return column; } }