/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.ufcspa.simdecs.bn.jpa; import java.io.Serializable; import javax.persistence.Query; import javax.persistence.EntityNotFoundException; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import org.ufcspa.simdecs.bn.entity.Node; import org.ufcspa.simdecs.bn.entity.Answer; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.transaction.UserTransaction; import org.ufcspa.simdecs.bn.entity.Question; import org.ufcspa.simdecs.bn.jpa.exceptions.NonexistentEntityException; import org.ufcspa.simdecs.bn.jpa.exceptions.RollbackFailureException; /** * * @author mchelem */ public class QuestionJpaController implements Serializable { public QuestionJpaController(UserTransaction utx, EntityManagerFactory emf) { this.utx = utx; this.emf = emf; } private UserTransaction utx = null; private EntityManagerFactory emf = null; public EntityManager getEntityManager() { return emf.createEntityManager(); } public void create(Question question) throws RollbackFailureException, Exception { if (question.getAnswers() == null) { question.setAnswers(new ArrayList()); } EntityManager em = null; try { utx.begin(); em = getEntityManager(); Node node = question.getNode(); if (node != null) { node = em.getReference(node.getClass(), node.getId()); question.setNode(node); } List attachedAnswers = new ArrayList(); for (Answer answersAnswerToAttach : question.getAnswers()) { answersAnswerToAttach = em.getReference(answersAnswerToAttach.getClass(), answersAnswerToAttach.getId()); attachedAnswers.add(answersAnswerToAttach); } question.setAnswers(attachedAnswers); em.persist(question); if (node != null) { node.getQuestions().add(question); node = em.merge(node); } for (Answer answersAnswer : question.getAnswers()) { Question oldQuestionOfAnswersAnswer = answersAnswer.getQuestion(); answersAnswer.setQuestion(question); answersAnswer = em.merge(answersAnswer); if (oldQuestionOfAnswersAnswer != null) { oldQuestionOfAnswersAnswer.getAnswers().remove(answersAnswer); oldQuestionOfAnswersAnswer = em.merge(oldQuestionOfAnswersAnswer); } } utx.commit(); } catch (Exception ex) { try { utx.rollback(); } catch (Exception re) { throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re); } throw ex; } finally { if (em != null) { em.close(); } } } public void edit(Question question) throws NonexistentEntityException, RollbackFailureException, Exception { EntityManager em = null; try { utx.begin(); em = getEntityManager(); Question persistentQuestion = em.find(Question.class, question.getId()); Node nodeOld = persistentQuestion.getNode(); Node nodeNew = question.getNode(); List answersOld = persistentQuestion.getAnswers(); List answersNew = question.getAnswers(); if (nodeNew != null) { nodeNew = em.getReference(nodeNew.getClass(), nodeNew.getId()); question.setNode(nodeNew); } List attachedAnswersNew = new ArrayList(); for (Answer answersNewAnswerToAttach : answersNew) { answersNewAnswerToAttach = em.getReference(answersNewAnswerToAttach.getClass(), answersNewAnswerToAttach.getId()); attachedAnswersNew.add(answersNewAnswerToAttach); } answersNew = attachedAnswersNew; question.setAnswers(answersNew); question = em.merge(question); if (nodeOld != null && !nodeOld.equals(nodeNew)) { nodeOld.getQuestions().remove(question); nodeOld = em.merge(nodeOld); } if (nodeNew != null && !nodeNew.equals(nodeOld)) { nodeNew.getQuestions().add(question); nodeNew = em.merge(nodeNew); } for (Answer answersOldAnswer : answersOld) { if (!answersNew.contains(answersOldAnswer)) { answersOldAnswer.setQuestion(null); answersOldAnswer = em.merge(answersOldAnswer); } } for (Answer answersNewAnswer : answersNew) { if (!answersOld.contains(answersNewAnswer)) { Question oldQuestionOfAnswersNewAnswer = answersNewAnswer.getQuestion(); answersNewAnswer.setQuestion(question); answersNewAnswer = em.merge(answersNewAnswer); if (oldQuestionOfAnswersNewAnswer != null && !oldQuestionOfAnswersNewAnswer.equals(question)) { oldQuestionOfAnswersNewAnswer.getAnswers().remove(answersNewAnswer); oldQuestionOfAnswersNewAnswer = em.merge(oldQuestionOfAnswersNewAnswer); } } } utx.commit(); } catch (Exception ex) { try { utx.rollback(); } catch (Exception re) { throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re); } String msg = ex.getLocalizedMessage(); if (msg == null || msg.length() == 0) { Long id = question.getId(); if (findQuestion(id) == null) { throw new NonexistentEntityException("The question with id " + id + " no longer exists."); } } throw ex; } finally { if (em != null) { em.close(); } } } public void destroy(Long id) throws NonexistentEntityException, RollbackFailureException, Exception { EntityManager em = null; try { utx.begin(); em = getEntityManager(); Question question; try { question = em.getReference(Question.class, id); question.getId(); } catch (EntityNotFoundException enfe) { throw new NonexistentEntityException("The question with id " + id + " no longer exists.", enfe); } Node node = question.getNode(); if (node != null) { node.getQuestions().remove(question); node = em.merge(node); } List answers = question.getAnswers(); for (Answer answersAnswer : answers) { answersAnswer.setQuestion(null); answersAnswer = em.merge(answersAnswer); } em.remove(question); utx.commit(); } catch (Exception ex) { try { utx.rollback(); } catch (Exception re) { throw new RollbackFailureException("An error occurred attempting to roll back the transaction.", re); } throw ex; } finally { if (em != null) { em.close(); } } } public List findQuestionEntities() { return findQuestionEntities(true, -1, -1); } public List findQuestionEntities(int maxResults, int firstResult) { return findQuestionEntities(false, maxResults, firstResult); } private List findQuestionEntities(boolean all, int maxResults, int firstResult) { EntityManager em = getEntityManager(); try { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(Question.class)); Query q = em.createQuery(cq); if (!all) { q.setMaxResults(maxResults); q.setFirstResult(firstResult); } return q.getResultList(); } finally { em.close(); } } public Question findQuestion(Long id) { EntityManager em = getEntityManager(); try { return em.find(Question.class, id); } finally { em.close(); } } public int getQuestionCount() { EntityManager em = getEntityManager(); try { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); Root rt = cq.from(Question.class); cq.select(em.getCriteriaBuilder().count(rt)); Query q = em.createQuery(cq); return ((Long) q.getSingleResult()).intValue(); } finally { em.close(); } } }