package org.ovirt.engine.ui.uicommonweb.models.storage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.Quota;
import org.ovirt.engine.core.common.businessentities.QuotaEnforcementTypeEnum;
import org.ovirt.engine.core.common.businessentities.StorageDomain;
import org.ovirt.engine.core.common.businessentities.StoragePool;
import org.ovirt.engine.core.common.businessentities.comparators.NameableComparator;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.ui.frontend.AsyncCallback;
import org.ovirt.engine.ui.uicommonweb.ICommandTarget;
import org.ovirt.engine.ui.uicommonweb.UICommand;
import org.ovirt.engine.ui.uicommonweb.dataprovider.AsyncDataProvider;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.ListModel;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
import org.ovirt.engine.ui.uicompat.Event;
import org.ovirt.engine.ui.uicompat.EventArgs;
import org.ovirt.engine.ui.uicompat.EventDefinition;
import org.ovirt.engine.ui.uicompat.PropertyChangedEventArgs;
import org.ovirt.engine.ui.uicompat.UIConstants;
public abstract class ImportExportRepoImageBaseModel extends EntityModel implements ICommandTarget {
protected static final EventDefinition selectedItemChangedEventDefinition;
static {
selectedItemChangedEventDefinition = new EventDefinition("SelectedItemChanged", ListModel.class); //$NON-NLS-1$
}
protected static final UIConstants constants = ConstantsManager.getInstance().getConstants();
protected List<EntityModel> entities;
private EntityModel<Boolean> importAsTemplate;
private EntityModel<String> templateName;
public EntityModel<Boolean> getImportAsTemplate() {
return importAsTemplate;
}
public void setImportAsTemplate(EntityModel<Boolean> importAsTemplate) {
this.importAsTemplate = importAsTemplate;
}
private ListModel<StoragePool> dataCenter;
private ListModel<Cluster> cluster;
private ListModel<StorageDomain> storageDomain;
private ListModel<Quota> quota;
private UICommand okCommand;
private UICommand cancelCommand;
public List<EntityModel> getEntities() {
return entities;
}
public void setEntities(List<EntityModel> entities) {
if (entities == this.entities) {
return;
}
this.entities = entities;
onPropertyChanged(new PropertyChangedEventArgs("ImportExportEntities")); //$NON-NLS-1$
}
public EntityModel<String> getTemplateName() {
return templateName;
}
public void setTemplateName(EntityModel<String> templateName) {
this.templateName = templateName;
}
public ListModel<StoragePool> getDataCenter() {
return dataCenter;
}
public void setDataCenter(ListModel<StoragePool> value) {
dataCenter = value;
}
public ListModel<Cluster> getCluster() {
return cluster;
}
public void setCluster(ListModel<Cluster> value) {
cluster = value;
}
public ListModel<StorageDomain> getStorageDomain() {
return storageDomain;
}
public void setStorageDomain(ListModel<StorageDomain> storageDomain) {
this.storageDomain = storageDomain;
}
public ListModel<Quota> getQuota() {
return quota;
}
public void setQuota(ListModel<Quota> quota) {
this.quota = quota;
}
public UICommand getOkCommand() {
return okCommand;
}
public void setOkCommand(UICommand okCommand) {
this.okCommand = okCommand;
}
public UICommand getCancelCommand() {
return cancelCommand;
}
public void setCancelCommand(UICommand cancelCommand) {
this.cancelCommand = cancelCommand;
}
public ImportExportRepoImageBaseModel() {
setDataCenter(new ListModel<StoragePool>());
getDataCenter().setIsEmpty(true);
getDataCenter().getSelectedItemChangedEvent().addListener(this);
setCluster(new ListModel<Cluster>());
getCluster().setIsEmpty(true);
getCluster().getSelectedItemChangedEvent().addListener(this);
setStorageDomain(new ListModel<StorageDomain>());
getStorageDomain().setIsEmpty(true);
getStorageDomain().getSelectedItemChangedEvent().addListener(this);
setQuota(new ListModel<Quota>());
getQuota().setIsEmpty(true);
setImportAsTemplate(new EntityModel<Boolean>());
getImportAsTemplate().setEntity(false);
setTemplateName(new EntityModel<String>());
getTemplateName().setEntity(""); //$NON-NLS-1$
setOkCommand(new UICommand("Ok", this)); //$NON-NLS-1$
getOkCommand().setTitle(constants.ok());
getOkCommand().setIsDefault(true);
getOkCommand().setIsExecutionAllowed(false);
getCommands().add(getOkCommand());
}
protected void updateDataCenters() {
AsyncCallback<List<StoragePool>> callback = dataCenters -> {
// Sorting by name
Collections.sort(dataCenters, new NameableComparator());
getDataCenter().setItems(dataCenters);
getDataCenter().setIsEmpty(dataCenters.isEmpty());
updateControlsAvailability();
stopProgress();
};
startProgress();
AsyncDataProvider.getInstance().getDataCenterList(new AsyncQuery<>(callback));
}
protected void updateControlsAvailability() {
getDataCenter().setIsChangeable(!getDataCenter().getIsEmpty());
getStorageDomain().setIsChangeable(!getStorageDomain().getIsEmpty());
getCluster().setIsAvailable(getImportAsTemplate().getEntity());
getCluster().setIsChangeable(!getCluster().getIsEmpty());
getTemplateName().setIsAvailable(getImportAsTemplate().getEntity());
getQuota().setIsChangeable(!getQuota().getIsEmpty());
getOkCommand().setIsExecutionAllowed(!getStorageDomain().getIsEmpty());
setMessage(getStorageDomain().getIsEmpty() ? getNoDomainAvailableMessage() : null);
}
protected abstract String getNoDomainAvailableMessage();
protected abstract List<StorageDomain> filterStorageDomains(List<StorageDomain> storageDomains);
protected void updateStorageDomains(Guid storagePoolId) {
AsyncCallback<List<StorageDomain>> callback = returnValue -> {
List<StorageDomain> storageDomains = filterStorageDomains(returnValue);
getStorageDomain().setItems(storageDomains);
getStorageDomain().setIsEmpty(storageDomains.isEmpty());
updateControlsAvailability();
stopProgress();
};
startProgress();
if (storagePoolId != null) {
AsyncDataProvider.getInstance().getStorageDomainList(new AsyncQuery<>(callback), storagePoolId);
} else {
AsyncDataProvider.getInstance().getStorageDomainList(new AsyncQuery<>(callback));
}
}
protected void updateClusters(Guid storagePoolId) {
AsyncCallback<List<Cluster>> callback = returnValue -> {
List<Cluster> clusters = AsyncDataProvider.getInstance().filterClustersWithoutArchitecture(returnValue);
getCluster().setItems(clusters);
getCluster().setIsEmpty(clusters.isEmpty());
updateControlsAvailability();
stopProgress();
};
startProgress();
if (storagePoolId != null) {
AsyncDataProvider.getInstance().getClusterList(new AsyncQuery<>(callback), storagePoolId);
} else {
AsyncDataProvider.getInstance().getClusterList(new AsyncQuery<>(callback));
}
}
protected QuotaEnforcementTypeEnum getDataCenterQuotaEnforcementType() {
StoragePool dataCenter = getDataCenter().getSelectedItem();
return (dataCenter == null) ? null : dataCenter.getQuotaEnforcementType();
}
private void updateQuotas() {
StorageDomain storageDomain = getStorageDomain().getSelectedItem();
if (getDataCenterQuotaEnforcementType() == QuotaEnforcementTypeEnum.DISABLED || storageDomain == null) {
getQuota().setItems(null);
getQuota().setIsEmpty(true);
updateControlsAvailability();
return;
}
startProgress();
AsyncDataProvider.getInstance().getAllRelevantQuotasForStorageSorted(new AsyncQuery<>(
quotas -> {
quotas = (quotas != null) ? quotas : new ArrayList<Quota>();
getQuota().setItems(quotas);
getQuota().setIsEmpty(quotas.isEmpty());
updateControlsAvailability();
stopProgress();
}), storageDomain.getId(), null);
}
protected void cancel() {
stopProgress();
((ListModel) getEntity()).setWindow(null);
}
protected void dataCenter_SelectedItemChanged() {
updateStorageDomains(getDataCenter().getSelectedItem().getId());
updateClusters(getDataCenter().getSelectedItem().getId());
}
protected void storageDomain_SelectedItemChanged() {
updateQuotas();
}
@Override
public void eventRaised(Event ev, Object sender, EventArgs args) {
super.eventRaised(ev, sender, args);
if (ev.matchesDefinition(selectedItemChangedEventDefinition)) {
if (sender == getDataCenter()) {
dataCenter_SelectedItemChanged();
}
if (sender == getStorageDomain()) {
storageDomain_SelectedItemChanged();
}
}
}
public abstract boolean isImportModel();
}