package edu.ualberta.med.biobank.common.action.search; import java.util.ArrayList; 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.permission.specimen.SpecimenSiteReadPermission; import edu.ualberta.med.biobank.model.Specimen; public class SpecimenByPositionSearchAction implements Action<ListResult<Integer>> { @SuppressWarnings("nls") protected static final String SPEC_BASE_QRY = "SELECT distinct spec.id FROM " + Specimen.class.getName() + " spec" + " where spec.specimenPosition.container.label=? and spec.specimenPosition.positionString=? and spec.currentCenter.id=?"; private static final long serialVersionUID = 1L; private String positionString; private Integer currentCenter; public SpecimenByPositionSearchAction(String positionString, Integer currentCenter) { this.positionString = positionString; this.currentCenter = currentCenter; } @Override public boolean isAllowed(ActionContext context) throws ActionException { return new SpecimenSiteReadPermission(currentCenter).isAllowed(context); } @SuppressWarnings("unchecked") @Override public ListResult<Integer> run(ActionContext context) throws ActionException { if (positionString.length() > 2) { String container = positionString.substring(0, positionString.length() - 2); String specimen = positionString.substring(positionString.length() - 2); Query q = context.getSession().createQuery(SPEC_BASE_QRY); q.setParameter(0, container); q.setParameter(1, specimen); q.setParameter(2, currentCenter); return new ListResult<Integer>(q.list()); } return new ListResult<Integer>(new ArrayList<Integer>()); } }