package org.voidsink.kussslib.impl; import java.text.ParseException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.voidsink.kussslib.Exam; import org.voidsink.kussslib.Term; public class ExamImpl implements Exam { private static final Pattern courseIdTermPattern = Pattern .compile(Parser.PATTERN_LVA_NR_COMMA_TERM); private static final Pattern courseIdPattern = Pattern .compile(Parser.PATTERN_LVA_NR); private static final Pattern termPattern = Pattern .compile(Parser.PATTERN_TERM); private static final Pattern timePattern = Pattern .compile("\\d{2}\\:\\d{2}"); private String courseId; private Term term; private Date dtStart; private Date dtEnd; private String location; private String title; private int cid; private String description; private String info; private boolean isRegistered; private int maxParticipants; private int participants; private Date registrationDtStart; private Date registrationDtEnd; private Date unregistrationDt; ExamImpl(String courseId, Term term, Date dtStart, Date dtEnd, String location, String title, int cid, String description, String info, boolean isRegistered, int maxParticipants, int participants, Date registrationDtStart, Date registrationDtEnd, Date unregistrationDt) { this.courseId = courseId; this.term = term; this.dtStart = dtStart; this.dtEnd = dtEnd; this.location = location; this.title = title; this.cid = cid; this.description = description; this.info = info; this.isRegistered = isRegistered; this.maxParticipants = maxParticipants; this.participants = participants; this.registrationDtStart = registrationDtStart; this.registrationDtEnd = registrationDtEnd; this.unregistrationDt = unregistrationDt; } public ExamImpl(Element row, boolean isNewExam) throws ParseException { this("", null, null, null, "", "", 0, "", "", false, 0, 0, null, null, null); Elements columns = row.getElementsByTag("td"); if (isNewExam) { // allow only exams that can be selected if (columns.size() >= 5 && columns.get(0).select("input").size() == 1) { Matcher courseIdTermMatcher = courseIdTermPattern .matcher(columns.get(1).text()); // (courseId,term) if (courseIdTermMatcher.find()) { String courseIdTerm = courseIdTermMatcher.group(); title = columns.get(1).text() .substring(0, courseIdTermMatcher.start()); Matcher courseIdMatcher = courseIdPattern .matcher(courseIdTerm); // courseId if (courseIdMatcher.find()) { courseId = courseIdMatcher.group(); } Matcher termMatcher = termPattern.matcher(courseIdTerm); // term if (termMatcher.find(courseIdMatcher.end())) { term = Term.parseTerm(termMatcher.group()); } setDateTimeLocation(columns.get(2).text(), columns.get(3) .text()); isRegistered = false; } } } else { if (columns.size() >= 5 && columns.get(4).select("input").size() == 1) { Matcher courseIdTermMatcher = courseIdTermPattern .matcher(columns.get(0).text()); // (courseId, term) if (courseIdTermMatcher.find()) { String courseIdTerm = courseIdTermMatcher.group(); title = columns.get(0).text() .substring(0, courseIdTermMatcher.start()); Matcher courseIdMatcher = courseIdPattern .matcher(courseIdTerm); // courseId if (courseIdMatcher.find()) { courseId = courseIdMatcher.group(); } Matcher termMatcher = termPattern.matcher(courseIdTerm); // term if (termMatcher.find(courseIdMatcher.end())) { term = Term.parseTerm(termMatcher.group()); } setDateTimeLocation(columns.get(1).text(), columns.get(2) .text()); isRegistered = (columns.get(0) .getElementsByClass("assignment-inactive").size() == 0); } } } } private void setDateTimeLocation(String dateStr, String timeLocationStr) throws ParseException { String[] splitted = timeLocationStr.split("\\/"); String time = ""; String startTime = ""; String endTime = ""; String location = ""; try { if (splitted.length > 1) { time = extractTimeString(splitted[0]); location = splitted[1]; } else { time = extractTimeString(splitted[0]); } } catch (Exception e) { // TODO: REMOVE EXCEPTION HANDLING HERE BECAUSE NO EXCEPTION THROWN? // Log.e(TAG, "cant parse string", e); // Analytics.sendException(c, e, false, timeLocation); } int mSign = time.indexOf("-"); startTime = time.substring(0, mSign - 1); endTime = time.substring(mSign + 1); this.location = location; this.dtStart = Parser.parseDateWithTime(dateStr + startTime, Parser.FAILED_PARSING_START_DATE_WITH_TIME); this.dtEnd = Parser.parseDateWithTime(dateStr + endTime, Parser.FAILED_PARSING_END_DATE_WITH_TIME); } private String extractTimeString(String time) { List<String> times = new ArrayList<>(); // extract times Matcher timeMatcher = timePattern.matcher(time); while (timeMatcher.find()) { times.add(timeMatcher.group()); } // remove duplicates int i = 0; while (i < times.size() - 1) { if (times.get(i).equals(times.get(i + 1))) { times.remove(i + 1); } else { i++; } } // create new time string String result = ""; for (String s : times) { if (!result.isEmpty()) { result += " - "; } result += s; } return result; } public boolean isInitialized() { return !this.courseId.isEmpty() && !TextUtils.isEmpty(this.term) && this.dtStart != null && this.dtEnd != null; } public void addAdditionalInfo(Element element) { // TODO Auto-generated method stub } public String getCourseId() { return courseId; } public Term getTerm() { return term; } public Date getDtStart() { return dtStart; } public Date getDtEnd() { return dtEnd; } public String getLocation() { return location; } public String getTitle() { return title; } public int getCid() { return cid; } public String getDescription() { return description; } public String getInfo() { return info; } public boolean isRegistered() { return isRegistered; } public int getMaxParticipants() { return maxParticipants; } public int getParticipants() { return participants; } public Date getRegistrationDtStart() { return registrationDtStart; } public Date getRegistrationDtEnd() { return registrationDtEnd; } public Date getUnRegistrationDt() { return unregistrationDt; } }