package org.ovirt.engine.ui.webadmin.section.main.view.popup.storage; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import org.ovirt.engine.core.common.businessentities.GuestContainer; import org.ovirt.engine.core.common.businessentities.Quota; import org.ovirt.engine.core.common.businessentities.network.VmInterfaceType; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; import org.ovirt.engine.core.common.businessentities.storage.VolumeType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.common.widget.editor.EntityModelCellTable; 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.AbstractRxTxRateColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractSumUpColumn; import org.ovirt.engine.ui.common.widget.table.column.AbstractTextColumn; import org.ovirt.engine.ui.common.widget.table.column.DiskImageStatusColumn; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.RegisterEntityModel; import org.ovirt.engine.ui.uicommonweb.models.vms.ImportEntityData; import org.ovirt.engine.ui.uicompat.external.StringUtils; import org.ovirt.engine.ui.webadmin.ApplicationConstants; import org.ovirt.engine.ui.webadmin.ApplicationTemplates; import org.ovirt.engine.ui.webadmin.gin.AssetProvider; import org.ovirt.engine.ui.webadmin.widget.table.cell.CustomSelectionCell; import com.google.gwt.dom.client.Style; import com.google.gwt.user.cellview.client.Column; import com.google.gwt.user.client.ui.TabLayoutPanel; import com.google.gwt.view.client.NoSelectionModel; public abstract class RegisterEntityInfoPanel<T, D extends ImportEntityData<T>, M extends RegisterEntityModel<T, D>> extends TabLayoutPanel { private static final ApplicationTemplates templates = AssetProvider.getTemplates(); private static final ApplicationConstants constants = AssetProvider.getConstants(); protected EntityModelCellTable<ListModel> disksTable; protected EntityModelCellTable<ListModel> nicsTable; protected EntityModelCellTable<ListModel> appsTable; protected EntityModelCellTable<ListModel> containersTable; protected M registerEntityModel; public RegisterEntityInfoPanel(M registerEntityModel) { super(ApplicationTemplates.TAB_BAR_HEIGHT, Style.Unit.PX); this.registerEntityModel = registerEntityModel; init(); addStyles(); } protected abstract void init(); public abstract void updateTabsData(ImportEntityData<T> importEntityData); private void addStyles() { getElement().getStyle().setPosition(Style.Position.STATIC); } protected void initDisksTable() { disksTable = new EntityModelCellTable<>(false, true); disksTable.enableColumnResizing(); disksTable.addColumn(new DiskImageStatusColumn(), constants.empty(), "30px"); //$NON-NLS-1$ AbstractTextColumn<DiskImage> aliasColumn = new AbstractTextColumn<DiskImage>() { @Override public String getValue(DiskImage object) { return object.getDiskAlias(); } }; disksTable.addColumn(aliasColumn, constants.aliasDisk(), "80px"); //$NON-NLS-1$ AbstractDiskSizeColumn<DiskImage> sizeColumn = new AbstractDiskSizeColumn<DiskImage>() { @Override protected Long getRawValue(DiskImage object) { return object.getSize(); } }; disksTable.addColumn(sizeColumn, constants.provisionedSizeDisk(), "80px"); //$NON-NLS-1$ AbstractDiskSizeColumn<DiskImage> actualSizeColumn = new AbstractDiskSizeColumn<DiskImage>() { @Override protected Long getRawValue(DiskImage object) { return object.getActualSizeInBytes(); } }; disksTable.addColumn(actualSizeColumn, constants.sizeDisk(), "80px"); //$NON-NLS-1$ AbstractTextColumn<DiskImage> allocationColumn = new AbstractEnumColumn<DiskImage, VolumeType>() { @Override protected VolumeType getRawValue(DiskImage object) { return VolumeType.forValue(object.getVolumeType().getValue()); } }; disksTable.addColumn(allocationColumn, constants.allocationDisk(), "110px"); //$NON-NLS-1$ AbstractTextColumn<DiskImage> statusColumn = new AbstractEnumColumn<DiskImage, ImageStatus>() { @Override protected ImageStatus getRawValue(DiskImage object) { return object.getImageStatus(); } }; disksTable.addColumn(statusColumn, constants.statusDisk(), "65px"); //$NON-NLS-1$ AbstractTextColumn<DiskImage> dateCreatedColumn = new AbstractFullDateTimeColumn<DiskImage>() { @Override protected Date getRawValue(DiskImage object) { return object.getCreationDate(); } }; disksTable.addColumn(dateCreatedColumn, constants.creationDateDisk(), "100px"); //$NON-NLS-1$ AbstractTextColumn<DiskImage> descriptionColumn = new AbstractTextColumn<DiskImage>() { @Override public String getValue(DiskImage object) { return object.getDiskDescription(); } }; disksTable.addColumn(descriptionColumn, constants.descriptionDisk(), "100px"); //$NON-NLS-1$ if (registerEntityModel.isQuotaEnabled()) { disksTable.addColumn(getDiskQuotaColumn(), constants.quotaVm(), "100px"); //$NON-NLS-1$ } disksTable.setRowData(new ArrayList<EntityModel>()); disksTable.setWidth("100%", true); //$NON-NLS-1$ disksTable.setSelectionModel(new NoSelectionModel()); } private Column<DiskImage, String> getDiskQuotaColumn() { CustomSelectionCell customSelectionCell = new CustomSelectionCell(new ArrayList<String>()); customSelectionCell.setStyle("input-group col-xs-11"); //$NON-NLS-1$ AbstractColumn<DiskImage, String> column = new AbstractColumn<DiskImage, String>(customSelectionCell) { @Override public String getValue(DiskImage disk) { List<Quota> quotas = (List<Quota>) registerEntityModel.getStorageQuota().getItems(); if (quotas == null || quotas.isEmpty()) { return constants.empty(); } Map<Guid, Quota> diskQuotaMap = registerEntityModel.getDiskQuotaMap().getEntity(); if (diskQuotaMap.get(disk.getId()) == null) { diskQuotaMap.put(disk.getId(), quotas.get(0)); ((CustomSelectionCell) getCell()).setOptions(registerEntityModel.getQuotaNames(quotas)); } return diskQuotaMap.get(disk.getId()).getQuotaName(); } }; column.setFieldUpdater((index, disk, value) -> { Quota quota = registerEntityModel.getQuotaByName(value, (List<Quota>) registerEntityModel.getStorageQuota().getItems()); registerEntityModel.getDiskQuotaMap().getEntity().put(disk.getId(), quota); }); return column; } protected void initNicsTable() { nicsTable = new EntityModelCellTable<>(false, true); nicsTable.enableColumnResizing(); AbstractTextColumn<VmNetworkInterface> nameColumn = new AbstractTextColumn<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getName(); } }; nicsTable.addColumn(nameColumn, constants.nameInterface(), "90px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> networkNameColumn = new AbstractTextColumn<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getNetworkName(); } }; nicsTable.addColumn(networkNameColumn, constants.networkNameInterface(), "90px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> profileNameColumn = new AbstractTextColumn<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getVnicProfileName(); } }; nicsTable.addColumn(profileNameColumn, constants.profileNameInterface(), "90px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> typeColumn = new AbstractEnumColumn<VmNetworkInterface, VmInterfaceType>() { @Override protected VmInterfaceType getRawValue(VmNetworkInterface object) { return VmInterfaceType.forValue(object.getType()); } }; nicsTable.addColumn(typeColumn, constants.typeInterface(), "90px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> macColumn = new AbstractTextColumn<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { return object.getMacAddress(); } }; nicsTable.addColumn(macColumn, constants.macInterface(), "90px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> speedColumn = new AbstractTextColumn<VmNetworkInterface>() { @Override public String getValue(VmNetworkInterface object) { if (object.getSpeed() != null) { return object.getSpeed().toString(); } else { return null; } } }; nicsTable.addColumn(speedColumn, templates.sub(constants.speedInterface(), constants.mbps()), "90px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> rxColumn = new AbstractRxTxRateColumn<VmNetworkInterface>() { @Override protected Double getRate(VmNetworkInterface object) { return object.getStatistics().getReceiveRate(); } @Override protected Double getSpeed(VmNetworkInterface object) { if (object.getSpeed() != null) { return object.getSpeed().doubleValue(); } else { return null; } } }; nicsTable.addColumn(rxColumn, templates.sub(constants.rxRate(), constants.mbps()), "90px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> txColumn = new AbstractRxTxRateColumn<VmNetworkInterface>() { @Override protected Double getRate(VmNetworkInterface object) { return object.getStatistics().getTransmitRate(); } @Override protected Double getSpeed(VmNetworkInterface object) { if (object.getSpeed() != null) { return object.getSpeed().doubleValue(); } else { return null; } } }; nicsTable.addColumn(txColumn, templates.sub(constants.txRate(), constants.mbps()), "90px"); //$NON-NLS-1$ AbstractTextColumn<VmNetworkInterface> dropsColumn = new AbstractSumUpColumn<VmNetworkInterface>() { @Override protected Double[] getRawValue(VmNetworkInterface object) { Double receiveDropRate = object != null ? object.getStatistics().getReceiveDropRate() : null; Double transmitDropRate = object != null ? object.getStatistics().getTransmitDropRate() : null; return new Double[] { receiveDropRate, transmitDropRate }; } }; nicsTable.addColumn(dropsColumn, templates.sub(constants.dropsInterface(), constants.pkts()), "90px"); //$NON-NLS-1$ nicsTable.setRowData(new ArrayList<EntityModel>()); nicsTable.setWidth("100%", true); //$NON-NLS-1$ nicsTable.setSelectionModel(new NoSelectionModel()); } protected void initAppsTable() { appsTable = new EntityModelCellTable<>(false, true); AbstractTextColumn<String> appNameColumn = new AbstractTextColumn<String>() { @Override public String getValue(String appName) { return appName; } }; appsTable.addColumn(appNameColumn, constants.nameSnapshot()); appsTable.setRowData(new ArrayList<EntityModel>()); appsTable.setWidth("100%", true); //$NON-NLS-1$ appsTable.setSelectionModel(new NoSelectionModel()); } protected void initContainersTable() { containersTable = new EntityModelCellTable<>(false, true); containersTable.addColumn(new AbstractTextColumn<GuestContainer>() { @Override public String getValue(GuestContainer row) { return row.getId().toString(); } }, constants.idContainer()); containersTable.addColumn(new AbstractTextColumn<GuestContainer>() { @Override public String getValue(GuestContainer row) { return StringUtils.join(row.getNames(), ", "); //$NON-NLS-1$ } }, constants.namesContainer()); containersTable.addColumn(new AbstractTextColumn<GuestContainer>() { @Override public String getValue(GuestContainer row) { return row.getImage(); } }, constants.imageContainer()); containersTable.addColumn(new AbstractTextColumn<GuestContainer>() { @Override public String getValue(GuestContainer row) { return row.getCommand(); } }, constants.commandContainer()); containersTable.addColumn(new AbstractTextColumn<GuestContainer>() { @Override public String getValue(GuestContainer row) { return row.getStatus(); } }, constants.statusContainer()); containersTable.setRowData(new ArrayList<EntityModel>()); containersTable.setWidth("100%", true); //$NON-NLS-1$ containersTable.setSelectionModel(new NoSelectionModel()); } }