import java.text.*; import java.util.*; import java.io.*; /**************************************************************** The SimpleTime class keeps time in the hour/minute pair. It supports time ordering comparison and the conversion to SimpleTime from Date or String. ********************************************************************/ class SimpleTime { private int hour, minute; private static final int MaxHour = 24, MaxMinute = 60; private static DecimalFormat fixedFormatter= new DecimalFormat("00"); private static Calendar calendar=GregorianCalendar.getInstance(); /** initiate SimpleTime object */ public SimpleTime(int hour, int minute) { setHour(hour); setMinute(minute); } /** get time from a Date object */ public SimpleTime(Date date) { calendar.setTime(date); hour=calendar.get(GregorianCalendar.HOUR_OF_DAY); minute=calendar.get(GregorianCalendar.MINUTE); } /** check if current time is strictly earlier than another time */ public boolean isEarlierThan(SimpleTime t) { return hour" + (startTime==null? "":startTime.toString()) + "-" + (endTime==null? "":endTime.toString()) + "\n" + details +"\n"; } /** to be implemented by Entry's subclasses */ public abstract boolean occursOn(Date date); public int compareTo(Object o) { return 1; } } /**************************************************************** The EntryByDay class deals entries by day. ********************************************************************/ class EntryByDay extends Entry { private String d; /** create an entry head by days */ public EntryByDay(String days, String startTime, String endTime, String details) { d=new String(days); partialSetup(days,startTime,endTime,details); } /** implement its special occursOn() */ public boolean occursOn(Date date) { char day=SimpleDate.dateToDay(date); if(!validEntry) return false; return d.indexOf(day)!= -1; } } /**************************************************************** The EntryByDate class deals entries by dates. STUDENT WORK TYPICALLY NEEDED HERE. ********************************************************************/ class EntryByDate extends Entry { private SimpleDate d; public EntryByDate(String days, String startTime, String endTime, String details) { d = new SimpleDate(); if (days.indexOf('/') != -1) { String[] b = days.split("/"); if (b.length > 2) { if (Integer.parseInt(b[2]) == 0) d.setDay(Integer.parseInt(b[2])); else d.setDay(Integer.parseInt("20"+b[2])); } else { d.setDay(Integer.parseInt(b[0])); d.setMonth(Integer.parseInt(b[1])); d.setYear(0); } } else { d.setDay(Integer.parseInt(days)); d.setMonth(0); d.setYear(0); } partialSetup(days, startTime, endTime, details); } public boolean occursOn(Date date) { if (!validEntry) return false; SimpleDate other = new SimpleDate(date); return d.equal(other); } } /**************************************************************** Schedule is the main class. It may read from stdin to create a list of entries, and select entries based on any given date. STUDENT WORK TYPICALLY NEEDED HERE. ********************************************************************/ class Schedule { private ArrayList entries; private String eventfile; /** initiate an empty list of entries */ public Schedule(String file) { entries=new ArrayList(); eventfile = file; } /** add an entry to the schedule */ public void add(Entry e) { entries.add(e); } /** add an entry in the form of strings */ public void add(String dateOrDay, String startTime, String endTime, String details ) { SimpleDate a = new SimpleDate(); if (a.isDay(dateOrDay)) entries.add(new EntryByDay(dateOrDay,startTime,endTime,details)); else entries.add(new EntryByDate(dateOrDay, startTime, endTime, details)); } /** add an event which is in the form of a single line */ public void add(String line) { String start, finish; StringTokenizer data = new StringTokenizer(line); String date = data.nextToken(); String time = data.nextToken(); String desc = data.nextToken("#").trim(); String[] b = time.trim().split("-"); // Time handler if (time.charAt(0) == '-') { start = "0:00"; if (time.length() == 1) finish = "23:59"; else finish = b[1]; } else { start = b[0]; if (time.charAt(time.length()-1) == '-') finish = "23:59"; else if (b.length == 1) finish = "23:59"; else finish = b[1]; } add(date, start, finish, desc); } /** read all entries from a file */ public void read() { String line; try { BufferedReader reader= new BufferedReader(new FileReader(eventfile)); while(true) { line=reader.readLine().trim(); if(line.length()==0 || line.charAt(0)=='#') continue; add(line); } } catch(Exception e) {} } /** write schedule to standard output stream */ public void write() { for(int i=0;i 2 ? Integer.valueOf(args[2]).intValue() : 1); if (args.length > 1) date = e.stringToDate(args[1]); else date = new Date(); // reading and parsing events read(); // output entries in html format System.out.print("\n\n" + "

Scheduled Entries

\n\n" + "\n"); for (int i=0; i\n"); subEntries=occursOn(date); Collections.sort(subEntries); subEntries.write(); date.setDate(date.getDate()+1); } System.out.print("\n
" + SimpleDate.getDateFormatter("E d/M/yyyy").format(date) + "
\n\n"); System.out.println(""); } /** the program entry point */ public static void main(String[] args) { Schedule d = new Schedule(args[0]); d.getSchedule(args); } }