package net.sourceforge.fenixedu.domain.phd.email; import java.io.Serializable; import java.util.ArrayList; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; import net.sourceforge.fenixedu.domain.ExecutionYear; import net.sourceforge.fenixedu.domain.Person; import net.sourceforge.fenixedu.domain.exceptions.DomainException; import net.sourceforge.fenixedu.domain.phd.PhdIndividualProgramProcess; import net.sourceforge.fenixedu.domain.phd.PhdParticipant; import net.sourceforge.fenixedu.domain.phd.alert.AlertService.AlertMessage; import net.sourceforge.fenixedu.domain.phd.thesis.ThesisJuryElement; import net.sourceforge.fenixedu.util.StringUtils; import pt.ist.fenixWebFramework.renderers.DataProvider; import pt.ist.fenixWebFramework.renderers.components.converters.Converter; import pt.utl.ist.fenix.tools.util.i18n.Language; public class PhdIndividualProgramProcessEmailBean extends PhdEmailBean implements Serializable { /** * */ private static final long serialVersionUID = -820152568474219538L; public static enum PhdEmailTemplate { FINAL_THESIS_DELIVERY("message.phd.template.final.thesis.delivery"), FINAL_THESIS_DELIVERY_WITH_CHANGES("message.phd.template.final.thesis.delivery.changes"), FINAL_THESIS_DELIVERY_AFTER_DISCUSSION("message.phd.template.final.thesis.delivery.after.discussion"); private String label; private PhdEmailTemplate(String label) { this.label = label; } public String getLabel() { return label; } public String getLabelForSubject() { return label + ".subject"; } public String getLabelForBody() { return label + ".body"; } public String getTemplateSubject() { return AlertMessage.get(getLabelForSubject()); } public String getTemplateBody() { return AlertMessage.get(getLabelForBody()); } @Override public String toString() { return AlertMessage.get(getLabel() + ".label"); } } public static abstract class PhdEmailParticipantsGroup implements Serializable, DataProvider { private static final long serialVersionUID = -8990666659412753954L; protected String label; public PhdEmailParticipantsGroup() { } public String getGroupLabel() { return AlertMessage.get(this.label); } public String getName() { return this.getClass().getSimpleName(); } public abstract List getGroupParticipants(PhdIndividualProgramProcess process); public String getEmailsAsBccs(PhdIndividualProgramProcess process) { StringBuilder bccs = new StringBuilder(); Boolean hasParticipantsEmails = false; for (PhdParticipant participant : this.getGroupParticipants(process)) { String email = participant.getEmail(); if (email == null) { continue; } hasParticipantsEmails = true; bccs.append(email); bccs.append(","); } if (hasParticipantsEmails) { bccs.deleteCharAt(bccs.length() - 1); } return bccs.toString(); } @Override public Converter getConverter() { return null; } @Override public Object provide(final Object source, final Object currentValue) { final PhdIndividualProgramProcessEmailBean emailBean = (PhdIndividualProgramProcessEmailBean) source; return this.getGroupParticipants(emailBean.getProcess()); } } public static class PhdEmailParticipantsCoordinatorsGroup extends PhdEmailParticipantsGroup { private static final long serialVersionUID = 4961478244113914645L; public PhdEmailParticipantsCoordinatorsGroup() { super(); super.label = "label.phd.email.group.coordinators"; } @Override public List getGroupParticipants(PhdIndividualProgramProcess process) { List participants = new ArrayList(); for (Person person : process.getCoordinatorsFor(ExecutionYear.readCurrentExecutionYear())) { participants.add(process.getParticipant(person)); } return participants; } } public static class PhdEmailParticipantsGuidersGroup extends PhdEmailParticipantsGroup { private static final long serialVersionUID = -3022014810736464210L; public PhdEmailParticipantsGuidersGroup() { super(); super.label = "label.phd.email.group.guiders"; } @Override public List getGroupParticipants(PhdIndividualProgramProcess process) { List participants = new ArrayList(); participants.addAll(process.getGuidingsAndAssistantGuidings()); return participants; } } public static class PhdEmailParticipantsAllGroup extends PhdEmailParticipantsGroup { private static final long serialVersionUID = -6806003598437992476L; public PhdEmailParticipantsAllGroup() { super(); super.label = "label.phd.email.group.all.participants"; } @Override public List getGroupParticipants(PhdIndividualProgramProcess process) { return process.getParticipants(); } } public static class PhdEmailParticipantsJuryMembersGroup extends PhdEmailParticipantsGroup { private static final long serialVersionUID = 3417426578342610353L; public PhdEmailParticipantsJuryMembersGroup() { super(); super.label = "label.phd.email.group.jury.members"; } @Override public List getGroupParticipants(PhdIndividualProgramProcess process) { List participants = new ArrayList(); if (!process.hasThesisProcess()) { throw new DomainException("phd.individualProcess.does.not.have.thesisProcess"); } if (process.getThesisProcess().hasPresidentJuryElement()) { participants.add(process.getThesisProcess().getPresidentJuryElement().getParticipant()); } for (ThesisJuryElement element : process.getThesisProcess().getThesisJuryElements()) { participants.add(element.getParticipant()); } return participants; } } private PhdIndividualProgramProcess process; private PhdEmailTemplate template; private Set participantsGroup; private Set selectedParticipants; public PhdIndividualProgramProcessEmailBean() { } public PhdIndividualProgramProcessEmailBean(PhdIndividualProgramProcessEmail email) { this.subject = email.getFormattedSubject().getContent(Language.pt); this.message = email.getFormattedBody().getContent(Language.pt); this.bccs = email.getBccs(); this.creationDate = email.getWhenCreated(); this.creator = email.getPerson(); this.process = email.getPhdIndividualProgramProcess(); } public String getBccsWithSelectedParticipants() { String bccs = getBccs() == null ? null : getBccs().replace(" ", ""); if (!StringUtils.isEmpty(bccs)) { bccs += ","; } for (PhdParticipant participant : getSelectedParticipants()) { bccs += participant.getEmail(); bccs += ","; } if (bccs.endsWith(",")) { bccs = bccs.substring(0, bccs.length() - 1); } return bccs; } public PhdIndividualProgramProcess getProcess() { return process; } public void setProcess(PhdIndividualProgramProcess process) { this.process = process; } public PhdEmailTemplate getTemplate() { return template; } public void setTemplate(PhdEmailTemplate template) { this.template = template; } @Override public Person getCreator() { return creator; } @Override public void setCreator(Person creator) { this.creator = creator; } public Set getParticipantsGroup() { final Set result = new TreeSet(COMPARATOR_BY_NAME); if (this.participantsGroup != null) { for (final PhdEmailParticipantsGroup participantGroup : participantsGroup) { result.add(participantGroup); } } return result; } public void setParticipantsGroup(List participantsGroup) { if (participantsGroup == null) { this.participantsGroup = null; } else { this.participantsGroup = new HashSet(); for (final PhdEmailParticipantsGroup participantGroup : participantsGroup) { this.participantsGroup.add(participantGroup); } } } public static final Comparator COMPARATOR_BY_NAME = new Comparator() { @Override public int compare(PhdEmailParticipantsGroup g1, PhdEmailParticipantsGroup g2) { return g1.getGroupLabel().compareTo(g2.getGroupLabel()); } }; public Set getPossibleParticipantsGroups() { final Set groups = new TreeSet(COMPARATOR_BY_NAME); groups.add(new PhdEmailParticipantsCoordinatorsGroup()); if (getProcess().hasAnyGuidings()) { groups.add(new PhdEmailParticipantsGuidersGroup()); } groups.add(new PhdEmailParticipantsAllGroup()); if (getProcess().hasThesisProcess()) { groups.add(new PhdEmailParticipantsJuryMembersGroup()); } return groups; } public List getPossibleParticipantsGroupsList() { List groups = new ArrayList(); groups.add(new PhdEmailParticipantsCoordinatorsGroup()); groups.add(new PhdEmailParticipantsGuidersGroup()); groups.add(new PhdEmailParticipantsAllGroup()); if (getProcess().hasThesisProcess()) { groups.add(new PhdEmailParticipantsJuryMembersGroup()); } return groups; } public List getSelectedParticipants() { final List result = new ArrayList(); if (this.selectedParticipants != null) { for (final PhdParticipant participant : selectedParticipants) { result.add(participant); } } return result; } public void setSelectedParticipants(List selectedParticipants) { if (selectedParticipants == null) { this.selectedParticipants = null; } else { this.selectedParticipants = new HashSet(); for (final PhdParticipant participant : selectedParticipants) { this.selectedParticipants.add(participant); } } } public void refreshTemplateInUse() { if (getTemplate() != null) { setSubject(getTemplate().getTemplateSubject()); setMessage(getTemplate().getTemplateBody()); } else { setSubject(""); setMessage(""); } } }