package org.ovirt.engine.ui.uicommonweb.models.storage; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import org.ovirt.engine.core.common.businessentities.StorageDomain; import org.ovirt.engine.core.common.businessentities.StorageDomainSharedStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; import org.ovirt.engine.core.common.businessentities.storage.ImageFileType; import org.ovirt.engine.core.common.businessentities.storage.RepoImage; import org.ovirt.engine.core.common.businessentities.storage.StorageType; import org.ovirt.engine.core.common.queries.GetImagesListParameters; import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; 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.help.HelpTag; import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; public class StorageIsoListModel extends SearchableListModel<StorageDomain, RepoImage> { public StorageIsoListModel() { setTitle(ConstantsManager.getInstance().getConstants().imagesTitle()); setHelpTag(HelpTag.images); setHashName("images"); //$NON-NLS-1$ setImportImagesCommand(new UICommand("Import", this)); //$NON-NLS-1$ updateActionAvailability(); setIsTimerDisabled(true); } private UICommand importImagesCommand; public UICommand getImportImagesCommand() { return importImagesCommand; } public void setImportImagesCommand(UICommand importImagesCommand) { this.importImagesCommand = importImagesCommand; } @Override protected void onEntityChanged() { super.onEntityChanged(); if (getIsAvailable()) { getSearchCommand().execute(); } } @Override public void setEntity(StorageDomain value) { if (value == null || !value.equals(getEntity())) { super.setEntity(value); updateActionAvailability(); } } @Override public void search() { if (getEntity() != null) { super.search(); } else { setItems(null); } } @Override protected void syncSearch() { if (getEntity() == null) { return; } super.syncSearch(); StorageDomain storageDomain = getEntity(); boolean isDomainActive = storageDomain.getStorageDomainSharedStatus() == StorageDomainSharedStatus.Active || storageDomain.getStorageDomainSharedStatus() == StorageDomainSharedStatus.Mixed; if (storageDomain.getStorageDomainType() == StorageDomainType.ISO && !isDomainActive) { setItems(Collections.<RepoImage>emptyList()); return; } GetImagesListParameters imagesListParams = new GetImagesListParameters(storageDomain.getId(), ImageFileType.All); imagesListParams.setForceRefresh(true); imagesListParams.setRefresh(getIsQueryFirstTime()); startProgress(); AsyncQuery<VdcQueryReturnValue> asyncQuery = new AsyncQuery<>(returnValue -> { stopProgress(); ArrayList<RepoImage> repoImageList = new ArrayList<>(); if (returnValue != null && returnValue.getReturnValue() != null && returnValue.getSucceeded()) { repoImageList = returnValue.getReturnValue(); Collections.sort(repoImageList, Comparator.comparing(RepoImage::getRepoImageId)); } setItems(repoImageList); setIsEmpty(repoImageList.isEmpty()); }); asyncQuery.setHandleFailure(true); Frontend.getInstance().runQuery(VdcQueryType.GetImagesList, imagesListParams, asyncQuery); } @Override protected String getListName() { return "StorageIsoListModel"; //$NON-NLS-1$ } private void importImages() { @SuppressWarnings("unchecked") ArrayList<RepoImage> repoImages = (ArrayList<RepoImage>) getSelectedItems(); if (repoImages == null || getWindow() != null) { return; } ImportRepoImageModel model = new ImportRepoImageModel(this); setWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().importImagesTitle()); model.setHelpTag(HelpTag.import_images); model.setHashName("import_images"); //$NON-NLS-1$ model.setEntity(this); model.init(getEntity(), repoImages); UICommand cancelCommand = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$ model.setCancelCommand(cancelCommand); model.getCommands().add(cancelCommand); } public void cancel() { setWindow(null); } private void updateActionAvailability() { StorageDomain storageDomain = getEntity(); @SuppressWarnings("unchecked") ArrayList<RepoImage> selectedImages = getSelectedItems() != null ? (ArrayList<RepoImage>) getSelectedItems() : new ArrayList<RepoImage>(); if (storageDomain != null && storageDomain.getStorageType() == StorageType.GLANCE) { getImportImagesCommand().setIsAvailable(true); getImportImagesCommand().setIsExecutionAllowed(selectedImages.size() > 0); } else { getImportImagesCommand().setIsAvailable(false); } } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if (getImportImagesCommand().equals(command)) { importImages(); } else if (command.getName().equals("Cancel")) { //$NON-NLS-1$ cancel(); } else if (command.getName().equals("CancelConfirm")) { //$NON-NLS-1$ setConfirmWindow(null); } } }