CCM NG/ccm-core: Fixed several Exceptions when editing Users and Roles

git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4798 8810af33-2d31-482b-a856-94f89814c4df
ccm-docs
jensp 2017-06-22 13:04:32 +00:00
parent 95d9ff0b86
commit bb703b3ab6
7 changed files with 281 additions and 74 deletions

View File

@ -162,6 +162,9 @@ class RoleAddMemberForm extends Form {
switch (event.getColumn()) { switch (event.getColumn()) {
case COL_MEMBER_ADD: case COL_MEMBER_ADD:
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final RolesController controller = cdiUtil
.findBean(RolesController.class);
final PartyRepository partyRepository = cdiUtil final PartyRepository partyRepository = cdiUtil
.findBean(PartyRepository.class); .findBean(PartyRepository.class);
final RoleRepository roleRepository = cdiUtil final RoleRepository roleRepository = cdiUtil
@ -170,10 +173,12 @@ class RoleAddMemberForm extends Form {
RoleManager.class); RoleManager.class);
final Party party = partyRepository.findById( final Party party = partyRepository.findById(
Long.parseLong(key)).get(); Long.parseLong(key)).get();
final Role role = roleRepository.findById( final Role role = roleRepository.findById(
Long.parseLong( Long.parseLong(
selectedRoleId.getSelectedKey(state))).get(); selectedRoleId.getSelectedKey(state))).get();
roleManager.assignRoleToParty(role, party); controller.assignRoleToParty(role, party);
roleAdmin.hideRoleMemberAddForm(state); roleAdmin.hideRoleMemberAddForm(state);
break; break;
default: default:

View File

@ -34,6 +34,7 @@ import com.arsdigita.bebop.table.TableModelBuilder;
import com.arsdigita.globalization.GlobalizedMessage; import com.arsdigita.globalization.GlobalizedMessage;
import com.arsdigita.util.LockableImpl; import com.arsdigita.util.LockableImpl;
import org.libreccm.admin.ui.usersgroupsroles.UsersGroupsRoles;
import org.libreccm.cdi.utils.CdiUtil; import org.libreccm.cdi.utils.CdiUtil;
import org.libreccm.security.Group; import org.libreccm.security.Group;
import org.libreccm.security.Party; import org.libreccm.security.Party;
@ -50,7 +51,7 @@ import static com.arsdigita.ui.admin.AdminUiConstants.*;
/** /**
* Table showing all members (users or groups) of a role. * Table showing all members (users or groups) of a role.
* *
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
class RoleMembersTable extends Table { class RoleMembersTable extends Table {
@ -121,7 +122,8 @@ class RoleMembersTable extends Table {
final Party party = partyRepository.findById(Long final Party party = partyRepository.findById(Long
.parseLong(key)).get(); .parseLong(key)).get();
final Role role = roleRepository.findById( final Role role = roleRepository.findById(
Long.parseLong(selectedRoleId.getSelectedKey(state))).get(); Long.parseLong(selectedRoleId.getSelectedKey(state)))
.get();
roleManager.removeRoleFromParty(role, party); roleManager.removeRoleFromParty(role, party);
break; break;
default: default:
@ -170,20 +172,25 @@ class RoleMembersTable extends Table {
final ParameterSingleSelectionModel<String> selectedRoleId, final ParameterSingleSelectionModel<String> selectedRoleId,
final PageState state) { final PageState state) {
final RoleRepository roleRepository = CdiUtil.createCdiUtil() final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final RoleRepository roleRepository = cdiUtil
.findBean(RoleRepository.class); .findBean(RoleRepository.class);
final Role role = roleRepository.findById(Long.parseLong( final Role role = roleRepository.findById(Long.parseLong(
selectedRoleId.getSelectedKey(state))).get(); selectedRoleId.getSelectedKey(state))).get();
//
// members = new ArrayList<>();
//
// role.getMemberships().forEach(m -> {
// members.add(m.getMember());
// });
//
// members.sort((m1, m2) -> {
// return m1.getName().compareTo(m2.getName());
// });
members = new ArrayList<>(); final RolesController controller = cdiUtil
.findBean(RolesController.class);
role.getMemberships().forEach(m -> { members = controller.getMembersOfRole(role);
members.add(m.getMember());
});
members.sort((m1, m2) -> {
return m1.getName().compareTo(m2.getName());
});
} }
@Override @Override

View File

@ -0,0 +1,88 @@
package com.arsdigita.ui.admin.usersgroupsroles.roles;
import org.libreccm.security.Party;
import org.libreccm.security.PartyRepository;
import org.libreccm.security.Role;
import org.libreccm.security.RoleManager;
import org.libreccm.security.RoleMembership;
import org.libreccm.security.RoleRepository;
import java.util.List;
import java.util.stream.Collectors;
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.transaction.Transactional;
/**
*
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/
@RequestScoped
public class RolesController {
@Inject
private PartyRepository partyRepo;
@Inject
private RoleRepository roleRepo;
@Inject
private RoleManager roleManager;
@Transactional(Transactional.TxType.REQUIRED)
protected List<Party> getMembersOfRole(final Role role) {
final Role theRole = roleRepo
.findById(role.getRoleId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No Role with ID %d in the database.",
role.getRoleId())));
return theRole
.getMemberships()
.stream()
.map(RoleMembership::getMember)
.sorted((role1, role2) -> role1.getName().compareTo(role2.getName()))
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
protected List<String> getNamesOfMembersOfRole(final Role role) {
final Role theRole = roleRepo
.findById(role.getRoleId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No Role with ID %d in the database.",
role.getRoleId())));
return theRole
.getMemberships()
.stream()
.map(RoleMembership::getMember)
.map(Party::getName)
.sorted((name1, name2) -> name1.compareTo(name2))
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
protected void assignRoleToParty(final Role role, final Party party) {
final Party assignee = partyRepo
.findById(party.getPartyId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No Party with ID %d in the database.",
party.getPartyId())));
final Role assignTo = roleRepo
.findById(role.getRoleId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No Role with ID %d in the database.",
role.getRoleId())));
roleManager.assignRoleToParty(assignTo, assignee);
}
}

View File

@ -92,8 +92,8 @@ class GroupsRolesTableModel implements TableModel {
ADMIN_BUNDLE)); ADMIN_BUNDLE));
case COL_VALUE: { case COL_VALUE: {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final UsersGroupsRolesController controller = cdiUtil final UsersController controller = cdiUtil
.findBean(UsersGroupsRolesController.class); .findBean(UsersController.class);
return controller.getNamesOfAssignedGroups(user); return controller.getNamesOfAssignedGroups(user);
} }
@ -112,8 +112,8 @@ class GroupsRolesTableModel implements TableModel {
ADMIN_BUNDLE)); ADMIN_BUNDLE));
case COL_VALUE: { case COL_VALUE: {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final UsersGroupsRolesController controller = cdiUtil final UsersController controller = cdiUtil
.findBean(UsersGroupsRolesController.class); .findBean(UsersController.class);
return controller.getNamesOfAssignedGroups(user); return controller.getNamesOfAssignedGroups(user);
} }
@ -132,8 +132,8 @@ class GroupsRolesTableModel implements TableModel {
"ui.admin.user.all_roles", ADMIN_BUNDLE)); "ui.admin.user.all_roles", ADMIN_BUNDLE));
case COL_VALUE: { case COL_VALUE: {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final UsersGroupsRolesController controller = cdiUtil final UsersController controller = cdiUtil
.findBean(UsersGroupsRolesController.class); .findBean(UsersController.class);
return controller.getNamesOfAllAssignedRoles(user); return controller.getNamesOfAllAssignedRoles(user);
} }

View File

@ -129,19 +129,20 @@ class RoleMembershipsForm extends Form {
saveCancelSection = new SaveCancelSection(); saveCancelSection = new SaveCancelSection();
add(saveCancelSection); add(saveCancelSection);
addInitListener(e -> { addInitListener(event -> {
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final UserRepository userRepository = cdiUtil.findBean( final UserRepository userRepository = cdiUtil
UserRepository.class); .findBean(UserRepository.class);
final UsersController controller = cdiUtil
.findBean(UsersController.class);
final PageState state = e.getPageState(); final PageState state = event.getPageState();
final User user = userRepository.findById(Long.parseLong( final User user = userRepository
selectedUserId.getSelectedKey(state))).get(); .findById(Long.parseLong(selectedUserId.getSelectedKey(state)))
final List<Role> assignedRoles = new ArrayList<>(); .get();
user.getRoleMemberships().forEach(m -> { final List<Role> assignedRoles = controller
assignedRoles.add(m.getRole()); .getAssignedRoles(user);
});
final String[] selectedRoles = new String[assignedRoles.size()]; final String[] selectedRoles = new String[assignedRoles.size()];
IntStream.range(0, assignedRoles.size()).forEach(i -> { IntStream.range(0, assignedRoles.size()).forEach(i -> {
@ -152,56 +153,65 @@ class RoleMembershipsForm extends Form {
roles.setValue(state, selectedRoles); roles.setValue(state, selectedRoles);
}); });
addProcessListener(e -> { addProcessListener(event -> {
final PageState state = e.getPageState(); final PageState state = event.getPageState();
if (saveCancelSection.getSaveButton().isSelected(state)) { if (saveCancelSection.getSaveButton().isSelected(state)) {
final FormData data = e.getFormData(); final FormData data = event.getFormData();
final CdiUtil cdiUtil = CdiUtil.createCdiUtil(); final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
final UserRepository userRepository = cdiUtil.findBean( final UserRepository userRepository = cdiUtil
UserRepository.class); .findBean(UserRepository.class);
final RoleRepository roleRepository = cdiUtil.findBean( final RoleRepository roleRepository = cdiUtil
RoleRepository.class); .findBean(RoleRepository.class);
final RoleManager roleManager = cdiUtil.findBean( final RoleManager roleManager = cdiUtil
RoleManager.class); .findBean(RoleManager.class);
final UsersController controller = cdiUtil
.findBean(UsersController.class);
final String[] selectedRolesIds = (String[]) data.get( final String[] selectedRolesIds = (String[]) data
ROLES_SELECTOR); .get(ROLES_SELECTOR);
final User user = userRepository.findById(Long.parseLong( final User user = userRepository
selectedUserId.getSelectedKey(state))).get(); .findById(Long
.parseLong(selectedUserId.getSelectedKey(state)))
.get();
final List<Role> selectedRoles = new ArrayList<>(); final List<Role> selectedRoles = new ArrayList<>();
if (selectedRolesIds != null) { if (selectedRolesIds != null) {
Arrays.stream(selectedRolesIds).forEach(id -> { Arrays
final Role role = roleRepository.findById( .stream(selectedRolesIds)
Long.parseLong(id)).get(); .forEach(id -> {
selectedRoles.add(role); final Role role = roleRepository
}); .findById(Long.parseLong(id))
.get();
selectedRoles.add(role);
});
} }
final List<Role> assignedRoles = new ArrayList<>();
user.getRoleMemberships().forEach(m -> { controller.updateAssignedRoles(user, selectedRoles);
assignedRoles.add(m.getRole());
}); // final List<Role> assignedRoles = controller
// .getAssignedRoles(user);
//First check for newly added roles //
selectedRoles.forEach(r -> { // //First check for newly added roles
if (!assignedRoles.contains(r)) { // selectedRoles.forEach(role -> {
roleManager.assignRoleToParty(r, user); // if (!assignedRoles.contains(role)) {
} // roleManager.assignRoleToParty(role, user);
}); // }
// });
//Than check for removed roles //
assignedRoles.forEach(r -> { // //Than check for removed roles
if (!selectedRoles.contains(r)) { // assignedRoles.forEach(role -> {
//Role is maybe detached or not fully loaded, // if (!selectedRoles.contains(role)) {
//therefore we load the role from the database. // //Role is maybe detached or not fully loaded,
final Role role = roleRepository.findById(r.getRoleId()) // //therefore we load the role from the database.
.get(); // final Role roleToRemove = roleRepository
roleManager.removeRoleFromParty(role, user); // .findById(role.getRoleId())
} // .get();
}); // roleManager.removeRoleFromParty(roleToRemove, user);
// }
// });
} }
userAdmin.closeEditRoleMembershipsForm(state); userAdmin.closeEditRoleMembershipsForm(state);

View File

@ -20,12 +20,14 @@ package com.arsdigita.ui.admin.usersgroupsroles.users;
import org.libreccm.security.Group; import org.libreccm.security.Group;
import org.libreccm.security.GroupMembership; import org.libreccm.security.GroupMembership;
import org.libreccm.security.Party;
import org.libreccm.security.Role; import org.libreccm.security.Role;
import org.libreccm.security.RoleManager;
import org.libreccm.security.RoleMembership; import org.libreccm.security.RoleMembership;
import org.libreccm.security.RoleRepository;
import org.libreccm.security.User; import org.libreccm.security.User;
import org.libreccm.security.UserRepository; import org.libreccm.security.UserRepository;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
@ -41,11 +43,37 @@ import javax.transaction.Transactional;
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a> * @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
*/ */
@RequestScoped @RequestScoped
class UsersGroupsRolesController { class UsersController {
@Inject @Inject
private UserRepository userRepo; private UserRepository userRepo;
@Inject
private RoleRepository roleRepo;
@Inject
private RoleManager roleManager;
@Transactional(Transactional.TxType.REQUIRED)
protected List<Group> getAssignedGroups(final User user) {
final User theUser = userRepo
.findById(user.getPartyId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No User with ID %d in the database.",
user.getPartyId())));
return theUser
.getGroupMemberships()
.stream()
.map(GroupMembership::getGroup)
.sorted((group1, group2) -> {
return group1.getName().compareTo(group2.getName());
})
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
protected String getNamesOfAssignedGroups(final User user) { protected String getNamesOfAssignedGroups(final User user) {
@ -65,7 +93,27 @@ class UsersGroupsRolesController {
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public String getNamesOfAssignedRoles(final User user) { protected List<Role> getAssignedRoles(final User user) {
final User theUser = userRepo
.findById(user.getPartyId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No User with ID %d in the database.",
user.getPartyId())));
return theUser
.getRoleMemberships()
.stream()
.map(RoleMembership::getRole)
.sorted((role1, role2) -> {
return role1.getName().compareTo(role2.getName());
})
.collect(Collectors.toList());
}
@Transactional(Transactional.TxType.REQUIRED)
protected String getNamesOfAssignedRoles(final User user) {
final User theUser = userRepo final User theUser = userRepo
.findById(user.getPartyId()) .findById(user.getPartyId())
@ -84,7 +132,7 @@ class UsersGroupsRolesController {
} }
@Transactional(Transactional.TxType.REQUIRED) @Transactional(Transactional.TxType.REQUIRED)
public String getNamesOfAllAssignedRoles(final User user) { protected String getNamesOfAllAssignedRoles(final User user) {
final User theUser = userRepo final User theUser = userRepo
.findById(user.getPartyId()) .findById(user.getPartyId())
@ -118,4 +166,53 @@ class UsersGroupsRolesController {
.collect(Collectors.joining(", ")); .collect(Collectors.joining(", "));
} }
@Transactional(Transactional.TxType.REQUIRED)
protected void updateAssignedRoles(final User user,
final List<Role> selectedRoles) {
final User theUser = userRepo
.findById(user.getPartyId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No User with ID %d in the database.",
user.getPartyId())));
final List<Role> assignedRoles = getAssignedRoles(user);
//First check for newly added role
selectedRoles
.stream()
.filter(role -> !assignedRoles.contains(role))
.forEach(role -> assignRoleToParty(role, theUser));
//Than check for removed roles
assignedRoles
.stream()
.filter(role -> !selectedRoles.contains(role))
.forEach(role -> removeRoleFromParty(role, theUser));
}
private void assignRoleToParty(final Role role, final Party party) {
final Role roleToAdd = roleRepo
.findById(role.getRoleId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No Role with ID %d in the database.",
role.getRoleId())));
roleManager.assignRoleToParty(roleToAdd, party);
}
private void removeRoleFromParty(final Role role, final Party party) {
final Role roleToRemove = roleRepo
.findById(role.getRoleId())
.orElseThrow(() -> new IllegalArgumentException(String
.format("No Role with ID %d in the database.",
role.getRoleId())));
roleManager.removeRoleFromParty(roleToRemove, party);
}
} }

View File

@ -79,7 +79,7 @@ public class PermissionChecker {
if (shiro.isSystemUser()) { if (shiro.isSystemUser()) {
return true; return true;
} else { } else {
return subject.isPermitted(generatePermissionString(privilege)); return subject.isPermitted(generatePermissionString(privilege));
} }
} else { } else {
return shiro.getPublicUser().isPermitted(generatePermissionString( return shiro.getPublicUser().isPermitted(generatePermissionString(