diff --git a/engine.fhir/pom.xml b/engine.fhir/pom.xml index a42197058..6fafd42f3 100644 --- a/engine.fhir/pom.xml +++ b/engine.fhir/pom.xml @@ -41,10 +41,6 @@ jakarta.xml.bind-api - - ca.uhn.hapi.fhir - hapi-fhir-client - ca.uhn.hapi.fhir hapi-fhir-structures-dstu2 @@ -86,7 +82,13 @@ org.eclipse.persistence.moxy test - + + + org.opencds.cqf.cql + engine.jackson + 2.0.0-SNAPSHOT + test + info.cqframework cql-to-elm @@ -112,6 +114,13 @@ elm-jackson test + + + ca.uhn.hapi.fhir + hapi-fhir-client + test + + diff --git a/engine.fhir/src/test/java/org/hl7/fhirpath/TestLibraryLoader.java b/engine.fhir/src/test/java/org/hl7/fhirpath/TestLibraryLoader.java index 86d58176e..602599364 100644 --- a/engine.fhir/src/test/java/org/hl7/fhirpath/TestLibraryLoader.java +++ b/engine.fhir/src/test/java/org/hl7/fhirpath/TestLibraryLoader.java @@ -2,6 +2,7 @@ import java.io.IOException; import java.io.StringReader; +import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -13,19 +14,9 @@ import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.cqframework.cql.elm.execution.Library; import org.cqframework.cql.elm.execution.VersionedIdentifier; -import org.hl7.cql_annotations.r1.CqlToElmBase; -import org.opencds.cqf.cql.engine.elm.serialization.CqlToElmBaseMixIn; -import org.opencds.cqf.cql.engine.execution.JsonCqlLibraryReader; +import org.cqframework.cql.elm.serializing.ElmLibraryWriterFactory; import org.opencds.cqf.cql.engine.execution.LibraryLoader; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; +import org.opencds.cqf.cql.engine.serializing.jackson.JsonCqlLibraryReader; public class TestLibraryLoader implements LibraryLoader { @@ -73,25 +64,16 @@ private Library loadLibrary(VersionedIdentifier libraryIdentifier) { CompiledLibrary compiledLibrary = libraryManager.resolveLibrary(identifier, CqlTranslatorOptions.defaultOptions(), errors); String json; try { - ObjectMapper mapper = JsonMapper.builder() - .defaultMergeable(true) - .enable(SerializationFeature.WRAP_ROOT_VALUE) - .enable(SerializationFeature.INDENT_OUTPUT) - .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) - .enable(MapperFeature.USE_BASE_TYPE_AS_DEFAULT_IMPL) - .defaultPropertyInclusion(JsonInclude.Value.construct(JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) - .addModule(new JaxbAnnotationModule()) - .addMixIn(CqlToElmBase.class, CqlToElmBaseMixIn.class) - .build(); - - json = mapper.writeValueAsString(compiledLibrary.getLibrary()); - } catch (JsonProcessingException e) { + StringWriter writer = new StringWriter(); + ElmLibraryWriterFactory.getWriter("application/elm+json").write(compiledLibrary.getLibrary(), writer); + json = writer.getBuffer().toString(); + } catch (IOException e) { throw new RuntimeException(String.format("Errors encountered while loading library %s: %s", libraryIdentifier.getId(), e.getMessage())); } Library library = null; try { - library = JsonCqlLibraryReader.read(new StringReader(json)); + library = new JsonCqlLibraryReader().read(new StringReader(json)); } catch (IOException e) { throw new RuntimeException(String.format("Errors encountered while loading library %s: %s", libraryIdentifier.getId(), e.getMessage())); } diff --git a/engine.fhir/src/test/java/org/hl7/fhirpath/TranslatorHelper.java b/engine.fhir/src/test/java/org/hl7/fhirpath/TranslatorHelper.java index 0c2386386..0052b187b 100644 --- a/engine.fhir/src/test/java/org/hl7/fhirpath/TranslatorHelper.java +++ b/engine.fhir/src/test/java/org/hl7/fhirpath/TranslatorHelper.java @@ -7,7 +7,7 @@ import org.fhir.ucum.UcumEssenceService; import org.fhir.ucum.UcumException; import org.fhir.ucum.UcumService; -import org.opencds.cqf.cql.engine.execution.JsonCqlLibraryReader; +import org.opencds.cqf.cql.engine.serializing.jackson.JsonCqlLibraryReader; import org.opencds.cqf.cql.engine.execution.LibraryLoader; import java.io.IOException; @@ -60,7 +60,7 @@ public Library translate(String cql) throws UcumException { String json = translator.toJson(); try { - return JsonCqlLibraryReader.read(new StringReader(json)); + return new JsonCqlLibraryReader().read(new StringReader(json)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/engine.fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/FhirExecutionTestBase.java b/engine.fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/FhirExecutionTestBase.java index 6a926c88f..32822f7cd 100644 --- a/engine.fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/FhirExecutionTestBase.java +++ b/engine.fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/FhirExecutionTestBase.java @@ -11,10 +11,10 @@ import org.fhir.ucum.UcumException; import org.fhir.ucum.UcumService; import org.opencds.cqf.cql.engine.data.CompositeDataProvider; -import org.opencds.cqf.cql.engine.execution.JsonCqlLibraryReader; import org.opencds.cqf.cql.engine.fhir.model.*; import org.opencds.cqf.cql.engine.fhir.retrieve.RestFhirRetrieveProvider; import org.opencds.cqf.cql.engine.fhir.searchparam.SearchParameterResolver; +import org.opencds.cqf.cql.engine.serializing.jackson.JsonCqlLibraryReader; import org.testng.annotations.BeforeClass; import org.testng.annotations.BeforeMethod; @@ -106,14 +106,14 @@ public void beforeEachTestMethod() throws JAXBException, IOException, UcumExcept for (Map.Entry entry : libraryManager.getCompiledLibraries().entrySet()) { String jsonContent = CqlTranslator.convertToJson(entry.getValue().getLibrary()); StringReader sr = new StringReader(jsonContent); - libraries.put(entry.getKey(), JsonCqlLibraryReader.read(sr)); + libraries.put(entry.getKey(), new JsonCqlLibraryReader().read(sr)); if (entry.getKey().equals(fileName)) { library = libraries.get(entry.getKey()); } } if (library == null) { - library = JsonCqlLibraryReader.read(new StringReader(translator.toJson())); + library = new JsonCqlLibraryReader().read(new StringReader(translator.toJson())); libraries.put(fileName, library); } } catch (IOException e) { diff --git a/engine.fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestLibraryLoader.java b/engine.fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestLibraryLoader.java index 2d3d08609..1898b3196 100644 --- a/engine.fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestLibraryLoader.java +++ b/engine.fhir/src/test/java/org/opencds/cqf/cql/engine/fhir/data/TestLibraryLoader.java @@ -1,11 +1,11 @@ package org.opencds.cqf.cql.engine.fhir.data; +import java.util.Map; + import org.cqframework.cql.elm.execution.Library; import org.cqframework.cql.elm.execution.VersionedIdentifier; import org.opencds.cqf.cql.engine.execution.LibraryLoader; -import java.util.Map; - public class TestLibraryLoader implements LibraryLoader { private Map libraries; diff --git a/engine.jackson/pom.xml b/engine.jackson/pom.xml new file mode 100644 index 000000000..5f449d81d --- /dev/null +++ b/engine.jackson/pom.xml @@ -0,0 +1,118 @@ + + + 4.0.0 + + + org.opencds.cqf.cql + engine.shared + 2.0.0-SNAPSHOT + + + engine.jackson + jar + + engine.jackson + CQL Engine Jackson Readers + https://github.com/DBCG/cql_engine/tree/master/engine.jaxb + + + + org.opencds.cqf.cql + engine + 2.0.0-SNAPSHOT + + + + + com.fasterxml.jackson.core + jackson-databind + ${jackson-databind.version} + + + com.fasterxml.jackson.core + jackson-annotations + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-core + ${jackson.version} + + + com.fasterxml.jackson.module + jackson-module-jaxb-annotations + ${jackson.version} + + + com.fasterxml.jackson.dataformat + jackson-dataformat-xml + ${jackson.version} + + + + + xpp3 + xpp3 + test + + + xpp3 + xpp3_xpath + test + + + + info.cqframework + cql-to-elm + test + + + info.cqframework + model-jackson + test + + + info.cqframework + elm-jackson + test + + + + + + + org.jacoco + jacoco-maven-plugin + + + jacoco-check + verify + + check + + + + + + + **/org/cqframework/** + + + + BUNDLE + + + LINE + COVEREDRATIO + 0.40 + + + + + + + + + + diff --git a/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/CqlLibraryReaderProvider.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/CqlLibraryReaderProvider.java new file mode 100644 index 000000000..90ff92d04 --- /dev/null +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/CqlLibraryReaderProvider.java @@ -0,0 +1,18 @@ +package org.opencds.cqf.cql.engine.serializing.jackson; + +import org.opencds.cqf.cql.engine.serializing.CqlLibraryReader; + +public class CqlLibraryReaderProvider implements org.opencds.cqf.cql.engine.serializing.CqlLibraryReaderProvider { + @Override + public CqlLibraryReader create(String contentType) { + if (contentType == null) { + contentType = "application/elm+json"; + } + + switch (contentType) { + case "application/elm+xml": return new XmlCqlLibraryReader(); + case "application/elm+json": + default: return new JsonCqlLibraryReader(); + } + } +} diff --git a/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/JsonCqlLibraryReader.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/JsonCqlLibraryReader.java new file mode 100644 index 000000000..e430355de --- /dev/null +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/JsonCqlLibraryReader.java @@ -0,0 +1,41 @@ +package org.opencds.cqf.cql.engine.serializing.jackson; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.net.URI; +import java.net.URL; + +import org.cqframework.cql.elm.execution.Library; +import org.opencds.cqf.cql.engine.serializing.CqlLibraryReader; + +public class JsonCqlLibraryReader implements CqlLibraryReader { + + public JsonCqlLibraryReader() { + } + + public Library read(File file) throws IOException { + return JsonCqlMapper.getMapper().readValue(file, Library.class); + } + + public Library read(URL url) throws IOException { + return JsonCqlMapper.getMapper().readValue(url, Library.class); + } + + public Library read(URI uri) throws IOException { + return JsonCqlMapper.getMapper().readValue(uri.toURL(), Library.class); + } + + public Library read(String string) throws IOException { + return JsonCqlMapper.getMapper().readValue(string, Library.class); + } + + public Library read(InputStream inputStream) throws IOException { + return JsonCqlMapper.getMapper().readValue(inputStream, Library.class); + } + + public Library read(Reader reader) throws IOException { + return JsonCqlMapper.getMapper().readValue(reader, Library.class); + } +} diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/execution/JsonCqlLibraryReader.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/JsonCqlMapper.java similarity index 52% rename from engine/src/main/java/org/opencds/cqf/cql/engine/execution/JsonCqlLibraryReader.java rename to engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/JsonCqlMapper.java index 465e339ef..53e1012f9 100644 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/execution/JsonCqlLibraryReader.java +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/JsonCqlMapper.java @@ -1,12 +1,10 @@ -package org.opencds.cqf.cql.engine.execution; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.net.URI; -import java.net.URL; +package org.opencds.cqf.cql.engine.serializing.jackson; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.json.JsonMapper; +import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; import org.cqframework.cql.elm.execution.CodeSystemRef; import org.cqframework.cql.elm.execution.CqlToElmBase; import org.cqframework.cql.elm.execution.Element; @@ -15,22 +13,9 @@ import org.cqframework.cql.elm.execution.Library; import org.cqframework.cql.elm.execution.TypeSpecifier; import org.opencds.cqf.cql.engine.elm.execution.Executable; -import org.opencds.cqf.cql.engine.elm.serialization.CodeSystemRefMixin; -import org.opencds.cqf.cql.engine.elm.serialization.CqlToElmBaseMixIn; -import org.opencds.cqf.cql.engine.elm.serialization.ElementMixin; -import org.opencds.cqf.cql.engine.elm.serialization.ExecutableMixin; -import org.opencds.cqf.cql.engine.elm.serialization.ExpressionDefMixin; -import org.opencds.cqf.cql.engine.elm.serialization.ExpressionMixin; -import org.opencds.cqf.cql.engine.elm.serialization.LibraryMixin; -import org.opencds.cqf.cql.engine.elm.serialization.TypeSpecifierMixin; - -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; +import org.opencds.cqf.cql.engine.serializing.jackson.mixins.*; -public class JsonCqlLibraryReader { +public class JsonCqlMapper { private static final JsonMapper mapper = JsonMapper.builder() .defaultMergeable(true) .enable(SerializationFeature.INDENT_OUTPUT) @@ -50,30 +35,7 @@ public class JsonCqlLibraryReader { .addMixIn(Executable.class, ExecutableMixin.class) .build(); - private JsonCqlLibraryReader() { - } - - public static Library read(File file) throws IOException { - return mapper.readValue(file, Library.class); - } - - public static Library read(URL url) throws IOException { - return mapper.readValue(url, Library.class); - } - - public static Library read(URI uri) throws IOException { - return mapper.readValue(uri.toURL(), Library.class); - } - - public static Library read(String string) throws IOException { - return mapper.readValue(string, Library.class); - } - - public static Library read(InputStream inputStream) throws IOException { - return mapper.readValue(inputStream, Library.class); - } - - public static Library read(Reader reader) throws IOException { - return mapper.readValue(reader, Library.class); + public static JsonMapper getMapper() { + return mapper; } } diff --git a/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/XmlCqlLibraryReader.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/XmlCqlLibraryReader.java new file mode 100644 index 000000000..9ae2c90ac --- /dev/null +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/XmlCqlLibraryReader.java @@ -0,0 +1,41 @@ +package org.opencds.cqf.cql.engine.serializing.jackson; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.net.URI; +import java.net.URL; + +import org.cqframework.cql.elm.execution.Library; +import org.opencds.cqf.cql.engine.serializing.CqlLibraryReader; + +public class XmlCqlLibraryReader implements CqlLibraryReader { + + public XmlCqlLibraryReader() { + } + + public Library read(File file) throws IOException { + return XmlCqlMapper.getMapper().readValue(file, Library.class); + } + + public Library read(URL url) throws IOException { + return XmlCqlMapper.getMapper().readValue(url, Library.class); + } + + public Library read(URI uri) throws IOException { + return XmlCqlMapper.getMapper().readValue(uri.toURL(), Library.class); + } + + public Library read(String string) throws IOException { + return XmlCqlMapper.getMapper().readValue(string, Library.class); + } + + public Library read(InputStream inputStream) throws IOException { + return XmlCqlMapper.getMapper().readValue(inputStream, Library.class); + } + + public Library read(Reader reader) throws IOException { + return XmlCqlMapper.getMapper().readValue(reader, Library.class); + } +} diff --git a/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/XmlCqlMapper.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/XmlCqlMapper.java new file mode 100644 index 000000000..e23310c61 --- /dev/null +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/XmlCqlMapper.java @@ -0,0 +1,46 @@ +package org.opencds.cqf.cql.engine.serializing.jackson; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import com.fasterxml.jackson.dataformat.xml.ser.ToXmlGenerator; +import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; +import org.cqframework.cql.elm.execution.CodeSystemRef; +import org.cqframework.cql.elm.execution.CqlToElmBase; +import org.cqframework.cql.elm.execution.Element; +import org.cqframework.cql.elm.execution.Expression; +import org.cqframework.cql.elm.execution.ExpressionDef; +import org.cqframework.cql.elm.execution.TypeSpecifier; +import org.opencds.cqf.cql.engine.elm.execution.Executable; +import org.opencds.cqf.cql.engine.serializing.jackson.mixins.*; + +public class XmlCqlMapper { + private static final XmlMapper mapper = XmlMapper.builder() + .defaultUseWrapper(true) + .defaultMergeable(true) + .enable(ToXmlGenerator.Feature.WRITE_XML_DECLARATION) + .enable(ToXmlGenerator.Feature.WRITE_XML_1_1) + .enable(SerializationFeature.INDENT_OUTPUT) + .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) + .enable(MapperFeature.USE_BASE_TYPE_AS_DEFAULT_IMPL) + .defaultPropertyInclusion(JsonInclude.Value.construct(JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) + .addModule(new JaxbAnnotationModule()) + //.addMixIn(Library.class, LibraryMixin.class) // Some case sensitivity issue in the name [L]ibrary + // The ordering here of the mix ins for + // ExpressionDef -> CodeSystemRef -> Expression -> Element matters, + // so the mix-ins match most specific to least + .addMixIn(ExpressionDef.class, ExpressionDefMixin.class) + .addMixIn(CodeSystemRef.class, CodeSystemRefMixin.class) + .addMixIn(Expression.class, ExpressionMixin.class) + .addMixIn(TypeSpecifier.class, TypeSpecifierMixin.class) + .addMixIn(CqlToElmBase.class, CqlToElmBaseMixIn.class) + .addMixIn(Element.class, ElementMixin.class) + .addMixIn(Executable.class, ExecutableMixin.class) + .build(); + + public static XmlMapper getMapper() { + return mapper; + } +} diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/CodeSystemRefMixin.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/CodeSystemRefMixin.java similarity index 89% rename from engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/CodeSystemRefMixin.java rename to engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/CodeSystemRefMixin.java index 18e79570e..502201dd5 100644 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/CodeSystemRefMixin.java +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/CodeSystemRefMixin.java @@ -1,4 +1,4 @@ -package org.opencds.cqf.cql.engine.elm.serialization; +package org.opencds.cqf.cql.engine.serializing.jackson.mixins; import org.opencds.cqf.cql.engine.elm.execution.CodeSystemRefEvaluator; diff --git a/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/CqlToElmBaseMixIn.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/CqlToElmBaseMixIn.java new file mode 100644 index 000000000..a2b302660 --- /dev/null +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/CqlToElmBaseMixIn.java @@ -0,0 +1,18 @@ +package org.opencds.cqf.cql.engine.serializing.jackson.mixins; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import org.cqframework.cql.elm.execution.Annotation; +import org.cqframework.cql.elm.execution.CqlToElmError; +import org.cqframework.cql.elm.execution.CqlToElmInfo; + +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.PROPERTY, + property = "type") +@JsonSubTypes({ + @JsonSubTypes.Type(value = CqlToElmInfo.class, name = "a:CqlToElmInfo"), + @JsonSubTypes.Type(value = CqlToElmError.class, name = "a:CqlToElmError"), + @JsonSubTypes.Type(value = Annotation.class, name = "a:Annotation") +}) +public interface CqlToElmBaseMixIn {} \ No newline at end of file diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ElementMixin.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ElementMixin.java similarity index 86% rename from engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ElementMixin.java rename to engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ElementMixin.java index cd1aa329a..2968b7b06 100644 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ElementMixin.java +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ElementMixin.java @@ -1,4 +1,4 @@ -package org.opencds.cqf.cql.engine.elm.serialization; +package org.opencds.cqf.cql.engine.serializing.jackson.mixins; import org.opencds.cqf.cql.engine.elm.execution.ExpressionDefEvaluator; diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ExecutableMixin.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ExecutableMixin.java similarity index 74% rename from engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ExecutableMixin.java rename to engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ExecutableMixin.java index 96ff50c07..1f493a8ad 100644 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ExecutableMixin.java +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ExecutableMixin.java @@ -1,8 +1,7 @@ -package org.opencds.cqf.cql.engine.elm.serialization; +package org.opencds.cqf.cql.engine.serializing.jackson.mixins; import com.fasterxml.jackson.annotation.JsonTypeInfo; @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type") public class ExecutableMixin { - } diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ExpressionDefMixin.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ExpressionDefMixin.java similarity index 90% rename from engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ExpressionDefMixin.java rename to engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ExpressionDefMixin.java index 5402cee41..6cbe1c1a9 100644 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ExpressionDefMixin.java +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ExpressionDefMixin.java @@ -1,12 +1,12 @@ -package org.opencds.cqf.cql.engine.elm.serialization; - -import org.opencds.cqf.cql.engine.elm.execution.ExpressionDefEvaluator; +package org.opencds.cqf.cql.engine.serializing.jackson.mixins; import com.fasterxml.jackson.annotation.JsonSubTypes; -import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo.Id; +import org.opencds.cqf.cql.engine.elm.execution.ExpressionDefEvaluator; + @JsonTypeInfo(use = Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", defaultImpl = ExpressionDefEvaluator.class) @JsonSubTypes({ @Type(value = ExpressionDefEvaluator.class, name = "ExpressionDef") diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ExpressionMixin.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ExpressionMixin.java similarity index 99% rename from engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ExpressionMixin.java rename to engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ExpressionMixin.java index 7b542cad2..5941c8c3c 100644 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/ExpressionMixin.java +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/ExpressionMixin.java @@ -1,4 +1,4 @@ -package org.opencds.cqf.cql.engine.elm.serialization; +package org.opencds.cqf.cql.engine.serializing.jackson.mixins; import org.opencds.cqf.cql.engine.elm.execution.*; @@ -6,6 +6,7 @@ import com.fasterxml.jackson.annotation.JsonSubTypes.Type; import com.fasterxml.jackson.annotation.JsonTypeInfo; + @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type", defaultImpl = ExpressionDefEvaluator.class) @JsonSubTypes({ @Type(value = AbsEvaluator.class, name = "Abs"), diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/LibraryMixin.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/LibraryMixin.java similarity index 87% rename from engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/LibraryMixin.java rename to engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/LibraryMixin.java index f42d967f0..99325b213 100644 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/LibraryMixin.java +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/LibraryMixin.java @@ -1,4 +1,4 @@ -package org.opencds.cqf.cql.engine.elm.serialization; +package org.opencds.cqf.cql.engine.serializing.jackson.mixins; import org.cqframework.cql.elm.execution.Library; diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/TypeSpecifierMixin.java b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/TypeSpecifierMixin.java similarity index 94% rename from engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/TypeSpecifierMixin.java rename to engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/TypeSpecifierMixin.java index 9edd256dc..b655573a6 100644 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/TypeSpecifierMixin.java +++ b/engine.jackson/src/main/java/org/opencds/cqf/cql/engine/serializing/jackson/mixins/TypeSpecifierMixin.java @@ -1,4 +1,4 @@ -package org.opencds.cqf.cql.engine.elm.serialization; +package org.opencds.cqf.cql.engine.serializing.jackson.mixins; import org.cqframework.cql.elm.execution.ChoiceTypeSpecifier; import org.cqframework.cql.elm.execution.ListTypeSpecifier; diff --git a/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/data/SystemDataProviderTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/data/SystemDataProviderTest.java new file mode 100644 index 000000000..d3983056c --- /dev/null +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/data/SystemDataProviderTest.java @@ -0,0 +1,19 @@ +package org.opencds.cqf.cql.engine.data; + +import static org.testng.Assert.assertNull; + +import org.opencds.cqf.cql.engine.runtime.Date; +import org.testng.annotations.Test; + +public class SystemDataProviderTest { + + @Test + public void resolveMissingPropertyReturnsNull() { + SystemDataProvider provider = new SystemDataProvider(); + + Date date = new Date(2019, 01, 01); + + Object result = provider.resolvePath(date, "notapath"); + assertNull(result); + } +} diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlAggregateFunctionsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlAggregateFunctionsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlAggregateFunctionsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlAggregateFunctionsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlArithmeticFunctionsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlArithmeticFunctionsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlArithmeticFunctionsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlArithmeticFunctionsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlClinicalOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlClinicalOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlClinicalOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlClinicalOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlComparisonOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlComparisonOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlComparisonOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlComparisonOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java index ee32b76b9..1d0197e03 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConceptTest.java @@ -1,5 +1,8 @@ package org.opencds.cqf.cql.engine.execution; +import java.util.Arrays; +import java.util.List; + import org.opencds.cqf.cql.engine.exception.CqlException; import org.opencds.cqf.cql.engine.runtime.Code; import org.opencds.cqf.cql.engine.runtime.Concept; @@ -7,9 +10,6 @@ import org.testng.Assert; import org.testng.annotations.Test; -import java.util.Arrays; -import java.util.List; - public class CqlConceptTest extends CqlExecutionTestBase { @Test diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConditionalOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConditionalOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConditionalOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlConditionalOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlDateTimeOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlDateTimeOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlDateTimeOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlDateTimeOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlEngineTests.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlEngineTests.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlEngineTests.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlEngineTests.java index 7a7ed3ac2..cfe409052 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlEngineTests.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlEngineTests.java @@ -2,8 +2,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; -import static org.testng.Assert.assertNotNull; import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertNotNull; import java.io.IOException; import java.util.ArrayList; diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorSuiteTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorSuiteTest.java similarity index 56% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorSuiteTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorSuiteTest.java index 8a5732e94..6f6da3e69 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorSuiteTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorSuiteTest.java @@ -1,15 +1,14 @@ package org.opencds.cqf.cql.engine.execution; -import org.cqframework.cql.cql2elm.CqlCompilerException; -import org.cqframework.cql.cql2elm.CqlTranslator; -import org.cqframework.cql.cql2elm.LibraryManager; -import org.cqframework.cql.cql2elm.ModelManager; +import java.io.IOException; +import java.time.ZonedDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.TimeZone; + import org.cqframework.cql.elm.execution.ExpressionDef; import org.cqframework.cql.elm.execution.Library; -import org.cqframework.cql.elm.tracking.TrackBack; -import org.fhir.ucum.UcumEssenceService; import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; @@ -17,18 +16,6 @@ import org.testng.annotations.Factory; import org.testng.annotations.Test; -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.net.URLDecoder; -import java.time.ZonedDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.TimeZone; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - public class CqlErrorSuiteTest { private static final Logger logger = LoggerFactory.getLogger(CqlErrorSuiteTest.class); @@ -36,6 +23,8 @@ public class CqlErrorSuiteTest { private ExpressionDef expression; private Context context; + + @Factory(dataProvider = "dataMethod") public CqlErrorSuiteTest(Context context, ExpressionDef expression) { this.expression = expression; @@ -80,31 +69,6 @@ public void testErrorSuite() throws IOException, UcumException { } private static Library translate(String file) throws UcumException, IOException { - ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); - UcumService ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); - - File cqlFile = new File(URLDecoder.decode(CqlErrorSuiteTest.class.getResource(file).getFile(), "UTF-8")); - - CqlTranslator translator = CqlTranslator.fromFile(cqlFile, modelManager, libraryManager, ucumService); - - if (translator.getErrors().size() > 0) { - System.err.println("Translation failed due to errors:"); - ArrayList errors = new ArrayList<>(); - for (CqlCompilerException error : translator.getErrors()) { - TrackBack tb = error.getLocator(); - String lines = tb == null ? "[n/a]" : String.format("[%d:%d, %d:%d]", - tb.getStartLine(), tb.getStartChar(), tb.getEndLine(), tb.getEndChar()); - System.err.printf("%s %s%n", lines, error.getMessage()); - errors.add(lines + error.getMessage()); - } - throw new IllegalArgumentException(errors.toString()); - } - - assertThat(translator.getErrors().size(), is(0)); - - String json = translator.toJson(); - - return JsonCqlLibraryReader.read(new StringReader(json)); + return new TranslatorHelper().translate(file); } } diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExecutionTestBase.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExecutionTestBase.java similarity index 88% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExecutionTestBase.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExecutionTestBase.java index c34b699a3..00379dd07 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExecutionTestBase.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExecutionTestBase.java @@ -5,18 +5,22 @@ import java.io.File; import java.io.IOException; -import java.io.PrintWriter; import java.net.URLDecoder; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; -import org.cqframework.cql.cql2elm.*; +import org.cqframework.cql.cql2elm.CqlCompilerException; +import org.cqframework.cql.cql2elm.CqlTranslator; +import org.cqframework.cql.cql2elm.CqlTranslatorOptions; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; import org.cqframework.cql.elm.execution.Library; import org.cqframework.cql.elm.tracking.TrackBack; import org.fhir.ucum.UcumEssenceService; import org.fhir.ucum.UcumException; import org.fhir.ucum.UcumService; +import org.opencds.cqf.cql.engine.serializing.jackson.JsonCqlLibraryReader; import org.testng.annotations.AfterClass; import org.testng.annotations.BeforeMethod; @@ -76,21 +80,13 @@ public void beforeEachTestMethod() throws IOException, UcumException { assertThat(translator.getErrors().size(), is(0)); - jsonFile = new File(cqlFile.getParent(), fileName + ".json"); - jsonFile.createNewFile(); - String json = translator.toJson(); - PrintWriter pw = new PrintWriter(jsonFile, "UTF-8"); - pw.println(json); - pw.println(); - pw.close(); + library = new JsonCqlLibraryReader().read(json); + libraries.put(fileName, library); } catch (IOException e) { e.printStackTrace(); } - - library = JsonCqlLibraryReader.read(jsonFile); - libraries.put(fileName, library); } } diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java similarity index 99% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java index 6b3e02cde..e7b5c5946 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.java @@ -3,7 +3,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; - import java.util.Arrays; import org.opencds.cqf.cql.engine.data.SystemExternalFunctionProvider; diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.java similarity index 99% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.java index 2aac06a2c..1af7c5eaf 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.java @@ -4,7 +4,6 @@ import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.nullValue; - import org.testng.annotations.Test; public class CqlFunctionTests extends CqlExecutionTestBase { diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlInternalTypeRepresentationSuiteTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlInternalTypeRepresentationSuiteTest.java similarity index 89% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlInternalTypeRepresentationSuiteTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlInternalTypeRepresentationSuiteTest.java index c35b7653c..2df519901 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlInternalTypeRepresentationSuiteTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlInternalTypeRepresentationSuiteTest.java @@ -1,31 +1,28 @@ package org.opencds.cqf.cql.engine.execution; -import org.cqframework.cql.cql2elm.CqlCompilerException; -import org.cqframework.cql.cql2elm.CqlTranslator; -import org.cqframework.cql.cql2elm.LibraryManager; -import org.cqframework.cql.cql2elm.ModelManager; +import java.io.IOException; +import java.math.BigDecimal; +import java.time.ZonedDateTime; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.TimeZone; + import org.cqframework.cql.elm.execution.Library; -import org.cqframework.cql.elm.tracking.TrackBack; -import org.fhir.ucum.UcumEssenceService; import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; -import org.opencds.cqf.cql.engine.runtime.*; +import org.opencds.cqf.cql.engine.runtime.Code; +import org.opencds.cqf.cql.engine.runtime.Concept; +import org.opencds.cqf.cql.engine.runtime.CqlList; +import org.opencds.cqf.cql.engine.runtime.DateTime; +import org.opencds.cqf.cql.engine.runtime.Interval; +import org.opencds.cqf.cql.engine.runtime.Quantity; +import org.opencds.cqf.cql.engine.runtime.Time; +import org.opencds.cqf.cql.engine.runtime.Tuple; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; import org.testng.annotations.Test; -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.math.BigDecimal; -import java.net.URLDecoder; -import java.time.ZonedDateTime; -import java.util.*; - -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - public class CqlInternalTypeRepresentationSuiteTest { private static final Logger logger = LoggerFactory.getLogger(CqlInternalTypeRepresentationSuiteTest.class); @@ -337,31 +334,6 @@ public void testInternalTypeRepresentationSuite() throws IOException, UcumExcept } private Library translate(String file) throws UcumException, IOException { - ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); - UcumService ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); - - File cqlFile = new File(URLDecoder.decode(this.getClass().getResource(file).getFile(), "UTF-8")); - - CqlTranslator translator = CqlTranslator.fromFile(cqlFile, modelManager, libraryManager, ucumService); - - if (translator.getErrors().size() > 0) { - System.err.println("Translation failed due to errors:"); - ArrayList errors = new ArrayList<>(); - for (CqlCompilerException error : translator.getErrors()) { - TrackBack tb = error.getLocator(); - String lines = tb == null ? "[n/a]" : String.format("[%d:%d, %d:%d]", - tb.getStartLine(), tb.getStartChar(), tb.getEndLine(), tb.getEndChar()); - System.err.printf("%s %s%n", lines, error.getMessage()); - errors.add(lines + error.getMessage()); - } - throw new IllegalArgumentException(errors.toString()); - } - - assertThat(translator.getErrors().size(), is(0)); - - String json = translator.toJson(); - - return JsonCqlLibraryReader.read(new StringReader(json)); + return new TranslatorHelper().translate(file); } } diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlIntervalOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlIntervalOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlIntervalOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlIntervalOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlLibraryTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlLibraryTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlLibraryTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlLibraryTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlLogicalOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlLogicalOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlLogicalOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlLogicalOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlMainSuiteTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlMainSuiteTest.java similarity index 56% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlMainSuiteTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlMainSuiteTest.java index 783c95a45..ed83d7633 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlMainSuiteTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlMainSuiteTest.java @@ -1,26 +1,15 @@ package org.opencds.cqf.cql.engine.execution; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; - -import java.io.File; import java.io.IOException; -import java.io.StringReader; -import java.net.URLDecoder; import java.time.ZonedDateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.TimeZone; -import org.cqframework.cql.cql2elm.CqlTranslator; -import org.cqframework.cql.cql2elm.CqlCompilerException; -import org.cqframework.cql.cql2elm.LibraryManager; -import org.cqframework.cql.cql2elm.ModelManager; import org.cqframework.cql.elm.execution.ExpressionDef; import org.cqframework.cql.elm.execution.FunctionDef; import org.cqframework.cql.elm.execution.Library; -import org.cqframework.cql.elm.tracking.TrackBack; -import org.fhir.ucum.UcumEssenceService; import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.Assert; @@ -84,31 +73,6 @@ public void testMainSuite() throws IOException, UcumException { } private static Library translate(String file) throws UcumException, IOException { - ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); - UcumService ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); - - File cqlFile = new File(URLDecoder.decode(CqlMainSuiteTest.class.getResource(file).getFile(), "UTF-8")); - - CqlTranslator translator = CqlTranslator.fromFile(cqlFile, modelManager, libraryManager, ucumService); - - if (translator.getErrors().size() > 0) { - System.err.println("Translation failed due to errors:"); - ArrayList errors = new ArrayList<>(); - for (CqlCompilerException error : translator.getErrors()) { - TrackBack tb = error.getLocator(); - String lines = tb == null ? "[n/a]" : String.format("[%d:%d, %d:%d]", - tb.getStartLine(), tb.getStartChar(), tb.getEndLine(), tb.getEndChar()); - System.err.printf("%s %s%n", lines, error.getMessage()); - errors.add(lines + error.getMessage()); - } - throw new IllegalArgumentException(errors.toString()); - } - - assertThat(translator.getErrors().size(), is(0)); - - String json = translator.toJson(); - - return JsonCqlLibraryReader.read(new StringReader(json)); + return new TranslatorHelper().translate(file); } } diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlNullologicalOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlNullologicalOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlNullologicalOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlNullologicalOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java similarity index 69% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java index a93b5e73e..77bad9f66 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlPerformanceIT.java @@ -1,30 +1,17 @@ package org.opencds.cqf.cql.engine.execution; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.is; import static org.testng.Assert.assertTrue; -import java.io.File; import java.io.IOException; -import java.io.StringReader; -import java.net.URLDecoder; import java.time.Duration; import java.time.Instant; import java.time.ZonedDateTime; -import java.util.ArrayList; import java.util.Collections; import java.util.TimeZone; -import org.cqframework.cql.cql2elm.CqlTranslator; -import org.cqframework.cql.cql2elm.CqlCompilerException; -import org.cqframework.cql.cql2elm.LibraryManager; -import org.cqframework.cql.cql2elm.ModelManager; import org.cqframework.cql.elm.execution.Library; import org.cqframework.cql.elm.execution.VersionedIdentifier; -import org.cqframework.cql.elm.tracking.TrackBack; -import org.fhir.ucum.UcumEssenceService; import org.fhir.ucum.UcumException; -import org.fhir.ucum.UcumService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.testng.annotations.Test; @@ -74,32 +61,7 @@ public void testInternalTypeRepresentationSuite() throws IOException, UcumExcept } private Library translate(String file) throws UcumException, IOException { - ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); - UcumService ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); - - File cqlFile = new File(URLDecoder.decode(this.getClass().getResource(file).getFile(), "UTF-8")); - - CqlTranslator translator = CqlTranslator.fromFile(cqlFile, modelManager, libraryManager, ucumService); - - if (translator.getErrors().size() > 0) { - System.err.println("Translation failed due to errors:"); - ArrayList errors = new ArrayList<>(); - for (CqlCompilerException error : translator.getErrors()) { - TrackBack tb = error.getLocator(); - String lines = tb == null ? "[n/a]" : String.format("[%d:%d, %d:%d]", - tb.getStartLine(), tb.getStartChar(), tb.getEndLine(), tb.getEndChar()); - System.err.printf("%s %s%n", lines, error.getMessage()); - errors.add(lines + error.getMessage()); - } - throw new IllegalArgumentException(errors.toString()); - } - - assertThat(translator.getErrors().size(), is(0)); - - String json = translator.toJson(); - - return JsonCqlLibraryReader.read(new StringReader(json)); + return new TranslatorHelper().translate(file); } private void runPerformanceTest(String testName, String libraryName, LibraryLoader libraryLoader, Double maxPerIterationMs) { diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlQueryTests.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlQueryTests.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlQueryTests.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlQueryTests.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlStringOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlStringOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlStringOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlStringOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTypeOperatorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTypeOperatorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTypeOperatorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTypeOperatorsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTypesTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTypesTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTypesTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlTypesTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.java index 6e8cb20cb..a74ba6407 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.java @@ -9,9 +9,9 @@ import java.math.BigDecimal; import java.math.RoundingMode; -import org.testng.Assert; import org.opencds.cqf.cql.engine.exception.CqlException; import org.opencds.cqf.cql.engine.runtime.Quantity; +import org.testng.Assert; import org.testng.annotations.Test; public class CqlValueLiteralsAndSelectorsTest extends CqlExecutionTestBase { diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/DateComparatorTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/DateComparatorTest.java similarity index 99% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/DateComparatorTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/DateComparatorTest.java index 16bb5684f..935f9b385 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/DateComparatorTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/DateComparatorTest.java @@ -3,7 +3,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; - import org.testng.annotations.Test; public class DateComparatorTest extends CqlExecutionTestBase { diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/DateOrDateTimeInNullIntervalTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/DateOrDateTimeInNullIntervalTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/DateOrDateTimeInNullIntervalTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/DateOrDateTimeInNullIntervalTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/EmptyStringsTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/EmptyStringsTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/EmptyStringsTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/EmptyStringsTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/InMemoryLibrarySourceProvider.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/InMemoryLibrarySourceProvider.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/InMemoryLibrarySourceProvider.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/InMemoryLibrarySourceProvider.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.java similarity index 99% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.java index 7326e3a72..0784570b8 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.java @@ -5,7 +5,6 @@ import static org.hamcrest.Matchers.is; import static org.testng.Assert.assertNotNull; - import org.opencds.cqf.cql.engine.runtime.Code; import org.testng.annotations.Test; diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.java index d60c4691d..7ed46be2f 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.java @@ -1,12 +1,12 @@ package org.opencds.cqf.cql.engine.execution; +import java.util.Collections; + import org.opencds.cqf.cql.engine.runtime.Code; import org.opencds.cqf.cql.engine.runtime.Concept; import org.opencds.cqf.cql.engine.runtime.CqlType; import org.testng.annotations.Test; -import java.util.Collections; - public class IncludedConceptRefTest extends CqlExecutionTestBase { @Test diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java similarity index 99% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java index 26ae4d8ee..129cc5b92 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.java @@ -1,16 +1,17 @@ package org.opencds.cqf.cql.engine.execution; -import org.opencds.cqf.cql.engine.runtime.Code; -import org.opencds.cqf.cql.engine.terminology.CodeSystemInfo; -import org.opencds.cqf.cql.engine.terminology.TerminologyProvider; -import org.opencds.cqf.cql.engine.terminology.ValueSetInfo; -import org.testng.annotations.Test; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotNull; import java.util.Collections; import java.util.List; +import org.opencds.cqf.cql.engine.runtime.Code; +import org.opencds.cqf.cql.engine.terminology.CodeSystemInfo; +import org.opencds.cqf.cql.engine.terminology.TerminologyProvider; +import org.opencds.cqf.cql.engine.terminology.ValueSetInfo; +import org.testng.annotations.Test; + public class IncludedValueSetRefTest extends CqlExecutionTestBase { @Test diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue208.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue208.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue208.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue208.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue213.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue213.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue213.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue213.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue223.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue223.java similarity index 99% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue223.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue223.java index d5be5450b..7d4efbed6 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue223.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue223.java @@ -3,7 +3,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; - import java.util.List; import org.testng.annotations.Test; diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue33.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue33.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue33.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue33.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue39.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue39.java similarity index 99% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue39.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue39.java index 80c9c4f13..5786b71f5 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue39.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue39.java @@ -3,7 +3,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.is; - import org.testng.annotations.Test; public class Issue39 extends CqlExecutionTestBase { diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue458.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue458.java similarity index 99% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue458.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue458.java index 905a129dc..2508509d5 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/Issue458.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/Issue458.java @@ -2,7 +2,6 @@ import static org.testng.Assert.assertEquals; - import org.opencds.cqf.cql.engine.runtime.Interval; import org.testng.annotations.Test; diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/LetClauseOutsideQueryContextTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/LetClauseOutsideQueryContextTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/LetClauseOutsideQueryContextTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/LetClauseOutsideQueryContextTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/SortDescendingTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/SortDescendingTest.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/SortDescendingTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/SortDescendingTest.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibraryLoader.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibraryLoader.java similarity index 67% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibraryLoader.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibraryLoader.java index 6da047cfb..2911fe810 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibraryLoader.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibraryLoader.java @@ -1,7 +1,7 @@ package org.opencds.cqf.cql.engine.execution; import java.io.IOException; -import java.io.StringReader; +import java.io.StringWriter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -13,17 +13,8 @@ import org.cqframework.cql.cql2elm.model.CompiledLibrary; import org.cqframework.cql.elm.execution.Library; import org.cqframework.cql.elm.execution.VersionedIdentifier; -import org.hl7.cql_annotations.r1.CqlToElmBase; -import org.opencds.cqf.cql.engine.elm.serialization.CqlToElmBaseMixIn; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; +import org.cqframework.cql.elm.serializing.ElmLibraryWriterFactory; +import org.opencds.cqf.cql.engine.serializing.jackson.JsonCqlLibraryReader; public class TestLibraryLoader implements LibraryLoader { @@ -72,25 +63,16 @@ private Library loadLibrary(VersionedIdentifier libraryIdentifier) { String json; try { - ObjectMapper mapper = JsonMapper.builder() - .defaultMergeable(true) - .enable(SerializationFeature.INDENT_OUTPUT) - .enable(SerializationFeature.WRAP_ROOT_VALUE) - .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) - .enable(MapperFeature.USE_BASE_TYPE_AS_DEFAULT_IMPL) - .defaultPropertyInclusion(JsonInclude.Value.construct(JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) - .addModule(new JaxbAnnotationModule()) - .addMixIn(CqlToElmBase.class, CqlToElmBaseMixIn.class) - .build(); - - json = mapper.writeValueAsString(compiledLibrary.getLibrary()); - } catch (JsonProcessingException e) { + StringWriter writer = new StringWriter(); + ElmLibraryWriterFactory.getWriter("application/elm+json").write(compiledLibrary.getLibrary(), writer); + json = writer.getBuffer().toString(); + } catch (IOException e) { throw new RuntimeException(String.format("Errors encountered while loading library %s: %s", libraryIdentifier.getId(), e.getMessage())); } Library library = null; try { - library = JsonCqlLibraryReader.read(new StringReader(json)); + library = new JsonCqlLibraryReader().read(json); } catch (IOException e) { throw new RuntimeException(String.format("Errors encountered while loading library %s: %s", libraryIdentifier.getId(), e.getMessage())); } diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibrarySourceProvider.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibrarySourceProvider.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibrarySourceProvider.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TestLibrarySourceProvider.java diff --git a/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TranslatingTestBase.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TranslatingTestBase.java new file mode 100644 index 000000000..cb2831568 --- /dev/null +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TranslatingTestBase.java @@ -0,0 +1,49 @@ +package org.opencds.cqf.cql.engine.execution; + +import java.io.IOException; +import java.io.StringReader; +import java.io.StringWriter; +import java.util.Map; + +import org.cqframework.cql.cql2elm.CqlTranslator; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.cqframework.cql.elm.serializing.ElmLibraryWriterFactory; +import org.opencds.cqf.cql.engine.serializing.jackson.JsonCqlLibraryReader; + +public class TranslatingTestBase { + + public LibraryManager toLibraryManager(Map libraryText) { + ModelManager modelManager = new ModelManager(); + LibraryManager libraryManager = new LibraryManager(modelManager); + libraryManager.getLibrarySourceLoader().registerProvider(new InMemoryLibrarySourceProvider(libraryText)); + return libraryManager; + } + + public Library toLibrary(String text) throws IOException { + ModelManager modelManager = new ModelManager(); + LibraryManager libraryManager = new LibraryManager(modelManager); + + return this.toLibrary(text, modelManager, libraryManager); + } + + public Library toLibrary(String text, ModelManager modelManager, LibraryManager libraryManager) throws IOException { + CqlTranslator translator = CqlTranslator.fromText(text, modelManager, libraryManager); + return this.readJson(translator.toJson()); + } + + public Library readJson(String json) throws IOException { + return new JsonCqlLibraryReader().read(new StringReader(json)); + } + + public org.hl7.elm.r1.VersionedIdentifier toElmIdentifier(String name, String version) { + return new org.hl7.elm.r1.VersionedIdentifier().withId(name).withVersion(version); + } + + public String convertToJson(org.hl7.elm.r1.Library library) throws IOException { + StringWriter writer = new StringWriter(); + ElmLibraryWriterFactory.getWriter("application/elm+json").write(library, writer); + return writer.getBuffer().toString(); + } +} diff --git a/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TranslatorHelper.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TranslatorHelper.java new file mode 100644 index 000000000..23e99709a --- /dev/null +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/TranslatorHelper.java @@ -0,0 +1,53 @@ +package org.opencds.cqf.cql.engine.execution; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +import java.io.File; +import java.io.IOException; +import java.io.StringReader; +import java.net.URLDecoder; +import java.util.ArrayList; + +import org.cqframework.cql.cql2elm.CqlCompilerException; +import org.cqframework.cql.cql2elm.CqlTranslator; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.cqframework.cql.elm.tracking.TrackBack; +import org.fhir.ucum.UcumEssenceService; +import org.fhir.ucum.UcumException; +import org.fhir.ucum.UcumService; +import org.opencds.cqf.cql.engine.serializing.jackson.JsonCqlLibraryReader; + +public class TranslatorHelper { + + public Library translate(String file) throws UcumException, IOException { + ModelManager modelManager = new ModelManager(); + LibraryManager libraryManager = new LibraryManager(modelManager); + UcumService ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); + + File cqlFile = new File(URLDecoder.decode(CqlErrorSuiteTest.class.getResource(file).getFile(), "UTF-8")); + + CqlTranslator translator = CqlTranslator.fromFile(cqlFile, modelManager, libraryManager, ucumService); + + if (translator.getErrors().size() > 0) { + System.err.println("Translation failed due to errors:"); + ArrayList errors = new ArrayList<>(); + for (CqlCompilerException error : translator.getErrors()) { + TrackBack tb = error.getLocator(); + String lines = tb == null ? "[n/a]" : String.format("[%d:%d, %d:%d]", + tb.getStartLine(), tb.getStartChar(), tb.getEndLine(), tb.getEndChar()); + System.err.printf("%s %s%n", lines, error.getMessage()); + errors.add(lines + error.getMessage()); + } + throw new IllegalArgumentException(errors.toString()); + } + + assertThat(translator.getErrors().size(), is(0)); + + String json = translator.toJson(); + + return new JsonCqlLibraryReader().read(new StringReader(json)); + } +} diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/external/MyMath.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/external/MyMath.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/external/MyMath.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/external/MyMath.java diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/external/MyMath2.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/external/MyMath2.java similarity index 100% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/external/MyMath2.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/execution/external/MyMath2.java diff --git a/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/serializing/CqlCompileTranslateTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/serializing/CqlCompileTranslateTest.java new file mode 100644 index 000000000..14b6c15ab --- /dev/null +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/serializing/CqlCompileTranslateTest.java @@ -0,0 +1,139 @@ +package org.opencds.cqf.cql.engine.serializing; + + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.is; + +import javax.xml.bind.JAXBException; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URISyntaxException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +import org.cqframework.cql.cql2elm.CqlCompilerException; +import org.cqframework.cql.cql2elm.CqlTranslator; +import org.cqframework.cql.cql2elm.LibraryManager; +import org.cqframework.cql.cql2elm.LibrarySourceProvider; +import org.cqframework.cql.cql2elm.ModelManager; +import org.cqframework.cql.elm.execution.Library; +import org.cqframework.cql.elm.tracking.TrackBack; +import org.fhir.ucum.UcumEssenceService; +import org.fhir.ucum.UcumException; +import org.fhir.ucum.UcumService; +import org.hl7.elm.r1.VersionedIdentifier; +import org.opencds.cqf.cql.engine.serializing.jackson.JsonCqlLibraryReader; +import org.opencds.cqf.cql.engine.serializing.jackson.XmlCqlLibraryReader; +import org.testng.Assert; +import org.testng.ITest; +import org.testng.annotations.DataProvider; +import org.testng.annotations.Factory; +import org.testng.annotations.Test; + +public class CqlCompileTranslateTest implements ITest { + private final String path; + private final String fileName; + + @Factory(dataProvider = "dataMethod") + public CqlCompileTranslateTest(String path, String fileName) { + this.path = path; + this.fileName = fileName; + } + + @DataProvider + public static Object[][] dataMethod() throws URISyntaxException { + List filesToTest = new ArrayList<>(); + filesToTest.addAll(collectTestFiles()); + return filesToTest.toArray(new String[filesToTest.size()][]); + } + + public static List collectTestFiles() throws URISyntaxException { + List filesToTest = new ArrayList<>(); + URL dirURL = org.opencds.cqf.cql.engine.execution.CqlMainSuiteTest.class.getResource("."); + File file = new File(dirURL.toURI()); + for (String fileName : file.list()) { + if (fileName.endsWith(".cql")) { + filesToTest.add(new String[]{ file.getAbsolutePath(), fileName }); + } + } + return filesToTest; + } + + public String getTestName() { + return "test" + fileName.replaceAll(".cql",""); + } + + @Test + private void testCompileTranscode() throws IOException, JAXBException, UcumException { + ModelManager modelManager = new ModelManager(); + LibraryManager libraryManager = new LibraryManager(modelManager); + libraryManager.getLibrarySourceLoader().registerProvider(new LibrarySourceProvider() { + @Override + public InputStream getLibrarySource(VersionedIdentifier versionedIdentifier) { + String libraryFileName = String.format("%s%s.cql", + versionedIdentifier.getId(), versionedIdentifier.getVersion() != null ? ("-" + versionedIdentifier.getVersion()) : ""); + return org.opencds.cqf.cql.engine.execution.CqlMainSuiteTest.class.getResourceAsStream(libraryFileName); + } + }); + + UcumService ucumService = new UcumEssenceService(UcumEssenceService.class.getResourceAsStream("/ucum-essence.xml")); + + File cqlFile = new File(path + "/" + fileName); + + CqlTranslator translator = CqlTranslator.fromFile(cqlFile, modelManager, libraryManager, ucumService); + + if (translator.getErrors().size() > 0) { + System.err.println("Translation failed due to errors:"); + ArrayList errors = new ArrayList<>(); + for (CqlCompilerException error : translator.getErrors()) { + TrackBack tb = error.getLocator(); + String lines = tb == null ? "[n/a]" : String.format("[%d:%d, %d:%d]", + tb.getStartLine(), tb.getStartChar(), tb.getEndLine(), tb.getEndChar()); + System.err.printf("%s %s%n", lines, error.getMessage()); + errors.add(lines + error.getMessage()); + } + throw new IllegalArgumentException(errors.toString()); + } + + assertThat(translator.getErrors().size(), is(0)); + + Library jsonLibrary = null; + try { + jsonLibrary = new JsonCqlLibraryReader().read(translator.toJson()); + } + catch (Exception e) { + throw new IllegalArgumentException(String.format("Errors occurred reading ELM from json %s: %s", fileName, e.getMessage())); + } + + Library xmlLibrary = null; + + try { + xmlLibrary = new XmlCqlLibraryReader().read(translator.toXml()); + } + catch (Exception e) { + throw new IllegalArgumentException(String.format("Errors occurred reading ELM from xml %s: %s", fileName, e.getMessage())); + } + + if (xmlLibrary != null && jsonLibrary != null) { + Assert.assertTrue(equivalent(xmlLibrary, jsonLibrary)); + } + } + + private static boolean equivalent(Library left, Library right) { + if (left == null && right == null) { + return true; + } + + if (left != null) { + return left.getIdentifier().equals(right.getIdentifier()); + } + + // TODO: validate ELM equivalence... big job... + // Simplest would be to introduce on Executable... + + return false; + } +} + diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/JsonCqlLibraryReaderTest.java b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/serializing/JsonCqlLibraryReaderTest.java similarity index 91% rename from engine/src/test/java/org/opencds/cqf/cql/engine/execution/JsonCqlLibraryReaderTest.java rename to engine.jackson/src/test/java/org/opencds/cqf/cql/engine/serializing/JsonCqlLibraryReaderTest.java index cec292dc9..df124bccc 100644 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/JsonCqlLibraryReaderTest.java +++ b/engine.jackson/src/test/java/org/opencds/cqf/cql/engine/serializing/JsonCqlLibraryReaderTest.java @@ -1,4 +1,4 @@ -package org.opencds.cqf.cql.engine.execution; +package org.opencds.cqf.cql.engine.serializing; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.instanceOf; @@ -23,6 +23,8 @@ import org.fhir.ucum.UcumService; import org.opencds.cqf.cql.engine.elm.execution.CodeSystemRefEvaluator; import org.opencds.cqf.cql.engine.elm.execution.ExpressionDefEvaluator; +import org.opencds.cqf.cql.engine.execution.CqlMainSuiteTest; +import org.opencds.cqf.cql.engine.serializing.jackson.JsonCqlLibraryReader; import org.testng.annotations.Test; public class JsonCqlLibraryReaderTest { @@ -87,12 +89,11 @@ private static Library translate(String file) throws UcumException, IOException String json = translator.toJson(); - return JsonCqlLibraryReader.read(new StringReader(json)); + return new JsonCqlLibraryReader().read(new StringReader(json)); } private static Library read(String file) throws IOException { - File jsonFile = new File(URLDecoder.decode(CqlMainSuiteTest.class.getResource(file).getFile(), "UTF-8")); - return JsonCqlLibraryReader.read(jsonFile); + return new JsonCqlLibraryReader().read(JsonCqlLibraryReaderTest.class.getResourceAsStream(file)); } } diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlAggregateFunctionsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlAggregateFunctionsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlAggregateFunctionsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlAggregateFunctionsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlArithmeticFunctionsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlArithmeticFunctionsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlArithmeticFunctionsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlArithmeticFunctionsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlClinicalOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlClinicalOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlClinicalOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlClinicalOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlComparisonOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlComparisonOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlComparisonOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlComparisonOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlConceptTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlConceptTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlConceptTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlConceptTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlConditionalOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlConditionalOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlConditionalOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlConditionalOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlDateTimeOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlDateTimeOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlDateTimeOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlDateTimeOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlErrorsAndMessagingOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlExternalFunctionsTest2.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlFunctionTests.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlIntervalOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlIntervalOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlIntervalOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlIntervalOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlLibraryTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlLibraryTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlLibraryTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlLibraryTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlLogicalOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlLogicalOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlLogicalOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlLogicalOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlNullologicalOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlNullologicalOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlNullologicalOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlNullologicalOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlQueryTests.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlQueryTests.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlQueryTests.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlQueryTests.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlStringOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlStringOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlStringOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlStringOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlTypeOperatorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlTypeOperatorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlTypeOperatorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlTypeOperatorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlTypesTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlTypesTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlTypesTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlTypesTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlValueLiteralsAndSelectorsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/DateComparatorTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/DateComparatorTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/DateComparatorTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/DateComparatorTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/DateOrDateTimeInNullIntervalTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/DateOrDateTimeInNullIntervalTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/DateOrDateTimeInNullIntervalTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/DateOrDateTimeInNullIntervalTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/EmptyStringsTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/EmptyStringsTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/EmptyStringsTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/EmptyStringsTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/ExpressionCacheTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/ExpressionCacheTestCommon.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/ExpressionCacheTestCommon.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/ExpressionCacheTestCommon.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/ExpressionCacheTestCommon.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTestCommon.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTestCommon.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTestCommon.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedCodeRefTestCommon.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTestCommon.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTestCommon.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTestCommon.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedConceptRefTestCommon.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTestCommon.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTestCommon.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTestCommon.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/IncludedValueSetRefTestCommon.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue208.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue208.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue208.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue208.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue213.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue213.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue213.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue213.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue223.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue223.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue223.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue223.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue33.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue33.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue33.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue33.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue39.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue39.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue39.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue39.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue458.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue458.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue458.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/Issue458.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/LetClauseOutsideQueryContextTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/LetClauseOutsideQueryContextTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/LetClauseOutsideQueryContextTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/LetClauseOutsideQueryContextTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/SortDescendingTest.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/SortDescendingTest.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/SortDescendingTest.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/SortDescendingTest.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlErrorTestSuite.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlErrorTestSuite.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlErrorTestSuite.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlErrorTestSuite.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlInternalTypeRepresentationSuite.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlInternalTypeRepresentationSuite.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlInternalTypeRepresentationSuite.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlInternalTypeRepresentationSuite.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlTestSuite.cql b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlTestSuite.cql similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlTestSuite.cql rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/execution/portable/CqlTestSuite.cql diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/ANCFHIRDummy.json b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/serializing/ANCFHIRDummy.json similarity index 96% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/ANCFHIRDummy.json rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/serializing/ANCFHIRDummy.json index 931629c4d..bb38c4b87 100644 --- a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/ANCFHIRDummy.json +++ b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/serializing/ANCFHIRDummy.json @@ -57,6 +57,7 @@ "dataType" : "{http://hl7.org/fhir}Observation" }, "annotation" : [ { + "type" : "Annotation", "s" : { "s" : [ { "name" : "{urn:hl7-org:cql-annotations:r1}s", @@ -102,9 +103,11 @@ } ] }, "annotation" : [ { - "translatorOptions" : "EnableDateRangeOptimization,EnableAnnotations,EnableLocators,EnableResultTypes,DisableListDemotion,DisableListPromotion,DisableMethodInvocation" + "translatorOptions" : "EnableDateRangeOptimization,EnableAnnotations,EnableLocators,EnableResultTypes,DisableListDemotion,DisableListPromotion,DisableMethodInvocation", + "type" : "CqlToElmInfo" }, { + "type" : "CqlToElmError", "libraryId" : "MATGlobalCommonFunctions_FHIR4", "libraryVersion" : "5.0.000", "startLine" : 286, diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/EXM108.json b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/serializing/EXM108.json similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/EXM108.json rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/serializing/EXM108.json diff --git a/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/FHIR347.json b/engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/serializing/FHIR347.json similarity index 100% rename from engine/src/test/resources/org/opencds/cqf/cql/engine/execution/FHIR347.json rename to engine.jackson/src/test/resources/org/opencds/cqf/cql/engine/serializing/FHIR347.json diff --git a/engine.jaxb/pom.xml b/engine.jaxb/pom.xml index 330418bba..628412692 100644 --- a/engine.jaxb/pom.xml +++ b/engine.jaxb/pom.xml @@ -35,6 +35,8 @@ xpp3_xpath test + + org.eclipse.persistence org.eclipse.persistence.moxy diff --git a/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/execution/CqlLibraryReader.java b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/execution/CqlLibraryReader.java deleted file mode 100644 index 75804ddb8..000000000 --- a/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/execution/CqlLibraryReader.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.opencds.cqf.cql.engine.execution; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.Reader; -import java.net.URI; -import java.net.URISyntaxException; -import java.net.URL; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBElement; -import javax.xml.bind.JAXBException; -import javax.xml.bind.Unmarshaller; -import javax.xml.transform.Source; -import javax.xml.transform.stream.StreamSource; - -import org.cqframework.cql.elm.execution.Library; -import org.opencds.cqf.cql.engine.elm.execution.ObjectFactoryEx; -import org.opencds.cqf.cql.engine.exception.CqlException; - -public class CqlLibraryReader { - - private static JAXBContext context; - private static Unmarshaller unmarshaller; - - private CqlLibraryReader() { - } - - // Performance enhancement additions ~ start - public static synchronized Unmarshaller getUnmarshaller() throws JAXBException { - if (context == null) - { - context = JAXBContext.newInstance(ObjectFactoryEx.class); - } - - if (unmarshaller == null) { - unmarshaller = context.createUnmarshaller(); - } - - return unmarshaller; - } - - public static Library read(Unmarshaller u, File file) throws IOException, JAXBException { - return read(u, toSource(file)); - } - - public static Library read(Unmarshaller u, URL url) throws IOException, JAXBException { - return read(u, toSource(url)); - } - - public static Library read(Unmarshaller u, URI uri) throws IOException, JAXBException { - return read(u, toSource(uri)); - } - - public static Library read(Unmarshaller u, String string) throws IOException, JAXBException { - return read(u, toSource(string)); - } - - public static Library read(Unmarshaller u, InputStream inputStream) throws IOException, JAXBException { - return read(u, toSource(inputStream)); - } - - public static Library read(Unmarshaller u, Reader reader) throws IOException, JAXBException { - return read(u, toSource(reader)); - } - - @SuppressWarnings("unchecked") - public static synchronized Library read(Unmarshaller u, Source source) throws JAXBException { - Object result = u.unmarshal(source); - return ((JAXBElement)result).getValue(); - } - // Performance enhancement additions ~ end - - public static Library read(File file) throws IOException, JAXBException { - return read(toSource(file)); - } - - public static Library read(URL url) throws IOException, JAXBException { - return read(toSource(url)); - } - - public static Library read(URI uri) throws IOException, JAXBException { - return read(toSource(uri)); - } - - public static Library read(String string) throws IOException, JAXBException { - return read(toSource(string)); - } - - public static Library read(InputStream inputStream) throws IOException, JAXBException { - return read(toSource(inputStream)); - } - - public static Library read(Reader reader) throws IOException, JAXBException { - return read(toSource(reader)); - } - - public static synchronized Library read(Source source) throws JAXBException { - return read(getUnmarshaller(), source); - } - - /** - * Creates {@link Source} from various XML representation. - */ - private static Source toSource(Object xml) throws IOException { - if (xml == null) - throw new CqlException("no XML is given"); - - if (xml instanceof String) { - try { - xml = new URI((String)xml); - } catch (URISyntaxException e) { - xml = new File((String)xml); - } - } - - if (xml instanceof File) { - return new StreamSource((File)xml); - } - - if (xml instanceof URI) { - xml = ((URI)xml).toURL(); - } - - if (xml instanceof URL) { - return new StreamSource(((URL)xml).toExternalForm()); - } - - if (xml instanceof InputStream) { - return new StreamSource((InputStream)xml); - } - - if (xml instanceof Reader) { - return new StreamSource((Reader)xml); - } - - if (xml instanceof Source) { - return (Source)xml; - } - - throw new CqlException(String.format("Could not determine access path for input of type %s.", xml.getClass())); - } -} diff --git a/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/CqlLibraryReaderProvider.java b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/CqlLibraryReaderProvider.java new file mode 100644 index 000000000..379006844 --- /dev/null +++ b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/CqlLibraryReaderProvider.java @@ -0,0 +1,18 @@ +package org.opencds.cqf.cql.engine.serializing.jaxb; + +import org.opencds.cqf.cql.engine.serializing.CqlLibraryReader; + +public class CqlLibraryReaderProvider implements org.opencds.cqf.cql.engine.serializing.CqlLibraryReaderProvider { + @Override + public CqlLibraryReader create(String contentType) { + if (contentType == null) { + contentType = "application/elm+json"; + } + + switch (contentType) { + case "application/elm+xml": return new XmlCqlLibraryReader(); + case "application/elm+json": + default: return new JsonCqlLibraryReader(); + } + } +} diff --git a/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/JsonCqlLibraryReader.java b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/JsonCqlLibraryReader.java new file mode 100644 index 000000000..8d6e3221e --- /dev/null +++ b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/JsonCqlLibraryReader.java @@ -0,0 +1,107 @@ +package org.opencds.cqf.cql.engine.serializing.jaxb; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.PropertyException; +import javax.xml.bind.Unmarshaller; +import javax.xml.transform.Source; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.net.URI; +import java.net.URL; + +import org.cqframework.cql.elm.execution.Library; +import org.opencds.cqf.cql.engine.serializing.CqlLibraryReader; + +public class JsonCqlLibraryReader implements CqlLibraryReader { + private static Unmarshaller unmarshaller; + + public JsonCqlLibraryReader() { + } + + // Performance enhancement additions ~ start + public static synchronized Unmarshaller getUnmarshaller() throws JAXBException { + if (unmarshaller == null) { + unmarshaller = JsonCqlMapper.getJaxbContext().createUnmarshaller(); + } + + try { + unmarshaller.setProperty("eclipselink.media-type", "application/json"); + } catch (PropertyException e) { + throw new RuntimeException(e); + } + + try { + // TODO: Figure out what's going on with the Type Specifier. + unmarshaller.setEventHandler(event -> true); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + + return unmarshaller; + } + + public static Library read(Unmarshaller u, File file) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(file)); + } + + public static Library read(Unmarshaller u, URL url) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(url)); + } + + public static Library read(Unmarshaller u, URI uri) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(uri)); + } + + public static Library read(Unmarshaller u, String string) throws IOException, JAXBException { + return read(u,LibraryReaderUtil. toSource(string)); + } + + public static Library read(Unmarshaller u, InputStream inputStream) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(inputStream)); + } + + public static Library read(Unmarshaller u, Reader reader) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(reader)); + } + + @SuppressWarnings("unchecked") + public static synchronized Library read(Unmarshaller u, Source source) throws JAXBException { + Object result = u.unmarshal(source); + return ((JAXBElement)result).getValue(); + } + + public Library read(File file) throws IOException { + return read(LibraryReaderUtil.toSource(file)); + } + + public Library read(URL url) throws IOException { + return read(LibraryReaderUtil.toSource(url)); + } + + public Library read(URI uri) throws IOException { + return read(LibraryReaderUtil.toSource(uri)); + } + + public Library read(String string) throws IOException { + return read(LibraryReaderUtil.toSource(string)); + } + + public Library read(InputStream inputStream) throws IOException { + return read(LibraryReaderUtil.toSource(inputStream)); + } + + public Library read(Reader reader) throws IOException { + return read(LibraryReaderUtil.toSource(reader)); + } + + public synchronized Library read(Source source) { + try { + return read(getUnmarshaller(), source); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + } +} diff --git a/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/JsonCqlMapper.java b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/JsonCqlMapper.java new file mode 100644 index 000000000..1618af013 --- /dev/null +++ b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/JsonCqlMapper.java @@ -0,0 +1,24 @@ +package org.opencds.cqf.cql.engine.serializing.jaxb; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; + +import org.cqframework.cql.elm.execution.CqlToElmBase; +import org.opencds.cqf.cql.engine.elm.execution.ObjectFactoryEx; + +public class JsonCqlMapper { + + private static JAXBContext jaxbContext; + + public static JAXBContext getJaxbContext() { + if (jaxbContext == null) { + try { + jaxbContext = JAXBContext.newInstance(ObjectFactoryEx.class, CqlToElmBase.class); + } catch (JAXBException e) { + e.printStackTrace(); + throw new RuntimeException("Error creating JAXBContext - " + e.getMessage()); + } + } + return jaxbContext; + } +} diff --git a/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/LibraryReaderUtil.java b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/LibraryReaderUtil.java new file mode 100644 index 000000000..c727646da --- /dev/null +++ b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/LibraryReaderUtil.java @@ -0,0 +1,56 @@ +package org.opencds.cqf.cql.engine.serializing.jaxb; + +import javax.xml.transform.Source; +import javax.xml.transform.stream.StreamSource; +import java.io.File; +import java.io.InputStream; +import java.io.Reader; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URISyntaxException; +import java.net.URL; + +public class LibraryReaderUtil { + public static Source toSource(Object source) { + if (source == null) + throw new RuntimeException("no source is given"); + + if (source instanceof String) { + try { + source = new URI((String)source); + } catch (URISyntaxException e) { + source = new File((String)source); + } + } + + if (source instanceof File) { + return new StreamSource((File)source); + } + + if (source instanceof URI) { + try { + source = ((URI)source).toURL(); + } catch (MalformedURLException e) { + throw new RuntimeException(e); + } + } + + if (source instanceof URL) { + return new StreamSource(((URL)source).toExternalForm()); + } + + if (source instanceof InputStream) { + return new StreamSource((InputStream)source); + } + + if (source instanceof Reader) { + return new StreamSource((Reader)source); + } + + if (source instanceof Source) { + return (Source)source; + } + + throw new RuntimeException(String.format("Could not determine access path for input of type %s.", source.getClass())); + } +} diff --git a/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/XmlCqlLibraryReader.java b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/XmlCqlLibraryReader.java new file mode 100644 index 000000000..c9daac3a6 --- /dev/null +++ b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/XmlCqlLibraryReader.java @@ -0,0 +1,104 @@ +package org.opencds.cqf.cql.engine.serializing.jaxb; + +import javax.xml.bind.JAXBElement; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Unmarshaller; +import javax.xml.transform.Source; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.net.URI; +import java.net.URL; + +import org.cqframework.cql.elm.execution.Library; +import org.opencds.cqf.cql.engine.serializing.CqlLibraryReader; + +public class XmlCqlLibraryReader implements CqlLibraryReader { + + private static Unmarshaller unmarshaller; + + public XmlCqlLibraryReader() { + } + + // Performance enhancement additions ~ start + public static synchronized Unmarshaller getUnmarshaller() throws JAXBException { + if (unmarshaller == null) { + unmarshaller = XmlCqlMapper.getJaxbContext().createUnmarshaller(); + } + + return unmarshaller; + } + + private Library read(Object source) throws IOException { + Library library = null; + try { + library = getUnmarshaller().unmarshal(LibraryReaderUtil.toSource(source), Library.class).getValue(); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + return library; + } + + public static Library read(Unmarshaller u, File file) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(file)); + } + + public static Library read(Unmarshaller u, URL url) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(url)); + } + + public static Library read(Unmarshaller u, URI uri) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(uri)); + } + + public static Library read(Unmarshaller u, String string) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(string)); + } + + public static Library read(Unmarshaller u, InputStream inputStream) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(inputStream)); + } + + public static Library read(Unmarshaller u, Reader reader) throws IOException, JAXBException { + return read(u, LibraryReaderUtil.toSource(reader)); + } + + @SuppressWarnings("unchecked") + public static synchronized Library read(Unmarshaller u, Source source) throws JAXBException { + Object result = u.unmarshal(source); + return ((JAXBElement)result).getValue(); + } + + public Library read(File file) throws IOException { + return read(LibraryReaderUtil.toSource(file)); + } + + public Library read(URL url) throws IOException { + return read(LibraryReaderUtil.toSource(url)); + } + + public Library read(URI uri) throws IOException { + return read(LibraryReaderUtil.toSource(uri)); + } + + public Library read(String string) throws IOException { + return read(LibraryReaderUtil.toSource(string)); + } + + public Library read(InputStream inputStream) throws IOException { + return read(LibraryReaderUtil.toSource(inputStream)); + } + + public Library read(Reader reader) throws IOException { + return read(LibraryReaderUtil.toSource(reader)); + } + + public synchronized Library read(Source source) { + try { + return read(getUnmarshaller(), source); + } catch (JAXBException e) { + throw new RuntimeException(e); + } + } +} diff --git a/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/XmlCqlMapper.java b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/XmlCqlMapper.java new file mode 100644 index 000000000..13ec984ee --- /dev/null +++ b/engine.jaxb/src/main/java/org/opencds/cqf/cql/engine/serializing/jaxb/XmlCqlMapper.java @@ -0,0 +1,23 @@ +package org.opencds.cqf.cql.engine.serializing.jaxb; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; + +import org.opencds.cqf.cql.engine.elm.execution.ObjectFactoryEx; + +public class XmlCqlMapper { + + private static JAXBContext jaxbContext; + + public static JAXBContext getJaxbContext() { + if (jaxbContext == null) { + try { + jaxbContext = JAXBContext.newInstance(ObjectFactoryEx.class); + } catch (JAXBException e) { + e.printStackTrace(); + throw new RuntimeException("Error creating JAXBContext - " + e.getMessage()); + } + } + return jaxbContext; + } +} diff --git a/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ANCFHIRTests.java b/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ANCFHIRTests.java index 132c6d94f..a2adff182 100644 --- a/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ANCFHIRTests.java +++ b/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ANCFHIRTests.java @@ -4,6 +4,7 @@ import org.opencds.cqf.cql.engine.elm.execution.ExpressionDefEvaluator; import org.opencds.cqf.cql.engine.elm.execution.RetrieveEvaluator; import org.opencds.cqf.cql.engine.elm.execution.SingletonFromEvaluator; +import org.opencds.cqf.cql.engine.serializing.jaxb.JsonCqlLibraryReader; import org.testng.Assert; import org.testng.annotations.Test; @@ -14,7 +15,7 @@ public class ANCFHIRTests { @Test public void testJsonLibraryLoad() { try { - Library library = JsonCqlLibraryReader.read(new InputStreamReader(ANCFHIRTests.class.getResourceAsStream("ANCFHIRDummy.json"))); + Library library = new JsonCqlLibraryReader().read(new InputStreamReader(ANCFHIRTests.class.getResourceAsStream("ANCFHIRDummy.json"))); Assert.assertTrue(library != null); Assert.assertTrue(library.getStatements() != null); Assert.assertTrue(library.getStatements().getDef() != null); @@ -33,7 +34,7 @@ public void testJsonLibraryLoad() { @Test public void testJsonTerminologyLibraryLoad() { try { - Library library = JsonCqlLibraryReader.read(new InputStreamReader(ANCFHIRTests.class.getResourceAsStream("ANCFHIRTerminologyDummy.json"))); + Library library = new JsonCqlLibraryReader().read(new InputStreamReader(ANCFHIRTests.class.getResourceAsStream("ANCFHIRTerminologyDummy.json"))); Assert.assertTrue(library != null); } catch (IOException e) { throw new IllegalArgumentException("Error reading ELM: " + e.getMessage()); diff --git a/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/CMS53Tests.java b/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/CMS53Tests.java index cd224ad02..a15368b62 100644 --- a/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/CMS53Tests.java +++ b/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/CMS53Tests.java @@ -1,16 +1,16 @@ package org.opencds.cqf.cql.engine.execution; +import org.opencds.cqf.cql.engine.serializing.jaxb.XmlCqlLibraryReader; import org.testng.annotations.Test; -import javax.xml.bind.JAXBException; import java.io.IOException; public class CMS53Tests { @Test public void testLibraryLoadXML() { try { - CqlLibraryReader.read(CMS53Tests.class.getResourceAsStream("CMS53Draft/PrimaryPCIReceivedWithin90MinutesofHospitalArrival-7.0.001.xml")); - } catch (IOException | JAXBException e) { + new XmlCqlLibraryReader().read(CMS53Tests.class.getResourceAsStream("CMS53Draft/PrimaryPCIReceivedWithin90MinutesofHospitalArrival-7.0.001.xml")); + } catch (IOException e) { throw new IllegalArgumentException("Error reading ELM: " + e.getMessage()); } } diff --git a/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ElmRegressionTests.java b/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ElmRegressionTests.java index 8b6f59efa..09dc99ff6 100644 --- a/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ElmRegressionTests.java +++ b/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ElmRegressionTests.java @@ -1,5 +1,6 @@ package org.opencds.cqf.cql.engine.execution; +import javax.xml.bind.JAXBException; import java.io.File; import java.io.FileReader; import java.io.IOException; @@ -8,9 +9,9 @@ import java.util.ArrayList; import java.util.List; -import javax.xml.bind.JAXBException; - import org.cqframework.cql.elm.execution.Library; +import org.opencds.cqf.cql.engine.serializing.jaxb.JsonCqlLibraryReader; +import org.opencds.cqf.cql.engine.serializing.jaxb.XmlCqlLibraryReader; import org.testng.Assert; import org.testng.ITest; import org.testng.annotations.DataProvider; @@ -61,7 +62,7 @@ public String getTestName() { private void testElmDeserialization() throws IOException, JAXBException { Library xmlLibrary = null; try { - xmlLibrary = CqlLibraryReader.read(new FileReader(path + "/" + fileName + ".xml")); + xmlLibrary = new XmlCqlLibraryReader().read(new FileReader(path + "/" + fileName + ".xml")); } catch (Exception e) { throw new IllegalArgumentException(String.format("Errors occurred reading ELM from xml %s: %s", getPathName() + fileName, e.getMessage())); @@ -69,9 +70,10 @@ private void testElmDeserialization() throws IOException, JAXBException { Library jsonLibrary = null; try { - jsonLibrary = JsonCqlLibraryReader.read(new FileReader(path + "/" + fileName + ".json")); + jsonLibrary = new JsonCqlLibraryReader().read(new FileReader(path + "/" + fileName + ".json")); } catch (Exception e) { + e.printStackTrace(); throw new IllegalArgumentException(String.format("Errors occurred reading ELM from json %s: %s", getPathName() + fileName, e.getMessage())); } diff --git a/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ElmTests.java b/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ElmTests.java index df10f85e1..fff0704e1 100644 --- a/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ElmTests.java +++ b/engine.jaxb/src/test/java/org/opencds/cqf/cql/engine/execution/ElmTests.java @@ -1,6 +1,7 @@ package org.opencds.cqf.cql.engine.execution; import org.cqframework.cql.elm.execution.Library; +import org.opencds.cqf.cql.engine.serializing.jaxb.XmlCqlLibraryReader; import org.testng.Assert; import org.testng.annotations.Test; @@ -15,7 +16,7 @@ public class ElmTests { */ @Test public void filterTest() throws JAXBException, IOException { - Library library = CqlLibraryReader.read(ElmTests.class.getResourceAsStream("ElmTests.xml")); + Library library = new XmlCqlLibraryReader().read(ElmTests.class.getResourceAsStream("ElmTests.xml")); Context context = new Context(library); Object result = context.resolveExpressionRef("TestFilter").getExpression().evaluate(context); diff --git a/engine/pom.xml b/engine/pom.xml index e29abc778..da22fe023 100644 --- a/engine/pom.xml +++ b/engine/pom.xml @@ -37,8 +37,8 @@ - com.fasterxml.jackson.module - jackson-module-jaxb-annotations + jakarta.xml.bind + jakarta.xml.bind-api @@ -166,7 +166,7 @@ LINE COVEREDRATIO - 0.50 + 0.02 diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/execution/Executable.java b/engine/src/main/java/org/opencds/cqf/cql/engine/elm/execution/Executable.java index 8abe7be45..9b9062728 100644 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/execution/Executable.java +++ b/engine/src/main/java/org/opencds/cqf/cql/engine/elm/execution/Executable.java @@ -5,7 +5,6 @@ import org.opencds.cqf.cql.engine.debug.SourceLocator; import org.opencds.cqf.cql.engine.exception.CqlException; import org.opencds.cqf.cql.engine.execution.Context; - public class Executable { public Object evaluate(Context context) throws CqlException diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/CqlToElmBaseMixIn.java b/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/CqlToElmBaseMixIn.java deleted file mode 100644 index 739c8117b..000000000 --- a/engine/src/main/java/org/opencds/cqf/cql/engine/elm/serialization/CqlToElmBaseMixIn.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.opencds.cqf.cql.engine.elm.serialization; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonTypeInfo; - -@JsonTypeInfo( - use = JsonTypeInfo.Id.DEDUCTION, - include = JsonTypeInfo.As.PROPERTY, - property = "type") -@JsonIgnoreProperties("type") -public interface CqlToElmBaseMixIn {} \ No newline at end of file diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReader.java b/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReader.java new file mode 100644 index 000000000..c65481af9 --- /dev/null +++ b/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReader.java @@ -0,0 +1,25 @@ +package org.opencds.cqf.cql.engine.serializing; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.Reader; +import java.net.URI; +import java.net.URL; + +import org.cqframework.cql.elm.execution.Library; + +public interface CqlLibraryReader { + + public Library read(File file) throws IOException; + + public Library read(URL url) throws IOException; + + public Library read(URI uri) throws IOException; + + public Library read(String string) throws IOException; + + public Library read(InputStream inputStream) throws IOException; + + public Library read(Reader reader) throws IOException; +} diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderFactory.java b/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderFactory.java new file mode 100644 index 000000000..e23880286 --- /dev/null +++ b/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderFactory.java @@ -0,0 +1,24 @@ +package org.opencds.cqf.cql.engine.serializing; + +import java.util.Iterator; +import java.util.ServiceLoader; + +public class CqlLibraryReaderFactory { + + static ServiceLoader loader = ServiceLoader + .load(CqlLibraryReaderProvider.class); + + public static Iterator providers(boolean refresh) { + if (refresh) { + loader.reload(); + } + return loader.iterator(); + } + + public static CqlLibraryReader getReader(String contentType) { + if (providers(false).hasNext()) { + return providers(false).next().create(contentType); + } + throw new RuntimeException("No ElmLibraryReaderProviders found"); + } +} diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderProvider.java b/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderProvider.java new file mode 100644 index 000000000..6d0d31c92 --- /dev/null +++ b/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/CqlLibraryReaderProvider.java @@ -0,0 +1,5 @@ +package org.opencds.cqf.cql.engine.serializing; + +public interface CqlLibraryReaderProvider { + CqlLibraryReader create(String contentType); +} diff --git a/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/LibraryWrapper.java b/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/LibraryWrapper.java new file mode 100644 index 000000000..640fd2046 --- /dev/null +++ b/engine/src/main/java/org/opencds/cqf/cql/engine/serializing/LibraryWrapper.java @@ -0,0 +1,14 @@ +package org.opencds.cqf.cql.engine.serializing; + +import org.cqframework.cql.elm.execution.Library; + +public class LibraryWrapper { + private Library library; + public Library getLibrary() { + return library; + } + + public void setLibrary(Library library) { + this.library = library; + } +} diff --git a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TranslatingTestBase.java b/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TranslatingTestBase.java deleted file mode 100644 index 01490a251..000000000 --- a/engine/src/test/java/org/opencds/cqf/cql/engine/execution/TranslatingTestBase.java +++ /dev/null @@ -1,86 +0,0 @@ -package org.opencds.cqf.cql.engine.execution; - -import java.io.IOException; -import java.io.StringReader; -import java.util.Map; - -import org.cqframework.cql.cql2elm.CqlTranslator; -import org.cqframework.cql.cql2elm.LibraryManager; -import org.cqframework.cql.cql2elm.ModelManager; -import org.cqframework.cql.elm.execution.CodeSystemRef; -import org.cqframework.cql.elm.execution.Element; -import org.cqframework.cql.elm.execution.Expression; -import org.cqframework.cql.elm.execution.ExpressionDef; -import org.cqframework.cql.elm.execution.Library; -import org.cqframework.cql.elm.execution.TypeSpecifier; -import org.hl7.cql_annotations.r1.CqlToElmBase; -import org.opencds.cqf.cql.engine.elm.serialization.CodeSystemRefMixin; -import org.opencds.cqf.cql.engine.elm.serialization.CqlToElmBaseMixIn; -import org.opencds.cqf.cql.engine.elm.serialization.ElementMixin; -import org.opencds.cqf.cql.engine.elm.serialization.ExpressionDefMixin; -import org.opencds.cqf.cql.engine.elm.serialization.ExpressionMixin; -import org.opencds.cqf.cql.engine.elm.serialization.LibraryMixin; -import org.opencds.cqf.cql.engine.elm.serialization.TypeSpecifierMixin; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.MapperFeature; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.SerializationFeature; -import com.fasterxml.jackson.databind.json.JsonMapper; -import com.fasterxml.jackson.module.jaxb.JaxbAnnotationModule; - -public class TranslatingTestBase { - - public LibraryManager toLibraryManager(Map libraryText) throws IOException { - ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); - libraryManager.getLibrarySourceLoader().registerProvider(new InMemoryLibrarySourceProvider(libraryText)); - return libraryManager; - } - - public Library toLibrary(String text) throws IOException { - ModelManager modelManager = new ModelManager(); - LibraryManager libraryManager = new LibraryManager(modelManager); - - return this.toLibrary(text, modelManager, libraryManager); - } - - public Library toLibrary(String text, ModelManager modelManager, LibraryManager libraryManager) throws IOException { - CqlTranslator translator = CqlTranslator.fromText(text, modelManager, libraryManager); - return this.readJson(translator.toJson()); - } - - public Library readJson(String json) throws IOException { - return JsonCqlLibraryReader.read(new StringReader(json)); - } - - public org.hl7.elm.r1.VersionedIdentifier toElmIdentifier(String name, String version) { - return new org.hl7.elm.r1.VersionedIdentifier().withId(name).withVersion(version); - } - - public String convertToJson(org.hl7.elm.r1.Library library) throws JsonProcessingException { - ObjectMapper mapper = JsonMapper.builder() - .defaultMergeable(true) - .enable(SerializationFeature.WRAP_ROOT_VALUE) - .enable(SerializationFeature.INDENT_OUTPUT) - .enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY) - .enable(MapperFeature.USE_BASE_TYPE_AS_DEFAULT_IMPL) - .defaultPropertyInclusion(JsonInclude.Value.construct(JsonInclude.Include.NON_NULL, JsonInclude.Include.NON_NULL)) - .addModule(new JaxbAnnotationModule()) - .addMixIn(Library.class, LibraryMixin.class) - // The ordering here of the mix ins for - // ExpressionDef -> CodeSystemRef -> Expression -> Element matters, - // so the mix-ins match most specific to least - .addMixIn(ExpressionDef.class, ExpressionDefMixin.class) - .addMixIn(CodeSystemRef.class, CodeSystemRefMixin.class) - .addMixIn(Expression.class, ExpressionMixin.class) - .addMixIn(TypeSpecifier.class, TypeSpecifierMixin.class) - .addMixIn(CqlToElmBase.class, CqlToElmBaseMixIn.class) - .addMixIn(Element.class, ElementMixin.class) - .build(); - - return mapper.writeValueAsString(library); - } -} diff --git a/pom.xml b/pom.xml index 6dc47b5ab..a1aef8adc 100644 --- a/pom.xml +++ b/pom.xml @@ -17,6 +17,7 @@ engine engine.fhir + engine.jackson engine.jaxb