package edu.ualberta.med.biobank.common.action.request; 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.peer.ContainerPeer; import edu.ualberta.med.biobank.common.peer.RequestSpecimenPeer; import edu.ualberta.med.biobank.common.peer.SpecimenPeer; import edu.ualberta.med.biobank.common.peer.SpecimenPositionPeer; import edu.ualberta.med.biobank.common.permission.request.RequestReadPermission; import edu.ualberta.med.biobank.model.RequestSpecimen; public class RequestGetSpecimenInfosAction implements Action<ListResult<Object[]>> { @SuppressWarnings("nls") public static final String TREE_QUERY = "select ra, concat(c.path, concat('/', c.id)), c.id, a.id, st.id, sp.id from " //$NON-NLS-1$ + RequestSpecimen.class.getName() + " ra inner join fetch ra." //$NON-NLS-1$ + RequestSpecimenPeer.SPECIMEN.getName() + " a inner join fetch a.collectionEvent" //$NON-NLS-1$ + " ce inner join fetch ce.patient inner join fetch a." + SpecimenPeer.SPECIMEN_TYPE.getName() + " st inner join fetch a." //$NON-NLS-1$ + SpecimenPeer.SPECIMEN_POSITION.getName() + " sp inner join fetch sp." //$NON-NLS-1$ + SpecimenPositionPeer.CONTAINER.getName() + " c inner join fetch c." + ContainerPeer.POSITION.getName() + " cp inner join fetch c.topContainer " + "top inner join fetch top.containerType ct where ra." //$NON-NLS-1$ + RequestSpecimenPeer.REQUEST.getName() + ".id=? order by ra." //$NON-NLS-1$ + RequestSpecimenPeer.STATE.getName(); private static final long serialVersionUID = 1L; private Integer requestId; public RequestGetSpecimenInfosAction(Integer requestId) { this.requestId = requestId; } @Override public boolean isAllowed(ActionContext context) throws ActionException { return new RequestReadPermission().isAllowed(context); } @Override public ListResult<Object[]> run(ActionContext context) throws ActionException { ArrayList<Object[]> specInfos = new ArrayList<Object[]>(); Query query = context.getSession().createQuery(TREE_QUERY); query.setParameter(0, requestId); @SuppressWarnings("unchecked") List<Object> rows = query.list(); for (Object row : rows) { specInfos.add((Object[]) row); } return new ListResult<Object[]>(specInfos); } }