package fi.otavanopisto.pyramus.dao.base;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceException;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import org.apache.commons.lang.StringUtils;
import fi.otavanopisto.pyramus.dao.DAOFactory;
import fi.otavanopisto.pyramus.dao.PyramusEntityDAO;
import fi.otavanopisto.pyramus.domainmodel.base.CourseBase;
import fi.otavanopisto.pyramus.domainmodel.base.CourseBaseVariable;
import fi.otavanopisto.pyramus.domainmodel.base.CourseBaseVariableKey;
import fi.otavanopisto.pyramus.domainmodel.courses.Course;
import fi.otavanopisto.pyramus.domainmodel.base.CourseBaseVariable_;
@Stateless
public class CourseBaseVariableDAO extends PyramusEntityDAO<CourseBaseVariable> {
public CourseBaseVariable create(Course course, CourseBaseVariableKey key, String value) {
EntityManager entityManager = getEntityManager();
CourseBaseVariable courseBaseVariable = new CourseBaseVariable();
courseBaseVariable.setCourseBase(course);
courseBaseVariable.setKey(key);
courseBaseVariable.setValue(value);
entityManager.persist(courseBaseVariable);
course.getVariables().add(courseBaseVariable);
entityManager.persist(course);
return courseBaseVariable;
}
public CourseBaseVariable findByCourseAndVariableKey(Course course, CourseBaseVariableKey key) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<CourseBaseVariable> criteria = criteriaBuilder.createQuery(CourseBaseVariable.class);
Root<CourseBaseVariable> root = criteria.from(CourseBaseVariable.class);
criteria.select(root);
criteria.where(
criteriaBuilder.and(
criteriaBuilder.equal(root.get(CourseBaseVariable_.courseBase), course),
criteriaBuilder.equal(root.get(CourseBaseVariable_.key), key)
));
return getSingleResult(entityManager.createQuery(criteria));
}
public String findByCourseAndVariableKey(Course course, String key) {
CourseBaseVariableKeyDAO variableKeyDAO = DAOFactory.getInstance().getCourseBaseVariableKeyDAO();
CourseBaseVariableKey courseBaseVariableKey = variableKeyDAO.findByVariableKey(key);
if (courseBaseVariableKey != null) {
CourseBaseVariable courseBaseVariable = findByCourseAndVariableKey(course, courseBaseVariableKey);
return courseBaseVariable == null ? null : courseBaseVariable.getValue();
}
else {
throw new PersistenceException("Unknown VariableKey");
}
}
public CourseBaseVariable update(CourseBaseVariable courseBaseVariable, String value) {
EntityManager entityManager = getEntityManager();
courseBaseVariable.setValue(value);
entityManager.persist(courseBaseVariable);
return courseBaseVariable;
}
public void setCourseVariable(Course course, String key, String value) {
CourseBaseVariableKeyDAO variableKeyDAO = DAOFactory.getInstance().getCourseBaseVariableKeyDAO();
CourseBaseVariableKey courseBaseVariableKey = variableKeyDAO.findByVariableKey(key);
if (courseBaseVariableKey != null) {
CourseBaseVariable courseBaseVariable = findByCourseAndVariableKey(course, courseBaseVariableKey);
if (StringUtils.isBlank(value)) {
delete(courseBaseVariable);
}
else {
if (courseBaseVariable == null) {
courseBaseVariable = create(course, courseBaseVariableKey, value);
}
else {
update(courseBaseVariable, value);
}
}
}
else {
throw new PersistenceException("Unknown VariableKey");
}
}
public List<CourseBaseVariable> listByCourseBase(CourseBase courseBase) {
EntityManager entityManager = getEntityManager();
CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder();
CriteriaQuery<CourseBaseVariable> criteria = criteriaBuilder.createQuery(CourseBaseVariable.class);
Root<CourseBaseVariable> root = criteria.from(CourseBaseVariable.class);
criteria.select(root);
criteria.where(
criteriaBuilder.equal(root.get(CourseBaseVariable_.courseBase), courseBase)
);
return entityManager.createQuery(criteria).getResultList();
}
}