package org.akaza.openclinica.dao.hibernate;
import java.util.List;
import org.akaza.openclinica.domain.datamap.StudyEvent;
import org.akaza.openclinica.patterns.ocobserver.OnStudyEventUpdated;
import org.akaza.openclinica.patterns.ocobserver.StudyEventChangeDetails;
import org.akaza.openclinica.patterns.ocobserver.StudyEventContainer;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
public class StudyEventDao extends AbstractDomainDao<StudyEvent> implements ApplicationEventPublisherAware{
private ApplicationEventPublisher eventPublisher;
private StudyEventChangeDetails changeDetails;
public Class<StudyEvent> domainClass(){
return StudyEvent.class;
}
public StudyEvent findByStudyEventId(int study_event_id) {
String query = "from " + getDomainClassName() + " study_event where study_event.studyEventId = :studyeventid ";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studyeventid", study_event_id);
return (StudyEvent) q.uniqueResult();
}
public StudyEvent fetchByStudyEventDefOID(String oid,Integer studySubjectId){
String query = " from StudyEvent se where se.studySubject.studySubjectId = :studySubjectId and se.studyEventDefinition.oc_oid = :oid order by se.studyEventDefinition.ordinal,se.sampleOrdinal";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studySubjectId", studySubjectId);
q.setString("oid", oid);
StudyEvent se = (StudyEvent) q.uniqueResult();
// this.eventPublisher.publishEvent(new OnStudyEventUpdated(se));
return se;
}
public StudyEvent fetchByStudyEventDefOIDAndOrdinal(String oid,Integer ordinal,Integer studySubjectId){
String query = " from StudyEvent se where se.studySubject.studySubjectId = :studySubjectId and se.studyEventDefinition.oc_oid = :oid and se.sampleOrdinal = :ordinal order by se.studyEventDefinition.ordinal,se.sampleOrdinal";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studySubjectId", studySubjectId);
q.setString("oid", oid);
q.setInteger("ordinal", ordinal);
StudyEvent se = (StudyEvent) q.uniqueResult();
// this.eventPublisher.publishEvent(new OnStudyEventUpdated(se));
return se;
}
public Integer findMaxOrdinalByStudySubjectStudyEventDefinition(int studySubjectId, int studyEventDefinitionId) {
String query = "select max(sample_ordinal) from study_event where study_subject_id = " + studySubjectId + " and study_event_definition_id = " + studyEventDefinitionId;
org.hibernate.Query q = getCurrentSession().createSQLQuery(query);
Number result = (Number) q.uniqueResult();
if (result == null) return 0;
else return result.intValue();
}
public List<StudyEvent> fetchListByStudyEventDefOID(String oid,Integer studySubjectId){
List<StudyEvent> eventList = null;
String query = " from StudyEvent se where se.studySubject.studySubjectId = :studySubjectId and se.studyEventDefinition.oc_oid = :oid order by se.studyEventDefinition.ordinal,se.sampleOrdinal";
org.hibernate.Query q = getCurrentSession().createQuery(query);
q.setInteger("studySubjectId", studySubjectId);
q.setString("oid", oid);
eventList = (List<StudyEvent>) q.list();
return eventList;
}
@Transactional(propagation = Propagation.NEVER)
public StudyEvent saveOrUpdate(StudyEventContainer container) {
StudyEvent event = saveOrUpdate(container.getEvent());
this.eventPublisher.publishEvent(new OnStudyEventUpdated(container));
return event;
}
public StudyEvent saveOrUpdateTransactional(StudyEventContainer container) {
StudyEvent event = saveOrUpdate(container.getEvent());
this.eventPublisher.publishEvent(new OnStudyEventUpdated(container));
return event;
}
@Override
public StudyEvent saveOrUpdate(StudyEvent domainObject) {
super.saveOrUpdate(domainObject);
getCurrentSession().flush();
return domainObject;
}
@Override
public void setApplicationEventPublisher(
ApplicationEventPublisher applicationEventPublisher) {
this.eventPublisher = applicationEventPublisher;
}
public void setChangeDetails(StudyEventChangeDetails changeDetails) {
this.changeDetails = changeDetails;
}
}