package edu.ualberta.med.biobank.common.action.patient; 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.exception.ActionException; import edu.ualberta.med.biobank.model.Center; import edu.ualberta.med.biobank.model.Patient; import edu.ualberta.med.biobank.model.ProcessingEvent; /** * * @author jferland * */ public class PatientGetProcessingEventsByPNumberAction implements Action<PatientGetProcessingEventsByPNumberResult> { private static final long serialVersionUID = 1L; // @formatter:off private static final String PATIENT_EXISTS_HQL = "SELECT 1 FROM " + Patient.class.getName() + "WHERE pnumber = ?"; private static final String PROCESSING_EVENTS_GET_HQL = "SELECT distinct(processingEvent)" + " FROM " + Patient.class.getName() + " AS patient" + " JOIN patient.collectionEvents AS collectionEvents" + " JOIN collectionEvents.allSpecimens AS specimens" + " JOIN specimens.processingEvent AS processingEvent" + " WHERE patient.pnumber = ?" + " AND processingEvent.center.id = ?" + " ORDER BY processingEvent.createdAt DESC"; // @formatter:on private final String pNumber; private final Integer centerId; public PatientGetProcessingEventsByPNumberAction(String pNumber, Integer centerId) { this.pNumber = pNumber; this.centerId = centerId; } @Override public boolean isAllowed(ActionContext context) { return true; // TODO: permission check } @Override public PatientGetProcessingEventsByPNumberResult run(ActionContext context) throws ActionException { if (pNumber == null || pNumber.isEmpty()) { // throw new LocalizedActionException(Messages.Greeting, "one", // "two"); // throw new EmptyValueException(Patient.class, // PatientPeer.PNUMBER); // throw new LocalizedException(Messages.badPNumber, pNumber); // "asdf" = "{0} is a {1} dog"; // "asdf" = "" // // "action.check.pnumberNotNull" = // "Patient number '{0}' is not a legal value"; } if (centerId == null) { // throw new IllegalValueException(Center.class, CenterPeer.ID); } context.load(Center.class, centerId); // ensure Center exists boolean exists = isPatientExists(context); List<ProcessingEvent> pEvents = getProcessingEvents(context); return new PatientGetProcessingEventsByPNumberResult(exists, pEvents); } private boolean isPatientExists(ActionContext context) { Query query = context.getSession().createQuery(PATIENT_EXISTS_HQL); query.setParameter(0, pNumber); return !query.list().isEmpty(); } private List<ProcessingEvent> getProcessingEvents(ActionContext context) { List<ProcessingEvent> pEvents = new ArrayList<ProcessingEvent>(); Query query = context.getSession().createQuery(PROCESSING_EVENTS_GET_HQL); query.setParameter(0, pNumber); query.setParameter(1, centerId); @SuppressWarnings("unchecked") List<ProcessingEvent> result = query.list(); pEvents.addAll(result); return pEvents; } }