package edu.ualberta.med.biobank.common.action.site; 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.permission.container.ContainerReadPermission; import edu.ualberta.med.biobank.model.Container; import edu.ualberta.med.biobank.model.Site; public class SiteGetTopContainersAction implements Action<ListResult<Container>> { private static final long serialVersionUID = 1L; // This query has to initialise specimenPositions due to the // tree adapter needing to know this to display additional menu selections // when a right click is done on a container node. // // Also has to initialize containerType.childContainerTypes to support // container drag and drop. // // @formatter:off @SuppressWarnings("nls") private static final String SELECT_TOP_CONTAINERS_HQL = "SELECT container" + " FROM " + Container.class.getName() + " container" + " INNER JOIN FETCH container.containerType containerType" + " INNER JOIN FETCH containerType.childContainerTypes" + " INNER JOIN FETCH container.site site" + " LEFT JOIN FETCH container.specimenPositions" + " WHERE site.id = ?" + " AND containerType.topLevel IS TRUE"; // only select top-level // Container-s // @formatter:on private final Integer siteId; public SiteGetTopContainersAction(Integer siteId) { this.siteId = siteId; } public SiteGetTopContainersAction(Site site) { this(site.getId()); } @Override public boolean isAllowed(ActionContext context) { return new ContainerReadPermission(siteId).isAllowed(context); } @Override public ListResult<Container> run(ActionContext context) throws ActionException { ArrayList<Container> topContainers = new ArrayList<Container>(0); Query query = context.getSession().createQuery(SELECT_TOP_CONTAINERS_HQL); query.setParameter(0, siteId); @SuppressWarnings("unchecked") List<Container> results = query.list(); if (results != null) { topContainers.addAll(results); } return new ListResult<Container>(topContainers); } }