package org.ovirt.engine.ui.uicommonweb.models.datacenters.qos;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import org.ovirt.engine.core.common.action.QosParametersBase;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.Nameable;
import org.ovirt.engine.core.common.businessentities.qos.QosBase;
import org.ovirt.engine.core.common.queries.IdQueryParameters;
import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
import org.ovirt.engine.core.common.queries.VdcQueryReturnValue;
import org.ovirt.engine.core.common.queries.VdcQueryType;
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.ListModel;
import org.ovirt.engine.ui.uicompat.FrontendMultipleQueryAsyncResult;
public abstract class RemoveQosModel<T extends QosBase> extends ConfirmationModel {
protected final ListModel<T> sourceListModel;
public RemoveQosModel(ListModel<T> sourceListModel) {
this.sourceListModel = sourceListModel;
setTitle(getTitle());
setMessage();
addCommands();
}
private void addCommands() {
getCommands().add(UICommand.createDefaultOkUiCommand("onRemove", this)); //$NON-NLS-1$
getCommands().add(UICommand.createCancelUiCommand("cancel", this)); //$NON-NLS-1$
}
@Override
public abstract String getTitle();
protected abstract VdcQueryType getUsingEntitiesByQosIdQueryType();
protected abstract String getRemoveQosMessage(int size);
protected abstract String getRemoveQosHashName();
protected abstract HelpTag getRemoveQosHelpTag();
protected abstract VdcActionType getRemoveActionType();
private void setMessage() {
ArrayList<VdcQueryParametersBase> parameters = new ArrayList<>();
ArrayList<VdcQueryType> queryTypes = new ArrayList<>();
for (T qos : sourceListModel.getSelectedItems()) {
VdcQueryParametersBase parameter = new IdQueryParameters(qos.getId());
parameters.add(parameter);
queryTypes.add(getUsingEntitiesByQosIdQueryType());
}
Frontend.getInstance().runMultipleQueries(queryTypes, parameters, result -> handleSetMessageQueryResult(result));
}
protected void handleSetMessageQueryResult(FrontendMultipleQueryAsyncResult result) {
Map<String, String> entitiesAndQos = new HashMap<>();
setHelpTag(getRemoveQosHelpTag());
setHashName(getRemoveQosHashName());
int index = 0;
for (VdcQueryReturnValue returnValue : result.getReturnValues()) {
for (Nameable entity : (List<Nameable>) returnValue.getReturnValue()) {
entitiesAndQos.put(entity.getName(), sourceListModel.getSelectedItems()
.get(index)
.getName());
}
index++;
}
if (entitiesAndQos.isEmpty()) {
ArrayList<String> list = new ArrayList<>();
for (T item : sourceListModel.getSelectedItems()) {
list.add(item.getName());
}
setItems(list);
} else {
setMessage(getRemoveQosMessage(entitiesAndQos.size()));
ArrayList<String> list = new ArrayList<>();
for (Entry<String, String> item : entitiesAndQos.entrySet()) {
list.add(item.getKey() + " (" + item.getValue() + ")"); //$NON-NLS-1$ //$NON-NLS-2$
}
setItems(list);
}
}
public void onRemove() {
ArrayList<VdcActionParametersBase> parameters = new ArrayList<>();
for (T qos : sourceListModel.getSelectedItems()) {
QosParametersBase<T> parameter = new QosParametersBase<>();
parameter.setQosId(qos.getId());
parameters.add(parameter);
}
Frontend.getInstance().runMultipleAction(getRemoveActionType(), parameters);
cancel();
}
private void cancel() {
sourceListModel.setConfirmWindow(null);
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if ("onRemove".equals(command.getName())) { //$NON-NLS-1$
onRemove();
} else if ("cancel".equals(command.getName())) { //$NON-NLS-1$
cancel();
}
}
}