package schedule;
import java.util.Collection;
/**
* This file temporarily defines common objects that are used by the other
* classes in the schedule package. These classes are put in one file merely
* as a temporary convenience during the initial stage of modelling.
*/
/**
* RecurringInfo has components to specify the nature of a recurring item. The
* isRecurring component is an on/off flag that indicates whether an item
* recurs. The interval is one of Weekly, Biweekly, Monthly, or Yearly. The
* IntervalDetails component defines the precise means to define recurrence for
* the different interval levels.
*/
abstract class RecurringInfo {
boolean isRecurring;
Interval interval;
IntervalDetails details;
}
/**
* Interval specifies the granularity at which recurring items are defined.
* The Weekly and Biweekly settings allow the user to specify recurrence on one
* or more days of the week. The Monthly setting allows the user to specify
* recurrence on one or more days in one or more weeks of each month. The
* Yearly setting allows the user to specify recurrence on one or more specific
* dates in the year.
*/
enum Interval {
Weekly, Biweekly, Monthly, Yearly
}
/**
* IntervalDetails are either weekly or monthly. This parent class is used
* generically for either kind of details.
*/
abstract class IntervalDetails {}
/**
* WeeklyDetails has an on/off setting for each day of the week on which
* an item recurs. These details are also used for the BiWeekly setting
* of the recurrence interval.
*/
abstract class WeeklyDetails extends IntervalDetails {
int onSun;
int onMon;
int onTue;
int onWed;
int onThu;
int onFri;
int onSat;
}
/**
* MonthlyDetails can be specified on a day-of-the-week basis or on specific
* date(s) basis. The two extending classes have the specific details for these
* two types of settings. This parent class is used generically for either
* kind of details.
*/
abstract class MonthlyDetails {}
/**
* MonthlyDayDetails contains a weekly details component for each possible week
* of a month. The First- through ThirdWeekDetails are distinct for all
* possible months. Depending on the configuration of a particular month in a
* particular year, there is potential conflict in specifying recurrence in the
* fourth, fifth, or last weeks. The conflicts are resolved as follows:
*
* For months with 4 weeks only, the settings in FifthWeekDetails do not apply,
* and the settings in LastWeekDetails, if present, override any settings in
* FourthWeekDetails. For months with 5 weeks only, the settings in
* LastWeekDetails, if present, override any settings in FifthWeekDetails.
* (For months with 6 weeks, the LastWeekDetails component applies to the 6th
* week, and there are no conflicts.)
*/
abstract class MonthlyDayDetails extends MonthlyDetails {
WeeklyDetails firstWeekDetails;
WeeklyDetails secondWeekDetails;
WeeklyDetails thirdWeekDetails;
WeeklyDetails fourthWeekDetails;
WeeklyDetails fifthWeekDetails;
WeeklyDetails lastWeekDetails;
}
/**
* MonthlyDateDetails is a collection of zero or more specific dates in a month
* on which an item recurs.
*/
abstract class MonthlyDateDetails extends MonthlyDetails {
Collection dates;
}
/**
* Security is one of four possible levels, each of which is described
* individually in the body of the enum. The selected level specifies the
* degree of visibility a scheduled item has to other users. For an
* appointment, task, or event, "other users" are defined as all users other
* than the user on whose calendar the scheduled item appears. For a meeting,
* "other users" are defined as all users not on the Attendee list of the
* meeting.
*/
enum Security {
/**
* Public security means other users can see the scheduled item and all the
* information about the item.
*/
Public,
/*
* PublicTitle security means other users can see the title of the
* scheduled item but none of the other information about the item.
*/
PublicTitle,
/**
* Confidential security means other users can only see that a user is
* unavailable for the time period of a scheduled item; no other
* information about the scheduled item is visible. Since confidential
* security applies to a specific time period, it is meaningful only for
* appointments and meetings, not for tasks or events; tasks and events do
* not have specific time components.
*/
Confidential,
/**
* Private security means other users see no information at all about a
* scheduled item, not even that the item is scheduled. Note that private
* security hides a scheduled item from the ScheduleMeeting operation,
* q.v., so that a meeting may be scheduled at the same time as a private
* appointment. It is up to the user to handle this situation by
* accepting or refusing the scheduled meeting. Given the nature of
* private security, it does not apply to meetings. I.e., only
* appointments can have private security.
*/
Private
}
enum AppointmentSecurity {
Public,
PublicTitle,
Confidential,
Private
}
/**
* For now a Location is a free-form string indicating in what physical
* location an item is scheduled. It may be refined to something like
* (building,room) pair.
*/
abstract class Location {
String value;
}
/**
* An AppointmentPriority indicates whether an appointment is a must or if it
* is optional. This information is used to indicate the general importance of
* an appointment to the user. The operational use of AppointmentPriority is
* in the ScheduleMeeting operation, where the meeting scheduler can elect to
* consider optional appointments as allowable times for a meeting.
*/
enum AppointmentPriority {
Must,
Optional
}
/**
* A TaskPriority is a positive integer that defines the priority of one
* task relative to others. It's defined as a separate class in case we want
* to enforce the value range restriction within the class constructor.
*/
abstract class TaskPriority {
int value;
}
/**
* RemindInfo has a flag that indicates if a scheduled item will have a
* reminder sent and defines one of three ways that the user is alerted when a
* scheduled event is to occur. OnScreen means the user is reminded with a
* pop-up alert on her computer screen. BeepOnly means the user is reminded
* with a simple audible tone on the computer. Email means the user is sent an
* electronic mail message reminder.
*/
abstract class RemindInfo {
boolean isReminded;
HowReminded howReminded;
}
enum HowReminded {
OnScreen,
BeepOnly,
Email
}
/**
* AppointmentRemindInfo extends RemindInfo by adding information for how
* soon before a scheduled item the reminder is to be sent. For appointments,
* the time units are minutes, hours, or days (cf. TaskRemindInfo).
*/
abstract class AppointmentRemindInfo extends RemindInfo {
double howSoonBefore;
AppointmentReminderUnits units;
}
/**
* TaskRemindInfo extends RemindInfo by adding information for how soon before
* a task the reminder is to be sent. For tasks, the time unit is days. A
* fractional day can be used for smaller granularity if desired.
*/
abstract class TaskRemindInfo extends RemindInfo {
double howSoonBefore;
}
/**
* Appointment reminders can come minutes, hours, or days before an
* appointment. The units for these can be fractional, for maximum
* flexibility.
*/
enum AppointmentReminderUnits {
MinutesBefore, HoursBefore, DaysBefore
}
/**
* Attendees is a collection of names of those who attend a meeting.
*/
abstract class Attendees {
Collection names;
}
/**
* MeetingMinutes is current defined as the URL for the location of the minutes
* of a meeting. This definition may be refined in upcoming versions of the
* requirements.
*/
abstract class MeetingMinutes {
String url;
}
/**
* The details of the Text object are TBD. It may just turn out to be a
* plain string. Or it may a limited form of HTML, so we can include linkable
* URLs in it.
*/
abstract class Text {}
/**
* The PossibleMeetingTimes object is a collection of (start time, start date)
* pairs at which a meeting could be held.
*/
abstract class PossibleMeetingTimes {
Collection timesAndDates;
}
/**
* A TimeAndDate object is an element of a possible meeting time list.
*/
class TimeAndDate {
Time startTime;
Date startDate;
}