package org.voidsink.kussslib.impl;
import java.text.ParseException;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.jsoup.nodes.Element;
import org.voidsink.kussslib.Assessment;
import org.voidsink.kussslib.AssessmentType;
import org.jsoup.select.Elements;
import org.voidsink.kussslib.CourseType;
import org.voidsink.kussslib.Grade;
import org.voidsink.kussslib.Term;
public class AssessmentImpl implements Assessment {
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 Date date;
private String title;
private Term term;
private String courseId;
private Grade grade;
private int cid;
private AssessmentType assessmentType;
private String classCode;
private double ects;
private double sws;
private CourseType courseType;
AssessmentImpl(Date date, String title, Term term, String courseId,
Grade grade, int cid, AssessmentType assessmentType,
String classCode, double ects, double sws, CourseType courseType) {
this.date = date;
this.title = title;
this.term = term;
this.courseId = courseId;
this.grade = grade;
this.cid = cid;
this.assessmentType = assessmentType;
this.classCode = classCode;
this.ects = ects;
this.sws = sws;
this.courseType = courseType;
}
public AssessmentImpl(AssessmentType type, Element row)
throws ParseException {
this(null, "", null, "", null, 0, type, "", 0, 0, null);
final Elements columns = row.getElementsByTag("td");
if (columns.size() >= 7) {
title = columns.get(1).text();
Matcher courseIdTermMatcher = courseIdTermPattern.matcher(title); // (courseId,term)
if (courseIdTermMatcher.find()) {
String courseIdTerm = courseIdTermMatcher.group();
Matcher courseIdMatcher = courseIdPattern.matcher(courseIdTerm); // courseId
if (courseIdMatcher.find()) {
courseId = courseIdMatcher.group();
}
Matcher termMatcher = termPattern.matcher(courseIdTerm);
if (termMatcher.find(courseIdMatcher.end())) {
String termStr = termMatcher.group();
term = Term.parseTerm(termStr);
}
String tmp = title.substring(0, courseIdTermMatcher.start());
if (courseIdTermMatcher.end() <= title.length()) {
String addition = title
.substring(courseIdTermMatcher.end(),
title.length())
.replaceAll("(\\(.*?\\))", "").trim();
if (addition.length() > 0) {
tmp = tmp + " (" + addition + ")";
}
}
title = tmp;
}
title = title.trim(); // title
courseType = CourseType.parseCourseType(columns.get(4).text()); // courseType
date = Parser.parseDate(columns.get(0).text(),
String.format(Parser.FAILED_PARSING_DATE, "issue")); // date
grade = Grade.parseGrade(columns.get(2).text()); // grade
try {
String[] ectsSws = columns.get(5).text().replace(",", ".")
.split("/");
if (ectsSws.length == 2) {
ects = Double.parseDouble(ectsSws[0]);
sws = Double.parseDouble(ectsSws[1]);
}
} catch (NumberFormatException e) {
// TODO: Error position? Oder NumberFormatException weitergeben?
throw new ParseException(String.format(
Parser.FAILED_PARSING_NUMERIC_VALUE, "ects/sws"), 0);
}
try {
String cidText = columns.get(6).text();
if (!TextUtils.isEmpty(cidText)) {
cid = Integer.parseInt(cidText); // curriculum id
}
} catch (NumberFormatException e) {
// TODO: Error position? Oder NumberFormatException weitergeben?
throw new ParseException(String.format(
Parser.FAILED_PARSING_NUMERIC_VALUE, "curriculum id"),
0);
}
classCode = columns.get(3).text();
}
}
// TODO: stimmt das noch so?
public boolean isInitialized() {
return this.assessmentType != null && this.date != null
&& this.grade != null;
}
public Date getDate() {
return date;
}
public String getTitle() {
return title;
}
public Term getTerm() {
return term;
}
public String getCourseId() {
return courseId;
}
public Grade getGrade() {
return grade;
}
public int getCid() {
return cid;
}
public AssessmentType assessmentType() {
return assessmentType;
}
public String getClassCode() {
return classCode;
}
public double getEcts() {
return ects;
}
public double getSws() {
return sws;
}
public CourseType getCourseType() {
return courseType;
}
}