package edu.ualberta.med.biobank.common.wrappers.checks; import java.text.MessageFormat; import java.util.List; import org.hibernate.Query; import org.hibernate.Session; import edu.ualberta.med.biobank.common.peer.AbstractPositionPeer; import edu.ualberta.med.biobank.common.peer.CapacityPeer; import edu.ualberta.med.biobank.common.peer.ContainerPeer; import edu.ualberta.med.biobank.common.peer.ContainerTypePeer; import edu.ualberta.med.biobank.common.wrappers.ModelWrapper; import edu.ualberta.med.biobank.common.wrappers.Property; import edu.ualberta.med.biobank.common.wrappers.actions.WrapperAction; import edu.ualberta.med.biobank.model.AbstractPosition; import edu.ualberta.med.biobank.model.Capacity; import edu.ualberta.med.biobank.model.Container; import edu.ualberta.med.biobank.server.applicationservice.exceptions.BiobankSessionException; public class ContainerPositionInBoundsCheck<E extends AbstractPosition> extends WrapperAction<E> { private static final long serialVersionUID = 1L; private static final String HQL = "SELECT o.{0}, o.{1} FROM {2} o WHERE o = ?"; //$NON-NLS-1$ private static final String OUT_OF_BOUNDS_POSITION_MSG = Messages.getString("ContainerPositionInBoundsCheck.out.of.bounds.position.msg"); //$NON-NLS-1$ private static final Property<Capacity, Container> CONTAINER_CAPACITY = ContainerPeer.CONTAINER_TYPE .to(ContainerTypePeer.CAPACITY); private static final Property<Integer, Container> MAX_ROW = CONTAINER_CAPACITY .to(CapacityPeer.ROW_CAPACITY); private static final Property<Integer, Container> MAX_COL = CONTAINER_CAPACITY .to(CapacityPeer.COL_CAPACITY); protected final Property<Integer, ? super E> maxRowProperty; protected final Property<Integer, ? super E> maxColProperty; public ContainerPositionInBoundsCheck(ModelWrapper<E> wrapper, Property<Container, ? super E> containerProperty) { super(wrapper); this.maxRowProperty = containerProperty.to(MAX_ROW); this.maxColProperty = containerProperty.to(MAX_COL); } @Override public Object doAction(Session session) throws BiobankSessionException { String hql = MessageFormat.format(HQL, maxRowProperty.getName(), maxColProperty.getName(), getModelClass().getName()); Query query = session.createQuery(hql); query.setParameter(0, getModel()); List<?> list = query.list(); Integer maxRow = null, maxCol = null; for (Object result : list) { if (result instanceof Object[]) { Object[] array = (Object[]) result; maxRow = (Integer) array[0]; maxCol = (Integer) array[1]; } break; } E model = getModel(); Integer row = AbstractPositionPeer.ROW.get(model); Integer col = AbstractPositionPeer.COL.get(model); if (maxRow != null && maxCol != null && (row < 0 || row >= maxRow || col < 0 || col >= maxCol)) { String msg = MessageFormat.format(OUT_OF_BOUNDS_POSITION_MSG, row, col, maxRow, maxCol); throw new BiobankSessionException(msg); } return null; } }