From 62faa2ce9d36fb76494d75c1c6a47f27876503a9 Mon Sep 17 00:00:00 2001 From: Erashin Date: Thu, 2 May 2024 09:01:16 +0200 Subject: [PATCH] core: add unit and kotlin adapters to osrd error adapter --- core/kt-osrd-utils/build.gradle | 1 - .../osrd/utils/DiscreteEventSimulation.kt | 88 ------------------- core/osrd-reporting/build.gradle | 5 ++ .../osrd/reporting/exceptions/OSRDError.java | 9 +- 4 files changed, 12 insertions(+), 91 deletions(-) delete mode 100644 core/kt-osrd-utils/src/main/kotlin/fr/sncf/osrd/utils/DiscreteEventSimulation.kt diff --git a/core/kt-osrd-utils/build.gradle b/core/kt-osrd-utils/build.gradle index 5dd3f7eb37a..7040d252325 100644 --- a/core/kt-osrd-utils/build.gradle +++ b/core/kt-osrd-utils/build.gradle @@ -18,7 +18,6 @@ dependencies { // PLEASE ADD AND UPDATE DEPENDENCIES USING libs.versions.toml implementation project(':kt-fast-collections') ksp project(':kt-fast-collections-generator') - api project(':osrd-reporting') // JSON parsing implementation libs.moshi diff --git a/core/kt-osrd-utils/src/main/kotlin/fr/sncf/osrd/utils/DiscreteEventSimulation.kt b/core/kt-osrd-utils/src/main/kotlin/fr/sncf/osrd/utils/DiscreteEventSimulation.kt deleted file mode 100644 index ca1e28bf388..00000000000 --- a/core/kt-osrd-utils/src/main/kotlin/fr/sncf/osrd/utils/DiscreteEventSimulation.kt +++ /dev/null @@ -1,88 +0,0 @@ -package fr.sncf.osrd.utils - -import fr.sncf.osrd.reporting.exceptions.ErrorType -import fr.sncf.osrd.reporting.exceptions.OSRDError -import java.util.* -import kotlin.collections.ArrayDeque -import kotlin.coroutines.ContinuationInterceptor -import kotlin.coroutines.CoroutineContext -import kotlin.coroutines.EmptyCoroutineContext -import kotlinx.coroutines.* - -private class TimedRunnable( - @JvmField val time: Long, - private val continuation: CancellableContinuation -) : Comparable { - fun run(dispatcher: CoroutineDispatcher) { - with(continuation) { dispatcher.resumeUndispatched(Unit) } - } - - override fun compareTo(other: TimedRunnable): Int { - return time.compareTo(other.time) - } -} - -val CoroutineScope.currentTimeMillis: Long - get() = (coroutineContext[ContinuationInterceptor] as DiscreteEventSimulation).currentTime - -@OptIn(InternalCoroutinesApi::class) -private class DiscreteEventSimulation(initialTime: Long) : CoroutineDispatcher(), Delay { - var currentTime: Long = initialTime - private set - - private val readyTasks = ArrayDeque() - private val waitingTasks = PriorityQueue() - - override fun dispatch(context: CoroutineContext, block: Runnable) { - readyTasks.addLast(block) - } - - override fun scheduleResumeAfterDelay( - timeMillis: Long, - continuation: CancellableContinuation - ) { - val eventTime = currentTime + timeMillis - val waitingTask = TimedRunnable(eventTime, continuation) - waitingTasks.add(waitingTask) - - // when the continuation is cancelled, remove the timed runnable - continuation.invokeOnCancellation { waitingTasks.remove(waitingTask) } - } - - fun step(): Boolean { - // run a ready task, if any - if (readyTasks.isNotEmpty()) { - val task = readyTasks.removeFirst() - task.run() - return true - } - - // otherwise, run a waiting task - if (waitingTasks.isNotEmpty()) { - val task = waitingTasks.poll() - currentTime = task.time - task.run(this) - return true - } - - return false - } -} - -class BlockedSimulationException(message: String) : Exception(message) - -fun runSimulation( - initialTime: Long = 0, - parentContext: CoroutineContext = EmptyCoroutineContext, - block: suspend CoroutineScope.() -> T -): T { - val des = DiscreteEventSimulation(initialTime) - val scope = CoroutineScope(parentContext + des) - val deferred = scope.async { block() } - - // loop until there are no more tasks - while (des.step()) continue - - if (deferred.isCompleted) return deferred.getCompleted() - throw OSRDError(ErrorType.BlockedSimulationException) -} diff --git a/core/osrd-reporting/build.gradle b/core/osrd-reporting/build.gradle index fbd22ff546d..16e4fa7a6a6 100644 --- a/core/osrd-reporting/build.gradle +++ b/core/osrd-reporting/build.gradle @@ -1,6 +1,7 @@ plugins { id 'java' id 'jacoco' + alias(libs.plugins.kotlin.jvm) } repositories { @@ -15,10 +16,14 @@ java { dependencies { // PLEASE ADD AND UPDATE DEPENDENCIES USING libs.versions.toml + api project(':kt-osrd-utils') + + implementation libs.kotlin.stdlib //moshi implementation libs.moshi implementation libs.moshi.adapters + implementation libs.moshi.kotlin //class-graph implementation libs.classgraph diff --git a/core/osrd-reporting/src/main/java/fr/sncf/osrd/reporting/exceptions/OSRDError.java b/core/osrd-reporting/src/main/java/fr/sncf/osrd/reporting/exceptions/OSRDError.java index e16ebb4e8f9..c80e0f63c05 100644 --- a/core/osrd-reporting/src/main/java/fr/sncf/osrd/reporting/exceptions/OSRDError.java +++ b/core/osrd-reporting/src/main/java/fr/sncf/osrd/reporting/exceptions/OSRDError.java @@ -1,10 +1,12 @@ package fr.sncf.osrd.reporting.exceptions; -import com.squareup.moshi.*; import com.squareup.moshi.JsonAdapter; +import com.squareup.moshi.Moshi; +import com.squareup.moshi.kotlin.reflect.KotlinJsonAdapterFactory; import fr.sncf.osrd.reporting.ErrorContext; import fr.sncf.osrd.reporting.warnings.DiagnosticRecorder; import fr.sncf.osrd.reporting.warnings.Warning; +import fr.sncf.osrd.utils.json.UnitAdapterFactory; import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serial; @@ -456,7 +458,10 @@ public String getMessage() { public static final JsonAdapter adapter; static { - Moshi moshi = new Moshi.Builder().build(); + Moshi moshi = new Moshi.Builder() + .addLast(new UnitAdapterFactory()) + .addLast(new KotlinJsonAdapterFactory()) + .build(); adapter = moshi.adapter(OSRDError.class); }