package qa.qcri.aidr.manager.service.impl;
import java.util.ArrayList;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.log4j.Logger;
import org.json.simple.JSONArray;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import qa.qcri.aidr.manager.RoleType;
import qa.qcri.aidr.manager.persistence.entities.Collection;
import qa.qcri.aidr.manager.persistence.entities.Role;
import qa.qcri.aidr.manager.persistence.entities.UserAccount;
import qa.qcri.aidr.manager.persistence.entities.UserAccountRole;
import qa.qcri.aidr.manager.repository.CollectionRepository;
import qa.qcri.aidr.manager.repository.RoleRepository;
import qa.qcri.aidr.manager.repository.UserAccountRepository;
import qa.qcri.aidr.manager.repository.UserAccountRoleRepository;
import qa.qcri.aidr.manager.service.CollectionCollaboratorService;
import qa.qcri.aidr.manager.service.UserService;
import qa.qcri.aidr.manager.util.CollectionStatus;
@Service("userService")
public class UserServiceImpl implements UserService{
private Logger logger = Logger.getLogger(getClass());
@Resource(name="userRepository")
private UserAccountRepository userRepository;
@Autowired
private CollectionRepository collectionRepository;
@Autowired
private UserAccountRoleRepository userRoleRepository;
@Autowired
private RoleRepository roleRepository;
@Autowired
private CollectionCollaboratorService collaboratorService;
@Override
@Transactional(readOnly=false)
public void save(UserAccount user) {
userRepository.save(user);
}
@Override
@Transactional(readOnly=true)
public UserAccount fetchByUserName(String username) {
return userRepository.fetchByUsername(username);
}
@Override
@Transactional(readOnly=true)
public UserAccount getById(Long id) {
return userRepository.getById(id);
}
@Override
@Transactional(readOnly=true)
public List<UserAccount> getUsers(String query, Integer start, Integer limit) {
return userRepository.getUsers(query, start, limit);
}
@Override
@Transactional(readOnly=true)
public Long getUsersCount(String query) {
return userRepository.getUsersCount(query);
}
public boolean isUserInCollectionManagersList(UserAccount user, Collection collection) {
List<UserAccount> managers = collaboratorService.fetchCollaboratorsByCollection(collection.getId());
if (CollectionUtils.isEmpty(managers)) {
return false;
}
for (UserAccount manager : managers){
if (manager.getId().equals(user.getId())){
return true;
}
}
return false;
}
@Override
@Transactional(readOnly=false)
public boolean isUserAdmin(UserAccount user) {
Role role = roleRepository.findByRoleType(RoleType.ADMIN);
UserAccountRole userRole = userRoleRepository.fetchByUserIdAndRole(user.getId(), role.getId());
return (userRole != null && userRole.getRole().getRoleType().equals(RoleType.ADMIN)) ?
true : false;
}
@Override
@Transactional(readOnly=false)
public UserAccount getAvailableUser(JSONArray users) {
SortedMap map = new TreeMap();
UserAccount userEntity = null;
Collection Collection;
UserAccount unUsedUserEntity = null;
for(Object user : users){
String userName = (String) user;
userEntity = fetchByUserName(userName);
if(userEntity != null){
List<Collection> collections = collectionRepository.getAllCollectionByUser(userEntity.getId());
boolean addedOnMap = false;
for(int i=0; i < collections.size(); i++ ){
if(collections.get(i).getStatus().equals(CollectionStatus.INITIALIZING) || collections.get(i).getStatus().equals(CollectionStatus.RUNNING)){
map.put(collections.get(i).getCreatedAt(), userEntity);
addedOnMap = true;
}
}
if(!addedOnMap){
unUsedUserEntity = userEntity;
}
}
}
if(unUsedUserEntity != null){
return unUsedUserEntity;
}
if(map.size() > 0 && unUsedUserEntity == null){
logger.info("firstKey: " + userEntity.getUserName());
return (UserAccount)map.get(map.firstKey());
}
return userEntity; //To change body of implemented methods use File | Settings | File Templates.
}
@Override
@Transactional(readOnly=true)
public List<RoleType> getUserRoles(Long userId) {
List<UserAccountRole> roles = userRoleRepository.fetchByAccountId(userId);
List<RoleType> roleTypes = new ArrayList<RoleType>();
if(roles != null) {
for(UserAccountRole role : roles) {
roleTypes.add(role.getRole().getRoleType());
}
}
return roleTypes;
}
@Override
@Transactional(readOnly = false)
public void update(UserAccount user) throws Exception {
userRepository.update(user);
}
}