All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opencms.widgets.serialdate.CmsSerialDateBeanWeekly Maven / Gradle / Ivy

/*
 * This library is part of OpenCms -
 * the Open Source Content Management System
 *
 * Copyright (c) Alkacon Software GmbH & Co. KG (http://www.alkacon.com)
 *
 * This library 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 2.1 of the License, or (at your option) any later version.
 *
 * This library 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.
 *
 * For further information about Alkacon Software, please see the
 * company website: http://www.alkacon.com
 *
 * For further information about OpenCms, please see the
 * project website: http://www.opencms.org
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.opencms.widgets.serialdate;

import org.opencms.acacia.shared.I_CmsSerialDateValue;
import org.opencms.acacia.shared.I_CmsSerialDateValue.EndType;
import org.opencms.acacia.shared.I_CmsSerialDateValue.WeekDay;

import java.util.Calendar;
import java.util.Date;
import java.util.SortedSet;

/**
 * Implementation of @{link org.opencms.widgets.serialdate.I_CmsSerialDateBean}
 * that handles series' specified on a weekly base.
 */
public class CmsSerialDateBeanWeekly extends A_CmsSerialDateBean {

    /** The number of weeks till the next event occurs. */
    private int m_interval;
    /** The weekdays the event occurs. */
    private SortedSet m_weekDays;

    /**
     * Constructs the bean with all the information provided by the {@link org.opencms.widgets.CmsSerialDateWidget}.
     *
     * @param startDate the start date of the series as provided by the serial date widget.
     * @param endDate the end date of the series as provided by the serial date widget.
     * @param isWholeDay flag, indicating if the event lasts the whole day
     * @param endType the end type of the series as provided by the serial date widget.
     * @param serialEndDate the end date of the series as provided by the serial date widget.
     * @param occurrences the maximal number of occurrences of the event as provided by the serial date widget.
     * @param exceptions dates where the event does not take place, even if it is in the series.
     * @param interval the number of weeks to the next event.
     * @param weekDays the weekdays the event occurs.
     */
    public CmsSerialDateBeanWeekly(
        Date startDate,
        Date endDate,
        boolean isWholeDay,
        EndType endType,
        Date serialEndDate,
        int occurrences,
        SortedSet exceptions,
        int interval,
        SortedSet weekDays) {
        super(startDate, endDate, isWholeDay, endType, serialEndDate, occurrences, exceptions);
        m_interval = interval;
        m_weekDays = weekDays;
    }

    /**
     * @see org.opencms.widgets.serialdate.A_CmsSerialDateBean#getFirstDate()
     */
    @Override
    protected Calendar getFirstDate() {

        Calendar date = (Calendar)getStartDate().clone();
        WeekDay currentWeekDay = WeekDay.fromInt(date.get(Calendar.DAY_OF_WEEK));
        if (!m_weekDays.contains(currentWeekDay)) {
            toNextDate(date);
        }
        return date;

    }

    /**
     * @see org.opencms.widgets.serialdate.A_CmsSerialDateBean#isAnyDatePossible()
     */
    @Override
    protected boolean isAnyDatePossible() {

        return !m_weekDays.isEmpty();
    }

    /**
     * @see org.opencms.widgets.serialdate.A_CmsSerialDateBean#toNextDate(java.util.Calendar)
     */
    @Override
    protected void toNextDate(Calendar date) {

        WeekDay currentWeekDay = WeekDay.fromInt(date.get(Calendar.DAY_OF_WEEK));
        int daysToNextMatch = getDaysToNextMatch(currentWeekDay);
        date.add(Calendar.DATE, daysToNextMatch);

    }

    /**
     * Returns the number of days from the given weekday to the next weekday the event should occur.
     * @param weekDay the current weekday.
     * @return the number of days to the next weekday an event could occur.
     */
    private int getDaysToNextMatch(WeekDay weekDay) {

        for (WeekDay wd : m_weekDays) {
            if (wd.compareTo(weekDay) > 0) {
                return wd.toInt() - weekDay.toInt();
            }
        }
        return (m_weekDays.iterator().next().toInt() + (m_interval * I_CmsSerialDateValue.NUM_OF_WEEKDAYS))
            - weekDay.toInt();
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy