package org.ovirt.engine.ui.uicommonweb.models.templates; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import org.ovirt.engine.core.common.action.ChangeQuotaParameters; import org.ovirt.engine.core.common.action.VdcActionParametersBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.comparators.DiskByDiskAliasComparator; import org.ovirt.engine.core.common.businessentities.comparators.NameableComparator; import org.ovirt.engine.core.common.businessentities.storage.DiskImage; import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.common.businessentities.storage.ImageStatus; import org.ovirt.engine.core.common.queries.IdQueryParameters; import org.ovirt.engine.core.common.queries.VdcQueryType; import org.ovirt.engine.ui.frontend.Frontend; import org.ovirt.engine.ui.uicommonweb.UICommand; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.help.HelpTag; import org.ovirt.engine.ui.uicommonweb.models.ISupportSystemTreeContext; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicommonweb.models.SystemTreeItemModel; import org.ovirt.engine.ui.uicommonweb.models.quota.ChangeQuotaItemModel; import org.ovirt.engine.ui.uicommonweb.models.quota.ChangeQuotaModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; @SuppressWarnings("unused") public class TemplateDiskListModel extends SearchableListModel<VmTemplate, DiskImage> { private UICommand privateCopyCommand; public UICommand getCopyCommand() { return privateCopyCommand; } private void setCopyCommand(UICommand value) { privateCopyCommand = value; } ISupportSystemTreeContext systemTreeContext; public ISupportSystemTreeContext getSystemTreeContext() { return systemTreeContext; } public void setSystemTreeContext(ISupportSystemTreeContext systemTreeContext) { this.systemTreeContext = systemTreeContext; } private UICommand privateChangeQuotaCommand; public UICommand getChangeQuotaCommand() { return privateChangeQuotaCommand; } private void setChangeQuotaCommand(UICommand value) { privateChangeQuotaCommand = value; } protected boolean ignoreStorageDomains; private List<StorageDomain> storageDomains; public List<StorageDomain> getStorageDomains() { return storageDomains; } public void setStorageDomains(List<StorageDomain> storageDomains) { this.storageDomains = storageDomains; } public TemplateDiskListModel() { setTitle(ConstantsManager.getInstance().getConstants().disksTitle()); setHelpTag(HelpTag.disks); setHashName("disks"); //$NON-NLS-1$ setCopyCommand(new UICommand("Copy", this)); //$NON-NLS-1$ setChangeQuotaCommand(new UICommand("changeQuota", this)); //$NON-NLS-1$ getChangeQuotaCommand().setIsAvailable(false); updateActionAvailability(); setStorageDomains(new ArrayList<StorageDomain>()); } @Override protected void onEntityChanged() { super.onEntityChanged(); if (getEntity() != null) { getSearchCommand().execute(); } updateActionAvailability(); } @Override public void search() { if (getEntity() != null) { super.search(); } } @Override protected void syncSearch() { if (getEntity() == null) { return; } super.syncSearch(VdcQueryType.GetVmTemplatesDisks, new IdQueryParameters(getEntity().getId())); } @Override public void setItems(final Collection value) { if (ignoreStorageDomains) { setDisks(value); } else { AsyncDataProvider.getInstance().getStorageDomainList(new AsyncQuery<>( storageDomains -> { Collections.sort(storageDomains, new NameableComparator()); setStorageDomains(storageDomains); setDisks(value); })); } updateActionAvailability(); } private void setDisks(Collection<DiskImage> value) { ArrayList<DiskImage> disks = value != null ? new ArrayList<>(value) : new ArrayList<DiskImage>(); Collections.sort(disks, new DiskByDiskAliasComparator()); super.setItems(disks); } @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); updateActionAvailability(); } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } @Override protected void entityPropertyChanged(Object sender, PropertyChangedEventArgs e) { super.entityPropertyChanged(sender, e); if (e.propertyName.equals("status")) { //$NON-NLS-1$ updateActionAvailability(); } } private void updateActionAvailability() { getCopyCommand().setIsExecutionAllowed(getSelectedItems() != null && getSelectedItems().size() > 0 && isCopyCommandAvailable()); ChangeQuotaModel.updateChangeQuotaActionAvailability(getItems() != null ? getItems() : null, getSelectedItems() != null ? getSelectedItems() : null, getSystemTreeSelectedItem(), getChangeQuotaCommand()); } private boolean isCopyCommandAvailable() { List<DiskImage> disks = getSelectedItems() != null ? getSelectedItems() : new ArrayList<DiskImage>(); for (DiskImage disk : disks) { if (disk.getImageStatus() != ImageStatus.OK || disk.getDiskStorageType() != DiskStorageType.IMAGE) { return false; } } return true; } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command == getCopyCommand()) { copy(); } else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ cancel(); } else if (command == getChangeQuotaCommand()) { changeQuota(); } else if (command.getName().equals("onChangeQuota")) { //$NON-NLS-1$ onChangeQuota(); } } private void copy() { ArrayList<DiskImage> disks = (ArrayList<DiskImage>) getSelectedItems(); if (disks == null) { return; } if (getWindow() != null) { return; } CopyDiskModel model = new CopyDiskModel(); setWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().copyDisksTitle()); model.setHelpTag(HelpTag.copy_disk); model.setHashName("copy_disk"); //$NON-NLS-1$ model.setEntity(this); model.init(disks); model.startProgress(); } private void cancel() { setWindow(null); } @Override protected String getListName() { return "TemplateDiskListModel"; //$NON-NLS-1$ } private void changeQuota() { ArrayList<DiskImage> disks = (ArrayList<DiskImage>) getSelectedItems(); if (disks == null || getWindow() != null) { return; } ChangeQuotaModel model = new ChangeQuotaModel(); setWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().assignQuotaForDisk()); model.setHelpTag(HelpTag.change_quota_disks); model.setHashName("change_quota_disks"); //$NON-NLS-1$ model.startProgress(); model.init(disks); model.getCommands().add(UICommand.createDefaultOkUiCommand("onChangeQuota", this)); //$NON-NLS-1$ model.getCommands().add(UICommand.createCancelUiCommand("Cancel", this)); //$NON-NLS-1$ } private void onChangeQuota() { ChangeQuotaModel model = (ChangeQuotaModel) getWindow(); ArrayList<VdcActionParametersBase> paramerterList = new ArrayList<>(); for (Object item : model.getItems()) { ChangeQuotaItemModel itemModel = (ChangeQuotaItemModel) item; DiskImage disk = itemModel.getEntity(); VdcActionParametersBase parameters = new ChangeQuotaParameters(itemModel.getQuota().getSelectedItem().getId(), disk.getId(), itemModel.getStorageDomainId(), disk.getStoragePoolId()); paramerterList.add(parameters); } model.startProgress(); Frontend.getInstance().runMultipleAction(VdcActionType.ChangeQuotaForDisk, paramerterList, result -> cancel(), this); } public SystemTreeItemModel getSystemTreeSelectedItem() { if (getSystemTreeContext() == null) { return null; } return getSystemTreeContext().getSystemTreeSelectedItem(); } }