/** * 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.mobility.outbound; import java.io.IOException; import java.io.InputStream; import java.io.Serializable; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import org.fenixedu.academic.domain.ExecutionDegree; import org.fenixedu.academic.domain.ExecutionYear; import org.fenixedu.academic.domain.Person; import org.fenixedu.academic.domain.accessControl.academicAdministration.AcademicOperationType; import org.fenixedu.academic.domain.candidacyProcess.mobility.MobilityProgram; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.domain.mobility.outbound.OutboundMobilityCandidacyContest; import org.fenixedu.academic.domain.mobility.outbound.OutboundMobilityCandidacyContestGroup; import org.fenixedu.academic.domain.mobility.outbound.OutboundMobilityCandidacyPeriod; import org.fenixedu.academic.domain.organizationalStructure.UniversityUnit; import org.fenixedu.academic.domain.period.CandidacyPeriod; import org.fenixedu.academic.util.Bundle; import org.fenixedu.bennu.core.i18n.BundleUtil; import org.joda.time.DateTime; import pt.ist.fenixframework.Atomic; import com.google.common.io.ByteStreams; public class OutboundMobilityContextBean implements Serializable { private ExecutionYear executionYear; private SortedSet<OutboundMobilityCandidacyPeriod> candidacyPeriods = new TreeSet<OutboundMobilityCandidacyPeriod>(); private SortedSet<MobilityProgram> mobilityPrograms = new TreeSet<MobilityProgram>(); private SortedSet<OutboundMobilityCandidacyContestGroup> mobilityGroups = new TreeSet<OutboundMobilityCandidacyContestGroup>(); private DateTime startDateTime; private DateTime endDateTime; private MobilityProgram mobilityProgram; private ExecutionDegree executionDegree; private UniversityUnit unit; private Integer vacancies; private Person person; private transient InputStream stream; private long fileSize; private String fileName; private String optionIntroductoryDestription; private String optionValue; private Boolean availableForCandidates; public OutboundMobilityContextBean() { setExecutionYear(ExecutionYear.readCurrentExecutionYear()); OutboundMobilityCandidacyPeriod last = null; for (final CandidacyPeriod candidacyPeriod : executionYear.getCandidacyPeriodsSet()) { if (candidacyPeriod instanceof OutboundMobilityCandidacyPeriod) { final OutboundMobilityCandidacyPeriod outboundMobilityCandidacyPeriod = (OutboundMobilityCandidacyPeriod) candidacyPeriod; if (last == null || last.getStart().isBefore(outboundMobilityCandidacyPeriod.getStart())) { last = outboundMobilityCandidacyPeriod; } } } if (last != null) { candidacyPeriods.add(last); // mobilityGroups.addAll(last.getOutboundMobilityCandidacyContestGroupSet()); } } public ExecutionYear getExecutionYear() { return executionYear; } public void setExecutionYear(final ExecutionYear executionYear) { if (executionYear != this.executionYear) { this.executionYear = executionYear; candidacyPeriods.clear(); getPossibleCandidacyPeriods(candidacyPeriods); } } public void getPossibleCandidacyPeriods(final SortedSet<OutboundMobilityCandidacyPeriod> candidacyPeriods) { if (executionYear != null) { for (final CandidacyPeriod candidacyPeriod : executionYear.getCandidacyPeriodsSet()) { if (candidacyPeriod instanceof OutboundMobilityCandidacyPeriod) { final OutboundMobilityCandidacyPeriod outboundMobilityCandidacyPeriod = (OutboundMobilityCandidacyPeriod) candidacyPeriod; candidacyPeriods.add(outboundMobilityCandidacyPeriod); } } } } public SortedSet<OutboundMobilityCandidacyPeriod> getCandidacyPeriods() { return candidacyPeriods; } public List<OutboundMobilityCandidacyPeriod> getCandidacyPeriodsAsList() { return new ArrayList<OutboundMobilityCandidacyPeriod>(candidacyPeriods); } public void setCandidacyPeriodsAsList(List<OutboundMobilityCandidacyPeriod> candidacyPeriodsAsList) { this.candidacyPeriods.retainAll(candidacyPeriodsAsList); this.candidacyPeriods.addAll(candidacyPeriodsAsList); } public SortedSet<OutboundMobilityCandidacyContestGroup> getMobilityGroups() { return mobilityGroups; } public List<OutboundMobilityCandidacyContestGroup> getMobilityGroupsAsList() { return new ArrayList<OutboundMobilityCandidacyContestGroup>(mobilityGroups); } public void setMobilityGroupsAsList(List<OutboundMobilityCandidacyContestGroup> mobilityGroupsAsList) { this.mobilityGroups.retainAll(mobilityGroupsAsList); this.mobilityGroups.addAll(mobilityGroupsAsList); } public SortedSet<MobilityProgram> getMobilityPrograms() { return mobilityPrograms; } public List<MobilityProgram> getMobilityProgramsAsList() { return new ArrayList<MobilityProgram>(mobilityPrograms); } public void setMobilityProgramsAsList(List<MobilityProgram> mobilityProgramsAsList) { this.mobilityPrograms.retainAll(mobilityProgramsAsList); this.mobilityPrograms.addAll(mobilityProgramsAsList); } public DateTime getStartDateTime() { return startDateTime; } public void setStartDateTime(DateTime startDateTime) { this.startDateTime = startDateTime; } public DateTime getEndDateTime() { return endDateTime; } public void setEndDateTime(DateTime endDateTime) { this.endDateTime = endDateTime; } public void createNewOutboundMobilityCandidacyPeriod() { final OutboundMobilityCandidacyPeriod candidacyPeriod = OutboundMobilityCandidacyPeriod.create(getExecutionYear(), getStartDateTime(), getEndDateTime()); candidacyPeriods.add(candidacyPeriod); } public void createNewOutboundMobilityCandidacyContest() { for (final OutboundMobilityCandidacyPeriod candidacyPeriod : candidacyPeriods) { if (executionDegree == null) { for (final OutboundMobilityCandidacyContestGroup mobilityGroup : mobilityGroups) { candidacyPeriod.createOutboundMobilityCandidacyContest(mobilityGroup, mobilityProgram, unit, vacancies); } } else { candidacyPeriod.createOutboundMobilityCandidacyContest(executionDegree, mobilityProgram, unit, vacancies); } } executionDegree = null; unit = null; vacancies = null; } public ExecutionDegree getExecutionDegree() { return executionDegree; } public void setExecutionDegree(ExecutionDegree executionDegree) { this.executionDegree = executionDegree; } public UniversityUnit getUnit() { return unit; } public void setUnit(UniversityUnit unit) { this.unit = unit; } public Integer getVacancies() { return vacancies; } public void setVacancies(Integer vacancies) { this.vacancies = vacancies; } public MobilityProgram getMobilityProgram() { return mobilityProgram; } public void setMobilityProgram(MobilityProgram mobilityProgram) { this.mobilityProgram = mobilityProgram; } public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; } public SortedSet<OutboundMobilityCandidacyContest> getOutboundMobilityCandidacyContest() { final SortedSet<OutboundMobilityCandidacyContest> result = new TreeSet<OutboundMobilityCandidacyContest>(); for (final OutboundMobilityCandidacyPeriod candidacyPeriod : candidacyPeriods) { for (final OutboundMobilityCandidacyContest contest : candidacyPeriod.getOutboundMobilityCandidacyContestSet()) { if (mobilityPrograms.contains(contest.getMobilityAgreement().getMobilityProgram())) { final OutboundMobilityCandidacyContestGroup mobilityGroup = contest.getOutboundMobilityCandidacyContestGroup(); if (mobilityGroups.contains(mobilityGroup)) { result.add(contest); } } } } return result; } public void addDegreeToGroup() { for (final OutboundMobilityCandidacyContestGroup mobilityGroup : mobilityGroups) { mobilityGroup.addExecutionDegreeService(executionDegree); } } public void removeDegreeFromGroup() { for (final OutboundMobilityCandidacyContestGroup mobilityGroup : mobilityGroups) { mobilityGroup.removeExecutionDegreeService(executionDegree); } } @Atomic public void addMobilityCoordinator() { if (person != null) { for (final OutboundMobilityCandidacyContestGroup mobilityGroup : mobilityGroups) { mobilityGroup.addMobilityCoordinatorService(person); } addOperationPermissions(person); } } private void addOperationPermissions(Person person) { AcademicOperationType.VALIDATE_MOBILITY_OUTBOUND_CANDIDACIES.grant(person.getUser()); } public InputStream getStream() { return stream; } public void setStream(InputStream stream) { this.stream = stream; } public long getFileSize() { return fileSize; } public void setFileSize(long fileSize) { this.fileSize = fileSize; } public String getFileName() { return fileName; } public void setFileName(String fileName) { this.fileName = fileName; } public String getOptionIntroductoryDestription() { return optionIntroductoryDestription; } public void setOptionIntroductoryDestription(String optionIntroductoryDestription) { this.optionIntroductoryDestription = optionIntroductoryDestription; } public String getOptionValue() { return optionValue; } public void setOptionValue(String optionValue) { this.optionValue = optionValue; } public Boolean getAvailableForCandidates() { return availableForCandidates; } public void setAvailableForCandidates(Boolean availableForCandidates) { this.availableForCandidates = availableForCandidates; } protected String readStreamContents() throws IOException { try (final InputStream stream = this.getStream()) { if (stream == null || getFileSize() == 0) { return null; } return new String(ByteStreams.toByteArray(stream), StandardCharsets.UTF_8); } } public void uploadClassifications() throws IOException { final String contents = readStreamContents(); if (contents != null) { for (final OutboundMobilityCandidacyContestGroup group : mobilityGroups) { for (final OutboundMobilityCandidacyPeriod candidacyPeriod : candidacyPeriods) { group.setGrades(candidacyPeriod, contents); } } } else { throw new DomainException("error.mobility.outbound.unable.to.set.grades", BundleUtil.getString(Bundle.ACADEMIC, "error.mobility.outbound.null.file")); } } public void addCandidateOption() { for (final OutboundMobilityCandidacyPeriod period : candidacyPeriods) { if (optionIntroductoryDestription != null && !optionIntroductoryDestription.isEmpty()) { period.setOptionIntroductoryDestriptionService(optionIntroductoryDestription); } if (optionValue != null && !optionValue.isEmpty()) { period.addOption(optionValue, availableForCandidates); } } } }