package org.ovirt.engine.ui.uicommonweb.models.configure.roles_ui; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import org.ovirt.engine.core.common.action.ActionGroupsToRoleParameter; import org.ovirt.engine.core.common.action.RoleWithActionGroupsParameters; import org.ovirt.engine.core.common.action.RolesOperationsParameters; import org.ovirt.engine.core.common.action.RolesParameterBase; import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.action.VdcReturnValueBase; import org.ovirt.engine.core.common.businessentities.ActionGroup; import org.ovirt.engine.core.common.businessentities.Role; import org.ovirt.engine.core.common.businessentities.RoleType; import org.ovirt.engine.core.common.businessentities.comparators.NameableComparator; 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.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.HasEntity; import org.ovirt.engine.ui.uicommonweb.models.ListWithSimpleDetailsModel; import org.ovirt.engine.ui.uicommonweb.models.common.SelectionTreeNodeModel; import org.ovirt.engine.ui.uicompat.ConstantsManager; import org.ovirt.engine.ui.uicompat.Event; import org.ovirt.engine.ui.uicompat.EventArgs; import com.google.inject.Inject; @SuppressWarnings("unused") public class RoleListModel extends ListWithSimpleDetailsModel<Void, Role> { public static final String COPY_OF = "Copy_of_"; //$NON-NLS-1$ public enum CommandType { New, Edit, Clone; public int getValue() { return this.ordinal(); } public static CommandType forValue(int value) { return values()[value]; } } private UICommand privateNewCommand; public UICommand getNewCommand() { return privateNewCommand; } private void setNewCommand(UICommand value) { privateNewCommand = value; } private UICommand privateEditCommand; @Override public UICommand getEditCommand() { return privateEditCommand; } private void setEditCommand(UICommand value) { privateEditCommand = value; } private UICommand privateRemoveCommand; public UICommand getRemoveCommand() { return privateRemoveCommand; } private void setRemoveCommand(UICommand value) { privateRemoveCommand = value; } private UICommand privateCloneCommand; public UICommand getCloneCommand() { return privateCloneCommand; } private void setCloneCommand(UICommand value) { privateCloneCommand = value; } private UICommand privateSearchAllRolesCommand; public UICommand getSearchAllRolesCommand() { return privateSearchAllRolesCommand; } private void setSearchAllRolesCommand(UICommand value) { privateSearchAllRolesCommand = value; } private UICommand privateSearchAdminRolesCommand; public UICommand getSearchAdminRolesCommand() { return privateSearchAdminRolesCommand; } private void setSearchAdminRolesCommand(UICommand value) { privateSearchAdminRolesCommand = value; } private UICommand privateSearchUserRolesCommand; public UICommand getSearchUserRolesCommand() { return privateSearchUserRolesCommand; } private void setSearchUserRolesCommand(UICommand value) { privateSearchUserRolesCommand = value; } private CommandType commandType = CommandType.values()[0]; public ArrayList<ActionGroup> publicAttachedActions = new ArrayList<>(); public ArrayList<ActionGroup> detachActionGroup; public ArrayList<ActionGroup> attachActionGroup; public Role role; private RoleType privateItemsFilter; public RoleType getItemsFilter() { return privateItemsFilter; } public void setItemsFilter(RoleType value) { privateItemsFilter = value; } @Inject public RoleListModel(final RolePermissionListModel rolePermissionListModel) { setDetailList(rolePermissionListModel); setTitle(ConstantsManager.getInstance().getConstants().rolesTitle()); setNewCommand(new UICommand("New", this)); //$NON-NLS-1$ setEditCommand(new UICommand("Edit", this)); //$NON-NLS-1$ setRemoveCommand(new UICommand("Remove", this)); //$NON-NLS-1$ setCloneCommand(new UICommand("Clone", this)); //$NON-NLS-1$ setSearchAllRolesCommand(new UICommand("SearchAllRoles", this)); //$NON-NLS-1$ setSearchAdminRolesCommand(new UICommand("SearchAdminRoles", this)); //$NON-NLS-1$ setSearchUserRolesCommand(new UICommand("SearchUserRoles", this)); //$NON-NLS-1$ setSearchPageSize(1000); updateActionAvailability(); } private void setDetailList(final RolePermissionListModel rolePermissionListModel) { List<HasEntity<Role>> list = new ArrayList<>(); list.add(rolePermissionListModel); setDetailModels(list); } @Override protected void syncSearch() { super.syncSearch(); VdcQueryParametersBase tempVar = new VdcQueryParametersBase (); tempVar.setRefresh(getIsQueryFirstTime()); Frontend.getInstance().runQuery(VdcQueryType.GetAllRoles, tempVar, new AsyncQuery<VdcQueryReturnValue>(returnValue -> { ArrayList<Role> filteredList = new ArrayList<>(); for (Role item : (ArrayList<Role>) returnValue.getReturnValue()) { // ignore CONSUME_QUOTA_ROLE in UI if (item.getId().equals(ApplicationGuids.quotaConsumer.asGuid())) { continue; } if (getItemsFilter() == null || getItemsFilter() == item.getType()) { filteredList.add(item); } } Collections.sort(filteredList, new NameableComparator()); setItems(filteredList); })); setIsQueryFirstTime(false); } private void searchAllRoles() { setItemsFilter(null); getSearchCommand().execute(); } private void searchUserRoles() { setItemsFilter(RoleType.USER); getSearchCommand().execute(); } private void searchAdminRoles() { setItemsFilter(RoleType.ADMIN); getSearchCommand().execute(); } public void remove() { if (getWindow() != null) { return; } ConfirmationModel model = new ConfirmationModel(); setWindow(model); model.setTitle(ConstantsManager.getInstance().getConstants().removeRolesTitle()); model.setHelpTag(HelpTag.remove_role); model.setHashName("remove_role"); //$NON-NLS-1$ ArrayList<String> list = new ArrayList<>(); for (Role role : getSelectedItems()) { list.add(role.getName()); } 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); } public void onRemove() { for (Object item : getSelectedItems()) { Role role = (Role) item; Frontend.getInstance().runAction(VdcActionType.RemoveRole, new RolesParameterBase(role.getId())); } cancel(); // Execute search to keep list updated. getSearchCommand().execute(); } public void edit() { commandType = CommandType.Edit; Role role = getSelectedItem(); initRoleDialog(role); } public void newEntity() { commandType = CommandType.New; Role role = new Role(); initRoleDialog(role); } public void cloneRole() { commandType = CommandType.Clone; Role role = getSelectedItem(); initRoleDialog(role); } @Override public void eventRaised(Event ev, Object sender, EventArgs args) { super.eventRaised(ev, sender, args); if (getWindow() != null && sender == ((RoleModel) getWindow()).getIsAdminRole()) { if (commandType == CommandType.New) { List<ActionGroup> selectedActionGroups = new ArrayList<>(); selectedActionGroups.add(ActionGroup.LOGIN); setAttachedActionGroups(selectedActionGroups); } else { Role role = getSelectedItem(); Frontend.getInstance().runQuery( VdcQueryType.GetRoleActionGroupsByRoleId, new IdQueryParameters(role.getId()), new AsyncQuery<VdcQueryReturnValue>(returnValue -> { publicAttachedActions = returnValue.getReturnValue(); setAttachedActionGroups(publicAttachedActions); })); } } } void setAttachedActionGroups(List<ActionGroup> attachedActions) { Role role = getSelectedItem(); RoleModel model = (RoleModel) getWindow(); ArrayList<SelectionTreeNodeModel> selectionTree = RoleTreeView.getRoleTreeView(model.getIsNew() ? false : role.isReadonly(), model.getIsAdminRole().getEntity()); for (SelectionTreeNodeModel sm : selectionTree) { for (SelectionTreeNodeModel smChild : sm.getChildren()) { smChild.setParent(sm); smChild.setIsSelectedNotificationPrevent(false); for (SelectionTreeNodeModel smGrandChild : smChild.getChildren()) { smGrandChild.setParent(smChild); smGrandChild.setIsSelectedNotificationPrevent(false); if (attachedActions.contains(ActionGroup.valueOf(smGrandChild.getTitle()))) { smGrandChild.setIsSelectedNullable(true); smGrandChild.updateParentSelection(); } if (smChild.getChildren().get(0).equals(smGrandChild)) { smGrandChild.updateParentSelection(); } } } } model.setPermissionGroupModels(selectionTree); } private void initRoleDialog(Role role) { if (getWindow() != null) { return; } RoleModel model = new RoleModel(); setWindow(model); model.setIsNew(commandType != CommandType.Edit); if (commandType == CommandType.New) { role.setType(RoleType.USER); } model.getIsAdminRole().getEntityChangedEvent().addListener(this); model.getIsAdminRole().setEntity(RoleType.ADMIN.equals(role.getType())); model.getName().setEntity(role.getName()); if (commandType == CommandType.Clone) { model.getName().setEntity(COPY_OF + role.getName()); } model.getDescription().setEntity(role.getDescription()); if (commandType == CommandType.Edit) { model.getName().setIsChangeable(!role.isReadonly()); model.getDescription().setIsChangeable(!role.isReadonly()); } switch (commandType) { case New: model.setTitle(ConstantsManager.getInstance().getConstants().newRoleTitle()); model.setHelpTag(HelpTag.new_role); model.setHashName("new_role"); //$NON-NLS-1$ break; case Edit: model.setTitle(ConstantsManager.getInstance().getConstants().editRoleTitle()); model.setHelpTag(HelpTag.edit_role); model.setHashName("edit_role"); //$NON-NLS-1$ model.getIsAdminRole().setIsChangeable(false); break; case Clone: model.setTitle(ConstantsManager.getInstance().getConstants().copyRoleTitle()); model.setHelpTag(HelpTag.copy_role); model.setHashName("copy_role"); //$NON-NLS-1$ model.getIsAdminRole().setIsChangeable(false); break; } if (!role.isReadonly() || commandType == CommandType.Clone) { UICommand tempVar = UICommand.createDefaultOkUiCommand("OnSave", this); //$NON-NLS-1$ model.getCommands().add(tempVar); UICommand tempVar2 = new UICommand("OnReset", this); //$NON-NLS-1$ tempVar2.setTitle(ConstantsManager.getInstance().getConstants().resetTitle()); model.getCommands().add(tempVar2); } UICommand tempVar3 = new UICommand("Cancel", this); //$NON-NLS-1$ tempVar3.setTitle(!role.isReadonly() ? ConstantsManager.getInstance().getConstants().cancel() : ConstantsManager.getInstance().getConstants().close()); tempVar3.setIsCancel(true); tempVar3.setIsDefault(role.isReadonly()); model.getCommands().add(tempVar3); } public void onReset() { RoleModel model = (RoleModel) getWindow(); ArrayList<ActionGroup> attachedActions = commandType == CommandType.New ? new ArrayList<ActionGroup>() : publicAttachedActions; for (SelectionTreeNodeModel sm : model.getPermissionGroupModels()) { for (SelectionTreeNodeModel smChild : sm.getChildren()) { for (SelectionTreeNodeModel smGrandChild : smChild.getChildren()) { smGrandChild.setIsSelectedNullable(attachedActions.contains(ActionGroup.valueOf(smGrandChild.getTitle()))); } } } } public void onSave() { RoleModel model = (RoleModel) getWindow(); if (model.getProgress() != null) { return; } role = commandType != CommandType.Edit ? new Role() : getSelectedItem(); role.setType(model.getIsAdminRole().getEntity() ? RoleType.ADMIN : RoleType.USER); if (!model.validate()) { return; } role.setName(model.getName().getEntity()); role.setDescription(model.getDescription().getEntity()); ArrayList<ActionGroup> actions = new ArrayList<>(); HashMap<ActionGroup, ActionGroup> actionDistinctSet = new HashMap<>(); for (SelectionTreeNodeModel sm : model.getPermissionGroupModels()) { for (SelectionTreeNodeModel smChild : sm.getChildren()) { if (smChild.getIsSelectedNullable() == null || smChild.getIsSelectedNullable()) { for (SelectionTreeNodeModel smGrandChild : smChild.getChildren()) { if (smGrandChild.getIsSelectedNullable()) { ActionGroup actionGroup = ActionGroup.valueOf(smGrandChild.getTitle()); if (actionDistinctSet.containsKey(actionGroup)) { continue; } actionDistinctSet.put(actionGroup, actionGroup); actions.add(actionGroup); } } } } } VdcReturnValueBase returnValue; model.startProgress(); if (commandType != CommandType.Edit) { // Add a new role. RoleWithActionGroupsParameters tempVar = new RoleWithActionGroupsParameters(); tempVar.setRole(role); tempVar.setActionGroups(actions); Frontend.getInstance().runAction(VdcActionType.AddRoleWithActionGroups, tempVar, result -> { RoleListModel localModel = (RoleListModel) result.getState(); localModel.postOnSaveNew(result.getReturnValue()); }, this); } else { detachActionGroup = new ArrayList<>(publicAttachedActions); detachActionGroup.removeAll(actions); attachActionGroup = actions; attachActionGroup.removeAll(publicAttachedActions); Frontend.getInstance().runAction(VdcActionType.UpdateRole, new RolesOperationsParameters(role), result -> { RoleListModel roleListModel = (RoleListModel) result.getState(); VdcReturnValueBase retVal = result.getReturnValue(); if (retVal != null && retVal.getSucceeded()) { if (roleListModel.detachActionGroup.size() > 0) { ActionGroupsToRoleParameter tempVar2 = new ActionGroupsToRoleParameter(); tempVar2.setActionGroups(roleListModel.detachActionGroup); tempVar2.setRoleId(roleListModel.role.getId()); Frontend.getInstance().runAction(VdcActionType.DetachActionGroupsFromRole, tempVar2); } if (roleListModel.attachActionGroup.size() > 0) { ActionGroupsToRoleParameter tempVar3 = new ActionGroupsToRoleParameter(); tempVar3.setActionGroups(roleListModel.attachActionGroup); tempVar3.setRoleId(roleListModel.role.getId()); Frontend.getInstance().runAction(VdcActionType.AttachActionGroupsToRole, tempVar3); } roleListModel.getWindow().stopProgress(); roleListModel.cancel(); } else { roleListModel.getWindow().stopProgress(); } }, this); } } public void postOnSaveNew(VdcReturnValueBase returnValue) { RoleModel model = (RoleModel) getWindow(); model.stopProgress(); if (returnValue != null && returnValue.getSucceeded()) { cancel(); getSearchCommand().execute(); } } public void cancel() { setWindow(null); } @Override protected void onSelectedItemChanged() { super.onSelectedItemChanged(); updateActionAvailability(); } @Override protected void selectedItemsChanged() { super.selectedItemsChanged(); updateActionAvailability(); } private void updateActionAvailability() { boolean temp = getSelectedItems() != null && getSelectedItems().size() == 1; getCloneCommand().setIsExecutionAllowed(temp); getEditCommand().setIsExecutionAllowed(temp); getRemoveCommand().setIsExecutionAllowed(getSelectedItems() != null && getSelectedItems().size() > 0 && !isAnyRoleReadOnly(getSelectedItems())); } private boolean isAnyRoleReadOnly(List roles) { for (Object item : roles) { Role r = (Role) item; if (r.isReadonly()) { return true; } } return false; } @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 (command == getSearchAllRolesCommand()) { searchAllRoles(); } else if (command == getSearchAdminRolesCommand()) { searchAdminRoles(); } else if (command == getSearchUserRolesCommand()) { searchUserRoles(); } else if ("OnSave".equals(command.getName())) { //$NON-NLS-1$ onSave(); } else if ("Cancel".equals(command.getName())) { //$NON-NLS-1$ cancel(); } else if ("OnRemove".equals(command.getName())) { //$NON-NLS-1$ onRemove(); } else if ("OnReset".equals(command.getName())) { //$NON-NLS-1$ onReset(); } else if ("Clone".equals(command.getName())) { //$NON-NLS-1$ cloneRole(); } } @Override protected String getListName() { return "RoleListModel"; //$NON-NLS-1$ } }