package edu.ualberta.med.biobank.common.action.container;
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.comment.CommentUtil;
import edu.ualberta.med.biobank.common.action.exception.ActionCheckException;
import edu.ualberta.med.biobank.common.action.exception.ActionException;
import edu.ualberta.med.biobank.common.permission.Permission;
import edu.ualberta.med.biobank.common.permission.container.ContainerCreatePermission;
import edu.ualberta.med.biobank.common.permission.container.ContainerUpdatePermission;
import edu.ualberta.med.biobank.common.util.RowColPos;
import edu.ualberta.med.biobank.model.ActivityStatus;
import edu.ualberta.med.biobank.model.Comment;
import edu.ualberta.med.biobank.model.Container;
import edu.ualberta.med.biobank.model.ContainerType;
import edu.ualberta.med.biobank.model.Site;
public class ContainerSaveAction implements Action<IdResult> {
private static final long serialVersionUID = 1L;
public Integer containerId;
public ActivityStatus activityStatus;
public String barcode;
public String label;
public Integer siteId;
public Integer typeId;
public RowColPos position;
public String path;
public Integer parentId;
private String commentText;
public void setId(Integer containerId) {
this.containerId = containerId;
}
public void setActivityStatus(ActivityStatus activityStatus) {
this.activityStatus = activityStatus;
}
public void setBarcode(String barcode) {
this.barcode = barcode;
}
public void setLabel(String label) {
this.label = label;
}
public void setSiteId(Integer siteId) {
this.siteId = siteId;
}
public void setTypeId(Integer typeId) {
this.typeId = typeId;
}
public void setPosition(RowColPos position) {
this.position = position;
}
public void setParentId(Integer parentId) {
this.parentId = parentId;
}
public void setCommentText(String commentText) {
this.commentText = commentText;
}
@Override
public boolean isAllowed(ActionContext context) {
Permission permission;
if (containerId == null)
permission = new ContainerCreatePermission(siteId);
else
permission = new ContainerUpdatePermission(containerId);
return permission.isAllowed(context);
}
@Override
public IdResult run(ActionContext context) throws ActionException {
Container container;
if (containerId != null) {
container = context.load(Container.class, containerId);
} else {
container = new Container();
}
container.setActivityStatus(activityStatus);
container.setSite(context.load(Site.class, siteId));
container.setProductBarcode(barcode);
container.setContainerType(context.load(ContainerType.class,
typeId));
if (parentId != null) {
if (label != null) {
throw new ActionCheckException(
"cannot set label on child containers");
}
ContainerActionHelper.setPosition(context, container, position,
parentId);
Container parent = context.load(Container.class, parentId);
ContainerActionHelper.updateContainerPathAndLabel(container,
parent);
} else {
container.setLabel(label);
container.setTopContainer(container);
}
Comment comment = CommentUtil.create(context.getUser(), commentText);
if (comment != null) {
context.getSession().save(comment);
container.getComments().add(comment);
}
context.getSession().saveOrUpdate(container);
return new IdResult(container.getId());
}
}