the /timetable request needs a week now

This commit is contained in:
Jannik 2019-03-15 23:57:31 +01:00
parent f2c1f2bc58
commit ecfc1356ee
2 changed files with 22 additions and 25 deletions

View File

@ -38,6 +38,7 @@ import java.net.HttpURLConnection
import java.net.URL import java.net.URL
import java.time.LocalDateTime import java.time.LocalDateTime
import java.util.* import java.util.*
import kotlin.collections.ArrayList
import kotlin.concurrent.scheduleAtFixedRate import kotlin.concurrent.scheduleAtFixedRate
@RestController @RestController
@ -56,7 +57,7 @@ class APIController {
private var coursesLinkList = ArrayList<Course>() private var coursesLinkList = ArrayList<Course>()
private var coursesLastUpdate: Long = 0 private var coursesLastUpdate: Long = 0
private var timetableList = ArrayList<TimetableCourse>() // this list contains all timetables private var timetableList = ArrayList<TimetableCourseWeek>() // this list contains all timetables
private var mensaCurrentWeek = MensaWeek() private var mensaCurrentWeek = MensaWeek()
private var mensaNextWeek = MensaWeek() private var mensaNextWeek = MensaWeek()
@ -95,10 +96,13 @@ class APIController {
} }
@RequestMapping("/timetable") @RequestMapping("/timetable")
fun timetable(@RequestParam(value = "courseName", defaultValue = "AI4") courseName: String): TimetableCourse { fun timetable(
@RequestParam(value = "courseName", defaultValue = "AI4") courseName: String,
@RequestParam(value = "week", defaultValue = "0") week: Int
): TimetableCourseWeek {
logger.info("timetable request at ${LocalDateTime.now()}!") logger.info("timetable request at ${LocalDateTime.now()}!")
checkTimetableCourse(courseName) // check if we need to update and perform the update if so checkTimetableCourse(courseName, week) // check if we need to update and perform the update if so
return timetableList.stream().filter { x -> x.meta.courseName == courseName }.findAny().orElse(null) return timetableList.stream().filter { x -> x.meta.courseName == courseName && x.meta.week == week }.findAny().orElse(null)
} }
@RequestMapping("/status") @RequestMapping("/status")
@ -163,10 +167,9 @@ class APIController {
*/ */
private fun asyncUpdateTimetables() = GlobalScope.launch { private fun asyncUpdateTimetables() = GlobalScope.launch {
timetableList.forEach { timetableCourse -> timetableList.forEach { timetableCourse ->
val updateURL = timetableCourse.meta.courseLink val updateURL = timetableCourse.meta.link
timetableCourse.currentWeek = TimetableParser().getTimeTable(updateURL) timetableCourse.timetable = TimetableParser().getTimeTable(updateURL)
timetableCourse.nextWeek = TimetableParser().getTimeTable(updateURL.replace("week=0","week=1")) timetableCourse.meta.updateTime = System.currentTimeMillis() / 1000
timetableCourse.meta.time = System.currentTimeMillis() / 1000
} }
logger.info("updated ${timetableList.size} timetables successful!") logger.info("updated ${timetableList.size} timetables successful!")
} }
@ -176,32 +179,26 @@ class APIController {
* during the update process the old data will be returned for a API request * during the update process the old data will be returned for a API request
* update if the last update was 6 hours ago * update if the last update was 6 hours ago
*/ */
private fun checkTimetableCourse(courseName: String) = runBlocking { private fun checkTimetableCourse(courseName: String, week: Int) = runBlocking {
val currentTime = System.currentTimeMillis() / 1000 val currentTime = System.currentTimeMillis() / 1000
var currentWeek = TimetableWeek() var timetable = TimetableWeek()
var nextWeek = TimetableWeek()
// check if the timetable already exists and is up to date // check if the timetable already exists and is up to date
val result = timetableList.stream().filter { x -> x.meta.courseName == courseName }.findAny().orElse(null) val result = timetableList.stream().filter { x -> x.meta.courseName == courseName && x.meta.week == week }.findAny().orElse(null)
when (result) { when (result) {
// there is no such course yet, create one // there is no such course yet, create one
null -> { null -> {
val courseLink = coursesLinkList.stream().filter { x -> x.courseName == courseName }.findFirst().orElse(null).courseLink val courseLink = coursesLinkList.stream().filter { x -> x.courseName == courseName }.findFirst().orElse(null).courseLink
val timetableMeta = TimetableMeta(courseName, courseLink, currentTime) val timetableMeta = TimetableCourseMeta(currentTime, courseName, week, courseLink.replace("week=0","week=$week"))
val jobCurrent = GlobalScope.async { val jobTimetable = GlobalScope.async {
currentWeek = TimetableParser().getTimeTable(courseLink) timetable = TimetableParser().getTimeTable(timetableMeta.link)
} }
val jobNext = GlobalScope.async { jobTimetable.await()
nextWeek = TimetableParser().getTimeTable(courseLink.replace("week=0","week=1"))
}
jobCurrent.await() timetableList.add(TimetableCourseWeek(timetableMeta, timetable))
jobNext.await() logger.info("added new timetable for $courseName, week $week")
timetableList.add(TimetableCourse(timetableMeta, currentWeek, nextWeek))
logger.info("added new timetable for $courseName")
} }
} }
} }

View File

@ -56,9 +56,9 @@ data class TimetableDay(val timeslots: Array<ArrayList<Lesson>> = Array(6) { Arr
data class TimetableWeek(val days: Array<TimetableDay> = Array(6) { TimetableDay() }) data class TimetableWeek(val days: Array<TimetableDay> = Array(6) { TimetableDay() })
data class TimetableMeta(val courseName: String, val courseLink: String, var time: Long) data class TimetableCourseMeta(var updateTime: Long, val courseName: String, val week: Int, val link: String)
data class TimetableCourse(val meta: TimetableMeta, var currentWeek: TimetableWeek, var nextWeek: TimetableWeek) data class TimetableCourseWeek(val meta: TimetableCourseMeta, var timetable: TimetableWeek)
// data classes for the status part // data classes for the status part