package org.societies.useragent.feedback; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.societies.api.internal.schema.useragent.feedback.UserFeedbackAccessControlEvent; import org.societies.api.schema.useragent.feedback.FeedbackStage; import org.societies.useragent.api.feedback.IAccessControlHistoryRepository; import java.util.Date; import java.util.List; @SuppressWarnings("unchecked") public class AccessControlHistoryRepository implements IAccessControlHistoryRepository { private static final Logger log = LoggerFactory.getLogger(AccessControlHistoryRepository.class); private SessionFactory sessionFactory; public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } @Override public List<UserFeedbackAccessControlEvent> listPrevious(int howMany) { Session session = sessionFactory.openSession(); try { // TODO: Re-enable requestDate order/filter when requestDate field is available again // Query query = session.createQuery("FROM UserFeedbackAccessControlEvent uf ORDER BY uf.requestDate"); Query query = session.createQuery("FROM UserFeedbackAccessControlEvent uf"); query.setMaxResults(howMany); return query.list(); } finally { session.close(); } } @Override public List<UserFeedbackAccessControlEvent> listSince(Date sinceWhen) { Session session = sessionFactory.openSession(); try { // TODO: Re-enable requestDate order/filter when requestDate field is available again // Query query = session.createQuery("FROM UserFeedbackAccessControlEvent uf WHERE uf.requestDate > :date ORDER BY uf.requestDate"); Query query = session.createQuery("FROM UserFeedbackAccessControlEvent uf"); // query.setDate("date", sinceWhen); return query.list(); } finally { session.close(); } } @Override public List<UserFeedbackAccessControlEvent> listIncomplete() { Session session = sessionFactory.openSession(); try { // TODO: Re-enable requestDate order/filter when requestDate field is available again // Query query = session.createQuery("FROM UserFeedbackAccessControlEvent uf WHERE uf.stage != :stage ORDER BY uf.requestDate"); Query query = session.createQuery("FROM UserFeedbackAccessControlEvent uf WHERE uf.stage != :stage"); query.setParameter("stage", FeedbackStage.COMPLETED); return query.list(); } finally { session.close(); } } @Override public UserFeedbackAccessControlEvent getByRequestId(String requestId) { Session session = sessionFactory.openSession(); try { Query query = session.createQuery("FROM UserFeedbackAccessControlEvent uf WHERE uf.requestId = :id"); query.setString("id", requestId); List results = query.list(); if (results.size() == 0) { log.warn("Found no UserFeedbackAccessControlEvent with requestId=" + requestId); return null; } return (UserFeedbackAccessControlEvent) results.get(0); } finally { session.close(); } } @Override public void insert(UserFeedbackAccessControlEvent event) { Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); try { session.save(event); transaction.commit(); session.flush(); } catch (RuntimeException ex) { if (transaction != null) transaction.rollback(); throw ex; } finally { session.close(); } } @Override public void updateStage(String requestId, FeedbackStage newStage) { Session session = sessionFactory.openSession(); Transaction transaction = session.beginTransaction(); UserFeedbackAccessControlEvent item = getByRequestId(requestId); item.setStage(newStage); try { session.update(item); transaction.commit(); session.flush(); } catch (RuntimeException ex) { if (transaction != null) transaction.rollback(); throw ex; } finally { session.close(); } } @Override public int truncate() { Session session = getSessionFactory().openSession(); Transaction transaction = null; int count = -1; try { transaction = session.beginTransaction(); Query query = session.createQuery("delete from UserFeedbackAccessControlEvent"); count = query.executeUpdate(); transaction.commit(); session.flush(); } catch (RuntimeException ex) { if (transaction != null) transaction.rollback(); log.error("Error clearing table", ex); throw ex; } finally { session.close(); } return count; } }