diff --git a/Src/java-quickstart/README.md b/Src/java-quickstart/README.md index 94b8ecf21..ff3f9792d 100644 --- a/Src/java-quickstart/README.md +++ b/Src/java-quickstart/README.md @@ -20,18 +20,6 @@ To clean up the artifacts: ./gradlew clean -# Generating IDE Projects - -You can generate an IDE project for IntelliJ IDEA: - - ./gradlew idea - -This is preferred over having IDEA load the gradle file directly, because it (a) generates the CQL -libraries, and (b) generates the configuration for the IDEA ANTLR plugin. To open the project in -IntelliJ IDEA, launch IDEA and open the `java-quickstart.ipr` file. - -See further below for installing and using the ANTLR plugin for IDEA. - # Executing the Sample Code You can execute the sample code using the `gradlew` command or a script generated by gradle. diff --git a/Src/java/README.md b/Src/java/README.md index 83caae007..c4fa54940 100644 --- a/Src/java/README.md +++ b/Src/java/README.md @@ -31,15 +31,6 @@ To clean up the build artifacts: ./gradlew clean -# Generating IDE Projects - -You can generate an IDE project for IntelliJ IDEa: - - ./gradlew idea - -In addition to creating project modules for cql, model, quick, elm, cql-to-elm, and the tools projects, this will also import project -modules for the CQL grammar and examples. - # Executing the Sample Code You can execute the sample code using the `gradlew` command or a script generated by gradle. diff --git a/Src/java/build.gradle b/Src/java/build.gradle deleted file mode 100644 index 938708ac2..000000000 --- a/Src/java/build.gradle +++ /dev/null @@ -1,55 +0,0 @@ -plugins { - id 'idea' - id 'eclipse' - id "org.sonarqube" version "4.4.1.3373" -} - -sonar { - properties { - property "sonar.projectKey", "cqframework_clinical_quality_language" - property "sonar.organization", "cqframework" - property "sonar.host.url", "https://sonarcloud.io" - } -} - -idea { - project { - languageLevel = JavaVersion.VERSION_11 - ipr { - withXml { provider -> - provider.node.component.find { it.@name == 'VcsDirectoryMappings' }.mapping.@vcs = 'Git' - } - - whenMerged { project -> - def examples = new org.gradle.plugins.ide.idea.model.Path('file://$PROJECT_DIR$/examples.iml', 'file://$PROJECT_DIR$/examples.iml', '$PROJECT_DIR$/examples.iml') - if ((project.modulePaths.findAll { p -> p.url == examples.url }).empty) project.modulePaths.add(examples) - - def grammar = new org.gradle.plugins.ide.idea.model.Path('file://$PROJECT_DIR$/grammar.iml', 'file://$PROJECT_DIR$/grammar.iml', '$PROJECT_DIR$/grammar.iml') - if ((project.modulePaths.findAll { p -> p.url == grammar.url }).empty) project.modulePaths.add(grammar) - - def cqllm = new org.gradle.plugins.ide.idea.model.Path('file://$PROJECT_DIR$/cql-lm.iml', 'file://$PROJECT_DIR$/cql-lm.iml', '$PROJECT_DIR$/cql-lm.iml') - if ((project.modulePaths.findAll { p -> p.url == cqllm.url }).empty) project.modulePaths.add(cqllm) - } - } - } - workspace { - iws { - withXml { provider -> - def props = provider.node.component.find { it.@name == 'PropertiesComponent' } - - def propMap = [ - '$PROJECT_DIR$/../grammar/cql.g4::/output-dir' : '$PROJECT_DIR$/cql/src/generated/java', - '$PROJECT_DIR$/../grammar/cql.g4::/lib-dir' : '$PROJECT_DIR$/../grammar', - '$PROJECT_DIR$/../grammar/cql.g4::/package' : 'org.cqframework.cql.gen', - '$PROJECT_DIR$/../grammar/cql.g4::/gen-listener' : 'true', - '$PROJECT_DIR$/../grammar/cql.g4::/gen-visitor' : 'true' - ] - - propMap.each() { key, value -> - if (! props.property.find { it.@name == key }) - props.appendNode('property', ['name' : key, 'value' : value]) - } - } - } - } -} \ No newline at end of file diff --git a/Src/java/build.gradle.kts b/Src/java/build.gradle.kts new file mode 100644 index 000000000..8986259f2 --- /dev/null +++ b/Src/java/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + kotlin("jvm") version "2.0.20" + id("org.sonarqube") version "4.4.1.3373" +} + +sonar { + properties { + property("sonar.projectKey", "cqframework_clinical_quality_language") + property("sonar.organization", "cqframework") + property("sonar.host.url", "https://sonarcloud.io") + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") +} + +kotlin { + jvmToolchain(11) +} \ No newline at end of file diff --git a/Src/java/buildSrc/build.gradle b/Src/java/buildSrc/build.gradle deleted file mode 100644 index b7ecf8ca3..000000000 --- a/Src/java/buildSrc/build.gradle +++ /dev/null @@ -1,15 +0,0 @@ -plugins { - id 'groovy-gradle-plugin' -} - -repositories { - mavenCentral() - gradlePluginPortal() -} - -dependencies { - implementation 'net.ltgt.gradle:gradle-errorprone-plugin:3.1.0' - implementation 'ru.vyarus:gradle-animalsniffer-plugin:1.7.0' - implementation 'com.github.spotbugs.snom:spotbugs-gradle-plugin:5.0.14' - implementation 'com.diffplug.spotless:spotless-plugin-gradle:6.23.3' -} \ No newline at end of file diff --git a/Src/java/buildSrc/build.gradle.kts b/Src/java/buildSrc/build.gradle.kts new file mode 100644 index 000000000..a4ee2ec71 --- /dev/null +++ b/Src/java/buildSrc/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() + gradlePluginPortal() +} + +dependencies { + implementation("net.ltgt.gradle:gradle-errorprone-plugin:3.1.0") + implementation("ru.vyarus:gradle-animalsniffer-plugin:1.7.0") + implementation("com.github.spotbugs.snom:spotbugs-gradle-plugin:5.0.14") + implementation("com.diffplug.spotless:spotless-plugin-gradle:6.23.3") +} + +kotlin { + jvmToolchain(11) +} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/groovy/cql.fhir-conventions.gradle b/Src/java/buildSrc/src/main/groovy/cql.fhir-conventions.gradle deleted file mode 100644 index 80622c10c..000000000 --- a/Src/java/buildSrc/src/main/groovy/cql.fhir-conventions.gradle +++ /dev/null @@ -1,31 +0,0 @@ -plugins { - id 'cql.library-conventions' -} - -ext { - hapiVersion = project['hapi.version'] -} - -dependencies { - api platform("ca.uhn.hapi.fhir:hapi-fhir-bom:${hapiVersion}") { - exclude group: 'org.eclipse.jetty' - exclude group: 'xpp3' - exclude group: 'org.junit' - } - - implementation "ca.uhn.hapi.fhir:hapi-fhir-base" - implementation "ca.uhn.hapi.fhir:hapi-fhir-converter" - implementation "ca.uhn.hapi.fhir:hapi-fhir-structures-hl7org-dstu2" - implementation "ca.uhn.hapi.fhir:hapi-fhir-structures-dstu2" - implementation "ca.uhn.hapi.fhir:hapi-fhir-structures-dstu3" - implementation "ca.uhn.hapi.fhir:hapi-fhir-structures-r4" - implementation "ca.uhn.hapi.fhir:hapi-fhir-structures-r5" - - // This is to align with the FHIR core dependencies - // Note that this dependency hasn't been updated since 2013 - // we probably need to standardize on a fork up the dependency chain - implementation ('org.ogce:xpp3:1.1.6') { - exclude group: 'org.junit' - exclude group: 'org.hamcrest' - } -} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/groovy/cql.java-conventions.gradle b/Src/java/buildSrc/src/main/groovy/cql.java-conventions.gradle deleted file mode 100644 index 42614d30b..000000000 --- a/Src/java/buildSrc/src/main/groovy/cql.java-conventions.gradle +++ /dev/null @@ -1,181 +0,0 @@ -plugins { - id 'java' - id 'maven-publish' - id 'jacoco' - id 'signing' - id 'cql.sca-conventions' - id 'com.diffplug.spotless' -} - -java { - withJavadocJar() - withSourcesJar() -} - -compileJava { - options.release = 11 -} - -repositories { - mavenLocal() - mavenCentral() - maven { - url "https://oss.sonatype.org/content/repositories/snapshots" - } -} - -dependencies { - implementation 'org.slf4j:slf4j-api:1.7.36' - testImplementation 'org.hamcrest:hamcrest-all:1.3' - testImplementation 'uk.co.datumedge:hamcrest-json:0.2' - testImplementation(platform('org.junit:junit-bom:5.10.2')) - testImplementation('org.junit.jupiter:junit-jupiter') - testImplementation 'org.slf4j:slf4j-simple:1.7.36' - - // These are JAXB dependencies excluded because the libraries need to work - // on Android. But for test purposes we use them pretty much everywhere. - testRuntimeOnly 'org.eclipse.persistence:org.eclipse.persistence.moxy:4.0.2' - testRuntimeOnly 'org.eclipse.parsson:parsson:1.1.5' - testRuntimeOnly('org.junit.platform:junit-platform-launcher') -} - -jar { - manifest { - attributes('Implementation-Title': project.name, - 'Implementation-Version': project.version, - 'Specification-Title': 'HL7 Clinical Quality Language (CQL)', - 'Specification-Version': project['specification.version']) - } -} - -jacoco { - toolVersion = "0.8.11" -} - -test { - useJUnitPlatform() - testLogging { - events "skipped", "failed" - } - finalizedBy jacocoTestReport // report is always generated after tests run -} - -jacocoTestReport { - reports { - xml.required = true - } - dependsOn test // tests are required to run before generating the report -} - -tasks.withType(Javadoc) { - options.addStringOption('Xdoclint:none', '-quiet') -} - -tasks.withType(JavaCompile) { - options.compilerArgs << '-Xlint:unchecked' - options.deprecation = true -} - -spotless { - java { - targetExclude '**/generated/**' - palantirJavaFormat() - } -} - -/* -A few things: - - You must have an OSSRH Jira account (https://issues.sonatype.org/secure/Signup!default.jspa) - - Your account must have privileges to upload info.cqframework artifacts (https://issues.sonatype.org/browse/OSSRH-15514) - - You must have a gpg key (http://central.sonatype.org/pages/working-with-pgp-signatures.html) - - You must set your account info and GPG key in your user's gradle.properties file. For example: - ossrhUsername=foo - ossrhPassword=b@r - signing.keyId=24875D73 - signing.password=secret - signing.secretKeyRingFile=/Users/me/.gnupg/secring.gpg - - If the library version ends with '-SNAPSHOT', it will be deployed to the snapshot repository, else it will be - deployed to the staging repository (which you then must manually release http://central.sonatype.org/pages/releasing-the-deployment.html). - - Repo for snapshots and releases for the translator modules: https://oss.sonatype.org/content/groups/public/info/cqframework/ - - Repo for snpashots, releases, and staged releases for the translator modules: https://oss.sonatype.org/content/groups/staging/info/cqframework/ - - Repo for snapshots and releases for the engine modules: https://oss.sonatype.org/content/groups/public/org/opencds/cqf/cql/ - - Repo for snapshots, releases, and staged releases for the engine modules: https://oss.sonatype.org/content/groups/staging/org/opencds/cqf/cql/ - */ -publishing { - publications { - mavenDeployer(MavenPublication) { - from components.java - - pom { - name = project.name - packaging = 'jar' - description = "The ${project.name} library for the Clinical Quality Language Java reference implementation" - url = 'http://cqframework.info' - - scm { - connection = 'scm:git:git@github.com:cqframework/clinical_quality_language.git' - developerConnection = 'scm:git:git@github.com:cqframework/clinical_quality_language.git' - url = 'git@github.com:cqframework/clinical_quality_language.git' - } - - licenses { - license { - name ='The Apache License, Version 2.0' - url = 'http://www.apache.org/licenses/LICENSE-2.0.txt' - } - } - - developers { - developer { - name = 'Bryn Rhodes' - } - developer { - name = 'Chris Moesel' - } - developer { - name = 'Rob Dingwell' - } - developer { - name = 'Jason Walonoski' - } - developer { - name = 'Marc Hadley' - } - developer { - name = 'Jonathan Percival' - } - } - } - } - } - repositories { - maven { - credentials { - username project.hasProperty("ossrhUsername") ? ossrhUsername : System.getenv("OSSRH_USERNAME") != null ? System.getenv("OSSRH_USERNAME") : "" - password project.hasProperty("ossrhPassword") ? ossrhPassword : System.getenv("OSSRH_TOKEN") != null ? System.getenv("OSSRH_TOKEN") : "" - } - - /* Use these to test locally (but don't forget to comment out others!) - def releasesRepoUrl = "file://${buildDir}/repo" - def snapshotsRepoUrl = "file://${buildDir}/ssRepo" - */ - - // change URLs to point to your repos, e.g. http://my.org/repo - def releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" - def snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots/" - url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl - } - } -} - -signing { - if (!version.endsWith('SNAPSHOT')){ - sign publishing.publications.mavenDeployer - } -} - -javadoc { - if(JavaVersion.current().isJava9Compatible()) { - options.addBooleanOption('html5', true) - } -} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/groovy/cql.library-conventions.gradle b/Src/java/buildSrc/src/main/groovy/cql.library-conventions.gradle deleted file mode 100644 index 52f3ea967..000000000 --- a/Src/java/buildSrc/src/main/groovy/cql.library-conventions.gradle +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - id 'java-library' - id 'ru.vyarus.animalsniffer' - id 'cql.java-conventions' -} - -ext { - androidApiLevel = project['android.api.level'] -} - - -dependencies { - // Various libraries for Android signatures are available, Jackson uses this one - signature "com.toasttab.android:gummy-bears-api-${androidApiLevel}:0.5.0@signature" -} - -animalsniffer { - sourceSets = [sourceSets.main] -} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/groovy/cql.sca-conventions.gradle b/Src/java/buildSrc/src/main/groovy/cql.sca-conventions.gradle deleted file mode 100644 index d23a15b6b..000000000 --- a/Src/java/buildSrc/src/main/groovy/cql.sca-conventions.gradle +++ /dev/null @@ -1,34 +0,0 @@ -plugins { - id 'java' - id 'net.ltgt.errorprone' - id 'checkstyle' -} - -ext { - errorproneVersion = '2.24.1' -} - -dependencies { - errorprone "com.google.errorprone:error_prone_core:${errorproneVersion}" -} - -checkstyleMain.source = "src/main/java" -// TODO: Have a conversation with the team about enforcing checkstyle in tests -checkstyleTest.enabled = false - -tasks.withType(JavaCompile).configureEach { - // TODO: Change this once we fix all the errors - options.errorprone.disableAllWarnings = true - options.errorprone.disableWarningsInGeneratedCode = true - options.errorprone.disable("DoubleBraceInitialization") - // This applies recommended fixes to the source code in place - // options.errorprone.errorproneArgs = ["-XepPatchLocation:IN_PLACE"] -} - -tasks { - compileTestJava { - // TODO: Talk to the team about warnings in tests - options.errorprone.disableAllWarnings = true - options.errorprone.disableWarningsInGeneratedCode = true - } -} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/groovy/cql.xjc-conventions.gradle b/Src/java/buildSrc/src/main/groovy/cql.xjc-conventions.gradle deleted file mode 100644 index 8f9e15407..000000000 --- a/Src/java/buildSrc/src/main/groovy/cql.xjc-conventions.gradle +++ /dev/null @@ -1,69 +0,0 @@ -plugins { - id 'java' -} - -configurations { - xjc -} - -dependencies { - xjc 'codes.rafael.jaxb2_commons:jaxb2-basics-ant:3.0.0' - xjc 'codes.rafael.jaxb2_commons:jaxb2-basics:3.0.0' - xjc 'codes.rafael.jaxb2_commons:jaxb2-fluent-api:3.0.0' - // Eclipse has taken over all Java EE reference components - // https://www.infoworld.com/article/3310042/eclipse-takes-over-all-java-ee-reference-components.html - // https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates - xjc 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.1' - xjc 'org.glassfish.jaxb:jaxb-xjc:3.0.2' - xjc 'org.glassfish.jaxb:jaxb-runtime:4.0.3' - xjc 'org.eclipse.persistence:org.eclipse.persistence.moxy:4.0.2' - xjc 'org.slf4j:slf4j-simple:1.7.36' - api 'jakarta.xml.bind:jakarta.xml.bind-api:4.0.1' - api 'codes.rafael.jaxb2_commons:jaxb2-basics-runtime:3.0.0' -} - -ext.xjc = [ - destDir: "${buildDir}/generated/sources/$name/main/java", - args: '-disableXmlSecurity -Xfluent-api -Xequals -XhashCode -XtoString -Xsetters -Xsetters-mode=direct' -] - - -task generateSources { - - outputs.dir xjc.destDir - - doLast { - file(xjc.destDir).mkdirs() - - ant.taskdef(name: 'xjc', classname: 'org.jvnet.jaxb2_commons.xjc.XJC2Task', classpath: configurations.xjc.asPath) - - /* The above sets up the task, but the real work of the task should be specified in the subproject using - generateSources.doLast. For example: - generateSources.doLast { - ant.xjc(destdir: xjc.destDir, schema: "${projectDir}/path/to/file.xsd") { - arg(line: xjc.args) - } - } - */ - } -} - -compileJava { - dependsOn generateSources -} - -sourcesJar { - dependsOn generateSources -} - -sourceSets { - main { - java { - srcDir(xjc.destDir) - } - } -} - -clean { - delete xjc.destDir -} diff --git a/Src/java/buildSrc/src/main/kotlin/XjcTask.kt b/Src/java/buildSrc/src/main/kotlin/XjcTask.kt new file mode 100644 index 000000000..c3d12b321 --- /dev/null +++ b/Src/java/buildSrc/src/main/kotlin/XjcTask.kt @@ -0,0 +1,34 @@ +import org.gradle.api.DefaultTask +import org.gradle.api.tasks.* + +open class XjcTask : DefaultTask() { + @Input + lateinit var schema: String + + @Input + var extraArgs : List = emptyList() + + @Input + var binding: String = "" + + @OutputDirectory + lateinit var outputDir: String + + + @TaskAction + fun generate() { + var bindingArgs : List = emptyList(); + if (binding.isNotBlank()) { + bindingArgs = listOf("-b", binding) + } + + val defaultArgs = listOf("-quiet", "-disableXmlSecurity", "-Xfluent-api", "-Xequals" ,"-XhashCode", "-XtoString" , "-Xsetters", "-Xsetters-mode=direct") + val options = listOf("-d", outputDir, schema) + bindingArgs + defaultArgs + extraArgs + + project.javaexec { + mainClass.set("com.sun.tools.xjc.XJCFacade") + classpath = project.configurations.getByName("xjc") + args = options + } + } +} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/kotlin/cql.fhir-conventions.gradle.kts b/Src/java/buildSrc/src/main/kotlin/cql.fhir-conventions.gradle.kts new file mode 100644 index 000000000..236198ee0 --- /dev/null +++ b/Src/java/buildSrc/src/main/kotlin/cql.fhir-conventions.gradle.kts @@ -0,0 +1,41 @@ +plugins { + id("cql.library-conventions") +} + +// bug fix for the hapi-bom +configurations.all { + resolutionStrategy { + eachDependency { + if (requested.group == "org.eclipse.jetty") { + useVersion("11.0.20") + because("jetty 12 is java 17") + } + } + } +} + +dependencies { + + api(platform("ca.uhn.hapi.fhir:hapi-fhir-bom:${project.findProperty("hapi.version")}")) + + implementation("ca.uhn.hapi.fhir:hapi-fhir-base") { + exclude(group = "org.eclipse.jetty") + exclude(group = "xpp3") + exclude(group = "org.junit") + } + + implementation("ca.uhn.hapi.fhir:hapi-fhir-converter") + implementation("ca.uhn.hapi.fhir:hapi-fhir-structures-hl7org-dstu2") + implementation("ca.uhn.hapi.fhir:hapi-fhir-structures-dstu2") + implementation("ca.uhn.hapi.fhir:hapi-fhir-structures-dstu3") + implementation("ca.uhn.hapi.fhir:hapi-fhir-structures-r4") + implementation("ca.uhn.hapi.fhir:hapi-fhir-structures-r5") + + // This is to align with the FHIR core dependencies + // Note that this dependency hasn"t been updated since 2013 + // we probably need to standardize on a fork up the dependency chain + implementation("org.ogce:xpp3:1.1.6") { + exclude(group = "org.junit") + exclude(group = "org.hamcrest") + } +} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/kotlin/cql.java-conventions.gradle.kts b/Src/java/buildSrc/src/main/kotlin/cql.java-conventions.gradle.kts new file mode 100644 index 000000000..f75f566cb --- /dev/null +++ b/Src/java/buildSrc/src/main/kotlin/cql.java-conventions.gradle.kts @@ -0,0 +1,185 @@ +plugins { + id("java") + id("maven-publish") + id("jacoco") + id("signing") + id("cql.sca-conventions") + id("com.diffplug.spotless") +} + +java { + withJavadocJar() + withSourcesJar() + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } +} + +repositories { + mavenLocal() + mavenCentral() + maven { + url = uri("https://oss.sonatype.org/content/repositories/snapshots") + mavenContent { + snapshotsOnly() + } + } +} + +dependencies { + implementation("org.slf4j:slf4j-api:1.7.36") + testImplementation("org.hamcrest:hamcrest-all:1.3") + testImplementation("uk.co.datumedge:hamcrest-json:0.2") + testImplementation(platform("org.junit:junit-bom:5.10.2")) + testImplementation("org.junit.jupiter:junit-jupiter") + testImplementation("org.slf4j:slf4j-simple:1.7.36") + + // These are JAXB dependencies excluded because the libraries need to work + // on Android. But for test purposes we use them pretty much everywhere. + testRuntimeOnly("org.eclipse.persistence:org.eclipse.persistence.moxy:4.0.2") + testRuntimeOnly("org.eclipse.parsson:parsson:1.1.5") + testRuntimeOnly("org.junit.platform:junit-platform-launcher") +} + +tasks.jar { + manifest { + attributes["Implementation-Title"] = project.name + attributes["Implementation-Version"] = project.version + attributes["Specification-Title"] = "HL7 Clinical Quality Language (CQL)" + attributes["Specification-Version"] = project.findProperty("specification.version") ?: "" + } +} + +jacoco { + toolVersion = "0.8.11" +} + +tasks.withType { + useJUnitPlatform() + testLogging { + events("skipped", "failed") + } + finalizedBy(tasks.jacocoTestReport) // report is always generated after tests run +} + +tasks.jacocoTestReport { + reports { + xml.required = true + } + dependsOn(tasks.test)// tests are required to run before generating the report +} + +tasks.javadoc { + options { + val standardOptions = this as StandardJavadocDocletOptions + standardOptions.addStringOption("Xdoclint:none", "-quiet") + } +} + +tasks.withType { + options.compilerArgs.add("-Xlint:unchecked") + options.isDeprecation = true +} + +spotless { + java { + targetExclude("**/generated/**") + palantirJavaFormat() + } +} + +/* +A few things: + - You must have an OSSRH Jira account (https://issues.sonatype.org/secure/Signup!valault.jspa) + - Your account must have privileges to upload info.cqframework artifacts (https://issues.sonatype.org/browse/OSSRH-15514) + - You must have a gpg key (http://central.sonatype.org/pages/working-with-pgp-signatures.html) + - You must set your account info and GPG key in your user"s gradle.properties file. For example: + ossrhUsername=foo + ossrhPassword=b@r + signing.keyId=24875D73 + signing.password=secret + signing.secretKeyRingFile=/Users/me/.gnupg/secring.gpg + - If the library version ends with "-SNAPSHOT", it will be deployed to the snapshot repository, else it will be + deployed to the staging repository (which you then must manually release http://central.sonatype.org/pages/releasing-the-deployment.html). + - Repo for snapshots and releases for the translator modules: https://oss.sonatype.org/content/groups/public/info/cqframework/ + - Repo for snpashots, releases, and staged releases for the translator modules: https://oss.sonatype.org/content/groups/staging/info/cqframework/ + - Repo for snapshots and releases for the engine modules: https://oss.sonatype.org/content/groups/public/org/opencds/cqf/cql/ + - Repo for snapshots, releases, and staged releases for the engine modules: https://oss.sonatype.org/content/groups/staging/org/opencds/cqf/cql/ + */ +publishing { + publications { + create("mavenJava") { + from(components["java"]) + + pom { + name = project.name + packaging = "jar" + description = + "The ${project.name} library for the Clinical Quality Language Java reference implementation" + url = "http://cqframework.info" + + scm { + connection = "scm:git:git@github.com:cqframework/clinical_quality_language.git" + developerConnection = "scm:git:git@github.com:cqframework/clinical_quality_language.git" + url = "git@github.com:cqframework/clinical_quality_language.git" + } + + licenses { + license { + name = "The Apache License, Version 2.0" + url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + } + } + + developers { + developer { + name = "Bryn Rhodes" + } + developer { + name = "Chris Moesel" + } + developer { + name = "Rob Dingwell" + } + developer { + name = "Jason Walonoski" + } + developer { + name = "Marc Hadley" + } + developer { + name = "Jonathan Percival" + } + } + } + } + } + repositories { + maven { + credentials { + username = project.findProperty("ossrhUsername") as String? ?: System.getenv("OSSRH_USERNAME") ?: "" + password = project.findProperty("ossrhPassword") as String? ?: System.getenv("OSSRH_TOKEN") ?: "" + } + + /* Use these to test locally (but don"t forget to comment out others!) + val releasesRepoUrl = "file://${buildDir}/repo" + val snapshotsRepoUrl = "file://${buildDir}/ssRepo" + */ + + // change URLs to point to your repos, e.g. http://my.org/repo + val releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2/" + val snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots/" + if ((project.version as String).endsWith("SNAPSHOT")) { + url = uri(snapshotsRepoUrl) + } else { + url = uri(releasesRepoUrl) + } + } + } +} + +signing { + if (!(version as String).endsWith("SNAPSHOT")) { + sign(publishing.publications["mavenJava"]) + } +} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/kotlin/cql.library-conventions.gradle.kts b/Src/java/buildSrc/src/main/kotlin/cql.library-conventions.gradle.kts new file mode 100644 index 000000000..0d17e8b3b --- /dev/null +++ b/Src/java/buildSrc/src/main/kotlin/cql.library-conventions.gradle.kts @@ -0,0 +1,16 @@ +import ru.vyarus.gradle.plugin.animalsniffer.AnimalSniffer + +plugins { + id("java-library") + id("ru.vyarus.animalsniffer") + id("cql.java-conventions") +} + +dependencies { + // Various libraries for Android signatures are available, Jackson uses this one + signature("com.toasttab.android:gummy-bears-api-${project.findProperty("android.api.level")}:0.5.0@signature") +} + +tasks.animalsnifferTest { + enabled = false +} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/kotlin/cql.sca-conventions.gradle.kts b/Src/java/buildSrc/src/main/kotlin/cql.sca-conventions.gradle.kts new file mode 100644 index 000000000..c9a6a4be4 --- /dev/null +++ b/Src/java/buildSrc/src/main/kotlin/cql.sca-conventions.gradle.kts @@ -0,0 +1,29 @@ +import net.ltgt.gradle.errorprone.errorprone + +plugins { + id("java") + id("net.ltgt.errorprone") + id("checkstyle") +} + +repositories { + mavenCentral() +} +dependencies { + errorprone("com.google.errorprone:error_prone_core:2.29.2") +} + +tasks.named("checkstyleMain") { + exclude { it.file.path.contains("generated")} +} + +tasks.named("checkstyleTest") { + enabled = false +} + +tasks.withType().configureEach { + options.errorprone.disableAllWarnings = true + options.errorprone.disableWarningsInGeneratedCode = true + options.errorprone.disable("DoubleBraceInitialization") + // errorproneArgs = ["-XepPatchLocation:IN_PLACE"] +} \ No newline at end of file diff --git a/Src/java/buildSrc/src/main/kotlin/cql.xjc-conventions.gradle.kts b/Src/java/buildSrc/src/main/kotlin/cql.xjc-conventions.gradle.kts new file mode 100644 index 000000000..9ab5ad518 --- /dev/null +++ b/Src/java/buildSrc/src/main/kotlin/cql.xjc-conventions.gradle.kts @@ -0,0 +1,50 @@ +plugins { + id("java-library") +} + +val xjc by configurations.creating + +dependencies { + xjc("codes.rafael.jaxb2_commons:jaxb2-basics-ant:3.0.0") + xjc("codes.rafael.jaxb2_commons:jaxb2-basics:3.0.0") + xjc("codes.rafael.jaxb2_commons:jaxb2-fluent-api:3.0.0") + // Eclipse has taken over all Java EE reference components + // https://www.infoworld.com/article/3310042/eclipse-takes-over-all-java-ee-reference-components.html + // https://wiki.eclipse.org/Jakarta_EE_Maven_Coordinates + xjc("jakarta.xml.bind:jakarta.xml.bind-api:4.0.1") + xjc("org.glassfish.jaxb:jaxb-xjc:3.0.2") + xjc("org.glassfish.jaxb:jaxb-runtime:4.0.3") + xjc("org.eclipse.persistence:org.eclipse.persistence.moxy:4.0.2") + xjc("org.slf4j:slf4j-simple:1.7.36") + xjc("org.apache.ant:ant:1.10.14") + + api("jakarta.xml.bind:jakarta.xml.bind-api:4.0.1") + api("codes.rafael.jaxb2_commons:jaxb2-basics-runtime:3.0.0") +} + +var buildDir = project.layout.buildDirectory.get().toString() +val destDir = "${buildDir}/generated/sources/$name/main/java" + +tasks.compileJava { + dependsOn(tasks.withType()) +} + +tasks.withType().configureEach { + outputDir = destDir +} + +tasks.named("sourcesJar") { + dependsOn(tasks.withType()) +} + +sourceSets { + main { + java { + srcDir(destDir) + } + } +} + +tasks.named("clean") { + delete(destDir) +} diff --git a/Src/java/cqf-fhir-npm/build.gradle b/Src/java/cqf-fhir-npm/build.gradle deleted file mode 100644 index 89422d105..000000000 --- a/Src/java/cqf-fhir-npm/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -plugins { - id "cql.fhir-conventions" -} - -dependencies { - implementation project(':cql-to-elm') - implementation project(':cqf-fhir') - implementation 'com.google.code.gson:gson:2.9.1' - implementation 'org.apache.commons:commons-compress:1.24.0' -} diff --git a/Src/java/cqf-fhir-npm/build.gradle.kts b/Src/java/cqf-fhir-npm/build.gradle.kts new file mode 100644 index 000000000..86efb4dc2 --- /dev/null +++ b/Src/java/cqf-fhir-npm/build.gradle.kts @@ -0,0 +1,10 @@ +plugins { + id("cql.fhir-conventions") +} + +dependencies { + implementation(project(":cql-to-elm")) + implementation(project(":cqf-fhir")) + implementation("com.google.code.gson:gson:2.9.1") + implementation("org.apache.commons:commons-compress:1.24.0") +} \ No newline at end of file diff --git a/Src/java/cqf-fhir/build.gradle b/Src/java/cqf-fhir/build.gradle deleted file mode 100644 index ece5a847e..000000000 --- a/Src/java/cqf-fhir/build.gradle +++ /dev/null @@ -1,3 +0,0 @@ -plugins { - id 'cql.fhir-conventions' -} \ No newline at end of file diff --git a/Src/java/cqf-fhir/build.gradle.kts b/Src/java/cqf-fhir/build.gradle.kts new file mode 100644 index 000000000..d5c16b25c --- /dev/null +++ b/Src/java/cqf-fhir/build.gradle.kts @@ -0,0 +1,3 @@ +plugins { + id("cql.fhir-conventions") +} \ No newline at end of file diff --git a/Src/java/cql-to-elm-cli/build.gradle b/Src/java/cql-to-elm-cli/build.gradle deleted file mode 100644 index 332ac9c93..000000000 --- a/Src/java/cql-to-elm-cli/build.gradle +++ /dev/null @@ -1,24 +0,0 @@ -plugins { - id 'cql.java-conventions' - id "application" -} - -application { - mainClass = 'org.cqframework.cql.cql2elm.cli.Main' -} - -dependencies { - implementation project(':cql-to-elm') - implementation project(':quick') - implementation project(':qdm') - implementation project(':model-jaxb') - implementation project(':elm-jaxb') - implementation 'net.sf.jopt-simple:jopt-simple:4.7' - implementation 'org.slf4j:slf4j-simple:1.7.36' - implementation 'org.glassfish.jaxb:jaxb-runtime:4.0.5' - implementation 'org.eclipse.persistence:org.eclipse.persistence.moxy:4.0.2' - testImplementation project(':model-jaxb') - testImplementation project(':model-jackson') - testImplementation project(':elm-jaxb') - testImplementation project(':elm-jackson') -} \ No newline at end of file diff --git a/Src/java/cql-to-elm-cli/build.gradle.kts b/Src/java/cql-to-elm-cli/build.gradle.kts new file mode 100644 index 000000000..ca47368a8 --- /dev/null +++ b/Src/java/cql-to-elm-cli/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("cql.java-conventions") + id("application") +} + +application { + mainClass = "org.cqframework.cql.cql2elm.cli.Main" +} + +dependencies { + implementation(project(":cql-to-elm")) + implementation(project(":quick")) + implementation(project(":qdm")) + implementation(project(":model-jaxb")) + implementation(project(":elm-jaxb")) + implementation("net.sf.jopt-simple:jopt-simple:4.7") + implementation("org.slf4j:slf4j-simple:1.7.36") + implementation("org.glassfish.jaxb:jaxb-runtime:4.0.5") + implementation("org.eclipse.persistence:org.eclipse.persistence.moxy:4.0.2") + testImplementation(project(":model-jaxb")) + testImplementation(project(":model-jackson")) + testImplementation(project(":elm-jaxb")) + testImplementation(project(":elm-jackson")) +} \ No newline at end of file diff --git a/Src/java/cql-to-elm/build.gradle b/Src/java/cql-to-elm/build.gradle deleted file mode 100644 index 5b782b882..000000000 --- a/Src/java/cql-to-elm/build.gradle +++ /dev/null @@ -1,29 +0,0 @@ -plugins { - id 'cql.library-conventions' - id 'cql.xjc-conventions' -} - -ext { - jacksonVersion = project['jackson.version'] -} - -dependencies { - api project(':cql') - api project(':model') - api project(':elm') - api 'org.fhir:ucum:1.0.8' - api 'org.apache.commons:commons-text:1.10.0' - - // TODO: This dependencies are required due the the fact that the CqlTranslatorOptionsMapper lives - // in the cql-to-elm project. Ideally, we'd factor out all serialization depedencies into common - // libraries such that we could swap out jackson for something else. In the meantime, these are - // "implementation" dependencies so that they are not exported downstream. - implementation "com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:${jacksonVersion}" - testImplementation project(':elm-jackson') - testImplementation project(':model-jackson') - testImplementation project(':quick') - testImplementation project(':qdm') - testImplementation 'com.github.reinert:jjschema:1.16' - testImplementation 'com.tngtech.archunit:archunit:1.2.1' - testImplementation 'org.skyscreamer:jsonassert:1.5.1' -} \ No newline at end of file diff --git a/Src/java/cql-to-elm/build.gradle.kts b/Src/java/cql-to-elm/build.gradle.kts new file mode 100644 index 000000000..e22e3fa60 --- /dev/null +++ b/Src/java/cql-to-elm/build.gradle.kts @@ -0,0 +1,25 @@ +plugins { + id("cql.library-conventions") + id("cql.xjc-conventions") +} + +dependencies { + api(project(":cql")) + api(project(":model")) + api(project(":elm")) + api("org.fhir:ucum:1.0.8") + api("org.apache.commons:commons-text:1.10.0") + + // TODO: This dependencies are required due the the fact that the CqlTranslatorOptionsMapper lives + // in the cql-to-elm project. Ideally, we"d factor out all serialization depedencies into common + // libraries such that we could swap out jackson for something else. In the meantime, these are + // "implementation" dependencies so that they are not exported downstream. + implementation("com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:${project.findProperty("jackson.version")}") + testImplementation(project(":elm-jackson")) + testImplementation(project(":model-jackson")) + testImplementation(project(":quick")) + testImplementation(project(":qdm")) + testImplementation("com.github.reinert:jjschema:1.16") + testImplementation("com.tngtech.archunit:archunit:1.2.1") + testImplementation("org.skyscreamer:jsonassert:1.5.1") +} \ No newline at end of file diff --git a/Src/java/cql/build.gradle b/Src/java/cql/build.gradle deleted file mode 100644 index 1c2f641d2..000000000 --- a/Src/java/cql/build.gradle +++ /dev/null @@ -1,34 +0,0 @@ -plugins { - id 'cql.java-conventions' - id 'application' - id 'antlr' -} - -dependencies { - antlr "org.antlr:antlr4:${project['antlr.version']}" - api "org.antlr:antlr4-runtime:${project['antlr.version']}" -} - -application { - mainClass = 'org.cqframework.cql.Main' -} - -sourceSets { - main { - antlr { - srcDirs = ["../../grammar"] - } - java { - srcDir 'build/generated/sources/antlr/main/java' - } - } -} - -sourcesJar { - from generateGrammarSource -} - -generateGrammarSource { - outputDirectory = file("${project.buildDir}/generated/sources/antlr/main/java/org/cqframework/cql/gen") - arguments = ['-visitor', '-package', 'org.cqframework.cql.gen'] -} \ No newline at end of file diff --git a/Src/java/cql/build.gradle.kts b/Src/java/cql/build.gradle.kts new file mode 100644 index 000000000..0df27595c --- /dev/null +++ b/Src/java/cql/build.gradle.kts @@ -0,0 +1,36 @@ +plugins { + id("cql.java-conventions") + id("application") + id("antlr") +} + +dependencies { + val version = project.findProperty("antlr.version") + antlr("org.antlr:antlr4:${version}") + api("org.antlr:antlr4-runtime:${version}") +} + +application { + mainClass = "org.cqframework.cql.Main" +} + +sourceSets { + main { + antlr { + setSrcDirs(listOf("../../grammar")) + } + java { + srcDir("build/generated/sources/antlr/main/java") + } + } +} + +tasks.generateGrammarSource { + val buildDir = layout.buildDirectory.get().toString() + outputDirectory = file("${buildDir}/generated/sources/antlr/main/java/org/cqframework/cql/gen") + arguments = listOf("-visitor", "-package", "org.cqframework.cql.gen") +} + +tasks.sourcesJar { + from(tasks.generateGrammarSource) +} \ No newline at end of file diff --git a/Src/java/elm-fhir/build.gradle b/Src/java/elm-fhir/build.gradle deleted file mode 100644 index 3f4b66ba5..000000000 --- a/Src/java/elm-fhir/build.gradle +++ /dev/null @@ -1,25 +0,0 @@ -plugins { - id "cql.library-conventions" - id "cql.fhir-conventions" -} - -ext { - mapstructVersion = "1.4.2.Final" -} - -dependencies { - api project(':cql-to-elm') - api project(':engine') - api project(":engine-fhir") - - testImplementation project(':quick') - testImplementation "org.reflections:reflections:0.10.2" - testRuntimeOnly project(':model-jackson') - -} - -tasks.withType(JavaCompile) { - options.compilerArgs = [ - "-Amapstruct.suppressGeneratorTimestamp=true" - ] -} diff --git a/Src/java/elm-fhir/build.gradle.kts b/Src/java/elm-fhir/build.gradle.kts new file mode 100644 index 000000000..4e3eaf320 --- /dev/null +++ b/Src/java/elm-fhir/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + id("cql.library-conventions") + id("cql.fhir-conventions") +} + +dependencies { + api(project(":cql-to-elm")) + api(project(":engine")) + api(project(":engine-fhir")) + + testImplementation(project(":quick")) + testImplementation("org.reflections:reflections:0.10.2") + testRuntimeOnly(project(":model-jackson")) +} \ No newline at end of file diff --git a/Src/java/elm-jackson/build.gradle b/Src/java/elm-jackson/build.gradle deleted file mode 100644 index 73bb1a2d8..000000000 --- a/Src/java/elm-jackson/build.gradle +++ /dev/null @@ -1,14 +0,0 @@ -plugins { - id 'cql.library-conventions' -} - -ext { - jacksonVersion = properties['jackson.version'] -} - -dependencies { - api project(':model') - api project(':elm') - api "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:${jacksonVersion}" - api "com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:${jacksonVersion}" -} diff --git a/Src/java/elm-jackson/build.gradle.kts b/Src/java/elm-jackson/build.gradle.kts new file mode 100644 index 000000000..e3394c46c --- /dev/null +++ b/Src/java/elm-jackson/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("cql.library-conventions") +} + +dependencies { + val jacksonVersion = project.findProperty("jackson.version") + api(project(":model")) + api(project(":elm")) + api("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:${jacksonVersion}") + api("com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:${jacksonVersion}") +} diff --git a/Src/java/elm-jaxb/build.gradle b/Src/java/elm-jaxb/build.gradle deleted file mode 100644 index e3f90a2ab..000000000 --- a/Src/java/elm-jaxb/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id 'cql.library-conventions' -} - -dependencies { - api project(':elm') -} diff --git a/Src/java/elm-jaxb/build.gradle.kts b/Src/java/elm-jaxb/build.gradle.kts new file mode 100644 index 000000000..6ad735088 --- /dev/null +++ b/Src/java/elm-jaxb/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("cql.library-conventions") +} + +dependencies { + api(project(":elm")) +} diff --git a/Src/java/elm-test/build.gradle b/Src/java/elm-test/build.gradle deleted file mode 100644 index 0e9c83526..000000000 --- a/Src/java/elm-test/build.gradle +++ /dev/null @@ -1,11 +0,0 @@ -plugins { - id 'cql.library-conventions' -} - -dependencies { - implementation project(':cql-to-elm') - // implementation project(':model-jaxb') - implementation project(':elm-jaxb') - implementation project(':model-jackson') - implementation project(':elm-jackson') -} diff --git a/Src/java/elm-test/build.gradle.kts b/Src/java/elm-test/build.gradle.kts new file mode 100644 index 000000000..eca6618a4 --- /dev/null +++ b/Src/java/elm-test/build.gradle.kts @@ -0,0 +1,11 @@ +plugins { + id("cql.library-conventions") +} + +dependencies { + implementation(project(":cql-to-elm")) + // implementation project(":model-jaxb") + implementation(project(":elm-jaxb")) + implementation(project(":model-jackson")) + implementation(project(":elm-jackson")) +} diff --git a/Src/java/elm/build.gradle b/Src/java/elm/build.gradle deleted file mode 100644 index 9791c0612..000000000 --- a/Src/java/elm/build.gradle +++ /dev/null @@ -1,24 +0,0 @@ -plugins { - id 'cql.library-conventions' - id 'cql.xjc-conventions' -} - -dependencies { - api project(':model') - testImplementation 'org.jeasy:easy-random-core:5.0.0' - testImplementation 'com.tngtech.archunit:archunit:1.2.1' -} - -generateSources { - inputs.dir "${projectDir}/../../cql-lm/schema" - - doLast { - ant.xjc(destdir: xjc.destDir, schema: "${projectDir}/../../cql-lm/schema/elm/library.xsd") { - arg(line: "${xjc.args} -npa -XautoInheritance -XautoInheritance-xmlTypesExtend=org.cqframework.cql.elm.tracking.Trackable") - } - - ant.xjc(destdir: xjc.destDir, schema: "${projectDir}/../../cql-lm/schema/elm/cqlannotations.xsd") { - arg(line: "${xjc.args} -npa") - } - } -} \ No newline at end of file diff --git a/Src/java/elm/build.gradle.kts b/Src/java/elm/build.gradle.kts new file mode 100644 index 000000000..8a7521a74 --- /dev/null +++ b/Src/java/elm/build.gradle.kts @@ -0,0 +1,20 @@ +plugins { + id("cql.library-conventions") + id("cql.xjc-conventions") +} + +dependencies { + api(project(":model")) + testImplementation("org.jeasy:easy-random-core:5.0.0") + testImplementation("com.tngtech.archunit:archunit:1.2.1") +} + +tasks.register("generateAnnotation") { + schema = "${projectDir}/../../cql-lm/schema/elm/cqlannotations.xsd" + extraArgs = listOf("-npa") +} + +tasks.register("generateElm") { + schema = "${projectDir}/../../cql-lm/schema/elm/library.xsd" + extraArgs = listOf("-npa", "-XautoInheritance", "-XautoInheritance-xmlTypesExtend=org.cqframework.cql.elm.tracking.Trackable") +} \ No newline at end of file diff --git a/Src/java/engine-fhir/build.gradle b/Src/java/engine-fhir/build.gradle deleted file mode 100644 index 3072caf70..000000000 --- a/Src/java/engine-fhir/build.gradle +++ /dev/null @@ -1,42 +0,0 @@ -plugins { - id 'cql.library-conventions' - id 'cql.xjc-conventions' - id 'cql.fhir-conventions' -} - -dependencies { - api project(':engine') - testImplementation 'com.github.tomakehurst:wiremock-jre8:2.35.2' - testImplementation project(':cql-to-elm') - testImplementation project(':model-jackson') - testImplementation project(':elm-jackson') - testImplementation project(':quick') - testImplementation 'ca.uhn.hapi.fhir:hapi-fhir-client' -} - -generateSources { - inputs.dir "${projectDir}/src/test/resources/org/hl7/fhirpath/testSchema" - - doLast { - ant.xjc(destdir: xjc.destDir, schema: "${projectDir}/src/test/resources/org/hl7/fhirpath/testSchema/testSchema.xsd") { - arg(line: "${xjc.args} -npa " + - "-p org.hl7.fhirpath.tests") - } - } -} - -jacocoTestReport { - sourceDirectories.setFrom(files( - "${projectDir}/../elm/src/main/java", - "${projectDir}/../cql-to-elm/src/main/java", - "${projectDir}/../engine/src/main/java", - "${projectDir}/../engine-fhir/src/main/java", - )) - - classDirectories.setFrom(files( - "${projectDir}/../elm/build/classes/java/main", - "${projectDir}/../cql-to-elm/build/classes/java/main", - "${projectDir}/../engine/build/classes/java/main", - "${projectDir}/../engine-fhir/build/classes/java/main", - )) -} \ No newline at end of file diff --git a/Src/java/engine-fhir/build.gradle.kts b/Src/java/engine-fhir/build.gradle.kts new file mode 100644 index 000000000..9139bf9b7 --- /dev/null +++ b/Src/java/engine-fhir/build.gradle.kts @@ -0,0 +1,36 @@ +plugins { + id("cql.library-conventions") + id("cql.xjc-conventions") + id("cql.fhir-conventions") +} + +dependencies { + api(project(":engine")) + testImplementation("org.wiremock:wiremock:3.9.1") + testImplementation(project(":cql-to-elm")) + testImplementation(project(":model-jackson")) + testImplementation(project(":elm-jackson")) + testImplementation(project(":quick")) + testImplementation("ca.uhn.hapi.fhir:hapi-fhir-client") +} + +tasks.register("generateFhirPathTests") { + schema = "${projectDir}/src/test/resources/org/hl7/fhirpath/testSchema" + extraArgs = listOf("-npa", "-p", "org.hl7.fhirpath.tests") +} + +tasks.jacocoTestReport { + sourceDirectories.setFrom(files( + "${projectDir}/../elm/src/main/java", + "${projectDir}/../cql-to-elm/src/main/java", + "${projectDir}/../engine/src/main/java", + "${projectDir}/../engine-fhir/src/main/java", + )) + + classDirectories.setFrom(files( + "${projectDir}/../elm/build/classes/java/main", + "${projectDir}/../cql-to-elm/build/classes/java/main", + "${projectDir}/../engine/build/classes/java/main", + "${projectDir}/../engine-fhir/build/classes/java/main", + )) +} \ No newline at end of file diff --git a/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlListOperatorsTest.xml b/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlListOperatorsTest.xml index 6f4092fbe..a60766687 100644 --- a/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlListOperatorsTest.xml +++ b/Src/java/engine-fhir/src/test/resources/org/hl7/fhirpath/cql/CqlListOperatorsTest.xml @@ -743,12 +743,52 @@ + + 'a' properly included in null as List<String> + false + + + 'a' properly included in {} + false + + + 'a' properly included in { 'a' } + false + + + null as String properly included in { null } + false + - null properly included in {'s', 'u', 'n'} + null as String properly included in {'s', 'u', 'n'} + false + + + null as String properly included in { null, null } false - null properly included in {'s', 'u', 'n', null} + null as String properly included in {'s', 'u', 'n', null} + true + + + 'a' properly included in { 'a', 'b' } + true + + + 'a' properly included in { 'a', 'a' } + false + + + 'c' properly included in { 'a', 'b' } + false + + + 'a' properly included in { 'a', null } + null + + + 'a' properly included in { 'a', 'b', null } true diff --git a/Src/java/engine/build.gradle b/Src/java/engine/build.gradle.kts similarity index 63% rename from Src/java/engine/build.gradle rename to Src/java/engine/build.gradle.kts index 03212da9a..1e68e05e0 100644 --- a/Src/java/engine/build.gradle +++ b/Src/java/engine/build.gradle.kts @@ -1,17 +1,17 @@ plugins { - id 'cql.library-conventions' + id("cql.library-conventions") } dependencies { - api project(':elm') - api project(':cql-to-elm') + api(project(":elm")) + api(project(":cql-to-elm")) - testImplementation project(':model-jackson') - testImplementation project(':elm-jackson') - testImplementation 'org.mockito:mockito-core:5.4.0' + testImplementation(project(":model-jackson")) + testImplementation(project(":elm-jackson")) + testImplementation("org.mockito:mockito-core:5.4.0") } -jacocoTestReport { +tasks.jacocoTestReport { sourceDirectories.setFrom(files( "${projectDir}/../elm/src/main/java", "${projectDir}/../cql-to-elm/src/main/java", diff --git a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ProperInEvaluator.java b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ProperInEvaluator.java index 158d2f5d8..73384872a 100644 --- a/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ProperInEvaluator.java +++ b/Src/java/engine/src/main/java/org/opencds/cqf/cql/engine/elm/executing/ProperInEvaluator.java @@ -6,13 +6,18 @@ T, Interval : The type of T must be the same as the point type of the interval. For the T, List overload, this operator returns if the given element is in the given list, - and it is not the only element in the list, using equivalence semantics. - If the list-valued argument is null, it should be treated as an empty list. + and it is not the only element in the list, using equality semantics, with the exception + that null elements are considered equal. + If the first argument is null, the result is true if the list contains any null elements + and at least one other element, and false otherwise. + If the second argument is null, the result is false. For the T, Interval overload, this operator returns true if the given point is greater than the starting point, and less than the ending point of the interval, as determined by the Start and End operators. - If precision is specified and the point type is a date/time type, comparisons used in the operation are performed - at the specified precision. + If precision is specified and the point type is a Date, DateTime, or Time type, comparisons used in the operation + are performed at the specified precision. + If the first argument is null, the result is null. + If the second argument is null the result is false. */ import org.opencds.cqf.cql.engine.execution.State; diff --git a/Src/java/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.cql b/Src/java/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.cql index 91d782e8b..30f28cdfe 100644 --- a/Src/java/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.cql +++ b/Src/java/engine/src/test/resources/org/opencds/cqf/cql/engine/execution/CqlListOperatorsTest.cql @@ -215,8 +215,8 @@ define ProperContainsTimeTrue: { @T15:59:59, @T20:59:59.999, @T20:59:49.999 } pr define ProperContainsTimeNull: { @T15:59:59.999, @T20:59:59.999, @T20:59:49.999 } properly includes @T15:59:59 //ProperIn -define ProperInNullRightFalse: null properly included in {'s', 'u', 'n'} -define ProperInNullRightTrue: null properly included in {'s', 'u', 'n', null} +define ProperInNullRightFalse: null as String properly included in {'s', 'u', 'n'} +define ProperInNullRightTrue: null as String properly included in {'s', 'u', 'n', null} define ProperInTimeTrue: @T15:59:59 properly included in { @T15:59:59, @T20:59:59.999, @T20:59:49.999 } define ProperInTimeNull: @T15:59:59 properly included in { @T15:59:59.999, @T20:59:59.999, @T20:59:49.999 } diff --git a/Src/java/gradle.properties b/Src/java/gradle.properties index 91b5a44d8..a25cef364 100644 --- a/Src/java/gradle.properties +++ b/Src/java/gradle.properties @@ -10,4 +10,4 @@ specification.version=1.5.2 hapi.version=7.4.5 jackson.version=2.17.1 antlr.version=4.13.1 -android.api.level=28 +android.api.level=28 \ No newline at end of file diff --git a/Src/java/model-jackson/build.gradle b/Src/java/model-jackson/build.gradle deleted file mode 100644 index 9f0fe1621..000000000 --- a/Src/java/model-jackson/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -plugins { - id 'cql.library-conventions' -} - -ext { - jacksonVersion = project['jackson.version'] -} - -dependencies { - api project(':model') - api "com.fasterxml.jackson.dataformat:jackson-dataformat-xml:${jacksonVersion}" - api "com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:${jacksonVersion}" - - testImplementation project(":quick") - testImplementation project(":qdm") -} diff --git a/Src/java/model-jackson/build.gradle.kts b/Src/java/model-jackson/build.gradle.kts new file mode 100644 index 000000000..f004e6b4c --- /dev/null +++ b/Src/java/model-jackson/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + id("cql.library-conventions") +} + +dependencies { + val jacksonVersion = project.findProperty("jackson.version") + api(project(":model")) + api("com.fasterxml.jackson.dataformat:jackson-dataformat-xml:${jacksonVersion}") + api("com.fasterxml.jackson.module:jackson-module-jakarta-xmlbind-annotations:${jacksonVersion}") + + testImplementation(project(":quick")) + testImplementation(project(":qdm")) +} diff --git a/Src/java/model-jaxb/build.gradle b/Src/java/model-jaxb/build.gradle deleted file mode 100644 index 990a7efaf..000000000 --- a/Src/java/model-jaxb/build.gradle +++ /dev/null @@ -1,7 +0,0 @@ -plugins { - id 'cql.library-conventions' -} - -dependencies { - api project(':model') -} diff --git a/Src/java/model-jaxb/build.gradle.kts b/Src/java/model-jaxb/build.gradle.kts new file mode 100644 index 000000000..bc8870e71 --- /dev/null +++ b/Src/java/model-jaxb/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + id("cql.library-conventions") +} + +dependencies { + api(project(":model")) +} diff --git a/Src/java/model/build.gradle b/Src/java/model/build.gradle deleted file mode 100644 index 1bb18cc98..000000000 --- a/Src/java/model/build.gradle +++ /dev/null @@ -1,18 +0,0 @@ -plugins { - id 'cql.library-conventions' - id 'cql.xjc-conventions' -} - -dependencies { - implementation 'org.apache.commons:commons-text:1.10.0' -} - -generateSources { - inputs.dir "${projectDir}/../../cql-lm/schema" - - doLast { - ant.xjc(destdir: xjc.destDir, schema: "${projectDir}/../../cql-lm/schema/model/modelinfo.xsd") { - arg(line: "${xjc.args} -npa") - } - } -} diff --git a/Src/java/model/build.gradle.kts b/Src/java/model/build.gradle.kts new file mode 100644 index 000000000..e0ef4e153 --- /dev/null +++ b/Src/java/model/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + id("cql.library-conventions") + id("cql.xjc-conventions") +} + +dependencies { + implementation("org.apache.commons:commons-text:1.10.0") +} + +tasks.register("generateModel") { + schema = "${projectDir}/../../cql-lm/schema/model/modelinfo.xsd" + extraArgs = listOf("-npa") +} \ No newline at end of file diff --git a/Src/java/qdm/build.gradle b/Src/java/qdm/build.gradle deleted file mode 100644 index 2047aec7c..000000000 --- a/Src/java/qdm/build.gradle +++ /dev/null @@ -1,22 +0,0 @@ -plugins { - id 'cql.library-conventions' - id 'cql.xjc-conventions' -} - -dependencies { - api project(':elm') - api project(':model') -} - -generateSources{ - inputs.dir "${projectDir}/schema" - - doLast { - ant.xjc(destdir: xjc.destDir, schema: "${projectDir}/schema/qdm.xsd") { - arg(line: xjc.args) - } - ant.xjc(destdir: xjc.destDir, schema: "${projectDir}/schema/qdm.4.2.xsd") { - arg(line: xjc.args) - } - } -} \ No newline at end of file diff --git a/Src/java/qdm/build.gradle.kts b/Src/java/qdm/build.gradle.kts new file mode 100644 index 000000000..16fa5038d --- /dev/null +++ b/Src/java/qdm/build.gradle.kts @@ -0,0 +1,17 @@ +plugins { + id("cql.library-conventions") + id("cql.xjc-conventions") +} + +dependencies { + api(project(":elm")) + api(project(":model")) +} + +tasks.register("generateQdm") { + schema = "${projectDir}/schema/qdm.xsd" +} + +tasks.register("generateQdm42") { + schema = "${projectDir}/schema/qdm.4.2.xsd" +} diff --git a/Src/java/quick/build.gradle b/Src/java/quick/build.gradle deleted file mode 100644 index 97275a85d..000000000 --- a/Src/java/quick/build.gradle +++ /dev/null @@ -1,19 +0,0 @@ -plugins { - id 'cql.library-conventions' - id 'cql.xjc-conventions' -} - -dependencies { - api project(':elm') - api project(':model') -} - -generateSources{ - inputs.dir "${projectDir}/schema" - - doLast { - ant.xjc(destdir: xjc.destDir, schema: "${projectDir}/schema/v1.4/quick.xsd", binding: "${projectDir}/schema/v1.4/quick-binding.xjb") { - arg(line: xjc.args) - } - } -} diff --git a/Src/java/quick/build.gradle.kts b/Src/java/quick/build.gradle.kts new file mode 100644 index 000000000..32e82ad6a --- /dev/null +++ b/Src/java/quick/build.gradle.kts @@ -0,0 +1,14 @@ +plugins { + id("cql.library-conventions") + id("cql.xjc-conventions") +} + +dependencies { + api(project(":elm")) + api(project(":model")) +} + +tasks.register("generateQuick") { + schema = "${projectDir}/schema/v1.4/quick.xsd" + binding = "${projectDir}/schema/v1.4/quick-binding.xjb" +} \ No newline at end of file diff --git a/Src/java/settings.gradle b/Src/java/settings.gradle deleted file mode 100644 index 497fe4274..000000000 --- a/Src/java/settings.gradle +++ /dev/null @@ -1,26 +0,0 @@ -rootProject.name = 'cql-all' - -include ( - 'cqf-fhir', - 'cqf-fhir-npm', - 'cql', - 'model', - 'model-jackson', - 'model-jaxb', - 'elm', - 'elm-jackson', - 'elm-jaxb', - 'elm-test', - 'engine', - 'engine-fhir', - 'qdm', - 'quick', - 'cql-to-elm', - 'cql-to-elm-cli', - 'elm-fhir', - 'tools:cql-formatter', - 'tools:cql-parsetree', - 'tools:xsd-to-modelinfo' -) - - diff --git a/Src/java/settings.gradle.kts b/Src/java/settings.gradle.kts new file mode 100644 index 000000000..4e6f7bdf1 --- /dev/null +++ b/Src/java/settings.gradle.kts @@ -0,0 +1,26 @@ +rootProject.name = "cql-all" + +include( + "cqf-fhir", + "cqf-fhir-npm", + "cql", + "model", + "model-jackson", + "model-jaxb", + "elm", + "elm-jackson", + "elm-jaxb", + "elm-test", + "engine", + "engine-fhir", + "qdm", + "quick", + "cql-to-elm", + "cql-to-elm-cli", + "elm-fhir", + "tools:cql-formatter", + "tools:cql-parsetree", + "tools:xsd-to-modelinfo" +) + + diff --git a/Src/java/tools/cql-formatter/build.gradle b/Src/java/tools/cql-formatter/build.gradle deleted file mode 100644 index 03ade1839..000000000 --- a/Src/java/tools/cql-formatter/build.gradle +++ /dev/null @@ -1,21 +0,0 @@ -plugins { - id 'cql.java-conventions' - id 'application' -} - -application { - mainClass = 'org.cqframework.cql.tools.formatter.Main' -} - -dependencies { - testImplementation project(":cql-to-elm") - implementation project(":cql") -} - -sourceSets { - test { - resources { - srcDir "../../cql-to-elm/src/test/resources" - } - } -} \ No newline at end of file diff --git a/Src/java/tools/cql-formatter/build.gradle.kts b/Src/java/tools/cql-formatter/build.gradle.kts new file mode 100644 index 000000000..3531f740c --- /dev/null +++ b/Src/java/tools/cql-formatter/build.gradle.kts @@ -0,0 +1,21 @@ +plugins { + id("cql.java-conventions") + id("application") +} + +application { + mainClass = "org.cqframework.cql.tools.formatter.Main" +} + +dependencies { + testImplementation(project(":cql-to-elm")) + implementation(project(":cql")) +} + +sourceSets { + test { + resources { + srcDir("../../cql-to-elm/src/test/resources") + } + } +} \ No newline at end of file diff --git a/Src/java/tools/cql-parsetree/build.gradle b/Src/java/tools/cql-parsetree/build.gradle deleted file mode 100644 index 476878ea2..000000000 --- a/Src/java/tools/cql-parsetree/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -plugins { - id 'cql.java-conventions' - id 'application' -} - -application { - mainClass = 'org.cqframework.cql.tools.parsetree.Main' -} - -dependencies { - implementation project(':cql') - implementation (group: "org.antlr", name: "antlr4", version: "4.10.1") { - // antlr 4.5 includes these classes directly - exclude(group: "org.abego.treelayout", module: "org.abego.treelayout.core") - } -} \ No newline at end of file diff --git a/Src/java/tools/cql-parsetree/build.gradle.kts b/Src/java/tools/cql-parsetree/build.gradle.kts new file mode 100644 index 000000000..8475d5f02 --- /dev/null +++ b/Src/java/tools/cql-parsetree/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("cql.java-conventions") + id("application") +} + +application { + mainClass = "org.cqframework.cql.tools.parsetree.Main" +} + +dependencies { + implementation(project(":cql")) + implementation("org.antlr:antlr4:4.10.1") { + // antlr 4.5 includes these classes directly + exclude(group= "org.abego.treelayout", module= "org.abego.treelayout.core") + } +} \ No newline at end of file diff --git a/Src/java/tools/xsd-to-modelinfo/build.gradle b/Src/java/tools/xsd-to-modelinfo/build.gradle deleted file mode 100644 index de960982e..000000000 --- a/Src/java/tools/xsd-to-modelinfo/build.gradle +++ /dev/null @@ -1,16 +0,0 @@ -plugins { - id 'cql.java-conventions' - id 'cql.library-conventions' - id 'application' -} - -application { - mainClass = 'org.cqframework.cql.tools.xsd2modelinfo.Main' -} - -dependencies { - api project(':model') - implementation 'net.sf.jopt-simple:jopt-simple:4.7' - implementation 'org.apache.ws.xmlschema:xmlschema-core:2.2.5' - implementation 'org.apache.ws.xmlschema:xmlschema-walker:2.2.5' -} \ No newline at end of file diff --git a/Src/java/tools/xsd-to-modelinfo/build.gradle.kts b/Src/java/tools/xsd-to-modelinfo/build.gradle.kts new file mode 100644 index 000000000..e4613dc38 --- /dev/null +++ b/Src/java/tools/xsd-to-modelinfo/build.gradle.kts @@ -0,0 +1,16 @@ +plugins { + id("cql.java-conventions") + id("cql.library-conventions") + id("application") +} + +application { + mainClass = "org.cqframework.cql.tools.xsd2modelinfo.Main" +} + +dependencies { + api(project(":model")) + implementation("net.sf.jopt-simple:jopt-simple:4.7") + implementation("org.apache.ws.xmlschema:xmlschema-core:2.2.5") + implementation("org.apache.ws.xmlschema:xmlschema-walker:2.2.5") +} \ No newline at end of file