package org.ovirt.engine.ui.uicommonweb.models.vms;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.ovirt.engine.core.common.businessentities.Snapshot;
import org.ovirt.engine.core.common.businessentities.storage.DiskImage;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.ui.frontend.Frontend;
import org.ovirt.engine.ui.uicommonweb.Linq;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicommonweb.models.Model;
public class PreviewSnapshotModel extends Model {
private SnapshotModel snapshotModel;
private ListModel snapshots;
private Map<Guid, ListModel> diskSnapshotsMap;
private Guid vmId;
private Guid activeSnapshotId;
public PreviewSnapshotModel() {
setSnapshots(new ListModel());
setDiskSnapshotsMap(new HashMap<Guid, ListModel>());
}
@Override
public void initialize() {
Frontend.getInstance().runQuery(VdcQueryType.GetAllVmSnapshotsFromConfigurationByVmId,
new IdQueryParameters(vmId), new AsyncQuery<VdcQueryReturnValue>(response -> {
if (response != null && response.getSucceeded()) {
ArrayList<SnapshotModel> snapshotModels = new ArrayList<>();
ArrayList<Snapshot> snapshots = response.getReturnValue();
sortSnapshots(snapshots);
Guid userSelectedSnapshotId = getSnapshotModel().getEntity().getId();
for (Snapshot snapshot : snapshots) {
SnapshotModel snapshotModel = new SnapshotModel();
snapshotModel.setEntity(snapshot);
snapshotModel.getMemory().setEntity(false);
snapshotModel.setDisks((ArrayList<DiskImage>) snapshot.getDiskImages());
snapshotModels.add(snapshotModel);
if (snapshot.getType() == Snapshot.SnapshotType.ACTIVE) {
activeSnapshotId = snapshot.getId();
}
}
getSnapshots().setItems(snapshotModels);
updateDiskSnapshotsMap();
// Update disk-snapshots map
updateDiskSnapshotsMap();
// First selecting the active snapshot for ensuring default disks selection
// (i.e. when some disks are missing from the selected snapshot,
// the corresponding disks from the active snapshot should be selected).
selectSnapshot(activeSnapshotId);
// Selecting the snapshot the was selected by the user
selectSnapshot(userSelectedSnapshotId);
}
}));
}
// Sort snapshots by creation date (keep active snapshot on top)
private void sortSnapshots(ArrayList<Snapshot> snapshots) {
Collections.sort(snapshots,
Comparator.comparing((Snapshot s) -> s.getType() == Snapshot.SnapshotType.ACTIVE).reversed()
.thenComparing(Linq.SnapshotByCreationDateCommparer));
}
public SnapshotModel getSnapshotModel() {
return snapshotModel;
}
public void setSnapshotModel(SnapshotModel snapshotModel) {
this.snapshotModel = snapshotModel;
}
public ListModel<SnapshotModel> getSnapshots() {
return snapshots;
}
public void setSnapshots(ListModel snapshots) {
this.snapshots = snapshots;
}
public Map<Guid, ListModel> getDiskSnapshotsMap() {
return diskSnapshotsMap;
}
public void setDiskSnapshotsMap(Map<Guid, ListModel> diskSnapshotsMap) {
this.diskSnapshotsMap = diskSnapshotsMap;
}
public Guid getVmId() {
return vmId;
}
public void setVmId(Guid vmId) {
this.vmId = vmId;
}
public List<DiskImage> getAllDisks() {
Map<Guid, DiskImage> disksMap = new HashMap<>();
for (SnapshotModel snapshotModel : (List<SnapshotModel>) snapshots.getItems()) {
for (DiskImage disk : snapshotModel.getEntity().getDiskImages()) {
if (!disksMap.containsKey(disk.getId())) {
disksMap.put(disk.getId(), disk);
}
}
}
return new ArrayList(disksMap.values());
}
public List<DiskImage> getSelectedDisks() {
List<DiskImage> disks = new ArrayList<>();
for (ListModel diskListModel : diskSnapshotsMap.values()) {
DiskImage selectedImage = (DiskImage) diskListModel.getSelectedItem();
if (selectedImage != null) {
disks.add(selectedImage);
}
}
return disks;
}
private void updateDiskSnapshotsMap() {
if (snapshots.getItems() == null) {
return;
}
for (SnapshotModel snapshotModel : (List<SnapshotModel>) snapshots.getItems()) {
for (DiskImage diskImage : snapshotModel.getEntity().getDiskImages()) {
ListModel disksListModel;
if (diskSnapshotsMap.containsKey(diskImage.getId())) {
disksListModel = diskSnapshotsMap.get(diskImage.getId());
((ArrayList<DiskImage>) disksListModel.getItems()).add(diskImage);
}
else {
disksListModel = new ListModel();
disksListModel.setItems(new ArrayList<>(Arrays.asList(diskImage)));
}
diskSnapshotsMap.put(diskImage.getId(), disksListModel);
}
}
}
public void clearSelection() {
clearDisksSelection();
clearMemorySelection();
}
public void clearDisksSelection() {
for (ListModel diskListModel : diskSnapshotsMap.values()) {
diskListModel.setSelectedItem(null);
}
}
public void clearMemorySelection() {
for (SnapshotModel snapshotModel : getSnapshots().getItems()) {
snapshotModel.getMemory().setEntity(false);
}
}
public SnapshotModel getSnapshotModelById(Guid id) {
for (SnapshotModel snapshotModel : getSnapshots().getItems()) {
if (snapshotModel.getEntity().getId().equals(id)) {
return snapshotModel;
}
}
return null;
}
public SnapshotModel getActiveSnapshotModel() {
return getSnapshotModelById(activeSnapshotId);
}
public void selectSnapshot(Guid id) {
SnapshotModel snapshotModel = getSnapshotModelById(id);
if (snapshotModel == null) {
return;
}
getSnapshots().setSelectedItem(snapshotModel);
setSnapshotModel(snapshotModel);
for (DiskImage diskImage : snapshotModel.getDisks()) {
ListModel diskListModel = diskSnapshotsMap.get(diskImage.getId());
diskListModel.setSelectedItem(diskImage);
}
}
}