package edu.ualberta.med.biobank.common.action.container; import java.util.HashMap; import java.util.Map; import edu.ualberta.med.biobank.common.action.ActionContext; import edu.ualberta.med.biobank.common.action.BooleanResult; import edu.ualberta.med.biobank.common.action.exception.ActionException; import edu.ualberta.med.biobank.common.permission.container.ContainerCreatePermission; import edu.ualberta.med.biobank.common.util.RowColPos; import edu.ualberta.med.biobank.model.ActivityStatus; import edu.ualberta.med.biobank.model.Capacity; import edu.ualberta.med.biobank.model.Container; import edu.ualberta.med.biobank.model.ContainerPosition; /** * Initialise children at given positions with the given type. If the positions * list is null, initialise all the children. <strong>If a position is already * filled then it is skipped and no changes are made to it</strong>. * * @return true if at least one children has been initialised */ public class ContainerCreateChildrenAction extends ContainerChildAction { private static final long serialVersionUID = 1L; protected Map<RowColPos, Container> children; protected Integer siteId; @Override public boolean isAllowed(ActionContext context) throws ActionException { return new ContainerCreatePermission(siteId).isAllowed(context); } @Override public BooleanResult run(ActionContext context) throws ActionException { Container parentContainer = context.load(Container.class, parentContainerId); siteId = parentContainer.getSite().getId(); boolean result = false; children = new HashMap<RowColPos, Container>(); for (ContainerPosition pos : parentContainer .getChildPositions()) { children.put(new RowColPos(pos.getRow(), pos.getCol()), pos.getContainer()); } if (positions == null) { Capacity capacity = parentContainer.getContainerType().getCapacity(); for (int i = 0, n = capacity.getRowCapacity().intValue(); i < n; i++) { for (int j = 0, m = capacity.getColCapacity().intValue(); j < m; j++) { result |= addChildContainer(context, new RowColPos(i, j)); } } } else { for (RowColPos rcp : positions) { result |= addChildContainer(context, rcp); } } return new BooleanResult(result); } protected boolean addChildContainer(ActionContext context, RowColPos rcp) { Container childContainer = children.get(rcp); // only initialize if empty if (childContainer != null) return false; ContainerSaveAction containerSaveAction = new ContainerSaveAction(); containerSaveAction.setTypeId(childContainerTypeId); containerSaveAction.setSiteId(siteId); containerSaveAction.setParentId(parentContainerId); containerSaveAction.setPosition(rcp); containerSaveAction.setActivityStatus(ActivityStatus.ACTIVE); containerSaveAction.run(context); return true; } }