Package org.fenixedu.academic.domain.time.chronologies

Source Code of org.fenixedu.academic.domain.time.chronologies.AcademicChronology

/**
* 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);
    }
}
TOP

Related Classes of org.fenixedu.academic.domain.time.chronologies.AcademicChronology

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.