/** * 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 21/Jul/2003 * * */ package org.fenixedu.academic.domain; import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.SortedSet; import org.apache.commons.lang.StringUtils; import org.fenixedu.academic.domain.exceptions.DomainException; import org.fenixedu.academic.util.Bundle; import org.fenixedu.academic.util.HourMinuteSecond; import org.fenixedu.academic.util.MultiLanguageString; import org.fenixedu.bennu.core.domain.Bennu; import org.fenixedu.bennu.core.signals.DomainObjectEvent; import org.fenixedu.bennu.core.signals.Signal; import org.fenixedu.spaces.domain.Space; import org.joda.time.DateTime; import org.joda.time.DateTimeFieldType; import org.joda.time.Partial; import org.joda.time.TimeOfDay; import org.joda.time.YearMonthDay; /** * @author Manuel Pinto * */ public class Summary extends Summary_Base { public static final String CREATE_SIGNAL = "academic.summary.create.signal"; public static final String EDIT_SIGNAL = "academic.summary.edit.signal"; public static final Comparator<Summary> COMPARATOR_BY_DATE_AND_HOUR = new Comparator<Summary>() { @Override public int compare(final Summary o1, final Summary o2) { final int c1 = o2.getSummaryDateYearMonthDay().compareTo(o1.getSummaryDateYearMonthDay()); if (c1 == 0) { final int c2 = o2.getSummaryHourHourMinuteSecond().compareTo(o1.getSummaryHourHourMinuteSecond()); return c2 == 0 ? DomainObjectUtil.COMPARATOR_BY_ID.compare(o1, o2) : c2; } else { return c1; } } }; public static final Comparator<Summary> COMPARATOR_BY_DATE_AND_HOUR_ASC = new Comparator<Summary>() { @Override public int compare(final Summary o1, final Summary o2) { final int c1 = o2.getSummaryDateYearMonthDay().compareTo(o1.getSummaryDateYearMonthDay()); if (c1 == 0) { final int c2 = o2.getSummaryHourHourMinuteSecond().compareTo(o1.getSummaryHourHourMinuteSecond()); return -1 * (c2 == 0 ? DomainObjectUtil.COMPARATOR_BY_ID.compare(o1, o2) : c2); } else { return -1 * c1; } } }; public Summary(MultiLanguageString title, MultiLanguageString summaryText, Integer studentsNumber, Boolean isExtraLesson, Professorship professorship, String teacherName, Teacher teacher, Shift shift, Lesson lesson, YearMonthDay date, Space room, Partial hour, ShiftType type, Boolean taught) { super(); setRootDomainObject(Bennu.getInstance()); fillSummaryWithInfo(title, summaryText, studentsNumber, isExtraLesson, professorship, teacherName, teacher, shift, lesson, date, room, hour, type, taught); ContentManagementLog.createLog(shift.getExecutionCourse(), Bundle.MESSAGING, "log.executionCourse.content.summary.added", title.getContent(), shift.getPresentationName(), shift.getExecutionCourse().getNome(), shift.getExecutionCourse() .getDegreePresentationString()); } public void edit(MultiLanguageString title, MultiLanguageString summaryText, Integer studentsNumber, Boolean isExtraLesson, Professorship professorship, String teacherName, Teacher teacher, Shift shift, Lesson lesson, YearMonthDay date, Space room, Partial hour, ShiftType type, Boolean taught) { fillSummaryWithInfo(title, summaryText, studentsNumber, isExtraLesson, professorship, teacherName, teacher, shift, lesson, date, room, hour, type, taught); ContentManagementLog.createLog(shift.getExecutionCourse(), Bundle.MESSAGING, "log.executionCourse.content.summary.edited", title.getContent(), shift.getPresentationName(), shift .getExecutionCourse().getNome(), shift.getExecutionCourse().getDegreePresentationString()); Signal.emit(EDIT_SIGNAL, new DomainObjectEvent<Summary>(this)); } private void fillSummaryWithInfo(MultiLanguageString title, MultiLanguageString summaryText, Integer studentsNumber, Boolean isExtraLesson, Professorship professorship, String teacherName, Teacher teacher, Shift shift, Lesson lesson, YearMonthDay day, Space room, Partial hour, ShiftType type, Boolean taught) { setShift(shift); setSummaryDateYearMonthDay(day); setExecutionCourse(shift.getExecutionCourse()); setTitle(title); setSummaryText(summaryText); setIsExtraLesson(isExtraLesson); checkSpecialParameters(isExtraLesson, professorship, teacherName, teacher, lesson, hour, type); checkIfInternalTeacherHasProfessorhipInExecutionCourse(teacher, shift.getExecutionCourse()); checkIfSummaryDateIsValid(day, shift.getExecutionPeriod(), lesson, isExtraLesson); setStudentsNumber(studentsNumber); setProfessorship(professorship); setTeacherName(teacherName); setTeacher(teacher); setLastModifiedDateDateTime(new DateTime()); setSummaryType(type); setTaught(taught); if (isExtraLesson) { super.setLessonInstance(null); setRoom(room); HourMinuteSecond hourMinuteSecond = new HourMinuteSecond(hour.get(DateTimeFieldType.hourOfDay()), hour.get(DateTimeFieldType.minuteOfHour()), 0); setSummaryHourHourMinuteSecond(hourMinuteSecond); } else { setRoom(lesson.getSala()); setSummaryHourHourMinuteSecond(lesson.getBeginHourMinuteSecond()); lessonInstanceManagement(lesson, day, lesson.getSala()); if (getLessonInstance() == null) { throw new DomainException("error.Summary.empty.LessonInstances"); } } } public void delete() { ContentManagementLog.createLog(getShift().getExecutionCourse(), Bundle.MESSAGING, "log.executionCourse.content.summary.removed", getTitle().getContent(), getShift().getPresentationName(), getShift().getExecutionCourse().getNome(), getShift().getExecutionCourse().getDegreePresentationString()); super.setExecutionCourse(null); super.setShift(null); super.setLessonInstance(null); setRoom(null); setProfessorship(null); setTeacher(null); setRootDomainObject(null); deleteDomainObject(); } @jvstm.cps.ConsistencyPredicate protected boolean checkRequiredParameters() { return getTitle() != null && !getTitle().isEmpty() && getSummaryText() != null && !getSummaryText().isEmpty() && getSummaryDateYearMonthDay() != null && getSummaryHourHourMinuteSecond() != null && getIsExtraLesson() != null; } private void lessonInstanceManagement(Lesson lesson, YearMonthDay day, Space room) { LessonInstance lessonInstance = lesson.getLessonInstanceFor(day); if (lessonInstance == null) { new LessonInstance(this, lesson); } else { lessonInstance.summaryAndCourseLoadManagement(this, lesson); } } public Lesson getLesson() { return getLessonInstance() != null ? getLessonInstance().getLesson() : null; } @Override public void setSummaryHourHourMinuteSecond(HourMinuteSecond summaryHourHourMinuteSecond) { if (summaryHourHourMinuteSecond == null) { throw new DomainException("error.Summary.empty.time"); } super.setSummaryHourHourMinuteSecond(summaryHourHourMinuteSecond); } @Override public void setIsExtraLesson(Boolean isExtraLesson) { if (isExtraLesson == null) { throw new DomainException("error.summary.no.type"); } super.setIsExtraLesson(isExtraLesson); } @Override public void setExecutionCourse(ExecutionCourse executionCourse) { if (executionCourse == null) { throw new DomainException("error.summary.no.executionCourse"); } super.setExecutionCourse(executionCourse); } @Override public void setSummaryDateYearMonthDay(YearMonthDay summaryDateYearMonthDay) { if (summaryDateYearMonthDay == null) { throw new DomainException("error.summary.no.date"); } super.setSummaryDateYearMonthDay(summaryDateYearMonthDay); } @Override public void setTitle(MultiLanguageString title) { if (title == null || title.getAllContents().isEmpty()) { throw new DomainException("error.summary.no.title"); } super.setTitle(title); } @Override public void setSummaryText(MultiLanguageString summaryText) { if (summaryText == null || summaryText.getAllContents().isEmpty()) { throw new DomainException("error.summary.no.summaryText"); } super.setSummaryText(summaryText); } @Override public void setLessonInstance(LessonInstance lessonInstance) { if (lessonInstance == null) { throw new DomainException("error.Summary.empty.lessonInstance"); } super.setLessonInstance(lessonInstance); } @Override public void setShift(Shift shift) { if (shift == null) { throw new DomainException("error.summary.no.shift"); } super.setShift(shift); } private void checkIfSummaryDateIsValid(YearMonthDay date, ExecutionSemester executionSemester, Lesson lesson, Boolean isExtraLesson) { if (!isExtraLesson) { Summary summary = lesson.getSummaryByDate(date); if (summary != null && !summary.equals(this)) { throw new DomainException("error.summary.already.exists"); } if (!lesson.isDateValidToInsertSummary(date)) { throw new DomainException("error.summary.no.valid.date.to.lesson"); } if (!lesson.isTimeValidToInsertSummary(new HourMinuteSecond(), date)) { throw new DomainException("error.summary.no.valid.time.to.lesson"); } } else if (!executionSemester.containsDay(date)) { throw new DomainException("error.summary.no.valid.date"); } } private void checkIfInternalTeacherHasProfessorhipInExecutionCourse(Teacher teacher, ExecutionCourse executionCourse) { if (teacher != null && teacher.getProfessorshipByExecutionCourse(executionCourse) != null) { throw new DomainException("error.summary.teacher.is.executionCourse.professorship"); } } private void checkSpecialParameters(Boolean isExtraLesson, Professorship professorship, String teacherName, Teacher teacher, Lesson lesson, Partial hour, ShiftType type) { if (professorship == null && StringUtils.isEmpty(teacherName) && teacher == null) { throw new DomainException("error.summary.no.teacher"); } if (isExtraLesson) { if (hour == null) { throw new DomainException("error.summary.no.hour"); } } else { if (lesson == null) { throw new DomainException("error.summary.no.lesson"); } if (type == null) { throw new DomainException("error.summary.no.shifType"); } } } public String getOrder() { StringBuilder stringBuilder = new StringBuilder(); Lesson lesson = getLesson(); if (lesson != null) { SortedSet<YearMonthDay> allLessonDates = lesson.getAllLessonDates(); List<YearMonthDay> lessonDates = new ArrayList<YearMonthDay>(allLessonDates); if (!lessonDates.isEmpty()) { int index = lessonDates.indexOf(getSummaryDateYearMonthDay()); if (index != -1) { stringBuilder.append("(").append(index + 1).append("/"); return stringBuilder.append(lessonDates.size()).append(")").toString(); } } } return ""; } @Override public Space getRoom() { if (isExtraSummary()) { return super.getRoom(); } else if (getLessonInstance() != null) { return getLessonInstance().getRoom(); } return null; } public void moveFromTeacherToProfessorship(Professorship professorship) { if (getTeacher() != null && professorship != null && professorship.getExecutionCourse().equals(getExecutionCourse()) && professorship.getTeacher().equals(getTeacher())) { setTeacher(null); setProfessorship(professorship); } } public ShiftType getShiftType() { return getLessonInstance().getCourseLoad().getType(); } public boolean isExtraSummary() { return getIsExtraLesson().booleanValue(); } public DateTime getSummaryDateTime() { HourMinuteSecond time = getSummaryHourHourMinuteSecond(); return getSummaryDateYearMonthDay().toDateTime( new TimeOfDay(time.getHour(), time.getMinuteOfHour(), time.getSecondOfMinute(), 0)); } @Deprecated public java.util.Date getLastModifiedDate() { org.joda.time.DateTime dt = getLastModifiedDateDateTime(); return (dt == null) ? null : new java.util.Date(dt.getMillis()); } @Deprecated public void setLastModifiedDate(java.util.Date date) { if (date == null) { setLastModifiedDateDateTime(null); } else { setLastModifiedDateDateTime(new org.joda.time.DateTime(date.getTime())); } } @Deprecated public java.util.Date getSummaryDate() { org.joda.time.YearMonthDay ymd = getSummaryDateYearMonthDay(); return (ymd == null) ? null : new java.util.Date(ymd.getYear() - 1900, ymd.getMonthOfYear() - 1, ymd.getDayOfMonth()); } @Deprecated public void setSummaryDate(java.util.Date date) { if (date == null) { setSummaryDateYearMonthDay(null); } else { setSummaryDateYearMonthDay(org.joda.time.YearMonthDay.fromDateFields(date)); } } @Deprecated public java.util.Date getSummaryHour() { org.fenixedu.academic.util.HourMinuteSecond hms = getSummaryHourHourMinuteSecond(); return (hms == null) ? null : new java.util.Date(0, 0, 1, hms.getHour(), hms.getMinuteOfHour(), hms.getSecondOfMinute()); } @Deprecated public void setSummaryHour(java.util.Date date) { if (date == null) { setSummaryHourHourMinuteSecond(null); } else { setSummaryHourHourMinuteSecond(org.fenixedu.academic.util.HourMinuteSecond.fromDateFields(date)); } } }