@ -22,6 +22,7 @@
package org.mosad.thecitadelofricks.controller
import com.google.gson.Gson
import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.async
import kotlinx.coroutines.launch
@ -32,6 +33,9 @@ import org.mosad.thecitadelofricks.hsoparser.MensaParser
import org.mosad.thecitadelofricks.hsoparser.TimetableParser
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import java.io.BufferedWriter
import java.io.File
import java.io.FileWriter
import java.util.*
import java.util.concurrent.Executors
import kotlin.collections.ArrayList
@ -59,7 +63,7 @@ class CacheController {
* get a timetable , since they may not cached , we need to make sure it ' s cached , otherwise download
* @param courseName the name of the course to be requested
* @param weekIndex request week number ( current week = 0 )
* @return t he timetable of a course ( courseName )
* @return t imetable of the course ( Type : [ TimetableCourseWeek ] )
* /
fun getTimetable ( courseName : String , weekIndex : Int ) : TimetableCourseWeek = runBlocking {
val currentTime = System . currentTimeMillis ( ) / 1000
@ -81,17 +85,11 @@ class CacheController {
jobTimetable . await ( )
timetableList . add (
TimetableCourseWeek (
TimetableCourseMeta (
currentTime ,
courseName ,
weekIndex ,
weekNumberYear ,
timetableLink
) ,
TimetableCourseWeek ( TimetableCourseMeta ( currentTime , courseName , weekIndex , weekNumberYear , timetableLink ) ,
timetable
)
)
logger . info ( " added new timetable for $courseName , week $weekIndex " )
}
}
@ -122,7 +120,7 @@ class CacheController {
* @param courseName the name of the course to be requested
* @param lessonSubject the lesson subject to be requested
* @param weekIndex request week number ( current week = 0 )
* @return a ArrayList of every lesson with lessonSubject for one week
* @return a ArrayList < [ Lesson ] > of every lesson with lessonSubject for one week
* /
fun getLesson ( courseName : String , lessonSubject : String , weekIndex : Int ) : ArrayList < Lesson > {
val lessonList = ArrayList < Lesson > ( )
@ -130,14 +128,14 @@ class CacheController {
// get all lessons from the weeks timetable
val flatMap = getTimetable ( courseName , weekIndex ) . timetable . days . flatMap { it . timeslots . asIterable ( ) }
flatMap . forEach {
// TODO Java 11
//it.stream().filter { x -> x.lessonSubject.contains(lessonSubject) }.findAny().ifPresent { x -> println("${x.lessonSubject}, ${x.lessonTeacher}") }
it . forEach { lesson ->
if ( lesson . lessonSubject . contains ( lessonSubject ) ) {
lessonList . add ( lesson )
}
}
// TODO Java 11
//it.stream().filter { x -> x.lessonSubject.contains(lessonSubject) }.findAny().ifPresent { x -> println("${x.lessonSubject}, ${x.lessonTeacher}") }
}
return lessonList
@ -149,10 +147,10 @@ class CacheController {
* during the update process the old data will be returned for a API request
* /
private fun asyncUpdateCourseList ( ) = GlobalScope . launch {
CourseListParser ( ) . getCourseLinks ( StartupController . getCourseListURL( ) ) ?. let {
CourseListParser ( ) . getCourseLinks ( StartupController . courseListURL ) ?. let {
courseList = CourseList (
CourseMeta ( System . currentTimeMillis ( ) / 1000 , it . size ) , it
)
)
}
logger . info ( " updated courses successful at ${Date(courseList.meta.updateTime * 1000)} " )
@ -163,13 +161,13 @@ class CacheController {
* during the update process the old data will be returned for a API request
* /
private fun asyncUpdateMensa ( ) = GlobalScope . launch {
val mensaCurrentWeek = MensaParser ( ) . getMensaMenu ( StartupController . getMensaMenuURL( ) )
val mensaNextWeek = MensaParser ( ) . getMensaMenu ( MensaParser ( ) . getMenuLinkNextWeek ( StartupController . getMensaMenuURL( ) ) )
val mensaCurrentWeek = MensaParser ( ) . getMensaMenu ( StartupController . mensaMenuURL )
val mensaNextWeek = MensaParser ( ) . getMensaMenu ( MensaParser ( ) . getMenuLinkNextWeek ( StartupController . mensaMenuURL ) )
// only update if we get valid data
if ( mensaCurrentWeek != null && mensaNextWeek != null ) {
mensaMenu = MensaMenu (
MensaMeta ( System . currentTimeMillis ( ) / 1000 , StartupController . getMensaName( ) ) , mensaCurrentWeek , mensaNextWeek
MensaMeta ( System . currentTimeMillis ( ) / 1000 , StartupController . mensaName ) , mensaCurrentWeek , mensaNextWeek
)
}
@ -192,6 +190,8 @@ class CacheController {
executor . execute {
timetableCourse . timetable = TimetableParser ( ) . getTimeTable ( timetableCourse . meta . link )
timetableCourse . meta . updateTime = System . currentTimeMillis ( ) / 1000
saveTimetableToCache ( timetableCourse ) // save the updated timetable to the cache directory
}
}
@ -202,6 +202,20 @@ class CacheController {
}
}
/ * *
* save a timetable to the cache directory
* this is only call on async updates , it is NOT call when first getting the timetable
* @param timetable a timetable of the type [ TimetableCourseWeek ]
* /
private fun saveTimetableToCache ( timetable : TimetableCourseWeek ) {
println ( timetable . timetable . toString ( ) )
val file = File ( StartupController . dirTcorCache , " timetable- ${timetable.meta.courseName} - ${timetable.meta.weekIndex} .json " )
val writer = BufferedWriter ( FileWriter ( file ) )
writer . write ( Gson ( ) . toJson ( timetable ) )
writer . close ( )
}
/ * *
* before the APIController is up , get the data fist
* runBlocking : otherwise the api would return no data to requests for a few seconds after startup
@ -209,7 +223,7 @@ class CacheController {
private fun initUpdates ( ) = runBlocking {
// get all courses on startup
val jobCourseUpdate = GlobalScope . async {
CourseListParser ( ) . getCourseLinks ( StartupController . getCourseListURL( ) ) ?. let {
CourseListParser ( ) . getCourseLinks ( StartupController . courseListURL ) ?. let {
courseList = CourseList (
CourseMeta ( System . currentTimeMillis ( ) / 1000 , it . size ) , it
)
@ -218,13 +232,13 @@ class CacheController {
// get the current and next weeks mensa menus
val jobMensa = GlobalScope . async {
val mensaCurrentWeek = MensaParser ( ) . getMensaMenu ( StartupController . getMensaMenuURL( ) )
val mensaNextWeek = MensaParser ( ) . getMensaMenu ( MensaParser ( ) . getMenuLinkNextWeek ( StartupController . getMensaMenuURL( ) ) )
val mensaCurrentWeek = MensaParser ( ) . getMensaMenu ( StartupController . mensaMenuURL )
val mensaNextWeek = MensaParser ( ) . getMensaMenu ( MensaParser ( ) . getMenuLinkNextWeek ( StartupController . mensaMenuURL ) )
// only update if we get valid data
if ( mensaCurrentWeek != null && mensaNextWeek != null ) {
mensaMenu = MensaMenu (
MensaMeta ( System . currentTimeMillis ( ) / 1000 , StartupController . getMensaName( ) ) , mensaCurrentWeek , mensaNextWeek
MensaMeta ( System . currentTimeMillis ( ) / 1000 , StartupController . mensaName ) , mensaCurrentWeek , mensaNextWeek
)
}
}
@ -236,8 +250,8 @@ class CacheController {
}
/ * *
* update the CourseList every 24 h , the Timetables every 3 h and the Mensa Menu every hour
* doesn ' t account the change between winter and summer time !
*
* /
private fun scheduledUpdates ( ) {
val currentTime = System . currentTimeMillis ( )
@ -261,7 +275,7 @@ class CacheController {
}
// post to status.mosad.xyz every hour, if an API key is present
if ( StartupController . getCachetAPIKey( ) != " 0 " ) {
if ( StartupController . cachetAPIKey != " 0 " ) {
Timer ( ) . scheduleAtFixedRate ( initDelay1h , 3600000 ) {
CachetAPIController . postTotalRequests ( )
}