/**
* Copyright 2011 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.bricket.plugin.user_role.service.impl;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import org.bricket.plugin.role.domain.Role;
import org.bricket.plugin.role.service.RoleService;
import org.bricket.plugin.role.service.RoleService.Roles;
import org.bricket.plugin.user.domain.User;
import org.bricket.plugin.user.service.UserService;
import org.bricket.plugin.user.service.UserService.Users;
import org.bricket.plugin.user_role.domain.UserRole;
import org.bricket.plugin.user_role.domain.UserRole.Type;
import org.bricket.plugin.user_role.repository.UserRoleDao;
import org.bricket.plugin.user_role.repository.impl.UserRoleSpecifications;
import org.bricket.plugin.user_role.service.UserRoleService;
import org.bricket.plugin.user_role.service.UserRoleServiceException;
import org.bricket.service.BricketServiceException;
import org.bricket.service.BricketServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.synyx.hades.domain.Order;
import org.synyx.hades.domain.PageRequest;
/**
* @author Ingo Renner
* @author Henning Teek
*/
@Service(value = "userRoleService")
@Transactional(readOnly = true)
public class UserRoleServiceImpl extends BricketServiceImpl implements UserRoleService {
private final Logger log = LoggerFactory.getLogger(UserRoleServiceImpl.class);
@Autowired
private RoleService roleService;
@Autowired
private UserService userService;
@Resource
private UserRoleDao userRoleDao;
@Transactional
@Override
protected void onInit() throws BricketServiceException {
roleService.init();
userService.init();
User user = userService.loadUserByEmail(Users.SUPER_ADMIN.getEmail());
if (user != null && loadRolesByUser(user).size() == 0) {
try {
assignRole(user, Roles.ROLE_SUPERUSER.name());
assignRole(user, Roles.ROLE_ADMIN.name());
assignRole(user, Roles.ROLE_USER.name());
} catch (BricketServiceException e) {
log.error("error assigning super admin user role to user: " + user, e);
}
}
user = userService.loadUserByEmail(Users.ADMIN.getEmail());
if (user != null && loadRolesByUser(user).size() == 0) {
try {
assignRole(user, Roles.ROLE_ADMIN.name());
assignRole(user, Roles.ROLE_USER.name());
} catch (BricketServiceException e) {
log.error("error assigning admin user role to user: " + user, e);
}
}
log.info("user role service initialized");
}
@Override
@Transactional
public UserRole saveUserRole(UserRole userRole) throws BricketServiceException {
return userRoleDao.save(userRole);
}
@Override
@Transactional
public void deleteUserRole(UserRole userRole) throws BricketServiceException {
userRoleDao.delete(userRoleDao.readByPrimaryKey(userRole.getId()));
}
@Override
public UserRole loadUserRole(Long id) {
return userRoleDao.readByPrimaryKey(id);
}
@Override
public List<UserRole> loadUserRoleByUser(long userId, int from, int count, String sortProperty, boolean sortAsc) {
final PageRequest pageable;
int page;
if (from > 0) {
page = from / count;
} else {
page = 0;
}
if (sortProperty == null || "".equals(sortProperty.trim())) {
pageable = new PageRequest(page, count);
} else {
pageable = new PageRequest(page, count, sortAsc ? Order.ASCENDING : Order.DESCENDING, sortProperty);
}
return userRoleDao.findByUser(userService.loadUser(userId), pageable);
}
@Override
public int getCountByUser(long userId) {
return userRoleDao.count(UserRoleSpecifications.hasUser(userId)).intValue();
}
@Override
public UserRole createDomainObject() {
UserRole userRole = new UserRole();
userRole.setType(Type.DEFAULT);
return userRole;
}
@Override
public List<Role> loadRolesByUser(User user) {
ArrayList<Role> roles = new ArrayList<Role>();
for (UserRole userRole : userRoleDao.findByUser(user)) {
Role role = userRole.getRole();
if (!roles.contains(role)) {
roles.add(role);
log.debug("added role: {} to user: {}", role, user);
}
}
return roles;
}
@Override
public List<Role> loadRolesByUser(long userId) {
return loadRolesByUser(userService.loadUser(userId));
}
@Override
@Transactional
public void assignRole(long userId, String rolename) throws BricketServiceException {
assignRole(userService.loadUser(userId), roleService.loadRoleByName(rolename));
}
@Override
@Transactional
public void assignRole(User user, String rolename) throws BricketServiceException {
assignRole(user, roleService.loadRoleByName(rolename));
}
private void assignRole(User user, Role role) throws BricketServiceException {
if (role != null) {
UserRole ur = createDomainObject();
ur.setUser(user);
ur.setRole(role);
saveUserRole(ur);
return;
}
throw new BricketServiceException(UserRoleServiceException.USER_ROLE_SERVICE_ASSIGN_ROLE_FAILED);
}
@Override
@Transactional
public void assignRoles(User user, List<String> roles) throws BricketServiceException {
if (roles != null && !roles.isEmpty()) {
for (String role : roles) {
assignRole(user, roleService.loadRoleByName(role));
}
}
}
@Override
public boolean hasRole(User user, String rolename) {
Role role = roleService.loadRoleByName(rolename);
if (role != null) {
return !userRoleDao.findByUserAndRole(user, role).isEmpty();
}
return false;
}
@Override
public List<Role> loadAllRoles() {
return roleService.loadAllRoles();
}
}