package org.eclipse.emf.emfstore.client.ui.views.emfstorebrowser.dialogs.admin;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.emf.emfstore.client.ui.views.users.UserUiController;
import org.eclipse.emf.emfstore.server.model.ProjectInfo;
import org.eclipse.emf.emfstore.server.model.accesscontrol.ACOrgUnit;
import org.eclipse.emf.emfstore.server.model.accesscontrol.ACUser;
import org.eclipse.emf.emfstore.server.model.accesscontrol.PermissionSet;
import org.eclipse.emf.emfstore.server.model.accesscontrol.Role;
import org.eclipse.emf.emfstore.server.model.accesscontrol.RoleAssignment;
import org.eclipse.jface.wizard.Wizard;
/**
* assign project roles for a specific project to users
*
* @author boehlke
*/
public class AssignRolesWizard extends Wizard {
private ProjectInfo projectInfo;
private PermissionSet permissionSet;
private SelectRolesPage selectRolesPage;
/**
* will be filled by ChooseUsersPage
*/
private Set<ACUser> selectedUsers = new HashSet<ACUser>() {
private static final long serialVersionUID = 4424369725696447623L;
@Override
public boolean add(ACUser user) {
boolean add = super.add(user);
update();
return add;
};
@Override
public boolean remove(Object o) {
boolean remove = super.remove(o);
update();
return remove;
}
private void update() {
getContainer().updateButtons();
getContainer().updateMessage();
selectRolesPage.usersUpdated();
};
};
private AssignRoleSummaryPage summaryPage;
private ArrayList<RoleAssignmentData> addedAssignments;
private ArrayList<RoleAssignmentData> removedAssignments;
private UserUiController controller;
public AssignRolesWizard(ProjectInfo projectInfo, PermissionSet permissionSet) {
setWindowTitle("Assign project roles");
this.projectInfo = projectInfo;
this.permissionSet = permissionSet;
controller = UserUiController.getInstance();
controller.registerPermissionSetListener();
}
void update() {
getContainer().updateButtons();
getContainer().updateMessage();
getContainer().updateTitleBar();
}
@Override
public void addPages() {
addPage(new ChooseUsersPage(this));
selectRolesPage = new SelectRolesPage(getShell(), this);
addPage(selectRolesPage);
summaryPage = new AssignRoleSummaryPage(this);
addPage(summaryPage);
}
@Override
public boolean performFinish() {
controller.assignAndRemoveRoles(EcoreUtil.copy(projectInfo.getProjectId()), addedAssignments,
removedAssignments);
return true;
}
public ProjectInfo getProjectInfo() {
return projectInfo;
}
public PermissionSet getPermissionSet() {
return permissionSet;
}
public Set<ACUser> getSelectedUsers() {
return selectedUsers;
}
@Override
public boolean canFinish() {
if (getSelectedUsers().size() == 0) {
return false;
}
return roleAssignmentsChanged();
}
/**
* calculates, if the role assignments changed
*
* @return
*/
public boolean roleAssignmentsChanged() {
removedAssignments = new ArrayList<RoleAssignmentData>();
addedAssignments = new ArrayList<RoleAssignmentData>();
for (ACOrgUnit orgUnit : getSelectedUsers()) {
for (RoleAssignment role : orgUnit.getRoles()) {
if (role.getProjectId() == null || !role.getProjectId().equals(projectInfo.getProjectId())) {
continue;
}
if (!selectRolesPage.isSelected(orgUnit, role.getRole())) {
removedAssignments.add(new RoleAssignmentData(role.getRole(), orgUnit));
}
}
for (Role role : getPermissionSet().getRoles()) {
boolean selected = selectRolesPage.isSelected(orgUnit, role);
boolean hasProjectRole = orgUnit.hasProjectRole(role, projectInfo.getProjectId());
if (selected && !hasProjectRole) {
addedAssignments.add(new RoleAssignmentData(role, orgUnit));
}
}
}
return removedAssignments.size() > 0 || addedAssignments.size() > 0;
}
public Collection<RoleAssignmentData> getAddedRoles() {
roleAssignmentsChanged();
return addedAssignments;
}
public Collection<RoleAssignmentData> getRemovedRoles() {
roleAssignmentsChanged();
return removedAssignments;
}
}