diff --git a/backend/build.gradle b/backend/build.gradle index 721ed675a..03b4e0800 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -113,6 +113,7 @@ dependencies { ///// Kotlin implementation group: 'org.jetbrains.kotlin', name: 'kotlin-stdlib', version: version_kotlin implementation group: 'org.jetbrains.kotlin', name: 'kotlin-reflect', version: version_kotlin + implementation group: 'org.jetbrains.kotlinx', name:'kotlinx-serialization-json', version: '1.6.2' } kapt { diff --git a/backend/src/main/kotlin/dev/dres/api/rest/KotlinxJsonMapper.kt b/backend/src/main/kotlin/dev/dres/api/rest/KotlinxJsonMapper.kt new file mode 100644 index 000000000..628f23c3d --- /dev/null +++ b/backend/src/main/kotlin/dev/dres/api/rest/KotlinxJsonMapper.kt @@ -0,0 +1,42 @@ +package dev.dres.api.rest + +import com.fasterxml.jackson.core.type.TypeReference +import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper +import io.javalin.json.JsonMapper +import kotlinx.serialization.KSerializer +import kotlinx.serialization.SerializationException +import kotlinx.serialization.json.Json +import kotlinx.serialization.serializer +import java.lang.reflect.Type + +object KotlinxJsonMapper : JsonMapper { + + private val fallbackMapper = jacksonObjectMapper() + + override fun fromJsonString(json: String, targetType: Type): T { + + return try { + @Suppress("UNCHECKED_CAST") + val serializer = serializer(targetType) as KSerializer + Json.decodeFromString(serializer, json) + } catch (e: SerializationException) { + null + } catch (e: IllegalStateException) { + null + } ?: fallbackMapper.readValue(json, fallbackMapper.typeFactory.constructType(targetType)) + + } + + override fun toJsonString(obj: Any, type: Type): String { + + return try { + val serializer = serializer(type) + Json.encodeToString(serializer, obj) + } catch (e: SerializationException) { + null + } catch (e: IllegalStateException) { + null + } ?: fallbackMapper.writeValueAsString(obj) + + } +} \ No newline at end of file diff --git a/backend/src/main/kotlin/dev/dres/api/rest/RestApi.kt b/backend/src/main/kotlin/dev/dres/api/rest/RestApi.kt index 9d1de820f..b14d85bcf 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/RestApi.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/RestApi.kt @@ -226,6 +226,9 @@ object RestApi { ) javalin = Javalin.create { + + it.jsonMapper(KotlinxJsonMapper) + it.plugins.enableCors { cors -> cors.add { corsPluginConfig -> corsPluginConfig.reflectClientOrigin = @@ -381,8 +384,8 @@ object RestApi { private val pool = QueuedThreadPool( - min(Runtime.getRuntime().availableProcessors() * 2, 8), - 8, + 32, + 10, 60000, -1, null, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/handler/system/LoginHandler.kt b/backend/src/main/kotlin/dev/dres/api/rest/handler/system/LoginHandler.kt index 9678086ce..63764678c 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/handler/system/LoginHandler.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/handler/system/LoginHandler.kt @@ -16,6 +16,7 @@ import io.javalin.http.BadRequestResponse import io.javalin.http.Context import io.javalin.openapi.* import jetbrains.exodus.database.TransientEntityStore +import kotlinx.serialization.Serializable /** * A [PostRestHandler] that handles user-requests to login. @@ -28,6 +29,7 @@ class LoginHandler() : RestHandler, PostRestHandler { override val route = "login" override val apiVersion = RestApi.LATEST_API_VERSION + @Serializable data class LoginRequest(var username: String, var password: String) @OpenApi( diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/collection/ApiMediaItem.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/collection/ApiMediaItem.kt index 73de65f91..73162a701 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/collection/ApiMediaItem.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/collection/ApiMediaItem.kt @@ -5,6 +5,7 @@ import dev.dres.data.model.media.* import kotlinx.dnq.query.filter import kotlinx.dnq.query.first import kotlinx.dnq.util.findById +import kotlinx.serialization.Serializable /** * The RESTful API equivalent for [DbMediaItem]. @@ -13,6 +14,7 @@ import kotlinx.dnq.util.findById * @author Ralph Gasser * @version 1.1.0 */ +@Serializable data class ApiMediaItem( override val mediaItemId: MediaItemId, override val name: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/collection/ApiMediaItemMetaDataEntry.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/collection/ApiMediaItemMetaDataEntry.kt index 568ea37fe..2f643ae82 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/collection/ApiMediaItemMetaDataEntry.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/collection/ApiMediaItemMetaDataEntry.kt @@ -1,3 +1,6 @@ package dev.dres.api.rest.types.collection +import kotlinx.serialization.Serializable + +@Serializable data class ApiMediaItemMetaDataEntry(val key: String, val value: String) diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/collection/time/ApiTemporalPoint.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/collection/time/ApiTemporalPoint.kt index 9dd6aea19..06957e2da 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/collection/time/ApiTemporalPoint.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/collection/time/ApiTemporalPoint.kt @@ -1,6 +1,7 @@ package dev.dres.api.rest.types.collection.time import dev.dres.data.model.media.time.TemporalPoint +import kotlinx.serialization.Serializable /** * RESTful API representation of a [TemporalPoint]. @@ -8,6 +9,7 @@ import dev.dres.data.model.media.time.TemporalPoint * @version 1.0.0 * @author Ralph Gasser */ +@Serializable data class ApiTemporalPoint(val value: String, val unit: ApiTemporalUnit) { companion object{ diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/collection/time/ApiTemporalRange.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/collection/time/ApiTemporalRange.kt index cf6c4e35d..b6e818eb1 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/collection/time/ApiTemporalRange.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/collection/time/ApiTemporalRange.kt @@ -1,6 +1,7 @@ package dev.dres.api.rest.types.collection.time import dev.dres.data.model.media.time.TemporalRange +import kotlinx.serialization.Serializable /** * RESTful API representation of a [TemporalRange]. @@ -8,6 +9,7 @@ import dev.dres.data.model.media.time.TemporalRange * @version 1.0.0 * @author Ralph Gasser */ +@Serializable data class ApiTemporalRange(val start: ApiTemporalPoint, val end: ApiTemporalPoint) { constructor(range: TemporalRange) : this(ApiTemporalPoint.fromTemporalPoint(range.start), ApiTemporalPoint.fromTemporalPoint(range.end)) fun toTemporalRange(fps: Float): TemporalRange = TemporalRange(start.toTemporalPoint(fps), end.toTemporalPoint(fps)) diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiClientEvaluationInfo.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiClientEvaluationInfo.kt index 4426b343b..8ccaf196d 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiClientEvaluationInfo.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiClientEvaluationInfo.kt @@ -5,11 +5,13 @@ import dev.dres.run.InteractiveAsynchronousRunManager import dev.dres.run.InteractiveSynchronousRunManager import dev.dres.run.NonInteractiveRunManager import dev.dres.run.RunManager +import kotlinx.serialization.Serializable /** * Contains the basic and most importantly static information about a [RunManager] that is relevant to a participant. * */ +@Serializable data class ApiClientEvaluationInfo( val id: String, val name: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiClientTaskTemplateInfo.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiClientTaskTemplateInfo.kt index 7a042a686..b03b3680b 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiClientTaskTemplateInfo.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiClientTaskTemplateInfo.kt @@ -2,10 +2,12 @@ package dev.dres.api.rest.types.evaluation import dev.dres.api.rest.types.template.tasks.ApiTaskTemplate import dev.dres.data.model.template.task.DbTaskTemplate +import kotlinx.serialization.Serializable /** * Basic and most importantly static information about a [DbTaskTemplate] relevant to the participant. */ +@Serializable data class ApiClientTaskTemplateInfo( val name: String, val taskGroup: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluation.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluation.kt index 358efc606..377136ca3 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluation.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluation.kt @@ -4,6 +4,7 @@ import dev.dres.api.rest.types.template.ApiEvaluationTemplate import dev.dres.data.model.run.DbEvaluation import dev.dres.data.model.run.interfaces.Evaluation import dev.dres.data.model.run.interfaces.EvaluationId +import kotlinx.serialization.Serializable /** * The RESTful API equivalent of a [DbEvaluation]. @@ -12,6 +13,7 @@ import dev.dres.data.model.run.interfaces.EvaluationId * @author Ralph Gasser * @version 2.0.0 */ +@Serializable data class ApiEvaluation( override val evaluationId: EvaluationId, val name: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationInfo.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationInfo.kt index a250552ba..18833e56a 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationInfo.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationInfo.kt @@ -5,6 +5,7 @@ import dev.dres.run.InteractiveAsynchronousRunManager import dev.dres.run.InteractiveSynchronousRunManager import dev.dres.run.NonInteractiveRunManager import dev.dres.run.RunManager +import kotlinx.serialization.Serializable /** * Contains the basic and most importantly static information about a [RunManager]. @@ -14,6 +15,7 @@ import dev.dres.run.RunManager * @author Ralph Gasser * @version 1.1.0 */ +@Serializable data class ApiEvaluationInfo( val id: String, val name: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationOverview.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationOverview.kt index cb93b299f..1c0ffbf66 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationOverview.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationOverview.kt @@ -1,7 +1,9 @@ package dev.dres.api.rest.types.evaluation import dev.dres.run.* +import kotlinx.serialization.Serializable +@Serializable data class ApiEvaluationOverview(val state: RunManagerStatus, val teamOverviews: List) { companion object { fun of(manager: InteractiveRunManager): ApiEvaluationOverview { diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationState.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationState.kt index 89c9f3a7a..bda41113c 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationState.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiEvaluationState.kt @@ -2,6 +2,7 @@ package dev.dres.api.rest.types.evaluation import dev.dres.data.model.run.RunActionContext import dev.dres.run.* +import kotlinx.serialization.Serializable /** * Contains the information about the state of an [InteractiveRunManager]. @@ -10,6 +11,7 @@ import dev.dres.run.* * * @version 1.3.0 */ +@Serializable data class ApiEvaluationState( val evaluationId: String, val evaluationStatus: ApiEvaluationStatus, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiOverrideAnswerSetVerdictDto.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiOverrideAnswerSetVerdictDto.kt index a0b7e0c45..e8d1eca42 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiOverrideAnswerSetVerdictDto.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiOverrideAnswerSetVerdictDto.kt @@ -1,6 +1,7 @@ package dev.dres.api.rest.types.evaluation import dev.dres.api.rest.types.evaluation.submission.ApiVerdictStatus +import kotlinx.serialization.Serializable /** * Data transfer object for overriding a [ApiAnswerSet]'s verdict. @@ -9,4 +10,5 @@ import dev.dres.api.rest.types.evaluation.submission.ApiVerdictStatus * @author Loris Sauter * @version 1.0 */ +@Serializable data class ApiOverrideAnswerSetVerdictDto(val verdict: ApiVerdictStatus) diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiSubmissionInfo.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiSubmissionInfo.kt index 6a1c80558..feecea5e5 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiSubmissionInfo.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiSubmissionInfo.kt @@ -3,6 +3,7 @@ package dev.dres.api.rest.types.evaluation import dev.dres.api.rest.types.evaluation.submission.ApiSubmission import dev.dres.data.model.run.interfaces.EvaluationId import dev.dres.data.model.template.TemplateId +import kotlinx.serialization.Serializable /** * Encodes [ApiSubmission] data for a specific [EvaluationId] and (optionally) [EvaluationId]. @@ -10,4 +11,5 @@ import dev.dres.data.model.template.TemplateId * @author Loris Sauter * @version 1.1.0 */ +@Serializable data class ApiSubmissionInfo(val evaluationId: EvaluationId, val taskId: TemplateId, val submissions: List) diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTask.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTask.kt index 6f6e7603f..031a98888 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTask.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTask.kt @@ -4,6 +4,7 @@ import dev.dres.api.rest.types.evaluation.submission.ApiAnswerSet import dev.dres.data.model.run.DbTask import dev.dres.data.model.run.TaskId import dev.dres.data.model.template.TemplateId +import kotlinx.serialization.Serializable /** * The RESTful API equivalent of a [DbTask]. @@ -12,6 +13,7 @@ import dev.dres.data.model.template.TemplateId * @author Ralph Gasser * @version 2.0.0 */ +@Serializable data class ApiTask( val taskId: TaskId, val templateId: TemplateId, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTaskOverview.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTaskOverview.kt index d5a7db493..0099f8ce8 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTaskOverview.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTaskOverview.kt @@ -1,7 +1,9 @@ package dev.dres.api.rest.types.evaluation import dev.dres.data.model.run.interfaces.TaskRun +import kotlinx.serialization.Serializable +@Serializable data class ApiTaskOverview( val id: String, val name: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTaskTemplateInfo.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTaskTemplateInfo.kt index 76c14a88b..11aa5f2ad 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTaskTemplateInfo.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTaskTemplateInfo.kt @@ -2,6 +2,7 @@ package dev.dres.api.rest.types.evaluation import dev.dres.api.rest.types.template.tasks.ApiTaskTemplate import dev.dres.data.model.template.task.DbTaskTemplate +import kotlinx.serialization.Serializable /** * Basic and most importantly static information about a [DbTaskTemplate]. @@ -11,6 +12,7 @@ import dev.dres.data.model.template.task.DbTaskTemplate * @author Ralph Gasser & Loris Sauter * @version 1.2.0 */ +@Serializable data class ApiTaskTemplateInfo( val templateId: String, val name: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTeamInfo.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTeamInfo.kt index f5205c964..a45746ffb 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTeamInfo.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTeamInfo.kt @@ -4,6 +4,7 @@ import dev.dres.api.rest.types.template.team.ApiTeam import dev.dres.data.model.template.team.DbTeam import dev.dres.data.model.run.InteractiveSynchronousEvaluation import dev.dres.data.model.template.team.TeamId +import kotlinx.serialization.Serializable /** * Basic and most importantly static information about the [DbTeam] partaking in a [InteractiveSynchronousEvaluation]. @@ -13,6 +14,8 @@ import dev.dres.data.model.template.team.TeamId * @author Ralph Gasser * @version 1.1.0 */ + +@Serializable data class ApiTeamInfo(val id: TeamId, val name: String, val color: String) { constructor(team: ApiTeam) : this(team.id!!, team.name!!, team.color!!) } \ No newline at end of file diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTeamTaskOverview.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTeamTaskOverview.kt index 755bc4f85..8cdcc67ea 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTeamTaskOverview.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiTeamTaskOverview.kt @@ -1,3 +1,6 @@ package dev.dres.api.rest.types.evaluation +import kotlinx.serialization.Serializable + +@Serializable data class ApiTeamTaskOverview(val teamId: String, val tasks: List) diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiViewerInfo.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiViewerInfo.kt index aa2be6e61..1740639a4 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiViewerInfo.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/ApiViewerInfo.kt @@ -1,9 +1,12 @@ package dev.dres.api.rest.types.evaluation +import kotlinx.serialization.Serializable + /** * Basic information regarding a viewer instance * * @author Ralph Gasser * @version 1.1.0 */ +@Serializable data class ApiViewerInfo(val viewersId: String, val username: String, val host: String, val ready: Boolean) \ No newline at end of file diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiAnswer.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiAnswer.kt index d2078dac4..88de48504 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiAnswer.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiAnswer.kt @@ -3,6 +3,7 @@ package dev.dres.api.rest.types.evaluation.submission import dev.dres.api.rest.types.collection.ApiMediaItem import dev.dres.data.model.submissions.Answer import dev.dres.data.model.submissions.AnswerType +import kotlinx.serialization.Serializable /** * The RESTful API equivalent for the type of answer as submitted by the DRES endpoint. @@ -13,6 +14,7 @@ import dev.dres.data.model.submissions.AnswerType * @author Ralph Gasser * @version 1.0.0 */ +@Serializable data class ApiAnswer( /** The [ApiAnswerType] of this [ApiAnswer]. */ val type: ApiAnswerType, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiAnswerSet.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiAnswerSet.kt index 3ac0977a4..9c0324d78 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiAnswerSet.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiAnswerSet.kt @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore import dev.dres.data.model.run.TaskId import dev.dres.data.model.submissions.* import io.javalin.openapi.OpenApiIgnore +import kotlinx.serialization.Serializable /** * The RESTful API equivalent for the type of answer set as submitted by the DRES endpoint. @@ -14,6 +15,7 @@ import io.javalin.openapi.OpenApiIgnore * @author Ralph Gasser * @version 1.0.0 */ +@Serializable data class ApiAnswerSet( override val id: AnswerSetId, val status: ApiVerdictStatus, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientAnswer.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientAnswer.kt index e4a2a8ae1..d746c8402 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientAnswer.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientAnswer.kt @@ -8,6 +8,7 @@ import dev.dres.data.model.submissions.DbAnswerType import io.javalin.openapi.OpenApiIgnore import kotlinx.dnq.query.filter import kotlinx.dnq.query.singleOrNull +import kotlinx.serialization.Serializable /** * The RESTful API equivalent of an answer as provided by a client of the submission API endpoints. @@ -17,7 +18,8 @@ import kotlinx.dnq.query.singleOrNull * @author Luca Rossetto * @version 1.0.0 */ -data class ApiClientAnswer( +@Serializable +data class ApiClientAnswer( //TODO add optional relevance score field /** The text that is part of this [ApiClientAnswer]. */ val text: String? = null, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientAnswerSet.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientAnswerSet.kt index 8210ddb97..b91149b61 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientAnswerSet.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientAnswerSet.kt @@ -9,6 +9,7 @@ import io.javalin.openapi.OpenApiIgnore import kotlinx.dnq.query.addAll import kotlinx.dnq.query.filter import kotlinx.dnq.query.first +import kotlinx.serialization.Serializable import java.util.* /** @@ -19,6 +20,7 @@ import java.util.* * @author Luca Rossetto * @version 1.0.0 */ +@Serializable data class ApiClientAnswerSet(var taskId: String? = null, val taskName: String? = null, val answers: List) { /** The [AnswerSetId] of this [ApiClientAnswerSet]. Typically generated by the receiving endpoint. */ diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientSubmission.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientSubmission.kt index 50488ec40..0b2ab1bba 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientSubmission.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiClientSubmission.kt @@ -13,6 +13,7 @@ import kotlinx.dnq.query.addAll import kotlinx.dnq.query.filter import kotlinx.dnq.query.single import kotlinx.dnq.query.singleOrNull +import kotlinx.serialization.Serializable import java.util.UUID /** @@ -23,6 +24,7 @@ import java.util.UUID * @author Luca Rossetto * @version 1.0.0 */ +@Serializable data class ApiClientSubmission( val answerSets: List, /** The [UserId] associated with the submission. Is usually added as contextual information by the receiving endpoint. */ diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiSubmission.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiSubmission.kt index 90a6011ef..5cd3c1dd3 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiSubmission.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/evaluation/submission/ApiSubmission.kt @@ -2,6 +2,7 @@ package dev.dres.api.rest.types.evaluation.submission import dev.dres.data.model.submissions.* +import kotlinx.serialization.Serializable /** * The RESTful API equivalent of a submission as returned by the DRES endpoint. @@ -12,6 +13,7 @@ import dev.dres.data.model.submissions.* * @author Ralph Gasser * @version 2.0.0 */ +@Serializable data class ApiSubmission( override val submissionId: SubmissionId, override val teamId: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/status/AbstractStatus.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/status/AbstractStatus.kt index 50fedbebe..55abeef1c 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/status/AbstractStatus.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/status/AbstractStatus.kt @@ -1,3 +1,6 @@ package dev.dres.api.rest.types.status +import kotlinx.serialization.Serializable + +@Serializable open class AbstractStatus(val status:Boolean){} \ No newline at end of file diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/status/ErrorStatus.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/status/ErrorStatus.kt index 2b0d79813..e6989a892 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/status/ErrorStatus.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/status/ErrorStatus.kt @@ -1,3 +1,6 @@ package dev.dres.api.rest.types.status +import kotlinx.serialization.Serializable + +@Serializable data class ErrorStatus(val description: String): AbstractStatus(status = false) \ No newline at end of file diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/status/ErrorStatusException.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/status/ErrorStatusException.kt index 0e2a84f64..986a851b4 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/status/ErrorStatusException.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/status/ErrorStatusException.kt @@ -1,8 +1,10 @@ package dev.dres.api.rest.types.status import io.javalin.http.Context +import kotlinx.serialization.Serializable import org.slf4j.LoggerFactory +@Serializable data class ErrorStatusException(val statusCode: Int, val status: String, private val ctx: Context, val doNotLog: Boolean = false) : Exception(status) { companion object { private val logger = LoggerFactory.getLogger(this::class.java) diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/status/SuccessStatus.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/status/SuccessStatus.kt index 62c4da38c..00b82be11 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/status/SuccessStatus.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/status/SuccessStatus.kt @@ -1,3 +1,6 @@ package dev.dres.api.rest.types.status +import kotlinx.serialization.Serializable + +@Serializable data class SuccessStatus(val description: String): AbstractStatus(status = true) \ No newline at end of file diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/status/SuccessfulSubmissionsStatus.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/status/SuccessfulSubmissionsStatus.kt index ac78a7a21..62c74310b 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/status/SuccessfulSubmissionsStatus.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/status/SuccessfulSubmissionsStatus.kt @@ -1,5 +1,7 @@ package dev.dres.api.rest.types.status import dev.dres.api.rest.types.evaluation.submission.ApiVerdictStatus +import kotlinx.serialization.Serializable +@Serializable data class SuccessfulSubmissionsStatus(val submission: ApiVerdictStatus, val description: String) : AbstractStatus(status = true) diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/template/ApiEvaluationTemplate.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/template/ApiEvaluationTemplate.kt index a9dd482e8..951bf1285 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/template/ApiEvaluationTemplate.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/template/ApiEvaluationTemplate.kt @@ -10,6 +10,7 @@ import dev.dres.data.model.admin.UserId import dev.dres.data.model.template.DbEvaluationTemplate import dev.dres.data.model.template.TemplateId import io.javalin.openapi.OpenApiIgnore +import kotlinx.serialization.Serializable /** * The RESTful API equivalent for [DbEvaluationTemplate]. @@ -18,6 +19,7 @@ import io.javalin.openapi.OpenApiIgnore * @author Luca Rossetto & Ralph Gasser * @version 2.0.0 */ +@Serializable data class ApiEvaluationTemplate( val id: TemplateId, val name: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiHint.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiHint.kt index 519e2a415..4d95f38d5 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiHint.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiHint.kt @@ -2,6 +2,7 @@ package dev.dres.api.rest.types.template.tasks import dev.dres.api.rest.types.collection.time.ApiTemporalRange import dev.dres.data.model.template.* +import kotlinx.serialization.Serializable /** * The RESTful API equivalent for [TaskDescriptionHint]. @@ -9,6 +10,7 @@ import dev.dres.data.model.template.* * @author Luca Rossetto & Ralph Gasser & Loris Sauter * @version 2.1.0 */ +@Serializable data class ApiHint( /** * The type of this component diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTarget.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTarget.kt index 88c4dd478..4769ab6d7 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTarget.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTarget.kt @@ -2,6 +2,7 @@ package dev.dres.api.rest.types.template.tasks import dev.dres.api.rest.types.collection.time.ApiTemporalRange import dev.dres.data.model.template.task.DbTaskTemplateTarget +import kotlinx.serialization.Serializable /** * The RESTful API equivalent for [DbTaskTemplateTarget]. @@ -9,6 +10,7 @@ import dev.dres.data.model.template.task.DbTaskTemplateTarget * @author Luca Rossetto & Ralph Gasser & Loris Sauter * @version 1.1.0 */ +@Serializable data class ApiTarget( val type: ApiTargetType, /** diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskGroup.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskGroup.kt index 5711b842a..8c4faf3f4 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskGroup.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskGroup.kt @@ -1,6 +1,7 @@ package dev.dres.api.rest.types.template.tasks import dev.dres.data.model.template.task.DbTaskGroup +import kotlinx.serialization.Serializable /** * The RESTful API equivalent of a [DbTaskGroup]. @@ -8,4 +9,5 @@ import dev.dres.data.model.template.task.DbTaskGroup * @author Ralph Gasser * @version 1.0.0 */ +@Serializable data class ApiTaskGroup(val id: String?,val name: String, val type: String) diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskTemplate.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskTemplate.kt index 10cee7691..bcf61c0d5 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskTemplate.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskTemplate.kt @@ -8,6 +8,7 @@ import dev.dres.data.model.template.TemplateId import dev.dres.data.model.template.task.TaskTemplate import dev.dres.data.model.template.task.TaskTemplateId import io.javalin.openapi.OpenApiIgnore +import kotlinx.serialization.Serializable /** * The RESTful API equivalent for [DbTaskTemplate]. @@ -16,6 +17,7 @@ import io.javalin.openapi.OpenApiIgnore * @author Luca Rossetto & Ralph Gasser * @version 2.0.0 */ +@Serializable data class ApiTaskTemplate( val id: TaskTemplateId? = null, val name: String, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskType.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskType.kt index f7f11f417..b0e075a73 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskType.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/template/tasks/ApiTaskType.kt @@ -7,6 +7,7 @@ import com.fasterxml.jackson.databind.ObjectMapper import dev.dres.api.rest.types.template.tasks.options.* import dev.dres.data.model.template.task.DbTaskType import io.javalin.openapi.OpenApiIgnore +import kotlinx.serialization.Serializable import java.nio.file.Files import java.nio.file.Path import java.nio.file.StandardOpenOption @@ -18,6 +19,7 @@ import java.nio.file.StandardOpenOption * @author Ralph Gasser & Loris Sauter * @version 1.1.0 */ +@Serializable data class ApiTaskType( val name: String, val duration: Long, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/template/team/ApiTeam.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/template/team/ApiTeam.kt index e4090fd52..0a0a0d082 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/template/team/ApiTeam.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/template/team/ApiTeam.kt @@ -6,6 +6,7 @@ import dev.dres.api.rest.types.users.ApiUser import dev.dres.data.model.template.team.DbTeam import dev.dres.data.model.template.team.Team import dev.dres.data.model.template.team.TeamId +import kotlinx.serialization.Serializable import java.awt.Image import java.awt.image.BufferedImage import java.io.ByteArrayInputStream @@ -18,6 +19,7 @@ import javax.imageio.ImageIO * @author Loris Sauter * @version 1.0.0 */ +@Serializable data class ApiTeam( val id: TeamId? = null, val name: String? = null, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/template/team/ApiTeamGroup.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/template/team/ApiTeamGroup.kt index b538d4e6d..526e05232 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/template/team/ApiTeamGroup.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/template/team/ApiTeamGroup.kt @@ -3,6 +3,7 @@ package dev.dres.api.rest.types.template.team import dev.dres.data.model.template.team.DbTeamGroup import dev.dres.data.model.template.team.TeamAggregatorImpl import dev.dres.data.model.template.team.TeamGroupId +import kotlinx.serialization.Serializable /** * A RESTful API representation of a [DbTeamGroup] @@ -10,6 +11,7 @@ import dev.dres.data.model.template.team.TeamGroupId * @author Loris Sauter * @version 1.0.0 */ +@Serializable data class ApiTeamGroup( val id: TeamGroupId? = null, val name: String? = null, diff --git a/backend/src/main/kotlin/dev/dres/api/rest/types/users/ApiUser.kt b/backend/src/main/kotlin/dev/dres/api/rest/types/users/ApiUser.kt index b91e7545d..09432170f 100644 --- a/backend/src/main/kotlin/dev/dres/api/rest/types/users/ApiUser.kt +++ b/backend/src/main/kotlin/dev/dres/api/rest/types/users/ApiUser.kt @@ -2,6 +2,7 @@ package dev.dres.api.rest.types.users import dev.dres.data.model.admin.DbUser import dev.dres.data.model.admin.UserId +import kotlinx.serialization.Serializable /** * A RESTful API representation of a [DbUser] @@ -9,4 +10,5 @@ import dev.dres.data.model.admin.UserId * @author Loris Sauter * @version 1.0.0 */ +@Serializable data class ApiUser(val id: UserId? = null, val username: String? = null, val role: ApiRole? = null, var sessionId: String? = null) \ No newline at end of file diff --git a/backend/src/main/kotlin/dev/dres/data/model/run/ApiRunProperties.kt b/backend/src/main/kotlin/dev/dres/data/model/run/ApiRunProperties.kt index 7d0e93ae0..f5ef49c66 100644 --- a/backend/src/main/kotlin/dev/dres/data/model/run/ApiRunProperties.kt +++ b/backend/src/main/kotlin/dev/dres/data/model/run/ApiRunProperties.kt @@ -1,8 +1,11 @@ package dev.dres.data.model.run +import kotlinx.serialization.Serializable + /** * */ +@Serializable data class ApiRunProperties ( val participantCanView: Boolean = true, val shuffleTasks: Boolean = false, //is only used for asynchronous runs diff --git a/backend/src/main/kotlin/dev/dres/run/score/scoreboard/MaxNormalizingScoreBoard.kt b/backend/src/main/kotlin/dev/dres/run/score/scoreboard/MaxNormalizingScoreBoard.kt index 626e45cf1..4357150ed 100644 --- a/backend/src/main/kotlin/dev/dres/run/score/scoreboard/MaxNormalizingScoreBoard.kt +++ b/backend/src/main/kotlin/dev/dres/run/score/scoreboard/MaxNormalizingScoreBoard.kt @@ -7,10 +7,7 @@ import dev.dres.data.model.run.interfaces.EvaluationRun import dev.dres.data.model.template.TemplateId import dev.dres.run.eventstream.EventStreamProcessor import dev.dres.run.eventstream.ScoreUpdateEvent -import dev.dres.utilities.extensions.convertWriteLock -import dev.dres.utilities.extensions.write import java.util.concurrent.locks.ReentrantReadWriteLock -import java.util.concurrent.locks.StampedLock import kotlin.concurrent.read import kotlin.concurrent.write import kotlin.math.max @@ -24,7 +21,7 @@ import kotlin.math.max */ class MaxNormalizingScoreBoard(override val name: String, override val run: EvaluationRun, private val teamIds: List, private val taskFilter: (ApiTaskTemplate) -> Boolean, private val taskGroupName: String? = null, private val maxScoreNormalized: Double = 1000.0) : Scoreboard { - /** A [StampedLock] to synchronise access to this [MaxNormalizingScoreBoard]. */ + /** A [ReentrantReadWriteLock] to synchronise access to this [MaxNormalizingScoreBoard]. */ private val lock = ReentrantReadWriteLock() /** Tracks the score per [TeamId]. */ diff --git a/gradle.properties b/gradle.properties index 92c5c1829..86cd46824 100644 --- a/gradle.properties +++ b/gradle.properties @@ -12,10 +12,10 @@ version_clikt=4.1.0 version_fastutil=8.5.12 version_fuel=2.3.1 version_jaffree=2022.06.03 -version_javalin=5.6.1 +version_javalin=5.6.3 version_jline3=3.22.0 version_junit=5.9.1 -version_kotlin=1.8.10 +version_kotlin=1.8.22 version_kotlin_csv=1.9.1 version_log4j=2.20.0 version_picnic=0.6.0