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.schema.useragent.feedback.FeedbackStage;
import org.societies.api.schema.useragent.feedback.UserFeedbackBean;
import org.societies.useragent.api.feedback.IUserFeedbackHistoryRepository;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@SuppressWarnings("unchecked")
public class UserFeedbackHistoryRepository implements IUserFeedbackHistoryRepository {
private static final Logger log = LoggerFactory.getLogger(UserFeedbackHistoryRepository.class);
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
@Override
public List<UserFeedbackBean> listPrevious(int howMany) {
Session session = sessionFactory.openSession();
try {
Query query = session.createQuery("FROM UserFeedbackBean uf");
// Query query = session.createQuery("FROM UserFeedbackBean uf ORDER BY uf.requestDate");
query.setMaxResults(howMany);
return query.list();
} finally {
session.close();
}
}
@Override
public List<UserFeedbackBean> listSince(Date sinceWhen) {
Session session = sessionFactory.openSession();
try {
Query query = session.createQuery("FROM UserFeedbackBean uf");
// Query query = session.createQuery("FROM UserFeedbackBean uf WHERE uf.requestDate > :date ORDER BY uf.requestDate");
// query.setDate("date", sinceWhen);
return query.list();
} finally {
session.close();
}
}
@Override
public List<UserFeedbackBean> listIncomplete() {
Session session = sessionFactory.openSession();
try {
Query query = session.createQuery("FROM UserFeedbackBean uf WHERE uf.stage != :stage");
// Query query = session.createQuery("FROM UserFeedbackBean uf WHERE uf.stage != :stage ORDER BY uf.requestDate");
query.setParameter("stage", FeedbackStage.COMPLETED);
return query.list();
} finally {
session.close();
}
}
@Override
public UserFeedbackBean getByRequestId(String requestId) {
Session session = sessionFactory.openSession();
try {
Query query = session.createQuery("FROM UserFeedbackBean uf WHERE uf.requestId = :id");
query.setString("id", requestId);
List results = query.list();
if (results.size() == 0) {
log.warn("Found no UserFeedbackBean with requestId=" + requestId);
return null;
}
return (UserFeedbackBean) results.get(0);
} finally {
session.close();
}
}
@Override
public void insert(UserFeedbackBean ufBean) {
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
try {
session.save(ufBean);
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();
UserFeedbackBean 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 void completeExpFeedback(String requestId, List<String> values) {
Session session = sessionFactory.openSession();
try {
Transaction transaction = session.beginTransaction();
UserFeedbackBean item = getByRequestId(requestId);
item.setStage(FeedbackStage.COMPLETED);
item.setOptions(values);
session.update(item);
transaction.commit();
session.flush();
} finally {
session.close();
}
}
@Override
public void completeImpFeedback(String requestId, boolean accepted) {
Session session = sessionFactory.openSession();
try {
Transaction transaction = session.beginTransaction();
UserFeedbackBean item = getByRequestId(requestId);
item.setStage(FeedbackStage.COMPLETED);
List<String> options = new ArrayList<String>();
options.add(accepted ? "true" : "false");
item.setOptions(options);
session.update(item);
transaction.commit();
session.flush();
} 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 UserFeedbackBean");
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;
}
}