/** * */ package net.frontlinesms.plugins.forms.data.repository.hibernate; import java.util.List; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Restrictions; import net.frontlinesms.data.events.DatabaseEntityNotification; import net.frontlinesms.data.events.EntityDeleteWarning; import net.frontlinesms.data.repository.hibernate.BaseHibernateDao; import net.frontlinesms.events.EventBus; import net.frontlinesms.events.EventObserver; import net.frontlinesms.events.FrontlineEventNotification; import net.frontlinesms.plugins.forms.data.domain.Form; import net.frontlinesms.plugins.forms.data.domain.FormResponse; import net.frontlinesms.plugins.forms.data.repository.FormResponseDao; /** * Hibernate implementation of {@link FormResponseDao} * @author Alex */ public class HibernateFormResponseDao extends BaseHibernateDao<FormResponse> implements FormResponseDao, EventObserver { /** Create new instance of this DAO */ public HibernateFormResponseDao() { super(FormResponse.class); } public void setEventBus(EventBus eventBus){ eventBus.registerObserver(this); super.setEventBus(eventBus); } /** @see FormResponseDao#getFormResponseCount(Form) */ public int getFormResponseCount(Form form) { DetachedCriteria criteria = super.getCriterion(); criteria.add(Restrictions.eq(FormResponse.FIELD_FORM, form)); return super.getCount(criteria); } /** @see FormResponseDao#getFormResponses(Form, int, int) */ public List<FormResponse> getFormResponses(Form form, int startIndex, int limit) { // TODO please write a unit test to demonstrate the working code working and the non-working // code NOT working. This has proved difficult so far. However, we (i.e. Morgan ;) worked // out what is wrong with the non-working code - it's returning <limit> objects rather than // <limit> FormResponses - it's counting the ResponseValue objects as well as the FormResponses. // Why? Not sure. Does it behave this way in the unit tests? Nope. )¬; // THIS DOES NOT WORK // DetachedCriteria criteria = super.getCriterion(); // criteria.add(Restrictions.eq(FormResponse.FIELD_FORM, form)); // return super.getList(criteria, startIndex, limit); // THIS WORKS: String selectString = "SELECT fr FROM " + FormResponse.class.getName() + " fr " + "WHERE " + FormResponse.FIELD_FORM + "=?"; return super.getList(selectString, startIndex, limit, form); } /** @see FormResponseDao#getFormResponses(Form) */ public List<FormResponse> getFormResponses(Form form) { DetachedCriteria criteria = super.getCriterion(); criteria.add(Restrictions.eq(FormResponse.FIELD_FORM, form)); return super.getList(criteria); } /** @see FormResponseDao#saveResponse(FormResponse) */ public void saveResponse(FormResponse formResponse) { super.saveWithoutDuplicateHandling(formResponse); } public void notify(FrontlineEventNotification notification) { if (notification instanceof DatabaseEntityNotification<?>) { Object entity = ((DatabaseEntityNotification<?>) notification).getDatabaseEntity(); if (entity instanceof Form && notification instanceof EntityDeleteWarning<?>) { deleteResponsesOf((Form) entity); } } } /** * Deletes all responses related to a form * @param form */ private void deleteResponsesOf(Form form) { DetachedCriteria criteria = super.getCriterion(); criteria.add(Restrictions.eq(FormResponse.FIELD_FORM, form)); for (FormResponse formResponse : super.getList(criteria)) { super.delete(formResponse); } } public void delete(FormResponse formResponse) { super.delete(formResponse); } }