package org.ovirt.engine.ui.uicommonweb.models.quota;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.PermissionsOperationsParameters;
import org.ovirt.engine.core.common.action.VdcActionParametersBase;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.businessentities.Permission;
import org.ovirt.engine.core.common.businessentities.Quota;
import org.ovirt.engine.core.common.businessentities.aaa.DbGroup;
import org.ovirt.engine.core.common.businessentities.aaa.DbUser;
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.UICommand;
import org.ovirt.engine.ui.uicommonweb.auth.ApplicationGuids;
import org.ovirt.engine.ui.uicommonweb.help.HelpTag;
import org.ovirt.engine.ui.uicommonweb.models.ConfirmationModel;
import org.ovirt.engine.ui.uicommonweb.models.EntityModel;
import org.ovirt.engine.ui.uicommonweb.models.SearchableListModel;
import org.ovirt.engine.ui.uicommonweb.models.users.AdElementListModel;
import org.ovirt.engine.ui.uicommonweb.models.users.AdElementListModel.AdSearchType;
import org.ovirt.engine.ui.uicompat.ConstantsManager;
public class QuotaUserListModel extends SearchableListModel<Quota, Permission> {
public QuotaUserListModel() {
setTitle(ConstantsManager.getInstance().getConstants().usersTitle());
setHelpTag(HelpTag.users);
setHashName("users"); //$NON-NLS-1$
setAddCommand(new UICommand("Add", this)); //$NON-NLS-1$
setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$
updateActionAvailability();
}
private UICommand privateAddCommand;
public UICommand getAddCommand() {
return privateAddCommand;
}
private void setAddCommand(UICommand value) {
privateAddCommand = value;
}
private UICommand privateRemoveCommand;
public UICommand getRemoveCommand() {
return privateRemoveCommand;
}
private void setRemoveCommand(UICommand value) {
privateRemoveCommand = value;
}
@Override
protected void syncSearch() {
super.syncSearch();
IdQueryParameters param = new IdQueryParameters(getEntity().getId());
param.setRefresh(getIsQueryFirstTime());
param.setRefresh(getIsQueryFirstTime());
Frontend.getInstance().runQuery(VdcQueryType.GetPermissionsToConsumeQuotaByQuotaId, param, new AsyncQuery<VdcQueryReturnValue>(returnValue -> {
ArrayList<Permission> list = returnValue.getReturnValue();
Map<Guid, Permission> map = new HashMap<>();
for (Permission permission : list) {
//filter out sys-admin and dc admin from consumers sub-tab
if (permission.getRoleId().equals(ApplicationGuids.superUser.asGuid())
|| permission.getRoleId().equals(ApplicationGuids.dataCenterAdmin.asGuid())) {
continue;
}
if (!map.containsKey(permission.getAdElementId())) {
map.put(permission.getAdElementId(), permission);
} else {
if (map.get(permission.getAdElementId())
.getRoleId()
.equals(ApplicationGuids.quotaConsumer.asGuid())) {
map.put(permission.getAdElementId(), permission);
}
}
}
list.clear();
for (Permission permission : map.values()) {
list.add(permission);
}
setItems(list);
}));
setIsQueryFirstTime(false);
}
@Override
protected void onEntityChanged() {
super.onEntityChanged();
if (getEntity() == null) {
return;
}
getSearchCommand().execute();
updateActionAvailability();
}
@Override
protected void selectedItemsChanged() {
super.selectedItemsChanged();
updateActionAvailability();
}
@Override
protected String getListName() {
return "QuotaUserListModel"; //$NON-NLS-1$
}
private void updateActionAvailability() {
ArrayList<Permission> items =
(getSelectedItems() != null) ? (ArrayList<Permission>) getSelectedItems()
: new ArrayList<Permission>();
boolean removeExe = false;
if (items.size() > 0) {
removeExe = true;
}
for (Permission perm : items) {
if (!perm.getRoleId().equals(ApplicationGuids.quotaConsumer.asGuid())) {
removeExe = false;
break;
}
}
getRemoveCommand().setIsExecutionAllowed(removeExe);
}
public void add() {
if (getWindow() != null) {
return;
}
AdElementListModel model = new AdElementListModel();
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().assignUsersAndGroupsToQuotaTitle());
model.setHelpTag(HelpTag.assign_users_and_groups_to_quota);
model.setHashName("assign_users_and_groups_to_quota"); //$NON-NLS-1$
model.setIsRoleListHidden(true);
model.getIsEveryoneSelectionHidden().setEntity(false);
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnAdd", this); //$NON-NLS-1$
model.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(tempVar2);
}
public void remove() {
if (getWindow() != null) {
return;
}
ConfirmationModel model = new ConfirmationModel();
setWindow(model);
model.setTitle(ConstantsManager.getInstance().getConstants().removeQuotaAssignmentFromUsersTitle());
model.setHelpTag(HelpTag.remove_quota_assignment_from_user);
model.setHashName("remove_quota_assignment_from_user"); //$NON-NLS-1$
ArrayList<String> list = new ArrayList<>();
for (Permission item : getSelectedItems()) {
list.add(item.getOwnerName());
}
model.setItems(list);
UICommand tempVar = UICommand.createDefaultOkUiCommand("OnRemove", this); //$NON-NLS-1$
model.getCommands().add(tempVar);
UICommand tempVar2 = UICommand.createCancelUiCommand("Cancel", this); //$NON-NLS-1$
model.getCommands().add(tempVar2);
}
private void cancel() {
setWindow(null);
}
public void onAdd() {
AdElementListModel model = (AdElementListModel) getWindow();
if (model.getProgress() != null) {
return;
}
if (model.getSelectedItems() == null && model.getSearchType() != AdSearchType.EVERYONE) {
cancel();
return;
}
ArrayList<DbUser> items = new ArrayList<>();
if (model.getSearchType() == AdSearchType.EVERYONE) {
DbUser tempVar = new DbUser();
tempVar.setId(ApplicationGuids.everyone.asGuid());
items.add(tempVar);
}
else {
for (Object item : model.getItems()) {
EntityModel entityModel = (EntityModel) item;
if (entityModel.getIsSelected()) {
items.add((DbUser) entityModel.getEntity());
}
}
}
model.startProgress();
ArrayList<VdcActionParametersBase> list = new ArrayList<>();
PermissionsOperationsParameters permissionParams;
for (DbUser user : items) {
Permission perm = new Permission(
user.getId(),
ApplicationGuids.quotaConsumer.asGuid(),
getEntity().getId(),
VdcObjectType.Quota);
permissionParams = new PermissionsOperationsParameters();
if (user.isGroup()) {
DbGroup group = new DbGroup();
group.setId(user.getId());
group.setExternalId(user.getExternalId());
group.setName(user.getFirstName());
group.setDomain(user.getDomain());
permissionParams.setGroup(group);
}
else {
permissionParams.setUser(user);
}
permissionParams.setPermission(perm);
list.add(permissionParams);
}
Frontend.getInstance().runMultipleAction(VdcActionType.AddPermission, list,
result -> {
QuotaUserListModel localModel = (QuotaUserListModel) result.getState();
localModel.stopProgress();
cancel();
}, model);
cancel();
}
private void onRemove() {
if (getSelectedItems() != null && getSelectedItems().size() > 0) {
ConfirmationModel model = (ConfirmationModel) getWindow();
if (model.getProgress() != null) {
return;
}
ArrayList<VdcActionParametersBase> list = new ArrayList<>();
for (Object perm : getSelectedItems()) {
PermissionsOperationsParameters tempVar = new PermissionsOperationsParameters();
tempVar.setPermission((Permission) perm);
list.add(tempVar);
}
model.startProgress();
Frontend.getInstance().runMultipleAction(VdcActionType.RemovePermission, list,
result -> {
ConfirmationModel localModel = (ConfirmationModel) result.getState();
localModel.stopProgress();
cancel();
}, model);
}
cancel();
}
@Override
public void executeCommand(UICommand command) {
super.executeCommand(command);
if (command == getAddCommand()) {
add();
}
if (command == getRemoveCommand()) {
remove();
}
if ("Cancel".equals(command.getName())) { //$NON-NLS-1$
cancel();
}
if ("OnAdd".equals(command.getName())) { //$NON-NLS-1$
onAdd();
}
if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$
onRemove();
}
}
}