package com.pennapps.labs.pennmobile.classes; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.NonNull; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Course implements Parcelable { public String course_department; public int course_number; public int section_number; public String course_title; public String course_description; public String activity; public String first_meeting_days; public List<Instructor> instructors = new ArrayList<>(); public List<Meeting> meetings = new ArrayList<>(); protected Course(Parcel in) { course_department = in.readString(); course_number = in.readInt(); section_number = in.readInt(); course_title = in.readString(); course_description = in.readString(); activity = in.readString(); first_meeting_days = in.readString(); in.readList(instructors, Instructor.class.getClassLoader()); in.readList(meetings, Meeting.class.getClassLoader()); } public static final Creator<Course> CREATOR = new Creator<Course>() { @Override public Course createFromParcel(Parcel in) { return new Course(in); } @Override public Course[] newArray(int size) { return new Course[size]; } }; public int describeContents(){ return 0; } @Override public void writeToParcel(Parcel dest, int flags) { dest.writeString(course_department); dest.writeInt(course_number); dest.writeInt(section_number); dest.writeString(course_title); dest.writeString(course_description); dest.writeString(activity); dest.writeString(first_meeting_days); dest.writeList(instructors); dest.writeList(meetings); } @NonNull private String getRegex(String string, String pattern) { Matcher m = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE).matcher(string); if (m.find()) { return m.group(0); } return ""; } public String getName() { return course_department + " " + String.format("%03d", course_number) + " " + String.format("%03d", section_number); } @NonNull public String getBuildingCode() { if (!meetings.isEmpty() && !meetings.get(0).building_code.equals("")) { return meetings.get(0).building_code; } else if (!first_meeting_days.equals("")) { // Fallback for empty building code, useful before semester starts // Regex gets building code after AM/PM // Ex: "MWF12:00 PMTOWN100" -> "TOWN" return getRegex(first_meeting_days, "(?<=\\s(A|P)M)[A-Z]+"); } return ""; } @NonNull public String getMeetingLocation() { if (!meetings.isEmpty() && !meetings.get(0).building_code.equals("")) { return meetings.get(0).building_code + meetings.get(0).room_number; } else if (!first_meeting_days.equals("")) { // Fallback for empty building code, useful before semester starts // Regex gets building code and room number after AM/PM // Ex: "MWF12:00 PMTOWN100" -> "TOWN100" return getRegex(first_meeting_days, "(?<=\\s(A|P)M)\\w{3,4}"); } return ""; } @NonNull public String getMeetingDays() { if (!meetings.isEmpty()) { return meetings.get(0).meeting_days; } else if (!first_meeting_days.equals("")) { // Regex gets the days which are alphabetic at start of string // Ex: "MWF12:00 PMTOWN100" -> "MWF" return getRegex(first_meeting_days, "^[A-Z]+"); } return ""; } @NonNull public String getMeetingStartTime() { if (!meetings.isEmpty()) { return meetings.get(0).start_time; } else if (!first_meeting_days.equals("")) { // Regex gets time // Ex: "MWF12:00 PMTOWN100" -> "12:00 PM" return getRegex(first_meeting_days, "(\\d{1,2}:\\d{1,2}\\s*[AP]M)"); } return ""; } @NonNull public String getMeetingEndTime(){ if (!meetings.isEmpty()) { return meetings.get(0).end_time; } return ""; } public String getId() { return new StringBuilder().append(course_department).append(course_number).append(section_number).toString(); } }