/** * 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.academicAdministration.executionCourseManagement; import java.util.Collections; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanComparator; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.Transformer; import org.apache.commons.lang.StringUtils; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; import org.apache.struts.util.LabelValueBean; import org.fenixedu.academic.domain.CurricularCourse; import org.fenixedu.academic.domain.CurricularYear; import org.fenixedu.academic.domain.ExecutionCourse; import org.fenixedu.academic.domain.ExecutionDegree; import org.fenixedu.academic.domain.ExecutionSemester; import org.fenixedu.academic.domain.Shift; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.dto.InfoExecutionCourse; import org.fenixedu.academic.dto.InfoExecutionDegree; import org.fenixedu.academic.service.services.exceptions.FenixServiceException; import org.fenixedu.academic.service.services.manager.executionCourseManagement.ReadExecutionCourseWithShiftsAndCurricularCoursesByOID; import org.fenixedu.academic.service.services.manager.executionCourseManagement.ReadExecutionCoursesByExecutionDegreeIdAndExecutionPeriodIdAndCurYear; import org.fenixedu.academic.service.services.manager.executionCourseManagement.ReadExecutionDegreesByExecutionPeriodId; import org.fenixedu.academic.service.services.manager.executionCourseManagement.ReadInfoExecutionCourseByOID; import org.fenixedu.academic.service.services.manager.executionCourseManagement.SeperateExecutionCourse; import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction; import org.fenixedu.academic.ui.struts.action.exceptions.FenixActionException; import org.fenixedu.academic.ui.struts.action.resourceAllocationManager.utils.PresentationConstants; import org.fenixedu.academic.ui.struts.action.utils.RequestUtils; import org.fenixedu.academic.util.Bundle; 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 pt.ist.fenixframework.FenixFramework; @Mapping(module = "academicAdministration", path = "/seperateExecutionCourse", input = "/editExecutionCourse.do?method=prepareEditECChooseExecDegreeAndCurYear&page=0", formBean = "separateExecutionCourseForm", functionality = EditExecutionCourseDA.class) @Forwards(value = { @Forward(name = "returnFromTransfer", path = "/academicAdministration/executionCourseManagement/listExecutionCourseActions.jsp"), @Forward(name = "manageCurricularSeparation", path = "/academicAdministration/executionCourseManagement/manageCurricularSeparation.jsp"), @Forward(name = "showTransferPage", path = "/academicAdministration/executionCourseManagement/transferCurricularCourses.jsp"), @Forward(name = "showSeparationPage", path = "/academicAdministration/executionCourseManagement/separateExecutionCourse.jsp") }) public class SeperateExecutionCourseDispatchAction extends FenixDispatchAction { public ActionForward prepareTransfer(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { String executionCourseId = RequestUtils.getAndSetStringToRequest(request, "executionCourseId"); String originExecutionDegreeId = RequestUtils.getAndSetStringToRequest(request, "originExecutionDegreeId"); String curricularYearId = RequestUtils.getAndSetStringToRequest(request, "curricularYearId"); RequestUtils.getAndSetStringToRequest(request, "executionPeriodId"); // maybe not needed (have EC id) CurricularYear curYear = FenixFramework.getDomainObject(curricularYearId); request.setAttribute("curYear", curYear.getYear().toString()); ExecutionDegree executionDegree = FenixFramework.getDomainObject(originExecutionDegreeId); request.setAttribute("originExecutionDegreeName", executionDegree.getPresentationName()); InfoExecutionCourse infoExecutionCourse = ReadExecutionCourseWithShiftsAndCurricularCoursesByOID.run(executionCourseId); request.setAttribute("infoExecutionCourse", infoExecutionCourse); List executionDegrees = ReadExecutionDegreesByExecutionPeriodId.runForAcademicAdminAdv(infoExecutionCourse.getInfoExecutionPeriod() .getExternalId()); transformExecutionDegreesIntoLabelValueBean(executionDegrees); request.setAttribute("executionDegrees", executionDegrees); List curricularYears = RequestUtils.buildCurricularYearLabelValueBean(); request.setAttribute(PresentationConstants.CURRICULAR_YEAR_LIST_KEY, curricularYears); return mapping.findForward("showTransferPage"); } public ActionForward prepareSeparate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { String executionCourseId = RequestUtils.getAndSetStringToRequest(request, "executionCourseId"); String originExecutionDegreeId = RequestUtils.getAndSetStringToRequest(request, "originExecutionDegreeId"); String curricularYearId = RequestUtils.getAndSetStringToRequest(request, "curricularYearId"); RequestUtils.getAndSetStringToRequest(request, "executionPeriodId"); CurricularYear curYear = FenixFramework.getDomainObject(curricularYearId); request.setAttribute("curYear", curYear.getYear().toString()); ExecutionDegree executionDegree = FenixFramework.getDomainObject(originExecutionDegreeId); request.setAttribute("originExecutionDegreeName", executionDegree.getPresentationName()); InfoExecutionCourse infoExecutionCourse = ReadExecutionCourseWithShiftsAndCurricularCoursesByOID.run(executionCourseId); request.setAttribute("infoExecutionCourse", infoExecutionCourse); return mapping.findForward("showSeparationPage"); } public ActionForward manageCurricularSeparation(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException, FenixActionException { // FIXME: ugly code to get attribute before parameter (parameter needs to be changed when coming from separate) String executionCourseId = (String) request.getAttribute("executionCourseId"); if (executionCourseId == null) { executionCourseId = RequestUtils.getAndSetStringToRequest(request, "executionCourseId"); } InfoExecutionCourse infoExecutionCourse; try { infoExecutionCourse = ReadInfoExecutionCourseByOID.run(executionCourseId); } catch (FenixServiceException e) { throw new FenixActionException(e); } if (infoExecutionCourse.getAssociatedInfoCurricularCourses() != null) { Collections.sort(infoExecutionCourse.getAssociatedInfoCurricularCourses(), new BeanComparator("name")); } request.setAttribute(PresentationConstants.EXECUTION_COURSE, infoExecutionCourse); // Setting bean for return to listExecutionCourseActions String executionCoursesNotLinked = RequestUtils.getAndSetStringToRequest(request, "executionCoursesNotLinked"); Boolean chooseNotLinked = false; if (!StringUtils.isEmpty(executionCoursesNotLinked) && Boolean.valueOf(executionCoursesNotLinked)) { chooseNotLinked = true; } String executionPeriodId = RequestUtils.getAndSetStringToRequest(request, "executionPeriodId"); ExecutionCourse executionCourse = FenixFramework.getDomainObject(executionCourseId); ExecutionSemester executionPeriod = FenixFramework.getDomainObject(executionPeriodId); ExecutionCourseBean sessionBean = new ExecutionCourseBean(); sessionBean.setSourceExecutionCourse(executionCourse); sessionBean.setExecutionSemester(executionPeriod); sessionBean.setChooseNotLinked(chooseNotLinked); if (!chooseNotLinked) { String originExecutionDegreeId = RequestUtils.getAndSetStringToRequest(request, "originExecutionDegreeId"); String curricularYearId = RequestUtils.getAndSetStringToRequest(request, "curricularYearId"); ExecutionDegree executionDegree = FenixFramework.getDomainObject(originExecutionDegreeId); CurricularYear curYear = FenixFramework.getDomainObject(curricularYearId); sessionBean.setExecutionDegree(executionDegree); sessionBean.setCurricularYear(curYear); request.setAttribute("curYear", curYear.getYear().toString()); request.setAttribute("originExecutionDegreeName", executionDegree.getPresentationName()); } request.setAttribute("sessionBean", sessionBean); return mapping.findForward("manageCurricularSeparation"); } private void transformExecutionDegreesIntoLabelValueBean(List executionDegreeList) { CollectionUtils.transform(executionDegreeList, new Transformer() { @Override public Object transform(Object arg0) { InfoExecutionDegree infoExecutionDegree = (InfoExecutionDegree) arg0; /* TODO: DUPLICATE check really needed? StringBuilder label = new StringBuilder(infoExecutionDegree.getInfoDegreeCurricularPlan().getInfoDegree().getDegreeType() .getLocalizedName()); label.append(" em "); label.append(infoExecutionDegree.getInfoDegreeCurricularPlan().getInfoDegree().getNome()); */ String label = infoExecutionDegree.getInfoDegreeCurricularPlan().getDegreeCurricularPlan() .getPresentationName(infoExecutionDegree.getInfoExecutionYear().getExecutionYear()); return new LabelValueBean(label, infoExecutionDegree.getExternalId().toString()); } }); Collections.sort(executionDegreeList, new BeanComparator("label")); executionDegreeList.add(0, new LabelValueBean(BundleUtil.getString(Bundle.RENDERER, "renderers.menu.default.title"), "")); } public ActionForward changeDestinationContext(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { prepareTransfer(mapping, form, request, response); DynaActionForm dynaActionForm = (DynaActionForm) form; String destinationExecutionDegreeId = (String) dynaActionForm.get("destinationExecutionDegreeId"); String destinationCurricularYear = (String) dynaActionForm.get("destinationCurricularYear"); if (isSet(destinationExecutionDegreeId) && isSet(destinationCurricularYear)) { InfoExecutionCourse infoExecutionCourse = (InfoExecutionCourse) request.getAttribute("infoExecutionCourse"); List executionCourses = ReadExecutionCoursesByExecutionDegreeIdAndExecutionPeriodIdAndCurYear.run(destinationExecutionDegreeId, infoExecutionCourse.getInfoExecutionPeriod().getExternalId(), new Integer(destinationCurricularYear)); executionCourses.remove(infoExecutionCourse); Collections.sort(executionCourses, new BeanComparator("nome")); request.setAttribute("executionCourses", executionCourses); } return mapping.findForward("showTransferPage"); } public ActionForward transfer(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException, FenixActionException { DynaActionForm dynaActionForm = (DynaActionForm) form; String executionCourseId = RequestUtils.getAndSetStringToRequest(request, "executionCourseId"); String destinationExecutionCourseIdString = (String) dynaActionForm.get("destinationExecutionCourseId"); String originExecutionDegreeId = RequestUtils.getAndSetStringToRequest(request, "originExecutionDegreeId"); String curricularYearId = (String) dynaActionForm.get("curricularYearId"); String[] shiftIdsToTransfer = (String[]) dynaActionForm.get("shiftIdsToTransfer"); String[] curricularCourseIdsToTransfer = (String[]) dynaActionForm.get("curricularCourseIdsToTransfer"); ExecutionDegree originExecutionDegree = FenixFramework.getDomainObject(originExecutionDegreeId); ExecutionCourse originExecutionCourse = FenixFramework.getDomainObject(executionCourseId); String originExecutionDegreesString = originExecutionCourse.getDegreePresentationString(); String destinationExecutionCourseId = null; try { if (!StringUtils.isEmpty(destinationExecutionCourseIdString) && StringUtils.isNumeric(destinationExecutionCourseIdString)) { destinationExecutionCourseId = destinationExecutionCourseIdString; } else { throw new DomainException("error.selection.noDestinationExecutionCourse"); } ExecutionCourse destinationExecutionCourse = SeperateExecutionCourse.run(executionCourseId, destinationExecutionCourseId, shiftIdsToTransfer, curricularCourseIdsToTransfer); String destinationExecutionCourseName = destinationExecutionCourse.getNameI18N().getContent(); if (StringUtils.isEmpty(destinationExecutionCourseName)) { destinationExecutionCourseName = destinationExecutionCourse.getName(); } String destinationExecutionCourseCode = destinationExecutionCourse.getSigla(); String destinationDegreeName = destinationExecutionCourse.getDegreePresentationString(); String transferedCurricularCourses = makeObjectStringFromArray(curricularCourseIdsToTransfer, CurricularCourse.class); String transferedShifts; String successKey; if (shiftIdsToTransfer.length == 0) { successKey = "message.manager.executionCourseManagement.transferCourse.success.many.noShifts"; transferedShifts = ""; } else { successKey = "message.manager.executionCourseManagement.transferCourse.success.many"; transferedShifts = makeObjectStringFromArray(shiftIdsToTransfer, Shift.class); } addActionMessage("success", request, successKey, transferedCurricularCourses, transferedShifts, destinationExecutionCourseName, destinationDegreeName, destinationExecutionCourseCode); // check if degree context has changed if (!originExecutionCourse.getExecutionDegrees().contains(originExecutionDegree)) { // origin execution course degree has changed (no longer on original degree) String originCourseName = originExecutionCourse.getNameI18N().getContent(); if (StringUtils.isEmpty(originCourseName)) { originCourseName = originExecutionCourse.getName(); } addActionMessage("info", request, "message.manager.executionCourseManagement.transferCourse.success.switchContext", originCourseName, originExecutionDegreesString, originExecutionCourse.getDegreePresentationString(), destinationExecutionCourseName, destinationExecutionCourse.getDegreePresentationString(), originExecutionDegree.getDegree().getSigla()); request.setAttribute("executionCourseId", destinationExecutionCourse.getExternalId().toString()); } } catch (DomainException e) { addActionMessage("error", request, e.getMessage(), e.getArgs()); if (request.getAttribute("destinationExecutionDegreeId") != null) { request.setAttribute("destinationExecutionDegreeId", request.getAttribute("destinationExecutionDegreeId")); } if (curricularYearId != null) { request.setAttribute("destinationCurricularYear", curricularYearId); } if (request.getAttribute("executionCourses") != null) { request.setAttribute("executionCourses", request.getAttribute("executionCourses")); } if (destinationExecutionCourseId != null) { request.setAttribute("destinationExecutionCourseId", destinationExecutionCourseId.toString()); } return changeDestinationContext(mapping, dynaActionForm, request, response); } return manageCurricularSeparation(mapping, dynaActionForm, request, response); } public ActionForward separate(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException, FenixActionException { DynaActionForm dynaActionForm = (DynaActionForm) form; String executionCourseId = RequestUtils.getAndSetStringToRequest(request, "executionCourseId"); String originExecutionDegreeId = RequestUtils.getAndSetStringToRequest(request, "originExecutionDegreeId"); String[] shiftIdsToTransfer = (String[]) dynaActionForm.get("shiftIdsToTransfer"); String[] curricularCourseIdsToTransfer = (String[]) dynaActionForm.get("curricularCourseIdsToTransfer"); ExecutionDegree originExecutionDegree = FenixFramework.getDomainObject(originExecutionDegreeId); ExecutionCourse originExecutionCourse = FenixFramework.getDomainObject(executionCourseId); String originExecutionDegreesString = originExecutionCourse.getDegreePresentationString(); try { ExecutionCourse destinationExecutionCourse = SeperateExecutionCourse.run(executionCourseId, null, shiftIdsToTransfer, curricularCourseIdsToTransfer); String destinationExecutionCourseName = destinationExecutionCourse.getNameI18N().getContent(); if (StringUtils.isEmpty(destinationExecutionCourseName)) { destinationExecutionCourseName = destinationExecutionCourse.getName(); } String destinationExecutionCourseCode = destinationExecutionCourse.getSigla(); String destinationDegreeName = destinationExecutionCourse.getDegreePresentationString(); String transferedCurricularCourses = makeObjectStringFromArray(curricularCourseIdsToTransfer, CurricularCourse.class); String transferedShifts; String successKey; if (shiftIdsToTransfer.length == 0) { successKey = "message.manager.executionCourseManagement.separate.success.create.noShifts"; transferedShifts = ""; } else { successKey = "message.manager.executionCourseManagement.separate.success.create"; transferedShifts = makeObjectStringFromArray(shiftIdsToTransfer, Shift.class); } addActionMessage("success", request, successKey, destinationExecutionCourseName, destinationDegreeName, destinationExecutionCourseCode, transferedCurricularCourses, transferedShifts); // check if degree context has changed if (!originExecutionCourse.getExecutionDegrees().contains(originExecutionDegree)) { // origin execution course degree has changed (no longer on original degree) String originCourseName = originExecutionCourse.getNameI18N().getContent(); if (StringUtils.isEmpty(originCourseName)) { originCourseName = originExecutionCourse.getName(); } addActionMessage("info", request, "message.manager.executionCourseManagement.separate.success.switchContext", originCourseName, originExecutionDegreesString, originExecutionCourse.getDegreePresentationString(), destinationExecutionCourseName, destinationExecutionCourse.getDegreePresentationString(), originExecutionDegree.getDegree().getSigla()); request.setAttribute("executionCourseId", destinationExecutionCourse.getExternalId().toString()); } } catch (DomainException e) { addActionMessage("error", request, e.getMessage(), e.getArgs()); return prepareSeparate(mapping, dynaActionForm, request, response); } return manageCurricularSeparation(mapping, dynaActionForm, request, response); //mapping.findForward("manageCurricularSeparation"); } private boolean isSet(String parameter) { return !StringUtils.isEmpty(parameter) && StringUtils.isNumeric(parameter); } private String makeObjectStringFromArray(String[] ids, Class objectType) { StringBuilder sb = new StringBuilder(); if (objectType.equals(CurricularCourse.class)) { for (String id : ids) { sb.append(curricularCourseToString(id)); sb.append(", "); } } else if (objectType.equals(Shift.class)) { for (String id : ids) { sb.append(shiftToString(id)); sb.append(", "); } } if (sb.length() > 1) { sb.setLength(sb.length() - 2); // trim ", " } else { sb.append(BundleUtil.getString(Bundle.APPLICATION, "label.empty")); } return sb.toString(); } private String curricularCourseToString(String id) { CurricularCourse curricularCourse = FenixFramework.getDomainObject(id); String name = curricularCourse.getNameI18N().getContent(); if (StringUtils.isEmpty(name)) { name = curricularCourse.getName(); } return name + " [" + curricularCourse.getDegree().getSigla() + "]"; } private String shiftToString(String id) { Shift shift = FenixFramework.getDomainObject(id); return shift.getPresentationName(); } }