package org.ovirt.engine.ui.uicommonweb.models.vms; import java.util.ArrayList; import java.util.Collections; import java.util.List; import org.ovirt.engine.core.common.businessentities.storage.Disk; import org.ovirt.engine.core.common.businessentities.storage.DiskStorageType; import org.ovirt.engine.core.compat.Guid; import org.ovirt.engine.core.compat.Version; import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider; import org.ovirt.engine.ui.uicommonweb.models.EntityModel; public class InstanceImagesAttachDiskModel extends AttachDiskModel { public void loadAttachableDisks(int os, Version compatibilityVersion, final Disk prevSelectedDisk) { // Get image attachable disks AsyncDataProvider.getInstance().getAllAttachableDisks( new AsyncQuery<>(new InstanceImageGetDisksCallback(DiskStorageType.IMAGE, prevSelectedDisk) ), getVm().getStoragePoolId(), getVm().getId()); // Get lun attachable disks AsyncDataProvider.getInstance().getAllAttachableDisks( new AsyncQuery<>(new InstanceImageGetDisksCallback(DiskStorageType.LUN, prevSelectedDisk) ), null, getVm().getId()); // Get cinder attachable disks AsyncDataProvider.getInstance().getAllAttachableDisks( new AsyncQuery<>(new InstanceImageGetDisksCallback(DiskStorageType.CINDER, prevSelectedDisk) ), getVm().getStoragePoolId(), getVm().getId()); } public void loadAttachableDisks(Disk prevSelected) { doLoadAttachableDisks(new InstanceImageGetDisksCallback(DiskStorageType.IMAGE, prevSelected), new InstanceImageGetDisksCallback(DiskStorageType.LUN, prevSelected), new InstanceImageGetDisksCallback(DiskStorageType.CINDER, prevSelected)); } class InstanceImageGetDisksCallback extends GetDisksCallback { private DiskStorageType diskStorageType; private final Disk prevSelectedDisk; InstanceImageGetDisksCallback(DiskStorageType diskStorageType, Disk prevSelectedDisk) { super(diskStorageType); this.diskStorageType = diskStorageType; this.prevSelectedDisk = prevSelectedDisk; } @Override protected void initAttachableDisks(List<EntityModel<DiskModel>> entities) { getAttachableDisksMap().get(diskStorageType).setItems(entities, selectedOrNull(entities)); } private EntityModel<DiskModel> selectedOrNull(List<EntityModel<DiskModel>> list) { if (prevSelectedDisk == null) { return null; } if (prevSelectedDisk.getDiskStorageType() != diskStorageType) { return null; } for (EntityModel<DiskModel> item : list) { if (item.getEntity().getDisk().getId().equals(prevSelectedDisk.getId())) { return item; } } return null; } @Override protected List<Disk> adjustReturnValue(List<Disk> disksFromServer) { List<Guid> inDialogIds = asIds(getAttachedNotSubmittedDisks()); List<Disk> res = new ArrayList<>(); for (Disk diskFromServer : disksFromServer) { boolean selectedDisk = prevSelectedDisk != null && diskFromServer.getId().equals(prevSelectedDisk.getId()) && prevSelectedDisk.getDiskStorageType() != diskStorageType; if (!selectedDisk) { if (!inDialogIds.contains(diskFromServer.getId())) { res.add(diskFromServer); } } else { res.add(prevSelectedDisk); } } return res; } private List<Guid> asIds(List<Disk> attachedNotSubmittedDisks) { List<Guid> res = new ArrayList<>(); for (Disk disk : attachedNotSubmittedDisks) { res.add(disk.getId()); } return res; } } protected List<Disk> getAttachedNotSubmittedDisks() { return Collections.EMPTY_LIST; } }