package org.nextprot.api.user.dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
import org.nextprot.api.user.domain.User;
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
/**
*
* Created by fnikitin on 24/10/14.
*/
class UsersExtractor implements ResultSetExtractor<List<User>> {
private final boolean sort;
private final Comparator<User> userComparator;
public UsersExtractor() {
this(false);
}
/**
* @param sort
* if true compare by user name
*/
public UsersExtractor(boolean sort) {
this.sort = sort;
if (sort) {
userComparator = new Comparator<User>() {
@Override
public int compare(User u1, User u2) {
return u1.getUsername().compareTo(u2.getUsername());
}
};
} else {
userComparator = null;
}
}
public List<User> extractData(ResultSet resultSet) throws SQLException, DataAccessException {
LinkedHashMap<Long, User> usersById = new LinkedHashMap<Long, User>();
Set<GrantedAuthority> roles;
while (resultSet.next()) {
long id = resultSet.getLong("user_id");
String roleName = resultSet.getString("role_name");
if (!usersById.containsKey(id)) {
User user = new User();
roles = new HashSet<GrantedAuthority>();
user.setId(id);
user.setUsername(resultSet.getString("user_name"));
user.setFirstName(resultSet.getString("first_name"));
user.setLastName(resultSet.getString("last_name"));
user.setAuthorities(roles);
usersById.put(id, user);
} else {
roles = usersById.get(id).getAuthorities();
}
if (roleName != null)
roles.add(new SimpleGrantedAuthority(roleName));
}
List<User> users = new ArrayList<User>(usersById.values());
if (sort)
Collections.sort(users, userComparator);
return users;
}
}