/**
* 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.student.enrolment;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ComparatorChain;
import org.apache.commons.collections.comparators.ReverseComparator;
import org.fenixedu.academic.domain.Evaluation;
import org.fenixedu.academic.domain.Exam;
import org.fenixedu.academic.domain.ExecutionCourse;
import org.fenixedu.academic.domain.ExecutionSemester;
import org.fenixedu.academic.domain.WrittenTest;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.student.Registration;
import org.fenixedu.academic.dto.InfoExecutionPeriod;
import org.fenixedu.academic.predicate.IllegalDataAccessException;
import org.fenixedu.academic.service.services.commons.ReadCurrentExecutionPeriod;
import org.fenixedu.academic.service.services.commons.ReadNotClosedExecutionPeriods;
import org.fenixedu.academic.service.services.exceptions.FenixServiceException;
import org.fenixedu.academic.service.services.student.enrolment.ReadStudentByUsername;
import org.fenixedu.academic.ui.faces.bean.base.FenixBackingBean;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import pt.ist.fenixframework.FenixFramework;
public class DisplayEvaluationsForStudentToEnrol extends FenixBackingBean {
private static final ComparatorChain comparatorChain = new ComparatorChain();
static {
comparatorChain.addComparator(new ReverseComparator(new BeanComparator("isInEnrolmentPeriod")));
comparatorChain.addComparator(new BeanComparator("dayDate"));
}
protected static final Integer ALL = Integer.valueOf(0);
protected static final Integer EXAMS = Integer.valueOf(1);
protected static final Integer WRITTENTESTS = Integer.valueOf(2);
private String executionPeriodID;
protected Integer evaluationType;
private ExecutionSemester executionSemester;
private List<SelectItem> executionPeriodsLabels;
private List<SelectItem> evaluationTypes;
private Registration student;
private List<Evaluation> allNotEnroledEvaluations;
private List<Evaluation> notEnroledEvaluations;
private List<Evaluation> enroledEvaluations;
private List<Evaluation> evaluationsWithoutEnrolmentPeriod;
private Map<String, List<ExecutionCourse>> executionCourses;
public List<SelectItem> getExecutionPeriodsLabels() {
if (this.executionPeriodsLabels == null) {
this.executionPeriodsLabels = new ArrayList();
final List<InfoExecutionPeriod> infoExecutionPeriods = getExecutionPeriods();
final ComparatorChain comparatorChain = new ComparatorChain();
comparatorChain.addComparator(new ReverseComparator(new BeanComparator("infoExecutionYear.year")));
comparatorChain.addComparator(new ReverseComparator(new BeanComparator("semester")));
Collections.sort(infoExecutionPeriods, comparatorChain);
for (final InfoExecutionPeriod infoExecutionPeriod : infoExecutionPeriods) {
final SelectItem selectItem = new SelectItem();
selectItem.setValue(infoExecutionPeriod.getExternalId());
selectItem.setLabel(infoExecutionPeriod.getName() + " - " + infoExecutionPeriod.getInfoExecutionYear().getYear());
this.executionPeriodsLabels.add(selectItem);
}
}
return this.executionPeriodsLabels;
}
public List<SelectItem> getEvaluationTypes() {
if (this.evaluationTypes == null) {
this.evaluationTypes = new ArrayList(4);
final String allEvaluations = BundleUtil.getString(Bundle.STUDENT, "link.all");
evaluationTypes.add(new SelectItem(ALL, allEvaluations));
final String exams = BundleUtil.getString(Bundle.STUDENT, "link.exams.enrolment");
evaluationTypes.add(new SelectItem(EXAMS, exams));
final String writtenTests = BundleUtil.getString(Bundle.STUDENT, "link.writtenTests.enrolment");
evaluationTypes.add(new SelectItem(WRITTENTESTS, writtenTests));
}
return this.evaluationTypes;
}
public List<Evaluation> getAllNotEnroledEvaluations() {
if (this.allNotEnroledEvaluations == null) {
this.allNotEnroledEvaluations = new ArrayList();
processAllEvaluations();
}
return this.allNotEnroledEvaluations;
}
public List<Evaluation> getNotEnroledEvaluations() {
if (this.notEnroledEvaluations == null) {
this.notEnroledEvaluations = new ArrayList();
processNotEnroledEvaluations();
}
return this.notEnroledEvaluations;
}
public void setNotEnroledEvaluations(List<Evaluation> notEnroledEvaluations) {
this.notEnroledEvaluations = notEnroledEvaluations;
}
public List<Evaluation> getEnroledEvaluations() {
if (this.enroledEvaluations == null) {
this.enroledEvaluations = new ArrayList();
processEnroledEvaluations();
}
return this.enroledEvaluations;
}
public void setEnroledEvaluations(List<Evaluation> enroledEvaluations) {
this.enroledEvaluations = enroledEvaluations;
}
public List<Evaluation> getEvaluationsWithoutEnrolmentPeriod() {
if (this.evaluationsWithoutEnrolmentPeriod == null) {
this.evaluationsWithoutEnrolmentPeriod = new ArrayList();
}
return this.evaluationsWithoutEnrolmentPeriod;
}
public void setEvaluationsWithoutEnrolmentPeriod(List<Evaluation> evaluationsWithoutEnrolmentPeriod) {
this.evaluationsWithoutEnrolmentPeriod = evaluationsWithoutEnrolmentPeriod;
}
private void processEnroledEvaluations() {
if (getEvaluationType().equals(ALL) || getEvaluationType().equals(EXAMS)) {
for (final Registration registration : getStudent().getStudent().getRegistrationsSet()) {
for (final Exam exam : registration.getEnroledExams(getExecutionPeriod())) {
if (exam.isExamsMapPublished()) {
try {
exam.isInEnrolmentPeriod();
this.enroledEvaluations.add(exam);
} catch (final DomainException e) {
getEvaluationsWithoutEnrolmentPeriod().add(exam);
} finally {
getExecutionCourses().put(exam.getExternalId(), exam.getAttendingExecutionCoursesFor(registration));
}
}
}
}
}
if (getEvaluationType().equals(ALL) || getEvaluationType().equals(WRITTENTESTS)) {
for (final Registration registration : getStudent().getStudent().getRegistrationsSet()) {
for (final WrittenTest writtenTest : registration.getEnroledWrittenTests(getExecutionPeriod())) {
try {
writtenTest.isInEnrolmentPeriod();
this.enroledEvaluations.add(writtenTest);
} catch (final DomainException e) {
getEvaluationsWithoutEnrolmentPeriod().add(writtenTest);
} finally {
getExecutionCourses().put(writtenTest.getExternalId(),
writtenTest.getAttendingExecutionCoursesFor(registration));
}
}
}
}
Collections.sort(this.enroledEvaluations, comparatorChain);
}
private void processAllEvaluations() {
if (getEvaluationType().equals(ALL) || getEvaluationType().equals(EXAMS)) {
for (final Registration registration : getStudent().getStudent().getRegistrationsSet()) {
for (final Exam exam : registration.getUnenroledExams(getExecutionPeriod())) {
if (exam.isExamsMapPublished()) {
this.allNotEnroledEvaluations.add(exam);
getExecutionCourses().put(exam.getExternalId(), exam.getAttendingExecutionCoursesFor(registration));
}
}
}
}
if (getEvaluationType().equals(ALL) || getEvaluationType().equals(WRITTENTESTS)) {
for (final Registration registration : getStudent().getStudent().getRegistrationsSet()) {
for (final WrittenTest writtenTest : registration.getUnenroledWrittenTests(getExecutionPeriod())) {
this.allNotEnroledEvaluations.add(writtenTest);
getExecutionCourses().put(writtenTest.getExternalId(),
writtenTest.getAttendingExecutionCoursesFor(registration));
}
}
}
Collections.sort(this.allNotEnroledEvaluations, comparatorChain);
}
private void processNotEnroledEvaluations() {
if (getEvaluationType().equals(ALL) || getEvaluationType().equals(EXAMS)) {
for (final Registration registration : getStudent().getStudent().getRegistrationsSet()) {
for (final Exam exam : registration.getUnenroledExams(getExecutionPeriod())) {
if (exam.isExamsMapPublished()) {
try {
exam.isInEnrolmentPeriod();
this.notEnroledEvaluations.add(exam);
} catch (final DomainException e) {
getEvaluationsWithoutEnrolmentPeriod().add(exam);
} finally {
getExecutionCourses().put(exam.getExternalId(), exam.getAttendingExecutionCoursesFor(registration));
}
}
}
}
}
if (getEvaluationType().equals(ALL) || getEvaluationType().equals(WRITTENTESTS)) {
for (final Registration registration : getStudent().getStudent().getRegistrationsSet()) {
for (final WrittenTest writtenTest : registration.getUnenroledWrittenTests(getExecutionPeriod())) {
try {
writtenTest.isInEnrolmentPeriod();
this.notEnroledEvaluations.add(writtenTest);
} catch (final DomainException e) {
getEvaluationsWithoutEnrolmentPeriod().add(writtenTest);
} finally {
getExecutionCourses().put(writtenTest.getExternalId(),
writtenTest.getAttendingExecutionCoursesFor(registration));
}
}
}
}
Collections.sort(this.notEnroledEvaluations, comparatorChain);
}
public void changeExecutionPeriod(ValueChangeEvent event) {
clearAttributes();
}
public void changeEvaluationType(ValueChangeEvent event) {
clearAttributes();
}
protected void clearAttributes() {
setNotEnroledEvaluations(null);
setEnroledEvaluations(null);
setEvaluationsWithoutEnrolmentPeriod(null);
setExecutionCourses(null);
}
private List<InfoExecutionPeriod> getExecutionPeriods() {
try {
return ReadNotClosedExecutionPeriods.run();
} catch (FenixServiceException e) {
}
return new ArrayList();
}
private InfoExecutionPeriod getCurrentExecutionPeriod() {
return ReadCurrentExecutionPeriod.run();
}
protected ExecutionSemester getExecutionPeriod() {
return executionSemester == null && getExecutionPeriodID() != null ? FenixFramework
.<ExecutionSemester> getDomainObject(getExecutionPeriodID()) : executionSemester;
}
protected Registration getStudent() {
if (this.student == null) {
try {
this.student = ReadStudentByUsername.run(getUserView().getUsername());
} catch (IllegalDataAccessException e) {
} catch (FenixServiceException e) {
}
}
return this.student;
}
public String getExecutionPeriodID() {
if (getRequestParameter("executionPeriodID") != null) {
this.executionPeriodID = getRequestParameter("executionPeriodID");
}
if (this.executionPeriodID == null) {
this.executionPeriodID = getCurrentExecutionPeriod().getExternalId();
}
return executionPeriodID;
}
public void setExecutionPeriodID(String executionPeriodID) {
this.executionPeriodID = executionPeriodID;
}
public Integer getEvaluationType() {
if (this.evaluationType == null) {
this.evaluationType = ALL;
}
return this.evaluationType;
}
public String getEvaluationTypeString() {
final Integer type = getEvaluationType();
if (type != null && type.equals(EXAMS)) {
return "org.fenixedu.academic.domain.Exam";
} else if (type != null && type.equals(WRITTENTESTS)) {
return "org.fenixedu.academic.domain.WrittenTest";
}
return "";
}
public void setEvaluationType(Integer evaluationType) {
this.evaluationType = evaluationType;
}
public Map<String, List<ExecutionCourse>> getExecutionCourses() {
if (this.executionCourses == null) {
this.executionCourses = new HashMap<String, List<ExecutionCourse>>();
}
return this.executionCourses;
}
public void setExecutionCourses(Map<String, List<ExecutionCourse>> executionCourses) {
this.executionCourses = executionCourses;
}
}