/** * Copyright © 2002 Instituto Superior Técnico * * This file is part of FenixEdu Academic. * * FenixEdu Academic is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * FenixEdu Academic is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>. */ package org.fenixedu.academic.ui.struts.action.phd.candidacy.publicProgram.epfl; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Locale; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.fenixedu.academic.domain.ExecutionYear; import org.fenixedu.academic.domain.Person; import org.fenixedu.academic.domain.PublicCandidacyHashCode; import org.fenixedu.academic.domain.Qualification; import org.fenixedu.academic.domain.QualificationBean; import org.fenixedu.academic.domain.contacts.PhysicalAddress; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.organizationalStructure.Unit; import org.fenixedu.academic.domain.phd.PhdIndividualProgramCollaborationType; import org.fenixedu.academic.domain.phd.PhdIndividualProgramDocumentType; import org.fenixedu.academic.domain.phd.PhdIndividualProgramProcess; import org.fenixedu.academic.domain.phd.PhdIndividualProgramProcess.PublicPhdIndividualProgramProcess; import org.fenixedu.academic.domain.phd.PhdIndividualProgramProcessBean; import org.fenixedu.academic.domain.phd.PhdParticipant; import org.fenixedu.academic.domain.phd.PhdParticipantBean; import org.fenixedu.academic.domain.phd.PhdParticipantBean.PhdParticipantType; import org.fenixedu.academic.domain.phd.PhdProgramCandidacyProcessState; import org.fenixedu.academic.domain.phd.PhdProgramDocumentUploadBean; import org.fenixedu.academic.domain.phd.PhdProgramProcessDocument; import org.fenixedu.academic.domain.phd.candidacy.EPFLPhdCandidacyPeriod; import org.fenixedu.academic.domain.phd.candidacy.PhdCandidacyPeriod; import org.fenixedu.academic.domain.phd.candidacy.PhdCandidacyReferee; import org.fenixedu.academic.domain.phd.candidacy.PhdCandidacyRefereeBean; import org.fenixedu.academic.domain.phd.candidacy.PhdCandidacyRefereeLetter; import org.fenixedu.academic.domain.phd.candidacy.PhdCandidacyRefereeLetterBean; import org.fenixedu.academic.domain.phd.candidacy.PhdProgramCandidacyProcess; import org.fenixedu.academic.domain.phd.candidacy.PhdProgramCandidacyProcessBean; import org.fenixedu.academic.domain.phd.candidacy.PhdProgramPublicCandidacyHashCode; import org.fenixedu.academic.domain.phd.candidacy.PhdThesisSubjectOrderBean; import org.fenixedu.academic.domain.phd.individualProcess.activities.AddCandidacyReferees; import org.fenixedu.academic.domain.phd.individualProcess.activities.AddGuidingsInformation; import org.fenixedu.academic.domain.phd.individualProcess.activities.AddQualification; import org.fenixedu.academic.domain.phd.individualProcess.activities.DeleteGuiding; import org.fenixedu.academic.domain.phd.individualProcess.activities.DeleteQualification; import org.fenixedu.academic.domain.phd.individualProcess.activities.EditIndividualProcessInformation; import org.fenixedu.academic.domain.phd.individualProcess.activities.EditPersonalInformation; import org.fenixedu.academic.domain.phd.individualProcess.activities.UploadDocuments; import org.fenixedu.academic.domain.phd.individualProcess.activities.ValidatedByCandidate; import org.fenixedu.academic.dto.contacts.PendingPartyContactBean; import org.fenixedu.academic.dto.person.PersonBean; import org.fenixedu.academic.dto.person.PhotographUploadBean; import org.fenixedu.academic.dto.person.PhotographUploadBean.UnableToProcessTheImage; import org.fenixedu.academic.service.services.caseHandling.CreateNewProcess; import org.fenixedu.academic.service.services.caseHandling.ExecuteProcessActivity; import org.fenixedu.academic.service.services.fileManager.UploadOwnPhoto; import org.fenixedu.academic.ui.struts.action.commons.FenixActionForward; import org.fenixedu.academic.ui.struts.action.phd.candidacy.publicProgram.PublicPhdProgramCandidacyProcessDA; import org.fenixedu.academic.ui.struts.action.publico.PublicApplication.PublicPhdApp; import org.fenixedu.academic.util.Bundle; import org.fenixedu.academic.util.ContentType; import org.fenixedu.academic.util.phd.EPFLPhdCandidacyProcessProperties; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.fenixedu.bennu.struts.annotations.Forward; import org.fenixedu.bennu.struts.annotations.Forwards; import org.fenixedu.bennu.struts.annotations.Mapping; import org.fenixedu.bennu.struts.portal.EntryPoint; import org.fenixedu.bennu.struts.portal.StrutsFunctionality; import org.fenixedu.commons.i18n.I18N; import org.joda.time.DateTime; import pt.ist.fenixWebFramework.renderers.components.state.IViewState; import pt.ist.fenixWebFramework.renderers.utils.RenderUtils; @StrutsFunctionality(app = PublicPhdApp.class, path = "epfl-candidacy", titleKey = "label.phd.ist.epfl.collaboration.type") @Mapping(path = "/applications/epfl/phdProgramCandidacyProcess", module = "publico") @Forwards({ @Forward(name = "createCandidacyIdentification", path = "/phd/candidacy/publicProgram/epfl/createCandidacyIdentification.jsp"), @Forward(name = "createCandidacyIdentificationSuccess", path = "/phd/candidacy/publicProgram/epfl/createCandidacyIdentificationSuccess.jsp"), @Forward(name = "candidacyIdentificationRecovery", path = "/phd/candidacy/publicProgram/epfl/candidacyIdentificationRecovery.jsp"), @Forward(name = "createCandidacyStepOne", path = "/phd/candidacy/publicProgram/epfl/createCandidacyStepOne.jsp"), @Forward(name = "createCandidacyStepTwo", path = "/phd/candidacy/publicProgram/epfl/createCandidacyStepTwo.jsp"), @Forward(name = "createCandidacyStepThree", path = "/phd/candidacy/publicProgram/epfl/createCandidacyStepThree.jsp"), @Forward(name = "showCandidacySuccess", path = "/phd/candidacy/publicProgram/epfl/candidacySubmited.jsp"), @Forward(name = "viewCandidacy", path = "/phd/candidacy/publicProgram/epfl/viewCandidacy.jsp"), @Forward(name = "editPersonalInformation", path = "/phd/candidacy/publicProgram/epfl/editPersonalInformation.jsp"), @Forward(name = "uploadCandidacyDocuments", path = "/phd/candidacy/publicProgram/epfl/uploadCandidacyDocuments.jsp"), @Forward(name = "editPhdIndividualProgramProcessInformation", path = "/phd/candidacy/publicProgram/epfl/editPhdIndividualProgramProcessInformation.jsp"), @Forward(name = "editCandidacyGuidings", path = "/phd/candidacy/publicProgram/epfl/editCandidacyGuidings.jsp"), @Forward(name = "editQualifications", path = "/phd/candidacy/publicProgram/epfl/editQualifications.jsp"), @Forward(name = "createRefereeLetter", path = "/phd/candidacy/publicProgram/epfl/createRefereeLetter.jsp"), @Forward(name = "createRefereeLetterSuccess", path = "/phd/candidacy/publicProgram/epfl/createRefereeLetterSuccess.jsp"), @Forward(name = "editCandidacyReferees", path = "/phd/candidacy/publicProgram/epfl/editCandidacyReferees.jsp"), @Forward(name = "uploadPhoto", path = "/phd/candidacy/publicProgram/epfl/uploadPhoto.jsp"), @Forward(name = "out.of.candidacy.period", path = "/phd/candidacy/publicProgram/epfl/outOfCandidacyPeriod.jsp"), @Forward(name = "validateCandidacy", path = "/phd/candidacy/publicProgram/epfl/validateCandidacy.jsp"), @Forward(name = "emailSentForIdentificationRecovery", path = "/phd/candidacy/publicProgram/epfl/emailSentForIdentificationRecovery.jsp") }) public class PublicEPFLPhdProgramsCandidacyProcessDA extends PublicPhdProgramCandidacyProcessDA { static private final List<String> DO_NOT_VALIDATE_CANDIDACY_PERIOD_IN_METHODS = Arrays.asList( "showCandidacySuccess", "viewCandidacy", "backToViewCandidacy", "prepareCreateRefereeLetter", "createRefereeLetterInvalid", "createRefereeLetter"); static private final int MINIMUM_HABILITATIONS_AND_CERTIFICATES = 2; static private final int MINIMUM_CANDIDACY_REFEREES = 3; @Override public ActionForward execute(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception { setLocale(request, Locale.ENGLISH); I18N.setLocale(request.getSession(), Locale.ENGLISH); return super.execute(mapping, actionForm, request, response); } @Override protected ActionForward filterDispatchMethod(final PhdProgramCandidacyProcessBean bean, ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws Exception { final PhdProgramPublicCandidacyHashCode hashCode = (bean != null ? bean.getCandidacyHashCode() : null); final String methodName = getMethodName(mapping, actionForm, request, response, mapping.getParameter()); if (methodName == null || !DO_NOT_VALIDATE_CANDIDACY_PERIOD_IN_METHODS.contains(methodName)) { if (isOutOfCandidacyPeriod(hashCode)) { request.setAttribute("candidacyPeriod", getPhdCandidacyPeriod(hashCode)); return mapping.findForward("out.of.candidacy.period"); } } return null; } private boolean isOutOfCandidacyPeriod(final PhdProgramPublicCandidacyHashCode hashCode) { final PhdCandidacyPeriod period = getPhdCandidacyPeriod(hashCode); return period == null || !period.contains(new DateTime()); } private PhdCandidacyPeriod getPhdCandidacyPeriod(final PhdProgramPublicCandidacyHashCode hashCode) { if (hashCode == null) { return EPFLPhdCandidacyPeriod.readEPFLPhdCandidacyPeriodForDateTime(new DateTime()); } if (!hashCode.hasCandidacyProcess()) { return EPFLPhdCandidacyPeriod.readEPFLPhdCandidacyPeriodForDateTime(new DateTime()); } if (!hashCode.getPhdProgramCandidacyProcess().isPublicCandidacy()) { return EPFLPhdCandidacyPeriod.readEPFLPhdCandidacyPeriodForDateTime(new DateTime()); } if (!hashCode.getPhdProgramCandidacyProcess().getPublicPhdCandidacyPeriod().isEpflCandidacyPeriod()) { return EPFLPhdCandidacyPeriod.readEPFLPhdCandidacyPeriodForDateTime(new DateTime()); } return hashCode.getPhdProgramCandidacyProcess().getPublicPhdCandidacyPeriod(); } @EntryPoint public ActionForward prepareCreateCandidacyIdentification(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final String hash = request.getParameter("hash"); final PhdProgramPublicCandidacyHashCode hashCode = (PhdProgramPublicCandidacyHashCode) PublicCandidacyHashCode.getPublicCandidacyCodeByHash(hash); if (hashCode != null) { return viewCandidacy(mapping, request, hashCode); } request.setAttribute("candidacyBean", new PhdProgramCandidacyProcessBean()); return mapping.findForward("createCandidacyIdentification"); } public ActionForward createCandidacyIdentificationInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getRenderedObject("candidacyBean")); return mapping.findForward("createCandidacyIdentification"); } public ActionForward createCandidacyIdentification(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhdProgramPublicCandidacyHashCode hashCode = PhdProgramPublicCandidacyHashCode.getOrCreatePhdProgramCandidacyHashCode(bean.getEmail()); if (hashCode.hasCandidacyProcess()) { addErrorMessage(request, "error.PhdProgramPublicCandidacyHashCode.already.has.candidacy"); return prepareCreateCandidacyIdentification(mapping, actionForm, request, response); } sendSubmissionEmailForCandidacy(hashCode, request); String url = String.format("%s?hash=%s", EPFLPhdCandidacyProcessProperties.getConfiguration() .getPublicCandidacySubmissionLink(), hashCode.getValue()); request.setAttribute("processLink", url); return mapping.findForward("createCandidacyIdentificationSuccess"); } private void sendSubmissionEmailForCandidacy(final PublicCandidacyHashCode hashCode, final HttpServletRequest request) { final String subject = BundleUtil.getString(Bundle.PHD, "message.phd.epfl.application.email.subject.send.link.to.submission"); final String body = BundleUtil.getString(Bundle.PHD, "message.phd.epfl.email.body.send.link.to.submission"); hashCode.sendEmail(subject, String.format(body, EPFLPhdCandidacyProcessProperties.getConfiguration() .getPublicCandidacySubmissionLink(), hashCode.getValue())); } public ActionForward prepareCandidacyIdentificationRecovery(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", new PhdProgramCandidacyProcessBean()); return mapping.findForward("candidacyIdentificationRecovery"); } public ActionForward candidacyIdentificationRecoveryInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getRenderedObject("candidacyBean")); return mapping.findForward("candidacyIdentificationRecovery"); } public ActionForward candidacyIdentificationRecovery(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhdProgramPublicCandidacyHashCode hashCode = PhdProgramPublicCandidacyHashCode.getPhdProgramCandidacyHashCode(bean.getEmail()); if (hashCode != null) { if (hashCode.hasCandidacyProcess()) { sendRecoveryEmailForCandidate(hashCode, request); } else { sendSubmissionEmailForCandidacy(hashCode, request); } } return mapping.findForward("emailSentForIdentificationRecovery"); } private void sendRecoveryEmailForCandidate(PhdProgramPublicCandidacyHashCode candidacyHashCode, HttpServletRequest request) { final String subject = BundleUtil.getString(Bundle.PHD, "message.phd.email.subject.recovery.access", Unit.getInstitutionAcronym()); final String body = BundleUtil.getString(Bundle.APPLICATION, "message.phd.epfl.email.body.recovery.access"); candidacyHashCode.sendEmail(subject, String.format(body, EPFLPhdCandidacyProcessProperties.getConfiguration() .getPublicCandidacyAccessLink(), candidacyHashCode.getValue())); } public ActionForward prepareCreateCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return createCandidacyStepOne(mapping, actionForm, request, response); } public ActionForward createCandidacyStepOne(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramPublicCandidacyHashCode hashCode = (PhdProgramPublicCandidacyHashCode) PublicCandidacyHashCode.getPublicCandidacyCodeByHash(request .getParameter("hash")); if (hashCode == null) { return mapping.findForward("createCandidacyStepOne"); } if (hashCode.hasCandidacyProcess()) { return viewCandidacy(mapping, request, hashCode); } final PhdProgramCandidacyProcessBean bean = new PhdProgramCandidacyProcessBean(); bean.setPersonBean(new PersonBean()); bean.getPersonBean().setEmail(hashCode.getEmail()); bean.setCandidacyHashCode(hashCode); bean.setExecutionYear(ExecutionYear.readCurrentExecutionYear()); bean.setCollaborationType(PhdIndividualProgramCollaborationType.EPFL); bean.setState(PhdProgramCandidacyProcessState.PRE_CANDIDATE); bean.setMigratedProcess(Boolean.FALSE); bean.setPhdCandidacyPeriod(getPhdCandidacyPeriod(hashCode)); request.setAttribute("candidacyBean", bean); return mapping.findForward("createCandidacyStepOne"); } public ActionForward createCandidacyStepOneInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getRenderedObject("candidacyBean")); return mapping.findForward("createCandidacyStepOne"); } public ActionForward returnCreateCandidacyStepOne(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepOne"); } @Override public ActionForward fillPersonalDataInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { return createCandidacyStepOneInvalid(mapping, form, request, response); } public ActionForward createCandidacyStepTwo(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { ActionForward checkPersonalDataForward = checkPersonalData(mapping, actionForm, request, response); if (checkPersonalDataForward != null) { return checkPersonalDataForward; } PersonBean personBean = getCandidacyBean().getPersonBean(); final String familyName = personBean.getFamilyNames(); final String composedName = familyName == null || familyName.isEmpty() ? personBean.getGivenNames() : personBean.getGivenNames() + " " + familyName; personBean.setName(composedName); request.setAttribute("candidacyBean", getCandidacyBean()); RenderUtils.invalidateViewState(); return prepareCreateCandidacyStepTwo(mapping, actionForm, request, response); } public ActionForward prepareCreateCandidacyStepTwo(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return mapping.findForward("createCandidacyStepTwo"); } public ActionForward moveUpThesisSubjectForEditPhdInformation(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { int order = getIntegerFromRequest(request, "order"); PhdIndividualProgramProcessBean phdBean = getRenderedObject("individualProcessBean"); PhdThesisSubjectOrderBean beanToMoveUp = phdBean.getThesisSubjectBean(order); PhdThesisSubjectOrderBean beanToMoveDown = phdBean.getThesisSubjectBean(order - 1); if (beanToMoveDown != null) { beanToMoveUp.decreaseOrder(); beanToMoveDown.increaseOrder(); phdBean.sortThesisSubjectBeans(); } request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("individualProcessBean", phdBean); RenderUtils.invalidateViewState(); return mapping.findForward("editPhdIndividualProgramProcessInformation"); } public ActionForward moveDownThesisSubjectForEditPhdInformation(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { int order = getIntegerFromRequest(request, "order"); PhdIndividualProgramProcessBean phdBean = getRenderedObject("individualProcessBean"); PhdThesisSubjectOrderBean beanToMoveDown = phdBean.getThesisSubjectBean(order); PhdThesisSubjectOrderBean beanToMoveUp = phdBean.getThesisSubjectBean(order + 1); if (beanToMoveUp != null) { beanToMoveDown.increaseOrder(); beanToMoveUp.decreaseOrder(); phdBean.sortThesisSubjectBeans(); } request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("individualProcessBean", phdBean); RenderUtils.invalidateViewState(); return mapping.findForward("editPhdIndividualProgramProcessInformation"); } public ActionForward moveUpThesisSubjectForCandidacyStepTwo(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { int order = getIntegerFromRequest(request, "order"); PhdProgramCandidacyProcessBean candidacyBean = getCandidacyBean(); PhdThesisSubjectOrderBean beanToMoveUp = candidacyBean.getThesisSubjectBean(order); PhdThesisSubjectOrderBean beanToMoveDown = candidacyBean.getThesisSubjectBean(order - 1); if (beanToMoveDown != null) { beanToMoveUp.decreaseOrder(); beanToMoveDown.increaseOrder(); candidacyBean.sortThesisSubjectBeans(); } request.setAttribute("candidacyBean", candidacyBean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward moveDownThesisSubjectForCandidacyStepTwo(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { int order = getIntegerFromRequest(request, "order"); PhdProgramCandidacyProcessBean candidacyBean = getCandidacyBean(); PhdThesisSubjectOrderBean beanToMoveDown = candidacyBean.getThesisSubjectBean(order); PhdThesisSubjectOrderBean beanToMoveUp = candidacyBean.getThesisSubjectBean(order + 1); if (beanToMoveUp != null) { beanToMoveDown.increaseOrder(); beanToMoveUp.decreaseOrder(); candidacyBean.sortThesisSubjectBeans(); } request.setAttribute("candidacyBean", candidacyBean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward prepareCreateCandidacyStepTwoFocusAreaPostback(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { PhdProgramCandidacyProcessBean candidacyBean = getCandidacyBean(); candidacyBean.updateThesisSubjectBeans(); request.setAttribute("candidacyBean", candidacyBean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward createCandidacyStepThree(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return createCandidacy(mapping, actionForm, request, response); } private List<PhdParticipantBean> createGuidingsMinimumList(final PhdIndividualProgramProcess process) { final List<PhdParticipantBean> result = new ArrayList<PhdParticipantBean>(); final PhdParticipantBean g1 = new PhdParticipantBean(process); g1.setParticipantType(PhdParticipantType.EXTERNAL); g1.setWorkLocation(Unit.getInstitutionAcronym()); final PhdParticipantBean g2 = new PhdParticipantBean(process); g2.setParticipantType(PhdParticipantType.EXTERNAL); // TODO: change this according to collaboration type acronym g2.setWorkLocation("EPFL"); result.add(g1); result.add(g2); return result; } public ActionForward createCandidacyStepTwoInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getRenderedObject("candidacyBean")); RenderUtils.invalidateViewState(); addErrorMessage(request, "error.required.fields"); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward returnCreateCandidacyStepTwo(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); request.setAttribute("candidacyBean", bean); clearDocumentsInformation(bean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward addGuiding(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhdParticipantBean guiding = new PhdParticipantBean(bean.getIndividualProgramProcess()); guiding.setParticipantType(PhdParticipantType.EXTERNAL); bean.addGuiding(guiding); request.setAttribute("candidacyBean", bean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward removeGuiding(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); bean.removeGuiding(getIntegerFromRequest(request, "removeIndex").intValue()); request.setAttribute("candidacyBean", bean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward addQualification(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); bean.addQualification(new QualificationBean()); request.setAttribute("candidacyBean", bean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward removeQualification(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); bean.removeQualification(getIntegerFromRequest(request, "removeIndex").intValue()); request.setAttribute("candidacyBean", bean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward addCandidacyReferee(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); bean.addCandidacyReferee(new PhdCandidacyRefereeBean()); request.setAttribute("candidacyBean", bean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } public ActionForward removeCandidacyReferee(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); if (bean.getCandidacyReferees().size() > MINIMUM_CANDIDACY_REFEREES) { bean.removeCandidacyReferee(getIntegerFromRequest(request, "removeIndex").intValue()); } request.setAttribute("candidacyBean", bean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepTwo"); } private PhdProgramDocumentUploadBean createDocumentBean(final PhdIndividualProgramDocumentType type) { final PhdProgramDocumentUploadBean bean = new PhdProgramDocumentUploadBean(); bean.setType(type); return bean; } private List<PhdProgramDocumentUploadBean> createHabilitationCertificateDocuments(final PhdProgramCandidacyProcessBean bean) { final List<PhdProgramDocumentUploadBean> result = new ArrayList<PhdProgramDocumentUploadBean>(bean.getQualifications().size()); if (bean.hasAnyQualification()) { bean.sortQualificationsByAttendedEnd(); for (final QualificationBean qualification : bean.getQualifications()) { final PhdProgramDocumentUploadBean uploadBean = createDocumentBean(PhdIndividualProgramDocumentType.HABILITATION_CERTIFICATE_DOCUMENT); uploadBean.setRemarks(qualification.getType().getLocalizedName()); result.add(uploadBean); } } return result; } private List<PhdProgramDocumentUploadBean> createPhdGuidingLetters(final PhdProgramCandidacyProcessBean bean) { final List<PhdProgramDocumentUploadBean> result = new ArrayList<PhdProgramDocumentUploadBean>(bean.getGuidings().size()); if (bean.hasAnyGuiding()) { for (int i = 0; i < bean.getGuidings().size(); i++) { result.add(createDocumentBean(PhdIndividualProgramDocumentType.GUIDER_ACCEPTANCE_LETTER)); } } return result; } public ActionForward createCandidacyStepThreeInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getRenderedObject("candidacyBean")); return mapping.findForward("createCandidacyStepThree"); } @Override public ActionForward createCandidacy(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); try { CreateNewProcess.run(PublicPhdIndividualProgramProcess.class, bean); sendApplicationSuccessfullySubmitedEmail(bean.getCandidacyHashCode(), request); } catch (final DomainException e) { if ("error.person.existent.docIdAndType".equals(e.getKey())) { addErrorMessage(request, "error.phd.public.candidacy.fill.personal.information.and.institution.id", e.getArgs()); } else { addErrorMessage(request, e.getKey(), e.getArgs()); } bean.clearPerson(); // clearDocumentsInformation(bean); return createCandidacyStepOneInvalid(mapping, form, request, response); } final String url = EPFLPhdCandidacyProcessProperties.getPublicCandidacyAccessLink(bean.getCandidacyHashCode()); return new FenixActionForward(request, new ActionForward(url, true)); } public ActionForward showCandidacySuccess(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return mapping.findForward("showCandidacySuccess"); } private void sendApplicationSuccessfullySubmitedEmail(final PhdProgramPublicCandidacyHashCode hashCode, final HttpServletRequest request) { // TODO: if candidacy period exists, then change body message to send // candidacy limit end date final String subject = BundleUtil.getString(Bundle.PHD, "message.phd.epfl.email.subject.application.submited"); final String body = BundleUtil.getString(Bundle.PHD, "message.phd.epfl.email.body.application.submited"); hashCode.sendEmail(subject, String.format(body, hashCode.getPhdProgramCandidacyProcess().getProcessNumber(), EPFLPhdCandidacyProcessProperties.getConfiguration().getPublicCandidacyAccessLink(), hashCode.getValue())); } private void clearDocumentsInformation(final PhdProgramCandidacyProcessBean bean) { bean.getCurriculumVitae().setFile(null); RenderUtils.invalidateViewState("candidacyBean.curriculumVitae"); bean.getIdentificationDocument().setFile(null); RenderUtils.invalidateViewState("candidacyBean.identificationDocument"); bean.getMotivationLetter().setFile(null); RenderUtils.invalidateViewState("candidacyBean.motivationLetter"); bean.getSocialSecurityDocument().setFile(null); RenderUtils.invalidateViewState("candidacyBean.socialSecurityDocument"); bean.getResearchPlan().setFile(null); RenderUtils.invalidateViewState("candidacyBean.researchPlan"); bean.getDissertationOrFinalWorkDocument().setFile(null); RenderUtils.invalidateViewState("candidacyBean.dissertationOrFinalWorkDocument"); bean.removeHabilitationCertificateDocumentFiles(); invalidateHabilitationCertificateDocumentViewStates(); bean.setPhdGuidingLetters(null); invalidatePhdGuidingLetterViewStates(); } private void invalidateHabilitationCertificateDocumentViewStates() { invalidViewStatesWith("candidacyBean.habilitationCertificateDocument"); } private void invalidatePhdGuidingLetterViewStates() { invalidViewStatesWith("candidacyBean.phdGuidingLetter"); } private void invalidViewStatesWith(final String prefixId) { for (final IViewState viewState : getViewStatesWithPrefixId(prefixId)) { RenderUtils.invalidateViewState(viewState.getId()); } } public ActionForward addHabilitationCertificateDocument(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhdProgramDocumentUploadBean document = createDocumentBean(PhdIndividualProgramDocumentType.HABILITATION_CERTIFICATE_DOCUMENT); bean.addHabilitationCertificateDocument(document); request.setAttribute("candidacyBean", bean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepThree"); } public ActionForward removeHabilitationCertificateDocument(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); if (bean.getHabilitationCertificateDocuments().size() > MINIMUM_HABILITATIONS_AND_CERTIFICATES) { bean.removeHabilitationCertificateDocument(getIntegerFromRequest(request, "removeIndex").intValue()); } request.setAttribute("candidacyBean", bean); clearDocumentsInformation(bean); RenderUtils.invalidateViewState(); return mapping.findForward("createCandidacyStepThree"); } public ActionForward viewCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return viewCandidacy(mapping, request, (PhdProgramPublicCandidacyHashCode) PublicCandidacyHashCode.getPublicCandidacyCodeByHash(request .getParameter("hash"))); } private ActionForward viewCandidacy(ActionMapping mapping, HttpServletRequest request, final PhdProgramPublicCandidacyHashCode hashCode) { if (hashCode == null || !hashCode.hasCandidacyProcess()) { return mapping.findForward("createCandidacyStepOne"); } PhdIndividualProgramProcess phdProcess = hashCode.getIndividualProgramProcess(); final PhdProgramCandidacyProcessBean bean = new PhdProgramCandidacyProcessBean(); bean.setCandidacyHashCode(hashCode); request.setAttribute("candidacyBean", bean); request.setAttribute("individualProgramProcess", phdProcess); canEditCandidacy(request, bean.getCandidacyHashCode()); canEditPersonalInformation(request, hashCode.getPerson()); PersonBean personBean = new PersonBean(phdProcess.getPerson()); initPersonBean(personBean, phdProcess.getPerson()); request.setAttribute("personBean", personBean); request.setAttribute("candidacyPeriod", getPhdCandidacyPeriod(hashCode)); validateProcess(request, hashCode.getIndividualProgramProcess()); request.setAttribute("pendingPartyContactBean", new PendingPartyContactBean(hashCode.getIndividualProgramProcess() .getPerson())); return mapping.findForward("viewCandidacy"); } public ActionForward backToViewCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return viewCandidacy(mapping, request, getCandidacyBean().getCandidacyHashCode()); } public ActionForward prepareEditPersonalInformation(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhdIndividualProgramProcess individualProgramProcess = bean.getCandidacyHashCode().getIndividualProgramProcess(); final Person person = individualProgramProcess.getPerson(); canEditPersonalInformation(request, person); bean.setPersonBean(new PersonBean(person)); /* TODO: UGLY HACK DUE TO PENDING VALIDATION DATA FOR PERSON */ initPersonBean(bean.getPersonBean(), person); request.setAttribute("candidacyBean", bean); return mapping.findForward("editPersonalInformation"); } private void initPersonBean(final PersonBean personBean, Person person) { personBean.setGivenNames(person.getGivenNames()); personBean.setFamilyNames(person.getFamilyNames()); personBean.setUsername(person.getUsername()); personBean.setGender(person.getGender()); personBean.setMaritalStatus(person.getMaritalStatus()); personBean.setFatherName(person.getNameOfFather()); personBean.setMotherName(person.getNameOfMother()); personBean.setProfession(person.getProfession()); personBean.setNationality(person.getCountry()); personBean.setCountryOfBirth(person.getCountryOfBirth()); personBean.setDateOfBirth(person.getDateOfBirthYearMonthDay()); personBean.setParishOfBirth(person.getParishOfBirth()); personBean.setDistrictOfBirth(person.getDistrictOfBirth()); personBean.setDistrictSubdivisionOfBirth(person.getDistrictSubdivisionOfBirth()); personBean.setDocumentIdEmissionDate(person.getEmissionDateOfDocumentIdYearMonthDay()); personBean.setDocumentIdEmissionLocation(person.getEmissionLocationOfDocumentId()); personBean.setDocumentIdExpirationDate(person.getExpirationDateOfDocumentIdYearMonthDay()); personBean.setDocumentIdNumber(person.getDocumentIdNumber()); personBean.setIdDocumentType(person.getIdDocumentType()); personBean.setSocialSecurityNumber(person.getSocialSecurityNumber()); PendingPartyContactBean pendingPartyContactBean = new PendingPartyContactBean(person); if (pendingPartyContactBean.getDefaultPhysicalAddress() != null) { final PhysicalAddress physicalAddress = pendingPartyContactBean.getDefaultPhysicalAddress(); personBean.setAddress(physicalAddress.getAddress()); personBean.setArea(physicalAddress.getArea()); personBean.setAreaCode(physicalAddress.getAreaCode()); personBean.setAreaOfAreaCode(physicalAddress.getAreaOfAreaCode()); personBean.setParishOfResidence(physicalAddress.getParishOfResidence()); personBean.setDistrictSubdivisionOfResidence(physicalAddress.getDistrictSubdivisionOfResidence()); personBean.setDistrictOfResidence(physicalAddress.getDistrictOfResidence()); personBean.setCountryOfResidence(physicalAddress.getCountryOfResidence()); } personBean.setPhone(pendingPartyContactBean.getDefaultPhone() != null ? pendingPartyContactBean.getDefaultPhone() .getNumber() : null); personBean.setMobile(pendingPartyContactBean.getDefaultMobilePhone() != null ? pendingPartyContactBean .getDefaultMobilePhone().getNumber() : null); personBean.setEmail(pendingPartyContactBean.getDefaultEmailAddress().getValue()); personBean.setEmailAvailable(person.getAvailableEmail()); personBean.setHomepageAvailable(person.getAvailableWebSite()); personBean.setPerson(person); } public ActionForward editPersonalInformationInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); canEditPersonalInformation(request, bean.getPersonBean().getPerson()); request.setAttribute("candidacyBean", bean); return mapping.findForward("editPersonalInformation"); } public ActionForward editPersonalInformation(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhdIndividualProgramProcess individualProgramProcess = bean.getCandidacyHashCode().getIndividualProgramProcess(); final Person person = individualProgramProcess.getPerson(); canEditPersonalInformation(request, person); PersonBean personBean = bean.getPersonBean(); final String familyName = personBean.getFamilyNames(); final String composedName = familyName == null || familyName.isEmpty() ? personBean.getGivenNames() : personBean.getGivenNames() + " " + familyName; personBean.setName(composedName); try { ExecuteProcessActivity.run(individualProgramProcess, EditPersonalInformation.class, bean.getPersonBean()); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); request.setAttribute("candidacyBean", bean); return mapping.findForward("editPersonalInformation"); } return viewCandidacy(mapping, request, bean.getCandidacyHashCode()); } public ActionForward prepareUploadDocuments(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); RenderUtils.invalidateViewState(); prepareUploadDocumentsAttributes(bean, request); return mapping.findForward("uploadCandidacyDocuments"); } private void prepareUploadDocumentsAttributes(PhdProgramCandidacyProcessBean bean, HttpServletRequest request) { request.setAttribute("candidacyBean", bean); request.setAttribute("candidacyProcessDocuments", bean.getCandidacyHashCode().getIndividualProgramProcess() .getCandidacyProcessDocuments()); final PhdProgramDocumentUploadBean uploadBean = new PhdProgramDocumentUploadBean(); uploadBean.setIndividualProgramProcess(bean.getCandidacyHashCode().getIndividualProgramProcess()); request.setAttribute("documentByType", uploadBean); validateProcessDocuments(request, bean.getCandidacyHashCode().getIndividualProgramProcess()); } @Override public ActionForward uploadDocumentsInvalid(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); request.setAttribute("candidacyBean", bean); request.setAttribute("documentByType", getRenderedObject("documentByType")); request.setAttribute("candidacyProcessDocuments", bean.getCandidacyHashCode().getIndividualProgramProcess() .getCandidacyProcessDocuments()); if (!RenderUtils.getViewState("documentByType").isValid()) { addErrorMessage(request, "error.documentToUpload.not.valid"); } RenderUtils.invalidateViewState(); validateProcessDocuments(request, bean.getCandidacyHashCode().getIndividualProgramProcess()); return mapping.findForward("uploadCandidacyDocuments"); } @Override public ActionForward uploadDocuments(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { if (!RenderUtils.getViewState("documentByType").isValid()) { return uploadDocumentsInvalid(mapping, form, request, response); } final PhdProgramDocumentUploadBean uploadBean = getRenderedObject("documentByType"); if (!uploadBean.hasAnyInformation()) { addErrorMessage(request, "message.no.documents.to.upload"); return uploadDocumentsInvalid(mapping, form, request, response); } try { PhdIndividualProgramProcess individualProgramProcess = uploadBean.getIndividualProgramProcess(); ExecuteProcessActivity.run(individualProgramProcess, UploadDocuments.class, Collections.singletonList(uploadBean)); addSuccessMessage(request, "message.documents.uploaded.with.success"); } catch (final DomainException e) { addErrorMessage(request, "message.no.documents.to.upload"); return uploadDocumentsInvalid(mapping, form, request, response); } return prepareUploadDocuments(mapping, form, request, response); } public ActionForward removeDocument(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { final PhdProgramProcessDocument document = getDomainObject(request, "documentId"); final PhdProgramCandidacyProcess process = (PhdProgramCandidacyProcess) document.getPhdProgramProcess(); final PhdProgramCandidacyProcessBean bean = new PhdProgramCandidacyProcessBean(process); try { ExecuteProcessActivity.run(process, org.fenixedu.academic.domain.phd.candidacy.activities.RemoveCandidacyDocument.class, document); addSuccessMessage(request, "message.documents.uploaded.with.success"); } catch (final DomainException e) { addErrorMessage(request, "message.no.documents.to.upload"); return uploadDocumentsInvalid(mapping, form, request, response); } RenderUtils.invalidateViewState(); request.setAttribute("canEditCandidacy", true); prepareUploadDocumentsAttributes(bean, request); return mapping.findForward("uploadCandidacyDocuments"); } public ActionForward prepareEditPhdIndividualProgramProcessInformation(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean candidacyBean = getCandidacyBean(); request.setAttribute("candidacyBean", candidacyBean); request.setAttribute("individualProcessBean", new PhdIndividualProgramProcessBean(candidacyBean.getCandidacyHashCode() .getIndividualProgramProcess())); return mapping.findForward("editPhdIndividualProgramProcessInformation"); } public ActionForward prepareEditPhdIndividualProgramProcessInformationFocusAreaPostback(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); PhdIndividualProgramProcessBean phdBean = getRenderedObject("individualProcessBean"); phdBean.updateThesisSubjectBeans(); request.setAttribute("individualProcessBean", phdBean); RenderUtils.invalidateViewState(); return mapping.findForward("editPhdIndividualProgramProcessInformation"); } public ActionForward editPhdIndividualProgramProcessInformationInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("individualProcessBean", getRenderedObject("individualProcessBean")); return mapping.findForward("editPhdIndividualProgramProcessInformation"); } public ActionForward editPhdIndividualProgramProcessInformation(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdIndividualProgramProcessBean bean = getRenderedObject("individualProcessBean"); try { PhdIndividualProgramProcess individualProgramProcess = bean.getIndividualProgramProcess(); ExecuteProcessActivity.run(individualProgramProcess, EditIndividualProcessInformation.class, bean); addSuccessMessage(request, "message.phdIndividualProgramProcessInformation.edit.success"); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("individualProcessBean", bean); return mapping.findForward("editPhdIndividualProgramProcessInformation"); } return viewCandidacy(mapping, request, getCandidacyBean().getCandidacyHashCode()); } public ActionForward prepareEditCandidacyGuidings(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return prepareAddGuidingToExistingCandidacy(mapping, actionForm, request, response); } public ActionForward editCandidacyGuidingsInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); return mapping.findForward("editCandidacyGuidings"); } public ActionForward prepareAddGuidingToExistingCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); request.setAttribute("candidacyBean", bean); if (bean.getCandidacyHashCode().getIndividualProgramProcess().getGuidingsSet().isEmpty()) { bean.setGuidings(createGuidingsMinimumList(bean.getIndividualProgramProcess())); } else { bean.setGuidings(new ArrayList<PhdParticipantBean>()); bean.addGuiding(new PhdParticipantBean(bean.getIndividualProgramProcess())); } RenderUtils.invalidateViewState(); return mapping.findForward("editCandidacyGuidings"); } public ActionForward removeGuidingFromCreationList(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); if (bean.getGuidings().size() > 1) { bean.removeGuiding(getIntegerFromRequest(request, "removeIndex").intValue()); } request.setAttribute("candidacyBean", bean); RenderUtils.invalidateViewState(); return mapping.findForward("editCandidacyGuidings"); } public ActionForward addGuidingToExistingCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); try { PhdIndividualProgramProcess individualProgramProcess = bean.getCandidacyHashCode().getIndividualProgramProcess(); ExecuteProcessActivity.run(individualProgramProcess, AddGuidingsInformation.class, bean.getGuidings()); addSuccessMessage(request, "message.guiding.created.with.success"); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); return editCandidacyGuidingsInvalid(mapping, actionForm, request, response); } bean.setGuidings(null); return prepareEditCandidacyGuidings(mapping, actionForm, request, response); } public ActionForward removeGuidingFromExistingCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final String externalId = (String) getFromRequest(request, "removeIndex"); final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhdParticipant guiding = getGuiding(bean.getCandidacyHashCode().getIndividualProgramProcess(), externalId); try { PhdIndividualProgramProcess individualProgramProcess = getCandidacyBean().getCandidacyHashCode().getIndividualProgramProcess(); ExecuteProcessActivity.run(individualProgramProcess, DeleteGuiding.class, guiding); addSuccessMessage(request, "message.guiding.deleted.with.success"); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); return editCandidacyGuidingsInvalid(mapping, actionForm, request, response); } return prepareEditCandidacyGuidings(mapping, actionForm, request, response); } private PhdParticipant getGuiding(final PhdIndividualProgramProcess individualProgramProcess, final String externalId) { for (final PhdParticipant guiding : individualProgramProcess.getGuidingsSet()) { if (guiding.getExternalId().equals(externalId)) { return guiding; } } return null; } public ActionForward prepareEditCandidacyReferees(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return prepareAddCandidacyRefereeToExistingCandidacy(mapping, actionForm, request, response); } public ActionForward prepareAddCandidacyRefereeToExistingCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("refereeBean", new PhdCandidacyRefereeBean()); return mapping.findForward("editCandidacyReferees"); } public ActionForward editCandidacyRefereesInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("refereeBean", getRenderedObject("refereeBean")); return mapping.findForward("editCandidacyReferees"); } public ActionForward addCandidacyRefereeToExistingCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { try { PhdIndividualProgramProcess individualProgramProcess = getCandidacyBean().getCandidacyHashCode().getIndividualProgramProcess(); ExecuteProcessActivity.run(individualProgramProcess, AddCandidacyReferees.class, Collections.singletonList(getRenderedObject("refereeBean"))); addSuccessMessage(request, "message.qualification.information.create.success"); RenderUtils.invalidateViewState("refereeBean"); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); return editCandidacyRefereesInvalid(mapping, actionForm, request, response); } return prepareEditCandidacyReferees(mapping, actionForm, request, response); } public ActionForward sendCandidacyRefereeEmail(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhdCandidacyReferee referee = getReferee(bean.getCandidacyHashCode().getIndividualProgramProcess(), request); referee.sendEmail(); addSuccessMessage(request, "message.candidacy.referee.email.sent.with.success", referee.getName()); return prepareEditCandidacyReferees(mapping, actionForm, request, response); } private PhdCandidacyReferee getReferee(final PhdIndividualProgramProcess process, final HttpServletRequest request) { final String externalId = (String) getFromRequest(request, "removeIndex"); for (final PhdCandidacyReferee referee : process.getPhdCandidacyReferees()) { if (referee.getExternalId().equals(externalId)) { return referee; } } return null; } public ActionForward prepareEditQualifications(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return prepareAddQualificationToExistingCandidacy(mapping, actionForm, request, response); } public ActionForward editQualificationsInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("qualificationBean", getRenderedObject("qualificationBean")); return mapping.findForward("editQualifications"); } public ActionForward prepareAddQualificationToExistingCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("qualificationBean", new QualificationBean()); return mapping.findForward("editQualifications"); } public ActionForward addQualificationToExistingCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { try { PhdIndividualProgramProcess individualProgramProcess = getCandidacyBean().getCandidacyHashCode().getIndividualProgramProcess(); ExecuteProcessActivity.run(individualProgramProcess, AddQualification.class, getRenderedObject("qualificationBean")); addSuccessMessage(request, "message.qualification.information.create.success"); RenderUtils.invalidateViewState("qualificationBean"); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); return editQualificationsInvalid(mapping, actionForm, request, response); } return prepareEditQualifications(mapping, actionForm, request, response); } public ActionForward removeQualificationFromExistingCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final String externalId = (String) getFromRequest(request, "removeIndex"); PhdIndividualProgramProcess individualProgramProcess = bean.getCandidacyHashCode().getIndividualProgramProcess(); final Qualification qualification = getQualification(individualProgramProcess, externalId); try { ExecuteProcessActivity.run(individualProgramProcess, DeleteQualification.class, qualification); addSuccessMessage(request, "message.qualification.information.delete.success"); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); } RenderUtils.invalidateViewState("qualificationBean"); return prepareEditQualifications(mapping, actionForm, request, response); } private Qualification getQualification(final PhdIndividualProgramProcess individualProgramProcess, final String externalId) { for (final Qualification qualification : individualProgramProcess.getQualifications()) { if (qualification.getExternalId().equals(externalId)) { return qualification; } } return null; } public ActionForward prepareCreateRefereeLetter(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdCandidacyReferee hashCode = (PhdCandidacyReferee) PublicCandidacyHashCode.getPublicCandidacyCodeByHash(request.getParameter("hash")); if (hashCode == null) { request.setAttribute("no-information", Boolean.TRUE); return mapping.findForward("createRefereeLetterSuccess"); } if (hashCode.getLetter() != null) { request.setAttribute("has-letter", Boolean.TRUE); request.setAttribute("letter", hashCode.getLetter()); return mapping.findForward("createRefereeLetterSuccess"); } final PhdCandidacyRefereeLetterBean bean = new PhdCandidacyRefereeLetterBean(); bean.setCandidacyReferee(hashCode); bean.setRefereeName(hashCode.getName()); request.setAttribute("createRefereeLetterBean", bean); return mapping.findForward("createRefereeLetter"); } public ActionForward createRefereeLetterInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdCandidacyRefereeLetterBean bean = getRenderedObject("createRefereeLetterBean"); request.setAttribute("createRefereeLetterBean", bean); RenderUtils.invalidateViewState("createRefereeLetterBean.comments"); bean.setFile(null); return mapping.findForward("createRefereeLetter"); } public ActionForward createRefereeLetter(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdCandidacyRefereeLetterBean bean = getRenderedObject("createRefereeLetterBean"); if (hasAnyRefereeLetterViewStateInvalid()) { return createRefereeLetterInvalid(mapping, actionForm, request, response); } try { PhdCandidacyRefereeLetter.create(bean); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); request.setAttribute("createRefereeLetterBean", bean); return mapping.findForward("createRefereeLetter"); } request.setAttribute("created-with-success", Boolean.TRUE); return mapping.findForward("createRefereeLetterSuccess"); } private boolean hasAnyRefereeLetterViewStateInvalid() { for (final IViewState viewState : getViewStatesWithPrefixId("createRefereeLetterBean.")) { if (!viewState.isValid()) { return true; } } return false; } public ActionForward prepareUploadPhoto(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("uploadPhotoBean", new PhotographUploadBean()); return mapping.findForward("uploadPhoto"); } public ActionForward uploadPhotoInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("candidacyBean", getCandidacyBean()); request.setAttribute("uploadPhotoBean", getRenderedObject("uploadPhotoBean")); RenderUtils.invalidateViewState("uploadPhotoBean"); return mapping.findForward("uploadPhoto"); } public ActionForward uploadPhoto(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws IOException { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhotographUploadBean photo = getRenderedObject("uploadPhotoBean"); if (!RenderUtils.getViewState("uploadPhotoBean").isValid()) { addErrorMessage(request, "error.photo.upload.invalid.information"); return uploadPhotoInvalid(mapping, actionForm, request, response); } if (ContentType.getContentType(photo.getContentType()) == null) { addErrorMessage(request, "error.photo.upload.unsupported.file"); return uploadPhotoInvalid(mapping, actionForm, request, response); } try { photo.processImage(); UploadOwnPhoto.upload(photo, bean.getCandidacyHashCode().getPerson()); } catch (final UnableToProcessTheImage e) { addErrorMessage(request, "error.photo.upload.unable.to.process.image"); photo.deleteTemporaryFiles(); return uploadPhotoInvalid(mapping, actionForm, request, response); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); photo.deleteTemporaryFiles(); return uploadPhotoInvalid(mapping, actionForm, request, response); } return viewCandidacy(mapping, request, bean.getCandidacyHashCode()); } private boolean validateProcess(final HttpServletRequest request, final PhdIndividualProgramProcess process) { boolean result = true; if (process.getPhdProgramFocusArea() == null) { addValidationMessage(request, "message.validation.missing.focus.area"); result &= false; } if (process.getPhdCandidacyReferees().size() < MINIMUM_CANDIDACY_REFEREES) { addValidationMessage(request, "message.validation.missing.minimum.candidacy.referees", String.valueOf(MINIMUM_CANDIDACY_REFEREES)); result &= false; } return validateProcessDocuments(request, process); } private boolean validateProcessDocuments(final HttpServletRequest request, final PhdIndividualProgramProcess process) { boolean result = true; if (!process.hasCandidacyProcessDocument(PhdIndividualProgramDocumentType.CV)) { addValidationMessage(request, "message.validation.missing.cv"); result &= false; } if (!process.hasCandidacyProcessDocument(PhdIndividualProgramDocumentType.ID_DOCUMENT)) { addValidationMessage(request, "message.validation.missing.id.document"); result &= false; } if (!process.hasCandidacyProcessDocument(PhdIndividualProgramDocumentType.MOTIVATION_LETTER)) { addValidationMessage(request, "message.validation.missing.motivation.letter"); result &= false; } if (process.getCandidacyProcessDocumentsCount(PhdIndividualProgramDocumentType.HABILITATION_CERTIFICATE_DOCUMENT) < process .getQualifications().size()) { addValidationMessage(request, "message.validation.missing.qualification.documents", String.valueOf(process.getQualifications().size())); result &= false; } return result; } public ActionForward prepareValidateCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); validateProcess(request, bean.getCandidacyHashCode().getIndividualProgramProcess()); request.setAttribute("candidacyBean", bean); return mapping.findForward("validateCandidacy"); } public ActionForward validateCandidacy(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final PhdProgramCandidacyProcessBean bean = getCandidacyBean(); final PhdIndividualProgramProcess process = bean.getCandidacyHashCode().getIndividualProgramProcess(); if (!validateProcess(request, process)) { request.setAttribute("candidacyBean", bean); return mapping.findForward("validateCandidacy"); } try { ExecuteProcessActivity.run(process, ValidatedByCandidate.class, null); addSuccessMessage(request, "message.validation.with.success"); } catch (final DomainException e) { addErrorMessage(request, e.getKey(), e.getArgs()); return prepareValidateCandidacy(mapping, actionForm, request, response); } return viewCandidacy(mapping, request, bean.getCandidacyHashCode()); } }