package org.pegadi.server.user;
import no.dusken.common.model.Person;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.dao.DataAccessException;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import javax.sql.DataSource;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
/**
* User: jan-preben
* Date: Sep 9, 2010
*
* Sub classes of this class generate all sql query strings used
*/
public abstract class DatabaseUserServer extends AbstractUserServer {
private final Logger log = LoggerFactory.getLogger(getClass());
private ParameterizedRowMapper<Person> rowMapper;
private JdbcTemplate template;
public DatabaseUserServer() {
rowMapper = getRowMapper();
}
protected abstract ParameterizedRowMapper<Person> getRowMapper();
protected abstract String getUserByIdQuery(); //GetUserByIdQuery
protected abstract String getUserByUsernameQuery();
protected abstract String loginQuery();
protected abstract String getUsersByRoleQuery();
protected abstract String getAllUsersQuery(boolean inactive); //getAllUsersQuery
protected abstract String isActiveQuery();
protected abstract String hasRoleQuery();
public void setDataSource(DataSource dataSource) {
super.setDataSource(dataSource);
template = new JdbcTemplate(dataSource);
}
@Cacheable("Person")
public Person getUserByUsername(String username) {
log.info("querying for user with username: {}", username);
try {
return template.queryForObject(getUserByUsernameQuery(), rowMapper, username);
} catch(EmptyResultDataAccessException e) {
log.info("User not found: {}", username, e);
return null;
}
}
@Override
public Person getUserByLegacyId(Integer legacyId) {
log.info("querying for user with legacy id: {}", legacyId);
try {
return template.queryForObject("SELECT * FROM person INNER JOIN users_transform on (person.username = users_transform.username) WHERE users_transform.asInt = ?", rowMapper, legacyId.toString());
} catch(EmptyResultDataAccessException e) {
log.info("User not found: {}", legacyId, e);
return null;
}
}
public String login(String userName) {
log.info("trying to login user: {}", userName);
try {
Integer userId = template.queryForInt(loginQuery(), userName);
return userName;
} catch(DataAccessException e) {
log.info("user not found");
return null;
}
}
public List<Person> getUsersByRole(int roleID, int active) {
try {
String query = getUsersByRoleQuery();
return template.query(query, rowMapper, roleID, active);
} catch(DataAccessException e) {
log.error("error getting users by role", e);
return new ArrayList<Person>();
}
}
public boolean canPublish(Long userID) {
return true;
}
public List<Person> getJournalists() {
return getUsersByRole(journalistRoleId, 1); // Kanskje unødvendig å hå med active parameteren, blir den noengang brukt?
}
public List<Person> getPhotographers() {
return getUsersByRole(photographerRoleId, 1);
}
public List<Person> getAllUsers(boolean inactive) {
return template.query(getAllUsersQuery(inactive), rowMapper);
}
public boolean isActive(String userID) {
int active = template.queryForInt(isActiveQuery(), userID);
return active > 0;
}
public boolean hasRole(Integer roleID, Long userID) {
try {
int hasRole = template.queryForInt(hasRoleQuery(), roleID, userID);
return hasRole > 0;
} catch(DataAccessException e) {
return false;
}
}
protected String createInitials(String name) {
StringBuilder res = new StringBuilder(10);
StringTokenizer st = new StringTokenizer(name, " ");
while (st.hasMoreTokens()) {
res.append(st.nextToken().charAt(0));
}
return res.toString().toLowerCase();
}
}