/* * Copyright (c) JForum Team. All rights reserved. * * The software in this package is published under the terms of the LGPL * license a copy of which has been included with this distribution in the * license.txt file. * * The JForum Project * http://www.jforum.net */ package net.jforum.services; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; import net.jforum.core.SessionManager; import net.jforum.core.exceptions.ValidationException; import net.jforum.entities.Group; import net.jforum.entities.Role; import net.jforum.entities.UserSession; import net.jforum.repository.GroupRepository; import net.jforum.repository.UserRepository; import net.jforum.security.RoleManager; import net.jforum.util.SecurityConstants; import org.apache.commons.lang.StringUtils; import br.com.caelum.vraptor.ioc.Component; /** * @author Rafael Steil */ @Component public class GroupService { private GroupRepository repository; private UserRepository userRepository; private UserSession userSession; private SessionManager sessionManager; public GroupService(GroupRepository repository, UserRepository userRepository, UserSession userSession, SessionManager sessionManager) { this.repository = repository; this.userSession = userSession; this.userRepository = userRepository; this.sessionManager = sessionManager; } /** * Save the permissions for this group */ @SuppressWarnings("unchecked") public void savePermissions(int groupId, Map<String, Map<String, List<?>>> map) { Group group = this.repository.get(groupId); RoleManager currentRoles = new RoleManager(); currentRoles.setGroups(Arrays.asList(group)); group.getRoles().clear(); boolean isAdministrator = currentRoles.isAdministrator(); boolean canManageForums = currentRoles.roleExists(SecurityConstants.CAN_MANAGE_FORUMS); boolean isCoAdministrator = currentRoles.isCoAdministrator(); List<Integer> groups = new ArrayList<Integer>(); for (int gid : currentRoles.getRoleValues(SecurityConstants.GROUPS)) { groups.add(gid); } boolean canInteractwithOtherGroups = currentRoles.roleExists(SecurityConstants.INTERACT_OTHER_GROUPS); boolean isSuperAdministrator = this.userSession.getRoleManager().isAdministrator(); for (Map.Entry<String, List<?>> entry : map.get("boolean").entrySet()) { String key = entry.getKey(); Boolean value = (Boolean)entry.getValue().get(0); if (SecurityConstants.ADMINISTRATOR.equals(key)) { registerRole(group, key, isSuperAdministrator ? value : isAdministrator); } else if (SecurityConstants.CAN_MANAGE_FORUMS.equals(key)) { registerRole(group, key, isSuperAdministrator ? value : canManageForums); } else if (SecurityConstants.CO_ADMINISTRATOR.equals(key)) { registerRole(group, key, isSuperAdministrator ? value : isCoAdministrator); } else if (SecurityConstants.INTERACT_OTHER_GROUPS.equals(key)) { registerRole(group, key, isSuperAdministrator ? value : canInteractwithOtherGroups); } else { registerRole(group, key, (Boolean)entry.getValue().get(0)); } } for (Map.Entry<String, List<?>> entry : map.get("multiple").entrySet()) { String key = entry.getKey(); List<Integer> value = (List<Integer>) entry.getValue(); if (SecurityConstants.GROUPS.equals(key)) { registerRole(group, key, isSuperAdministrator ? value : groups); } else { registerRole(group, key, value); } } this.repository.update(group); this.sessionManager.computeAllOnlineModerators(); //this.userRepository.changeAllowAvatarState(map.getCanHaveProfilePicture(), group); } /** * Add a new group * @param group */ public void add(Group group) { this.applyCommonConstraints(group); if (group.getId() > 0) { throw new ValidationException("Cannot save an existing (id > 0) group"); } this.repository.add(group); } /** * Updates the information of an existing group * @param group */ public void update(Group group) { this.applyCommonConstraints(group); if (group.getId() == 0) { throw new ValidationException("update() expects a group with an existing id"); } this.repository.update(group); } /** * Deletes one or more groups * @param ids */ public void delete(int... ids) { if (ids != null) { // FIXME: Must not delete a group if it has users for (int groupId : ids) { Group group = this.repository.get(groupId); this.repository.remove(group); } } } public void appendRole(Group group, String roleName, int roleValue) { for (Role role : group.getRoles()) { if (role.getName().equals(roleName)) { role.getRoleValues().add(roleValue); break; } } this.repository.update(group); } private void applyCommonConstraints(Group group) { if (group == null) { throw new NullPointerException("Cannot save a null group"); } if (StringUtils.isEmpty(group.getName())) { throw new ValidationException("A group should have a name"); } } private void registerRole(Group group, String name, List<Integer> values) { if (values.size() > 0) { group.addRole(this.createRole(name, values)); } } private void registerRole(Group group, String name, boolean isAllowed) { if (isAllowed) { group.addRole(this.createRole(name, null)); } } private Role createRole(String name, List<Integer> values) { Role role = new Role(); role.setName(name); if (values != null) { for (int value : values) { role.addRoleValue(value); } } return role; } }