package edu.ualberta.med.biobank.common.action.researchGroup;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
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.action.info.ResearchGroupSaveInfo;
import edu.ualberta.med.biobank.common.permission.researchGroup.ResearchGroupUpdatePermission;
import edu.ualberta.med.biobank.model.Address;
import edu.ualberta.med.biobank.model.Comment;
import edu.ualberta.med.biobank.model.ResearchGroup;
import edu.ualberta.med.biobank.model.Study;
public class ResearchGroupSaveAction implements Action<IdResult> {
/**
*
*/
private static final long serialVersionUID = 1L;
private ResearchGroupSaveInfo rgInfo;
public ResearchGroupSaveAction(ResearchGroupSaveInfo rgInfo) {
this.rgInfo = rgInfo;
}
@Override
public boolean isAllowed(ActionContext context) throws ActionException {
return new ResearchGroupUpdatePermission(rgInfo.id).isAllowed(context);
}
@Override
public IdResult run(ActionContext context) throws ActionException {
ResearchGroup rg =
context
.get(ResearchGroup.class, rgInfo.id, new ResearchGroup());
rg.setName(rgInfo.name);
rg.setNameShort(rgInfo.nameShort);
rg.setStudy(context.get(Study.class, rgInfo.studyId));
rg.setActivityStatus(rgInfo.activityStatus);
Address address = new Address();
address.setId(rgInfo.address.id);
address.setCity(rgInfo.address.city);
address.setProvince(rgInfo.address.province);
address.setCountry(rgInfo.address.country);
address.setEmailAddress(rgInfo.address.email);
address.setFaxNumber(rgInfo.address.fax);
address.setPhoneNumber(rgInfo.address.phone);
address.setStreet1(rgInfo.address.street1);
address.setStreet2(rgInfo.address.street2);
address.setPostalCode(rgInfo.address.postalCode);
rg.setAddress(address);
// This stuff could be extracted to a util method. need to think about
// how
if (!rgInfo.comment.trim().equals("")) {
Set<Comment> comments = rg.getComments();
if (comments == null) comments = new HashSet<Comment>();
Comment newComment = new Comment();
newComment.setCreatedAt(new Date());
newComment.setMessage(rgInfo.comment);
newComment.setUser(context.getUser());
context.getSession().saveOrUpdate(newComment);
comments.add(newComment);
rg.setComments(comments);
}
context.getSession().saveOrUpdate(rg);
context.getSession().flush();
return new IdResult(rg.getId());
}
}