/** * 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/>. */ /* * Created on Dec 7, 2005 */ package org.fenixedu.academic.ui.faces.bean.bolonhaManager.curricularPlans; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.faces.model.SelectItem; import org.apache.commons.beanutils.BeanComparator; import org.fenixedu.academic.domain.ExecutionSemester; import org.fenixedu.academic.domain.curricularRules.CurricularRule; import org.fenixedu.academic.domain.degreeStructure.BranchCourseGroup; import org.fenixedu.academic.domain.degreeStructure.Context; import org.fenixedu.academic.domain.degreeStructure.CourseGroup; import org.fenixedu.academic.domain.degreeStructure.DegreeModule; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.predicate.IllegalDataAccessException; import org.fenixedu.academic.service.services.bolonhaManager.AddContextToCourseGroup; import org.fenixedu.academic.service.services.bolonhaManager.CreateCourseGroup; import org.fenixedu.academic.service.services.bolonhaManager.DeleteContextFromDegreeModule; import org.fenixedu.academic.service.services.bolonhaManager.EditCourseGroup; import org.fenixedu.academic.service.services.bolonhaManager.OrderDegreeModule; import org.fenixedu.academic.service.services.exceptions.FenixServiceException; import org.fenixedu.academic.ui.struts.action.exceptions.FenixActionException; import org.fenixedu.academic.util.Bundle; import org.fenixedu.academic.util.CurricularRuleLabelFormatter; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.fenixedu.commons.i18n.I18N; import pt.ist.fenixframework.FenixFramework; import com.google.common.base.Strings; public class CourseGroupManagementBackingBean extends CurricularCourseManagementBackingBean { private String name = null; private String nameEn = null; private String courseGroupID; private String programConclusionID = null; private List<SelectItem> courseGroups = null; private Boolean isOptional; public String getParentCourseGroupID() { return getAndHoldStringParameter("parentCourseGroupID"); } public String getProgramConclusionID() { if (this.programConclusionID != null) { return this.programConclusionID; } else { if (getCourseGroup() != null && getCourseGroup().getProgramConclusion() != null) { return getCourseGroup().getProgramConclusion().getExternalId(); } } return null; } @Override public String getCourseGroupID() { return (this.courseGroupID != null) ? this.courseGroupID : getAndHoldStringParameter("courseGroupID"); } @Override public void setCourseGroupID(String courseGroupID) { this.courseGroupID = courseGroupID; } public void setProgramConclusionID(String programConclusionID) { this.programConclusionID = programConclusionID; } @Override public String getName() { return (name == null && getCourseGroupID() != null) ? getCourseGroup(getCourseGroupID()).getName() : name; } @Override public String getNameEn() { return (nameEn == null && getCourseGroupID() != null) ? getCourseGroup(getCourseGroupID()).getNameEn() : nameEn; } public String getParentName() { return (getParentCourseGroupID() != null) ? getCourseGroup(getParentCourseGroupID()).getName() : null; } public Boolean getIsOptional() { return (isOptional == null && getCourseGroupID() != null) ? getCourseGroup(getCourseGroupID()).getIsOptional() : isOptional; } public void setIsOptional(Boolean isOptional) { this.isOptional = isOptional; } @Override public void setName(String name) { this.name = name; } @Override public void setNameEn(String nameEn) { this.nameEn = nameEn; } public CourseGroup getCourseGroup(String courseGroupID) { return (CourseGroup) FenixFramework.getDomainObject(courseGroupID); } @Override public List<SelectItem> getCourseGroups() { return (courseGroups == null) ? (courseGroups = readCourseGroups()) : courseGroups; } @Override public List<String> getRulesLabels() { final List<String> resultLabels = new ArrayList<String>(); for (final CurricularRule curricularRule : getCourseGroup(getCourseGroupID()).getParticipatingCurricularRules()) { resultLabels.add(CurricularRuleLabelFormatter.getLabel(curricularRule)); } return resultLabels; } @Override protected ExecutionSemester getMinimumExecutionPeriod() { CourseGroup courseGroup = getCourseGroup(getParentCourseGroupID());; if (courseGroup == null) { final Context context = getContext(getContextID()); if (context != null) { courseGroup = context.getParentCourseGroup(); } } return (courseGroup == null) ? null : courseGroup.getMinimumExecutionPeriod(); } public String createCourseGroup() { try { CreateCourseGroup.run(getDegreeCurricularPlanID(), getParentCourseGroupID(), getName(), getNameEn(), getBeginExecutionPeriodID(), getFinalEndExecutionPeriodID(), getProgramConclusionID()); addInfoMessage(BundleUtil.getString(Bundle.BOLONHA, "courseGroupCreated")); return "editCurricularPlanStructure"; } catch (final FenixServiceException e) { addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage())); } catch (final DomainException e) { addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage())); } return ""; } public String editCourseGroup() { try { EditCourseGroup.run(getCourseGroupID(), getContextID(), getName(), getNameEn(), getBeginExecutionPeriodID(), getFinalEndExecutionPeriodID(), getIsOptional(), getProgramConclusionID()); addInfoMessage(BundleUtil.getString(Bundle.BOLONHA, "courseGroupEdited")); return "editCurricularPlanStructure"; } catch (final IllegalDataAccessException e) { this.addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.notAuthorized")); return "editCurricularPlanStructure"; } catch (final FenixServiceException e) { addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage())); } catch (final DomainException e) { addErrorMessage(e.getLocalizedMessage()); } return ""; } public String deleteCourseGroup() { try { DeleteContextFromDegreeModule.run(getCourseGroupID(), getContextID()); addInfoMessage(BundleUtil.getString(Bundle.BOLONHA, "courseGroupDeleted")); return "editCurricularPlanStructure"; } catch (final IllegalDataAccessException e) { this.addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.notAuthorized")); return "editCurricularPlanStructure"; } catch (final FenixServiceException e) { addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage())); } catch (final DomainException e) { addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage())); } return ""; } @Override public String addContext() { try { checkCourseGroup(); AddContextToCourseGroup.run(getCourseGroup(getCourseGroupID()), getCourseGroup(getParentCourseGroupID()), getBeginExecutionPeriodID(), getFinalEndExecutionPeriodID()); addInfoMessage(BundleUtil.getString(Bundle.BOLONHA, "courseGroupAssociated")); return "editCurricularPlanStructure"; } catch (FenixActionException e) { this.addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage())); } catch (FenixServiceException e) { this.addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage())); } catch (DomainException e) { this.addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage())); } catch (Exception e) { this.addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "general.error")); return "editCurricularPlanStructure"; } return ""; } private boolean isBranch() { return (this.getCourseGroup() instanceof BranchCourseGroup); } public String getIfBranchShowType() { if (isBranch()) { return "<p class=\"mtop25\">" + BundleUtil.getString(Bundle.BOLONHA, "branchType") + ": " + "<em><strong>" + ((BranchCourseGroup) getCourseGroup()).getBranchType().getDescription(I18N.getLocale()) + "</strong></em>" + "</p>"; } return ""; } private List<SelectItem> readCourseGroups() { final List<SelectItem> result = new ArrayList<SelectItem>(); final List<List<DegreeModule>> degreeModulesSet = getDegreeCurricularPlan().getDcpDegreeModulesIncludingFullPath(CourseGroup.class, null); final Set<CourseGroup> allParents = getCourseGroup(getParentCourseGroupID()).getAllParentCourseGroups(); for (final List<DegreeModule> degreeModules : degreeModulesSet) { final DegreeModule lastDegreeModule = (degreeModules.size() > 0) ? degreeModules.get(degreeModules.size() - 1) : null; if (!allParents.contains(lastDegreeModule) && lastDegreeModule != getCourseGroup(getParentCourseGroupID())) { final StringBuilder pathName = new StringBuilder(); for (final DegreeModule degreeModule : degreeModules) { pathName.append((pathName.length() == 0) ? "" : " > ").append(degreeModule.getName()); } result.add(new SelectItem(lastDegreeModule.getExternalId(), pathName.toString())); } } Collections.sort(result, new BeanComparator("label")); result.add(0, new SelectItem(this.NO_SELECTION_STRING, BundleUtil.getString(Bundle.BOLONHA, "choose"))); return result; } public Integer getPosition() { return getAndHoldIntegerParameter("pos"); } public String orderCourseGroup() { try { OrderDegreeModule.run(getContextID(), getPosition()); addInfoMessage(BundleUtil.getString(Bundle.BOLONHA, "courseGroupMoved")); return "editCurricularPlanStructure"; } catch (DomainException e) { this.addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage())); } catch (Exception e) { this.addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "general.error")); return "editCurricularPlanStructure"; } return ""; } public List<SelectItem> getProgramConclusionItems() { return Bennu.getInstance().getProgramConclusionSet().stream().map(pc -> { String name = pc.getName().getContent(); String description = pc.getDescription().getContent(); if (!Strings.isNullOrEmpty(description)) { name += " - " + description; } return new SelectItem(pc.getExternalId(), name); }).collect(Collectors.toList()); } }