diff --git a/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/CqlCompiler.kt b/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/CqlCompiler.kt index 7592f8a26..e9bbb9df9 100644 --- a/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/CqlCompiler.kt +++ b/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/CqlCompiler.kt @@ -139,7 +139,7 @@ open class CommonCqlCompiler( return run(CharStreams.fromString(cqlText)) } - fun run(source: Source): Library? { + open fun run(source: Source): Library? { return run(CharStreams.fromString(source.readString())) } diff --git a/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/LibraryManager.kt b/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/LibraryManager.kt index ea8aa01cc..b3ed2b140 100644 --- a/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/LibraryManager.kt +++ b/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/LibraryManager.kt @@ -22,7 +22,7 @@ open class CommonLibraryManager( val modelManager: CommonModelManager, val namespaceManager: NamespaceManager, open val librarySourceLoader: CommonLibrarySourceLoader, - val ucumService: UcumService, + lazyUcumService: Lazy, val cqlCompilerOptions: CqlCompilerOptions = CqlCompilerOptions.defaultOptions(), val compiledLibraries: MutableMap = HashMap() ) { @@ -32,6 +32,8 @@ open class CommonLibraryManager( READ_WRITE } + val ucumService by lazyUcumService + /* * A "well-known" library name is one that is allowed to resolve without a * namespace in a namespace-aware context diff --git a/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/SimpleCqlTranslator.kt b/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/SimpleCqlTranslator.kt index 7febb2f70..bdfaf79dc 100644 --- a/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/SimpleCqlTranslator.kt +++ b/Src/java/cql-to-elm/src/commonMain/kotlin/org/cqframework/cql/cql2elm/SimpleCqlTranslator.kt @@ -84,7 +84,7 @@ fun cqlToElm( } } - val libraryManager = CommonLibraryManager(modelManager, namespaceManager, librarySourceLoader, ucumService) + val libraryManager = CommonLibraryManager(modelManager, namespaceManager, librarySourceLoader, lazy { ucumService }) val translator = CommonCqlTranslator.fromText(cqlText, libraryManager) diff --git a/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/CqlCompilerJvm.kt b/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/CqlCompilerJvm.kt index 3d48b0f45..eb1c41830 100644 --- a/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/CqlCompilerJvm.kt +++ b/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/CqlCompilerJvm.kt @@ -1,5 +1,7 @@ package org.cqframework.cql.cql2elm +import kotlinx.io.Source +import kotlinx.io.asInputStream import org.antlr.v4.kotlinruntime.CharStreams import org.hl7.cql.model.NamespaceInfo import org.hl7.elm.r1.Library @@ -20,6 +22,10 @@ class CqlCompiler( libraryManager: LibraryManager ) : this(namespaceInfo, null, libraryManager) + override fun run(source: Source): Library? { + return run(CharStreams.fromStream(source.asInputStream())) + } + @Throws(IOException::class) fun run(cqlFile: File): Library? { return run(CharStreams.fromStream(FileInputStream(cqlFile))) diff --git a/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/LibraryManagerJvm.kt b/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/LibraryManagerJvm.kt index fcdbaecc3..9af5c152c 100644 --- a/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/LibraryManagerJvm.kt +++ b/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/LibraryManagerJvm.kt @@ -1,7 +1,7 @@ package org.cqframework.cql.cql2elm import org.cqframework.cql.cql2elm.model.CompiledLibrary -import org.cqframework.cql.cql2elm.ucum.getUcumService +import org.cqframework.cql.cql2elm.ucum.lazyUcumService import org.hl7.elm.r1.VersionedIdentifier import kotlin.jvm.JvmOverloads @@ -15,7 +15,7 @@ constructor( modelManager, modelManager.namespaceManager, PriorityLibrarySourceLoader(), - getUcumService(), + lazyUcumService, cqlCompilerOptions, libraryCache ) { diff --git a/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/ucum/UcumService.kt b/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/ucum/UcumService.kt index 4fa3f29e4..23b991e8b 100644 --- a/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/ucum/UcumService.kt +++ b/Src/java/cql-to-elm/src/jvmMain/kotlin/org/cqframework/cql/cql2elm/ucum/UcumService.kt @@ -2,8 +2,8 @@ package org.cqframework.cql.cql2elm.ucum import java.util.* -fun getUcumService(): UcumService { - return ServiceLoader.load(UcumService::class.java).firstOrNull() +val lazyUcumService = lazy { + ServiceLoader.load(UcumService::class.java).firstOrNull() ?: error( """No UCUM service implementation found. Please ensure a UCUM service implementation is available on the classpath. diff --git a/Src/java/elm-xmlutil/src/commonMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReader.kt b/Src/java/elm-xmlutil/src/commonMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReader.kt index 497343cd5..0cb9c6cc7 100644 --- a/Src/java/elm-xmlutil/src/commonMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReader.kt +++ b/Src/java/elm-xmlutil/src/commonMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReader.kt @@ -1,17 +1,10 @@ -@file:Suppress("detekt:all") - package org.cqframework.cql.elm.serializing.xmlutil import kotlinx.io.Source -import kotlinx.io.readString import org.cqframework.cql.elm.serializing.ElmLibraryReader import org.hl7.elm.r1.Library -class ElmXmlLibraryReader : ElmLibraryReader { - override fun read(string: String): Library { - return xml.decodeFromString(Library.serializer(), string) - } - override fun read(source: Source): Library { - return read(source.readString()) - } +expect class ElmXmlLibraryReader() : ElmLibraryReader { + override fun read(string: String): Library + override fun read(source: Source): Library } diff --git a/Src/java/elm-xmlutil/src/commonMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriter.kt b/Src/java/elm-xmlutil/src/commonMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriter.kt index fa8c21395..4f793c093 100644 --- a/Src/java/elm-xmlutil/src/commonMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriter.kt +++ b/Src/java/elm-xmlutil/src/commonMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriter.kt @@ -1,16 +1,10 @@ package org.cqframework.cql.elm.serializing.xmlutil import kotlinx.io.Sink -import kotlinx.io.writeString import org.cqframework.cql.elm.serializing.ElmLibraryWriter import org.hl7.elm.r1.Library -class ElmXmlLibraryWriter : ElmLibraryWriter { - override fun write(library: Library, sink: Sink) { - sink.writeString(writeAsString(library)) - } - - override fun writeAsString(library: Library): String { - return xml.encodeToString(Library.serializer(), library) - } +expect class ElmXmlLibraryWriter() : ElmLibraryWriter { + override fun write(library: Library, sink: Sink) + override fun writeAsString(library: Library): String } diff --git a/Src/java/elm-xmlutil/src/jsMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReaderJs.kt b/Src/java/elm-xmlutil/src/jsMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReaderJs.kt new file mode 100644 index 000000000..867d98a31 --- /dev/null +++ b/Src/java/elm-xmlutil/src/jsMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReaderJs.kt @@ -0,0 +1,15 @@ +package org.cqframework.cql.elm.serializing.xmlutil + +import kotlinx.io.Source +import kotlinx.io.readString +import org.cqframework.cql.elm.serializing.ElmLibraryReader +import org.hl7.elm.r1.Library + +actual class ElmXmlLibraryReader actual constructor() : ElmLibraryReader { + actual override fun read(string: String): Library { + return xml.decodeFromString(Library.serializer(), string) + } + actual override fun read(source: Source): Library { + return read(source.readString()) + } +} diff --git a/Src/java/elm-xmlutil/src/jsMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriterJs.kt b/Src/java/elm-xmlutil/src/jsMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriterJs.kt new file mode 100644 index 000000000..38cb49aaa --- /dev/null +++ b/Src/java/elm-xmlutil/src/jsMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriterJs.kt @@ -0,0 +1,15 @@ +package org.cqframework.cql.elm.serializing.xmlutil + +import kotlinx.io.Sink +import kotlinx.io.writeString +import org.cqframework.cql.elm.serializing.ElmLibraryWriter +import org.hl7.elm.r1.Library + +actual class ElmXmlLibraryWriter actual constructor() : ElmLibraryWriter { + actual override fun write(library: Library, sink: Sink) { + sink.writeString(writeAsString(library)) + } + actual override fun writeAsString(library: Library): String { + return xml.encodeToString(Library.serializer(), library) + } +} diff --git a/Src/java/elm-xmlutil/src/jvmMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReaderJvm.kt b/Src/java/elm-xmlutil/src/jvmMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReaderJvm.kt new file mode 100644 index 000000000..541ce3935 --- /dev/null +++ b/Src/java/elm-xmlutil/src/jvmMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryReaderJvm.kt @@ -0,0 +1,20 @@ +package org.cqframework.cql.elm.serializing.xmlutil + +import kotlinx.io.Source +import kotlinx.io.asInputStream +import nl.adaptivity.xmlutil.newGenericReader +import nl.adaptivity.xmlutil.xmlStreaming +import org.cqframework.cql.elm.serializing.ElmLibraryReader +import org.hl7.elm.r1.Library + +actual class ElmXmlLibraryReader actual constructor() : ElmLibraryReader { + actual override fun read(string: String): Library { + return xml.decodeFromString(Library.serializer(), string) + } + actual override fun read(source: Source): Library { + return xml.decodeFromReader( + Library.serializer(), + xmlStreaming.newGenericReader(source.asInputStream()) + ) + } +} diff --git a/Src/java/elm-xmlutil/src/jvmMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriterJvm.kt b/Src/java/elm-xmlutil/src/jvmMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriterJvm.kt new file mode 100644 index 000000000..4d82df7f6 --- /dev/null +++ b/Src/java/elm-xmlutil/src/jvmMain/kotlin/org/cqframework/cql/elm/serializing/xmlutil/ElmXmlLibraryWriterJvm.kt @@ -0,0 +1,21 @@ +package org.cqframework.cql.elm.serializing.xmlutil + +import kotlinx.io.Sink +import kotlinx.io.asOutputStream +import nl.adaptivity.xmlutil.core.impl.newWriter +import nl.adaptivity.xmlutil.xmlStreaming +import org.cqframework.cql.elm.serializing.ElmLibraryWriter +import org.hl7.elm.r1.Library + +actual class ElmXmlLibraryWriter actual constructor() : ElmLibraryWriter { + actual override fun write(library: Library, sink: Sink) { + xml.encodeToWriter( + xmlStreaming.newWriter(sink.asOutputStream(), "UTF-8"), + Library.serializer(), + library + ) + } + actual override fun writeAsString(library: Library): String { + return xml.encodeToString(Library.serializer(), library) + } +} diff --git a/Src/java/model-xmlutil/src/commonMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReader.kt b/Src/java/model-xmlutil/src/commonMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReader.kt index a93285e7c..680cf5eb2 100644 --- a/Src/java/model-xmlutil/src/commonMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReader.kt +++ b/Src/java/model-xmlutil/src/commonMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReader.kt @@ -1,21 +1,13 @@ package org.hl7.elm_modelinfo.r1.serializing.xmlutil import kotlinx.io.Source -import kotlinx.io.readString import nl.adaptivity.xmlutil.serialization.XML import org.hl7.elm_modelinfo.r1.ModelInfo import org.hl7.elm_modelinfo.r1.serializing.ModelInfoReader -private val xml = XML(org.hl7.elm_modelinfo.r1.serializersModule) +internal val xml = XML(org.hl7.elm_modelinfo.r1.serializersModule) -class XmlModelInfoReader : ModelInfoReader { - override fun read(string: String): ModelInfo { - return xml.decodeFromString( - ModelInfo.serializer(), - string - ) - } - override fun read(source: Source): ModelInfo { - return read(source.readString()) - } +expect class XmlModelInfoReader() : ModelInfoReader { + override fun read(string: String): ModelInfo + override fun read(source: Source): ModelInfo } diff --git a/Src/java/model-xmlutil/src/jsMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReaderJs.kt b/Src/java/model-xmlutil/src/jsMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReaderJs.kt new file mode 100644 index 000000000..6cec084a6 --- /dev/null +++ b/Src/java/model-xmlutil/src/jsMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReaderJs.kt @@ -0,0 +1,18 @@ +package org.hl7.elm_modelinfo.r1.serializing.xmlutil + +import kotlinx.io.Source +import kotlinx.io.readString +import org.hl7.elm_modelinfo.r1.ModelInfo +import org.hl7.elm_modelinfo.r1.serializing.ModelInfoReader + +actual class XmlModelInfoReader actual constructor() : ModelInfoReader { + actual override fun read(string: String): ModelInfo { + return xml.decodeFromString( + ModelInfo.serializer(), + string + ) + } + actual override fun read(source: Source): ModelInfo { + return read(source.readString()) + } +} diff --git a/Src/java/model-xmlutil/src/jvmMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReaderJvm.kt b/Src/java/model-xmlutil/src/jvmMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReaderJvm.kt new file mode 100644 index 000000000..85b2884fe --- /dev/null +++ b/Src/java/model-xmlutil/src/jvmMain/kotlin/org/hl7/elm_modelinfo/r1/serializing/xmlutil/XmlModelInfoReaderJvm.kt @@ -0,0 +1,23 @@ +package org.hl7.elm_modelinfo.r1.serializing.xmlutil + +import kotlinx.io.Source +import kotlinx.io.asInputStream +import nl.adaptivity.xmlutil.newGenericReader +import nl.adaptivity.xmlutil.xmlStreaming +import org.hl7.elm_modelinfo.r1.ModelInfo +import org.hl7.elm_modelinfo.r1.serializing.ModelInfoReader + +actual class XmlModelInfoReader actual constructor() : ModelInfoReader { + actual override fun read(string: String): ModelInfo { + return xml.decodeFromString( + ModelInfo.serializer(), + string + ) + } + actual override fun read(source: Source): ModelInfo { + return xml.decodeFromReader( + ModelInfo.serializer(), + xmlStreaming.newGenericReader(source.asInputStream()) + ) + } +}