/** * 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.domain.time.chronologies; import org.fenixedu.academic.domain.time.calendarStructure.AcademicCalendarEntry; import org.fenixedu.academic.domain.time.calendarStructure.AcademicCalendarRootEntry; import org.fenixedu.academic.domain.time.calendarStructure.AcademicSemesterCE; import org.fenixedu.academic.domain.time.calendarStructure.AcademicTrimesterCE; import org.fenixedu.academic.domain.time.calendarStructure.AcademicYearCE; import org.fenixedu.academic.domain.time.chronologies.dateTimeFields.AcademicSemesterDateTimeField; import org.fenixedu.academic.domain.time.chronologies.dateTimeFields.AcademicSemesterOfAcademicYearDateTimeField; import org.fenixedu.academic.domain.time.chronologies.dateTimeFields.AcademicTrimesterDateTimeField; import org.fenixedu.academic.domain.time.chronologies.dateTimeFields.AcademicYearDateTimeField; import org.fenixedu.academic.domain.time.chronologies.dateTimeFields.DayOfAcademicSemesterDateTimeField; import org.fenixedu.academic.domain.time.chronologies.durationFields.AcademicSemestersDurationField; import org.fenixedu.academic.domain.time.chronologies.durationFields.AcademicTrimesterDurationField; import org.fenixedu.academic.domain.time.chronologies.durationFields.AcademicYearsDurationField; import org.joda.time.Chronology; import org.joda.time.DateTime; import org.joda.time.DateTimeField; import org.joda.time.DateTimeZone; import org.joda.time.DurationField; import org.joda.time.Interval; import org.joda.time.chrono.AssembledChronology; import org.joda.time.chrono.ISOChronology; public class AcademicChronology extends AssembledChronology { private transient AcademicCalendarRootEntry academicCalendar; // Duration Fields private transient DurationField acAcademicYearsField; private transient DurationField acAcademicSemestersField; private transient DurationField acAcademicTrimestersField; // DateTime Fields private transient DateTimeField acAcademicYear; private transient DateTimeField acAcademicSemester; private transient DateTimeField acAcademicSemesterOfAcademicYear; private transient DateTimeField acDayOfAcademicSemester; private transient DateTimeField acAcademicTrimester; // Static Variables private static final ISOChronology ISO_INSTANCE = ISOChronology.getInstance(); // Override Methods public AcademicChronology(AcademicCalendarRootEntry academicCalendar) { super(ISO_INSTANCE, null); this.academicCalendar = academicCalendar; } @Override protected void assemble(Fields fields) { if (acAcademicYearsField == null) { acAcademicYearsField = new AcademicYearsDurationField(this); acAcademicYear = new AcademicYearDateTimeField(this); acAcademicTrimester = new AcademicTrimesterDateTimeField(this); acAcademicTrimestersField = new AcademicTrimesterDurationField(this); acAcademicSemester = new AcademicSemesterDateTimeField(this); acAcademicSemestersField = new AcademicSemestersDurationField(this); acAcademicSemesterOfAcademicYear = new AcademicSemesterOfAcademicYearDateTimeField(this); acDayOfAcademicSemester = new DayOfAcademicSemesterDateTimeField(this); } } @Override public Chronology withUTC() { return ISOChronology.getInstanceUTC(); } @Override public Chronology withZone(DateTimeZone zone) { return ISO_INSTANCE.withZone(zone); } @Override public String toString() { String str = "AcademicChronology"; DateTimeZone zone = getZone(); if (zone != null) { str = str + '[' + zone.getID() + ']'; } return str; } // DateTime Fields public DateTimeField academicYear() { return acAcademicYear; } public DateTimeField academicSemester() { return acAcademicSemester; } public DateTimeField academicTrimester() { return acAcademicTrimester; } public DateTimeField academicSemesterOfAcademicYear() { return acAcademicSemesterOfAcademicYear; } public DateTimeField dayOfAcademicSemester() { return acDayOfAcademicSemester; } // Duration Fields public DurationField academicYears() { return acAcademicYearsField; } public DurationField academicSemesters() { return acAcademicSemestersField; } public DurationField academicTrimesters() { return acAcademicTrimestersField; } // Auxiliar Methods public AcademicSemesterCE getAcademicSemesterIn(int index) { return (AcademicSemesterCE) academicCalendar.getEntryByIndex(index, AcademicSemesterCE.class, AcademicYearCE.class); } public AcademicYearCE getAcademicYearIn(int index) { return (AcademicYearCE) academicCalendar.getEntryByIndex(index, AcademicYearCE.class, AcademicCalendarRootEntry.class); } public int getAcademicTrimester(long instant) { Integer entryValueByInstant = academicCalendar.getEntryIndexByInstant(instant, AcademicTrimesterCE.class, AcademicSemesterCE.class); if (entryValueByInstant != null) { return entryValueByInstant; } return 0; } public int getAcademicSemester(long instant) { Integer entryValueByInstant = academicCalendar.getEntryIndexByInstant(instant, AcademicSemesterCE.class, AcademicYearCE.class); if (entryValueByInstant != null) { return entryValueByInstant; } return 0; } public int getAcademicYear(long instant) { Integer entryValueByInstant = academicCalendar.getEntryIndexByInstant(instant, AcademicYearCE.class, AcademicCalendarRootEntry.class); if (entryValueByInstant != null) { return entryValueByInstant; } return 0; } public int getDayOfAcademicSemester(long instant) { AcademicCalendarEntry entryByInstant = academicCalendar.getEntryByInstant(instant, AcademicSemesterCE.class, AcademicYearCE.class); if (entryByInstant != null) { DateTime instantDateTime = new DateTime(instant); Interval interval = new Interval(entryByInstant.getBegin(), instantDateTime); int days = interval.toPeriod().getDays(); if (days > 0) { return days; } } return 0; } public int getAcademicSemesterOfAcademicYear(long instant) { AcademicSemesterCE entryByInstant = (AcademicSemesterCE) academicCalendar.getEntryByInstant(instant, AcademicSemesterCE.class, AcademicYearCE.class); return entryByInstant.getAcademicSemesterOfAcademicYear(this); } public int getMaximumValueForAcademicSemesterOfAcademicYear(long instant) { int academicSemesterOfAcademicYear = getAcademicSemesterOfAcademicYear(instant); if (academicSemesterOfAcademicYear == 0) { return getMaximumValueForAcademicSemesterOfAcademicYear(); } return getMaximumValueForAcademicSemesterOfAcademicYear() - academicSemesterOfAcademicYear; } public int getMaximumValueForAcademicSemesterOfAcademicYear() { return 2; } public AcademicCalendarEntry findSameEntry(final AcademicCalendarEntry entry) { return entry.getEntryForCalendar(academicCalendar); } }