diff --git a/src/main/ApiUtil.kt b/src/main/ApiUtil.kt index 6e06bc9..ed7dd00 100644 --- a/src/main/ApiUtil.kt +++ b/src/main/ApiUtil.kt @@ -1,7 +1,10 @@ package com.github.statnett.loadflowservice +import com.fasterxml.jackson.databind.ObjectMapper import com.powsybl.iidm.network.Network import com.powsybl.nad.NetworkAreaDiagram +import com.powsybl.sensitivity.SensitivityAnalysisParameters +import com.powsybl.sensitivity.json.SensitivityJsonModule import com.powsybl.sld.SingleLineDiagram import com.powsybl.sld.SldParameters import io.github.oshai.kotlinlogging.KotlinLogging @@ -105,4 +108,31 @@ fun loadNames(network: Network): List { fun branchNames(network: Network): List { return network.lines.map { line -> line.nameOrId } +} + +fun defaultSensitivityAnalysisParameters(): String { + val mapper = ObjectMapper() + mapper.registerModule(SensitivityJsonModule()) + return mapper.writeValueAsString(SensitivityAnalysisParameters()) +} + +class InvalidParameterSet(message: String) : Exception(message) + +fun defaultParameterSet(name: String): String { + val loadParams = "load-params" + val sensitivityAnalysisParams = "sensitivity-analysis-params" + return when (name) { + loadParams -> { + defaultLoadFlowParameters() + } + + sensitivityAnalysisParams -> { + defaultSensitivityAnalysisParameters() + } + + else -> { + val allowed = listOf(loadParams, sensitivityAnalysisParams) + throw InvalidParameterSet("Unknown parameters set $name. Must be one of $allowed") + } + } } \ No newline at end of file diff --git a/src/main/App.kt b/src/main/App.kt index e1e1ede..07c60e1 100644 --- a/src/main/App.kt +++ b/src/main/App.kt @@ -62,8 +62,9 @@ fun Application.module() { call.respond(branchNames(network)) } - get("/default-load-parameters") { - call.respondText(defaultLoadFlowParameters(), ContentType.Application.Json, HttpStatusCode.OK) + get("/default-values/{parameter-set}") { + val parameterSet = call.parameters["parameter-set"] ?: "" + call.respondText(defaultParameterSet(parameterSet)) } post("/substation-names") { diff --git a/src/main/ExceptionHandler.kt b/src/main/ExceptionHandler.kt index 5acdda5..8981b24 100644 --- a/src/main/ExceptionHandler.kt +++ b/src/main/ExceptionHandler.kt @@ -5,15 +5,22 @@ import io.ktor.server.application.* import io.ktor.server.response.* class ExceptionHandler { - suspend fun handle(call: ApplicationCall, cause: Throwable) { + suspend fun handle(call: ApplicationCall, cause: Throwable) { when (cause) { is NoFileProvidedException -> { - call.respondText ( + call.respondText( "$cause\nStack trace: ${cause.stackTraceToString()}", status = HttpStatusCode.UnprocessableEntity, ) } + is InvalidParameterSet -> { + call.respondText( + "$cause", + status = HttpStatusCode.NotFound + ) + } + else -> { call.respondText( "500: $cause.\nStack trace: ${cause.stackTraceToString()}", diff --git a/src/main/Solver.kt b/src/main/Solver.kt index de7828d..354aaf7 100644 --- a/src/main/Solver.kt +++ b/src/main/Solver.kt @@ -31,7 +31,7 @@ fun warnOnFewAvailableImporters() { } } -class NoFileProvidedException(message: String): Exception(message) +class NoFileProvidedException(message: String) : Exception(message) fun networkFromFirstFile(files: List): Network { if (files.isEmpty()) { diff --git a/src/test/AppTest.kt b/src/test/AppTest.kt index c2bec4a..45e8216 100644 --- a/src/test/AppTest.kt +++ b/src/test/AppTest.kt @@ -108,7 +108,7 @@ class ApplicationTest { @Test fun `test default load parameters`() = testApplication { - val response = client.get("/default-load-parameters") + val response = client.get("/default-values/load-params") assertEquals(response.status, HttpStatusCode.OK) val body: String = response.bodyAsText() @@ -323,6 +323,26 @@ class ApplicationTest { } } + @Test + fun `test response 200 and some known content for default sensitivity parameters`() { + testApplication { + val response = client.get("/default-values/sensitivity-analysis-params") + assertEquals(HttpStatusCode.OK, response.status) + val body = response.bodyAsText() + assertTrue(body.contains("flow-voltage-sensitivity-value-threshold")) + } + } + + @Test + fun `test response 404 on unknown parameter set`() { + testApplication { + val response = client.get("/default-values/non-existing-params") + assertEquals(HttpStatusCode.NotFound, response.status) + val body = response.bodyAsText() + assertTrue(body.contains("InvalidParameterSet")) + } + } + }