package edu.ualberta.med.biobank.common.action.dispatch;
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.ListResult;
import edu.ualberta.med.biobank.common.action.exception.ActionException;
import edu.ualberta.med.biobank.common.util.DispatchSpecimenState;
import edu.ualberta.med.biobank.common.util.DispatchState;
import edu.ualberta.med.biobank.model.Center;
import edu.ualberta.med.biobank.model.Dispatch;
import edu.ualberta.med.biobank.model.DispatchSpecimen;
import edu.ualberta.med.biobank.model.PermissionEnum;
public class DispatchRetrievalAction implements Action<ListResult<Dispatch>> {
private static final long serialVersionUID = 1L;
private DispatchState state;
private Integer centerId;
private Boolean isSender;
private Boolean noErrors;
private static String DISPATCH_HQL_STATE_SELECT =
"SELECT DISTINCT d FROM " + Dispatch.class.getName() + " d" //$NON-NLS-1$ //$NON-NLS-2$
+ " LEFT JOIN FETCH d.dispatchSpecimens" //$NON-NLS-1$
+ " INNER JOIN FETCH d.senderCenter" //$NON-NLS-1$
+ " INNER JOIN FETCH d.receiverCenter" //$NON-NLS-1$
+ " LEFT JOIN FETCH d.shipmentInfo si" //$NON-NLS-1$
+ " LEFT JOIN FETCH si.shippingMethod" //$NON-NLS-1$
+ " WHERE d.state=? AND "; //$NON-NLS-1$
private static String SENDER_HQL = "d.senderCenter.id=?"; //$NON-NLS-1$
private static String RECEIVER_HQL = "d.receiverCenter.id=?"; //$NON-NLS-1$
private static String NOTEMPTY_HQL = " AND EXISTS "; //$NON-NLS-1$
private static String EMPTY_HQL = " AND NOT EXISTS "; //$NON-NLS-1$
private static String NO_ERRORS_HQL = "(FROM " //$NON-NLS-1$
+ DispatchSpecimen.class.getName() + " ds" //$NON-NLS-1$
+ " WHERE (ds.state=" + DispatchSpecimenState.MISSING.getId() //$NON-NLS-1$
+ " OR ds.state=" + DispatchSpecimenState.EXTRA.getId() //$NON-NLS-1$
+ ") AND ds.dispatch.id=d.id) "; //$NON-NLS-1$
public DispatchRetrievalAction(DispatchState state, Integer centerId,
Boolean isSender, Boolean noErrors) {
this.state = state;
this.centerId = centerId;
this.isSender = isSender;
this.noErrors = noErrors;
}
@Override
public boolean isAllowed(ActionContext context) throws ActionException {
return PermissionEnum.DISPATCH_READ.isAllowed(context.getUser(),
context.load(Center.class, centerId));
}
@Override
public ListResult<Dispatch> run(ActionContext context)
throws ActionException {
StringBuffer qryBuf = new StringBuffer(DISPATCH_HQL_STATE_SELECT);
if (isSender)
qryBuf.append(SENDER_HQL);
else
qryBuf.append(RECEIVER_HQL);
if (noErrors)
qryBuf.append(EMPTY_HQL);
else
qryBuf.append(NOTEMPTY_HQL);
qryBuf.append(NO_ERRORS_HQL);
Query q = context.getSession().createQuery(qryBuf.toString());
q.setParameter(0, state.getId());
q.setParameter(1, centerId);
ArrayList<Dispatch> dispatches = new ArrayList<Dispatch>();
Query query = context.getSession().createQuery(qryBuf.toString());
query.setParameter(0, state.getId());
query.setParameter(1, centerId);
@SuppressWarnings("unchecked")
List<Dispatch> results = query.list();
if (results != null) {
dispatches.addAll(results);
}
return new ListResult<Dispatch>(dispatches);
}
}