/** * 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.administrativeOffice.externalUnits; 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.lang.StringUtils; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.fenixedu.academic.domain.ExternalCurricularCourse; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.organizationalStructure.PartyTypeEnum; import org.fenixedu.academic.domain.organizationalStructure.Unit; import org.fenixedu.academic.domain.organizationalStructure.UnitUtils; import org.fenixedu.academic.domain.studentCurriculum.ExternalEnrolment; import org.fenixedu.academic.dto.administrativeOffice.externalUnits.CreateExternalCurricularCourseBean; import org.fenixedu.academic.dto.administrativeOffice.externalUnits.CreateExternalUnitBean; import org.fenixedu.academic.dto.administrativeOffice.externalUnits.EditExternalCurricularCourseBean; import org.fenixedu.academic.dto.administrativeOffice.externalUnits.EditExternalEnrolmentBean; import org.fenixedu.academic.dto.administrativeOffice.externalUnits.EditExternalUnitBean; import org.fenixedu.academic.dto.administrativeOffice.externalUnits.ExternalCurricularCourseResultBean; import org.fenixedu.academic.dto.administrativeOffice.externalUnits.ExternalUnitResultBean; import org.fenixedu.academic.dto.administrativeOffice.externalUnits.ExternalUnitsSearchBean; import org.fenixedu.academic.predicate.IllegalDataAccessException; import org.fenixedu.academic.service.services.administrativeOffice.externalUnits.CreateExternalCurricularCourse; import org.fenixedu.academic.service.services.administrativeOffice.externalUnits.CreateExternalUnit; import org.fenixedu.academic.service.services.administrativeOffice.externalUnits.DeleteExternalCurricularCourse; import org.fenixedu.academic.service.services.administrativeOffice.externalUnits.DeleteExternalUnit; import org.fenixedu.academic.service.services.administrativeOffice.externalUnits.EditExternalCurricularCourse; import org.fenixedu.academic.service.services.administrativeOffice.externalUnits.EditExternalEnrolment; import org.fenixedu.academic.service.services.administrativeOffice.externalUnits.EditExternalUnit; import org.fenixedu.academic.service.services.exceptions.FenixServiceException; import org.fenixedu.academic.service.services.exceptions.NotAuthorizedException; import org.fenixedu.academic.ui.struts.action.academicAdministration.AcademicAdministrationApplication.AcademicAdminInstitutionsApp; import org.fenixedu.academic.ui.struts.action.base.FenixDispatchAction; 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 pt.ist.fenixWebFramework.renderers.utils.RenderUtils; @StrutsFunctionality(app = AcademicAdminInstitutionsApp.class, path = "external-units", titleKey = "label.externalUnits", accessGroup = "academic(MANAGE_EXTERNAL_UNITS)") @Mapping(path = "/externalUnits", module = "academicAdministration", formBean = "externalUnitsForm") @Forwards({ @Forward(name = "searchExternalUnits", path = "/academicAdminOffice/externalUnits/searchExternalUnit.jsp"), @Forward(name = "viewCountryUnit", path = "/academicAdminOffice/externalUnits/viewCountryUnit.jsp"), @Forward(name = "viewUniversityUnit", path = "/academicAdminOffice/externalUnits/viewUniversityUnit.jsp"), @Forward(name = "viewSchoolUnit", path = "/academicAdminOffice/externalUnits/viewSchoolUnit.jsp"), @Forward(name = "viewDepartmentUnit", path = "/academicAdminOffice/externalUnits/viewDepartmentUnit.jsp"), @Forward(name = "viewExternalCurricularCourse", path = "/academicAdminOffice/externalUnits/viewExternalCurricularCourse.jsp"), @Forward(name = "prepareCreateUnit", path = "/academicAdminOffice/externalUnits/createExternalUnit.jsp"), @Forward(name = "prepareEditUnit", path = "/academicAdminOffice/externalUnits/editExternalUnit.jsp"), @Forward(name = "prepareDeleteUnit", path = "/academicAdminOffice/externalUnits/deleteExternalUnit.jsp"), @Forward(name = "prepareDeleteExternalCurricularCourse", path = "/academicAdminOffice/externalUnits/deleteExternalCurricularCourse.jsp"), @Forward(name = "prepareCreateExternalCurricularCourse", path = "/academicAdminOffice/externalUnits/createExternalCurricularCourse.jsp"), @Forward(name = "prepareEditExternalCurricularCourse", path = "/academicAdminOffice/externalUnits/editExternalCurricularCourse.jsp"), @Forward(name = "prepareEditExternalEnrolment", path = "/academicAdminOffice/externalUnits/editExternalEnrolment.jsp") }) public class ExternalUnitsDispatchAction extends FenixDispatchAction { @EntryPoint public ActionForward prepareSearch(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("searchBean", new ExternalUnitsSearchBean()); return mapping.findForward("searchExternalUnits"); } public ActionForward search(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final ExternalUnitsSearchBean searchBean = getRenderedObject(); request.setAttribute("searchBean", searchBean); if (StringUtils.isEmpty(searchBean.getUnitName())) { addActionMessage("error", request, "error.externalUnits.invalid.unit.name"); } else { searchBean.clearResults(); searchUnits(searchBean); searchExternalCurricularCourses(searchBean); Collections.sort(searchBean.getResults(), new BeanComparator("fullName")); searchBean.setEarthUnit(UnitUtils.readEarthUnit()); } return mapping.findForward("searchExternalUnits"); } private String buildNameToSearch(final String name) { String result = name.replaceAll("[ ]", "%"); result = !name.startsWith("%") ? "%" + result : result; result = !name.endsWith("%") ? result + "%" : result; return result; } private void searchUnits(final ExternalUnitsSearchBean searchBean) { for (final Unit unit : UnitUtils.readExternalUnitsByNameAndTypesStartingAtEarth( buildNameToSearch(searchBean.getUnitName()), getUnitTypes(searchBean))) { searchBean.add(new ExternalUnitResultBean(unit)); } } private void searchExternalCurricularCourses(final ExternalUnitsSearchBean searchBean) { for (final ExternalCurricularCourse externalCurricularCourse : ExternalCurricularCourse .readByName(buildNameToSearch(searchBean.getUnitName()))) { searchBean.add(new ExternalCurricularCourseResultBean(externalCurricularCourse)); } } private List<PartyTypeEnum> getUnitTypes(ExternalUnitsSearchBean searchBean) { return (searchBean.getUnitType() == null) ? searchBean.getValidPartyTypes() : Collections.singletonList(searchBean .getUnitType()); } public ActionForward viewUnit(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final Unit unit = getUnit(request); return viewUnit(mapping, request, unit); } private ActionForward viewUnit(ActionMapping mapping, HttpServletRequest request, final Unit unit) { if (unit.isPlanetUnit()) { request.setAttribute("searchBean", new ExternalUnitsSearchBean()); return mapping.findForward("searchExternalUnits"); } else { request.setAttribute("unitResultBean", new ExternalUnitResultBean(unit)); buildUnitBean(request, unit); return mapping.findForward(findForwardNameFor(unit)); } } private void buildUnitBean(final HttpServletRequest request, final Unit unit) { switch (unit.getType()) { case COUNTRY: request.setAttribute("universities", ExternalUnitResultBean.buildFrom(unit, PartyTypeEnum.UNIVERSITY)); case UNIVERSITY: request.setAttribute("schools", ExternalUnitResultBean.buildFrom(unit, PartyTypeEnum.SCHOOL)); case SCHOOL: request.setAttribute("departments", ExternalUnitResultBean.buildFrom(unit, PartyTypeEnum.DEPARTMENT)); case DEPARTMENT: request.setAttribute("externalCurricularCourses", ExternalCurricularCourseResultBean.buildFrom(unit)); default: break; } } private String findForwardNameFor(Unit unit) { switch (unit.getType()) { case COUNTRY: return "viewCountryUnit"; case UNIVERSITY: return "viewUniversityUnit"; case SCHOOL: return "viewSchoolUnit"; case DEPARTMENT: return "viewDepartmentUnit"; default: return null; } } private Unit getUnit(final HttpServletRequest request) { return getDomainObject(request, "oid"); } public ActionForward prepareCreateCountry(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return prepareCreateUnit(mapping, actionForm, request, response, PartyTypeEnum.COUNTRY); } public ActionForward prepareCreateUniversity(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return prepareCreateUnit(mapping, actionForm, request, response, PartyTypeEnum.UNIVERSITY); } public ActionForward prepareCreateSchool(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return prepareCreateUnit(mapping, actionForm, request, response, PartyTypeEnum.SCHOOL); } public ActionForward prepareCreateDepartment(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { return prepareCreateUnit(mapping, actionForm, request, response, PartyTypeEnum.DEPARTMENT); } private ActionForward prepareCreateUnit(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response, PartyTypeEnum type) { request.setAttribute("createUnitBean", new CreateExternalUnitBean(getUnit(request), type)); return mapping.findForward("prepareCreateUnit"); } public ActionForward prepareEditUnit(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("editUnitBean", new EditExternalUnitBean(getUnit(request))); return mapping.findForward("prepareEditUnit"); } public ActionForward prepareDeleteUnit(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("unit", getUnit(request)); return mapping.findForward("prepareDeleteUnit"); } public ActionForward createExternalUnit(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { final CreateExternalUnitBean externalUnitBean = getRenderedObject(); try { final Unit unit = CreateExternalUnit.run(externalUnitBean); final String oid = (!externalUnitBean.getParentUnit().isPlanetUnit()) ? externalUnitBean.getParentUnit().getExternalId() : unit .getExternalId(); request.setAttribute("oid", oid); return viewUnit(mapping, actionForm, request, response); } catch (final NotAuthorizedException e) { addActionMessage("error", request, "error.notAuthorized"); } catch (final DomainException e) { addActionMessage("error", request, e.getMessage()); } request.setAttribute("createUnitBean", externalUnitBean); return mapping.findForward("prepareCreateUnit"); } public ActionForward editExternalUnit(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { final EditExternalUnitBean externalUnitBean = getRenderedObject(); try { EditExternalUnit.run(externalUnitBean); request.setAttribute("oid", externalUnitBean.getExternalUnit().getExternalId()); return viewUnit(mapping, actionForm, request, response); } catch (final IllegalDataAccessException e) { addActionMessage("error", request, "error.notAuthorized"); } catch (final DomainException e) { addActionMessage("error", request, e.getMessage()); } request.setAttribute("editUnitBean", externalUnitBean); return mapping.findForward("prepareCreateUnit"); } public ActionForward deleteExternalUnit(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { final Unit unit = getUnit(request); final Unit parent = getAnyParentUnit(unit); try { DeleteExternalUnit.run(unit); } catch (final DomainException e) { addActionMessage("error", request, e.getMessage()); request.setAttribute("unit", unit); return mapping.findForward("prepareDeleteUnit"); } return viewUnit(mapping, request, parent); } private Unit getAnyParentUnit(final Unit unit) { return unit.getParentUnits().iterator().next(); } public ActionForward prepareCreateExternalCurricularCourse(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("createExternalCurricularCourseBean", new CreateExternalCurricularCourseBean(getUnit(request))); return mapping.findForward("prepareCreateExternalCurricularCourse"); } public ActionForward prepareEditExternalCurricularCourse(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("editExternalCurricularCourseBean", new EditExternalCurricularCourseBean( getExternalCurricularCourse(request))); return mapping.findForward("prepareEditExternalCurricularCourse"); } public ActionForward prepareDeleteExternalCurricularCourse(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("externalCurricularCourse", getExternalCurricularCourse(request)); return mapping.findForward("prepareDeleteExternalCurricularCourse"); } public ActionForward createExternalCurricularCoursePostback(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("createExternalCurricularCourseBean", getRenderedObject()); RenderUtils.invalidateViewState(); return mapping.findForward("prepareCreateExternalCurricularCourse"); } public ActionForward createExternalCurricularCourseInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("createExternalCurricularCourseBean", getRenderedObject()); return mapping.findForward("prepareCreateExternalCurricularCourse"); } public ActionForward createExternalCurricularCourse(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { final CreateExternalCurricularCourseBean externalCurricularCourseBean = getRenderedObject(); try { CreateExternalCurricularCourse.run(externalCurricularCourseBean); request.setAttribute("oid", externalCurricularCourseBean.getParentUnit().getExternalId()); return viewUnit(mapping, actionForm, request, response); } catch (final NotAuthorizedException e) { addActionMessage("error", request, "error.notAuthorized"); } catch (final DomainException e) { addActionMessage("error", request, e.getMessage()); } request.setAttribute("createExternalCurricularCourseBean", externalCurricularCourseBean); return mapping.findForward("prepareCreateExternalCurricularCourse"); } public ActionForward editExternalCurricularCoursePostback(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("editExternalCurricularCourseBean", getRenderedObject()); RenderUtils.invalidateViewState(); return mapping.findForward("prepareEditExternalCurricularCourse"); } public ActionForward deleteExternalCurricularCourse(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { final ExternalCurricularCourse externalCurricularCourse = getExternalCurricularCourse(request); final Unit parent = externalCurricularCourse.getUnit(); try { DeleteExternalCurricularCourse.run(externalCurricularCourse); } catch (final DomainException e) { addActionMessage("error", request, e.getMessage()); request.setAttribute("externalCurricularCourse", getExternalCurricularCourse(request)); return mapping.findForward("prepareDeleteExternalCurricularCourse"); } return viewUnit(mapping, request, parent); } public ActionForward editExternalCurricularCourseInvalid(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("editExternalCurricularCourseBean", getRenderedObject()); return mapping.findForward("prepareEditExternalCurricularCourse"); } public ActionForward editExternalCurricularCourse(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { final EditExternalCurricularCourseBean externalCurricularCourseBean = getRenderedObject(); try { EditExternalCurricularCourse.run(externalCurricularCourseBean); request.setAttribute("oid", externalCurricularCourseBean.getExternalCurricularCourse().getExternalId()); return viewExternalCurricularCourse(mapping, actionForm, request, response); } catch (final IllegalDataAccessException e) { addActionMessage("error", request, "error.notAuthorized"); } catch (final DomainException e) { addActionMessage("error", request, e.getMessage()); } request.setAttribute("editExternalCurricularCourseBean", externalCurricularCourseBean); return mapping.findForward("prepareCreateExternalCurricularCourse"); } public ActionForward viewExternalCurricularCourse(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { final ExternalCurricularCourse externalCurricularCourse = getExternalCurricularCourse(request); request.setAttribute("externalCurricularCourseBean", new ExternalCurricularCourseResultBean(externalCurricularCourse)); request.setAttribute("externalEnrolments", externalCurricularCourse.getExternalEnrolmentsSet()); return mapping.findForward("viewExternalCurricularCourse"); } private ExternalCurricularCourse getExternalCurricularCourse(final HttpServletRequest request) { return getDomainObject(request, "oid"); } public ActionForward prepareEditExternalEnrolment(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) { request.setAttribute("externalEnrolmentBean", new EditExternalEnrolmentBean(getExternalEnrolment(request))); return mapping.findForward("prepareEditExternalEnrolment"); } private ExternalEnrolment getExternalEnrolment(final HttpServletRequest request) { return getDomainObject(request, "oid"); } public ActionForward editExternalEnrolment(ActionMapping mapping, ActionForm actionForm, HttpServletRequest request, HttpServletResponse response) throws FenixServiceException { final EditExternalEnrolmentBean externalEnrolmentBean = getRenderedObject(); try { EditExternalEnrolment.run(externalEnrolmentBean, externalEnrolmentBean.getExternalEnrolment().getRegistration()); request.setAttribute("oid", externalEnrolmentBean.getExternalCurricularCourse().getExternalId()); return viewExternalCurricularCourse(mapping, actionForm, request, response); } catch (final IllegalDataAccessException e) { addActionMessage("error", request, "error.notAuthorized"); } catch (final DomainException e) { addActionMessage("error", request, e.getMessage()); } request.setAttribute("externalEnrolmentBean", externalEnrolmentBean); return mapping.findForward("prepareEditExternalEnrolment"); } }