package edu.ualberta.med.biobank.common.action.specimen;
import java.util.ArrayList;
import java.util.List;
import edu.ualberta.med.biobank.common.action.Action;
import edu.ualberta.med.biobank.common.action.ActionContext;
import edu.ualberta.med.biobank.common.action.ActionResult;
import edu.ualberta.med.biobank.common.action.exception.ActionException;
import edu.ualberta.med.biobank.common.action.specimen.SpecimenAssignSaveAction.SpecimenAssignResInfo;
import edu.ualberta.med.biobank.common.permission.specimen.SpecimenAssignPermission;
import edu.ualberta.med.biobank.common.util.RowColPos;
import edu.ualberta.med.biobank.model.Container;
import edu.ualberta.med.biobank.model.Specimen;
public class SpecimenAssignSaveAction implements Action<SpecimenAssignResInfo> {
private static final long serialVersionUID = 1L;
public static class SpecimenInfo implements ActionResult {
private static final long serialVersionUID = 1L;
public Integer specimenId;
public RowColPos position;
}
public static class SpecimenAssignResInfo implements ActionResult {
private static final long serialVersionUID = 1L;
public Integer parentContainerId;
public String parentBarcode;
public String parentTypeName;
public String parentLabel;
public String siteName;
public List<SpecimenResInfo> specimens;
}
public static class SpecimenResInfo implements ActionResult {
private static final long serialVersionUID = 1L;
public Integer specimenId;
public String position;
public String inventoryId;
public String typeName;
public String patientPNumber;
public String visitNumber;
public String centerName;
}
private List<SpecimenInfo> specInfos;
private Integer containerId;
public SpecimenAssignSaveAction(Integer containerId,
List<SpecimenInfo> specInfos) {
this.specInfos = specInfos;
this.containerId = containerId;
}
@Override
public boolean isAllowed(ActionContext context) {
Container container = context.load(Container.class, containerId);
Integer centerId = container.getSite().getId();
return new SpecimenAssignPermission(centerId).isAllowed(context);
}
@Override
public SpecimenAssignResInfo run(ActionContext context)
throws ActionException {
SpecimenAssignResInfo res = new SpecimenAssignResInfo();
if (containerId == null && containerId == null)
throw new ActionException("problem in data sent"); //$NON-NLS-1$
res.parentContainerId = containerId;
Container container = context.load(Container.class, containerId);
res.parentBarcode = container.getProductBarcode();
res.parentTypeName = container.getContainerType().getName();
res.parentLabel = container.getLabel();
res.siteName = container.getSite().getNameShort();
res.specimens =
new ArrayList<SpecimenAssignSaveAction.SpecimenResInfo>();
for (SpecimenInfo si : specInfos) {
Specimen specimen =
context.load(Specimen.class, si.specimenId);
SpecimenActionHelper.setPosition(context, specimen,
si.position,
containerId);
context.getSession().saveOrUpdate(specimen);
SpecimenResInfo rInfo = new SpecimenResInfo();
rInfo.specimenId = specimen.getId();
rInfo.position = SpecimenActionHelper.getPositionString(specimen,
true, false);
rInfo.inventoryId = specimen.getInventoryId();
rInfo.typeName = specimen.getSpecimenType().getName();
rInfo.patientPNumber = specimen.getCollectionEvent().getPatient()
.getPnumber();
rInfo.visitNumber = specimen.getCollectionEvent().getVisitNumber()
.toString();
rInfo.centerName = specimen.getCurrentCenter().getNameShort();
res.specimens.add(rInfo);
}
return res;
}
}