/**
* Licensed to Apereo under one or more contributor license
* agreements. See the NOTICE file distributed with this work
* for additional information regarding copyright ownership.
* Apereo licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a
* copy of the License at the following location:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.jasig.portlet.courses.mvc.wrapper;
import java.util.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import org.jasig.portlet.courses.model.xml.AdditionalInfo;
import org.jasig.portlet.courses.model.xml.CourseMeeting;
import org.jasig.portlet.courses.model.xml.CourseSection;
import org.jasig.portlet.courses.model.xml.Location;
import org.jasig.portlet.courses.model.xml.personal.Course;
import org.jasig.portlet.courses.util.DayEnum;
import org.joda.time.DateMidnight;
import org.joda.time.DateTimeConstants;
import org.joda.time.LocalTime;
import org.joda.time.Minutes;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* CourseSectionWrapper
* <p>
* Wraps a Course, CourseSection and CourseMeeting for easy conversion to JSON
* and reference within JSPs.
*
* @author Sengupta5@wisc.edu
* @author CPKennedy2@wisc.edu
*/
public class CourseSectionWrapper {
protected final Logger logger = LoggerFactory.getLogger(getClass());
@JsonIgnore private CourseMeeting courseMeeting;
@JsonIgnore private CourseSection courseSection;
@JsonIgnore private Course course;
private String startTime;
private String startDateDisplay;
private String timeRangeDisplay;
@JsonIgnore private DateMidnight startDateObj;
@JsonIgnore public static DateTimeFormatter monthDescrFormat = DateTimeFormat.forPattern("MMM");
@JsonIgnore public static DateTimeFormatter startTimeFormat = DateTimeFormat.forPattern("H:mm");
@JsonIgnore public static DateTimeFormatter amPmFormat = DateTimeFormat.forPattern("h:mm a");
@JsonIgnore public static DateTimeFormatter dateDisplayFormat = DateTimeFormat.forPattern("MMM d");
private Integer duration;
private Integer scheduledDay;
private Integer dayId;
private String day;
private String dayDescr;
private String url;
private String sessionCode;
private String sessionStartEndDate;
private String room;
private String locationDisplayName;
private String streetAddress;
private String courseDescr;
private String courseTitle;
private String courseCode;
private String meetingDescr;
@JsonIgnore private static Map<String, DayEnum> dayMap;
@JsonIgnore private static DayEnum[] dayArr = {
DayEnum.Su,
DayEnum.M ,
DayEnum.T ,
DayEnum.W ,
DayEnum.Th,
DayEnum.F ,
DayEnum.Sa,
DayEnum.Su // A second time because JodaTime uses 7 as Sunday
};
static {
Map<String, DayEnum> m = new HashMap();
m.put(DayEnum.Su.toString(), DayEnum.Su);
m.put(DayEnum.M.toString() , DayEnum.M );
m.put(DayEnum.T.toString() , DayEnum.T );
m.put(DayEnum.W.toString() , DayEnum.W );
m.put(DayEnum.Th.toString(), DayEnum.Th);
m.put(DayEnum.F.toString() , DayEnum.F );
m.put(DayEnum.Sa.toString(), DayEnum.Sa);
dayMap = Collections.unmodifiableMap(m);
}
public CourseSectionWrapper() {}
/* For "other" courses without a meeting time
* <p>
* Used by the Schedule Grid
*
* @param course Reference Course. @see #setCourse(Course)
* @param section Reference section, which is a member of course
* @see #setCourseSection(CourseSection)
* @param url The URL for the detail view of course and section
*/
public CourseSectionWrapper(Course course,
CourseSection section,
String url)
{
this.setUrl(url);
this.setCourse(course);
this.setCourseSection(section);
this.setSessionCode(getCourseSectionAdditionalInfoValue(section, "sessionCode"));
this.setSessionStartEndDate(getCourseSectionAdditionalInfoValue(section, "sessionStartEndDate"));
}
/*
* For individual meeting days
* <p>
* Used by the Schedule Grid
*
* @param course Reference Course. {@link #setCourse(Course)}
* @param section Reference section, which is a member of course
* {@link #setCourseSection(CourseSection)}
* @param meeting Reference meeting, which is a member of section
* {@link #setCourseMeeting(CourseMeeting)}
* @param day Day reference, from meeting. Is translated to a
* day of week and name.<br/>
* {@link #setDay(DayEnum)}<br/>
* {@link DayEnum}
* @param url The URL for the detail view of course and section
*/
public CourseSectionWrapper(Course course,
CourseSection section,
CourseMeeting meeting,
String day,
String url)
{
this.setDay(dayMap.get(day));
this.setUrl(url);
this.setCourse(course);
this.setCourseSection(section);
this.setCourseMeeting(meeting);
this.setSessionCode(getCourseSectionAdditionalInfoValue(section, "sessionCode"));
this.setSessionStartEndDate(getCourseSectionAdditionalInfoValue(section, "sessionStartEndDate"));
}
/**
* For individual meeting days
* <p>
* Used by the Final Exam Grid
*
* @param course Reference Course. {@link #setCourse(Course)}
* @param section Reference section, which is a member of course
* {@link #setCourseSection(CourseSection)}
* @param meeting Reference meeting, which is a member of section
* {@link #setCourseMeeting(CourseMeeting)}
*
* Used to set the Start date reference,
* Is used to set day of week and name.<br/>
* {@link #setDay(DayEnum)}<br/>
* {@link DayEnum}
* @param url The URL for the detail view of course and section
*/
public CourseSectionWrapper(Course course,
CourseSection section,
CourseMeeting meeting,
String url)
{
DateMidnight date = meeting.getStartDate();
this.setStartDateObj(date);
this.setDay(dayArr[date.getDayOfWeek()]);
this.setUrl(url);
this.setCourse(course);
this.setCourseSection(section);
this.setCourseMeeting(meeting);
this.setSessionCode(getCourseSectionAdditionalInfoValue(section, "sessionCode"));
this.setSessionStartEndDate(getCourseSectionAdditionalInfoValue(section, "sessionStartEndDate"));
}
/**
* @return the courseMeeting
*/
public CourseMeeting getCourseMeeting() {
return courseMeeting;
}
/**
* Sets the courseMeeting object
* <p/>
* Also sets the formatted startTime and duration of the courseMeeting
*
* @see #startTimeFormat
* @see #getStartTime()
* @see #getDuration()
*
* @param courseMeeting the courseMeeting to set
*/
public void setCourseMeeting(CourseMeeting courseMeeting) {
LocalTime startTime = courseMeeting.getStartTime();
LocalTime endTime = courseMeeting.getEndTime();
this.startTime = startTimeFormat.print(startTime);
this.duration = (Minutes.minutesBetween(startTime, endTime)).getMinutes();
this.timeRangeDisplay = amPmFormat.print(startTime) + " to " + amPmFormat.print(endTime);
Location location = courseMeeting.getLocation();
this.room = location.getRoom();
this.locationDisplayName = location.getDisplayName();
this.streetAddress = location.getStreetAddress();
this.courseMeeting = courseMeeting;
}
/**
* @return the courseSection
*/
public CourseSection getCourseSection() {
return courseSection;
}
/**
* Sets the course object
* <p/>
* Also sets the meetingDescr from the courseSection object
*
* @see #getMeetingDescr()
*
* @param courseSection the courseSection to set
*/
public void setCourseSection(CourseSection courseSection) {
this.meetingDescr = courseSection.getType() + " " + courseSection.getCode();
this.courseSection = courseSection;
}
/**
* @return the course
*/
public Course getCourse() {
return course;
}
/**
* Sets the courseSection object
* <p/>
* Also sets the courseCode, courseDescr and courseTitle from the course object
*
* @see #getCourseCode()
* @see #getCourseDescr()
* @see #getCourseTitle()
*
* @param course the course to set
*/
public void setCourse(Course course) {
this.courseCode = course.getCode();
this.courseDescr = course.getCourseDepartment().getName();
this.courseTitle = course.getTitle();
this.course = course;
}
@JsonIgnore
public int getExamStartSunday() {
if( this.getStartDateObj() == null ){
return 0;
}
DateMidnight date = this.getStartDateObj();
if( date.getDayOfWeek() == DateTimeConstants.SUNDAY ){
return date.getDayOfMonth();
}
return date.withDayOfWeek(DateTimeConstants.SUNDAY)
.minusWeeks(1)
.getDayOfMonth();
}
@JsonIgnore
public String getMonthDescrOfStart() {
if( this.getStartDateObj() == null ){
return "";
}
return monthDescrFormat.print(this.getStartDateObj());
}
public static Comparator<CourseSectionWrapper> FinalExamComparator
= new Comparator<CourseSectionWrapper>() {
public int compare(CourseSectionWrapper fe1, CourseSectionWrapper fe2) {
int i= fe1.courseMeeting.getStartDate().compareTo(fe2.getCourseMeeting().getStartDate());
if (i!=0) return i;
return fe1.courseMeeting.getStartTime().compareTo(fe2.getCourseMeeting().getStartTime());
}
};
/**
* For sorting {@link CourseSectionWrapper}s by {@link org.jasig.portlet.courses.model.xml.CourseMeeting#getStartTime()}
*/
public static Comparator<CourseSectionWrapper> ClassScheduleComparator
= new Comparator<CourseSectionWrapper>() {
public int compare(CourseSectionWrapper fe1, CourseSectionWrapper fe2) {
int i= fe1.getDayId().compareTo(fe2.getDayId());
if (i!=0) return i;
return fe1.courseMeeting.getStartTime().compareTo(fe2.getCourseMeeting().getStartTime());
}
};
/**
* For sorting {@link CourseSectionWrapper}s first by {@link #getCourseDescr()},
* then by {@link org.jasig.portlet.courses.model.xml.CourseSection#getCode()}
*/
public static Comparator<CourseSectionWrapper> OtherCourseComparator =
new Comparator<CourseSectionWrapper>() {
@Override
public int compare(CourseSectionWrapper o1, CourseSectionWrapper o2) {
int courseDescr = o1.getCourseDescr().compareTo(o2.getCourseDescr());
return courseDescr != 0 ? courseDescr :
o1.getCourseSection().getCode().compareTo(o2.getCourseSection().getCode());
}
};
/**
* @return the startTime
*/
public String getStartTime() {
return startTime;
}
/**
* @param startTime the startTime to set
*/
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public void setDay(DayEnum d) {
this.setDay(d.toString());
this.setDayId(d.getValue());
this.setDayDescr(d.getDescr());
}
/**
* @return the dayId
*/
public Integer getDayId() {
return dayId;
}
/**
* @param dayId the dayId to set
*/
public void setDayId(Integer dayId) {
this.dayId = dayId.equals(new Integer(7)) ? new Integer(0) : dayId;
this.scheduledDay = this.dayId;
}
/**
* @return the day
*/
public String getDay() {
return day;
}
/**
* @param day the day to set
*/
public void setDay(String day) {
this.day = day;
}
/**
* @return the dayDescr
*/
public String getDayDescr() {
return dayDescr;
}
/**
* @param dayDescr the dayDescr to set
*/
public void setDayDescr(String dayDescr) {
this.dayDescr = dayDescr;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
public String getMeetingDescr() {
return meetingDescr;
}
public String getCourseCode() {
return courseCode;
}
public String getCourseDescr() {
return courseDescr;
}
public Integer getScheduledDay() {
return scheduledDay;
}
public Integer getDuration() {
return duration;
}
public String getCourseTitle() {
return courseTitle;
}
public DateMidnight getStartDateObj() {
return startDateObj;
}
public void setStartDateObj(DateMidnight startDateObj) {
this.startDateDisplay = dateDisplayFormat.print(startDateObj);
this.startDateObj = startDateObj;
}
public String getRoom() {
return room;
}
public String getLocationDisplayName() {
return locationDisplayName;
}
public String getStreetAddress() {
return streetAddress;
}
public String getStartDateDisplay() {
return startDateDisplay;
}
public String getTimeRangeDisplay() {
return timeRangeDisplay;
}
public String getSessionCode() {
return sessionCode;
}
public void setSessionCode(String sessionCode) {
this.sessionCode = sessionCode;
}
public String getSessionStartEndDate() {
return sessionStartEndDate;
}
public void setSessionStartEndDate(String sessionStartEndDate) {
this.sessionStartEndDate = sessionStartEndDate;
}
/**
* The following method Load the Value from AdditionalInfo Object of CourseSection , based on the
* Key passed as an Parameter.
* @param courseSection
* @param key
* @return
*/
private String getCourseSectionAdditionalInfoValue(CourseSection courseSection, String key)
{
List<AdditionalInfo> additionalInfoList =courseSection.getSectionAdditionalInfos();
for(AdditionalInfo additionalInfo:additionalInfoList)
{
if (additionalInfo.getKey().equals(key))
return additionalInfo.getValue();
}
return "-";
}
}