package edu.ualberta.med.biobank.common.action.clinic; import java.util.Collection; import java.util.HashSet; import java.util.Set; import edu.ualberta.med.biobank.common.action.ActionContext; import edu.ualberta.med.biobank.common.action.ActionResult; import edu.ualberta.med.biobank.common.action.IdResult; import edu.ualberta.med.biobank.common.action.center.CenterSaveAction; import edu.ualberta.med.biobank.common.action.exception.ActionException; import edu.ualberta.med.biobank.common.permission.Permission; import edu.ualberta.med.biobank.common.permission.clinic.ClinicCreatePermission; import edu.ualberta.med.biobank.common.permission.clinic.ClinicUpdatePermission; import edu.ualberta.med.biobank.common.util.SetDifference; import edu.ualberta.med.biobank.model.Clinic; import edu.ualberta.med.biobank.model.Contact; import edu.ualberta.med.biobank.model.Study; public class ClinicSaveAction extends CenterSaveAction { private static final long serialVersionUID = 1L; // This info class does not support the Contact <-> Study association public static class ContactSaveInfo implements ActionResult { private static final long serialVersionUID = 1L; public Integer id = null; public String name; public String title; public String mobileNumber; public String faxNumber; public String pagerNumber; public String officeNumber; public String emailAddress; public ContactSaveInfo() { } public ContactSaveInfo(Contact contact) { this.id = contact.getId(); this.name = contact.getName(); this.title = contact.getTitle(); this.mobileNumber = contact.getMobileNumber(); this.faxNumber = contact.getFaxNumber(); this.pagerNumber = contact.getPagerNumber(); this.officeNumber = contact.getOfficeNumber(); this.emailAddress = contact.getEmailAddress(); } public Contact populateContact(Clinic clinic, Contact contact) { contact.setClinic(clinic); contact.setId(this.id); contact.setName(this.name); contact.setTitle(this.title); contact.setMobileNumber(this.mobileNumber); contact.setFaxNumber(this.faxNumber); contact.setPagerNumber(this.pagerNumber); contact.setOfficeNumber(this.officeNumber); contact.setEmailAddress(this.emailAddress); return contact; } public void setName(String name) { this.name = name; } } private Boolean sendsShipments; private Collection<ContactSaveInfo> contactSaveInfos; private Clinic clinic = null; public void setSendsShipments(Boolean sendsShipments) { this.sendsShipments = sendsShipments; } public void setContactSaveInfos(Collection<ContactSaveInfo> contactSaveInfos) { this.contactSaveInfos = contactSaveInfos; } @Override public boolean isAllowed(ActionContext context) throws ActionException { Permission permission; if (centerId == null) permission = new ClinicCreatePermission(); else permission = new ClinicUpdatePermission(centerId); return permission.isAllowed(context); } /** * Contacts cannot be deleted if it is still associated with a study. */ @Override public IdResult run(ActionContext context) throws ActionException { clinic = context.load(Clinic.class, centerId, new Clinic()); clinic.setSendsShipments(sendsShipments); saveContacts(context); return run(context, clinic); } // TODO: do not allow delete of a contact linked to a study private void saveContacts(ActionContext context) { Set<Contact> newContactCollection = new HashSet<Contact>(); for (ContactSaveInfo contactSaveInfo : contactSaveInfos) { Contact contact; if (contactSaveInfo.id == null) { contact = new Contact(); } else { contact = context.load(Contact.class, contactSaveInfo.id); } newContactCollection.add(contactSaveInfo.populateContact(clinic, contact)); } // delete contacts no longer in use SetDifference<Contact> contactsDiff = new SetDifference<Contact>( clinic.getContacts(), newContactCollection); clinic.setContacts(contactsDiff.getNewSet()); for (Contact contact : contactsDiff.getRemoveSet()) { Collection<Study> studyCollection = contact.getStudies(); if ((studyCollection != null) && !studyCollection.isEmpty()) { throw new ActionException("canot delete contact " + contact.getName()); } context.getSession().delete(contact); } } }