/*
* File : $Source: /alkacon/cvs/alkacon/com.alkacon.opencms.calendar/src/com/alkacon/opencms/calendar/CmsCalendarSerialDateDailyOptions.java,v $
* Date : $Date: 2009/02/05 09:49:31 $
* Version: $Revision: 1.2 $
*
* This file is part of the Alkacon OpenCms Add-On Module Package
*
* Copyright (c) 2008 Alkacon Software GmbH (http://www.alkacon.com)
*
* The Alkacon OpenCms Add-On Module Package is free software:
* you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* The Alkacon OpenCms Add-On Module Package 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with the Alkacon OpenCms Add-On Module Package.
* If not, see http://www.gnu.org/licenses/.
*
* For further information about Alkacon Software GmbH, please see the
* company website: http://www.alkacon.com.
*
* For further information about OpenCms, please see the
* project website: http://www.opencms.org.
*/
package com.alkacon.opencms.calendar;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Options for a daily serial calendar entry.<p>
*
* Provides the necessary information about a daily serial calendar entry.<p>
*
* @author Andreas Zahner
*
* @version $Revision: 1.2 $
*
* @since 7.0
*/
public class CmsCalendarSerialDateDailyOptions extends A_CmsCalendarSerialDateOptions {
/** The daily interval for the serial calendar entry. */
private int m_dailyInterval;
/** Flag indicating if the entry should be shown on every working day. */
private boolean m_everyWorkingDay;
/** The working days Integer values as List. */
private List m_workingDaysList = Arrays.asList(new Integer[] {
new Integer(Calendar.MONDAY),
new Integer(Calendar.TUESDAY),
new Integer(Calendar.WEDNESDAY),
new Integer(Calendar.THURSDAY),
new Integer(Calendar.FRIDAY)});
/**
* Creates an initialized serial date daily options object with the standard daily interval options.<p>
*
* Standard interval options are: every day.<p>
*/
public CmsCalendarSerialDateDailyOptions() {
m_dailyInterval = 1;
}
/**
* Creates an initialized serial date daily options object with the given parameters.<p>
*
* @param everyWorkingDay if true, the entry should occur every working day
* @param dailyInterval the daily interval for the day series
*/
public CmsCalendarSerialDateDailyOptions(boolean everyWorkingDay, int dailyInterval) {
m_everyWorkingDay = everyWorkingDay;
m_dailyInterval = 1;
if (dailyInterval > 0) {
m_dailyInterval = dailyInterval;
}
if (m_everyWorkingDay) {
m_dailyInterval = 1;
}
}
/**
* @see com.alkacon.opencms.calendar.I_CmsCalendarSerialDateOptions#getConfigurationValuesAsMap()
*/
public Map getConfigurationValuesAsMap() {
// create the Map containing the date settings
Map values = new HashMap();
// put interval and working days flag
values.put(I_CmsCalendarSerialDateOptions.CONFIG_INTERVAL, String.valueOf(getDailyInterval()));
values.put(I_CmsCalendarSerialDateOptions.CONFIG_EVERY_WORKING_DAY, String.valueOf(isEveryWorkingDay()));
return values;
}
/**
* Returns the daily interval for the calendar entry occurences.<p>
*
* @return the daily interval for the calendar entry occurences
*/
public int getDailyInterval() {
return m_dailyInterval;
}
/**
* @see com.alkacon.opencms.calendar.I_CmsCalendarSerialDateOptions#getSerialType()
*/
public int getSerialType() {
return I_CmsCalendarSerialDateOptions.TYPE_DAILY;
}
/**
* Returns the working days Integer values.<p>
*
* @return the working days Integer values
*/
public List getWorkingDays() {
return m_workingDaysList;
}
/**
* Returns if the entry should occur on every working day.<p>
*
* @return true if the entry should occur on every working day, otherwise false
*/
public boolean isEveryWorkingDay() {
return m_everyWorkingDay;
}
/**
* @see com.alkacon.opencms.calendar.I_CmsCalendarSerialDateOptions#matchCalendarView(com.alkacon.opencms.calendar.CmsCalendarEntry, com.alkacon.opencms.calendar.I_CmsCalendarView, int)
*/
public List matchCalendarView(CmsCalendarEntry entry, I_CmsCalendarView calendarView, int maxCount) {
List result = new ArrayList();
int matches = 0;
CmsCalendarEntryDateSerial entryDate = (CmsCalendarEntryDateSerial)entry.getEntryDate();
Calendar entryStartDayDate = (Calendar)entry.getEntryDate().getStartDate().clone();
entryStartDayDate.setTimeInMillis(entryDate.getStartDay());
// loop the view date ranges
for (int i = 0; i < calendarView.getDates().size(); i++) {
// get the current view date object
CmsCalendarEntryDate viewDate = (CmsCalendarEntryDate)calendarView.getDates().get(i);
// get the start and end times of the view
long viewStart = viewDate.getStartDate().getTimeInMillis();
long viewEnd = viewDate.getEndDate().getTimeInMillis();
// set the date for the current run
Calendar runDate = entryStartDayDate;
if (getDailyInterval() == 1
&& (entryDate.getSerialEndType() == I_CmsCalendarSerialDateOptions.END_TYPE_NEVER || entryDate.getSerialEndType() == I_CmsCalendarSerialDateOptions.END_TYPE_DATE)
&& entryStartDayDate.getTimeInMillis() < viewDate.getStartDay()) {
// skip to current view start date to optimize performance
runDate.setTimeInMillis(viewDate.getStartDay());
}
// occurences counter
int occurences = 0;
while (runDate.before(viewDate.getEndDate())) {
// check conditions to leave date series loop
if (checkLeaveLoop(entryDate, runDate, viewDate, occurences)) {
break;
}
if (matches >= maxCount) {
break;
}
// get the current week day
int runWeekDay = runDate.get(Calendar.DAY_OF_WEEK);
Integer runWeekDayInteger = new Integer(runWeekDay);
if (!isEveryWorkingDay() || (isEveryWorkingDay() && getWorkingDays().contains(runWeekDayInteger))) {
// the current day contains a series entry
occurences++;
long entryStart = runDate.getTimeInMillis() + entryDate.getStartTime();
// check if current entry is in view range
if (entryStart >= viewStart && entryStart <= viewEnd) {
// the entry is in the view time range, clone the entry
CmsCalendarEntry cloneEntry = (CmsCalendarEntry)entry.clone();
cloneEntry.getEntryDate().setStartDay(runDate.getTimeInMillis());
cloneEntry = checkChanges(cloneEntry);
if (cloneEntry != null) {
// add the cloned entry to the result list
result.add(cloneEntry);
matches += 1;
}
}
}
if (isEveryWorkingDay()) {
// increase run date to next day
runDate.add(Calendar.DAY_OF_YEAR, 1);
} else {
// increase run date with day interval for next test
runDate.add(Calendar.DAY_OF_YEAR, getDailyInterval());
}
}
}
return result;
}
/**
* Sets the daily interval for the calendar entry occurences.<p>
*
* @param dailyInterval the daily interval for the calendar entry occurences
*/
public void setDailyInterval(int dailyInterval) {
if (dailyInterval > 0) {
m_dailyInterval = dailyInterval;
}
}
/**
* Sets if the entry should occur on every working day.<p>
*
* @param everyWorkingDay true if the entry should occur on every working day, otherwise false
*/
public void setEveryWorkingDay(boolean everyWorkingDay) {
m_everyWorkingDay = everyWorkingDay;
}
/**
* Sets the working days as Integer values.<p>
*
* Use this to change the standard working days which are from {@link Calendar#MONDAY} to {@link Calendar#FRIDAY} as {@link Integer} objects.<p>
*
* @param workingDays the working days as Integer values
*/
public void setWorkingDays(List workingDays) {
m_workingDaysList = workingDays;
}
}