Package org.fenixedu.academic.ui.faces.bean.bolonhaManager.competenceCourses

Source Code of org.fenixedu.academic.ui.faces.bean.bolonhaManager.competenceCourses.CompetenceCourseManagementBackingBean

/**
* 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/>.
*/
/*
* Created on Dec 8, 2005
*/
package org.fenixedu.academic.ui.faces.bean.bolonhaManager.competenceCourses;

import static org.fenixedu.academic.predicate.AccessControl.check;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TreeSet;

import javax.faces.component.UISelectItems;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;

import org.apache.commons.beanutils.BeanComparator;
import org.apache.commons.collections.comparators.ReverseComparator;
import org.apache.commons.lang.StringUtils;
import org.fenixedu.academic.domain.CompetenceCourse;
import org.fenixedu.academic.domain.CompetenceCourseType;
import org.fenixedu.academic.domain.Department;
import org.fenixedu.academic.domain.ExecutionSemester;
import org.fenixedu.academic.domain.ExecutionYear;
import org.fenixedu.academic.domain.Person;
import org.fenixedu.academic.domain.Teacher;
import org.fenixedu.academic.domain.degreeStructure.BibliographicReferences.BibliographicReference;
import org.fenixedu.academic.domain.degreeStructure.BibliographicReferences.BibliographicReferenceType;
import org.fenixedu.academic.domain.degreeStructure.CompetenceCourseLevel;
import org.fenixedu.academic.domain.degreeStructure.CompetenceCourseLoad;
import org.fenixedu.academic.domain.degreeStructure.CurricularStage;
import org.fenixedu.academic.domain.degreeStructure.RegimeType;
import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.organizationalStructure.CompetenceCourseGroupUnit;
import org.fenixedu.academic.domain.organizationalStructure.DepartmentUnit;
import org.fenixedu.academic.domain.organizationalStructure.ScientificAreaUnit;
import org.fenixedu.academic.domain.organizationalStructure.Unit;
import org.fenixedu.academic.dto.bolonhaManager.CourseLoad;
import org.fenixedu.academic.predicate.AccessControl;
import org.fenixedu.academic.predicate.IllegalDataAccessException;
import org.fenixedu.academic.predicate.RolePredicates;
import org.fenixedu.academic.service.services.bolonhaManager.CreateCompetenceCourse;
import org.fenixedu.academic.service.services.bolonhaManager.DeleteCompetenceCourse;
import org.fenixedu.academic.service.services.bolonhaManager.EditCompetenceCourse;
import org.fenixedu.academic.service.services.bolonhaManager.EditCompetenceCourseLoad;
import org.fenixedu.academic.service.services.exceptions.ExistingCompetenceCourseInformationException;
import org.fenixedu.academic.service.services.exceptions.FenixServiceException;
import org.fenixedu.academic.service.services.exceptions.NotAuthorizedException;
import org.fenixedu.academic.ui.faces.bean.base.FenixBackingBean;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.bennu.core.domain.Bennu;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.groups.Group;
import org.fenixedu.bennu.core.i18n.BundleUtil;

import pt.ist.fenixframework.Atomic;
import pt.ist.fenixframework.FenixFramework;

public class CompetenceCourseManagementBackingBean extends FenixBackingBean {
    private final Integer NO_SELECTION = 0;

    private String selectedDepartmentUnitID = null;
    private String competenceCourseID = null;
    private String executionYearID = null;
    private String executionSemesterID = null;
    private Unit competenceCourseGroupUnit = null;
    private CompetenceCourse competenceCourse = null;

    // Competence-Course-Information
    private String name;
    private String nameEn;
    private String acronym;
    private Boolean basic;
    private boolean setNumberOfPeriods = true;
    // Competence-Course-Additional-Data
    private String objectives;
    private String program;
    private String evaluationMethod;
    private String objectivesEn;
    private String programEn;
    private String evaluationMethodEn;
    private String stage;
    // BibliographicReferences
    private Integer bibliographicReferenceID;
    private String year;
    private String title;
    private String author;
    private String reference;
    private String type;
    private String url;

    private UISelectItems departmentUnitItems;
    private UISelectItems scientificAreaUnitItems;
    private UISelectItems competenceCourseGroupUnitItems;
    private UISelectItems competenceCourseExecutionSemesters;
    private UISelectItems executionSemesterItems;
    private UISelectItems futureExecutionSemesterItems;

    private List<SelectItem> selectedYears = null;

    public String getAction() {
        return getAndHoldStringParameter("action");
    }

    public String getCompetenceCoursesToList() {
        return getAndHoldStringParameter("competenceCoursesToList");
    }

    public Boolean getCanView() {
        DepartmentUnit selectedDepartmentUnit = getSelectedDepartmentUnit();
        if (selectedDepartmentUnit == null) {
            return (this.getPersonDepartment() != null && this.getPersonDepartment().getCompetenceCourseMembersGroup() != null) ? this
                    .getPersonDepartment().getCompetenceCourseMembersGroup().isMember(this.getUserView()) : false;
        } else {
            return selectedDepartmentUnit.getDepartment().getCompetenceCourseMembersGroup() != null ? selectedDepartmentUnit
                    .getDepartment().getCompetenceCourseMembersGroup().isMember(getUserView()) : false;
        }
    }

    public Department getPersonDepartment() {
        final User userView = getUserView();
        final Person person = userView == null ? null : userView.getPerson();
        final Teacher teacher = person == null ? null : person.getTeacher();
        return teacher == null ? null : teacher.getDepartment();
    }

    public Department getDepartmentToDisplay() {
        if (getSelectedDepartmentUnit() != null) {
            return getSelectedDepartmentUnit().getDepartment();
        } else {
            return getPersonDepartment();
        }
    }

    public DepartmentUnit getSelectedDepartmentUnit() {
        if (this.getSelectedDepartmentUnitID() != null) {
            return (DepartmentUnit) FenixFramework.getDomainObject(this.getSelectedDepartmentUnitID());
        } else {
            return null;
        }
    }

    public List<ScientificAreaUnit> getScientificAreaUnits() {
        DepartmentUnit departmentUnit = null;
        if (getSelectedDepartmentUnit() != null) {
            departmentUnit = getSelectedDepartmentUnit();
        } else if (getPersonDepartment() != null) {
            departmentUnit = getPersonDepartment().getDepartmentUnit();
        }
        return (departmentUnit != null) ? departmentUnit.getScientificAreaUnits() : null;
    }

    public List<CompetenceCourse> getDepartmentCompetenceCourses(CurricularStage curricularStage) {
        DepartmentUnit selectedDepartmentUnit = getSelectedDepartmentUnit();
        if (selectedDepartmentUnit != null) {
            return selectedDepartmentUnit.getCompetenceCourses(curricularStage);
        }
        return new ArrayList<CompetenceCourse>();
    }

    public List<CompetenceCourse> getDepartmentCompetenceCourses() {
        return getDepartmentCompetenceCourses(CurricularStage.valueOf(getCompetenceCoursesToList()));
    }

    public List<CompetenceCourse> getDepartmentDraftCompetenceCourses() {
        return getDepartmentCompetenceCourses(CurricularStage.DRAFT);
    }

    public List<CompetenceCourse> getDepartmentPublishedCompetenceCourses() {
        return getDepartmentCompetenceCourses(CurricularStage.PUBLISHED);
    }

    public List<CompetenceCourse> getDepartmentApprovedCompetenceCourses() {
        return getDepartmentCompetenceCourses(CurricularStage.APPROVED);
    }

    public List<String> getGroupMembersLabels() {
        List<String> result = null;

        if (getSelectedDepartmentUnit() == null || getSelectedDepartmentUnit().getDepartment() == null
                || getSelectedDepartmentUnit().getDepartment().getCompetenceCourseMembersGroup() == null) {
            return result;
        }

        Group competenceCoursesManagementGroup = getSelectedDepartmentUnit().getDepartment().getCompetenceCourseMembersGroup();
        if (competenceCoursesManagementGroup != null) {
            result = new ArrayList<String>();

            for (User user : competenceCoursesManagementGroup.getMembers()) {
                result.add(user.getPerson().getName() + " (" + user.getUsername() + ")");
            }
        }

        return result;
    }

    public String getCompetenceCourseGroupUnitID() {
        return getAndHoldStringParameter("competenceCourseGroupUnitID");
    }

    public Unit getCompetenceCourseGroupUnit() {
        if (competenceCourseGroupUnit == null && getCompetenceCourseGroupUnitID() != null) {
            competenceCourseGroupUnit = (Unit) FenixFramework.getDomainObject(getCompetenceCourseGroupUnitID());
        }
        return competenceCourseGroupUnit;
    }

    public String getName() {
        if (name == null && getCompetenceCourse() != null) {
            name = getCompetenceCourse().getName(getAssociatedExecutionPeriod());
        }
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNameEn() {
        if (nameEn == null && getCompetenceCourse() != null) {
            nameEn = getCompetenceCourse().getNameEn(getAssociatedExecutionPeriod());
        }
        return nameEn;
    }

    public void setNameEn(String nameEn) {
        this.nameEn = nameEn;
    }

    public String getAcronym() {
        if (acronym == null && getCompetenceCourse() != null) {
            acronym = getCompetenceCourse().getAcronym(getAssociatedExecutionPeriod());
        }
        return acronym;
    }

    public void setAcronym(String acronym) {
        this.acronym = acronym;
    }

    public Boolean getBasic() {
        if (basic == null && getCompetenceCourse() != null) {
            basic = getCompetenceCourse().isBasic(getAssociatedExecutionPeriod());
        }
        return basic;
    }

    public void setBasic(Boolean basic) {
        this.basic = basic;
    }

    public String getRegime() {
        if (getViewState().getAttribute("regime") == null) {
            if (getCompetenceCourse() != null) {
                ExecutionYear executionYear = getExecutionYear();
                setRegime(getCompetenceCourse().getRegime(getAssociatedExecutionPeriod()).getName());
            } else {
                setRegime("SEMESTRIAL");
            }
        }
        return (String) getViewState().getAttribute("regime");
    }

    public void setRegime(String regime) {
        getViewState().setAttribute("regime", regime);
    }

    public String getCompetenceCourseLevel() {
        if (StringUtils.isEmpty((String) getViewState().getAttribute("competenceCourseLevel"))) {
            if (getCompetenceCourse() != null) {
                if (getCompetenceCourse().getCompetenceCourseLevel(getAssociatedExecutionPeriod()) != null) {
                    setCompetenceCourseLevel(getCompetenceCourse().getCompetenceCourseLevel(getAssociatedExecutionPeriod())
                            .getName());
                }
            }
        }
        return (String) getViewState().getAttribute("competenceCourseLevel");
    }

    public void setCompetenceCourseLevel(String competenceCourseLevel) {
        getViewState().setAttribute("competenceCourseLevel", competenceCourseLevel);
    }

    public String getCompetenceCourseType() {
        if (getViewState().getAttribute("competenceCourseType") == null && getCompetenceCourse() != null) {
            if (getCompetenceCourse().getType() != null) {
                setCompetenceCourseType(getCompetenceCourse().getType().name());
            }
        }

        return (String) getViewState().getAttribute("competenceCourseType");
    }

    public void setCompetenceCourseType(String competenceCourseType) {
        getViewState().setAttribute("competenceCourseType", competenceCourseType);
    }

    public Integer getNumberOfPeriods() {
        if (getViewState().getAttribute("numberOfPeriods") == null) {
            if (getCompetenceCourse() != null && getCompetenceCourse().getCompetenceCourseLoads().size() > 0) {
                setNumberOfPeriods(getCompetenceCourse().getCompetenceCourseLoads(getAssociatedExecutionPeriod()).size());
            } else {
                setNumberOfPeriods(Integer.valueOf(1));
            }
        }
        return (Integer) getViewState().getAttribute("numberOfPeriods");
    }

    public void setNumberOfPeriods(Integer numberOfPeriods) {
        if (setNumberOfPeriods) {
            getViewState().setAttribute("numberOfPeriods", numberOfPeriods);
        }
    }

    public List<SelectItem> getPeriods() {
        final List<SelectItem> result = new ArrayList<SelectItem>(2);
        result.add(new SelectItem(Integer.valueOf(2), BundleUtil.getString(Bundle.BOLONHA, "yes")));
        result.add(new SelectItem(Integer.valueOf(1), BundleUtil.getString(Bundle.BOLONHA, "no")));
        return result;
    }

    public List<CourseLoad> getCourseLoads() {
        if (getViewState().getAttribute("courseLoads") == null) {
            if (getAction().equals("create")) {
                getViewState().setAttribute("courseLoads", createNewCourseLoads());
            } else if (getAction().equals("edit") && getCompetenceCourse() != null) {
                getViewState().setAttribute("courseLoads", getExistingCourseLoads());
            }
        }
        return (List<CourseLoad>) getViewState().getAttribute("courseLoads");
    }

    private List<CourseLoad> createNewCourseLoads() {
        int numberOfPeriods = getNumberOfPeriods().intValue();
        final List<CourseLoad> courseLoads = new ArrayList<CourseLoad>(numberOfPeriods);
        for (int i = 0; i < numberOfPeriods; i++) {
            courseLoads.add(new CourseLoad(i + 1));
        }
        return courseLoads;
    }

    private List<CourseLoad> getExistingCourseLoads() {
        final List<CourseLoad> courseLoads = new ArrayList<CourseLoad>(getCompetenceCourse().getCompetenceCourseLoadsCount());
        for (final CompetenceCourseLoad competenceCourseLoad : getCompetenceCourse().getSortedCompetenceCourseLoads()) {
            courseLoads.add(new CourseLoad("edit", competenceCourseLoad));
        }
        if (courseLoads.isEmpty()) {
            courseLoads.add(new CourseLoad(1));
        }
        return courseLoads;
    }

    public void setCourseLoads(List<CourseLoad> courseLoads) {
        getViewState().setAttribute("courseLoads", courseLoads);
    }

    public void resetCourseLoad(ValueChangeEvent event) {
        calculateCourseLoad((String) event.getNewValue(), 1);
    }

    public void resetCorrespondentCourseLoad(ValueChangeEvent event) {
        calculateCourseLoad(getRegime(), ((Integer) event.getNewValue()).intValue());
    }

    private void calculateCourseLoad(String regime, int newNumberOfPeriods) {
        final List<CourseLoad> courseLoads = getCourseLoads();
        if (regime.equals("ANUAL")) {
            if (newNumberOfPeriods > getNumberOfPeriods().intValue()) {
                addCourseLoad(courseLoads);
            } else {
                removeCourseLoad(courseLoads);
            }
        } else if (regime.equals("SEMESTRIAL")) {
            removeCourseLoad(courseLoads);
            setNumberOfPeriods(Integer.valueOf(1));
            // prevent application to reset the value
            setNumberOfPeriods = false;
        }
        setCourseLoads(courseLoads);
    }

    private void addCourseLoad(final List<CourseLoad> courseLoads) {
        if (getAction().equals("create")) {
            courseLoads.add(new CourseLoad(courseLoads.size() + 1));
        } else if (getAction().equals("edit")) {
            final CourseLoad courseLoad = searchDeletedCourseLoad(courseLoads);
            if (courseLoad != null) {
                courseLoad.setAction("edit");
            } else {
                courseLoads.add(new CourseLoad(courseLoads.size() + 1));
            }
        }
    }

    private CourseLoad searchDeletedCourseLoad(final List<CourseLoad> courseLoads) {
        for (final CourseLoad courseLoad : courseLoads) {
            if (courseLoad.getAction().equals("delete")) {
                return courseLoad;
            }
        }
        return null;
    }

    private void removeCourseLoad(final List<CourseLoad> courseLoads) {
        if (getAction().equals("create") && courseLoads.size() > 1) {
            courseLoads.remove(courseLoads.size() - 1);
        } else if (getAction().equals("edit") && courseLoads.size() > 1) {
            courseLoads.get(courseLoads.size() - 1).setAction("delete");
        }
    }

    public String getSelectedDepartmentUnitID() {
        if (selectedDepartmentUnitID == null) {
            if (getAndHoldStringParameter("selectedDepartmentUnitID") != null) {
                selectedDepartmentUnitID = getAndHoldStringParameter("selectedDepartmentUnitID");
            } else if (getPersonDepartment() != null) {
                selectedDepartmentUnitID = getPersonDepartment().getDepartmentUnit().getExternalId();
            }
        }
        return selectedDepartmentUnitID;
    }

    public void setSelectedDepartmentUnitID(String selectedDepartmentUnitID) {
        this.selectedDepartmentUnitID = selectedDepartmentUnitID;
    }

    public String getCompetenceCourseID() {
        return (competenceCourseID == null) ? (competenceCourseID = getAndHoldStringParameter("competenceCourseID")) : competenceCourseID;
    }

    public void setCompetenceCourseID(String competenceCourseID) {
        this.competenceCourseID = competenceCourseID;
    }

    public CompetenceCourse getCompetenceCourse() {
        if (competenceCourse == null && getCompetenceCourseID() != null) {
            competenceCourse = FenixFramework.getDomainObject(getCompetenceCourseID());
        }
        return competenceCourse;
    }

    public void setCompetenceCourse(CompetenceCourse competenceCourse) {
        this.competenceCourse = competenceCourse;
    }

    public ExecutionSemester getAssociatedExecutionPeriod() {
        return getExecutionSemester();
    }

    public String getObjectives() {
        if (objectives == null && getCompetenceCourse() != null) {
            objectives = getCompetenceCourse().getObjectives(getAssociatedExecutionPeriod());
        }
        return objectives;
    }

    public void setObjectives(String objectives) {
        this.objectives = objectives;
    }

    public String getProgram() {
        if (program == null && getCompetenceCourse() != null) {
            program = getCompetenceCourse().getProgram(getAssociatedExecutionPeriod());
        }
        return program;
    }

    public void setProgram(String program) {
        this.program = program;
    }

    public String getEvaluationMethod() {
        if (evaluationMethod == null && getCompetenceCourse() != null) {
            evaluationMethod = getCompetenceCourse().getEvaluationMethod(getAssociatedExecutionPeriod());
        }
        return evaluationMethod;
    }

    public void setEvaluationMethod(String evaluationMethod) {
        this.evaluationMethod = evaluationMethod;
    }

    public String getObjectivesEn() {
        if (objectivesEn == null && getCompetenceCourse() != null) {
            objectivesEn = getCompetenceCourse().getObjectivesEn(getAssociatedExecutionPeriod());
        }
        return objectivesEn;
    }

    public void setObjectivesEn(String objectivesEn) {
        this.objectivesEn = objectivesEn;
    }

    public String getProgramEn() {
        if (programEn == null && getCompetenceCourse() != null) {
            programEn = getCompetenceCourse().getProgramEn(getAssociatedExecutionPeriod());
        }
        return programEn;
    }

    public void setProgramEn(String programEn) {
        this.programEn = programEn;
    }

    public String getEvaluationMethodEn() {
        if (evaluationMethodEn == null && getCompetenceCourse() != null) {
            evaluationMethodEn = getCompetenceCourse().getEvaluationMethodEn(getAssociatedExecutionPeriod());
        }
        return evaluationMethodEn;
    }

    public void setEvaluationMethodEn(String evaluationMethodEn) {
        this.evaluationMethodEn = evaluationMethodEn;
    }

    public String getStage() {
        if (stage == null && getCompetenceCourse() != null) {
            stage = getCompetenceCourse().getCurricularStage().name();
        }
        return stage;
    }

    public void setStage(String stage) {
        this.stage = stage;
    }

    public Integer getBibliographicReferenceID() {
        return (bibliographicReferenceID == null) ? (bibliographicReferenceID =
                getAndHoldIntegerParameter("bibliographicReferenceID")) : bibliographicReferenceID;
    }

    public void setBibliographicReferenceID(Integer bibliographicReferenceID) {
        this.bibliographicReferenceID = bibliographicReferenceID;
    }

    public String getYear() {
        if (this.year == null && getCompetenceCourse() != null && getBibliographicReferenceID() != null) {
            this.year = getCompetenceCourse().getBibliographicReference(getBibliographicReferenceID()).getYear();
        }
        return this.year;
    }

    public void setYear(String year) {
        this.year = year;
    }

    public String getTitle() {
        if (this.title == null && getCompetenceCourse() != null && getBibliographicReferenceID() != null) {
            this.title = getCompetenceCourse().getBibliographicReference(getBibliographicReferenceID()).getTitle();
        }
        return this.title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getAuthor() {
        if (this.author == null && getCompetenceCourse() != null && getBibliographicReferenceID() != null) {
            this.author = getCompetenceCourse().getBibliographicReference(getBibliographicReferenceID()).getAuthors();
        }
        return this.author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getReference() {
        if (this.reference == null && getCompetenceCourse() != null && getBibliographicReferenceID() != null) {
            this.reference = getCompetenceCourse().getBibliographicReference(getBibliographicReferenceID()).getReference();
        }
        return this.reference;
    }

    public void setReference(String reference) {
        this.reference = reference;
    }

    public String getType() {
        if (this.type == null && getCompetenceCourse() != null && getBibliographicReferenceID() != null) {
            this.type = getCompetenceCourse().getBibliographicReference(getBibliographicReferenceID()).getType().getName();
        }
        return this.type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public String getUrl() {
        if (this.url == null && getCompetenceCourse() != null && getBibliographicReferenceID() != null) {
            this.url = getCompetenceCourse().getBibliographicReference(getBibliographicReferenceID()).getUrl();
        }
        return this.url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public List<CompetenceCourseLoad> getSortedCompetenceCourseLoads() {
        return getCompetenceCourse().getSortedCompetenceCourseLoads(getAssociatedExecutionPeriod());
    }

    public List<BibliographicReference> getMainBibliographicReferences() {
        final List<BibliographicReference> result = new ArrayList<BibliographicReference>();
        if (this.getBibliographicReferences() == null) {
            return result;
        }
        for (final BibliographicReference bibliographicReference : getBibliographicReferences()) {
            if (bibliographicReference.getType().equals(BibliographicReferenceType.MAIN)) {
                result.add(bibliographicReference);
            }
        }
        return result;
    }

    public List<BibliographicReference> getSecondaryBibliographicReferences() {
        final List<BibliographicReference> result = new ArrayList<BibliographicReference>();
        if (this.getBibliographicReferences() == null) {
            return result;
        }
        for (final BibliographicReference bibliographicReference : getBibliographicReferences()) {
            if (bibliographicReference.getType().equals(BibliographicReferenceType.SECONDARY)) {
                result.add(bibliographicReference);
            }
        }
        return result;
    }

    private List<BibliographicReference> getBibliographicReferences() {
        return (getCompetenceCourse().getBibliographicReferences(getAssociatedExecutionPeriod()) == null) ? null : getCompetenceCourse()
                .getBibliographicReferences(getAssociatedExecutionPeriod()).getBibliographicReferencesList();
    }

    public int getBibliographicReferencesCount() {
        return (getBibliographicReferences() != null) ? getBibliographicReferences().size() : 0;
    }

    private CompetenceCourseLevel getEnumCompetenceCourseLevel() {
        return (getCompetenceCourseLevel() == null || getCompetenceCourseLevel().length() == 0) ? null : CompetenceCourseLevel
                .valueOf(getCompetenceCourseLevel());
    }

    private CompetenceCourseType getEnumCompetenceCourseType() {
        String value = getCompetenceCourseType();

        if (value == null || value.length() == 0) {
            return null;
        } else {
            try {
                return CompetenceCourseType.valueOf(value);
            } catch (IllegalArgumentException e) {
                return null;
            }
        }
    }

    private boolean isCompetenceCourseLevelValid() {
        return getEnumCompetenceCourseLevel() != null;
    }

    private boolean isCompetenceCourseTypeValid() {
        return getEnumCompetenceCourseType() != null;
    }

    public String createCompetenceCourse() {
        try {
            boolean valid = true;

            if (!isCompetenceCourseLevelValid()) {
                valid = false;
                addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.mustSetCompetenceCourseLevel"));
            }

            if (!isCompetenceCourseTypeValid()) {
                valid = false;
                addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.mustSetCompetenceCourseType"));
            }

            if (valid) {

                final CompetenceCourse competenceCourse =
                        CreateCompetenceCourse.run(getName(), getNameEn(), null, getBasic(), RegimeType.SEMESTRIAL,
                                getEnumCompetenceCourseLevel(), getEnumCompetenceCourseType(), getCompetenceCourseGroupUnitID(),
                                getExecutionSemester());
                setCompetenceCourse(competenceCourse);
                return "setCompetenceCourseLoad";
            }
        } catch (IllegalDataAccessException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.creatingCompetenceCourse"));
        } catch (ExistingCompetenceCourseInformationException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getKey(), e.getArgs()));
        } catch (FenixServiceException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage()));
        }
        return "";
    }

    public String createCompetenceCourseLoad() {
        try {
            setCompetenceCourseLoad();
            return "setCompetenceCourseAdditionalInformation";
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.editingCompetenceCourse"));
        } catch (FenixServiceException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage()));
        }
        return "";
    }

    public String createCompetenceCourseAdditionalInformation() {
        try {
            setCompetenceCourseAdditionalInformation();
            return "competenceCoursesManagement";
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.editingCompetenceCourse"));
        } catch (FenixServiceException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage()));
        }
        return "";
    }

    public String editCompetenceCourse() {
        try {
            if (isCompetenceCourseLevelValid()) {
                EditCompetenceCourse.runEditCompetenceCourse(getCompetenceCourseID(), getName(), getNameEn(), getBasic(),
                        getEnumCompetenceCourseLevel(), getEnumCompetenceCourseType(), CurricularStage.valueOf(getStage()));
                return "editCompetenceCourseMainPage";

            } else {
                addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.mustSetCompetenceCourseLevel"));
            }
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.editingCompetenceCourse"));
        } catch (ExistingCompetenceCourseInformationException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getKey(), e.getArgs()));
        } catch (FenixServiceException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage()));
        } catch (DomainException e) {
            addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage()));
        }
        return "";
    }

    public String editCompetenceCourseLoad() {
        try {
            setCompetenceCourseLoad();
            return "editCompetenceCourseMainPage";
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.editingCompetenceCourse"));
        } catch (FenixServiceException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage()));
        }
        return "";
    }

    public String editCompetenceCourseAdditionalInformation() {
        try {
            setCompetenceCourseAdditionalInformation();
            return "editCompetenceCourseMainPage";
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.editingCompetenceCourse"));
        } catch (FenixServiceException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage()));
        }
        return "";
    }

    private void setCompetenceCourseLoad() throws FenixServiceException {

        EditCompetenceCourseLoad.run(getCompetenceCourseID(), RegimeType.valueOf(getRegime()), getNumberOfPeriods(),
                getCourseLoads());
    }

    private void setCompetenceCourseAdditionalInformation() throws FenixServiceException {
        EditCompetenceCourse.runEditCompetenceCourse(getCompetenceCourseID(), getObjectives(), getProgram(),
                getEvaluationMethod(), getObjectivesEn(), getProgramEn(), getEvaluationMethodEn());
    }

    public String deleteCompetenceCourse() {
        try {

            DeleteCompetenceCourse.run(getCompetenceCourseID());
            addInfoMessage(BundleUtil.getString(Bundle.BOLONHA, "competenceCourseDeleted"));
            return "competenceCoursesManagement";
        } catch (IllegalDataAccessException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.deletingCompetenceCourse"));
        } catch (DomainException e) {
            addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage()));
        }
        return "";
    }

    public String createBibliographicReference() {
        try {
            EditCompetenceCourse.runEditCompetenceCourse(getCompetenceCourseID(), getYear(), getTitle(), getAuthor(),
                    getReference(), BibliographicReferenceType.valueOf(getType()), getUrl());
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.creatingBibliographicReference"));
        } catch (FenixServiceException e) {
            addErrorMessage(e.getMessage());
        } catch (DomainException e) {
            addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage()));
        }
        setBibliographicReferenceID(-1);
        return "";
    }

    public String editBibliographicReference() {
        try {
            EditCompetenceCourse.runEditCompetenceCourse(getCompetenceCourseID(), getBibliographicReferenceID(), getYear(),
                    getTitle(), getAuthor(), getReference(), BibliographicReferenceType.valueOf(getType()), getUrl());
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.editingBibliographicReference"));
        } catch (FenixServiceException e) {
            addErrorMessage(e.getMessage());
        } catch (DomainException e) {
            addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage()));
        }
        setBibliographicReferenceID(-1);
        return "";
    }

    public Integer getBibliographicReferenceIDToDelete() {
        return getAndHoldIntegerParameter("bibliographicReferenceIDToDelete");
    }

    public String deleteBibliographicReference() {
        try {
            EditCompetenceCourse.runEditCompetenceCourse(getCompetenceCourseID(), getBibliographicReferenceIDToDelete());
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.deletingBibliographicReference"));
        } catch (FenixServiceException e) {
            addErrorMessage(e.getMessage());
        } catch (DomainException e) {
            addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage()));
        }
        setBibliographicReferenceID(-1);
        return "";
    }

    public Integer getOldPosition() {
        return getAndHoldIntegerParameter("oldPosition");
    }

    public Integer getNewPosition() {
        return getAndHoldIntegerParameter("newPosition");
    }

    public String switchBibliographicReferencePosition() {
        try {
            EditCompetenceCourse.runEditCompetenceCourse(getCompetenceCourseID(), getOldPosition(), getNewPosition());
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.switchBibliographicReferencePositions"));
        } catch (FenixServiceException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage()));
        } catch (DomainException e) {
            addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage()));
        }
        setBibliographicReferenceID(-1);
        return "";
    }

    public String cancelBibliographicReference() {
        setBibliographicReferenceID(-1);
        return "";
    }

    public String changeCompetenceCourseState() {
        try {
            CurricularStage changed =
                    (getCompetenceCourse().getCurricularStage().equals(CurricularStage.PUBLISHED) ? CurricularStage.APPROVED : CurricularStage.PUBLISHED);
            EditCompetenceCourse.runEditCompetenceCourse(getCompetenceCourseID(), changed);
            return "";
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.editingCompetenceCourse"));
        } catch (FenixServiceException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage()));
        } catch (DomainException e) {
            addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage()));
        }
        return "";
    }

    public String getDepartmentRealName() {
        return getCompetenceCourse().getDepartmentUnit(getExecutionSemester()).getDepartment().getRealName();
    }

    public String getScientificAreaUnitName() {
        return getCompetenceCourse().getScientificAreaUnit(getExecutionSemester()).getName();
    }

    public String getCompetenceCourseGroupUnitName() {
        return getCompetenceCourse().getCompetenceCourseGroupUnit(getExecutionSemester()).getName();
    }

    public UISelectItems getDepartmentUnitItems() {
        if (departmentUnitItems == null) {
            departmentUnitItems = new UISelectItems();
            departmentUnitItems.setValue(readDepartmentUnitLabels());
        }
        return departmentUnitItems;
    }

    public void setDepartmentUnitItems(UISelectItems departmentUnitItems) {
        this.departmentUnitItems = departmentUnitItems;
    }

    public void onChangeDepartmentUnit(ValueChangeEvent event) {
        setTransferToDepartmentUnitID((String) event.getNewValue());
        getScientificAreaUnitItems().setValue(readScientificAreaUnitLabels((String) event.getNewValue()));
        getCompetenceCourseGroupUnitItems().setValue(readCompetenceCourseGroupUnitLabels(null));
    }

    private List<SelectItem> readDepartmentUnitLabels() {
        final List<SelectItem> result = new ArrayList<SelectItem>();
        for (final Department departmentObject : Bennu.getInstance().getDepartmentsSet()) {
            DepartmentUnit departmentUnit = departmentObject.getDepartmentUnit();
            if (departmentUnit.isActive(getExecutionSemester().getBeginDateYearMonthDay())) {
                result.add(new SelectItem(departmentUnit.getExternalId(), departmentUnit.getName()));
            }
        }
        Collections.sort(result, new BeanComparator("label"));
        result.add(0, new SelectItem(this.NO_SELECTION, BundleUtil.getString(Bundle.BOLONHA, "choose")));
        return result;
    }

    public UISelectItems getScientificAreaUnitItems() {
        if (scientificAreaUnitItems == null) {
            scientificAreaUnitItems = new UISelectItems();
            scientificAreaUnitItems.setValue(readScientificAreaUnitLabels(getTransferToDepartmentUnitID()));
        }
        return scientificAreaUnitItems;
    }

    public void setScientificAreaUnitItems(UISelectItems scientificAreaUnitItems) {
        this.scientificAreaUnitItems = scientificAreaUnitItems;
    }

    public void onChangeScientificAreaUnit(ValueChangeEvent event) {
        setTransferToScientificAreaUnitID((String) event.getNewValue());
        getCompetenceCourseGroupUnitItems().setValue(readCompetenceCourseGroupUnitLabels((String) event.getNewValue()));
    }

    private List<SelectItem> readScientificAreaUnitLabels(String transferToDepartmentUnitID) {
        final List<SelectItem> result = new ArrayList<SelectItem>();
        if (transferToDepartmentUnitID != null) {
            for (final ScientificAreaUnit unit : readDepartmentUnitToTransferTo(transferToDepartmentUnitID)
                    .getScientificAreaUnits()) {
                result.add(new SelectItem(unit.getExternalId(), unit.getName()));
            }
        }
        Collections.sort(result, new BeanComparator("label"));
        result.add(0, new SelectItem(this.NO_SELECTION, BundleUtil.getString(Bundle.BOLONHA, "choose")));
        return result;
    }

    public String getTransferToDepartmentUnitID() {
        if (getViewState().getAttribute("transferToDepartmentUnitID") != null) {
            return (String) getViewState().getAttribute("transferToDepartmentUnitID");
        }
        return null;
    }

    public void setTransferToDepartmentUnitID(String transferToDepartmentUnitID) {
        this.getViewState().setAttribute("transferToDepartmentUnitID", transferToDepartmentUnitID);
    }

    private DepartmentUnit readDepartmentUnitToTransferTo(String transferToDepartmentUnitID) {
        return (DepartmentUnit) FenixFramework.getDomainObject(transferToDepartmentUnitID);
    }

    public UISelectItems getCompetenceCourseGroupUnitItems() {
        if (competenceCourseGroupUnitItems == null) {
            competenceCourseGroupUnitItems = new UISelectItems();
            competenceCourseGroupUnitItems.setValue(readCompetenceCourseGroupUnitLabels(getTransferToScientificAreaUnitID()));
        }
        return competenceCourseGroupUnitItems;
    }

    public void setCompetenceCourseGroupUnitItems(UISelectItems competenceCourseGroupUnitItems) {
        this.competenceCourseGroupUnitItems = competenceCourseGroupUnitItems;
    }

    private List<SelectItem> readCompetenceCourseGroupUnitLabels(String transferToScientificAreaUnitID) {
        final List<SelectItem> result = new ArrayList<SelectItem>();
        if (transferToScientificAreaUnitID != null) {
            for (final Unit unit : readScientificAreaUnitToTransferTo(transferToScientificAreaUnitID)
                    .getCompetenceCourseGroupUnits()) {
                result.add(new SelectItem(unit.getExternalId(), unit.getName()));
            }
        }
        Collections.sort(result, new BeanComparator("label"));
        result.add(0, new SelectItem(this.NO_SELECTION, BundleUtil.getString(Bundle.BOLONHA, "choose")));
        return result;
    }

    public String getTransferToScientificAreaUnitID() {
        if (getViewState().getAttribute("transferToScientificAreaUnitID") != null) {
            return (String) getViewState().getAttribute("transferToScientificAreaUnitID");
        }
        return null;
    }

    public void setTransferToScientificAreaUnitID(String transferToScientificAreaUnitID) {
        this.getViewState().setAttribute("transferToScientificAreaUnitID", transferToScientificAreaUnitID);
    }

    private ScientificAreaUnit readScientificAreaUnitToTransferTo(String transferToScientificAreaUnitID) {
        return (ScientificAreaUnit) FenixFramework.getDomainObject(transferToScientificAreaUnitID);
    }

    @Atomic
    public String transferCompetenceCourse() {
        check(this, RolePredicates.SCIENTIFIC_COUNCIL_PREDICATE);
        try {
            if (getCompetenceCourse() == null || readCompetenceCourseGroupUnitToTransferTo() == null
                    || getExecutionSemester() == null) {
                addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.transferingCompetenceCourse"));
                return "competenceCoursesManagement";
            }
            getCompetenceCourse().transfer((CompetenceCourseGroupUnit) readCompetenceCourseGroupUnitToTransferTo(),
                    getExecutionSemester(), BundleUtil.getString(Bundle.SCIENTIFIC, "transfer.done.by.scientific.council"),
                    AccessControl.getPerson());

        } catch (IllegalDataAccessException e) {
            this.addErrorMessage(BundleUtil.getString(Bundle.SCIENTIFIC, "error.notAuthorized"));
        } catch (DomainException e) {
            addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage()));
        }
        return "competenceCoursesManagement";
    }

    private Unit readCompetenceCourseGroupUnitToTransferTo() {
        if (getTransferToCompetenceCourseGroupUnitID() != null) {
            return (Unit) FenixFramework.getDomainObject(getTransferToCompetenceCourseGroupUnitID());
        }
        return null;
    }

    public String getTransferToCompetenceCourseGroupUnitID() {
        if (getViewState().getAttribute("transferToCompetenceCourseGroupUnitID") != null) {
            return (String) getViewState().getAttribute("transferToCompetenceCourseGroupUnitID");
        }
        return null;
    }

    public void setTransferToCompetenceCourseGroupUnitID(String transferToCompetenceCourseGroupUnitID) {
        this.getViewState().setAttribute("transferToCompetenceCourseGroupUnitID", transferToCompetenceCourseGroupUnitID);
    }

    private ExecutionSemester getExecutionSemester() {
        return FenixFramework.getDomainObject(getExecutionSemesterID());
    }

    public String getExecutionSemesterID() {
        if (executionSemesterID == null) {
            executionSemesterID = (String) getViewState().getAttribute("executionSemesterID");
        }
        ExecutionSemester currentSemester = ExecutionSemester.readActualExecutionSemester();
        if ((executionSemesterID == null) && (getCompetenceCourse() != null)) {
            if (getCompetenceCourse().getCompetenceCourseInformationsSet().size() == 1) {
                executionSemesterID =
                        getCompetenceCourse().getCompetenceCourseInformationsSet().iterator().next().getExecutionPeriod()
                                .getExternalId();
            }
        }
        if (executionSemesterID == null) {
            executionSemesterID = currentSemester.getExternalId();
        }
        return executionSemesterID;
    }

    public void setExecutionSemesterID(String executionSemesterID) {
        this.executionSemesterID = executionSemesterID;
        reset();
    }

    public ExecutionYear getExecutionYear() {
        return FenixFramework.getDomainObject(getExecutionYearID());
    }

    public String getExecutionYearID() {
        if (executionYearID == null) {
            executionYearID = getAndHoldStringParameter("executionYearID");
        }
        if (executionYearID == null) {
            executionYearID = ExecutionYear.readCurrentExecutionYear().getExternalId();
        }
        return executionYearID;
    }

    public void setExecutionYearID(String executionYearID) {
        this.executionYearID = executionYearID;
        reset();
    }

    public UISelectItems getExecutionSemesterItems() {
        if (executionSemesterItems == null) {
            executionSemesterItems = new UISelectItems();
            executionSemesterItems.setValue(readExecutionSemesterLabels());
        }
        return executionSemesterItems;
    }

    public void setExecutionSemesterItems(UISelectItems executionSemesterItems) {

    }

    private List<SelectItem> readExecutionSemesterLabels() {
        final List<SelectItem> result = new ArrayList<SelectItem>();
        for (ExecutionSemester semester : getOrderedCompetenceCourseExecutionSemesters()) {
            result.add(new SelectItem(semester.getExternalId(), semester.getQualifiedName()));
        }
        return result;
    }

    public UISelectItems getFutureExecutionSemesterItems() {
        if (futureExecutionSemesterItems == null) {
            futureExecutionSemesterItems = new UISelectItems();
            futureExecutionSemesterItems.setValue(readFutureExecutionSemesterLabels());
        }
        return futureExecutionSemesterItems;
    }

    public void setFutureExecutionSemesterItems(UISelectItems futureExecutionSemesterItems) {
        this.futureExecutionSemesterItems = futureExecutionSemesterItems;
    }

    private List<SelectItem> readFutureExecutionSemesterLabels() {
        final List<SelectItem> result = new ArrayList<SelectItem>();
        ExecutionSemester semester = ExecutionSemester.readActualExecutionSemester();
        while (semester != null) {
            result.add(new SelectItem(semester.getExternalId(), semester.getQualifiedName()));
            semester = semester.getNextExecutionPeriod();
        }
        return result;
    }

    public UISelectItems getCompetenceCourseExecutionSemesters() {
        if (competenceCourseExecutionSemesters == null) {
            competenceCourseExecutionSemesters = new UISelectItems();
            competenceCourseExecutionSemesters.setValue(readCompetenceCourseExecutionSemesterLabels());
        }
        return competenceCourseExecutionSemesters;
    }

    public void setCompetenceCourseExecutionSemesters(UISelectItems competenceCourseExecutionSemesters) {
        this.competenceCourseExecutionSemesters = competenceCourseExecutionSemesters;
    }

    private List<SelectItem> readCompetenceCourseExecutionSemesterLabels() {
        final List<SelectItem> result = new ArrayList<SelectItem>();
        for (ExecutionSemester semester : getOrderedCompetenceCourseExecutionSemesters()) {
            result.add(new SelectItem(semester.getExternalId(), semester.getQualifiedName()));
        }
        return result;
    }

    private TreeSet<ExecutionSemester> getOrderedCompetenceCourseExecutionSemesters() {
        final TreeSet<ExecutionSemester> result =
                new TreeSet<ExecutionSemester>(ExecutionSemester.COMPARATOR_BY_SEMESTER_AND_YEAR);
        ExecutionSemester semester = getCompetenceCourse().getStartExecutionSemester();
        result.add(semester);
        while (semester.hasNextExecutionPeriod()) {
            semester = semester.getNextExecutionPeriod();
            result.add(semester);
        }
        return result;
    }

    public String editAcronym() {
        try {
            EditCompetenceCourse.runEditCompetenceCourse(getCompetenceCourseID(), getAcronym());
            return "editCompetenceCourseMainPage";
        } catch (NotAuthorizedException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, "error.editingCompetenceCourse"));
        } catch (FenixServiceException e) {
            addErrorMessage(BundleUtil.getString(Bundle.BOLONHA, e.getMessage()));
        } catch (DomainException e) {
            addErrorMessage(BundleUtil.getString(Bundle.DOMAIN_EXCEPTION, e.getMessage(), e.getArgs()));
        }
        return "";
    }

    public List<SelectItem> getExecutionYears() {
        if (selectedYears == null) {

            ExecutionYear year = null;
            if (getCompetenceCourse() != null) {
                final ExecutionSemester semester = getCompetenceCourse().getStartExecutionSemester();
                year = semester != null ? semester.getExecutionYear() : null;
            }

            selectedYears = new ArrayList<SelectItem>();
            for (ExecutionYear executionYear : ExecutionYear.readNotClosedExecutionYears()) {
                if (year == null || executionYear.isAfterOrEquals(year)) {
                    selectedYears.add(new SelectItem(executionYear.getExternalId(), executionYear.getYear()));
                }
            }
            Collections.sort(selectedYears, new ReverseComparator(new BeanComparator("label")));
        }

        return selectedYears;
    }

    private void reset() {
        name = null;
        nameEn = null;
        acronym = null;
        basic = null;
        objectives = null;
        program = null;
        evaluationMethod = null;
        objectivesEn = null;
        programEn = null;
        evaluationMethodEn = null;
        stage = null;
        bibliographicReferenceID = null;
    }

}
TOP

Related Classes of org.fenixedu.academic.ui.faces.bean.bolonhaManager.competenceCourses.CompetenceCourseManagementBackingBean

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.