package edu.ualberta.med.biobank.common.action.processingEvent; 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.processingEvent.ProcessingEventDeletePermission; import edu.ualberta.med.biobank.model.ActivityStatus; import edu.ualberta.med.biobank.model.ProcessingEvent; import edu.ualberta.med.biobank.model.Specimen; public class ProcessingEventDeleteAction implements Action<IdResult> { private static final long serialVersionUID = 1L; private final Integer peventId; public ProcessingEventDeleteAction(ProcessingEvent pevent) { if (pevent == null) { throw new IllegalArgumentException(); } this.peventId = pevent.getId(); } @Override public boolean isAllowed(ActionContext context) { return new ProcessingEventDeletePermission(peventId).isAllowed(context); } @Override public IdResult run(ActionContext context) throws ActionException { ProcessingEvent pevent = context.load(ProcessingEvent.class, peventId); // if no aliquoted specimen, then ok to remove the specimens and to // delete the processing event for (Specimen sp : pevent.getSpecimens()) { if (sp.getChildSpecimens().size() != 0) throw new ActionException( "Delete failed. There are child specimens linked through this processing event"); sp.setActivityStatus(ActivityStatus.ACTIVE); sp.setProcessingEvent(null); context.getSession().saveOrUpdate(sp); } context.getSession().delete(pevent); return new IdResult(peventId); } }