package org.ovirt.engine.ui.userportal.section.main.view.tab.extended; import java.util.List; import org.ovirt.engine.core.common.businessentities.QuotaUsagePerUser; import org.ovirt.engine.core.common.businessentities.VM; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.ui.common.SubTableResources; import org.ovirt.engine.ui.common.editor.UiCommonEditorDriver; import org.ovirt.engine.ui.common.idhandler.ElementIdHandler; import org.ovirt.engine.ui.common.idhandler.WithElementId; import org.ovirt.engine.ui.common.system.ClientStorage; import org.ovirt.engine.ui.common.view.AbstractView; import org.ovirt.engine.ui.common.widget.dialog.AdvancedParametersExpander; import org.ovirt.engine.ui.common.widget.refresh.RefreshPanel; import org.ovirt.engine.ui.common.widget.refresh.SimpleRefreshManager; import org.ovirt.engine.ui.uicommonweb.models.resources.ResourcesModel; import org.ovirt.engine.ui.userportal.ApplicationConstants; import org.ovirt.engine.ui.userportal.gin.AssetProvider; import org.ovirt.engine.ui.userportal.section.main.presenter.tab.extended.SideTabExtendedResourcePresenter; import org.ovirt.engine.ui.userportal.uicommon.model.UserPortalDataBoundModelProvider; import org.ovirt.engine.ui.userportal.widget.QuotaCPUProgressBar; import org.ovirt.engine.ui.userportal.widget.QuotaMemoryProgressBar; import org.ovirt.engine.ui.userportal.widget.QuotaProgressBar; import org.ovirt.engine.ui.userportal.widget.QuotaStorageProgressBar; import org.ovirt.engine.ui.userportal.widget.ToStringEntityModelLabel; import org.ovirt.engine.ui.userportal.widget.resources.VmTable; import com.google.gwt.core.client.GWT; import com.google.gwt.event.shared.EventBus; import com.google.gwt.resources.client.CssResource; import com.google.gwt.uibinder.client.UiBinder; import com.google.gwt.uibinder.client.UiField; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.FlowPanel; import com.google.gwt.user.client.ui.Label; import com.google.gwt.user.client.ui.ScrollPanel; import com.google.gwt.user.client.ui.VerticalPanel; import com.google.gwt.user.client.ui.Widget; import com.google.inject.Inject; public class SideTabExtendedResourceView extends AbstractView implements SideTabExtendedResourcePresenter.ViewDef { private ResourcesModel model; private static final int INFO_BOX_UPPER_PART_HEIGHT = 150; private static final int STORAGE_BOX_UPPER_PART_HEIGHT = 350; interface ViewUiBinder extends UiBinder<Widget, SideTabExtendedResourceView> { ViewUiBinder uiBinder = GWT.create(ViewUiBinder.class); } interface Driver extends UiCommonEditorDriver<ResourcesModel, SideTabExtendedResourceView> { } interface ViewIdHandler extends ElementIdHandler<SideTabExtendedResourceView> { ViewIdHandler idHandler = GWT.create(ViewIdHandler.class); } private static final ApplicationConstants constants = AssetProvider.getConstants(); interface Style extends CssResource { String quotaNameText(); } @UiField Style style; @UiField(provided = true) @Path("usedCPUsPercentage.entity") @WithElementId("usedCpusPercentage") QuotaProgressBar cpusProgressBar; @UiField @WithElementId VerticalPanel cpusQuotasList; @UiField(provided = true) @Path("usedMemoryPercentage.entity") @WithElementId("memoryUsagePercentage") QuotaProgressBar memoryProgressBar; @UiField @WithElementId VerticalPanel memoryQuotasList; @UiField(provided = true) @Path("usedMemoryPercentage.entity") @WithElementId("storageUsagePercentage") QuotaProgressBar storageProgressBar; @UiField @WithElementId VerticalPanel storageQuotasList; @UiField @Path("totalDisksSize.entity") @WithElementId ToStringEntityModelLabel totalSize; @UiField @Path("numOfSnapshots.entity") @WithElementId ToStringEntityModelLabel numOfSnapshots; @UiField @Path("totalSnapshotsSize.entity") @WithElementId ToStringEntityModelLabel totalSizeOfSnapshots; @UiField(provided = true) @Ignore @WithElementId VmTable vmTable; @UiField @Ignore public AdvancedParametersExpander vcpuExpander; @UiField @Ignore public ScrollPanel vcpuExpanderContent; @UiField @Ignore public AdvancedParametersExpander memoryExpander; @UiField @Ignore public ScrollPanel memoryExpanderContent; @UiField @Ignore public AdvancedParametersExpander storageExpander; @UiField @Ignore public ScrollPanel storageExpanderContent; @UiField @Ignore FlowPanel infoBoxMemory; @UiField @Ignore FlowPanel infoBoxCpu; @UiField @Ignore FlowPanel bottomLayoutPanel; @UiField(provided = true) RefreshPanel refreshPanel; private final Driver driver = GWT.create(Driver.class); @Inject public SideTabExtendedResourceView(UserPortalDataBoundModelProvider<VM, ResourcesModel> modelProvider, EventBus eventBus, ClientStorage clientStorage, SubTableResources headerResources) { vmTable = new VmTable(modelProvider, headerResources); SimpleRefreshManager refreshManager = new SimpleRefreshManager(modelProvider, eventBus, clientStorage); refreshPanel = refreshManager.getRefreshPanel(); cpusProgressBar = new QuotaCPUProgressBar(); memoryProgressBar = new QuotaMemoryProgressBar(); storageProgressBar = new QuotaStorageProgressBar(); initWidget(ViewUiBinder.uiBinder.createAndBindUi(this)); driver.initialize(this); ViewIdHandler.idHandler.generateAndSetIds(this); localize(); modelProvider.getModel().getUsedQuotaPercentage().getEntityChangedEvent().addListener((ev, sender, args) -> initQuotaList(model)); setResizeHandler(); vcpuExpander.initWithContent(vcpuExpanderContent.getElement()); memoryExpander.initWithContent(memoryExpanderContent.getElement()); storageExpander.initWithContent(storageExpanderContent.getElement()); } private void setResizeHandler() { Window.addResizeHandler(resizeEvent -> { vcpuExpanderContent.setHeight(numOrZero(infoBoxCpu.getOffsetHeight() - INFO_BOX_UPPER_PART_HEIGHT) + "px"); //$NON-NLS-1$ memoryExpanderContent.setHeight(numOrZero(infoBoxMemory.getOffsetHeight() - INFO_BOX_UPPER_PART_HEIGHT) + "px"); //$NON-NLS-1$ vmTable.setHeight(numOrZero(bottomLayoutPanel.getOffsetHeight() - STORAGE_BOX_UPPER_PART_HEIGHT) + "px"); //$NON-NLS-1$ }); } private int numOrZero(int num) { if (num < 0) { return 0; } else { return num; } } private void localize() { vcpuExpander.setTitleWhenCollapsed(constants.showQuotaDistribution()); vcpuExpander.setTitleWhenExpanded(constants.hideQuotaDistribution()); memoryExpander.setTitleWhenCollapsed(constants.showQuotaDistribution()); memoryExpander.setTitleWhenExpanded(constants.hideQuotaDistribution()); storageExpander.setTitleWhenCollapsed(constants.showQuotaDistribution()); storageExpander.setTitleWhenExpanded(constants.hideQuotaDistribution()); } public void initQuotaList(ResourcesModel model) { List<QuotaUsagePerUser> list = (List<QuotaUsagePerUser>) model.getUsedQuotaPercentage().getEntity(); QuotaUsagePerUser aggregatedUsage = new QuotaUsagePerUser(Guid.Empty, "", 0, 0, 0, 0, 0, 0); if (list != null) { cpusQuotasList.clear(); memoryQuotasList.clear(); storageQuotasList.clear(); cpusQuotasList.setSpacing(7); memoryQuotasList.setSpacing(7); storageQuotasList.setSpacing(7); for (QuotaUsagePerUser quotaPerUserUsageEntity : list) { aggregate(aggregatedUsage, quotaPerUserUsageEntity); addQuotaToVcpuQuotaList(quotaPerUserUsageEntity); addQuotaToMemoryQuotaList(quotaPerUserUsageEntity); addQuotaToStorageQuotaList(quotaPerUserUsageEntity); } cpusProgressBar.setQuotaUsagePerUser(aggregatedUsage); memoryProgressBar.setQuotaUsagePerUser(aggregatedUsage); storageProgressBar.setQuotaUsagePerUser(aggregatedUsage); String title = constants.showQuotaDistribution() + " (" + list.size() + ")"; //$NON-NLS-1$ //$NON-NLS-2$ vcpuExpander.setTitleWhenCollapsed(title); memoryExpander.setTitleWhenCollapsed(title); storageExpander.setTitleWhenCollapsed(title); } } private void addQuotaToVcpuQuotaList(QuotaUsagePerUser quotaPerUserUsageEntity) { QuotaProgressBar vcpuQuotaProgressBar = new QuotaCPUProgressBar(quotaPerUserUsageEntity); addQuotaRow(cpusQuotasList, quotaPerUserUsageEntity.getQuotaName(), vcpuQuotaProgressBar); } private void addQuotaToMemoryQuotaList(QuotaUsagePerUser quotaPerUserUsageEntity) { QuotaProgressBar memoryQuotaProgressBar = new QuotaMemoryProgressBar(quotaPerUserUsageEntity); addQuotaRow(memoryQuotasList, quotaPerUserUsageEntity.getQuotaName(), memoryQuotaProgressBar); } private void addQuotaToStorageQuotaList(QuotaUsagePerUser quotaPerUserUsageEntity) { QuotaProgressBar storageQuotaProgressBar = new QuotaStorageProgressBar(quotaPerUserUsageEntity); addQuotaRow(storageQuotasList, quotaPerUserUsageEntity.getQuotaName(), storageQuotaProgressBar); } private void addQuotaRow(VerticalPanel list, String quotaName, QuotaProgressBar progressBar) { FlowPanel flowPanel = new FlowPanel(); Label quotaNameLabel = new Label(); quotaNameLabel.setText(quotaName); quotaNameLabel.setStyleName(style.quotaNameText()); flowPanel.add(quotaNameLabel); flowPanel.add(progressBar); list.add(flowPanel); } private void aggregate(QuotaUsagePerUser aggregatedUsage, QuotaUsagePerUser quotaPerUserUsageEntity) { if (quotaPerUserUsageEntity.isUnlimitedVcpu() || aggregatedUsage.isUnlimitedVcpu()) { aggregatedUsage.setVcpuLimit(QuotaProgressBar.UNLIMITED); } else { aggregatedUsage.setVcpuLimit(quotaPerUserUsageEntity.getVcpuLimit() + aggregatedUsage.getVcpuLimit()); } aggregatedUsage.setVcpuUsageForUser(quotaPerUserUsageEntity.getVcpuUsageForUser() + aggregatedUsage.getVcpuUsageForUser()); aggregatedUsage.setVcpuTotalUsage(quotaPerUserUsageEntity.getVcpuTotalUsage() + aggregatedUsage.getVcpuTotalUsage()); if (quotaPerUserUsageEntity.isUnlimitedMemory() || aggregatedUsage.isUnlimitedMemory()) { aggregatedUsage.setMemoryLimit(QuotaProgressBar.UNLIMITED); } else { aggregatedUsage.setMemoryLimit(quotaPerUserUsageEntity.getMemoryLimit() + aggregatedUsage.getMemoryLimit()); } aggregatedUsage.setMemoryUsageForUser(quotaPerUserUsageEntity.getMemoryUsageForUser() + aggregatedUsage.getMemoryUsageForUser()); aggregatedUsage.setMemoryTotalUsage(quotaPerUserUsageEntity.getMemoryTotalUsage() + aggregatedUsage.getMemoryTotalUsage()); if (quotaPerUserUsageEntity.isUnlimitedStorage() || aggregatedUsage.isUnlimitedStorage()) { aggregatedUsage.setStorageLimit(QuotaProgressBar.UNLIMITED); } else { aggregatedUsage.setStorageLimit(quotaPerUserUsageEntity.getStorageLimit() + aggregatedUsage.getStorageLimit()); } aggregatedUsage.setStorageUsageForUser(quotaPerUserUsageEntity.getStorageUsageForUser() + aggregatedUsage.getStorageUsageForUser()); aggregatedUsage.setStorageTotalUsage(quotaPerUserUsageEntity.getStorageTotalUsage() + aggregatedUsage.getStorageTotalUsage()); } @Override public void edit(ResourcesModel model) { vmTable.edit(model); driver.edit(model); this.model = model; } @Override public ResourcesModel flush() { return driver.flush(); } @Override public void cleanup() { driver.cleanup(); } }