package fi.otavanopisto.pyramus.dao.users; 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.Join; 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.users.User; import fi.otavanopisto.pyramus.domainmodel.users.UserVariable; import fi.otavanopisto.pyramus.domainmodel.users.UserVariableKey; import fi.otavanopisto.pyramus.domainmodel.users.UserVariableKey_; import fi.otavanopisto.pyramus.domainmodel.users.UserVariable_; @Stateless public class UserVariableDAO extends PyramusEntityDAO<UserVariable> { public UserVariable create(User user, UserVariableKey key, String value) { UserVariable userVariable = new UserVariable(); userVariable.setUser(user); userVariable.setKey(key); userVariable.setValue(value); return persist(userVariable); } public UserVariable findByUserAndVariableKey(User user, UserVariableKey key) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<UserVariable> criteria = criteriaBuilder.createQuery(UserVariable.class); Root<UserVariable> root = criteria.from(UserVariable.class); criteria.select(root); criteria.where( criteriaBuilder.and( criteriaBuilder.equal(root.get(UserVariable_.user), user), criteriaBuilder.equal(root.get(UserVariable_.key), key) )); return getSingleResult(entityManager.createQuery(criteria)); } public String findByUserAndKey(User user, String key) { UserVariableKeyDAO variableKeyDAO = DAOFactory.getInstance().getUserVariableKeyDAO(); UserVariableKey userVariableKey = variableKeyDAO.findByVariableKey(key); if (userVariableKey != null) { UserVariable userVariable = findByUserAndVariableKey(user, userVariableKey); return userVariable == null ? null : userVariable.getValue(); } else { throw new PersistenceException("Unknown VariableKey"); } } public List<UserVariable> listByUser(User user) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<UserVariable> criteria = criteriaBuilder.createQuery(UserVariable.class); Root<UserVariable> root = criteria.from(UserVariable.class); criteria.select(root); criteria.where( criteriaBuilder.equal(root.get(UserVariable_.user), user) ); return entityManager.createQuery(criteria).getResultList(); } public List<UserVariable> listByUserAndUserEditable(User user, Boolean userEditable) { EntityManager entityManager = getEntityManager(); CriteriaBuilder criteriaBuilder = entityManager.getCriteriaBuilder(); CriteriaQuery<UserVariable> criteria = criteriaBuilder.createQuery(UserVariable.class); Root<UserVariable> root = criteria.from(UserVariable.class); Join<UserVariable, UserVariableKey> key = root.join(UserVariable_.key); criteria.select(root); criteria.where( criteriaBuilder.and( criteriaBuilder.equal(root.get(UserVariable_.user), user), criteriaBuilder.equal(key.get(UserVariableKey_.userEditable), userEditable) ) ); return entityManager.createQuery(criteria).getResultList(); } public void setUserVariable(User user, String key, String value) { UserVariableKeyDAO variableKeyDAO = DAOFactory.getInstance().getUserVariableKeyDAO(); UserVariableKey userVariableKey = variableKeyDAO.findByVariableKey(key); if (userVariableKey != null) { UserVariable userVariable = findByUserAndVariableKey(user, userVariableKey); if (StringUtils.isBlank(value)) { if (userVariable != null) { delete(userVariable); } } else { if (userVariable == null) { userVariable = create(user, userVariableKey, value); } else { updateValue(userVariable, value); } } } else { throw new PersistenceException("Unknown VariableKey"); } } public UserVariable updateValue(UserVariable userVariable, String value) { userVariable.setValue(value); return persist(userVariable); } @Override public void delete(UserVariable userVariable) { super.delete(userVariable); } }