package net.sourceforge.fenixedu.applicationTier.Servico.departmentAdmOffice; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.TreeSet; import net.sourceforge.fenixedu.applicationTier.Service; import net.sourceforge.fenixedu.applicationTier.Servico.exceptions.FenixServiceException; import net.sourceforge.fenixedu.domain.CurricularCourse; import net.sourceforge.fenixedu.domain.CurricularYear; import net.sourceforge.fenixedu.domain.ExecutionDegree; import net.sourceforge.fenixedu.domain.SchoolClass; import net.sourceforge.fenixedu.domain.degree.DegreeType; import net.sourceforge.fenixedu.domain.student.Registration; import net.sourceforge.fenixedu.domain.student.SearchStudentsWithEnrolmentsByParameters; import net.sourceforge.fenixedu.persistenceTier.ExcepcaoPersistencia; import net.sourceforge.fenixedu.util.StringUtils; /** * * @author cssro * */ public class ReadStudentsByParameters extends Service { protected static final Comparator REGISTRATION_NAME_COMPARATOR = new Comparator() { public int compare(final Registration o1, final Registration o2) { return StringUtils.normalize(o1.getPerson().getName()).compareTo(StringUtils.normalize(o2.getPerson().getName())); }; }; public Set run(SearchStudentsWithEnrolmentsByParameters bean) throws FenixServiceException, ExcepcaoPersistencia { Set result = new HashSet(); if (bean.getExecutionYear() == null) { return Collections. emptySet(); } if (bean.getDegree() != null) { for (final ExecutionDegree executionDegree : bean.getDegree().getExecutionDegreesForExecutionYear( bean.getExecutionYear())) { result.addAll(executionDegree.getActiveRegistrationsForDegree()); } } else { final List degreeTypes = new ArrayList(); degreeTypes.add(DegreeType.DEGREE); degreeTypes.add(DegreeType.BOLONHA_DEGREE); degreeTypes.add(DegreeType.BOLONHA_INTEGRATED_MASTER_DEGREE); for (final ExecutionDegree executionDegree : bean.getExecutionYear().getExecutionDegreesByTypes(degreeTypes)) { result.addAll(executionDegree.getActiveRegistrationsForDegree()); } } return filter(bean, result); } private Set filter(SearchStudentsWithEnrolmentsByParameters bean, Set registrations) { final Set result = new TreeSet(REGISTRATION_NAME_COMPARATOR); for (final Registration registration : registrations) { if (evaluateParameters(bean, registration)) { result.add(registration); } } return result; } private boolean evaluateParameters(SearchStudentsWithEnrolmentsByParameters bean, Registration registration) { return evaluateCurricularCourse(bean, registration) && evaluateSchoolClass(bean, registration) && evaluateCurricularYear(bean, registration); } private boolean evaluateCurricularCourse(SearchStudentsWithEnrolmentsByParameters bean, Registration registration) { final CurricularCourse curricularCourse = bean.getCurricularCourse(); if (curricularCourse == null) { return true; } else if (registration.hasActiveEnrollment(curricularCourse, bean.getExecutionYear())) { return true; } return false; } private boolean evaluateSchoolClass(SearchStudentsWithEnrolmentsByParameters bean, Registration registration) { final SchoolClass schoolClass = bean.getSchoolClass(); final SchoolClass schoolClassReg = registration.getSchoolClassByExecutionYear(bean.getExecutionYear()); if (schoolClass == null) { return true; } else if (schoolClassReg != null && schoolClassReg == schoolClass) { return true; } return false; } private boolean evaluateCurricularYear(SearchStudentsWithEnrolmentsByParameters bean, Registration registration) { CurricularYear curricularYear = bean.getCurricularYear(); if (curricularYear == null) { return true; } else if (registration.getCurricularYear(bean.getExecutionYear()) == curricularYear.getYear()) { return true; } return false; } }