package org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.affinity_groups.list;
import java.util.ArrayList;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.BusinessEntity;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryType;
import org.ovirt.engine.core.common.scheduling.AffinityGroup;
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.help.HelpTag;
import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel;
import org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.affinity_groups.model.AffinityGroupModel;
import org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.affinity_groups.model.EditAffinityGroupModel;
import org.ovirt.engine.ui.uicommonweb.models.configure.scheduling.affinity_groups.model.NewAffinityGroupModel;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
public abstract class AffinityGroupListModel<E extends BusinessEntity<Guid>> extends SearchableListModel<E, AffinityGroup> {
private UICommand newCommand;
private UICommand editCommand;
private UICommand removeCommand;
private final VdcQueryType queryType;
public AffinityGroupListModel(VdcQueryType queryType) {
this.queryType = queryType;
setTitle(ConstantsManager.getInstance().getConstants().affinityGroupsTitle());
setHelpTag(HelpTag.affinity_groups);
setHashName("affinity_groups"); // $//$NON-NLS-1$
setNewCommand(new UICommand("New", this)); //$NON-NLS-1$
setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$
setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$
updateActionAvailability();
}
@Override
protected void onEntityChanged() {
super.onEntityChanged();
getSearchCommand().execute();
}
protected abstract Guid getClusterId();
protected abstract String getClusterName();
@Override
protected void selectedItemsChanged() {
super.selectedItemsChanged();
updateActionAvailability();
}
private void updateActionAvailability() {
getNewCommand().setIsExecutionAllowed(true);
boolean hasSelectedItems = getSelectedItems() != null && getSelectedItems().size() > 0;
getEditCommand().setIsExecutionAllowed(hasSelectedItems && getSelectedItems().size() == 1);
getRemoveCommand().setIsExecutionAllowed(hasSelectedItems);
}
@Override
protected void syncSearch() {
if (getEntity() != null) {
super.syncSearch(queryType, new IdQueryParameters(getEntity().getId()));
}
}
public UICommand getNewCommand() {
return newCommand;
}
private void setNewCommand(UICommand newCommand) {
this.newCommand = newCommand;
}
@Override
public UICommand getEditCommand() {
return editCommand;
}
private void setEditCommand(UICommand editCommand) {
this.editCommand = editCommand;
}
public UICommand getRemoveCommand() {
return removeCommand;
}
private void setRemoveCommand(UICommand removeCommand) {
this.removeCommand = removeCommand;
}
private void newEntity() {
if (getWindow() != null) {
return;
}
AffinityGroupModel model =
new NewAffinityGroupModel(getNewAffinityGroup(), this, getClusterId(), getClusterName());
model.init();
setWindow(model);
}
protected AffinityGroup getNewAffinityGroup() {
return new AffinityGroup();
}
private void edit() {
if (getWindow() != null) {
return;
}
AffinityGroup affinityGroup = getSelectedItem();
if (affinityGroup == null) {
return;
}
AffinityGroupModel model = new EditAffinityGroupModel(affinityGroup, this, getClusterId(), getClusterName());
model.init();
setWindow(model);
}
private void remove() {
if (getWindow() != null) {
return;
}
ConfirmationModel model = new ConfirmationModel();
setConfirmWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().removeAffinityGroupsTitle());
model.setHelpTag(HelpTag.remove_affinity_groups);
model.setHashName("remove_affinity_groups"); //$NON-NLS-1$
ArrayList<String> list = new ArrayList<>();
for (AffinityGroup affinityGroup : getSelectedItems()) {
list.add(affinityGroup.getName());
}
model.setItems(list);
UICommand command = UICommand.createDefaultOkUiCommand("OnRemove", this); //$NON-NLS-1$
model.getCommands().add(command);
model.getCommands().add(UICommand.createCancelUiCommand("Cancel", this)); //$NON-NLS-1$
}
private void onRemove() {
ConfirmationModel model = (ConfirmationModel) getConfirmWindow();
if (model.getProgress() != null) {
return;
}
ArrayList<VdcActionParametersBase> parameters = new ArrayList<>();
for (AffinityGroup affinityGroup : getSelectedItems()) {
parameters.add(new AffinityGroupCRUDParameters(affinityGroup.getId(), affinityGroup));
}
model.startProgress();
Frontend.getInstance().runMultipleAction(VdcActionType.RemoveAffinityGroup, parameters,
result -> {
ConfirmationModel localModel = (ConfirmationModel) result.getState();
localModel.stopProgress();
cancel();
}, model);
}
private void cancel() {
setConfirmWindow(null);
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if (command == getNewCommand()) {
newEntity();
}
else if (command == getEditCommand()) {
edit();
}
else if (command == getRemoveCommand()) {
remove();
}
else if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$
onRemove();
}
else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$
cancel();
}
}
@Override
protected String getListName() {
return "AffinityGroupListModel"; //$NON-NLS-1$
}
}