/** * 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.faces.bean.scientificCouncil.curricularPlans; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; import javax.faces.component.html.HtmlInputText; import javax.faces.event.ValueChangeEvent; import javax.faces.model.SelectItem; import org.apache.commons.lang.StringUtils; import org.fenixedu.academic.domain.Degree; import org.fenixedu.academic.domain.DegreeCurricularPlan; import org.fenixedu.academic.domain.DegreeInfo; import org.fenixedu.academic.domain.DegreeOfficialPublication; import org.fenixedu.academic.domain.DegreeSpecializationArea; import org.fenixedu.academic.domain.ExecutionYear; import org.fenixedu.academic.domain.GradeScale; import org.fenixedu.academic.domain.administrativeOffice.AdministrativeOffice; import org.fenixedu.academic.domain.degree.DegreeType; import org.fenixedu.academic.domain.degreeStructure.CurricularStage; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.predicate.IllegalDataAccessException; import org.fenixedu.academic.service.services.exceptions.FenixServiceException; import org.fenixedu.academic.service.services.scientificCouncil.curricularPlans.ChangeDegreeOfficialPublicationReference; import org.fenixedu.academic.service.services.scientificCouncil.curricularPlans.CreateDegree; import org.fenixedu.academic.service.services.scientificCouncil.curricularPlans.CreateDegreeOfficialPublication; import org.fenixedu.academic.service.services.scientificCouncil.curricularPlans.CreateDegreeSpecializationArea; import org.fenixedu.academic.service.services.scientificCouncil.curricularPlans.DeleteDegree; import org.fenixedu.academic.service.services.scientificCouncil.curricularPlans.DeleteDegreeSpecializationArea; import org.fenixedu.academic.service.services.scientificCouncil.curricularPlans.EditDegree; import org.fenixedu.academic.ui.faces.bean.base.FenixBackingBean; import org.fenixedu.academic.util.Bundle; import org.fenixedu.academic.util.MultiLanguageString; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.joda.time.LocalDate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import pt.ist.fenixframework.FenixFramework; public class DegreeManagementBackingBean extends FenixBackingBean { private static final Logger logger = LoggerFactory.getLogger(DegreeManagementBackingBean.class); private final String NO_SELECTION = "noSelection"; private String degreeId; private Degree degree; private String name; private String nameEn; private String acronym; private String bolonhaDegreeType; private String gradeScale; private Double ectsCredits; private String prevailingScientificArea; private String selectedExecutionYearID; private String academicAdminOfficeId; private String code; private String ministryCode; private HtmlInputText nameInputComponent; private HtmlInputText nameEnInputComponent; private final List<OfficialPubBeanPrint> officialPublicationsBeanPrettyPrints = new ArrayList<DegreeManagementBackingBean.OfficialPubBeanPrint>(); private OfficialPublicationBean officialPublicationBean; private boolean pairsCreated; private String degreeOfficialPublicationId; public String getDegreeOfficialPublicationId() { return degreeOfficialPublicationId; } public void setDegreeOfficialPublicationId(String degreeOfficialPublicationId) { this.degreeOfficialPublicationId = degreeOfficialPublicationId; } private List<Degree> getDegrees() { if (getDegreeType() == null) { return Degree.readNotEmptyDegrees(); } return Degree.readNotEmptyDegrees().stream().filter(degree -> degree.getDegreeType().equals(getDegreeType())) .collect(Collectors.toList()); } /** * @return all degrees except the empty one */ public List<Degree> getBolonhaDegrees() { final List<Degree> result = getDegrees(); Collections.sort(result, Degree.COMPARATOR_BY_DEGREE_TYPE_AND_NAME_AND_ID); return result; } public List<Degree> getFilteredBolonhaDegrees() { final Set<Degree> result = new HashSet<Degree>(); for (final Degree degree : getDegrees()) { for (final DegreeCurricularPlan dcp : degree.getDegreeCurricularPlansSet()) { if (dcp.getCurricularStage().equals(CurricularStage.PUBLISHED) || dcp.getCurricularStage().equals(CurricularStage.APPROVED) || dcp.getCurricularPlanMembersGroup().isMember(this.getUserView())) { result.add(degree); } } } final List<Degree> orderedResult = new ArrayList<Degree>(result); Collections.sort(orderedResult, Degree.COMPARATOR_BY_DEGREE_TYPE_AND_NAME_AND_ID); return orderedResult; } public String getDegreeId() { return (degreeId == null) ? (degreeId = getAndHoldStringParameter("degreeId")) : degreeId; } public void setDegreeId(String degreeId) { this.degreeId = degreeId; } public Degree getDegree() { return (degree == null) ? (degree = FenixFramework.getDomainObject(getDegreeId())) : degree; } public String getName() { return (name == null && getDegree() != null) ? (name = getDegree().getNameFor(getSelectedExecutionYear()).getContent(MultiLanguageString.pt)) : name; } public void setName(String name) { this.name = name; } public String getNameEn() { return (nameEn == null && getDegree() != null) ? (nameEn = getDegree().getNameFor(getSelectedExecutionYear()).getContent(MultiLanguageString.en)) : nameEn; } public void setNameEn(String nameEn) { this.nameEn = nameEn; } public String getAcronym() { return (acronym == null && getDegree() != null) ? (acronym = getDegree().getSigla()) : acronym; } public void setAcronym(String acronym) { this.acronym = acronym; } public String getBolonhaDegreeType() { return (bolonhaDegreeType == null && getDegree() != null) ? (bolonhaDegreeType = getDegree().getDegreeType().getExternalId()) : bolonhaDegreeType; } public DegreeType getDegreeType() { return FenixFramework.getDomainObject(getBolonhaDegreeType()); } public void setBolonhaDegreeType(String bolonhaDegreeType) { this.bolonhaDegreeType = bolonhaDegreeType; } public String getGradeScale() { return (gradeScale == null && getDegree() != null) ? (gradeScale = (getDegree().getGradeScale() != null ? getDegree().getGradeScale().getName() : null)) : gradeScale; } public void setGradeScale(String gradeScale) { this.gradeScale = gradeScale; } public String getCode() { return (code == null && getDegree() != null) ? (code = getDegree().getCode()) : code; } public void setCode(String code) { this.code = code; } public String getMinistryCode() { return (ministryCode == null && getDegree() != null) ? (ministryCode = getDegree().getMinistryCode()) : ministryCode; } public void setMinistryCode(String ministryCode) { this.ministryCode = ministryCode; } public Double getEctsCredits() { if (ectsCredits == null) { if (getDegree() != null) { ectsCredits = getDegree().getEctsCredits(); } else if (getBolonhaDegreeType() != null && !getBolonhaDegreeType().equals(NO_SELECTION)) { ectsCredits = 0.0; } } return ectsCredits; } public void setEctsCredits(Double ectsCredits) { this.ectsCredits = ectsCredits; } public String getPrevailingScientificArea() { return (prevailingScientificArea == null && getDegree() != null) ? (prevailingScientificArea = getDegree().getPrevailingScientificArea()) : prevailingScientificArea; } public void setPrevailingScientificArea(String prevailingScientificArea) { this.prevailingScientificArea = prevailingScientificArea; } /** * @return all degrees types except the empty one */ public List<SelectItem> getBolonhaDegreeTypes() { List<SelectItem> result = new ArrayList<SelectItem>(); result.add(new SelectItem(this.NO_SELECTION, BundleUtil.getString(Bundle.SCIENTIFIC, "choose"))); DegreeType.all().filter(type -> !type.isEmpty()).forEach(type -> { result.add(new SelectItem(type.getExternalId(), type.getName().getContent())); }); return result; } public List<SelectItem> getAcademicAdminOffices() { List<SelectItem> result = new ArrayList<SelectItem>(); result.add(new SelectItem(this.NO_SELECTION, BundleUtil.getString(Bundle.SCIENTIFIC, "choose"))); for (AdministrativeOffice administrativeOffice : rootDomainObject.getAdministrativeOfficesSet()) { result.add(new SelectItem(administrativeOffice.getExternalId(), administrativeOffice.getName().getContent())); } return result; } public List<SelectItem> getGradeScales() { List<SelectItem> result = new ArrayList<SelectItem>(); result.add(new SelectItem(this.NO_SELECTION, BundleUtil.getString(Bundle.SCIENTIFIC, "choose"))); result.add(new SelectItem(GradeScale.TYPE20.name(), BundleUtil.getString(Bundle.ENUMERATION, GradeScale.TYPE20.name()))); result.add(new SelectItem(GradeScale.TYPE5.name(), BundleUtil.getString(Bundle.ENUMERATION, GradeScale.TYPE5.name()))); return result; } public String createDegree() { if (this.bolonhaDegreeType.equals(this.NO_SELECTION)) { this.setErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "choose.degreeType")); return ""; } if (getAcademicAdminOfficeId().equals(this.NO_SELECTION)) { this.setErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "choose.administrativeOffice")); return ""; } if (this.name == null || this.name.length() == 0 || this.nameEn == null || this.nameEn.length() == 0 || this.acronym == null || this.acronym.length() == 0 || this.gradeScale.equals(this.NO_SELECTION)) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "please.fill.mandatory.fields")); return ""; } try { AdministrativeOffice administrativeOffice = FenixFramework.getDomainObject(getAcademicAdminOfficeId()); CreateDegree.run(this.name, this.nameEn, this.acronym, FenixFramework.getDomainObject(this.bolonhaDegreeType), this.getEctsCredits(), GradeScale.valueOf(gradeScale), this.prevailingScientificArea, administrativeOffice); } catch (IllegalDataAccessException e) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.notAuthorized")); return "curricularPlansManagement"; } catch (DomainException e) { this.addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage())); return ""; } catch (Exception e) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.creatingDegree")); return "curricularPlansManagement"; } this.addInfoMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "degree.created")); return "curricularPlansManagement"; } public String editDegree() { if (this.bolonhaDegreeType != null && this.bolonhaDegreeType.equals(this.NO_SELECTION) || this.gradeScale.equals(this.NO_SELECTION)) { this.setErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "choose.request")); return ""; } String name = (String) getNameInputComponent().getValue(); String nameEn = (String) getNameEnInputComponent().getValue(); if (StringUtils.isEmpty(name) || StringUtils.isEmpty(nameEn) || StringUtils.isEmpty(this.acronym)) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "please.fill.mandatory.fields")); return ""; } try { EditDegree.run(this.getDegreeId(), name, nameEn, this.acronym, FenixFramework.getDomainObject(getBolonhaDegreeType()), this.getEctsCredits(), GradeScale.valueOf(gradeScale), this.prevailingScientificArea, getSelectedExecutionYear(), getCode(), getMinistryCode()); } catch (IllegalDataAccessException e) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.notAuthorized")); return "curricularPlansManagement"; } catch (DomainException e) { this.addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage())); return ""; } catch (Exception e) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.editingDegree")); return "curricularPlansManagement"; } this.addInfoMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "degree.edited")); return "curricularPlansManagement"; } public String deleteDegree() { try { DeleteDegree.run(this.getDegreeId()); } catch (IllegalDataAccessException e) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.notAuthorized")); return "curricularPlansManagement"; } catch (DomainException e) { addErrorMessage(e.getLocalizedMessage()); return "curricularPlansManagement"; } catch (Exception e) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.deletingDegree")); return "curricularPlansManagement"; } this.addInfoMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "degree.deleted")); return "curricularPlansManagement"; } public void setSelectedExecutionYearId(String executionYearId) { this.selectedExecutionYearID = executionYearId; } public void onChangeExecutionYear(ValueChangeEvent valueChangeEvent) { String executionYearId = (String) valueChangeEvent.getNewValue(); if (!getSelectedExecutionYearId().equals(executionYearId) && getDegree() != null) { setSelectedExecutionYearId(executionYearId); ExecutionYear executionYear = getSelectedExecutionYear(); DegreeInfo degreeInfo = getDegree().getMostRecentDegreeInfo(executionYear); if (degreeInfo == null) { addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.Degree.doesnot.have.degreeInfo.for.year", executionYear.getName())); degreeInfo = getDegree().getMostRecentDegreeInfo(); } if (degreeInfo != null) { this.name = degreeInfo.getName().getContent(MultiLanguageString.pt); this.nameEn = degreeInfo.getName().getContent(MultiLanguageString.en); this.nameInputComponent.setValue(degreeInfo.getName().getContent(MultiLanguageString.pt)); this.nameEnInputComponent.setValue(degreeInfo.getName().getContent(MultiLanguageString.en)); } } } public String getSelectedExecutionYearId() { if (selectedExecutionYearID == null) { selectedExecutionYearID = getAndHoldStringParameter("selectedExecutionYearId"); if (selectedExecutionYearID == null) { selectedExecutionYearID = ExecutionYear.readCurrentExecutionYear().getExternalId(); } } return selectedExecutionYearID; } public ExecutionYear getSelectedExecutionYear() { return FenixFramework.getDomainObject(getSelectedExecutionYearId()); } public List<SelectItem> getOpenExecutionYears() { List<SelectItem> selectItems = new ArrayList<SelectItem>(); for (ExecutionYear executionYear : ExecutionYear.readNotClosedExecutionYears()) { selectItems.add(new SelectItem(executionYear.getExternalId(), executionYear.getYear())); } return selectItems; } public HtmlInputText getNameInputComponent() { if (this.nameInputComponent == null) { this.nameInputComponent = new HtmlInputText(); ExecutionYear executionYear = (getSelectedExecutionYear() != null) ? getSelectedExecutionYear() : ExecutionYear.readCurrentExecutionYear(); DegreeInfo degreeInfo = getDegreeInfo(executionYear); setSelectedExecutionYearId(degreeInfo.getExecutionYear().getExternalId()); this.nameInputComponent.setValue(degreeInfo.getName().getContent(MultiLanguageString.pt)); } return this.nameInputComponent; } public void setNameInputComponent(HtmlInputText nameInputComponent) { this.nameInputComponent = nameInputComponent; } public HtmlInputText getNameEnInputComponent() { if (this.nameEnInputComponent == null) { this.nameEnInputComponent = new HtmlInputText(); ExecutionYear executionYear = (getSelectedExecutionYear() != null) ? getSelectedExecutionYear() : ExecutionYear.readCurrentExecutionYear(); final DegreeInfo degreeInfo = getDegreeInfo(executionYear); this.nameEnInputComponent.setValue(degreeInfo.getName().getContent(MultiLanguageString.en)); } return this.nameEnInputComponent; } public void setNameEnInputComponent(HtmlInputText nameEnInputComponent) { this.nameEnInputComponent = nameEnInputComponent; } private DegreeInfo getDegreeInfo(final ExecutionYear executionYear) { DegreeInfo degreeInfo = getDegree().getDegreeInfoFor(executionYear); if (degreeInfo == null) { degreeInfo = getDegree().getMostRecentDegreeInfo(); // setSelectedExecutionYearId(degreeInfo.getExecutionYear(). // getExternalId()); } return degreeInfo; } public boolean isAbleToEditName() { final DegreeCurricularPlan firstDegreeCurricularPlan = getDegree().getFirstDegreeCurricularPlan(); final DegreeCurricularPlan lastActiveDegreeCurricularPlan = getDegree().getLastActiveDegreeCurricularPlan(); if (firstDegreeCurricularPlan == null) { return true; } ExecutionYear firstExecutionYear = ExecutionYear.readByDateTime(firstDegreeCurricularPlan.getInitialDateYearMonthDay().toDateTimeAtMidnight()); if (getSelectedExecutionYear().isBefore(firstExecutionYear)) { return true; } if (lastActiveDegreeCurricularPlan == null) { return true; } if (lastActiveDegreeCurricularPlan.getExecutionDegreesSet().isEmpty()) { return true; } if (getSelectedExecutionYear().isAfter(ExecutionYear.readCurrentExecutionYear())) { return true; } if (getSelectedExecutionYear().isCurrent()) { return true; } return false; } public OfficialPublicationBean getOfficialPublicationBean() { if (this.officialPublicationBean == null) { this.officialPublicationBean = new OfficialPublicationBean(this); } return officialPublicationBean; } public List<OfficialPubBeanPrint> getOfficialPublicationsBeanPrettyPrints() { Degree degree = getDegree(); // TODO: remove if (degree == null) { throw new RuntimeException("GONE!!!!"); } // test if the list is already filled, return if so if (this.officialPublicationsBeanPrettyPrints.size() == degree.getOfficialPublicationSet().size()) { return this.officialPublicationsBeanPrettyPrints; } this.officialPublicationsBeanPrettyPrints.clear(); for (DegreeOfficialPublication degreeOfficialPublication : getDegree().getOfficialPublicationSet()) { officialPublicationsBeanPrettyPrints.add(new OfficialPubBeanPrint(degreeOfficialPublication)); } return officialPublicationsBeanPrettyPrints; } public String getAcademicAdminOfficeId() { return academicAdminOfficeId; } public void setAcademicAdminOfficeId(String academicAdminOfficeId) { this.academicAdminOfficeId = academicAdminOfficeId; } public class OfficialPubBeanPrint { private final DegreeOfficialPublication degreeOfficialPublication; private final String date; private final String officialReference; private final String specializationsAreas; public OfficialPubBeanPrint(DegreeOfficialPublication degreeOfficialPublication) { this.degreeOfficialPublication = degreeOfficialPublication; this.date = degreeOfficialPublication.getPublication().toString(); this.officialReference = degreeOfficialPublication.getOfficialReference(); this.specializationsAreas = fetchSpecializationAreas(degreeOfficialPublication); } public DegreeOfficialPublication getDegreeOfficialPublication() { return degreeOfficialPublication; } public String getOfficialReference() { return officialReference; } public String getSpecializationsAreas() { return this.specializationsAreas; } public String getDate() { return date; } public String fetchSpecializationAreas(DegreeOfficialPublication degreeOfficialPublication) { String specializationAreas = ""; // TODO: Remove if (degreeOfficialPublication == null) { throw new RuntimeException("que bodega.."); } for (DegreeSpecializationArea specializationArea : degreeOfficialPublication.getSpecializationAreaSet()) { specializationAreas += (specializationAreas.compareTo("") == 0 ? "" : ", ") + specializationArea.getName().toString(); } return specializationAreas; } } public static class OfficialPublicationBean extends DegreeManagementBackingBean { private String date; private String officialReference; private String officialPubId; private DegreeOfficialPublication degreeOfficialPublication; private String newOfficialReference; private String specializationNameEng; private String specializationNamePt; private List<Pair> specializationNames; private String specializationIdToDelete; private DegreeSpecializationArea specializationAreaToDelete; private DegreeOfficialPublication degreeOfficialPublicationGoBack; public static class Pair extends FenixBackingBean { private String firstValue; private String secondValue; private final DegreeSpecializationArea areaReference; public Pair(DegreeSpecializationArea area) { this.firstValue = (area.getNameEn() == null ? "" : area.getNameEn()); this.secondValue = (area.getNamePt() == null ? "" : area.getNamePt()); this.areaReference = area; } public String getFirstValue() { return firstValue; } public void setFirstValue(String firstValue) { this.firstValue = firstValue; } public String getSecondValue() { return secondValue; } public void setSecondValue(String secondValue) { this.secondValue = secondValue; } public void updateFirstValue() { this.firstValue = areaReference.getNameEn(); } public void updateSecondValue() { this.secondValue = areaReference.getNamePt(); } public DegreeSpecializationArea getAreaReference() { return areaReference; } public boolean isEnModified() { String nameEng = this.areaReference.getNameEn(); if (nameEng != null) { return nameEng.compareTo(this.firstValue) != 0; } else if (this.firstValue != null || this.firstValue.compareTo("") != 0) { return true; } return false; } public boolean isPtModified() { String namePt = this.areaReference.getNamePt(); if (namePt != null) { return namePt.compareTo(this.secondValue) != 0; } else if (this.secondValue != null || this.secondValue.compareTo("") != 0) { return true; } return false; } public boolean isModified() { return isEnModified() || isPtModified(); } } private final DegreeManagementBackingBean degreeManagementBackingBean; public OfficialPublicationBean(DegreeManagementBackingBean degreeManagementBackingBean) { this.degreeManagementBackingBean = degreeManagementBackingBean; super.pairsCreated = true; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getOfficialReference() { return officialReference; } public void setOfficialReference(String officialReference) { this.officialReference = officialReference; } public String makeAndInsertDegreeOfficialPublication() { // to remove if (date == null) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.protocol.invalidDates")); return ""; } String[] dateFields = date.split("/"); if (dateFields.length != 3) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.protocol.invalidDates")); return ""; } if (dateFields[0].length() != 2 || dateFields[1].length() != 2 || dateFields[2].length() != 4) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.protocol.invalidDates")); return ""; } if (officialReference.isEmpty() || officialReference.compareTo("") == 0) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "confirm.error.edit.reference.officialPublication")); return ""; } LocalDate localDate = new LocalDate(Integer.parseInt(dateFields[2]), Integer.parseInt(dateFields[1]), Integer.parseInt(dateFields[0])); Degree degree = getDegree(); try { CreateDegreeOfficialPublication.run(degree, localDate, officialReference); } catch (IllegalDataAccessException e) { this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.notAuthorized")); return ""; } catch (DomainException e) { this.addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage())); return ""; } catch (FenixServiceException e) { // TODO Auto-generated catch block logger.error(e.getMessage(), e); } this.addInfoMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "degreeOfficialPublication.created")); return "editDegree"; } public String getOfficialPubId() { return (officialPubId == null) ? (officialPubId = getAndHoldStringParameter("officialPubId")) : officialPubId; } public void setOfficialPubId(String officialPubId) { this.officialPubId = officialPubId; } public DegreeOfficialPublication getDegreeOfficialPublication() { this.degreeOfficialPublication = (this.getOfficialPubId() == null ? null : (DegreeOfficialPublication) FenixFramework .getDomainObject(getOfficialPubId())); return this.degreeOfficialPublication; } public void setDegreeOfficialPublication(DegreeOfficialPublication degreeOfficialPublication) { this.degreeOfficialPublication = degreeOfficialPublication; } public String getSpecializationNameEng() { return specializationNameEng; } public void setSpecializationNameEng(String specializationNameEng) { this.specializationNameEng = specializationNameEng; } public String getSpecializationNamePt() { return specializationNamePt; } public void setSpecializationNamePt(String specializationNamePt) { this.specializationNamePt = specializationNamePt; } /** * TODO: add error message */ public void addSpecializationArea() { try { CreateDegreeSpecializationArea.run(this.getDegreeOfficialPublication(), getSpecializationNameEng(), getSpecializationNamePt()); } catch (FenixServiceException e) { // TODO Auto-generated catch block logger.error(e.getMessage(), e); } } public String getSpecializationIdToDelete() { return (specializationIdToDelete == null) ? (this.specializationIdToDelete = getAndHoldStringParameter("specializationId")) : specializationIdToDelete; } public void setSpecializationIdToDelete(String specializationIdToDelete) { this.specializationIdToDelete = specializationIdToDelete; } public DegreeSpecializationArea getSpecializationAreaToDelete() { this.specializationAreaToDelete = (DegreeSpecializationArea) (getSpecializationIdToDelete() == null ? null : FenixFramework .getDomainObject(getSpecializationIdToDelete())); if (getDegreeOfficialPublicationGoBack() == null && this.specializationAreaToDelete != null) { setDegreeOfficialPublicationGoBack(this.specializationAreaToDelete.getOfficialPublication()); } return this.specializationAreaToDelete; } public void setSpecializationAreaToDelete(DegreeSpecializationArea specializationAreaToDelete) { this.specializationAreaToDelete = specializationAreaToDelete; } /** * TODO: add error message */ public String removeSpecializationAreaToDelete() { setDegreeOfficialPublicationGoBack(getSpecializationAreaToDelete().getOfficialPublication()); try { DeleteDegreeSpecializationArea.run(getSpecializationAreaToDelete().getOfficialPublication(), getSpecializationAreaToDelete()); } catch (FenixServiceException e) { // TODO Auto-generated catch block logger.error(e.getMessage(), e); } return "editDegreeOfficialPublication"; } public DegreeOfficialPublication getDegreeOfficialPublicationGoBack() { return degreeOfficialPublicationGoBack; } public void setDegreeOfficialPublicationGoBack(DegreeOfficialPublication degreeOfficialPublicationGoBack) { this.degreeOfficialPublicationGoBack = degreeOfficialPublicationGoBack; } public String getNewOfficialReference() { if (getDegreeOfficialPublication() != null && (newOfficialReference == null || newOfficialReference.isEmpty())) { this.newOfficialReference = getDegreeOfficialPublication().getOfficialReference(); } return newOfficialReference; } public void setNewOfficialReference(String newOfficialReference) { this.newOfficialReference = newOfficialReference; } public List<Pair> getSpecializationNames() { List<Pair> specializations = null; if (getDegreeOfficialPublication() != null && specializationNames == null) { specializations = new ArrayList<DegreeManagementBackingBean.OfficialPublicationBean.Pair>(); for (DegreeSpecializationArea area : getDegreeOfficialPublication().getSpecializationAreaSet()) { specializations.add(new Pair(area)); } specializationNames = specializations; } return specializationNames; } /** * TODO: CREATE SERVICE * * */ public void changeOfficialReference() { try { ChangeDegreeOfficialPublicationReference.run(getDegreeOfficialPublication(), this.getNewOfficialReference()); } catch (FenixServiceException e) { // TODO Auto-generated catch block logger.error(e.getMessage(), e); } } public boolean arePairsDifferent() { List<Pair> pairs = this.specializationNames; for (Pair pair : pairs) { if (pair.isModified()) { return true; } } return false; } public String saveOfficialPublicationContent() throws FenixServiceException { String newOfficialReferece = this.getNewOfficialReference(); String engName = getSpecializationNameEng(); String portName = getSpecializationNamePt(); DegreeOfficialPublication degreeOfficialPublication = getDegreeOfficialPublication(); // Modify officialpublication official reference if its name is // changed if (newOfficialReferece != null && newOfficialReferece.compareTo("") != 0 && newOfficialReferece.compareTo(getDegreeOfficialPublication().getOfficialReference()) != 0) { changeOfficialReference(); } // if (arePairsDifferent()) { // List<Pair> pairs = this.specializationNames; // for(Pair pair:pairs){ // pair.updateAreaPt(); // pair.updateAreaEn(); // } // } // // Add new SpecializationArea if (engName != null && engName.compareTo("") != 0 && portName != null && portName.compareTo("") != 0) { addSpecializationArea(); this.specializationNames.clear(); } return "editDegree"; } public void removeOfficialPublication() { logger.info(this.degreeOfficialPublication.toString()); } } }