package edu.asu.spring.quadriga.dao.impl;
import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
import java.util.Random;
import javax.annotation.Resource;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import edu.asu.spring.quadriga.dao.IBaseDAO;
import edu.asu.spring.quadriga.dto.QuadrigaUserDTO;
/**
* This class contains the common methods used in data access object classes.
*
* @author Julia Damerow, kbatna
*/
public abstract class BaseDAO<T> implements IBaseDAO<T> {
@Autowired
protected SessionFactory sessionFactory;
@Resource(name = "projectconstants")
protected Properties messages;
private static final Logger logger = LoggerFactory.getLogger(BaseDAO.class);
/*
* (non-Javadoc)
*
* @see edu.asu.spring.quadriga.dao.impl.IBaseDAO#generateUniqueID()
*/
@Override
public String generateUniqueID() {
String id = null;
while (true) {
id = getIdPrefix() + generateId();
T existingDto = getDTO(id);
if (existingDto == null)
break;
}
return id;
}
/**
* This methods generates a new 6 character long id. Note that this method
* does not assure that the id isn't in use yet.
*
* Adapted from
* http://stackoverflow.com/questions/9543715/generating-human-readable
* -usable-short-but-unique-ids
*
* @return 6 character id
*/
private String generateId() {
char[] chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".toCharArray();
Random random = new Random();
StringBuilder builder = new StringBuilder();
for (int i = 0; i < 6; i++) {
builder.append(chars[random.nextInt(62)]);
}
return builder.toString();
}
/*
* (non-Javadoc)
*
* @see
* edu.asu.spring.quadriga.dao.impl.IBaseDAO#getUserDTO(java.lang.String)
*/
@Override
public QuadrigaUserDTO getUserDTO(String userName) {
return (QuadrigaUserDTO) sessionFactory.getCurrentSession().get(QuadrigaUserDTO.class, userName);
}
/*
* (non-Javadoc)
*
* @see edu.asu.spring.quadriga.dao.impl.IBaseDAO#getList(java.lang.String)
*/
@Override
public List<String> getList(String commaSeparatedList) {
return Arrays.asList(commaSeparatedList.split(","));
}
@Override
public void updateDTO(T dto) {
sessionFactory.getCurrentSession().update(dto);
}
@Override
public void updateObject(Object obj) {
sessionFactory.getCurrentSession().update(obj);
}
@Override
@Transactional
public void saveNewDTO(T dto) {
sessionFactory.getCurrentSession().save(dto);
}
@Override
public void deleteDTO(T dto) {
sessionFactory.getCurrentSession().delete(dto);
}
@Override
public void saveOrUpdateDTO(T dto) {
sessionFactory.getCurrentSession().saveOrUpdate(dto);
}
protected void deleteObject(Object object) {
sessionFactory.getCurrentSession().delete(object);
}
protected T getDTO(Class<T> clazz, String id) {
try {
return (T) sessionFactory.getCurrentSession().get(clazz, id);
} catch (HibernateException e) {
logger.error("Retrieve workspace details method :", e);
return null;
}
}
protected T getDTO(Class<T> clazz, Serializable primKey) {
try {
return (T) sessionFactory.getCurrentSession().get(clazz, primKey);
} catch (HibernateException e) {
logger.error("Retrieve workspace details method :", e);
return null;
}
}
public String getIdPrefix() {
return messages.getProperty("notype_id.prefix");
}
public abstract T getDTO(String id);
}