From bdc649fde67546281561573dada07ff77ea2effb Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Wed, 23 Nov 2022 13:51:53 +0300 Subject: [PATCH] Update server to working condition --- .../kotlin/ru/inr/mass/data/api/NumassSet.kt | 3 + .../inr/mass/data/proto/NumassDirectorySet.kt | 11 +- .../inr/mass/data/proto/NumassProtoPlugin.kt | 1 + numass-data-server/build.gradle.kts | 3 +- .../mass/data/server/NumassCommonPlugin.kt | 2 +- .../mass/data/server/VisionOfNumassPoint.kt | 18 --- .../data/server/VisionOfNumassRepository.kt | 29 ++++ .../inr/mass/data/server/VisionOfNumassSet.kt | 36 +++++ .../kotlin/ru/inr/mass/data/server/server.kt | 132 ++++++++++++++++++ .../ru/inr/mass/data/server/serverDemo.kt | 50 ------- .../kotlin/ru/inr/mass/workspace/plots.kt | 2 +- 11 files changed, 209 insertions(+), 78 deletions(-) create mode 100644 numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassRepository.kt create mode 100644 numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassSet.kt create mode 100644 numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/server.kt delete mode 100644 numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/serverDemo.kt diff --git a/numass-data-model/src/commonMain/kotlin/ru/inr/mass/data/api/NumassSet.kt b/numass-data-model/src/commonMain/kotlin/ru/inr/mass/data/api/NumassSet.kt index 190e679..3e69714 100644 --- a/numass-data-model/src/commonMain/kotlin/ru/inr/mass/data/api/NumassSet.kt +++ b/numass-data-model/src/commonMain/kotlin/ru/inr/mass/data/api/NumassSet.kt @@ -6,6 +6,7 @@ package ru.inr.mass.data.api import kotlinx.datetime.Instant +import ru.inr.mass.data.proto.HVData import space.kscience.dataforge.meta.Meta import space.kscience.dataforge.meta.get import space.kscience.dataforge.meta.long @@ -40,6 +41,8 @@ public interface NumassSet : Iterable, Provider { override val defaultTarget: String get() = NUMASS_POINT_TARGET + public val hvData: HVData? + override fun content(target: String): Map = if (target == NUMASS_POINT_TARGET) { points.associateBy { NameToken("point", it.voltage.toString()).asName() } } else { diff --git a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassDirectorySet.kt b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassDirectorySet.kt index 2799443..f5f25a6 100644 --- a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassDirectorySet.kt +++ b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassDirectorySet.kt @@ -51,18 +51,15 @@ public class NumassDirectorySet internal constructor( @OptIn(DFExperimental::class) - public fun getHvData(): HVData? { - val hvFile = path / "voltage" - return if (hvFile.exists()) { + override val hvData: HVData? + get() = (path / "voltage").takeIf { it.exists() }?.let { hvFile -> val envelope = context.io.readEnvelopeFile(hvFile) HVData.readEnvelope(envelope) - } else { - null } - } + override fun content(target: String): Map = if (target == NUMASS_HV_TARGET) { - val hvData = getHvData() + val hvData = hvData if (hvData != null) { mapOf("hv".asName() to hvData) } else { diff --git a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassProtoPlugin.kt b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassProtoPlugin.kt index cd87b51..4276ac1 100644 --- a/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassProtoPlugin.kt +++ b/numass-data-proto/src/main/kotlin/ru/inr/mass/data/proto/NumassProtoPlugin.kt @@ -68,6 +68,7 @@ public suspend fun NumassProtoPlugin.readRepository(path: Path): DataTree) : AbstractVision() { -// init { -// points.forEach { -// //childrenInternal[it.token] = it -// } -// -// } -} - -public suspend fun NumassSet.toVision(): VisionOfNumassSet = VisionOfNumassSet(points.map { it.toVision() }).apply { - this@toVision.top(NUMASS_HV_TARGET).forEach { (key, hv) -> - // set(key, VisionOfNumassHv(hv)) - } -} diff --git a/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassRepository.kt b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassRepository.kt new file mode 100644 index 0000000..286e06f --- /dev/null +++ b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassRepository.kt @@ -0,0 +1,29 @@ +package ru.inr.mass.data.server + +import kotlinx.serialization.Serializable +import ru.inr.mass.data.api.NumassSet +import space.kscience.dataforge.data.DataTree +import space.kscience.dataforge.data.DataTreeItem +import space.kscience.dataforge.data.await +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.plus +import space.kscience.visionforge.AbstractVisionGroup + +@Serializable +public class VisionOfNumassRepository : AbstractVisionGroup() { + override fun createGroup(): VisionOfNumassRepository = VisionOfNumassRepository() +} + +public suspend fun VisionOfNumassRepository( + repoName: Name, + tree: DataTree, +): VisionOfNumassRepository = VisionOfNumassRepository().apply { + tree.items.forEach { (key: NameToken, value) -> + children[key] = when (value) { + is DataTreeItem.Leaf -> VisionOfNumassSet(repoName + key, value.data.await()) + is DataTreeItem.Node -> VisionOfNumassRepository(repoName + key, value.tree) + } + } + //TODO listen to changes +} \ No newline at end of file diff --git a/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassSet.kt b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassSet.kt new file mode 100644 index 0000000..3b9a3a2 --- /dev/null +++ b/numass-data-server/src/commonMain/kotlin/ru/inr/mass/data/server/VisionOfNumassSet.kt @@ -0,0 +1,36 @@ +package ru.inr.mass.data.server + +import kotlinx.serialization.Serializable +import ru.inr.mass.data.api.NumassSet +import ru.inr.mass.data.proto.HVData +import space.kscience.dataforge.meta.Meta +import space.kscience.dataforge.misc.Named +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.plus +import space.kscience.visionforge.AbstractVision + +@Serializable +public data class PointRef( + override val name: Name, + public val pointMeta: Meta, + public val index: Int, + public val voltage: Double, +) : Named + +@Serializable +public class VisionOfNumassSet( + public val points: List, + public val hvData: HVData? = null, +) : AbstractVision() + +public fun VisionOfNumassSet(setName: Name, set: NumassSet): VisionOfNumassSet = VisionOfNumassSet( + set.points.map { point -> + PointRef( + setName + point.index.toString(), + point.meta, + point.index, + point.voltage + ) + }, + set.hvData +) \ No newline at end of file diff --git a/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/server.kt b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/server.kt new file mode 100644 index 0000000..c6d089c --- /dev/null +++ b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/server.kt @@ -0,0 +1,132 @@ +package ru.inr.mass.data.server + +import io.ktor.http.HttpStatusCode +import io.ktor.http.URLBuilder +import io.ktor.server.application.call +import io.ktor.server.cio.CIO +import io.ktor.server.engine.embeddedServer +import io.ktor.server.response.respondText +import io.ktor.server.routing.get +import io.ktor.server.routing.routing +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import ru.inr.mass.data.api.NumassPoint +import ru.inr.mass.data.proto.NumassDirectorySet +import ru.inr.mass.data.proto.NumassProtoPlugin +import ru.inr.mass.data.proto.readRepository +import space.kscience.dataforge.context.Context +import space.kscience.dataforge.context.fetch +import space.kscience.dataforge.data.DataTree +import space.kscience.dataforge.data.await +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.NameToken +import space.kscience.dataforge.names.cutLast +import space.kscience.dataforge.names.lastOrNull +import space.kscience.visionforge.server.close +import space.kscience.visionforge.server.openInBrowser +import space.kscience.visionforge.server.visionServer + + +public suspend fun main() { + val context = Context("Numass") { + plugin(NumassProtoPlugin) + plugin(NumassCommonPlugin) + } + + val numassProto = context.fetch(NumassProtoPlugin) + val numassCommon = context.fetch(NumassCommonPlugin) + + val visionManager = numassCommon.visionManager + + val repositroyName = "D:\\Work\\Numass\\data\\test" + + val port = 7777 + val host = "localhost" + + val url = URLBuilder(host = host, port = port).build() + + val repository: DataTree = numassProto.readRepository(repositroyName) + + val visionOfNumassRepository = VisionOfNumassRepository(Name.EMPTY, repository) + + val server = context.embeddedServer(CIO, port, host) { + routing { + get("/repository") { + call.respondText { + visionManager.encodeToString(visionOfNumassRepository) + } + } + + get("/sets/{name...}") { + val setName: Name? = call.parameters.getAll("name") + ?.map { NameToken.parse(it) }?.let(::Name) + + if (setName == null) { + call.respondText(status = HttpStatusCode.BadRequest) { "Set name is empty" } + return@get + } + + val set: NumassDirectorySet? = withContext(Dispatchers.IO) { repository[setName]?.await() } + if (set == null) { + call.respondText(status = HttpStatusCode.NotFound) { "A set with name $setName not found in the repository" } + return@get + } + + call.respondText { + visionManager.encodeToString(VisionOfNumassSet(setName, set)) + } + } + get("/points/{name...}") { + val fullName: Name? = call.parameters.getAll("name") + ?.map { NameToken.parse(it) }?.let(::Name) + + if (fullName == null) { + call.respondText(status = HttpStatusCode.BadRequest) { "Point name is empty" } + return@get + } + + val setName = fullName.cutLast() + + val set: NumassDirectorySet? = withContext(Dispatchers.IO) { repository[setName]?.await() } + if (set == null) { + call.respondText(status = HttpStatusCode.NotFound) { "A set with name $setName not found in the repository" } + return@get + } + + val pointIndex: Int? = fullName.lastOrNull()?.body?.toIntOrNull() + + val point: NumassPoint? = set.points.find { it.index == pointIndex } + + if (point == null) { + call.respondText(status = HttpStatusCode.NotFound) { "A point with name $setName/$pointIndex not found in the repository" } + return@get + } + call.respondText { + visionManager.encodeToString(point.toVision()) + } + } + } + visionServer(numassCommon.visionManager, url) + }.start() + +// val server = context.visionManager.serve { +// header("numass", VisionPage.scriptHeader("js/numass-web.js")) +// page { +// div("flex-column") { +// h1 { +"Visionforge file demo" } +// vision { visionOfNumass } +// } +// } +// } + + server.openInBrowser() + + + println("Enter 'exit' to close server") + while (readLine() != "exit") { + // + } + + server.close() + +} \ No newline at end of file diff --git a/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/serverDemo.kt b/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/serverDemo.kt deleted file mode 100644 index 8392cc2..0000000 --- a/numass-data-server/src/jvmMain/kotlin/ru/inr/mass/data/server/serverDemo.kt +++ /dev/null @@ -1,50 +0,0 @@ -package ru.inr.mass.data.server - -import kotlinx.html.div -import kotlinx.html.h1 -import ru.inr.mass.data.api.NumassPoint -import ru.inr.mass.data.proto.NumassProtoPlugin -import ru.inr.mass.data.proto.readNumassPointFile -import space.kscience.dataforge.context.Context -import space.kscience.dataforge.context.fetch -import space.kscience.visionforge.html.VisionPage -import space.kscience.visionforge.server.close -import space.kscience.visionforge.server.openInBrowser -import space.kscience.visionforge.server.serve -import space.kscience.visionforge.visionManager -import java.nio.file.Path - - -public suspend fun main() { - val context = Context("Numass") { - plugin(NumassProtoPlugin) - plugin(NumassCommonPlugin) - } - val numassProto = context.fetch(NumassProtoPlugin) - - val pointPath = Path.of("D:\\Work\\Numass\\data\\test\\set_7\\p120(30s)(HV1=13300)") - val point: NumassPoint = numassProto.readNumassPointFile(pointPath)!! - - val visionOfNumass = point.toVision() - - val server = context.visionManager.serve { - header("numass", VisionPage.scriptHeader("js/numass-web.js")) - page { - div("flex-column") { - h1 { +"Visionforge file demo" } - vision { visionOfNumass } - } - } - } - - server.openInBrowser() - - - println("Enter 'exit' to close server") - while (readLine() != "exit") { - // - } - - server.close() - -} \ No newline at end of file diff --git a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/plots.kt b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/plots.kt index f39d4d5..797d00a 100644 --- a/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/plots.kt +++ b/numass-workspace/src/main/kotlin/ru/inr/mass/workspace/plots.kt @@ -128,7 +128,7 @@ fun Plotly.plotNumassSet( } if (set is NumassDirectorySet) { - set.getHvData()?.let { entries -> + set.hvData?.let { entries -> h2 { +"HV" } plot { hvData(entries)