Skip to content

Commit 674a711

Browse files
committed
Remove HAPI FHIR Dependencies from Admin API
Closes: #3799
1 parent b39bf7d commit 674a711

20 files changed

Lines changed: 358 additions & 245 deletions

File tree

Dockerfile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ COPY target/blaze-1.10.1-standalone.jar /app/
1111
WORKDIR /app
1212
USER 1001
1313

14+
# The user 1001 has no passwd entry, so HOME would default to `/`. The
15+
# org.hl7.fhir validator builds paths like `$HOME/.fhir/fhir-settings.json`
16+
# and fails on a root home directory.
17+
ENV HOME="/app/data"
1418
ENV LD_PRELOAD="libjemalloc.so.2"
1519
ENV BASE_JAVA_TOOL_OPTIONS="-XX:+UseCompactObjectHeaders --enable-native-access=ALL-UNNAMED --sun-misc-unsafe-memory-access=allow"
1620
ENV STORAGE="standalone"

modules/admin-api/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ prep:
99
clojure -X:deps prep :aliases '[:test]'
1010

1111
test: prep
12-
clojure -M:test:kaocha --profile :ci
12+
clojure -J--enable-native-access=ALL-UNNAMED -J--sun-misc-unsafe-memory-access=allow -M:test:kaocha --profile :ci
1313

1414
test-focus: prep
1515
clojure -M:test:kaocha --profile :ci --focus "$(FOCUS)"

modules/admin-api/deps.edn

Lines changed: 20 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -38,82 +38,46 @@
3838
{:mvn/version "0.10.1"
3939
:exclusions [javax.xml.bind/jaxb-api]}
4040

41-
ca.uhn.hapi.fhir/hapi-fhir-validation
42-
{:mvn/version "8.10.0"
43-
:exclusions
44-
[com.nimbusds/nimbus-jose-jwt
45-
commons-beanutils/commons-beanutils
46-
info.cqframework/cql
47-
info.cqframework/qdm
48-
info.cqframework/quick
49-
info.cqframework/cql-to-elm
50-
info.cqframework/elm
51-
info.cqframework/model
52-
io.opentelemetry.instrumentation/opentelemetry-instrumentation-annotations
53-
net.sf.saxon/Saxon-HE
54-
net.sourceforge.plantuml/plantuml-mit
55-
org.ogce/xpp3
56-
ognl/ognl
57-
org.attoparser/attoparser
58-
org.unbescape/unbescape
59-
org.xerial/sqlite-jdbc
60-
org.apache.commons/commons-collections4
61-
org.apache.httpcomponents/httpclient
62-
com.google.errorprone/error_prone_annotations
63-
org.apache.santuario/xmlsec
64-
org.commonmark/commonmark
65-
org.commonmark/commonmark-ext-gfm-tables]}
66-
67-
ca.uhn.hapi.fhir/hapi-fhir-structures-r4
41+
ca.uhn.hapi.fhir/hapi-fhir-base
6842
{:mvn/version "8.10.0"
6943
:exclusions
7044
[com.google.code.findbugs/jsr305
71-
commons-net/commons-net
72-
io.opentelemetry.instrumentation/opentelemetry-instrumentation-annotations
73-
;; Remove after https://github.com/hapifhir/hapi-fhir/issues/7005 is fixed
74-
org.apache.jena/jena-shex
75-
net.sf.saxon/Saxon-HE]}
76-
77-
ca.uhn.hapi.fhir/hapi-fhir-validation-resources-r4
78-
{:mvn/version "8.10.0"
79-
:exclusions
80-
[com.google.code.findbugs/jsr305
81-
io.opentelemetry/opentelemetry-api
82-
io.opentelemetry.instrumentation/opentelemetry-instrumentation-annotations
83-
org.slf4j/jcl-over-slf4j]}
84-
85-
ca.uhn.hapi.fhir/hapi-fhir-caching-caffeine
86-
{:mvn/version "8.10.0"
87-
:exclusions
88-
[io.opentelemetry.instrumentation/opentelemetry-instrumentation-annotations]}
45+
io.opentelemetry.instrumentation/opentelemetry-instrumentation-annotations]}
8946

9047
ca.uhn.hapi.fhir/org.hl7.fhir.validation
91-
{:mvn/version "6.9.4.2"
48+
{:mvn/version "6.9.11"
9249
:exclusions
93-
[com.nimbusds/nimbus-jose-jwt
50+
[ca.uhn.hapi.fhir/hapi-fhir-base
51+
ca.uhn.hapi.fhir/org.hl7.fhir.dstu2
52+
ca.uhn.hapi.fhir/org.hl7.fhir.dstu2016may
53+
ca.uhn.hapi.fhir/org.hl7.fhir.dstu3
54+
ca.uhn.hapi.fhir/org.hl7.fhir.dstu3.support
55+
ca.uhn.hapi.fhir/org.hl7.fhir.r4b
56+
com.google.errorprone/error_prone_annotations
57+
com.nimbusds/nimbus-jose-jwt
9458
commons-beanutils/commons-beanutils
9559
commons-net/commons-net
9660
info.cqframework/cql
97-
info.cqframework/qdm
98-
info.cqframework/quick
9961
info.cqframework/cql-to-elm
10062
info.cqframework/elm
10163
info.cqframework/model
64+
info.cqframework/qdm
65+
info.cqframework/quick
10266
io.opentelemetry.instrumentation/opentelemetry-instrumentation-annotations
10367
net.sf.saxon/Saxon-HE
10468
net.sourceforge.plantuml/plantuml-mit
105-
org.ogce/xpp3
10669
ognl/ognl
107-
org.attoparser/attoparser
108-
org.unbescape/unbescape
109-
org.xerial/sqlite-jdbc
110-
org.apache.commons/commons-collections4
70+
org.apache.commons/commons-compress
11171
org.apache.httpcomponents/httpclient
112-
com.google.errorprone/error_prone_annotations
11372
org.apache.santuario/xmlsec
73+
org.attoparser/attoparser
11474
org.commonmark/commonmark
11575
org.commonmark/commonmark-ext-gfm-tables
116-
org.eclipse.jgit/org.eclipse.jgit]}
76+
org.eclipse.jgit/org.eclipse.jgit
77+
org.ogce/xpp3
78+
org.thymeleaf/thymeleaf
79+
org.unbescape/unbescape
80+
org.xerial/sqlite-jdbc]}
11781

11882
com.fasterxml.jackson.datatype/jackson-datatype-jsr310
11983
{:mvn/version "2.22.0"}

modules/admin-api/src/blaze/admin_api.clj

Lines changed: 12 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
(:refer-clojure :exclude [str])
33
(:require
44
[blaze.admin-api.spec]
5-
[blaze.admin-api.validation]
5+
[blaze.admin-api.validator :as validator]
6+
[blaze.admin-api.validator.spec]
67
[blaze.anomaly :as ba :refer [if-ok]]
78
[blaze.async.comp :as ac :refer [do-sync]]
89
[blaze.db.impl.index.patient-last-change :as plc]
@@ -32,7 +33,6 @@
3233
[blaze.module :as m]
3334
[blaze.spec]
3435
[blaze.util :refer [str]]
35-
[clojure.datafy :as datafy]
3636
[clojure.spec.alpha :as s]
3737
[integrant.core :as ig]
3838
[jsonista.core :as j]
@@ -42,18 +42,9 @@
4242
[ring.util.response :as ring]
4343
[taoensso.timbre :as log])
4444
(:import
45-
[ca.uhn.fhir.context FhirContext]
46-
[ca.uhn.fhir.context.support DefaultProfileValidationSupport]
47-
[ca.uhn.fhir.parser IParser]
48-
[ca.uhn.fhir.validation FhirValidator]
4945
[com.google.common.base CaseFormat]
5046
[java.io File]
51-
[java.nio.file Files]
52-
[org.hl7.fhir.common.hapi.validation.support
53-
CommonCodeSystemsTerminologyService
54-
InMemoryTerminologyServerValidationSupport PrePopulatedValidationSupport
55-
ValidationSupportChain]
56-
[org.hl7.fhir.common.hapi.validation.validator FhirInstanceValidator]))
47+
[java.nio.file Files]))
5748

5849
(set! *warn-on-reflection* true)
5950

@@ -209,11 +200,9 @@
209200
:details #fhir/CodeableConcept
210201
{:text #fhir/string "No allowed profile found."}}]})))
211202

212-
(defn- validate [^FhirValidator validator writing-context resource]
213-
(->> ^String (fhir-spec/write-json-as-string writing-context resource)
214-
(.validateWithResult validator)
215-
(.toOperationOutcome)
216-
(datafy/datafy)))
203+
(defn- validate [validator writing-context resource]
204+
(->> (fhir-spec/write-json-as-string writing-context resource)
205+
(validator/validate validator)))
217206

218207
(defn- error-issues [outcome]
219208
(update outcome :issue (partial filterv (comp #{"error"} :value :severity))))
@@ -458,82 +447,6 @@
458447
{:path (str context-path "/__admin")
459448
:syntax :bracket}))
460449

461-
(defn- read-profile [name]
462-
(let [classloader (.getContextClassLoader (Thread/currentThread))]
463-
(with-open [source (.getResourceAsStream classloader name)]
464-
(slurp source))))
465-
466-
(defn- profile-validation-support [context]
467-
(let [s (PrePopulatedValidationSupport. context)
468-
parser ^IParser (.newJsonParser ^FhirContext context)]
469-
(run!
470-
(fn [name]
471-
(log/debug "Load profile" name)
472-
(.addResource s (.parseResource parser ^String (read-profile name))))
473-
;; The current (IG 1.10.0) profiles, copied from the IG into each module,
474-
;; plus the frozen legacy (IG 0.1.0) profiles bundled with this module —
475-
;; so Tasks submitted with either the current or the legacy canonical
476-
;; validate against a matching profile edition. The 0.1.0 editions are
477-
;; frozen rather than derived from the current ones, so they keep matching
478-
;; legacy submissions once the IG diverges from 0.1.0.
479-
["blaze/db/CodeSystem-ColumnFamily.json"
480-
"blaze/db/CodeSystem-Database.json"
481-
"blaze/db/ValueSet-ColumnFamily.json"
482-
"blaze/db/ValueSet-Database.json"
483-
"blaze/job_scheduler/StructureDefinition-Job.json"
484-
"blaze/job_scheduler/CodeSystem-JobType.json"
485-
"blaze/job_scheduler/CodeSystem-JobOutput.json"
486-
"blaze/job/async_interaction/StructureDefinition-AsyncInteractionJob.json"
487-
"blaze/job/async_interaction/StructureDefinition-AsyncInteractionRequestBundle.json"
488-
"blaze/job/async_interaction/StructureDefinition-AsyncInteractionResponseBundle.json"
489-
"blaze/job/async_interaction/CodeSystem-AsyncInteractionJobOutput.json"
490-
"blaze/job/async_interaction/CodeSystem-AsyncInteractionJobParameter.json"
491-
"blaze/job/compact/CodeSystem-CompactJobOutput.json"
492-
"blaze/job/compact/CodeSystem-CompactJobParameter.json"
493-
"blaze/job/compact/StructureDefinition-CompactJob.json"
494-
"blaze/job/re_index/StructureDefinition-ReIndexJob.json"
495-
"blaze/job/re_index/CodeSystem-ReIndexJobOutput.json"
496-
"blaze/job/re_index/CodeSystem-ReIndexJobParameter.json"
497-
"blaze/admin-api/v0_1_0/CodeSystem-ColumnFamily.json"
498-
"blaze/admin-api/v0_1_0/CodeSystem-Database.json"
499-
"blaze/admin-api/v0_1_0/ValueSet-ColumnFamily.json"
500-
"blaze/admin-api/v0_1_0/ValueSet-Database.json"
501-
"blaze/admin-api/v0_1_0/StructureDefinition-Job.json"
502-
"blaze/admin-api/v0_1_0/CodeSystem-JobType.json"
503-
"blaze/admin-api/v0_1_0/CodeSystem-JobOutput.json"
504-
"blaze/admin-api/v0_1_0/StructureDefinition-AsyncInteractionJob.json"
505-
"blaze/admin-api/v0_1_0/StructureDefinition-AsyncInteractionRequestBundle.json"
506-
"blaze/admin-api/v0_1_0/StructureDefinition-AsyncInteractionResponseBundle.json"
507-
"blaze/admin-api/v0_1_0/CodeSystem-AsyncInteractionJobOutput.json"
508-
"blaze/admin-api/v0_1_0/CodeSystem-AsyncInteractionJobParameter.json"
509-
"blaze/admin-api/v0_1_0/CodeSystem-CompactJobOutput.json"
510-
"blaze/admin-api/v0_1_0/CodeSystem-CompactJobParameter.json"
511-
"blaze/admin-api/v0_1_0/StructureDefinition-CompactJob.json"
512-
"blaze/admin-api/v0_1_0/StructureDefinition-ReIndexJob.json"
513-
"blaze/admin-api/v0_1_0/CodeSystem-ReIndexJobOutput.json"
514-
"blaze/admin-api/v0_1_0/CodeSystem-ReIndexJobParameter.json"])
515-
s))
516-
517-
(defn- create-validator* []
518-
(let [context (FhirContext/forR4)
519-
_ (.newJsonParser context)
520-
validator (.newValidator context)
521-
chain (doto (ValidationSupportChain.)
522-
(.addValidationSupport (DefaultProfileValidationSupport. context))
523-
(.addValidationSupport (InMemoryTerminologyServerValidationSupport. context))
524-
(.addValidationSupport (CommonCodeSystemsTerminologyService. context))
525-
(.addValidationSupport (profile-validation-support context)))
526-
instanceValidator (FhirInstanceValidator. chain)]
527-
(.registerValidatorModule validator instanceValidator)
528-
validator))
529-
530-
(defn- create-validator []
531-
(try
532-
(create-validator*)
533-
(catch Exception e
534-
(log/error e)
535-
(throw e))))
536-
537450
(defn- create-job-handler [job-scheduler]
538451
(fn [{:keys [body] :as request}]
539452
(do-sync [job (js/create-job job-scheduler (jc/canonicalize (iu/strip-meta body)))]
@@ -580,17 +493,18 @@
580493
(ac/completed-future)))))
581494

582495
(defmethod m/pre-init-spec :blaze/admin-api [_]
583-
(s/keys :req-un [:blaze/context-path ::admin-node :blaze.fhir/parsing-context
584-
:blaze.fhir/writing-context :blaze/job-scheduler
585-
::read-job-handler ::history-job-handler
586-
::search-type-job-handler ::settings ::features]
496+
(s/keys :req-un [:blaze/context-path ::admin-node :blaze.admin-api/validator
497+
:blaze.fhir/parsing-context :blaze.fhir/writing-context
498+
:blaze/job-scheduler ::read-job-handler
499+
::history-job-handler ::search-type-job-handler ::settings
500+
::features]
587501
:opt [::dbs ::expr/cache ::db-sync-timeout]))
588502

589503
(defmethod ig/init-key :blaze/admin-api
590504
[_ {:keys [job-scheduler] :as config}]
591505
(log/info "Init Admin endpoint")
592506
(reitit.ring/ring-handler
593-
(router (assoc config :validator (create-validator)
507+
(router (assoc config
594508
:create-job-handler (create-job-handler job-scheduler)
595509
:pause-job-handler (job-action-handler job-scheduler js/pause-job)
596510
:resume-job-handler (job-action-handler job-scheduler js/resume-job)

modules/admin-api/src/blaze/admin_api/validation.clj

Lines changed: 0 additions & 35 deletions
This file was deleted.

0 commit comments

Comments
 (0)