package edu.ualberta.med.biobank.common.action.clinic;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Query;
import edu.ualberta.med.biobank.common.action.Action;
import edu.ualberta.med.biobank.common.action.ActionContext;
import edu.ualberta.med.biobank.common.action.ActionResult;
import edu.ualberta.med.biobank.common.action.clinic.ClinicGetInfoAction.ClinicInfo;
import edu.ualberta.med.biobank.common.action.exception.ActionException;
import edu.ualberta.med.biobank.common.action.info.StudyCountInfo;
import edu.ualberta.med.biobank.common.permission.clinic.ClinicReadPermission;
import edu.ualberta.med.biobank.model.Clinic;
import edu.ualberta.med.biobank.model.Contact;
public class ClinicGetInfoAction implements Action<ClinicInfo> {
private static final long serialVersionUID = 1L;
@SuppressWarnings("nls")
private static final String CLINIC_INFO_HQL =
"SELECT DISTINCT clinic"
+ " FROM " + Clinic.class.getName() + " clinic"
+ " INNER JOIN FETCH clinic.address"
+ " LEFT JOIN FETCH clinic.contacts contacts"
+ " LEFT JOIN FETCH clinic.comments comments"
+ " LEFT JOIN FETCH contacts.studies"
+ " LEFT JOIN FETCH comments.user"
+ " WHERE clinic.id = ?";
@SuppressWarnings("nls")
private static final String CLINIC_COUNT_INFO_HQL =
"SELECT clinic,COUNT(DISTINCT patients),COUNT(DISTINCT cevents)"
+ " FROM " + Clinic.class.getName() + " clinic"
+ " LEFT JOIN clinic.originInfos oi"
+ " LEFT JOIN oi.specimens spcs"
+ " LEFT JOIN spcs.collectionEvent cevents"
+ " LEFT JOIN cevents.patient patients"
+ " WHERE clinic.id=?";
private final Integer clinicId;
private final ClinicGetContactsAction getContacts;
private final ClinicGetStudyInfoAction getStudyInfo;
public ClinicGetInfoAction(Integer clinicId) {
if (clinicId == null) {
throw new IllegalArgumentException();
}
this.clinicId = clinicId;
this.getContacts = new ClinicGetContactsAction(clinicId);
this.getStudyInfo = new ClinicGetStudyInfoAction(clinicId);
}
@Override
public boolean isAllowed(ActionContext context) throws ActionException {
return new ClinicReadPermission(clinicId).isAllowed(context);
}
@Override
public ClinicInfo run(ActionContext context) throws ActionException {
Query query = context.getSession().createQuery(CLINIC_INFO_HQL);
query.setParameter(0, clinicId);
Clinic clinic = (Clinic) query.uniqueResult();
ClinicInfo clinicInfo = new ClinicInfo();
clinicInfo.clinic = clinic;
query = context.getSession().createQuery(CLINIC_COUNT_INFO_HQL);
query.setParameter(0, clinicId);
Object[] items = (Object[]) query.uniqueResult();
clinicInfo.patientCount = (Long) items[1];
clinicInfo.collectionEventCount = (Long) items[2];
clinicInfo.contacts = getContacts.run(context).getList();
clinicInfo.studyInfos = getStudyInfo.run(context).getList();
return clinicInfo;
}
public static class ClinicInfo implements ActionResult {
private static final long serialVersionUID = 1L;
public Clinic clinic;
public Long patientCount;
public Long collectionEventCount;
public List<Contact> contacts = new ArrayList<Contact>();
public List<StudyCountInfo> studyInfos =
new ArrayList<StudyCountInfo>();
}
}