001/* ======================================================================== 002 * JCommon : a free general purpose class library for the Java(tm) platform 003 * ======================================================================== 004 * 005 * (C) Copyright 2000-2005, by Object Refinery Limited and Contributors. 006 * 007 * Project Info: http://www.jfree.org/jcommon/index.html 008 * 009 * This library is free software; you can redistribute it and/or modify it 010 * under the terms of the GNU Lesser General Public License as published by 011 * the Free Software Foundation; either version 2.1 of the License, or 012 * (at your option) any later version. 013 * 014 * This library is distributed in the hope that it will be useful, but 015 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 016 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public 017 * License for more details. 018 * 019 * You should have received a copy of the GNU Lesser General Public 020 * License along with this library; if not, write to the Free Software 021 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 022 * USA. 023 * 024 * [Java is a trademark or registered trademark of Sun Microsystems, Inc. 025 * in the United States and other countries.] 026 * 027 * -------------------- 028 * DayAndMonthRule.java 029 * -------------------- 030 * (C) Copyright 2000-2003, by Object Refinery Limited. 031 * 032 * Original Author: David Gilbert (for Object Refinery Limited); 033 * Contributor(s): -; 034 * 035 * $Id: DayAndMonthRule.java,v 1.6 2005/11/16 15:58:40 taqua Exp $ 036 * 037 * Changes (from 26-Oct-2001) 038 * -------------------------- 039 * 26-Oct-2001 : Changed package to com.jrefinery.date.* (DG); 040 * 12-Nov-2001 : Added some argument checks (DG); 041 * 03-Oct-2002 : Fixed errors reported by Checkstyle (DG); 042 * 01-Jun-2005 : Removed the explicit clonable declaration, it is declared 043 * in the super class. 044 */ 045 046package org.jfree.date; 047 048/** 049 * An annual date rule where the generated date always falls on the same day 050 * and month each year. 051 * <P> 052 * An example is ANZAC Day in Australia and New Zealand: it is observed on 053 * 25 April of every year. 054 * 055 * @author David Gilbert 056 */ 057public class DayAndMonthRule extends AnnualDateRule { 058 059 /** The day of the month. */ 060 private int dayOfMonth; 061 062 /** The month (uses 1 to 12 in the obvious way). */ 063 private int month; 064 065 /** 066 * Default constructor: builds a DayAndMonthRule for 1 January. 067 */ 068 public DayAndMonthRule() { 069 this(1, MonthConstants.JANUARY); 070 } 071 072 /** 073 * Standard constructor: builds a DayAndMonthRule for the given 074 * day-of-the-month and month. 075 * <P> 076 * For the month parameter, use SerialDate.JANUARY, etc. Note that there 077 * are no checks to prevent you from entering an invalid combination (such 078 * as 31 February). 079 * 080 * @param dayOfMonth the day of the month (in the range 1 to 31). 081 * @param month the month (use SerialDate.JANUARY, SerialDate.FEBRUARY etc.); 082 */ 083 public DayAndMonthRule(final int dayOfMonth, final int month) { 084 085 // check arguments delegated to setter methods... 086 setMonth(month); 087 setDayOfMonth(dayOfMonth); 088 089 } 090 091 /** 092 * Returns the day of the month. 093 * 094 * @return the day of the month. 095 */ 096 public int getDayOfMonth() { 097 return this.dayOfMonth; 098 } 099 100 /** 101 * Sets the day-of-the-month for this rule. 102 * 103 * @param dayOfMonth the day-of-the-month. 104 */ 105 public void setDayOfMonth(final int dayOfMonth) { 106 107 // check arguments... 108 if ((dayOfMonth < 1) || (dayOfMonth > SerialDate.LAST_DAY_OF_MONTH[this.month])) { 109 throw new IllegalArgumentException( 110 "DayAndMonthRule(): dayOfMonth outside valid range."); 111 } 112 113 // make the change... 114 this.dayOfMonth = dayOfMonth; 115 116 } 117 118 /** 119 * Returns an integer code representing the month. 120 * <P> 121 * The codes JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, 122 * SEPTEMBER, OCTOBER, NOVEMBER and DECEMBER are defined in the SerialDate 123 * class. 124 * 125 * @return an integer code representing the month. 126 */ 127 public int getMonth() { 128 return this.month; 129 } 130 131 /** 132 * Sets the month for this rule. 133 * 134 * @param month the month for this rule. 135 */ 136 public void setMonth(final int month) { 137 138 // check arguments... 139 if (!SerialDate.isValidMonthCode(month)) { 140 throw new IllegalArgumentException("DayAndMonthRule(): month code not valid."); 141 } 142 143 // make the change... 144 this.month = month; 145 146 } 147 148 /** 149 * Returns the date, given the year. 150 * 151 * @param yyyy the year. 152 * 153 * @return the date generated by this rule for the specified year (null permitted). 154 */ 155 public SerialDate getDate(final int yyyy) { 156 return SerialDate.createInstance(this.dayOfMonth, this.month, yyyy); 157 } 158}