package org.ovirt.engine.ui.uicommonweb.models.templates; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import org.ovirt.engine.core.common.action.RemoveDiskParameters; 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.storage.DiskImage; 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.ConfirmationModel; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicommonweb.models.storage.StorageDomainModel; import org.ovirt.engine.ui.uicommonweb.models.vms.DiskModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.EventArgs; import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs; public class TemplateStorageListModel extends SearchableListModel<VmTemplate, StorageDomainModel> { private UICommand privateRemoveCommand; public UICommand getRemoveCommand() { return privateRemoveCommand; } private void setRemoveCommand(UICommand value) { privateRemoveCommand = value; } List<StorageDomainModel> storageDomainModels; public TemplateStorageListModel() { setTitle(ConstantsManager.getInstance().getConstants().storageTitle()); setHelpTag(HelpTag.storage); setHashName("storage"); //$NON-NLS-1$ setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ updateActionAvailability(); } @Override protected void onEntityChanged() { super.onEntityChanged(); if (getEntity() != null) { getSearchCommand().execute(); } updateActionAvailability(); } @Override protected void syncSearch() { if (getEntity() == null) { return; } super.syncSearch(); VmTemplate template = getEntity(); super.syncSearch(VdcQueryType.GetStorageDomainsByVmTemplateId, new IdQueryParameters(template.getId())); } @Override public void setItems(final Collection<StorageDomainModel> value) { if (storageDomainModels != null) { Collections.sort(storageDomainModels, Comparator.comparing(s -> s.getStorageDomain().getStorageName())); itemsChanging(value, items); items = storageDomainModels; itemsChanged(); getItemsChangedEvent().raise(this, EventArgs.EMPTY); onPropertyChanged(new PropertyChangedEventArgs("Items")); //$NON-NLS-1$ storageDomainModels = null; } else { VmTemplate template = getEntity(); AsyncDataProvider.getInstance().getTemplateDiskList(new AsyncQuery<>( diskImages -> { Collection<? extends Object> storageDomains = value; List<StorageDomainModel> storageDomainModels = new ArrayList<>(); for (Object o : storageDomains) { StorageDomain storageDomain = (StorageDomain) o; StorageDomainModel storageDomainModel = new StorageDomainModel(); storageDomainModel.setStorageDomain(storageDomain); ArrayList<DiskImage> disks = new ArrayList<>(); for (DiskImage diskImage : diskImages) { if (diskImage.getStorageIds().contains(storageDomain.getId())) { disks.add(diskImage); } } Collections.sort(disks, new DiskByDiskAliasComparator()); storageDomainModel.setDisks(disks); storageDomainModels.add(storageDomainModel); } TemplateStorageListModel.this.storageDomainModels = storageDomainModels; setItems(value); }), template.getId()); } } private void remove() { if (getWindow() != null) { return; } ConfirmationModel model = new ConfirmationModel(); setWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().removeTemplateDisksTitle()); model.setHelpTag(HelpTag.remove_template_disks); model.setHashName("remove_template_disks"); //$NON-NLS-1$ List<? extends Object> disks = getSelectedItems() != null ? getSelectedItems() : new ArrayList<DiskModel>(); List<String> items = new ArrayList<>(); for (Object o : disks) { DiskModel diskModel = (DiskModel) o; items.add(ConstantsManager.getInstance().getMessages().templateDiskDescription( diskModel.getDisk().getDiskAlias(), diskModel.getStorageDomain().getSelectedItem().getStorageName())); } model.setItems(items); UICommand tempVar = UICommand.createDefaultOkUiCommand("OnRemove", this); //$NON-NLS-1$ model.getCommands().add(tempVar); UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$ model.getCommands().add(tempVar2); } private void onRemove() { ConfirmationModel model = (ConfirmationModel) getWindow(); List<VdcActionParametersBase> parameters = new ArrayList<>(); List<? extends Object> disks = getSelectedItems() != null ? getSelectedItems() : new ArrayList<DiskModel>(); for (Object o: disks) { DiskModel diskModel = (DiskModel) o; RemoveDiskParameters params = new RemoveDiskParameters(diskModel.getDisk().getId(), diskModel.getStorageDomain().getSelectedItem().getId()); parameters.add(params); } model.startProgress(); Frontend.getInstance().runMultipleAction(VdcActionType.RemoveDisk, parameters, result -> { ConfirmationModel localModel = (ConfirmationModel) result.getState(); localModel.stopProgress(); cancel(); }, model); cancel(); } private void cancel() { setWindow(null); } @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() { getRemoveCommand().setIsExecutionAllowed(isRemoveCommandAvailable()); } private boolean isRemoveCommandAvailable() { List<? extends Object> disks = getSelectedItems() != null ? getSelectedItems() : new ArrayList<DiskModel>(); if (disks.isEmpty()) { return false; } for (Object o: disks) { DiskModel disk = (DiskModel) o; if (((DiskImage) disk.getDisk()).getImageStatus() == ImageStatus.LOCKED || ((DiskImage) disk.getDisk()).getStorageIds().size() == 1) { return false; } } return true; } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (command == getRemoveCommand()) { remove(); } else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ cancel(); } else if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$ onRemove(); } } @Override protected String getListName() { return "TemplateStorageListModel"; //$NON-NLS-1$ } }