package org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.affinity_groups.model; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.scheduling.AffinityGroup; import org.ovirt.engine.core.common.scheduling.EntityAffinityRule; import org.ovirt.engine.core.common.scheduling.parameters.AffinityGroupCRUDParameters; import org.ovirt.engine.core.compat.Guid; 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.models.EntityModel; import org.ovirt.engine.ui.uicommonweb.models.ListModel; import org.ovirt.engine.ui.uicommonweb.models.Model; import org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.affinity_groups.VmsSelectionModel; import org.ovirt.engine.ui.uicommonweb.validation.AsciiOrNoneValidation; import org.ovirt.engine.ui.uicommonweb.validation.I18NNameValidation; import org.ovirt.engine.ui.uicommonweb.validation.IValidation; import org.ovirt.engine.ui.uicommonweb.validation.LengthValidation; import org.ovirt.engine.ui.uicommonweb.validation.NotEmptyValidation; public abstract class AffinityGroupModel extends Model { private final AffinityGroup affinityGroup; private final ListModel<?> sourceListModel; private final VdcActionType saveActionType; private EntityModel<String> name; private EntityModel<String> description; private ListModel<EntityAffinityRule> vmAffinityRule; private EntityModel<Boolean> enforcing; private VmsSelectionModel vmsSelectionModel; private final Guid clusterId; private final String clusterName; public AffinityGroupModel(AffinityGroup affinityGroup, ListModel<?> sourceListModel, VdcActionType saveActionType, Guid clusterId, String clusterName) { this.affinityGroup = affinityGroup; this.sourceListModel = sourceListModel; this.saveActionType = saveActionType; this.clusterId = clusterId; this.clusterName = clusterName; setName(new EntityModel<String>()); setDescription(new EntityModel<String>()); setVmAffinityRule(new ListModel<EntityAffinityRule>()); vmAffinityRule.setItems(Arrays.asList(EntityAffinityRule.values()), EntityAffinityRule.DISABLED); setEnforcing(new EntityModel<>(true)); enforcing.setIsChangeable(false); vmAffinityRule.getSelectedItemChangedEvent().addListener((ev, sender, args) -> enforcing.setIsChangeable(vmAffinityRule.getSelectedItem() != EntityAffinityRule.DISABLED)); setVmsSelectionModel(new VmsSelectionModel()); addCommands(); } public void init() { startProgress(); //TODO: should be by cluster id and remove clusterName method from resolver. AsyncDataProvider.getInstance().getVmListByClusterName(new AsyncQuery<>(vmList -> { List<Guid> vmIds = getAffinityGroup().getVmIds(); getVmsSelectionModel().init(vmList, vmIds != null ? vmIds : new ArrayList<Guid>()); stopProgress(); }), clusterName); } protected AffinityGroup getAffinityGroup() { return affinityGroup; } protected void addCommands() { UICommand command = UICommand.createDefaultOkUiCommand("OnSave", this); //$NON-NLS-1$ getCommands().add(command); getCommands().add(UICommand.createCancelUiCommand("Cancel", this)); //$NON-NLS-1$ } public EntityModel<String> getName() { return name; } private void setName(EntityModel<String> name) { this.name = name; } public EntityModel<String> getDescription() { return description; } private void setDescription(EntityModel<String> description) { this.description = description; } public ListModel<EntityAffinityRule> getVmAffinityRule() { return vmAffinityRule; } private void setVmAffinityRule(ListModel<EntityAffinityRule> vmAffinityRule) { this.vmAffinityRule = vmAffinityRule; } public EntityModel<Boolean> getEnforcing() { return enforcing; } private void setEnforcing(EntityModel<Boolean> enforcing) { this.enforcing = enforcing; } public VmsSelectionModel getVmsSelectionModel() { return vmsSelectionModel; } private void setVmsSelectionModel(VmsSelectionModel vmsSelectionModel) { this.vmsSelectionModel = vmsSelectionModel; } protected void cancel() { sourceListModel.setWindow(null); sourceListModel.setConfirmWindow(null); } void onSave() { if (!validate()) { return; } if (getProgress() != null) { return; } AffinityGroup group = getAffinityGroup(); group.setName(getName().getEntity()); group.setDescription(getDescription().getEntity()); group.setClusterId(clusterId); group.setVmEnforcing(getEnforcing().getEntity()); group.setVmAffinityRule(getVmAffinityRule().getSelectedItem()); group.setVmIds(getVmsSelectionModel().getSelectedVmIds()); startProgress(); Frontend.getInstance().runAction(saveActionType, new AffinityGroupCRUDParameters(group.getId(), group), result -> { stopProgress(); if (result != null && result.getReturnValue() != null && result.getReturnValue().getSucceeded()) { cancel(); } }, this); } protected boolean validate() { getName().validateEntity(new IValidation[] { new NotEmptyValidation(), new LengthValidation(255), new I18NNameValidation() }); getDescription().validateEntity(new IValidation[] { new AsciiOrNoneValidation() }); return getName().getIsValid() && getDescription().getIsValid(); } @Override public void executeCommand(UICommand command) { super.executeCommand(command); if ("OnSave".equals(command.getName())) { //$NON-NLS-1$ onSave(); } else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ cancel(); } } }