/** * 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.service.services.teacher; import java.util.ArrayList; import java.util.List; import org.fenixedu.academic.domain.Attends; import org.fenixedu.academic.domain.ExecutionCourse; import org.fenixedu.academic.domain.WrittenEvaluation; import org.fenixedu.academic.domain.WrittenEvaluationEnrolment; import org.fenixedu.academic.domain.student.Registration; import org.fenixedu.academic.service.filter.ExecutionCourseAndExamLecturingTeacherAuthorizationFilter; import org.fenixedu.academic.service.services.exceptions.FenixServiceException; import org.fenixedu.academic.service.services.exceptions.NotAuthorizedException; import org.fenixedu.spaces.domain.Space; import pt.ist.fenixframework.Atomic; import pt.ist.fenixframework.FenixFramework; public class WrittenEvaluationRoomDistribution { protected void run(String executionCourseID, String evaluationID, List<String> roomIDs, Boolean distributeOnlyEnroledStudents) throws FenixServiceException { final WrittenEvaluation writtenEvaluation = (WrittenEvaluation) FenixFramework.getDomainObject(evaluationID); if (writtenEvaluation == null) { throw new FenixServiceException("error.noWrittenEvaluation"); } List<Registration> studentsToDistribute; if (distributeOnlyEnroledStudents) { studentsToDistribute = readEnroledStudentsInWrittenEvaluation(writtenEvaluation); } else { studentsToDistribute = readAllStudentsAttendingExecutionCourses(writtenEvaluation); } final List<Space> selectedRooms = readRooms(writtenEvaluation, roomIDs); if (!selectedRooms.containsAll(writtenEvaluation.getAssociatedRooms())) { // if the selected rooms are different of the evaluation rooms // then the user probably selected repeated rooms throw new FenixServiceException("error.repeated.rooms"); } writtenEvaluation.distributeStudentsByRooms(studentsToDistribute, selectedRooms); } private List<Space> readRooms(final WrittenEvaluation writtenEvaluation, final List<String> roomIDs) { List<String> selectedRoomIDs = removeDuplicatedEntries(roomIDs); final List<Space> writtenEvaluationRooms = writtenEvaluation.getAssociatedRooms(); final List<Space> selectedRooms = new ArrayList<Space>(selectedRoomIDs.size()); for (final String roomID : selectedRoomIDs) { for (final Space room : writtenEvaluationRooms) { if (room.getExternalId().equals(roomID)) { selectedRooms.add(room); break; } } } return selectedRooms; } private List<String> removeDuplicatedEntries(List<String> roomIDs) { List<String> result = new ArrayList<String>(); for (final String roomID : roomIDs) { if (!result.contains(roomID)) { result.add(roomID); } } return result; } private List<Registration> readEnroledStudentsInWrittenEvaluation(WrittenEvaluation writtenEvaluation) { final List<Registration> result = new ArrayList<Registration>(writtenEvaluation.getWrittenEvaluationEnrolmentsSet().size()); for (final WrittenEvaluationEnrolment writtenEvaluationEnrolment : writtenEvaluation.getWrittenEvaluationEnrolmentsSet()) { result.add(writtenEvaluationEnrolment.getStudent()); } return result; } private List<Registration> readAllStudentsAttendingExecutionCourses(WrittenEvaluation writtenEvaluation) { final List<Registration> result = new ArrayList<Registration>(); for (final ExecutionCourse executionCourse : writtenEvaluation.getAssociatedExecutionCoursesSet()) { for (final Attends attend : executionCourse.getAttendsSet()) { if (!result.contains(attend.getRegistration())) { result.add(attend.getRegistration()); } } } return result; } // Service Invokers migrated from Berserk private static final WrittenEvaluationRoomDistribution serviceInstance = new WrittenEvaluationRoomDistribution(); @Atomic public static void runWrittenEvaluationRoomDistribution(String executionCourseID, String evaluationID, List<String> roomIDs, Boolean distributeOnlyEnroledStudents) throws FenixServiceException, NotAuthorizedException { ExecutionCourseAndExamLecturingTeacherAuthorizationFilter.instance.execute(executionCourseID, evaluationID); serviceInstance.run(executionCourseID, evaluationID, roomIDs, distributeOnlyEnroledStudents); } }