package info.ozkan.vipera.dao.login;
import info.ozkan.vipera.business.login.AdministratorLoginStatus;
import info.ozkan.vipera.entities.Administrator;
import info.ozkan.vipera.entities.Authorize;
import info.ozkan.vipera.login.AdministratorLoginResult;
import java.util.List;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.transaction.annotation.Transactional;
/**
* Administrator login işlemleri için kullanılan dao katmanı sınıfı
*
* @author Ömer Özkan
*/
@Named("administratorLoginDao")
public class AdministratorLoginDaoImpl implements AdministratorLoginDao {
/**
* LOGGER
*/
private static final Logger LOGGER = LoggerFactory
.getLogger(AdministratorLoginDaoImpl.class);
/**
* Yöneticiyi bilgibankasından çekmek için JQL sorgusu
*/
protected static final String GET_USER_JQL =
"from Administrator a where a.username = :username AND a.enabled = :enabled";
/**
* Persistence
*/
private EntityManager em;
/**
* Kullanıcı adı ve parola ile bilgibankasından yöneticiyi ve sonucu
* gönderir
*
* @param username
* Kullanıcı adı
* @param password
* Parola
* @return Result nesnesi
*/
@Transactional
public AdministratorLoginResult findUser(final String username,
final String password) {
final AdministratorLoginResult result = new AdministratorLoginResult();
final Query query = em.createQuery(GET_USER_JQL);
query.setParameter("username", username);
query.setParameter("enabled", Authorize.ENABLE);
final List<Administrator> list = query.getResultList();
if (checkUsername(list)) {
LOGGER.info("User \"{}\" has not exist", username);
result.setStatus(AdministratorLoginStatus.INVALID_USERNAME);
return result;
}
final Administrator admin = list.get(0);
if (checkPassword(password, admin)) {
LOGGER.info("The user \"{}\"'s password is wrong", username);
result.setStatus(AdministratorLoginStatus.INVALID_PASSWORD);
return result;
}
LOGGER.info("The user {} has found", username);
loginSuccessfull(result, admin);
return result;
}
/**
* Login işlemi başarılı ise result nesnesine gereken değerleri tanımlar
*
* @param result
* sonuç
* @param admin
* yönetici
*/
private void loginSuccessfull(final AdministratorLoginResult result,
final Administrator admin) {
result.setStatus(AdministratorLoginStatus.SUCCESS);
result.setAdministrator(admin);
}
/**
* Yönetici parolasının eşleşip eşleşmediğini kontrol eder
*
* @param password
* Parola
* @param admin
* Yönetici
* @return Parola hatalı ise true, değilse false döner
*/
private boolean checkPassword(final String password,
final Administrator admin) {
return !password.equals(admin.getPassword());
}
/**
* Bilgibankasında o kullanıcıya ait kayıt olup olmadığını kontrol eder
*
* @param list
* @return
*/
private boolean checkUsername(final List<Administrator> list) {
return list.size() == 0 || list == null;
}
/**
* EntitiyManager
*
* @param em
*/
@PersistenceContext
public void setEntityManager(final EntityManager em) {
this.em = em;
}
}