Skip to content

Commit

Permalink
SAK-31944 Fix Calendar tool Month display name (sakaiproject#3582)
Browse files Browse the repository at this point in the history
* SAK-31944 Fix Calendar tool Month display name

Previously in the Calendar tool, the month name would be displayed
incorrectly when it was the 31 day of a month. This was resolved
by using the new Java 8 YearMonth object.

Minor cleanup in CalendarUtil.java

* SAK-31944 Add test for month calculations on 31st.

When it’s the 31st of the month the calculated day of the month is shown incorrectly.
master-bob authored and jonespm committed Jan 17, 2017
1 parent 8be539e commit 4eeac2f
Showing 3 changed files with 104 additions and 60 deletions.
6 changes: 6 additions & 0 deletions calendar/calendar-util/util/pom.xml
Original file line number Diff line number Diff line change
@@ -53,5 +53,11 @@
<artifactId>joda-time</artifactId>
<version>${joda.time.version}</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>2.2.16</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
Original file line number Diff line number Diff line change
@@ -23,6 +23,10 @@

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.time.Clock;
import java.time.Month;
import java.time.YearMonth;
import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
@@ -40,11 +44,13 @@ public class CalendarUtil
{
/** Our logger. */
private static Logger M_log = LoggerFactory.getLogger(CalendarUtil.class);

private Clock clock = Clock.systemDefaultZone();

/** The calendar object this is based upon. */
Calendar m_calendar = null;
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.SHORT);
ResourceLoader rb = new ResourceLoader("calendar");
ResourceLoader rb;

Date dateSunday = null;
Date dateMonday = null;
@@ -72,32 +78,56 @@ public class CalendarUtil
/**
* Construct.
*/
public CalendarUtil()
public CalendarUtil()
{
rb = new ResourceLoader("calendar");
Locale locale = rb.getLocale();
m_calendar = Calendar.getInstance(locale);
initDates();

} // CalendarUtil

/**
* Construct.
*/
public CalendarUtil(Calendar calendar)
{
rb = new ResourceLoader("calendar");
m_calendar = calendar;
initDates();

} // CalendarUtil

/**
* Constructor for testing.
* @param clock the clock to use for the current time.
*/
public CalendarUtil(Clock clock, ResourceLoader rb)
{
this.clock = clock;
this.rb = rb;
m_calendar = getCalendarInstance();
initDates();
}

/**
* This creates a calendar based on the clock. This is to allow testing of the class.
* @return A calendar.
*/
private Calendar getCalendarInstance() {
Calendar instance = Calendar.getInstance();
instance.setTime(Date.from(clock.instant()));
return instance;
}

void initDates() {
Calendar calendarSunday = Calendar.getInstance();
Calendar calendarMonday = Calendar.getInstance();
Calendar calendarTuesday = Calendar.getInstance();
Calendar calendarWednesday = Calendar.getInstance();
Calendar calendarThursday = Calendar.getInstance();
Calendar calendarFriday = Calendar.getInstance();
Calendar calendarSaturday = Calendar.getInstance();
Calendar calendarSunday = getCalendarInstance();
Calendar calendarMonday = getCalendarInstance();
Calendar calendarTuesday = getCalendarInstance();
Calendar calendarWednesday = getCalendarInstance();
Calendar calendarThursday = getCalendarInstance();
Calendar calendarFriday = getCalendarInstance();
Calendar calendarSaturday = getCalendarInstance();

calendarSunday.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);
calendarMonday.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
@@ -115,47 +145,41 @@ void initDates() {
dateFriday = calendarFriday.getTime();
dateSaturday = calendarSaturday.getTime();

Calendar calendarJanuary = Calendar.getInstance();
Calendar calendarFebruary = Calendar.getInstance();
Calendar calendarMarch = Calendar.getInstance();
Calendar calendarApril = Calendar.getInstance();
Calendar calendarMay = Calendar.getInstance();
Calendar calendarJune = Calendar.getInstance();
Calendar calendarJuly = Calendar.getInstance();
Calendar calendarAugust = Calendar.getInstance();
Calendar calendarSeptember = Calendar.getInstance();
Calendar calendarOctober = Calendar.getInstance();
Calendar calendarNovember = Calendar.getInstance();
Calendar calendarDecember = Calendar.getInstance();

calendarJanuary.set(Calendar.MONTH, Calendar.JANUARY);
calendarFebruary.set(Calendar.MONTH, Calendar.FEBRUARY);
calendarMarch.set(Calendar.MONTH, Calendar.MARCH);
calendarApril.set(Calendar.MONTH, Calendar.APRIL);
calendarMay.set(Calendar.MONTH, Calendar.MAY);
calendarJune.set(Calendar.MONTH, Calendar.JUNE);
calendarJuly.set(Calendar.MONTH, Calendar.JULY);
calendarAugust.set(Calendar.MONTH, Calendar.AUGUST);
calendarSeptember.set(Calendar.MONTH, Calendar.SEPTEMBER);
calendarOctober.set(Calendar.MONTH, Calendar.OCTOBER);
calendarNovember.set(Calendar.MONTH, Calendar.NOVEMBER);
calendarDecember.set(Calendar.MONTH, Calendar.DECEMBER);

dateJanuary = calendarJanuary.getTime();
dateFebruary = calendarFebruary.getTime();
dateMarch = calendarMarch.getTime();
dateApril = calendarApril.getTime();
dateMay = calendarMay.getTime();
dateJune = calendarJune.getTime();
dateJuly = calendarJuly.getTime();
dateAugust = calendarAugust.getTime();
dateSeptember = calendarSeptember.getTime();
dateOctober = calendarOctober.getTime();
dateNovember = calendarNovember.getTime();
dateDecember = calendarDecember.getTime();
// Previously Calendar was used, but it had problems getting the month right
// when the current day of the month was 31.
YearMonth currentYearMonth = YearMonth.now(clock);
YearMonth jan = currentYearMonth.with(Month.JANUARY);
YearMonth feb = currentYearMonth.with(Month.FEBRUARY);
YearMonth mar = currentYearMonth.with(Month.MARCH);
YearMonth apr = currentYearMonth.with(Month.APRIL);
YearMonth may = currentYearMonth.with(Month.MAY);
YearMonth jun = currentYearMonth.with(Month.JUNE);
YearMonth jul = currentYearMonth.with(Month.JULY);
YearMonth aug = currentYearMonth.with(Month.AUGUST);
YearMonth sep = currentYearMonth.with(Month.SEPTEMBER);
YearMonth oct = currentYearMonth.with(Month.OCTOBER);
YearMonth nov = currentYearMonth.with(Month.NOVEMBER);
YearMonth dec = currentYearMonth.with(Month.DECEMBER);

dateJanuary = getDateFromYearMonth(jan);
dateFebruary = getDateFromYearMonth(feb);
dateMarch = getDateFromYearMonth(mar);
dateApril = getDateFromYearMonth(apr);
dateMay = getDateFromYearMonth(may);
dateJune = getDateFromYearMonth(jun);
dateJuly = getDateFromYearMonth(jul);
dateAugust = getDateFromYearMonth(aug);
dateSeptember = getDateFromYearMonth(sep);
dateOctober = getDateFromYearMonth(oct);
dateNovember = getDateFromYearMonth(nov);
dateDecember = getDateFromYearMonth(dec);

}

private Date getDateFromYearMonth(YearMonth ym) {
return Date.from(ym.atDay(1).atStartOfDay(ZoneId.systemDefault()).toInstant());
}

/**
* Access the current user.
* @return the current year.
@@ -219,8 +243,7 @@ public int getNextMonth()
} // getNextMonth

/**
* Set the calendar to the next year, and return this.
* @return the next year.
* Set the calendar to the next year
*/
public void setNextYear()
{
@@ -242,8 +265,7 @@ public int getPrevMonth()
} // getPrevMonth

/**
* Set the calendar to the prev year, and return this.
* @return the prev year.
* Set the calendar to the prev year.
*/
public void setPrevYear()
{
@@ -274,8 +296,7 @@ public int getDay_Of_Week( boolean useLocale )
} // getDay_Of_Week

/**
* Set the calendar to the next week, and return this.
* @return the next week.
* Set the calendar to the next week
*/
public void setNextWeek()
{
@@ -284,8 +305,7 @@ public void setNextWeek()
} // setNextWeek

/**
* Set the calendar to the prev week, and return this.
* @return the prev week.
* Set the calendar to the prev week
*/
public void setPrevWeek()
{
@@ -332,8 +352,7 @@ public int getMonthInteger()
*/
public int getDayOfMonth()
{
int dayofmonth = m_calendar.get(Calendar.DAY_OF_MONTH);
return dayofmonth;
return m_calendar.get(Calendar.DAY_OF_MONTH);

} // getDayOfMonth

@@ -410,7 +429,7 @@ public void setDay(int year, int month, int day)
public String[] getCalendarMonthNames(boolean longNames) {

Locale currentLocale = rb.getLocale();
String[] months = null;
String[] months;

if (longNames) {

@@ -492,7 +511,7 @@ public String[] getCalendarDaysOfWeekNames(boolean longNames)
SimpleDateFormat longDay = new SimpleDateFormat("EEEE", currentLocale);
SimpleDateFormat shortDay = new SimpleDateFormat("EEE", currentLocale);

String[] weekDays = null;
String[] weekDays;
String[] longWeekDays = new String[]
{
longDay.format(dateSunday),
Original file line number Diff line number Diff line change
@@ -2,9 +2,16 @@

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import java.time.Clock;
import java.time.Instant;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.util.Calendar;
import java.util.Locale;
import java.util.TimeZone;

@@ -48,5 +55,17 @@ public void testLocalPMStringStartOfDay() {
assertEquals("PM", CalendarUtil.getLocalPMString(dateTime));
}

@Test
public void testDayOfMonthAtEnd() {
// This tests a problem with how Sakai was calculating the month when it was the last day of the month.
ResourceLoader rb = Mockito.mock(ResourceLoader.class);
Mockito.when(rb.getLocale()).thenReturn(Locale.ENGLISH);
Instant instant = Instant.parse("2007-08-31T09:30:00Z");
CalendarUtil util = new CalendarUtil(Clock.fixed(instant, ZoneOffset.ofHours(0)),rb);
String[] calendarMonthNames = util.getCalendarMonthNames(false);
String[] expected = new String[]{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
Assert.assertArrayEquals(expected, calendarMonthNames);
}


}

0 comments on commit 4eeac2f

Please sign in to comment.