diff -r 000000000000 -r fb9019fb1bf7 src/net/fortuna/ical4j/model/WeekDay.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/net/fortuna/ical4j/model/WeekDay.java Tue Feb 10 18:12:00 2015 +0100 @@ -0,0 +1,284 @@ +/** + * Copyright (c) 2012, Ben Fortuna + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * o Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * o Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * o Neither the name of Ben Fortuna nor the names of any other contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, + * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR + * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.fortuna.ical4j.model; + +import java.io.Serializable; +import java.util.Calendar; + +import net.fortuna.ical4j.util.Numbers; + +import org.apache.commons.lang.ObjectUtils; +import org.apache.commons.lang.builder.HashCodeBuilder; + +/** + * $Id$ + * + * Created: 19/12/2004 + * + * Defines a day of the week with a possible offset related to + * a MONTHLY or YEARLY occurrence. + * + * @author Ben Fortuna + */ +public class WeekDay implements Serializable { + + private static final long serialVersionUID = -4412000990022011469L; + + /** + * Sunday. + */ + public static final WeekDay SU = new WeekDay("SU", 0); + + /** + * Monday. + */ + public static final WeekDay MO = new WeekDay("MO", 0); + + /** + * Tuesday. + */ + public static final WeekDay TU = new WeekDay("TU", 0); + + /** + * Wednesday. + */ + public static final WeekDay WE = new WeekDay("WE", 0); + + /** + * Thursday. + */ + public static final WeekDay TH = new WeekDay("TH", 0); + + /** + * Friday. + */ + public static final WeekDay FR = new WeekDay("FR", 0); + + /** + * Saturday. + */ + public static final WeekDay SA = new WeekDay("SA", 0); + + private String day; + + private int offset; + + /** + * @param value a string representation of a week day + */ + public WeekDay(final String value) { + if (value.length() > 2) { + offset = Numbers.parseInt(value.substring(0, value.length() - 2)); + } + else { + offset = 0; + } + day = value.substring(value.length() - 2); + validateDay(); + } + + /** + * @param day a string representation of a week day + * @param offset a month offset value + */ + private WeekDay(final String day, final int offset) { + this.day = day; + this.offset = offset; + } + + /** + * Constructs a new weekday instance based on the specified + * instance and offset. + * @param weekDay a week day template for the instance + * @param offset a month offset value + */ + public WeekDay(final WeekDay weekDay, final int offset) { + this.day = weekDay.getDay(); + this.offset = offset; + } + + private void validateDay() { + if (!SU.day.equals(day) + && !MO.day.equals(day) + && !TU.day.equals(day) + && !WE.day.equals(day) + && !TH.day.equals(day) + && !FR.day.equals(day) + && !SA.day.equals(day)) { + throw new IllegalArgumentException("Invalid day: " + day); + } + } + /** + * @return Returns the day. + */ + public final String getDay() { + return day; + } + + /** + * @return Returns the offset. + */ + public final int getOffset() { + return offset; + } + + /** + * {@inheritDoc} + */ + public final String toString() { + final StringBuffer b = new StringBuffer(); + if (getOffset() != 0) { + b.append(getOffset()); + } + b.append(getDay()); + return b.toString(); + } + + /** + * Returns a weekday representation of the specified calendar. + * @param cal a calendar (java.util) + * @return a weekday instance representing the specified calendar + */ + public static final WeekDay getWeekDay(final Calendar cal) { + return new WeekDay(getDay(cal.get(Calendar.DAY_OF_WEEK)), 0); + } + + /** + * Returns a weekday/offset representation of the specified calendar. + * @param cal a calendar (java.util) + * @return a weekday instance representing the specified calendar + */ + public static final WeekDay getMonthlyOffset(final Calendar cal) { + return new WeekDay(getDay(cal.get(Calendar.DAY_OF_WEEK)), cal.get(Calendar.DAY_OF_WEEK_IN_MONTH)); + } + + /** + * Returns a weekday/negative offset representation of the specified calendar. + * @param cal a calendar (java.util) + * @return a weekday instance representing the specified calendar + */ + public static final WeekDay getNegativeMonthlyOffset(final Calendar cal) { + return new WeekDay(getDay(cal.get(Calendar.DAY_OF_WEEK)), cal.get(Calendar.DAY_OF_WEEK_IN_MONTH) - 6); + } + + /** + * Returns the corresponding day constant to the specified + * java.util.Calendar.DAY_OF_WEEK property. + * @param calDay a property value of java.util.Calendar.DAY_OF_WEEK + * @return a string, or null if an invalid DAY_OF_WEEK property is + * specified + */ + public static WeekDay getDay(final int calDay) { + WeekDay day = null; + switch (calDay) { + case Calendar.SUNDAY: + day = SU; + break; + case Calendar.MONDAY: + day = MO; + break; + case Calendar.TUESDAY: + day = TU; + break; + case Calendar.WEDNESDAY: + day = WE; + break; + case Calendar.THURSDAY: + day = TH; + break; + case Calendar.FRIDAY: + day = FR; + break; + case Calendar.SATURDAY: + day = SA; + break; + default: + break; + } + return day; + } + + /** + * Returns the corresponding java.util.Calendar.DAY_OF_WEEK + * constant for the specified WeekDay. + * @param weekday a week day instance + * @return the corresponding java.util.Calendar day + */ + public static int getCalendarDay(final WeekDay weekday) { + int calendarDay = -1; + if (SU.getDay().equals(weekday.getDay())) { + calendarDay = Calendar.SUNDAY; + } + else if (MO.getDay().equals(weekday.getDay())) { + calendarDay = Calendar.MONDAY; + } + else if (TU.getDay().equals(weekday.getDay())) { + calendarDay = Calendar.TUESDAY; + } + else if (WE.getDay().equals(weekday.getDay())) { + calendarDay = Calendar.WEDNESDAY; + } + else if (TH.getDay().equals(weekday.getDay())) { + calendarDay = Calendar.THURSDAY; + } + else if (FR.getDay().equals(weekday.getDay())) { + calendarDay = Calendar.FRIDAY; + } + else if (SA.getDay().equals(weekday.getDay())) { + calendarDay = Calendar.SATURDAY; + } + return calendarDay; + } + + /** + * {@inheritDoc} + */ + public final boolean equals(final Object arg0) { + if (arg0 == null) { + return false; + } + if (!(arg0 instanceof WeekDay)) { + return false; + } + final WeekDay wd = (WeekDay) arg0; + return ObjectUtils.equals(wd.getDay(), getDay()) + && wd.getOffset() == getOffset(); + } + + /** + * {@inheritDoc} + */ + public final int hashCode() { + return new HashCodeBuilder().append(getDay()) + .append(getOffset()).toHashCode(); + } +}