org.apache.myfaces.custom.schedule.model.AbstractScheduleModel Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of tomahawk12 Show documentation
Show all versions of tomahawk12 Show documentation
JSF components and utilities that can be used with any JSF implementation.
This library is based on the JSF1.1 version of Tomahawk, but with minor source code and build
changes to take advantage of JSF1.2 features. A JSF1.2 implementation is required to use this
version of the Tomahawk library.
The newest version!
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.myfaces.custom.schedule.model;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TimeZone;
import java.util.TreeSet;
import org.apache.myfaces.custom.schedule.util.ScheduleUtil;
/**
*
* Extend this class to create your own implementation of a ScheduleModel
*
*
* @author Jurgen Lust (latest modification by $Author: baranda $)
* @version $Revision: 372589 $
*/
public abstract class AbstractScheduleModel implements ScheduleModel,
Serializable
{
// ~ Instance fields
// --------------------------------------------------------
private TreeSet days;
private Date selectedDate = new Date();
private ScheduleEntry selectedEntry;
private int mode;
protected final TimeZone timeZone;
// ~ Constructors
// -----------------------------------------------------------
/**
* Creates a new AbstractScheduleModel object.
*/
public AbstractScheduleModel()
{
this(TimeZone.getDefault());
}
public AbstractScheduleModel(TimeZone timeZone)
{
this.timeZone = timeZone;
}
// ~ Methods
// ----------------------------------------------------------------
/**
* Get the set of days. Initialise on first call.
*
*/
protected SortedSet getDays()
{
if (days == null)
{
days = new TreeSet();
switch (mode)
{
case DAY:
setDay(this.selectedDate);
break;
case WORKWEEK:
setWorkWeek(this.selectedDate);
break;
case WEEK:
setWeek(this.selectedDate);
break;
case MONTH:
setMonth(this.selectedDate);
break;
default:
setDay(this.selectedDate);
}
}
return days;
}
/**
* Returns the timezone setting for this model
*/
public TimeZone getTimeZone ()
{
return this.timeZone;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#isEmpty()
*/
public boolean isEmpty()
{
return getDays().isEmpty();
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#setMode(int)
*/
public void setMode(int mode)
{
this.mode = mode;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#getMode()
*/
public int getMode()
{
return mode;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#setSelectedDate(java.util.Date)
*/
public void setSelectedDate(Date date)
{
if (date == null)
{
// do nothing when the date is null
return;
}
this.selectedDate = date;
this.days = null;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#getSelectedDate()
*/
public Date getSelectedDate()
{
return selectedDate;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#setSelectedEntry(org.apache.myfaces.custom.schedule.model.ScheduleEntry)
*/
public void setSelectedEntry(ScheduleEntry selectedEntry)
{
this.selectedEntry = selectedEntry;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#getSelectedEntry()
*/
public ScheduleEntry getSelectedEntry()
{
return selectedEntry;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#isEntrySelected()
*/
public boolean isEntrySelected() {
return getSelectedEntry() != null;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#containsDate(java.util.Date)
*/
public boolean containsDate(Date date)
{
for (Iterator iterator = iterator(); iterator.hasNext();)
{
ScheduleDay day = (ScheduleDay) iterator.next();
if (day.equalsDate(date))
{
return true;
}
}
return false;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#get(int)
*/
public Object get(int index)
{
Object[] dayArray = getDays().toArray();
Object returnObject = dayArray[index];
return returnObject;
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#iterator()
*/
public Iterator iterator()
{
return getDays().iterator();
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#size()
*/
public int size()
{
return getDays().size();
}
/**
*
* Set the day
*
*
* @param date
* the new day
*/
protected void setDay(Date date)
{
if (date == null)
{
return;
}
clear();
ScheduleDay day = add(date);
load(day.getDayStart(), day.getDayEnd());
}
/**
*
* navigate to the specified month
*
*
* @param date
* the date to navigate to
*/
protected void setMonth(Date date)
{
if (date == null)
{
return;
}
clear();
Calendar cal = getCalendarInstance(date);
// go back to the first day of the month;
cal.set(Calendar.DAY_OF_MONTH, cal.getMinimum(Calendar.DAY_OF_MONTH));
Date temp = cal.getTime();
cal.add(Calendar.MONTH, 1);
int nextMonth = cal.get(Calendar.MONTH);
cal.setTime(temp);
ScheduleDay firstDay = null;
ScheduleDay lastDay = null;
// we want to show the whole first week, including the days from the previous month
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
while (true)
{
ScheduleDay addedDay = add(cal.getTime());
if (firstDay == null)
{
firstDay = addedDay;
}
lastDay = addedDay;
cal.add(Calendar.DATE, 1);
//stop when we are at the last day of the last week
if (cal.get(Calendar.MONTH) == nextMonth && cal.get(Calendar.DAY_OF_WEEK) == Calendar.MONDAY)
{
break;
}
}
load(firstDay.getDayStart(), lastDay.getDayEnd());
}
/**
*
* navigate to the specified week
*
*
* @param date
* the date to navigate to
*/
protected void setWeek(Date date)
{
if (date == null)
{
return;
}
clear();
Calendar cal = getCalendarInstance(date);
// go back to the monday of this week
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
ScheduleDay firstDay = null;
ScheduleDay lastDay = null;
for (int i = 0; i < 7; i++)
{
ScheduleDay addedDay = add(cal.getTime());
if (firstDay == null)
{
firstDay = addedDay;
}
lastDay = addedDay;
cal.add(Calendar.DATE, 1);
}
load(firstDay.getDayStart(), lastDay.getDayEnd());
}
/**
*
* navigate to the specified workweek
*
*
* @param date
* the date to navigate to
*/
protected void setWorkWeek(Date date)
{
if (date == null)
{
return;
}
clear();
Calendar cal = getCalendarInstance(date);
// go back to the monday of this week
cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
ScheduleDay firstDay = null;
ScheduleDay lastDay = null;
for (int i = 0; i < 5; i++)
{
ScheduleDay addedDay = add(cal.getTime());
if (firstDay == null)
{
firstDay = addedDay;
}
lastDay = addedDay;
cal.add(Calendar.DATE, 1);
}
load(firstDay.getDayStart(), lastDay.getDayEnd());
}
/**
*
* Add a day to the schedule
*
*
* @param date
* the day to add
*
* @return the day that was added
*/
protected ScheduleDay add(Date date)
{
if (date == null)
{
return null;
}
ScheduleDay day = new ScheduleDay(date, getTimeZone());
loadDayAttributes(day);
getDays().add(day);
return day;
}
/**
*
* Remove all days
*
*/
protected void clear()
{
if (days != null)
{
for (Iterator dayIterator = days.iterator(); dayIterator.hasNext();)
{
ScheduleDay day = (ScheduleDay) dayIterator.next();
day.clear();
}
days.clear();
}
}
/**
* @see org.apache.myfaces.custom.schedule.model.ScheduleModel#refresh()
*/
public void refresh()
{
setSelectedDate(selectedDate);
}
/**
*
* Load the schedule entries that fall between the startDate and the
* endDate.
*
*
* @param startDate
* 0 AM on the start date
* @param endDate
* 12 PM on the end date
*/
protected abstract Collection loadEntries(Date startDate, Date endDate);
/**
*
* Load any attributes for this day: is it a working day or a holiday, and
* what is the name of the day (e.g. "Christmas").
*
*
* @param day
* the day that should be loaded
*/
protected abstract void loadDayAttributes(Day day);
/**
* @return true, if each day contains the same set of intervals
*/
public boolean containsRepeatedIntervals() {
boolean firstDay = true;
TreeSet firstDayIntervals = null;
if (mode == DAY)
{
return true;
}
for (Iterator dayIterator = iterator(); dayIterator.hasNext(); )
{
Day day = (Day) dayIterator.next();
if (firstDay)
{
firstDayIntervals = day.getIntervals();
firstDay = false;
}
else
{
if (firstDayIntervals == null || firstDayIntervals.size() == 0) {
if (day.getIntervals() != null && day.getIntervals().size() > 0)
{
return false;
}
}
else if (!ScheduleUtil.areEquivalentIntervals(firstDayIntervals, day.getIntervals()))
{
return false;
}
}
}
return true;
}
private void load(Date startDate, Date endDate)
{
Collection entries = loadEntries(startDate, endDate);
for (Iterator entryIterator = entries.iterator(); entryIterator
.hasNext();)
{
ScheduleEntry entry = (ScheduleEntry) entryIterator.next();
for (Iterator dayIterator = getDays().iterator(); dayIterator.hasNext();)
{
ScheduleDay day = (ScheduleDay) dayIterator.next();
day.addEntry(entry);
}
}
}
protected Calendar getCalendarInstance(Date date) {
return ScheduleUtil.getCalendarInstance(date, getTimeZone());
}
}
// The End