package edu.ualberta.med.biobank.common.action.container;
import org.hibernate.Session;
import edu.ualberta.med.biobank.common.action.Action;
import edu.ualberta.med.biobank.common.action.ActionContext;
import edu.ualberta.med.biobank.common.action.IdResult;
import edu.ualberta.med.biobank.common.action.exception.ActionException;
import edu.ualberta.med.biobank.common.permission.container.ContainerUpdatePermission;
import edu.ualberta.med.biobank.model.Container;
import edu.ualberta.med.biobank.model.SpecimenPosition;
public class ContainerMoveSpecimensAction implements Action<IdResult> {
private static final long serialVersionUID = 1L;
public final Integer fromContainerId;
public final Integer toContainerId;
public ContainerMoveSpecimensAction(Container fromContainer,
Container toContainer) {
if (fromContainer == null) {
throw new IllegalArgumentException("Container to move from is null");
}
if (toContainer == null) {
throw new IllegalArgumentException("Container to move to is null");
}
this.fromContainerId = fromContainer.getId();
this.toContainerId = toContainer.getId();
}
@Override
public boolean isAllowed(ActionContext context) throws ActionException {
return new ContainerUpdatePermission(fromContainerId)
.isAllowed(context)
&& new ContainerUpdatePermission(toContainerId).isAllowed(context);
}
@Override
public IdResult run(ActionContext context) throws ActionException {
// move all specimens from fromContainerId to toContainerId
Container fromContainer =
context.load(Container.class, fromContainerId);
Container toContainer = context.load(Container.class, toContainerId);
Session session = context.getSession();
for (SpecimenPosition pos : fromContainer.getSpecimenPositions()) {
pos.setContainer(toContainer);
session.saveOrUpdate(pos);
}
return new IdResult(toContainer.getId());
}
}