Package org.fenixedu.academic.domain

Source Code of org.fenixedu.academic.domain.Project

/**
* 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 Nov 7, 2005
*  by jdnf
*/
package org.fenixedu.academic.domain;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.fenixedu.academic.domain.exceptions.DomainException;
import org.fenixedu.academic.domain.student.GroupEnrolment;
import org.fenixedu.academic.domain.util.icalendar.EvaluationEventBean;
import org.fenixedu.academic.service.services.exceptions.FenixServiceException;
import org.fenixedu.academic.util.Bundle;
import org.fenixedu.academic.util.EvaluationType;
import org.fenixedu.bennu.core.i18n.BundleUtil;
import org.fenixedu.bennu.core.util.CoreConfiguration;
import org.joda.time.DateTime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import pt.ist.fenixframework.dml.runtime.RelationAdapter;

public class Project extends Project_Base {

    private static final Logger logger = LoggerFactory.getLogger(Project.class);

    static {
        getRelationProjectGrouping().addListener(new RelationAdapter<Project, Grouping>() {
            @Override
            public void afterAdd(Project project, Grouping grouping) {
                if (project != null && grouping != null) {
                    if (grouping.getAutomaticEnrolment() && grouping.getStudentGroupsSet().isEmpty()) {
                        int groupCount = 0;
                        for (final ExecutionCourse executionCourse : project.getAssociatedExecutionCoursesSet()) {
                            for (Attends attend : executionCourse.getAttendsSet()) {
                                try {
                                    GroupEnrolment.run(grouping.getExternalId(), null, ++groupCount, new ArrayList<String>(),
                                            attend.getRegistration().getStudent().getPerson().getUsername());
                                } catch (FenixServiceException e) {
                                    // TODO Auto-generated catch block
                                    logger.error(e.getMessage(), e);
                                    groupCount--;
                                }
                            }
                        }
                        grouping.setGroupMaximumNumber(groupCount);
                    }
                }
            }
        });
    }

    private Project() {
        super();
    }

    public Project(String name, Date begin, Date end, String description, Boolean onlineSubmissionsAllowed,
            Integer maxSubmissionsToKeep, Grouping grouping, ExecutionCourse executionCourse) {
        this();
        if (name == null || begin == null || end == null || executionCourse == null) {
            throw new NullPointerException();
        }
        if (begin.after(end)) {
            throw new DomainException("error.evaluation.begin.sooner.end");
        }

        this.setName(name);
        this.setBegin(begin);
        this.setEnd(end);
        this.setDescription(description != null ? description : "");
        this.addAssociatedExecutionCourses(executionCourse);
        this.setGradeScale(GradeScale.TYPE20);

        setOnlineSubmissionProperties(onlineSubmissionsAllowed, maxSubmissionsToKeep, grouping);
    }

    public Project(String name, Date begin, Date end, String description, Boolean onlineSubmissionsAllowed,
            Integer maxSubmissionsToKeep, Grouping grouping, ExecutionCourse executionCourse, GradeScale gradeScale) {

        this(name, begin, end, description, onlineSubmissionsAllowed, maxSubmissionsToKeep, grouping, executionCourse);

        if (gradeScale != null) {
            this.setGradeScale(gradeScale);
        }

        logCreate();
    }

    public void edit(String name, Date begin, Date end, String description, Boolean onlineSubmissionsAllowed,
            Integer maxSubmissionsToKeep, Grouping grouping, GradeScale gradeScale, List<Department> departments) {
        if (name == null || begin == null || end == null) {
            throw new NullPointerException();
        }
        if (begin.after(end)) {
            throw new DomainException("error.evaluation.begin.sooner.end");
        }
        setName(name);
        setBegin(begin);
        setEnd(end);
        setGradeScale(gradeScale);
        setDescription((description != null) ? description : "");

        if (!getProjectSubmissionsSet().isEmpty()) {
            if (!getGrouping().equals(grouping) || !getOnlineSubmissionsAllowed().equals(onlineSubmissionsAllowed)
                    || !getMaxSubmissionsToKeep().equals(maxSubmissionsToKeep)) {
                throw new DomainException("error.project.onlineSubmissionOptionsCannotBeChangedBecauseSubmissionsAlreadyExist");
            }

        }

        setOnlineSubmissionProperties(onlineSubmissionsAllowed, maxSubmissionsToKeep, grouping);
        final Collection<Department> departmentsList = getDeparmentsSet();
        departmentsList.clear();
        departmentsList.addAll(departments);

        logEdit();
    }

    private void setOnlineSubmissionProperties(Boolean onlineSubmissionsAllowed, Integer maxSubmissionsToKeep, Grouping grouping) {

        setOnlineSubmissionsAllowed(onlineSubmissionsAllowed);

        if (onlineSubmissionsAllowed == true) {
            if ((maxSubmissionsToKeep == null) || (maxSubmissionsToKeep == 0) || (grouping == null)) {
                throw new DomainException("error.project.maxSubmissionsAndGroupingRequiredForOnlineSubmissions");
            } else {
                setMaxSubmissionsToKeep(maxSubmissionsToKeep);
                setGrouping(grouping);
            }
        } else {
            setMaxSubmissionsToKeep(null);
            setGrouping(null);

        }
    }

    @Override
    public EvaluationType getEvaluationType() {
        return EvaluationType.PROJECT_TYPE;
    }

    @Deprecated
    public java.util.Date getBegin() {
        org.joda.time.DateTime dt = getProjectBeginDateTime();
        return (dt == null) ? null : new java.util.Date(dt.getMillis());
    }

    @Deprecated
    public void setBegin(java.util.Date date) {
        setProjectBeginDateTime(new org.joda.time.DateTime(date.getTime()));
    }

    @Deprecated
    public java.util.Date getEnd() {
        org.joda.time.DateTime dt = getProjectEndDateTime();
        return (dt == null) ? null : new java.util.Date(dt.getMillis());
    }

    @Deprecated
    public void setEnd(java.util.Date date) {
        setProjectEndDateTime(new org.joda.time.DateTime(date.getTime()));
    }

    @Override
    public void setMaxSubmissionsToKeep(Integer maxSubmissionsToKeep) {
        if (maxSubmissionsToKeep != null && maxSubmissionsToKeep > 99) {
            throw new DomainException("error.project.maxSubmissionsToKeepMustBeLessThan", "99");
        }

        super.setMaxSubmissionsToKeep(maxSubmissionsToKeep);
    }

    public boolean canAddNewSubmissionWithoutExceedLimit(StudentGroup studentGroup) {
        return (countProjectSubmissionsForStudentGroup(studentGroup) + 1) <= getMaxSubmissionsToKeep()
                && !(studentGroup.wasDeleted());
    }

    public int countProjectSubmissionsForStudentGroup(StudentGroup studentGroup) {
        int count = 0;

        for (ProjectSubmission projectSubmission : getProjectSubmissionsSet()) {
            if (projectSubmission.getStudentGroup() == studentGroup) {
                count++;
            }
        }

        return count;
    }

    public boolean isSubmissionPeriodOpen() {
        DateTime currentDateTime = new DateTime();

        if ((currentDateTime.compareTo(getProjectBeginDateTime()) < 0)
                || (currentDateTime.compareTo(getProjectEndDateTime()) > 0)) {
            return false;
        } else {
            return true;
        }
    }

    public boolean isCanComment() {
        for (ExecutionCourse executionCourse : getAssociatedExecutionCoursesSet()) {
            final Professorship professorship = executionCourse.getProfessorshipForCurrentUser();
            if (professorship != null) {
                return true;
            }
        }
        return false;
    }

    @Override
    public void delete() {
        if (!getProjectSubmissionsSet().isEmpty()) {
            throw new DomainException("error.project.cannotDeleteBecauseHasSubmissionsAssociated");
        }
        if (getProjectDepartmentGroup() != null) {
            throw new DomainException("error.project.cannotDeleteProjectUsedInAccessControl");
        }

        logRemove();
        setGrouping(null);
        getDeparmentsSet().clear();
        super.delete();
    }

    public List<ProjectSubmission> getProjectSubmissionsByStudentGroup(StudentGroup studentGroup) {
        List<ProjectSubmission> result = new ArrayList<ProjectSubmission>();

        for (ProjectSubmission projectSubmission : getProjectSubmissionsSet()) {
            if (projectSubmission.getStudentGroup() == studentGroup) {
                result.add(projectSubmission);
            }
        }

        return result;
    }

    public ProjectSubmission getOldestProjectSubmissionForStudentGroup(StudentGroup studentGroup) {
        ProjectSubmission oldestProjectSubmission = null;
        for (ProjectSubmission projectSubmission : getProjectSubmissionsByStudentGroup(studentGroup)) {
            if (oldestProjectSubmission == null) {
                oldestProjectSubmission = projectSubmission;
            } else if (projectSubmission.getSubmissionDateTime().compareTo(oldestProjectSubmission.getSubmissionDateTime()) < 0) {
                oldestProjectSubmission = projectSubmission;
            }
        }

        return oldestProjectSubmission;
    }

    public Collection<ProjectSubmission> getLastProjectSubmissionForEachStudentGroup() {
        final Map<StudentGroup, ProjectSubmission> lastProjectSubmissionByStudentGroup =
                new HashMap<StudentGroup, ProjectSubmission>();

        for (final ProjectSubmission projectSubmission : getProjectSubmissionsSet()) {
            final StudentGroup studentGroup = projectSubmission.getStudentGroup();

            if (studentGroup.wasDeleted()) {
                continue;
            }
            final ProjectSubmission lastProjectSubmission = lastProjectSubmissionByStudentGroup.get(studentGroup);

            if (lastProjectSubmission == null) {
                lastProjectSubmissionByStudentGroup.put(studentGroup, projectSubmission);
            } else if (projectSubmission.getSubmissionDateTime().compareTo(lastProjectSubmission.getSubmissionDateTime()) > 0) {
                lastProjectSubmissionByStudentGroup.put(studentGroup, projectSubmission);
            }
        }

        return lastProjectSubmissionByStudentGroup.values();
    }

    public Collection<ProjectSubmission> getLastProjectSubmissionForEachDeletedStudentGroup() {
        final Map<StudentGroup, ProjectSubmission> lastProjectSubmissionByStudentGroup =
                new HashMap<StudentGroup, ProjectSubmission>();

        for (final ProjectSubmission projectSubmission : getProjectSubmissionsSet()) {
            final StudentGroup studentGroup = projectSubmission.getStudentGroup();

            if (!studentGroup.wasDeleted()) {
                continue;
            }

            final ProjectSubmission lastProjectSubmission = lastProjectSubmissionByStudentGroup.get(studentGroup);

            if (lastProjectSubmission == null) {
                lastProjectSubmissionByStudentGroup.put(studentGroup, projectSubmission);
            } else if (projectSubmission.getSubmissionDateTime().compareTo(lastProjectSubmission.getSubmissionDateTime()) > 0) {
                lastProjectSubmissionByStudentGroup.put(studentGroup, projectSubmission);
            }
        }

        return lastProjectSubmissionByStudentGroup.values();
    }

    public ProjectSubmission getLastProjectSubmissionForStudentGroup(StudentGroup group) {
        for (ProjectSubmission projectSubmission : getLastProjectSubmissionForEachStudentGroup()) {
            if (projectSubmission.getStudentGroup().equals(group)) {
                return projectSubmission;
            }
        }
        return null;
    }

    public List<ProjectSubmissionLog> getProjectSubmissionLogsByStudentGroup(StudentGroup studentGroup) {
        List<ProjectSubmissionLog> result = new ArrayList<ProjectSubmissionLog>();

        for (ProjectSubmissionLog projectSubmissionLog : getProjectSubmissionLogsSet()) {
            if (projectSubmissionLog.getStudentGroup() == studentGroup) {
                result.add(projectSubmissionLog);
            }
        }

        return result;
    }

    public List<EvaluationEventBean> getAllEvents(ExecutionCourse executionCourse) {
        List<EvaluationEventBean> result = new ArrayList<EvaluationEventBean>();
        result.add(new EvaluationEventBean("Inicio " + this.getName() + " : " + executionCourse.getNome(), this
                .getProjectBeginDateTime(), this.getProjectBeginDateTime().plusHours(1), false, null, null,
                this.getDescription(), Collections.singleton(executionCourse)));
        if (this.getOnlineSubmissionsAllowed()) {
            String url = CoreConfiguration.getConfiguration().applicationUrl() + "/login";
            result.add(new EvaluationEventBean("Fim " + this.getName() + " : " + executionCourse.getNome(), this
                    .getProjectEndDateTime().minusHours(1), this.getProjectEndDateTime(), false, null, url,
                    this.getDescription(), Collections.singleton(executionCourse)));
        } else {
            result.add(new EvaluationEventBean("Fim " + this.getName() + " : " + executionCourse.getNome(), this
                    .getProjectEndDateTime().minusHours(1), this.getProjectEndDateTime(), false, null, null, this
                    .getDescription(), Collections.singleton(executionCourse)));
        }
        return result;
    }

    @Deprecated
    public java.util.Date getProjectBegin() {
        org.joda.time.DateTime dt = getProjectBeginDateTime();
        return (dt == null) ? null : new java.util.Date(dt.getMillis());
    }

    @Deprecated
    public void setProjectBegin(java.util.Date date) {
        if (date == null) {
            setProjectBeginDateTime(null);
        } else {
            setProjectBeginDateTime(new org.joda.time.DateTime(date.getTime()));
        }
    }

    @Deprecated
    public java.util.Date getProjectEnd() {
        org.joda.time.DateTime dt = getProjectEndDateTime();
        return (dt == null) ? null : new java.util.Date(dt.getMillis());
    }

    @Deprecated
    public void setProjectEnd(java.util.Date date) {
        if (date == null) {
            setProjectEndDateTime(null);
        } else {
            setProjectEndDateTime(new org.joda.time.DateTime(date.getTime()));
        }
    }

    @Override
    public String getPresentationName() {
        return BundleUtil.getString(Bundle.APPLICATION, "label.project") + " " + getName();
    }

    @Override
    public Date getEvaluationDate() {
        return getBegin();
    }

}
TOP

Related Classes of org.fenixedu.academic.domain.Project

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.