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.action.info.SiteContainerTypeInfo;
import edu.ualberta.med.biobank.common.permission.site.SiteReadPermission;
import edu.ualberta.med.biobank.model.Container;
import edu.ualberta.med.biobank.model.ContainerType;
import edu.ualberta.med.biobank.model.Site;
public class SiteGetContainerTypeInfoAction implements
Action<ListResult<SiteContainerTypeInfo>> {
private static final long serialVersionUID = 1L;
@SuppressWarnings("nls")
private static final String SELECT_CONTAINER_TYPE_INFO_HQL =
"SELECT containerType,"
+ " (SELECT COUNT(*) FROM "
+ Container.class.getName()
+ " c WHERE c.containerType = containerType)"
+ " FROM " + ContainerType.class.getName() + " containerType"
+ " INNER JOIN FETCH containerType.capacity"
+ " WHERE containerType.site.id = ?"
+ " ORDER BY containerType.nameShort";
private final Integer siteId;
public SiteGetContainerTypeInfoAction(Integer siteId) {
this.siteId = siteId;
}
public SiteGetContainerTypeInfoAction(Site site) {
this(site.getId());
}
@Override
public boolean isAllowed(ActionContext context) {
return new SiteReadPermission(siteId).isAllowed(context);
}
@Override
public ListResult<SiteContainerTypeInfo> run(ActionContext context)
throws ActionException {
ArrayList<SiteContainerTypeInfo> containerTypes =
new ArrayList<SiteContainerTypeInfo>();
Query query =
context.getSession().createQuery(SELECT_CONTAINER_TYPE_INFO_HQL);
query.setParameter(0, siteId);
@SuppressWarnings("unchecked")
List<Object[]> results = query.list();
for (Object[] row : results) {
SiteContainerTypeInfo containerTypeInfo =
new SiteContainerTypeInfo(
(ContainerType) row[0], (Long) row[1]);
containerTypes.add(containerTypeInfo);
}
return new ListResult<SiteContainerTypeInfo>(containerTypes);
}
}